@lob-ox/core-darwin-x64 0.0.19 → 0.0.21
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/README.md +1 -1
- package/core.cjs +12303 -12326
- package/package.json +5 -2
- package/ui-react/assets/InstancesPage-DTy-dQ-L.js +3 -0
- package/ui-react/assets/{LanPage-C_v98nOL.js → LanPage-DGGWJGab.js} +2 -2
- package/ui-react/assets/OverviewPage-FLGxQPCE.js +2 -0
- package/ui-react/assets/PluginsPage-BBfj4bk7.js +1 -0
- package/ui-react/assets/RouterPage-MZBwIV9n.js +1 -0
- package/ui-react/assets/SettingsPage-BkG-APXm.js +1 -0
- package/ui-react/assets/{TasksPage-BynVo5ge.js → TasksPage-B50BoixQ.js} +1 -1
- package/ui-react/assets/jobs-CrrY4iBU.js +1 -0
- package/ui-react/assets/openExternal-Ayshj45y.js +1 -0
- package/ui-react/assets/{refresh-cw-CHZo8X7a.js → refresh-cw-GKBYw9-E.js} +1 -1
- package/ui-react/assets/{rocket-OqsLWeGD.js → rocket-cmjG68ou.js} +1 -1
- package/ui-react/assets/{supervisor-Blfqgw-f.js → supervisor-DSBgs_XY.js} +1 -1
- package/ui-react/assets/{supervisor-C0cZTc5d.js → supervisor-DWUbDZTX.js} +5 -5
- package/ui-react/assets/{supervisor-D4l-mJqH.css → supervisor-DgItqlLO.css} +1 -1
- package/ui-react/assets/{useSupervisorAction-DUxfx47b.js → useSupervisorAction-U8T1qRbC.js} +1 -1
- package/ui-react/assets/{widgets-C9CEOdGF.js → widgets-DV5fuKzB.js} +1 -1
- package/ui-react/supervisor.html +3 -3
- package/ui-react/assets/InstancesPage-p4wXb1ax.js +0 -3
- package/ui-react/assets/OverviewPage-Db0jblYm.js +0 -2
- package/ui-react/assets/PluginsPage-CZzJb7Io.js +0 -1
- package/ui-react/assets/RouterPage-BoApjMyy.js +0 -1
- package/ui-react/assets/SettingsPage-roII_vHR.js +0 -1
- package/ui-react/assets/jobs-BjLbfJTM.js +0 -1
- package/ui-react/assets/openExternal-BL2ow_UN.js +0 -1
- package/ui-react/assets/shield-check-DdG3gN1L.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@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-divide-y-reverse:0;--tw-border-style:solid;--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-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-500:oklch(76.9% .188 70.08);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--tracking-wide:.025em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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:where(:not(iframe)){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}}@layer components;@layer utilities{.\@container{container-type: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}.inset-0{inset:0}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-50{z-index:50}.z-\[70\]{z-index:70}.col-span-3{grid-column:span 3/span 3}.col-span-full{grid-column:1/-1}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-1{margin-inline:var(--spacing)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.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-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.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-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-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.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-\[18px\]{width:18px;height:18px}.size-\[23px\]{width:23px;height:23px}.size-\[96px\]{width:96px;height:96px}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-20{height:calc(var(--spacing) * 20)}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[120px\]{max-height:120px}.max-h-\[160px\]{max-height:160px}.max-h-\[180px\]{max-height:180px}.max-h-\[288px\]{max-height:288px}.max-h-\[340px\]{max-height:340px}.max-h-\[450px\]{max-height:450px}.max-h-\[560px\]{max-height:560px}.max-h-\[min\(24rem\,var\(--radix-select-content-available-height\)\)\]{max-height:min(24rem, var(--radix-select-content-available-height))}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[36px\]{min-height:36px}.min-h-\[40px\]{min-height:40px}.min-h-\[46px\]{min-height:46px}.min-h-\[52px\]{min-height:52px}.min-h-\[72px\]{min-height:72px}.min-h-\[76px\]{min-height:76px}.min-h-\[78px\]{min-height:78px}.min-h-\[150px\]{min-height:150px}.min-h-\[200px\]{min-height:200px}.min-h-\[220px\]{min-height:220px}.min-h-\[320px\]{min-height:320px}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-\[70px\]{width:70px}.w-\[130px\]{width:130px}.w-\[150px\]{width:150px}.w-\[190px\]{width:190px}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\[82px\]{max-width:82px}.max-w-\[150px\]{max-width:150px}.max-w-\[180px\]{max-width:180px}.max-w-\[400px\]{max-width:400px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[560px\]{max-width:560px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[120px\]{min-width:120px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[400px\]{min-width:400px}.min-w-\[720px\]{min-width:720px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.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)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.scrollbar-none{scrollbar-width:none}.appearance-none{appearance:none}.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-\[56px_minmax\(0\,1fr\)_auto_66px\]{grid-template-columns:56px minmax(0,1fr) auto 66px}.grid-cols-\[64px_auto_minmax\(0\,1fr\)\]{grid-template-columns:64px auto minmax(0,1fr)}.grid-cols-\[88px_minmax\(0\,1fr\)_120px_84px_36px\]{grid-template-columns:88px minmax(0,1fr) 120px 84px 36px}.grid-cols-\[96px_minmax\(0\,1fr\)\]{grid-template-columns:96px minmax(0,1fr)}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\[minmax\(0\,1fr\)_230px_84px\]{grid-template-columns:minmax(0,1fr) 230px 84px}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.grid-rows-\[minmax\(0\,1fr\)\]{grid-template-rows:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-center{align-content:center}.content-end{align-content:flex-end}.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-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-center{justify-items:center}.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-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border\/60>:not(:last-child)){border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\/60>:not(:last-child)){border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.justify-self-center{justify-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/30{border-color:color-mix(in oklab, var(--color-amber-500) 30%, transparent)}}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.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-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-transparent{border-color:#0000}.border-t-primary{border-top-color:var(--primary)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background{background-color:var(--background)}.bg-black\/45{background-color:#00000073}@supports (color:color-mix(in lab, red, red)){.bg-black\/45{background-color:color-mix(in oklab, var(--color-black) 45%, transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/80{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/80{background-color:color-mix(in oklab, var(--card) 80%, transparent)}}.bg-careful-background{background-color:var(--careful-background)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.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\/50{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/50{background-color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, 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\/60{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/60{background-color:color-mix(in oklab, var(--muted) 60%, transparent)}}.bg-muted\/70{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/70{background-color:color-mix(in oklab, var(--muted) 70%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-primary-foreground{background-color:var(--primary-foreground)}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/\[0\.05\]{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/\[0\.05\]{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-status-brand{background-color:var(--status-brand)}.bg-status-error{background-color:var(--status-error)}.bg-status-ok{background-color:var(--status-ok)}.bg-status-ok-soft{background-color:var(--status-ok-soft)}.bg-success-background{background-color:var(--success-background)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--warning)}.bg-warning-background{background-color:var(--warning-background)}.bg-white{background-color:var(--color-white)}.bg-\[image\:var\(--panel-accent-gradient\)\]{background-image:var(--panel-accent-gradient)}.bg-\[image\:var\(--primary-btn-grad\)\]{background-image:var(--primary-btn-grad)}.bg-\[length\:100\%_100\%\]{background-size:100% 100%}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.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-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.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-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-px{padding-block:1px}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[18px\]{padding-bottom:18px}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:1.5rem;line-height:var(--tw-leading,2rem)}.text-base{font-size:1rem;line-height:var(--tw-leading,1.5rem)}.text-lg{font-size:1.125rem;line-height:var(--tw-leading,1.75rem)}.text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}.text-xl{font-size:1.25rem;line-height:var(--tw-leading,1.75rem)}.text-xs{font-size:.75rem;line-height:var(--tw-leading,1rem)}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[22px\]{font-size:22px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-none{--tw-leading:1;line-height:1}.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-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-card-foreground{color:var(--card-foreground)}.text-careful{color:var(--careful)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground{color:var(--foreground)}.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\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.text-muted-foreground\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/70{color:color-mix(in oklab, var(--muted-foreground) 70%, 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-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-sidebar-foreground{color:var(--sidebar-foreground)}.text-status-error{color:var(--status-error)}.text-status-ok{color:var(--status-ok)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.uppercase{text-transform:uppercase}.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,)}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-\[0_0_6px_2px_var\(--status-brand-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-brand-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px_2px_var\(--status-error-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-error-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px_2px_var\(--status-ok-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-ok-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.04\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0f172a0a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.06\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0f172a0f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_3px_rgba\(0\,0\,0\,0\.22\)\]{--tw-shadow:0 1px 3px var(--tw-shadow-color,#00000038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_18px_48px_rgba\(0\,0\,0\,0\.18\)\]{--tw-shadow:0 18px 48px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_3px_0_0_var\(--primary\)\]{--tw-shadow:inset 3px 0 0 var(--tw-shadow-color,var(--primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--primary-btn-shadow\)\]{--tw-shadow:var(--primary-btn-shadow);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-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-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-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-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.\!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,)!important}.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-\[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-\[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-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-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))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.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}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.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:.875rem;line-height:var(--tw-leading,1.25rem)}.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)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-card\/60:hover{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-card\/60:hover{background-color:color-mix(in oklab, var(--card) 60%, transparent)}}.hover\:bg-card\/70:hover{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-card\/70:hover{background-color:color-mix(in oklab, var(--card) 70%, 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-muted:hover,.hover\:bg-muted\/40:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.hover\:bg-primary\/15:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab, var(--primary) 15%, 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-\[image\:var\(--primary-btn-grad-hover\)\]:hover{background-image:var(--primary-btn-grad-hover)}.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\/20:focus{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-ring\/20:focus{--tw-ring-color:color-mix(in oklab, var(--ring) 20%, transparent)}}.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-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-2:focus-visible{--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-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-ring:focus-visible,.focus-visible\:ring-ring\/20:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 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-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.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-\[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\=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\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.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-\[state\=checked\]\:translate-x-3\.5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-\[18px\][data-state=checked]{--tw-translate-x:18px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}@media not all and (width>=980px){.max-\[980px\]\:px-6{padding-inline:calc(var(--spacing) * 6)}.max-\[980px\]\:pt-2{padding-top:calc(var(--spacing) * 2)}.max-\[980px\]\:pb-6{padding-bottom:calc(var(--spacing) * 6)}}@media not all and (width>=640px){.max-\[640px\]\:block{display:block}.max-\[640px\]\:hidden{display:none}.max-\[640px\]\:h-auto{height:auto}.max-\[640px\]\:min-h-\[52px\]{min-height:52px}.max-\[640px\]\:min-h-\[64px\]{min-height:64px}.max-\[640px\]\:min-h-dvh{min-height:100dvh}.max-\[640px\]\:grid-cols-\[56px_auto_minmax\(0\,1fr\)\]{grid-template-columns:56px auto minmax(0,1fr)}.max-\[640px\]\:grid-rows-\[auto\]{grid-template-rows:auto}.max-\[640px\]\:flex-col{flex-direction:column}.max-\[640px\]\:items-stretch{align-items:stretch}.max-\[640px\]\:gap-2{gap:calc(var(--spacing) * 2)}.max-\[640px\]\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.max-\[640px\]\:overflow-visible{overflow:visible}.max-\[640px\]\:overflow-x-clip{overflow-x:clip}.max-\[640px\]\:overflow-y-visible{overflow-y:visible}.max-\[640px\]\:px-3{padding-inline:calc(var(--spacing) * 3)}.max-\[640px\]\:px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.max-\[640px\]\:pb-\[18px\]{padding-bottom:18px}.max-\[640px\]\:text-base{font-size:1rem;line-height:var(--tw-leading,1.5rem)}.max-\[640px\]\:font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}}@media (width>=40rem){.sm\:inline{display:inline}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:grid-cols-2{grid-template-columns:repeat(2,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}:where(.sm\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:inline-flex{display:inline-flex}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}}@media (width>=64rem){.lg\:block{display:block}.lg\:inline-flex{display:inline-flex}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}:where(.lg\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.lg\:divide-border\/60>:not(:last-child)){border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){:where(.lg\:divide-border\/60>:not(:last-child)){border-color:color-mix(in oklab, var(--border) 60%, transparent)}}}@container (width>=560px){.\@min-\[560px\]\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@container (width>=640px){.\@min-\[640px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width>=720px){.\@min-\[720px\]\:grid-cols-\[minmax\(0\,5fr\)_minmax\(0\,6fr\)\]{grid-template-columns:minmax(0,5fr) minmax(0,6fr)}}@container (width>=860px){.\@min-\[860px\]\:grid-cols-\[minmax\(0\,1fr\)_420px\]{grid-template-columns:minmax(0,1fr) 420px}}@container (width>=900px){.\@min-\[900px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\@min-\[900px\]\:grid-cols-\[minmax\(0\,1fr\)_420px\]{grid-template-columns:minmax(0,1fr) 420px}}@container (width>=1000px){.\@min-\[1000px\]\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.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)}}@media not all and (width>=640px){.max-\[640px\]\:\[\&_button\]\:h-7 button{height:calc(var(--spacing) * 7)}.max-\[640px\]\:\[\&_button\]\:px-2\.5 button{padding-inline:calc(var(--spacing) * 2.5)}.max-\[640px\]\:\[\&_button\]\:text-xs button{font-size:.75rem;line-height:var(--tw-leading,1rem)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}:root{--panel-accent-gradient:linear-gradient(135deg, #4176e60f, #4176e604 60%, transparent);--radius:.5rem;--background:#fff;--foreground:#0f1115;--card:#fff;--card-foreground:#0f1115;--popover:#fff;--popover-foreground:#0f1115;--primary:#4176e6;--primary-foreground:#fff;--primary-btn-grad:linear-gradient(180deg, #3d5ef0 0%, #2f54eb 100%);--primary-btn-grad-hover:linear-gradient(180deg, #4f7bf0 0%, #2f54eb 100%);--primary-btn-shadow:0 1px 2px #0f172a29, inset 0 1px 0 #ffffff38;--secondary:#f9fafb;--secondary-foreground:#0f1115;--muted:#f1f3f5;--muted-foreground:#81858c;--accent:#ebeef2;--accent-foreground:#0f1115;--destructive:#b42318;--destructive-foreground:#fff;--border:#00000014;--input:#0000001f;--ring:#4176e6;--success:#166534;--success-background:#e7f6ed;--status-ok:#10b981;--status-ok-soft:#34d399;--status-ok-ring:#10b9818c;--status-error:#ef4444;--status-error-ring:#ef444466;--status-brand:#4176e6;--status-brand-ring:#4176e666;--warning:#92400e;--warning-background:#fef3c7;--careful:#991b1b;--careful-background:#fee2e2;--chart-1:#4176e6;--chart-2:#81858c;--chart-3:#8a6f2a;--chart-4:#5686fe;--chart-5:#b42318;--sidebar:#f9fafb;--sidebar-foreground:#61666b;--sidebar-primary:#4176e6;--sidebar-primary-foreground:#fff;--sidebar-accent:#ebeef2;--sidebar-accent-foreground:#0f1115;--sidebar-border:#0000000d;--sidebar-ring:#4176e6;color:#171717;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;background:0 0;font-family:Inter,Noto Sans SC,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.dark{--panel-accent-gradient:linear-gradient(135deg, #6b83ff14, #6b83ff05 60%, transparent);--background:#0f1115;--foreground:#f1f4f9;--card:#16191f;--card-foreground:#f1f4f9;--popover:#16191f;--popover-foreground:#f1f4f9;--primary:#6b83ff;--primary-foreground:#fff;--primary-btn-grad:linear-gradient(180deg, #4f6ef2 0%, #3a56e0 100%);--primary-btn-grad-hover:linear-gradient(180deg, #6484f5 0%, #4f6ef2 100%);--primary-btn-shadow:0 1px 2px #00000059, inset 0 1px 0 #ffffff24;--secondary:#1e222b;--secondary-foreground:#f1f4f9;--muted:#1e222b;--muted-foreground:#a7afb7;--accent:#1b2230;--accent-foreground:#f1f4f9;--destructive:#f97066;--destructive-foreground:#fff;--border:#ffffff24;--input:#ffffff29;--ring:#6b83ff;--success:#86efac;--success-background:#123622;--status-ok:#34d399;--status-ok-soft:#10b981;--status-ok-ring:#34d39980;--status-error:#f87171;--status-error-ring:#f8717166;--status-brand:#6b83ff;--status-brand-ring:#6b83ff66;--warning:#facc15;--warning-background:#3a2f12;--careful:#fca5a5;--careful-background:#3a1515;--chart-1:#6b83ff;--chart-2:#a7afb7;--chart-3:#facc15;--chart-4:#8ea0ff;--chart-5:#f97066;--sidebar:#16191f;--sidebar-foreground:#f1f4f9;--sidebar-primary:#6b83ff;--sidebar-primary-foreground:#fff;--sidebar-accent:#1b2230;--sidebar-accent-foreground:#f1f4f9;--sidebar-border:#ffffff1f;--sidebar-ring:#6b83ff}*{box-sizing:border-box}html{font-size:16px}html,body,#root{background:0 0;width:100%;height:100dvh;overflow:hidden}body{min-width:320px;min-height:100dvh;color:var(--foreground);-webkit-user-select:none;user-select:none;background:0 0;margin:0;font-family:inherit;font-size:.875rem;line-height:1.25rem;overflow:hidden}#root{background:0 0;border-radius:1rem}#root[data-system-titlebar=true]{border-radius:0}input,textarea,[contenteditable=true]{-webkit-user-select:text;user-select:text}button{cursor:pointer}button:disabled{cursor:not-allowed}p,h1,h2{margin:0}@media (width<=640px){body{overflow:hidden auto}#root{border-radius:0;overflow:visible}}@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-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@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-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}html,body{overflow-x:hidden}.fw-shell{overflow-x:clip}.fw-layout{grid-template-rows:minmax(0,1fr);grid-template-columns:232px minmax(0,1fr)}.fw-layout[data-mode=wide-sidebar]{grid-template-rows:minmax(0,1fr);grid-template-columns:clamp(320px,28vw,560px) minmax(0,1fr)}.fw-system-titlebar{--fw-left-column:232px;background:linear-gradient(90deg, #f4f6fa 0, #f4f6fa var(--fw-left-column), #fafbfc var(--fw-left-column), #fafbfc 100%)}.fw-system-titlebar[data-mode=wide-sidebar]{--fw-left-column:clamp(320px, 28vw, 560px)}.fw-system-titlebar .fw-sidebar,.fw-system-titlebar .fw-space-sidebar{padding-top:18px}.fw-system-titlebar .fw-toolbar{background:linear-gradient(#f3f5f7bd 0%,#f7f8f6fa 54%,#fafbfc 100%);border-bottom-color:#0000000a;min-height:82px;box-shadow:inset 0 1px #ffffffb3}@media (width>=641px){.fw-layout .fw-sidebar{min-height:0;position:static;overflow-y:auto;transform:none}.fw-layout .fw-space-sidebar{min-height:0;overflow-y:auto}}@media (width<=640px){.fw-layout,.fw-layout[data-mode=wide-sidebar]{grid-template-columns:minmax(0,1fr)}.fw-layout .fw-sidebar{z-index:60;border-right:1px solid #00000014;width:min(280px,85vw);transition:transform .22s cubic-bezier(.2,.8,.2,1);position:fixed;top:0;bottom:0;left:0;transform:translate(-102%);box-shadow:0 0 40px #0f172a2e}.fw-layout[data-sidebar-open=true] .fw-sidebar{transform:translate(0)}.fw-layout .fw-space-sidebar{z-index:60;width:min(320px,88vw);transition:transform .22s cubic-bezier(.2,.8,.2,1);position:fixed;top:0;bottom:0;left:0;transform:translate(-102%)}.fw-layout[data-sidebar-open=true] .fw-space-sidebar{transform:translate(0)}.fw-system-titlebar{background:#fafbfc}}.fw-layout .fw-drawer-scrim{z-index:55;background:#0f172a73;display:none;position:fixed;inset:0}@media (width<=640px){.fw-layout .fw-drawer-scrim{opacity:0;pointer-events:none;transition:opacity .22s;display:block}.fw-layout[data-sidebar-open=true] .fw-drawer-scrim{opacity:1;pointer-events:auto}}.fw-shell{--fw-glow:47 84 235;--fw-flare:56 189 248;isolation:isolate;position:relative}.fw-shell[data-mode=classic]{--fw-glow:47 84 235;--fw-flare:250 204 21}.fw-shell:before,.fw-shell:after{z-index:50;pointer-events:none;content:"";position:absolute;inset:0}.fw-shell:before{background:radial-gradient(circle at 50% 50%, #ffffff94 0 8%, rgb(var(--fw-glow) / 18%) 18%, rgb(var(--fw-glow) / 0%) 46%), linear-gradient(90deg, rgb(var(--fw-glow) / 0%) 0%, rgb(var(--fw-glow) / 13%) 36%, #ffffffbd 50%, rgb(var(--fw-flare) / 16%) 64%, rgb(var(--fw-glow) / 0%) 100%);mix-blend-mode:screen;opacity:0;transform-origin:50%;animation:.64s cubic-bezier(.16,1,.3,1) both fw-shell-light-open;transform:scaleX(.04)}.fw-shell:after{background:linear-gradient(90deg, transparent 0%, #fff0 42%, #ffffff9e 50%, #fff0 58%, transparent 100%), repeating-linear-gradient(0deg, rgb(var(--fw-glow) / 0%) 0 26px, rgb(var(--fw-glow) / 8%) 27px 28px);mix-blend-mode:screen;opacity:0;animation:.64s cubic-bezier(.16,1,.3,1) both fw-shell-scan;transform:translate(-38%)}@keyframes fw-shell-light-open{0%{opacity:0;transform:scaleX(.04)}18%{opacity:.95}52%{opacity:.62;transform:scaleX(1)}to{opacity:0;transform:scaleX(1.08)}}@keyframes fw-shell-scan{0%{opacity:0;transform:translate(-38%)}26%{opacity:.46}78%{opacity:0;transform:translate(38%)}to{opacity:0;transform:translate(38%)}}@media (prefers-reduced-motion:reduce){.fw-shell:before,.fw-shell:after{display:none}}@keyframes fw-sweep{0%{transform:translate(-110%)}50%{transform:translate(92%)}to{transform:translate(250%)}}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/inter-400-C38fXH4l.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/inter-500-Cerq10X2.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(/assets/inter-600-LgqL8muc.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/inter-700-Yt3aPRUw.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Noto Sans SC;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/noto-sans-sc-400-68UKsrZK.woff2)format("woff2")}@font-face{font-family:Noto Sans SC;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/noto-sans-sc-700-BiGzk9PQ.woff2)format("woff2")}.scrollbar-none{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-none::-webkit-scrollbar{width:0;height:0;display:none}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#78808c59;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#78808c8c}*{scrollbar-width:thin;scrollbar-color:#78808c59 transparent}
|
|
2
|
+
@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-divide-y-reverse:0;--tw-border-style:solid;--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-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-500:oklch(76.9% .188 70.08);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--tracking-wide:.025em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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:where(:not(iframe)){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}}@layer components;@layer utilities{.\@container{container-type: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}.inset-0{inset:0}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-50{z-index:50}.z-\[70\]{z-index:70}.col-span-3{grid-column:span 3/span 3}.col-span-full{grid-column:1/-1}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-1{margin-inline:var(--spacing)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.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-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.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-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-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.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-\[18px\]{width:18px;height:18px}.size-\[23px\]{width:23px;height:23px}.size-\[96px\]{width:96px;height:96px}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-20{height:calc(var(--spacing) * 20)}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[120px\]{max-height:120px}.max-h-\[160px\]{max-height:160px}.max-h-\[180px\]{max-height:180px}.max-h-\[288px\]{max-height:288px}.max-h-\[340px\]{max-height:340px}.max-h-\[450px\]{max-height:450px}.max-h-\[560px\]{max-height:560px}.max-h-\[min\(24rem\,var\(--radix-select-content-available-height\)\)\]{max-height:min(24rem, var(--radix-select-content-available-height))}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[36px\]{min-height:36px}.min-h-\[40px\]{min-height:40px}.min-h-\[46px\]{min-height:46px}.min-h-\[52px\]{min-height:52px}.min-h-\[72px\]{min-height:72px}.min-h-\[76px\]{min-height:76px}.min-h-\[78px\]{min-height:78px}.min-h-\[150px\]{min-height:150px}.min-h-\[200px\]{min-height:200px}.min-h-\[220px\]{min-height:220px}.min-h-\[320px\]{min-height:320px}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-\[70px\]{width:70px}.w-\[130px\]{width:130px}.w-\[150px\]{width:150px}.w-\[190px\]{width:190px}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\[82px\]{max-width:82px}.max-w-\[150px\]{max-width:150px}.max-w-\[180px\]{max-width:180px}.max-w-\[400px\]{max-width:400px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[560px\]{max-width:560px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.min-w-\[120px\]{min-width:120px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[400px\]{min-width:400px}.min-w-\[720px\]{min-width:720px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.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)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.scrollbar-none{scrollbar-width:none}.appearance-none{appearance:none}.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-\[56px_minmax\(0\,1fr\)_auto_66px\]{grid-template-columns:56px minmax(0,1fr) auto 66px}.grid-cols-\[64px_auto_minmax\(0\,1fr\)\]{grid-template-columns:64px auto minmax(0,1fr)}.grid-cols-\[88px_minmax\(0\,1fr\)_120px_84px_36px\]{grid-template-columns:88px minmax(0,1fr) 120px 84px 36px}.grid-cols-\[96px_minmax\(0\,1fr\)\]{grid-template-columns:96px minmax(0,1fr)}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\[minmax\(0\,1fr\)_230px_84px\]{grid-template-columns:minmax(0,1fr) 230px 84px}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.grid-rows-\[minmax\(0\,1fr\)\]{grid-template-rows:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-center{align-content:center}.content-end{align-content:flex-end}.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-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-center{justify-items:center}.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-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border\/60>:not(:last-child)){border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\/60>:not(:last-child)){border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.justify-self-center{justify-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/30{border-color:color-mix(in oklab, var(--color-amber-500) 30%, transparent)}}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.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-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-transparent{border-color:#0000}.border-t-primary{border-top-color:var(--primary)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background{background-color:var(--background)}.bg-black\/45{background-color:#00000073}@supports (color:color-mix(in lab, red, red)){.bg-black\/45{background-color:color-mix(in oklab, var(--color-black) 45%, transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/80{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/80{background-color:color-mix(in oklab, var(--card) 80%, transparent)}}.bg-careful-background{background-color:var(--careful-background)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.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\/50{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/50{background-color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, 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\/60{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/60{background-color:color-mix(in oklab, var(--muted) 60%, transparent)}}.bg-muted\/70{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/70{background-color:color-mix(in oklab, var(--muted) 70%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-primary-foreground{background-color:var(--primary-foreground)}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/\[0\.05\]{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/\[0\.05\]{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-status-brand{background-color:var(--status-brand)}.bg-status-error{background-color:var(--status-error)}.bg-status-ok{background-color:var(--status-ok)}.bg-status-ok-soft{background-color:var(--status-ok-soft)}.bg-success-background{background-color:var(--success-background)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--warning)}.bg-warning-background{background-color:var(--warning-background)}.bg-white{background-color:var(--color-white)}.bg-\[image\:var\(--panel-accent-gradient\)\]{background-image:var(--panel-accent-gradient)}.bg-\[image\:var\(--primary-btn-grad\)\]{background-image:var(--primary-btn-grad)}.bg-\[length\:100\%_100\%\]{background-size:100% 100%}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.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-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.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-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-px{padding-block:1px}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[18px\]{padding-bottom:18px}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:1.5rem;line-height:var(--tw-leading,2rem)}.text-base{font-size:1rem;line-height:var(--tw-leading,1.5rem)}.text-lg{font-size:1.125rem;line-height:var(--tw-leading,1.75rem)}.text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}.text-xl{font-size:1.25rem;line-height:var(--tw-leading,1.75rem)}.text-xs{font-size:.75rem;line-height:var(--tw-leading,1rem)}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[22px\]{font-size:22px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-none{--tw-leading:1;line-height:1}.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-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-card-foreground{color:var(--card-foreground)}.text-careful{color:var(--careful)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground{color:var(--foreground)}.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\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.text-muted-foreground\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/70{color:color-mix(in oklab, var(--muted-foreground) 70%, 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-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-sidebar-foreground{color:var(--sidebar-foreground)}.text-status-error{color:var(--status-error)}.text-status-ok{color:var(--status-ok)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.uppercase{text-transform:uppercase}.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,)}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-\[0_0_6px_2px_var\(--status-brand-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-brand-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px_2px_var\(--status-error-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-error-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px_2px_var\(--status-ok-ring\)\]{--tw-shadow:0 0 6px 2px var(--tw-shadow-color,var(--status-ok-ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.04\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0f172a0a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.06\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0f172a0f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_3px_rgba\(0\,0\,0\,0\.22\)\]{--tw-shadow:0 1px 3px var(--tw-shadow-color,#00000038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_18px_48px_rgba\(0\,0\,0\,0\.18\)\]{--tw-shadow:0 18px 48px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_3px_0_0_var\(--primary\)\]{--tw-shadow:inset 3px 0 0 var(--tw-shadow-color,var(--primary));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--primary-btn-shadow\)\]{--tw-shadow:var(--primary-btn-shadow);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-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-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-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-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.\!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,)!important}.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-\[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-\[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-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-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))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.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}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.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:.875rem;line-height:var(--tw-leading,1.25rem)}.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)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-card\/60:hover{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-card\/60:hover{background-color:color-mix(in oklab, var(--card) 60%, transparent)}}.hover\:bg-card\/70:hover{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-card\/70:hover{background-color:color-mix(in oklab, var(--card) 70%, 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-muted:hover,.hover\:bg-muted\/40:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.hover\:bg-primary\/15:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/15:hover{background-color:color-mix(in oklab, var(--primary) 15%, 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-\[image\:var\(--primary-btn-grad-hover\)\]:hover{background-image:var(--primary-btn-grad-hover)}.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\/20:focus{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-ring\/20:focus{--tw-ring-color:color-mix(in oklab, var(--ring) 20%, transparent)}}.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-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-2:focus-visible{--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-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-ring:focus-visible,.focus-visible\:ring-ring\/20:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 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-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.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-\[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\=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\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.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-\[state\=checked\]\:translate-x-3\.5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:translate-x-\[18px\][data-state=checked]{--tw-translate-x:18px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}@media not all and (width>=980px){.max-\[980px\]\:px-6{padding-inline:calc(var(--spacing) * 6)}.max-\[980px\]\:pt-2{padding-top:calc(var(--spacing) * 2)}.max-\[980px\]\:pb-6{padding-bottom:calc(var(--spacing) * 6)}}@media not all and (width>=640px){.max-\[640px\]\:block{display:block}.max-\[640px\]\:hidden{display:none}.max-\[640px\]\:h-auto{height:auto}.max-\[640px\]\:min-h-\[52px\]{min-height:52px}.max-\[640px\]\:min-h-\[64px\]{min-height:64px}.max-\[640px\]\:min-h-dvh{min-height:100dvh}.max-\[640px\]\:grid-cols-\[56px_auto_minmax\(0\,1fr\)\]{grid-template-columns:56px auto minmax(0,1fr)}.max-\[640px\]\:grid-rows-\[auto\]{grid-template-rows:auto}.max-\[640px\]\:flex-col{flex-direction:column}.max-\[640px\]\:items-stretch{align-items:stretch}.max-\[640px\]\:gap-2{gap:calc(var(--spacing) * 2)}.max-\[640px\]\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.max-\[640px\]\:overflow-visible{overflow:visible}.max-\[640px\]\:overflow-x-clip{overflow-x:clip}.max-\[640px\]\:overflow-y-visible{overflow-y:visible}.max-\[640px\]\:px-3{padding-inline:calc(var(--spacing) * 3)}.max-\[640px\]\:px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.max-\[640px\]\:pb-\[18px\]{padding-bottom:18px}.max-\[640px\]\:text-base{font-size:1rem;line-height:var(--tw-leading,1.5rem)}.max-\[640px\]\:font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}}@media (width>=40rem){.sm\:inline{display:inline}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:grid-cols-2{grid-template-columns:repeat(2,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}:where(.sm\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:inline-flex{display:inline-flex}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}}@media (width>=64rem){.lg\:block{display:block}.lg\:inline-flex{display:inline-flex}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}:where(.lg\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.lg\:divide-border\/60>:not(:last-child)){border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){:where(.lg\:divide-border\/60>:not(:last-child)){border-color:color-mix(in oklab, var(--border) 60%, transparent)}}}@container (width>=560px){.\@min-\[560px\]\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@container (width>=640px){.\@min-\[640px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width>=720px){.\@min-\[720px\]\:grid-cols-\[minmax\(0\,5fr\)_minmax\(0\,6fr\)\]{grid-template-columns:minmax(0,5fr) minmax(0,6fr)}}@container (width>=860px){.\@min-\[860px\]\:grid-cols-\[minmax\(0\,1fr\)_420px\]{grid-template-columns:minmax(0,1fr) 420px}}@container (width>=900px){.\@min-\[900px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\@min-\[900px\]\:grid-cols-\[minmax\(0\,1fr\)_420px\]{grid-template-columns:minmax(0,1fr) 420px}}@container (width>=1000px){.\@min-\[1000px\]\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.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)}}@media not all and (width>=640px){.max-\[640px\]\:\[\&_button\]\:h-7 button{height:calc(var(--spacing) * 7)}.max-\[640px\]\:\[\&_button\]\:px-2\.5 button{padding-inline:calc(var(--spacing) * 2.5)}.max-\[640px\]\:\[\&_button\]\:text-xs button{font-size:.75rem;line-height:var(--tw-leading,1rem)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}:root{--panel-accent-gradient:linear-gradient(135deg, #4176e60f, #4176e604 60%, transparent);--radius:.5rem;--background:#fff;--foreground:#0f1115;--card:#fff;--card-foreground:#0f1115;--popover:#fff;--popover-foreground:#0f1115;--primary:#4176e6;--primary-foreground:#fff;--primary-btn-grad:linear-gradient(180deg, #3d5ef0 0%, #2f54eb 100%);--primary-btn-grad-hover:linear-gradient(180deg, #4f7bf0 0%, #2f54eb 100%);--primary-btn-shadow:0 1px 2px #0f172a29, inset 0 1px 0 #ffffff38;--secondary:#f9fafb;--secondary-foreground:#0f1115;--muted:#f1f3f5;--muted-foreground:#81858c;--accent:#ebeef2;--accent-foreground:#0f1115;--destructive:#b42318;--destructive-foreground:#fff;--border:#00000014;--input:#0000001f;--ring:#4176e6;--success:#166534;--success-background:#e7f6ed;--status-ok:#10b981;--status-ok-soft:#34d399;--status-ok-ring:#10b9818c;--status-error:#ef4444;--status-error-ring:#ef444466;--status-brand:#4176e6;--status-brand-ring:#4176e666;--warning:#92400e;--warning-background:#fef3c7;--careful:#991b1b;--careful-background:#fee2e2;--chart-1:#4176e6;--chart-2:#81858c;--chart-3:#8a6f2a;--chart-4:#5686fe;--chart-5:#b42318;--sidebar:#f9fafb;--sidebar-foreground:#61666b;--sidebar-primary:#4176e6;--sidebar-primary-foreground:#fff;--sidebar-accent:#ebeef2;--sidebar-accent-foreground:#0f1115;--sidebar-border:#0000000d;--sidebar-ring:#4176e6;color:#171717;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;background:0 0;font-family:Inter,Noto Sans SC,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.dark{--panel-accent-gradient:linear-gradient(135deg, #6b83ff14, #6b83ff05 60%, transparent);--background:#0f1115;--foreground:#f1f4f9;--card:#16191f;--card-foreground:#f1f4f9;--popover:#16191f;--popover-foreground:#f1f4f9;--primary:#6b83ff;--primary-foreground:#fff;--primary-btn-grad:linear-gradient(180deg, #4f6ef2 0%, #3a56e0 100%);--primary-btn-grad-hover:linear-gradient(180deg, #6484f5 0%, #4f6ef2 100%);--primary-btn-shadow:0 1px 2px #00000059, inset 0 1px 0 #ffffff24;--secondary:#1e222b;--secondary-foreground:#f1f4f9;--muted:#1e222b;--muted-foreground:#a7afb7;--accent:#1b2230;--accent-foreground:#f1f4f9;--destructive:#f97066;--destructive-foreground:#fff;--border:#ffffff24;--input:#ffffff29;--ring:#6b83ff;--success:#86efac;--success-background:#123622;--status-ok:#34d399;--status-ok-soft:#10b981;--status-ok-ring:#34d39980;--status-error:#f87171;--status-error-ring:#f8717166;--status-brand:#6b83ff;--status-brand-ring:#6b83ff66;--warning:#facc15;--warning-background:#3a2f12;--careful:#fca5a5;--careful-background:#3a1515;--chart-1:#6b83ff;--chart-2:#a7afb7;--chart-3:#facc15;--chart-4:#8ea0ff;--chart-5:#f97066;--sidebar:#16191f;--sidebar-foreground:#f1f4f9;--sidebar-primary:#6b83ff;--sidebar-primary-foreground:#fff;--sidebar-accent:#1b2230;--sidebar-accent-foreground:#f1f4f9;--sidebar-border:#ffffff1f;--sidebar-ring:#6b83ff}*{box-sizing:border-box}html{font-size:16px}html,body,#root{background:0 0;width:100%;height:100dvh;overflow:hidden}body{min-width:320px;min-height:100dvh;color:var(--foreground);-webkit-user-select:none;user-select:none;background:0 0;margin:0;font-family:inherit;font-size:.875rem;line-height:1.25rem;overflow:hidden}#root{background:0 0;border-radius:1rem}#root[data-system-titlebar=true]{border-radius:0}input,textarea,[contenteditable=true]{-webkit-user-select:text;user-select:text}button{cursor:pointer}button:disabled{cursor:not-allowed}p,h1,h2{margin:0}@media (width<=640px){body{overflow:hidden auto}#root{border-radius:0;overflow:visible}}@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-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@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-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}html,body{overflow-x:hidden}.fw-shell{overflow-x:clip}.fw-layout{grid-template-rows:minmax(0,1fr);grid-template-columns:232px minmax(0,1fr)}.fw-system-titlebar{--fw-left-column:232px;background:linear-gradient(90deg, #f4f6fa 0, #f4f6fa var(--fw-left-column), #fafbfc var(--fw-left-column), #fafbfc 100%)}.fw-system-titlebar .fw-sidebar,.fw-system-titlebar .fw-space-sidebar{padding-top:18px}.fw-system-titlebar .fw-toolbar{background:linear-gradient(#f3f5f7bd 0%,#f7f8f6fa 54%,#fafbfc 100%);border-bottom-color:#0000000a;min-height:82px;box-shadow:inset 0 1px #ffffffb3}@media (width>=641px){.fw-layout .fw-sidebar{min-height:0;position:static;overflow-y:auto;transform:none}.fw-layout .fw-space-sidebar{min-height:0;overflow-y:auto}}@media (width<=640px){.fw-layout{grid-template-columns:minmax(0,1fr)}.fw-layout .fw-sidebar{z-index:60;border-right:1px solid #00000014;width:min(280px,85vw);transition:transform .22s cubic-bezier(.2,.8,.2,1);position:fixed;top:0;bottom:0;left:0;transform:translate(-102%);box-shadow:0 0 40px #0f172a2e}.fw-layout[data-sidebar-open=true] .fw-sidebar{transform:translate(0)}.fw-layout .fw-space-sidebar{z-index:60;width:min(320px,88vw);transition:transform .22s cubic-bezier(.2,.8,.2,1);position:fixed;top:0;bottom:0;left:0;transform:translate(-102%)}.fw-layout[data-sidebar-open=true] .fw-space-sidebar{transform:translate(0)}.fw-system-titlebar{background:#fafbfc}}.fw-layout .fw-drawer-scrim{z-index:55;background:#0f172a73;display:none;position:fixed;inset:0}@media (width<=640px){.fw-layout .fw-drawer-scrim{opacity:0;pointer-events:none;transition:opacity .22s;display:block}.fw-layout[data-sidebar-open=true] .fw-drawer-scrim{opacity:1;pointer-events:auto}}.fw-shell{--fw-glow:47 84 235;--fw-flare:56 189 248;isolation:isolate;position:relative}.fw-shell[data-mode=classic]{--fw-glow:47 84 235;--fw-flare:250 204 21}.fw-shell:before,.fw-shell:after{z-index:50;pointer-events:none;content:"";position:absolute;inset:0}.fw-shell:before{background:radial-gradient(circle at 50% 50%, #ffffff94 0 8%, rgb(var(--fw-glow) / 18%) 18%, rgb(var(--fw-glow) / 0%) 46%), linear-gradient(90deg, rgb(var(--fw-glow) / 0%) 0%, rgb(var(--fw-glow) / 13%) 36%, #ffffffbd 50%, rgb(var(--fw-flare) / 16%) 64%, rgb(var(--fw-glow) / 0%) 100%);mix-blend-mode:screen;opacity:0;transform-origin:50%;animation:.64s cubic-bezier(.16,1,.3,1) both fw-shell-light-open;transform:scaleX(.04)}.fw-shell:after{background:linear-gradient(90deg, transparent 0%, #fff0 42%, #ffffff9e 50%, #fff0 58%, transparent 100%), repeating-linear-gradient(0deg, rgb(var(--fw-glow) / 0%) 0 26px, rgb(var(--fw-glow) / 8%) 27px 28px);mix-blend-mode:screen;opacity:0;animation:.64s cubic-bezier(.16,1,.3,1) both fw-shell-scan;transform:translate(-38%)}@keyframes fw-shell-light-open{0%{opacity:0;transform:scaleX(.04)}18%{opacity:.95}52%{opacity:.62;transform:scaleX(1)}to{opacity:0;transform:scaleX(1.08)}}@keyframes fw-shell-scan{0%{opacity:0;transform:translate(-38%)}26%{opacity:.46}78%{opacity:0;transform:translate(38%)}to{opacity:0;transform:translate(38%)}}@media (prefers-reduced-motion:reduce){.fw-shell:before,.fw-shell:after{display:none}}@keyframes fw-sweep{0%{transform:translate(-110%)}50%{transform:translate(92%)}to{transform:translate(250%)}}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/inter-400-C38fXH4l.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/inter-500-Cerq10X2.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(/assets/inter-600-LgqL8muc.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/inter-700-Yt3aPRUw.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Noto Sans SC;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/noto-sans-sc-400-68UKsrZK.woff2)format("woff2")}@font-face{font-family:Noto Sans SC;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/noto-sans-sc-700-BiGzk9PQ.woff2)format("woff2")}.scrollbar-none{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-none::-webkit-scrollbar{width:0;height:0;display:none}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#78808c59;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#78808c8c}*{scrollbar-width:thin;scrollbar-color:#78808c59 transparent}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{O as e,U as t,V as n,n as r,r as i}from"./supervisor-
|
|
1
|
+
import{O as e,U as t,V as n,n as r,r as i}from"./supervisor-DSBgs_XY.js";var a=t(n(),1);function o(){let[t,n]=(0,a.useState)(null);return{busy:t,run:(0,a.useCallback)(async(t,a,o)=>{n(t);let s=!0;try{let t=i(await a());if(t)throw Error(t);o?.success&&e.success(o.success)}catch(t){s=!1,e.error(t instanceof Error?t.message:String(t))}finally{n(null),o?.onDone?.(),s&&o?.refresh!==!1&&r.refresh()}return s},[])}}export{o as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{L as e,R as t}from"./supervisor-
|
|
1
|
+
import{L as e,R as t}from"./supervisor-DSBgs_XY.js";var n=t();function r({tone:t=`off`,ping:r=!1,className:i}){let a=t===`ok`?`bg-status-ok shadow-[0_0_6px_2px_var(--status-ok-ring)]`:t===`err`?`bg-status-error shadow-[0_0_6px_2px_var(--status-error-ring)]`:t===`warn`?`bg-warning`:t===`boot`?`bg-status-brand shadow-[0_0_6px_2px_var(--status-brand-ring)]`:`bg-muted-foreground/50`;return(0,n.jsxs)(`span`,{"aria-hidden":`true`,className:e(`relative inline-flex size-2 shrink-0 items-center justify-center`,i),children:[r?(0,n.jsx)(`span`,{className:e(`absolute inline-flex size-full animate-ping rounded-full`,t===`ok`?`bg-status-ok-soft opacity-75`:`bg-transparent`),style:t===`ok`?{animationDuration:`2s`}:void 0}):null,(0,n.jsx)(`span`,{className:e(`relative inline-flex size-2 rounded-full`,a)})]})}function i({tone:t=`off`,className:r,children:i}){return(0,n.jsx)(`span`,{className:e(`inline-flex h-5 shrink-0 items-center whitespace-nowrap rounded-full px-2 text-xs font-semibold leading-none`,t===`ok`&&`bg-success-background text-success`,t===`err`&&`bg-careful-background text-careful`,t===`warn`&&`bg-warning-background text-warning`,t===`boot`&&`bg-primary/10 text-primary`,t===`off`&&`bg-muted text-muted-foreground`,r),children:i})}function a({className:t,children:r}){return(0,n.jsx)(`div`,{className:e(`overflow-hidden rounded-lg border border-border bg-card shadow-[0_1px_2px_rgba(15,23,42,0.04)]`,t),children:r})}function o({title:t,subtitle:r,actions:i,className:a}){return(0,n.jsxs)(`div`,{className:e(`flex min-h-[52px] items-center justify-between gap-4 border-b border-border/70 bg-muted px-5`,a),children:[(0,n.jsxs)(`div`,{className:`min-w-0`,children:[(0,n.jsx)(`strong`,{className:`block truncate text-sm font-semibold leading-tight text-foreground`,children:t}),r?(0,n.jsx)(`span`,{className:`mt-1 block text-xs leading-tight text-muted-foreground`,children:r}):null]}),i?(0,n.jsx)(`div`,{className:`flex shrink-0 items-center gap-2`,children:i}):null]})}function s({icon:t,label:r,value:i,mono:a=!1,warn:o=!1,className:s}){return(0,n.jsxs)(`div`,{className:e(`flex min-w-0 flex-col gap-2`,s),children:[(0,n.jsxs)(`div`,{className:e(`flex items-center gap-1.5 text-xs text-muted-foreground`,o&&`text-destructive`),children:[t,(0,n.jsx)(`span`,{className:`truncate`,children:r})]}),(0,n.jsx)(`strong`,{className:e(`truncate text-lg font-semibold tabular-nums leading-none`,a&&`font-mono`,o?`text-destructive`:`text-foreground`),children:i})]})}function c({icon:t,label:r,value:i,note:a,danger:o=!1}){return(0,n.jsxs)(`div`,{className:`grid min-h-[52px] min-w-0 flex-1 grid-cols-[auto_minmax(0,1fr)] items-center gap-x-1.5 rounded-md border border-border bg-card px-3 py-2`,children:[(0,n.jsx)(`span`,{className:`text-muted-foreground`,children:t}),(0,n.jsx)(`span`,{className:`overflow-hidden text-ellipsis whitespace-nowrap text-xs leading-tight text-muted-foreground`,children:r}),(0,n.jsx)(`strong`,{className:e(`col-span-full mt-1 truncate text-base font-semibold leading-none tabular-nums`,o?`text-destructive`:`text-foreground`),children:i}),a?(0,n.jsx)(`span`,{className:`col-span-full mt-1 truncate text-[11px] leading-tight text-muted-foreground`,children:a}):null]})}function l({kind:e}){return(0,n.jsx)(i,{tone:e===`native`?`boot`:`off`,children:e===`native`?`原生`:`沙箱`})}function u({children:t,className:r}){return(0,n.jsx)(`span`,{className:e(`max-w-[180px] overflow-hidden text-ellipsis whitespace-nowrap font-mono text-sm leading-tight text-muted-foreground`,r),children:t})}export{u as a,r as c,s as i,o as n,i as o,l as r,c as s,a as t};
|
package/ui-react/supervisor.html
CHANGED
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
html, body, #root { width: 100%; height: 100%; height: 100dvh; }
|
|
17
17
|
body { margin: 0; min-width: 320px; min-height: 100vh; min-height: 100dvh; overflow: hidden; background: transparent; }
|
|
18
18
|
</style>
|
|
19
|
-
<script type="module" crossorigin src="/assets/supervisor-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/supervisor-
|
|
19
|
+
<script type="module" crossorigin src="/assets/supervisor-DWUbDZTX.js"></script>
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/supervisor-DSBgs_XY.js">
|
|
21
21
|
<link rel="stylesheet" crossorigin href="/assets/supervisor-hG2-v7mV.css">
|
|
22
|
-
<link rel="stylesheet" crossorigin href="/assets/supervisor-
|
|
22
|
+
<link rel="stylesheet" crossorigin href="/assets/supervisor-DgItqlLO.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body>
|
|
25
25
|
<div id="root"></div>
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{F as e,I as t,L as n,N as r,O as i,R as a,S as o,U as s,V as c,_ as l,a as u,b as d,c as f,g as p,k as m,n as h,o as g,t as _,v,x as y,y as b}from"./supervisor-Blfqgw-f.js";import{n as x,o as S}from"./openExternal-BL2ow_UN.js";import{n as C,t as w}from"./rocket-OqsLWeGD.js";import{t as T}from"./shield-check-DdG3gN1L.js";import{c as E,f as D,o as O,s as k}from"./supervisor-C0cZTc5d.js";import{t as A}from"./useSupervisorAction-DUxfx47b.js";import{c as j,i as M,o as ee,r as N,t as P}from"./widgets-C9CEOdGF.js";var F=r(`box`,[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`,key:`hh9hay`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`,key:`g66t2b`}],[`path`,{d:`M12 22V12`,key:`d0xqtd`}]]),I=r(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),L=r(`square`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}]]),R=s(c(),1),z=a();function B({onRegisterActions:r}){let{snap:a}=_(),{busy:s,run:c}=A(),B=e(),[V,H]=(0,R.useState)(!1),[U,W]=(0,R.useState)(``),[G,K]=(0,R.useState)(``),[q,J]=(0,R.useState)(``),Y=a.instances?.instances??[],[X,Z]=(0,R.useState)(null);(0,R.useEffect)(()=>{let e=!0;return u.envStatus().then(t=>{e&&Z(t.capabilities??null)}).catch(()=>void 0),()=>{e=!1}},[]);let Q=X!==null&&X.sandboxLaunch===!1;(0,R.useEffect)(()=>(r?.({onAdd:()=>H(!0)}),()=>r?.(null)),[r]);let $=(e,t)=>c(e,t),te=e=>c(e,()=>x(()=>u.instanceOpenWeb(e)).then(()=>void 0));async function ne(){if(Q){i.error(`当前平台不支持沙箱实例(见 /env/status 能力矩阵)`);return}let e=parseInt(G,10);if(!Number.isFinite(e)||e<=0){i.error(`请填写有效端口`);return}let t=q?q.split(/\n/).map(e=>e.trim()).filter(Boolean):[];try{let n=await u.instanceAdd({name:U.trim()||`沙箱 `+e,port:e,command:t});if(n&&n.ok===!1){i.error(n.error||`添加失败`);return}i.success(`已添加实例`),H(!1),W(``),K(``),J(``),h.refresh()}catch(e){i.error(String(e))}}async function re(e){await c(e.id,async()=>{let t=await u.instanceCheckUpdate(e.id);t.updateAvailable?(i.success(`发现新版 `+t.latest+`,可点「更新」升级`),ae(t=>new Map(t).set(e.id,!0))):t.latest?i.info(`已是最新 `+t.latest):i.error(t.error||`版本检测失败`)})}let[ie,ae]=(0,R.useState)(new Map);async function oe(e){await B({title:`升级该沙箱实例的 DSH 到最新版?`,description:`实例会短暂重启,进行中的请求中断。`,confirmText:`升级`})&&await c(e.id,()=>u.instanceUpgrade(e.id),{success:`升级已开始…`})}async function se(e){await B({title:`删除实例「`+e.name+`」?`,description:`将彻底删除该沙箱实例(含配置与运行时数据)。此操作不可恢复。`,confirmText:`删除实例`,tone:`destructive`})&&await c(e.id,async()=>{let t=await u.instanceRemove(e.id);t&&t.ok!==!1&&t.dataPreserved===!0?i.warning(`实例已移除,但因其单元仍在运行,数据目录已保留(未删除)——请先停止实例再删数据`):t&&t.ok===!1&&i.error(t.error||`删除失败`),h.refresh()})}let ce=({it:e})=>{let r=e.state?.running??!1,i=e.state?.lifecyclePhase,a=k(i,r),o=e.updateJob,c=o?.state===`running`,l=e.state?.usage,d=l&&typeof l.memMb==`number`?l.memMb:null,p=l&&typeof l.cpuPct==`number`?l.cpuPct:null,h=s===e.id;return(0,z.jsxs)(P,{className:`overflow-visible`,children:[(0,z.jsxs)(`div`,{className:`grid grid-cols-1 @min-[720px]:grid-cols-[minmax(0,5fr)_minmax(0,6fr)]`,children:[(0,z.jsxs)(`div`,{className:`flex flex-col gap-4 border-b border-border px-6 py-5 md:border-b-0 md:border-r`,children:[(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,z.jsx)(`strong`,{className:`truncate text-lg font-semibold tracking-[-0.01em] text-foreground`,children:e.name}),e.version?(0,z.jsxs)(`span`,{className:`font-mono text-sm text-muted-foreground`,children:[`v`,e.version]}):null]}),ie.get(e.id)?(0,z.jsxs)(t,{className:`text-primary-foreground`,onClick:()=>void oe(e),size:`chip`,children:[(0,z.jsx)(I,{className:`size-3`}),`更新`]}):(0,z.jsxs)(t,{className:`bg-primary/10 text-primary hover:bg-primary/15`,disabled:h||c,onClick:()=>void re(e),size:`chip`,variant:`ghost`,children:[(0,z.jsx)(I,{className:n(`size-3`,h&&`animate-spin`)}),`检测更新`]})]}),(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,z.jsx)(j,{tone:a.tone,ping:a.tone===`ok`}),(0,z.jsx)(`span`,{className:`text-base font-semibold leading-none text-foreground`,children:a.label})]}),c?(0,z.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,z.jsx)(f,{className:`size-3`}),`正在升级 DeepSeek Harness(`,o?.step||``,`)…`]}):null,e.state?.installing?(0,z.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,z.jsx)(f,{className:`size-3`}),`正在安装…`]}):null,i===`FAILED`?(0,z.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-destructive`,children:[(0,z.jsx)(m,{className:`size-3.5`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.state?.lastError||e.state?.installError||`启动反复失败,已停止自动重启,可手动重试`})]}):null]}),(0,z.jsx)(`div`,{className:`flex items-center bg-[image:var(--panel-accent-gradient)] px-6 py-5`,children:(0,z.jsxs)(`div`,{className:`grid w-full grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-4`,children:[(0,z.jsx)(M,{icon:(0,z.jsx)(D,{className:`size-4`}),label:`端口`,value:String(e.port),mono:!0}),(0,z.jsx)(M,{icon:(0,z.jsx)(L,{className:`size-4`}),label:`PID`,value:e.state?.pid?String(e.state.pid):`—`,mono:!0}),(0,z.jsx)(M,{icon:(0,z.jsx)(I,{className:`size-4`}),label:`重启次数`,value:String(e.state?.restartCount??0),mono:!0}),(0,z.jsx)(M,{icon:(0,z.jsx)(m,{className:`size-4`}),label:`最近故障`,value:e.state?.lastFailure?O(e.state.lastFailure):`无`,warn:!!e.state?.lastFailure})]})})]}),(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-t border-border/60 px-6 py-3`,children:[(0,z.jsxs)(`span`,{className:`hidden min-w-0 items-center lg:inline-flex gap-2 text-xs text-muted-foreground`,children:[(0,z.jsx)(N,{domain:`sandbox`}),(0,z.jsx)(ee,{tone:e.remoteMode&&e.remoteMode!==`off`?`boot`:`off`,children:e.remoteMode===`wan`?`远程·公网`:e.remoteMode===`lan`?`远程·局域网`:`远程关闭`}),d===null&&p===null?null:(0,z.jsxs)(`span`,{className:`whitespace-nowrap`,title:`监督拍实测值(最近一次采样;停止或未采到不显示)`,children:[`占用 `,d===null?`—`:`${d}MB`,p===null?``:` · CPU ${Math.round(p)}%`]})]}),(0,z.jsxs)(`div`,{className:`ml-auto flex flex-wrap items-center gap-2`,children:[(0,z.jsxs)(t,{disabled:!r,onClick:()=>void te(e.id),size:`sm`,title:`打开 DSH Web(自动带认证连接)`,variant:`outline`,className:`hidden md:inline-flex`,children:[(0,z.jsx)(S,{className:`size-4`}),`DSH Web`]}),(0,z.jsx)(t,{disabled:c,onClick:()=>void $(e.id,()=>r?u.instanceStop(e.id):u.instanceStart(e.id)),size:`sm`,variant:`outline`,children:r?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(C,{className:`size-4 text-status-error`}),`停止实例`]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(w,{className:`size-4 text-primary`}),`启动实例`]})}),(0,z.jsx)(`span`,{"aria-hidden":`true`,className:`mx-1 h-5 w-px bg-border`}),(0,z.jsxs)(t,{disabled:h,onClick:()=>void $(e.id,()=>u.instanceUpdate(e.id,{guardian:!e.guardian})),size:`sm`,variant:`outline`,children:[(0,z.jsx)(T,{className:n(`size-4`,e.guardian?`text-status-ok`:`text-muted-foreground`)}),e.guardian?`停止监控`:`启动监控`]}),(0,z.jsxs)(t,{className:`hidden h-[30px] md:inline-flex`,disabled:h,onClick:()=>void se(e),size:`sm`,variant:`destructive`,children:[(0,z.jsx)(E,{className:`size-4`}),`删除`]})]})]})]})};return(0,z.jsxs)(`div`,{className:`grid content-start gap-4`,children:[Q?(0,z.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2.5 text-xs text-muted-foreground`,children:[(0,z.jsx)(m,{className:`mt-0.5 size-3.5 shrink-0 text-amber-500`}),(0,z.jsxs)(`span`,{children:[`当前平台(`,X?.platform||`未知`,`)不支持沙箱实例(能力矩阵见 /env/status 的 capabilities.sandboxLaunch;限额执行档位见 capabilities.sandboxEnforcement)。 原生 DSH 主实例不受影响。`]})]}):null,Y.length?(0,z.jsx)(`div`,{className:`grid gap-3`,children:Y.map(e=>(0,z.jsx)(ce,{it:e},e.id))}):(0,z.jsx)(`div`,{className:`grid min-h-[220px] place-items-center rounded-lg border border-dashed border-border text-center`,children:(0,z.jsxs)(`div`,{children:[(0,z.jsx)(F,{className:`mx-auto mb-3 size-8 text-muted-foreground`}),(0,z.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:`尚未添加沙箱实例`}),(0,z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:Q?`当前平台不支持沙箱实例(见上方说明)`:`点击顶部「添加实例」创建沙箱`})]})}),(0,z.jsx)(v,{open:V,onOpenChange:H,children:(0,z.jsxs)(b,{className:`max-w-[440px]`,children:[(0,z.jsx)(y,{children:(0,z.jsx)(o,{children:`添加 DSH 实例`})}),(0,z.jsxs)(`div`,{className:`grid gap-3`,children:[(0,z.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,z.jsx)(p,{children:`实例名称`}),(0,z.jsx)(l,{placeholder:`如 沙箱二开`,value:U,onChange:e=>W(e.target.value)})]}),(0,z.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,z.jsx)(p,{children:`监听端口`}),(0,z.jsx)(l,{inputMode:`numeric`,placeholder:`如 3082`,value:G,onChange:e=>K(e.target.value)})]}),(0,z.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,z.jsx)(p,{children:`启动命令(每项一参数,可留空用默认)`}),(0,z.jsx)(g,{className:`min-h-[72px] font-mono text-sm`,placeholder:`node
|
|
2
|
-
/usr/local/bin/dsh
|
|
3
|
-
web`,value:q,onChange:e=>J(e.target.value)})]}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`留空则使用默认启动命令;各实例共享系统资源,不做内存/CPU 限制。`})]}),(0,z.jsxs)(d,{children:[(0,z.jsx)(t,{onClick:()=>H(!1),variant:`outline`,children:`取消`}),(0,z.jsx)(t,{onClick:()=>void ne(),children:`添加`})]})]})})]})}export{B as InstancesPage};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{F as e,I as t,L as n,N as r,O as i,R as a,S as o,U as s,V as c,a as l,b as ee,h as u,k as d,m as f,t as p,v as m,x as h,y as g}from"./supervisor-Blfqgw-f.js";import{n as _,o as v}from"./openExternal-BL2ow_UN.js";import{n as y,t as b}from"./rocket-OqsLWeGD.js";import{t as x}from"./refresh-cw-CHZo8X7a.js";import{t as S}from"./shield-check-DdG3gN1L.js";import{c as C,f as te,n as w,o as T,t as E}from"./supervisor-C0cZTc5d.js";import{t as D}from"./useSupervisorAction-DUxfx47b.js";import{c as O,i as k,n as A,o as j,t as M}from"./widgets-C9CEOdGF.js";import{t as N}from"./format-QeaTKFhQ.js";var P=r(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]),F=r(`circle-dot`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),I=r(`square-terminal`,[[`path`,{d:`m7 11 2-2-2-2`,key:`1lz0vl`}],[`path`,{d:`M11 13h4`,key:`1p7l4v`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,ry:`2`,key:`1m3agn`}]]),L=s(c(),1),R=a();function z(e,t){return e===`dsh-main`||e===`supervisor-api`?`boot`:(t||``).startsWith(`inst:`)?`ok`:e===`relay`?`warn`:e.startsWith(`managed:`)?`boot`:`off`}function B(e){let t={"dsh-main":`DSH 主实例`,"supervisor-api":`管家 API`,user:`沙箱实例`,relay:`局域网隧道`,oauthCallback:`登录回调`,proxyInstance:`反代实例`,providerApi:`供应商 API`,"managed:router-daemon":`智能路由`,"managed:lan-daemon":`远程控制`,dynamic:`动态端口`},n=/^managed:(.+)$/.exec(e.role);return n?t[e.role]??n[1]:t[e.role]??e.role}function V(e,t){let n=e.owner||``;if(e.role===`proxyInstance`){let e=(n.split(`:`).pop()||``).slice(-4),r=(t??[]).find(t=>(t.accounts??[]).some(t=>(t.maskedKey||``).endsWith(e)));return r?r.name:`反代`}return n.startsWith(`inst:`)?`沙箱实例`:n.startsWith(`system:`)?`系统`:n.startsWith(`relay:`)?`局域网隧道`:n.startsWith(`dynamic:`)?`动态`:n.startsWith(`providerApi:`)?`供应商`:n.startsWith(`oauth:`)?`登录回调`:n===`router-daemon`||e.role===`managed:router-daemon`?`智能路由`:n===`lan-daemon`||e.role===`managed:lan-daemon`?`远程控制`:e.role===`oauthCallback`?`登录回调`:e.role}function H({providers:e=[]}){let{snap:t}=p(),r=t.ports?.records??null,i=(0,L.useMemo)(()=>r?[...r.filter(e=>e.role!==`supervisor-api`||e.port!==3100&&e.port!==3101)].sort((e,t)=>!!e.active==!!t.active?e.port-t.port:e.active?-1:1):null,[r]);return(0,R.jsxs)(M,{className:`flex min-h-0 flex-col overflow-hidden`,children:[(0,R.jsx)(A,{title:`运行状态`,subtitle:`核心服务与端口实时状态`,actions:i?(0,R.jsxs)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:[i.length,` 端口`]}):null}),i?(0,R.jsxs)(`div`,{className:`min-h-0 overflow-x-auto`,children:[(0,R.jsxs)(`div`,{className:`grid min-w-[400px] grid-cols-[56px_minmax(0,1fr)_auto_66px] items-center gap-2 border-b border-border/60 bg-muted/60 px-4 py-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`,children:[(0,R.jsx)(`span`,{children:`端口`}),(0,R.jsx)(`span`,{children:`服务`}),(0,R.jsx)(`span`,{className:`text-right`,children:`归属`}),(0,R.jsx)(`span`,{className:`text-right`,children:`状态`})]}),(0,R.jsx)(`div`,{className:`max-h-[340px] overflow-y-auto overscroll-contain`,children:i.map((t,r)=>(0,R.jsxs)(`div`,{className:n(`grid grid-cols-[56px_minmax(0,1fr)_auto_66px] items-center gap-2 px-4 py-2 hover:bg-muted/40`,r>0&&`border-t border-border/50`),children:[(0,R.jsx)(`code`,{className:`font-mono text-sm tabular-nums text-foreground`,children:t.port}),(0,R.jsx)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:(0,R.jsx)(`span`,{className:`truncate text-xs text-foreground`,children:B(t)})}),(0,R.jsx)(`div`,{className:`flex justify-end`,children:(0,R.jsx)(j,{tone:z(t.role,t.owner),children:V(t,e)})}),(0,R.jsx)(`div`,{className:`flex justify-end`,children:t.active===!0?(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1 whitespace-nowrap text-[11px] text-status-ok`,children:[(0,R.jsx)(F,{className:`size-3`}),`运行中`]}):t.active===!1?(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1 whitespace-nowrap text-[11px] text-muted-foreground`,children:[(0,R.jsx)(F,{className:`size-3 opacity-50`}),`未运行`]}):(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1 whitespace-nowrap text-[11px] text-muted-foreground`,children:[(0,R.jsx)(F,{className:`size-3 opacity-40`}),`状态未知`]})})]},t.port+`-`+t.owner))})]}):(0,R.jsx)(`div`,{className:`px-5 py-6 text-center text-xs text-muted-foreground`,children:`运行状态加载中…`})]})}function U(e){if(!e)return`未读出`;let t=String(e.state||`?`),n=e.detail?`(`+String(e.detail)+`)`:``;return(String(e.label||``)||`条目`)+` `+t+n}function W(e){return!e||e.state===`pending`?`未探测(点「重新探测」补齐)`:e.state===`error`?`探测失败:`+(e.error||`未给出原因`):e.state===`empty`?`已探测,无内容`:`已探测`+(e.at?` `+new Date(e.at).toLocaleTimeString():``)}function G(e){let t=e||{};return t.state===`on`?`在用(`+(t.server||t.pac||`地址未读出`)+`)`:t.state===`off`?`系统里明确未启用`:t.state===`unknown`?`取不到`+(t.source?`(`+t.source+`)`:``)+`,按判不出处理`:`未探测`}function K(e){return e===!0?`可达`:e===!1?`不通`:`判不出`}function q(e){return(e.section?e.section+`:`:``)+e.source+`:`+String(e.detail??``)}function J(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?`时间未读出`:e<6e4?`刚刚`:e<36e5?Math.floor(e/6e4)+` 分钟前`:e<864e5?Math.floor(e/36e5)+` 小时前`:Math.floor(e/864e5)+` 天前`}function Y(e){return e===!0?`是`:e===!1?`否`:`未读出`}function X(e,t,n){let r=t||``,i=n||``,a=r&&i&&r!==i?`(两份不一致:装内核用的是壳那套,本进程解析到的是内核这套)`:``;return e+` 内核 `+(r||`未读出`)+` / 壳 `+(i||`未报`)+a}function Z(e){let t=e.ok===!0?`通`:e.ok===!1?`不通`:`判不出`;return(e.probe||`明细`)+` `+t+(e.target?`(`+e.target+`)`:``)+(typeof e.ms==`number`?` `+e.ms+` 毫秒`:``)}function ne(e,t){return e?t?`没落盘(这一拍读的是内核缓存拍)`:e.written===!0?`已写入`:e.error?`失败:`+e.error:`没落盘(也没报错误)`:`未给出(这一拍没装配)`}function re(e,t){if(t)return`读不回:`+t;if(!e)return`未读`;if(e.available===!0){let t=typeof e.at==`number`?new Date(e.at).toLocaleString():`时间未读出`,n=e.data&&e.data.browsers?e.data.browsers.length:null;return t+`(`+J(e.ageMs)+`)`+(n===null?``:`,候选 `+n+` 个`)}return e.reason===`never-written`?`这台机器还没落过盘`:`快照文件读不出或版本不符(不是没写过,得查文件)`}function ie(e){let t=e||{},n=Object.keys(t).filter(e=>t[e]!==`ok`);return n.length?`未补齐:`+n.join(`、`):`全部维度补齐`}function ae(e){let t=e&&e.name?e.name:`未定出`;return!e||!e.how?`现在会用:`+t:e.how===`user-preference`?`现在会用:`+t+`(你选的)`:e.how===`candidate-rank`?`现在会用:`+t+`(系统未报默认项,按候选次序取首个,可在此改)`:e.how===`only-installed`?`现在会用:`+t+`(本机唯一候选)`:e.how===`none-found`?`本机未探到可用浏览器,请安装或启用一个后重新探测`:`现在会用:`+t+`(系统默认项)`}var Q=`__system__`;function oe(){let[e,r]=(0,L.useState)(!1),[i,a]=(0,L.useState)(null),[s,c]=(0,L.useState)(null),[p,_]=(0,L.useState)(null),[y,b]=(0,L.useState)(!1),[S,C]=(0,L.useState)(!1),[te,w]=(0,L.useState)(null),[T,E]=(0,L.useState)(null),D=(0,L.useCallback)(async e=>{e&&b(!0);try{let t=await l.environment(e);a(t),_(null),c(null)}catch(e){c(String(e.message||e))}b(!1),l.environmentLast().then(e=>{w(e),E(null)}).catch(e=>{w(null),E(String(e.message||e))})},[]);(0,L.useEffect)(()=>{e&&D(!1)},[e,D]);let O=async e=>{C(!0);let t={ok:!1,error:`偏好写入未返回结果`};try{t=await l.setExternalBrowser(e)}catch(e){t={ok:!1,error:String(e.message||e)}}if(C(!1),!t||t.ok!==!0){c(t&&t.error||`偏好写入失败`);return}c(null),await D(!0)},k=i?.browsers??[],A=i?.sections,j=i?.pick?.stale===!0,M=i?.preference?.id||Q,N=p===null?M:p,P=A?.startup?.data,F=A?.shell?.data,I=F?.registry,z=I?.probes||[],B=F?.records||[],V=I?.latencyMs,H=I?.probesTotal??0,oe=A?.runtime?.data?.node?.version||null,$=A?.runtime?.data?.npm?.detail||null;return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 whitespace-nowrap`,children:[(0,R.jsxs)(t,{size:`sm`,variant:`ghost`,className:`h-6 gap-1 px-1.5 text-xs text-muted-foreground`,onClick:()=>r(!0),children:[(0,R.jsx)(v,{className:`size-3`}),`环境表单`]}),i?.pick?.name?(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground/70`,children:i.pick.name}):null]}),(0,R.jsx)(m,{open:e,onOpenChange:r,children:(0,R.jsxs)(g,{className:`max-w-[560px]`,children:[(0,R.jsx)(h,{children:(0,R.jsx)(o,{children:`本机环境表单`})}),(0,R.jsxs)(`div`,{className:`grid max-h-[60vh] gap-3 overflow-y-auto text-sm`,children:[(0,R.jsx)(`p`,{className:n(`text-xs`,j||!k.length?`font-semibold text-warning`:`text-muted-foreground`),children:ae(i?.pick)}),j?(0,R.jsxs)(`p`,{className:`inline-flex items-start gap-1.5 rounded-md bg-warning-background px-2 py-1.5 text-xs font-semibold text-warning`,children:[(0,R.jsx)(d,{className:`mt-0.5 size-3.5 shrink-0`}),`你先前选的浏览器已不在本机候选清单(可能已卸载或路径变更),下方选择已回落到系统判定,请重选或清除。`]}):null,s?(0,R.jsx)(`p`,{className:`text-xs text-status-error`,children:s}):null,(0,R.jsxs)(`div`,{className:`grid gap-2 rounded-md border border-border/60 px-3 py-2.5`,children:[(0,R.jsx)(`span`,{className:`text-xs font-medium`,children:`打开地址用哪个浏览器`}),(0,R.jsxs)(f,{value:N,onValueChange:_,className:`grid gap-1.5`,children:[(0,R.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-2 text-xs`,children:[(0,R.jsx)(u,{value:Q,id:`env-pref-system`}),(0,R.jsx)(`span`,{children:`跟随系统默认(本机探不到默认项时按候选次序)`})]}),k.map(e=>(0,R.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-2 text-xs`,children:[(0,R.jsx)(u,{value:e.id,id:`env-pref-`+e.id}),(0,R.jsx)(`span`,{children:e.name||e.bin}),(0,R.jsx)(`span`,{className:`text-muted-foreground/70`,children:e.engine}),e.isDefault?(0,R.jsx)(`span`,{className:`text-muted-foreground/70`,children:`系统默认`}):null]},e.id))]}),k.length?(0,R.jsxs)(`div`,{className:`flex gap-2`,children:[(0,R.jsx)(t,{size:`sm`,variant:`outline`,disabled:S||N===M,onClick:()=>void O(N===Q?``:N),children:`保存偏好`}),(0,R.jsx)(t,{size:`sm`,variant:`ghost`,disabled:S||M===Q,onClick:()=>void O(``),children:`清除`})]}):(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`候选为空:重新探测后仍为空时,请先在系统里安装或启用一个浏览器。`})]}),(0,R.jsxs)(`div`,{className:`grid gap-1.5 rounded-md border border-border/60 px-3 py-2.5`,children:[(0,R.jsx)(`span`,{className:`text-xs font-medium`,children:`出网条件(隔离登录窗口的分发依据)`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:W(A?.egress)}),A?.egress?.data?(0,R.jsxs)(`div`,{className:`grid gap-0.5 text-xs`,children:[(0,R.jsxs)(`span`,{className:`text-muted-foreground`,children:[`系统代理:`,G(A?.egress?.data?.proxy)]}),Object.entries(A?.egress?.data?.targets||{}).map(([e,t])=>(0,R.jsxs)(`span`,{className:`text-muted-foreground`,children:[e,`:`,K(t?.ok),t?.stage?`(停在 `+t.stage+(t.detail?` `+t.detail:``)+`)`:``]},e)),Object.keys(A?.egress?.data?.targets||{}).length?null:(0,R.jsx)(`span`,{className:`text-muted-foreground`,children:`还没有目标域被问过:一键登录时会当场判定并记在这里。`})]}):null,A?.egress?.data?.proxy?.state===`off`?(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`没有在用系统代理时,直连不通的授权域只能靠现有浏览器窗口的既有出网路径打开(隔离冷档案会是空白页)。`}):null]}),(0,R.jsxs)(`div`,{className:`grid gap-1.5 rounded-md border border-border/60 px-3 py-2.5`,children:[(0,R.jsx)(`span`,{className:`text-xs font-medium`,children:`运行时与 DSH(安装/升级动作的分发依据)`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:W(A?.runtime)}),A?.runtime?.data?(0,R.jsxs)(`div`,{className:`grid gap-0.5 text-xs text-muted-foreground`,children:[(0,R.jsxs)(`span`,{children:[U(A?.runtime?.data?.node),` · `,U(A?.runtime?.data?.npm),` · `,U(A?.runtime?.data?.git)]}),A?.runtime?.data?.node?.min?(0,R.jsxs)(`span`,{className:`break-all`,children:[`Node 门槛:`,(A?.runtime?.data?.node).min,(A?.runtime?.data?.node).meets===!1?` ⇒ 本机版本低于门槛,不采纳现有 Node(会安装达标的官方版本)`:` ⇒ 已达门槛`]}):null,(0,R.jsxs)(`span`,{children:[`镜像源:`,A?.runtime?.data?.registry?.origin||`未读出`,A?.runtime?.data?.registry?.mode?`(`+A.runtime.data.registry.mode+`)`:``,` · 候选 `+(A?.runtime?.data?.registry?.candidates||[]).length+` 个`]}),(0,R.jsxs)(`span`,{className:`break-all`,children:[`全局前缀:`,A?.runtime?.data?.prefix||`未实测(npm root -g 未返回)`]})]}):null,(0,R.jsx)(`span`,{className:`text-xs font-medium`,children:`桌面壳所见(装内核时真正用的那一套,与上面的内核读数并排对照)`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:W(A?.shell)}),F?(0,R.jsxs)(`div`,{className:`grid gap-0.5 text-xs text-muted-foreground`,children:[(0,R.jsx)(`span`,{children:F.available===!0?`壳上报于 `+J(F.ageMs)+`,写入者 `+(F.writtenBy||`未署名`)+`(报告版本 `+(F.schema??`未读出`)+`)`:F.reason===`never-written`?`这台机器的壳还没报过:内核由命令行或别的进程拉起时这是常态,不是故障`:`壳报的文件读不出或版本不符(不是没写过,得查那个文件)`}),F.available===!0?(0,R.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,R.jsx)(`span`,{className:`break-all`,children:X(`Node:`,oe,F.node?.version)}),(0,R.jsx)(`span`,{className:`break-all`,children:X(`npm:`,$,F.npm?.version)}),(0,R.jsx)(`span`,{className:`break-all`,children:X(`镜像源:`,A?.runtime?.data?.registry?.origin,F.registry?.best)}),(0,R.jsx)(`span`,{className:`break-all`,children:X(`全局前缀:`,A?.runtime?.data?.prefix,F.prefix?.dir)}),F.node&&F.node.ok!==!0?(0,R.jsxs)(`span`,{children:[`壳判 Node 达标:`,Y(F.node.ok),`(`,F.node.version||`版本未报`,`,门槛 `,F.node.min||`未报`,`)`]}):null,F.prefix&&F.prefix.writable!==!0?(0,R.jsxs)(`span`,{className:`break-all`,children:[`壳判前缀可写:`,Y(F.prefix.writable),F.prefix.why?`(`+F.prefix.why+`)`:``]}):null,z.length||I?.best?(0,R.jsxs)(`span`,{className:`break-all`,children:[`壳的镜像源候选:`,z.map(e=>(e.url||`?`)+` `+K(e.ok)).join(`、`),typeof V==`number`?`(择优选中用时 `+V+` 毫秒)`:``,H>z.length?`(报告里共 `+H+` 个候选,此处只列前 `+z.length+` 个)`:``]}):null,B.length?(0,R.jsxs)(`span`,{children:[`壳的探测明细 `,B.length,` 条:`,B.slice(0,8).map(Z).join(`;`),B.length>8?`…其余见内核快照文件`:``,F.droppedRecords?`(报告送达时被截断 `+F.droppedRecords+` 条)`:``]}):null]}):null]}):null,(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:W(A?.dsh)}),A?.dsh?.data?(0,R.jsxs)(`div`,{className:`grid gap-0.5 text-xs text-muted-foreground`,children:[(0,R.jsxs)(`span`,{children:[U(A?.dsh?.data?.dsh),` · `,U(A?.dsh?.data?.selfUpdate)]}),(0,R.jsxs)(`span`,{children:[`监控:`,A?.dsh?.data?.managed?`守卫托管`:`未托管`,A?.dsh?.data?.phase?` · `+A.dsh.data.phase:``]})]}):null]}),(0,R.jsxs)(`div`,{className:`grid gap-1.5 rounded-md border border-border/60 px-3 py-2.5`,children:[(0,R.jsx)(`span`,{className:`text-xs font-medium`,children:`启动既成事实(守卫这一拍真的跑过什么)`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:W(A?.startup)}),P?(0,R.jsxs)(`div`,{className:`grid gap-0.5 text-xs text-muted-foreground`,children:[(0,R.jsxs)(`span`,{children:[`守卫启动于 `,typeof P.bootAt==`number`?new Date(P.bootAt).toLocaleTimeString():`未读出`,`,环境表单首拍排在启动后 `,P.envDelayMs??`未读出`,` 毫秒`]}),(0,R.jsxs)(`span`,{children:[`选路:自动启动 `,Y(P.routerAutostart),`,模式 `,P.routerMode||`未读出(这一拍没走到那步)`]}),(0,R.jsxs)(`span`,{children:[`更新检查:`,P.updateCheck?P.updateCheck.enabled?`开(首查排在启动后 `+(P.updateCheck.initialDelayMs??`未读出`)+` 毫秒,之后每 `+(P.updateCheck.intervalMs??`未读出`)+` 毫秒)`:`关(配置里就禁掉了,这同样是一条既成事实)`:`未记录`]}),(0,R.jsxs)(`span`,{children:[`壳监控:`,Y(P.shellWatchdog)]}),(0,R.jsx)(`span`,{children:P.lastRefresh?`最近一次表单刷新于 `+(typeof P.lastRefresh.at==`number`?new Date(P.lastRefresh.at).toLocaleTimeString():`未读出`)+`,耗时 `+(P.lastRefresh.tookMs??`未读出`)+` 毫秒,浏览器 `+(P.lastRefresh.browsers??`未读出`)+` 个,分发依据 `+(P.lastRefresh.pick||`未定出`)+`,落盘 `+Y(P.lastRefresh.snapshotWritten)+`;`+ie(P.lastRefresh.dims):`这一拍还没跑过表单刷新(首拍排在上面那个延迟之后)`})]}):null]}),(0,R.jsxs)(`dl`,{className:`grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-xs`,children:[(0,R.jsx)(`dt`,{className:`text-muted-foreground`,children:`平台`}),(0,R.jsx)(`dd`,{className:`font-mono`,children:[i?.identity?.platform,i?.identity?.arch].filter(Boolean).join(` / `)||`—`}),(0,R.jsx)(`dt`,{className:`text-muted-foreground`,children:`图形会话`}),(0,R.jsx)(`dd`,{children:i?.session?.available?`可用(`+(i?.session?.reason||`—`)+`)`:`不可用(`+(i?.session?.reason||`—`)+`)`}),(0,R.jsx)(`dt`,{className:`text-muted-foreground`,children:`系统默认项`}),(0,R.jsx)(`dd`,{children:i?.default?i.default.id+`(来源 `+(i.default.source||`未读出`)+`)`:`未读出`}),(0,R.jsx)(`dt`,{className:`text-muted-foreground`,children:`候选`}),(0,R.jsx)(`dd`,{children:k.length?k.map(e=>(e.name||e.bin)+`[`+(e.sources||[]).join(`+`)+`]`).join(`、`):`无`}),(0,R.jsx)(`dt`,{className:`text-muted-foreground`,children:`探测留痕`}),(0,R.jsx)(`dd`,{className:`grid gap-0.5`,children:(i?.probed??[]).map((e,t)=>(0,R.jsx)(`span`,{className:`text-muted-foreground/80`,children:q(e)},t))}),(0,R.jsx)(`dt`,{className:`text-muted-foreground`,children:`快照落盘`}),(0,R.jsxs)(`dd`,{className:`break-all font-mono text-muted-foreground/80`,children:[ne(i?.snapshot,i?.cached===!0),(0,R.jsxs)(`span`,{className:`text-muted-foreground/60`,children:[` `,i?.snapshot?.path||`未给出路径`]})]}),(0,R.jsx)(`dt`,{className:`text-muted-foreground`,children:`上一拍留痕`}),(0,R.jsx)(`dd`,{className:`text-muted-foreground`,children:re(te,T)})]})]}),(0,R.jsxs)(ee,{children:[(0,R.jsxs)(t,{variant:`outline`,disabled:y,onClick:()=>void D(!0),children:[(0,R.jsx)(x,{className:`size-4`}),y?`探测中…`:`重新探测`]}),(0,R.jsx)(t,{onClick:()=>r(!1),children:`关闭`})]})]})})]})}var $=new Set([`dist_registry_selected`,`gui_autostart_changed`,`autostart_changed`,`lan_panel_changed`,`lan_harness_token_updated`]);function se(){let{snap:r}=p(),{busy:a,run:s}=D(),c=e(),[u,d]=(0,L.useState)(!1),[f,E]=(0,L.useState)(null),A=r.status,j=A?.native,N=j?.installed??!1,F=j?.state||(N?`installed`:`uninstalled`),z=F===`installing`,B=z||F===`uninstalling`,V=A?.version,U=A?.upgrade,W=w[A?.phase??``]??{label:A?.phase||`未知`,tone:`off`},G=!!A?.dshPid,K=U?.state===`running`,q=(0,L.useMemo)(()=>r.events.filter(e=>!$.has(e.type)),[r.events]);async function J(){await s(`dsh`,()=>G?l.lifecycleStop(`dsh`):l.lifecycleStart(`dsh`),{success:G?`正在停止 DSH…`:`正在启动 DSH…`})}async function Y(){await c({title:`停止 DSH?`,description:`主干 DeepSeek Harness 正在运行;停止会中断进行中的请求,远程访问同时不可用。`,confirmText:`停止 DSH`})&&await J()}async function X(){await s(`web`,()=>_(()=>l.instanceOpenWeb(`main`)).then(()=>void 0))}async function Z(){await s(`chk`,async()=>{let e=await l.nativeCheckUpdate();if(e?.ok===!1){i.error(e.error||`检测失败`);return}e?.updateAvailable&&e.latest?i.success(`发现新版本 `+e.latest+(e.installed?`(当前 `+e.installed+`),可一键升级`:``)):i.success(`已是最新版本`+(e.installed?`(`+e.installed+`)`:``))})}async function ne(){d(!1),await s(`upg`,()=>l.nativeUpgrade(),{success:`升级已开始,请耐心等待…`})}async function re(){await c({title:`在线安装最新版 DeepSeek Harness?`,description:`需数分钟,自动适配最快镜像源。`,confirmText:`安装`})&&await s(`inst`,()=>l.nativeInstall(),{success:`开始安装 DeepSeek Harness…`})}async function ie(){await c({title:`彻底卸载 DeepSeek Harness?`,description:`删除全部文件、数据、缓存与日志,不留残留。`,confirmText:`卸载 DSH`,tone:`destructive`})&&await s(`uni`,()=>l.nativeUninstall(),{success:`开始卸载…`})}(0,L.useEffect)(()=>{if(!N)return;let e=!0;return l.instances().then(t=>{if(!e)return;let n=t?.native?.guardian;typeof n==`boolean`&&E(n)}).catch(()=>{e&&E(e=>typeof e==`boolean`&&e)}),()=>{e=!1}},[N,A?.dshPid]);async function ae(){let e=f!==!0;await s(`gu`,()=>l.nativeSettings({guardian:e}).then(e=>{let t=e?.main?.guardian;return typeof t==`boolean`&&E(t),e}),{success:e?`已开启 DSH 进程监控(崩溃自动拉起)`:`已关闭 DSH 进程监控(崩溃后不再自动拉起)`,refresh:!1})}let Q=N&&(j?.version||V?.installed)||`—`;return(0,R.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,R.jsxs)(M,{children:[(0,R.jsxs)(`div`,{className:`grid grid-cols-1 @min-[720px]:grid-cols-[minmax(0,5fr)_minmax(0,6fr)]`,children:[(0,R.jsxs)(`div`,{className:`flex flex-col gap-5 border-b border-border px-6 py-5 md:border-b-0 md:border-r`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,R.jsxs)(`div`,{className:`flex min-w-0 items-baseline gap-2`,children:[(0,R.jsx)(`h3`,{className:`truncate text-xl font-semibold tracking-[-0.01em] text-foreground`,children:`DeepSeek Harness`}),(0,R.jsxs)(`span`,{className:`shrink-0 font-mono text-sm text-muted-foreground`,children:[`v`,Q]})]}),a===`chk`?(0,R.jsxs)(t,{size:`chip`,disabled:!0,children:[(0,R.jsx)(x,{className:`size-3 animate-spin`}),`检测中…`]}):V?.updateAvailable&&V.latest?(0,R.jsxs)(t,{className:`text-primary-foreground`,size:`chip`,onClick:()=>d(!0),children:[(0,R.jsx)(P,{className:`size-3`}),`升级到 v`,V.latest]}):K?(0,R.jsxs)(t,{size:`chip`,disabled:!0,children:[(0,R.jsx)(x,{className:`size-3 animate-spin`}),`升级中…`]}):(0,R.jsxs)(t,{className:`bg-primary/10 text-primary hover:bg-primary/15`,onClick:()=>void Z(),size:`chip`,variant:`ghost`,children:[(0,R.jsx)(x,{className:`size-3`}),`检测更新`]})]}),B?(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(O,{tone:`boot`,ping:!0}),(0,R.jsx)(`span`,{className:`text-base font-semibold leading-none text-foreground`,children:z?`正在安装 DeepSeek Harness…`:`正在卸载 DeepSeek Harness…`})]}):(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(O,{tone:W.tone,ping:W.tone===`ok`}),(0,R.jsx)(`span`,{className:`text-base font-semibold leading-none text-foreground`,children:W.label})]}),K&&U?(0,R.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,R.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-primary`}),`正在升级(`,U.step||U.targetVersion||``,`)…`]}):null,U?.state===`failed`?(0,R.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`升级失败:`,U.lastError||`未知原因`,U.rolledBack?`(已回滚)`:``]}):null,B&&(j?.installLog??[]).length?(0,R.jsx)(`pre`,{className:`max-h-[120px] overflow-auto whitespace-pre-wrap break-all rounded-md bg-muted/70 p-3 font-mono text-xs leading-relaxed text-muted-foreground`,children:(j?.installLog??[]).slice(-6).join(`
|
|
2
|
-
`)}):null]}),(0,R.jsx)(`div`,{className:`flex items-center bg-[image:var(--panel-accent-gradient)] px-6 py-5`,children:(0,R.jsxs)(`div`,{className:`grid w-full grid-cols-2 gap-x-6 gap-y-4 @min-[560px]:grid-cols-4`,children:[(0,R.jsx)(k,{icon:(0,R.jsx)(te,{className:`size-4`}),label:`端口`,value:A?.dshPort?String(A.dshPort):`—`,mono:!0}),(0,R.jsx)(k,{icon:(0,R.jsx)(I,{className:`size-4`}),label:`PID`,value:A?.dshPid?String(A.dshPid):`—`,mono:!0}),(0,R.jsx)(k,{icon:(0,R.jsx)(x,{className:`size-4`}),label:`重启次数`,value:String(A?.restartCount??0),mono:!0}),(0,R.jsx)(k,{icon:(0,R.jsx)(P,{className:`size-4`}),label:`最近故障`,value:A?.lastFailure?T(A?.lastFailure):`无`,warn:!!A?.lastFailure})]})})]}),(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-t border-border/60 px-6 py-3`,children:[(0,R.jsx)(`div`,{className:`hidden lg:block`,children:(0,R.jsx)(ce,{})}),(0,R.jsxs)(`div`,{className:`ml-auto flex flex-wrap items-center gap-2`,children:[!N&&!B?(0,R.jsxs)(t,{size:`sm`,disabled:a===`inst`,onClick:()=>void re(),children:[(0,R.jsx)(b,{className:`size-4`}),`安装 DSH`]}):N&&!B&&!K?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(t,{disabled:!G,onClick:()=>void X(),size:`sm`,variant:`outline`,className:`hidden md:inline-flex`,children:[(0,R.jsx)(v,{className:`size-4`}),`DSH Web`]}),(0,R.jsx)(t,{disabled:a===`dsh`,onClick:()=>void(G?Y():J()),size:`sm`,variant:`outline`,children:G?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(y,{className:`size-4 text-status-error`}),`停止 DSH`]}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(b,{className:`size-4 text-primary`}),`启动 DSH`]})}),(0,R.jsx)(`span`,{"aria-hidden":`true`,className:`mx-1 h-5 w-px bg-border`}),(0,R.jsxs)(t,{className:`h-[30px]`,disabled:a===`gu`||f===null,onClick:()=>void ae(),size:`sm`,variant:`outline`,children:[(0,R.jsx)(S,{className:n(`size-4`,f===!0?`text-status-ok`:`text-muted-foreground`)}),f===!0?`停止监控`:`启动监控`]})]}):null,N&&!B?(0,R.jsx)(R.Fragment,{children:(0,R.jsxs)(t,{className:`hidden h-[30px] md:inline-flex`,disabled:a===`uni`,onClick:()=>void ie(),size:`sm`,variant:`destructive`,children:[(0,R.jsx)(C,{className:`size-4`}),`卸载 DSH`]})}):null]})]})]}),(0,R.jsxs)(`div`,{className:`grid items-start gap-4 @min-[860px]:grid-cols-[minmax(0,1fr)_420px]`,children:[(0,R.jsx)(le,{events:q}),(0,R.jsx)(H,{providers:r.providers?.providers??[]})]}),(0,R.jsx)(m,{open:u,onOpenChange:d,children:(0,R.jsxs)(g,{className:`max-w-[420px]`,children:[(0,R.jsx)(h,{children:(0,R.jsx)(o,{children:`升级 DeepSeek Harness`})}),(0,R.jsxs)(`div`,{className:`grid gap-3`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-center gap-3 rounded-md bg-muted px-4 py-3`,children:[(0,R.jsxs)(`div`,{className:`text-center`,children:[(0,R.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`当前版本`}),(0,R.jsx)(`strong`,{className:`font-mono text-base text-foreground`,children:V?.installed||Q})]}),(0,R.jsx)(P,{className:`size-4 text-muted-foreground`}),(0,R.jsxs)(`div`,{className:`text-center`,children:[(0,R.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`新版本`}),(0,R.jsx)(`strong`,{className:`font-mono text-base text-primary`,children:V?.latest||`—`})]})]}),(0,R.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`升级将先停止 DSH、安装新版本后自动拉起(需数分钟)。期间进行中的请求会中断,失败会自动回滚到当前版本。`})]}),(0,R.jsxs)(ee,{children:[(0,R.jsx)(t,{onClick:()=>d(!1),variant:`outline`,children:`取消`}),(0,R.jsx)(t,{disabled:a===`upg`||K,onClick:()=>void ne(),children:a===`upg`||K?`升级中…`:`开始升级`})]})]})})]})}function ce(){let[e,t]=(0,L.useState)(null),[r,i]=(0,L.useState)(null);(0,L.useEffect)(()=>{let e=!0,n=async()=>{let[n,r]=await Promise.all([l.nodeLts().catch(()=>null),l.envStatus().catch(()=>null)]);e&&(t(n),i(r?.catalog?.items??null))};n();let r=setInterval(n,6e5);return()=>{e=!1,clearInterval(r)}},[]);let a=Object.entries(r??{}).filter(([,e])=>e.required);return!e?.current&&a.length===0?(0,R.jsx)(`span`,{className:`min-w-[120px] text-xs text-muted-foreground`,children:`环境检测…`}):(0,R.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,R.jsx)(`span`,{className:`whitespace-nowrap`,children:`环境检测`}),a.map(([e,t])=>{let r=t.state===`ok`||t.state===`configured`;return(0,R.jsxs)(`span`,{title:t.detail||void 0,className:n(`inline-flex items-center gap-1 whitespace-nowrap rounded-full px-2 py-0.5`,r?`text-muted-foreground/70`:`bg-warning-background font-semibold text-warning`),children:[!r&&(0,R.jsx)(d,{className:`size-3`}),t.label,` `,t.detail||`—`]},e)}),(0,R.jsx)(oe,{}),e?.ltsLine===!1?(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-1 whitespace-nowrap rounded-full bg-warning-background px-2 py-0.5 font-semibold text-warning`,title:e.suggested||void 0,children:[(0,R.jsx)(d,{className:`size-3`}),`非 LTS 线(建议偶数主版本)`]}):e?.ltsLine===!0?(0,R.jsx)(`span`,{className:`hidden whitespace-nowrap text-muted-foreground/70 sm:inline`,children:`LTS 线`}):null]})}function le({events:e}){let[t,n]=(0,L.useState)(12),r=e.length,i=e.length?e[0]?.seq:void 0;(0,L.useEffect)(()=>{n(12)},[i,r]);let a=(0,L.useRef)(null),o=(0,L.useRef)(!1);(0,L.useEffect)(()=>{let e=a.current;if(!e)return;let t=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(o.current||(o.current=!0,n(e=>Math.min(e+12,r)),setTimeout(()=>{o.current=!1},80)))},{rootMargin:`120px 0px`});return t.observe(e),()=>t.disconnect()},[r]);let s=e.slice(0,t),c=t<r;return(0,R.jsxs)(M,{className:`flex min-h-0 flex-col overflow-hidden`,children:[(0,R.jsx)(A,{title:`事件日志`,subtitle:`核心运行状态遥测`,actions:(0,R.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:r})}),r?(0,R.jsxs)(`div`,{className:`flex max-h-[450px] min-h-0 flex-col overflow-y-auto overscroll-contain`,children:[s.map((e,t)=>(0,R.jsx)(ue,{e},e.seq??t)),(0,R.jsx)(`div`,{ref:a,className:`px-5 py-2 text-center text-[11px] text-muted-foreground`,children:c?`下滑加载更多…`:`已加载全部`})]}):(0,R.jsx)(`div`,{className:`px-5 py-6 text-center text-xs text-muted-foreground`,children:`暂无核心运行状态事件`})]})}function ue({e}){let t=fe[e.type]??`boot`,n=E[e.type]??e.type,r=de(e);return(0,R.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[64px_auto_minmax(0,1fr)] items-center gap-2.5 border-b border-border/60 px-5 py-2 last:border-b-0 max-[640px]:grid-cols-[56px_auto_minmax(0,1fr)] max-[640px]:gap-2`,children:[(0,R.jsx)(`span`,{className:`text-xs tabular-nums text-muted-foreground`,children:N(e.ts)}),(0,R.jsx)(j,{tone:t,children:n}),(0,R.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:r})]})}function de(e){let t=e.data;if(!t)return``;let n=e=>Number(e??0).toLocaleString(`en-US`);if(typeof t.message==`string`)return t.message;if(typeof t.reason==`string`)return T(t.reason);if(typeof t.desired==`string`)return`期望 `+t.desired;if(e.type===`router_usage`)return(t.model||``)+(t.model?` · `:``)+n(t.tokens)+` tokens`;if(e.type===`router_pick`)return[t.provider||``,t.key||``].filter(Boolean).join(` · `);if(e.type===`account_ready`||e.type===`account_frozen`||e.type===`account_banned`||e.type===`account_recovered`||e.type===`account_review`||e.type===`account_exhausted`)return(t.key||``)+(t.key?` · `:``)+(t.provider||``);if(e.type===`provider_quota_refreshed`)return(t.provider||``)+` 额度已刷新`;if(e.type===`proxy_update_available`)return[t.pkg||``,t.from||``,t.to||``].filter(Boolean).join(` → `);if(e.type===`proxy_instance_started`)return`port=`+(t.port??``)+(t.pid?` pid=`+t.pid:``);if(e.type===`harness_guardian_changed`||e.type===`inst_guardian_changed`)return(t.name||(t.id===`main`?`原生 DSH`:t.id||`实例`))+` · 进程监控`+(t.enabled===!0?` → 开启`:` → 关闭`);if(e.type===`harness_remote_changed`||e.type===`inst_remote_changed`)return(t.name||(t.id===`main`?`原生 DSH`:t.id||`实例`))+` · 远程控制 → `+(t.mode===`lan`?`局域网`:t.mode===`wan`?`公网`:`关闭`);if(e.type===`harness_remote_token_changed`||e.type===`inst_remote_token_changed`)return(t.name||(t.id===`main`?`原生 DSH`:t.id||`实例`))+` · 访问令牌`+(t.tokenSet===!0?` → 已设置`:` → 已清除`);let r=[];return t.pid!==void 0&&r.push(`pid=`+t.pid),t.port!==void 0&&r.push(`port=`+String(t.port)),t.version!==void 0&&r.push(`v`+String(t.version)),t.model&&t.tokens!==void 0&&r.push(n(t.tokens)+` tok`),t.ms!==void 0&&r.push(n(t.ms)+`ms`),r.join(` · `)}var fe={running:`ok`,adopted:`ok`,spawned:`ok`,main_instance_registered:`ok`,upgrade_installed:`ok`,upgrade_done:`ok`,api_listening:`ok`,account_ready:`ok`,account_confirmed:`ok`,account_recovered:`ok`,proxy_instance_started:`ok`,proxy_update_applied:`ok`,router_provider_activated:`ok`,router_provider_endpoint:`ok`,inst_running:`ok`,inst_added:`ok`,inst_started:`ok`,lan_instance_started:`ok`,frpc_installed:`ok`,frpc_started:`ok`,plugin_install_done:`ok`,native_installed:`ok`,inst_upgraded:`ok`,plugin_update_done:`ok`,account_frozen:`err`,account_banned:`err`,harness_exited:`err`,unhealthy:`err`,spawn_failed:`err`,spawn_error:`err`,upgrade_failed:`err`,api_error:`err`,api_offline:`err`,proxy_instance_failed:`err`,inst_failed:`err`,inst_start_failed:`err`,native_install_failed:`err`,native_uninstall_failed:`err`,plugin_install_job_failed:`err`,plugin_update_job_failed:`err`,plugin_uninstall_job_failed:`err`,frpc_install_failed:`err`,router_stream_aborted:`err`,sigkill_sent:`err`,start_timeout:`err`,crash_loop_entered:`err`,guard_exit:`warn`,version_check_failed:`warn`,restart_triggered:`warn`,harness_not_installed:`warn`,sigterm_sent:`warn`,account_review:`warn`,harness_guardian_changed:`warn`,inst_guardian_changed:`warn`,harness_remote_changed:`warn`,inst_remote_changed:`warn`,harness_remote_token_changed:`warn`,inst_remote_token_changed:`warn`,lan_frp_blocked:`warn`,proxy_update_available:`warn`,upgrade_started:`warn`,upgrade_stopping_harness:`warn`,inst_restarted:`warn`,native_uninstall_started:`warn`,account_discarded:`off`,router_stopped:`off`,proxy_instance_stopped:`off`,inst_stopped:`off`,inst_removed:`off`,lan_instance_removed:`off`,frpc_stopped:`off`,plugin_uninstall_done:`off`,native_uninstalled:`off`,upgrade_skipped:`off`,router_provider_deactivated:`off`,stop:`off`};export{se as OverviewPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as e,F as t,I as n,L as r,N as i,O as a,R as o,S as s,U as c,V as l,_ as u,a as d,d as f,f as p,h as m,l as h,m as g,p as _,u as v,v as y,x as b,y as x}from"./supervisor-Blfqgw-f.js";import{n as S,t as C}from"./rocket-OqsLWeGD.js";import{t as w}from"./refresh-cw-CHZo8X7a.js";import{t as T}from"./jobs-BjLbfJTM.js";import{c as E,u as D}from"./supervisor-C0cZTc5d.js";import{t as O}from"./useSupervisorAction-DUxfx47b.js";import{n as k,o as A,t as j}from"./widgets-C9CEOdGF.js";var M=i(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),N=i(`store`,[[`path`,{d:`M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5`,key:`slp6dd`}],[`path`,{d:`M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244`,key:`o0xfot`}],[`path`,{d:`M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05`,key:`wn3emo`}]]),P=c(l(),1);function F(e){return e>=1073741824?`${(e/1024/1024/1024).toFixed(1)} GB`:e>=1048576?`${(e/1024/1024).toFixed(0)} MB`:e>=1024?`${(e/1024).toFixed(0)} KB`:`${e} B`}var I=o(),L=24;async function R(e,t,n){if(!e.length)return;let r=a.loading(`正在`+t+` `+n+` 个插件…(0/`+e.length+`)`),i=0,o=0;for(let s of e){let c=await T(()=>d.pluginInstallStatus(s));c.state===`done`?i++:c.state===`failed`&&o++,a.loading(`正在`+t+` `+n+` 个插件…(`+(i+o)+`/`+e.length+`)`,{id:r})}o===0?a.success(t+`完成(`+i+`/`+e.length+`)`,{id:r}):a.warning(t+`结束:成功 `+i+`,失败 `+o,{id:r})}async function z(e,t,n=3e5,r=2e3){let i=await e(),a=Date.now()+n;for(;t(i)&&Date.now()<a;)await new Promise(e=>setTimeout(e,r)),i=await e();return i}function B(){let[e,t]=(0,P.useState)(`market`),[i,a]=(0,P.useState)(0);return(0,I.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,I.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,I.jsx)(`div`,{className:`flex gap-1 rounded-lg bg-muted p-1`,children:[`market`,`installed`].map(i=>(0,I.jsxs)(n,{className:r(`font-medium`,e===i?`bg-card text-foreground shadow-sm`:`bg-transparent text-muted-foreground hover:bg-card/60 hover:text-foreground`),onClick:()=>t(i),size:`sm`,variant:`ghost`,children:[i===`market`?(0,I.jsx)(N,{className:`size-3.5`}):(0,I.jsx)(D,{className:`size-3.5`}),i===`market`?`插件商店`:`已安装`]},i))}),e===`market`?(0,I.jsx)(V,{onSettled:()=>a(e=>e+1)}):null]}),e===`market`?(0,I.jsx)(H,{nonce:i}):(0,I.jsx)(G,{})]})}function V({onSettled:e}){let[t,i]=(0,P.useState)(!1);async function o(){i(!0);try{let t=await d.market(!0),n=t.building?await z(()=>d.market(),e=>!!e.building):t;n.error?a.error(`索引刷新失败:`+n.error+`(暂用旧索引的 `+n.plugins.length+` 个)`):n.plugins.length?a.success(`插件索引已刷新(`+n.plugins.length+` 个)`):a.error(`索引刷新失败:无结果`),e?.()}catch(e){a.error(String(e))}i(!1)}return(0,I.jsxs)(n,{disabled:t,onClick:()=>void o(),size:`chip`,variant:`outline`,children:[(0,I.jsx)(w,{className:r(`size-3.5`,t&&`animate-spin`)}),`刷新`]})}function H({nonce:e=0}){let[t,i]=(0,P.useState)(null),[o,c]=(0,P.useState)(!1),[l,S]=(0,P.useState)(null),[C,w]=(0,P.useState)(``),[E,D]=(0,P.useState)(`all`),[O,k]=(0,P.useState)(`all`),[j,N]=(0,P.useState)(0),[F,R]=(0,P.useState)(null),[B,V]=(0,P.useState)([]),[H,G]=(0,P.useState)(`native`);(0,P.useEffect)(()=>{let e=!0;return(async()=>{try{let t=await d.market();if(t.building&&(e&&c(!0),t=await z(()=>d.market(),e=>!!e.building)),!e)return;c(!1),i(t.plugins.length?t:null),S(t.plugins.length?null:t.error||`索引为空,点「刷新」重建`),N(L)}catch(t){e&&(c(!1),S(String(t)))}})(),()=>{e=!1}},[e]);let K=(0,P.useMemo)(()=>{if(!t)return[];let e=C.trim().toLowerCase();return t.plugins.filter(t=>(E===`all`||t.category===E)&&(O===`all`||t.source===O)&&(!e||(t.name+` `+(t.description||``)).toLowerCase().includes(e)))},[t,C,E,O]),q=(0,P.useMemo)(()=>{let e={};for(let n of t?.plugins??[])e[n.category]=(e[n.category]||0)+1;return Object.entries(e).sort((e,t)=>t[1]-e[1])},[t]);async function J(e){R(e),G(`native`);try{let e=await d.instances();V((e.instances??[]).filter(e=>e.domain===`sandbox`).map(e=>({id:e.id,name:e.name})))}catch{V([])}}async function Y(){if(F)try{let e=await d.pluginInstall(F.name,H);if(e.ok===!1){a.error(e.error||`安装失败`);return}if(R(null),e.jobId){let t=a.loading(`正在安装 `+F.name+`…`),n=await T(()=>d.pluginInstallStatus(e.jobId));n.state===`done`?a.success(`已安装 `+F.name,{id:t}):n.state===`failed`?a.error(`安装失败:`+(n.error||`未知原因`),{id:t}):a.warning(`安装仍在进行(超时未完成,可稍后查看)`,{id:t})}else a.success(`安装任务已提交`)}catch(e){a.error(String(e))}}return(0,I.jsxs)(`div`,{className:`grid content-start gap-3`,children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,I.jsxs)(`div`,{className:`relative min-w-[220px] flex-1`,children:[(0,I.jsx)(M,{className:`absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground`}),(0,I.jsx)(u,{className:`pl-8`,placeholder:`搜索插件名称、描述…`,value:C,onChange:e=>w(e.target.value)})]}),(0,I.jsxs)(h,{value:E,onValueChange:D,children:[(0,I.jsx)(p,{className:`h-9 w-[150px] shrink-0`,children:(0,I.jsx)(_,{placeholder:`全部分类`})}),(0,I.jsxs)(v,{children:[(0,I.jsx)(f,{value:`all`,children:`全部分类`}),q.map(([e,t])=>(0,I.jsxs)(f,{value:e,children:[e,` (`,t,`)`]},e))]})]}),(0,I.jsxs)(h,{value:O,onValueChange:k,children:[(0,I.jsx)(p,{className:`h-9 w-[130px] shrink-0`,children:(0,I.jsx)(_,{placeholder:`全部来源`})}),(0,I.jsxs)(v,{children:[(0,I.jsx)(f,{value:`all`,children:`全部来源`}),(0,I.jsx)(f,{value:`npm`,children:`npm`}),(0,I.jsx)(f,{value:`github`,children:`GitHub`}),(0,I.jsx)(f,{value:`community`,children:`社区`}),(0,I.jsx)(f,{value:`official`,children:`官方`})]})]})]}),t?(0,I.jsxs)(I.Fragment,{children:[(0,I.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`共 `,t.plugins.length,` 个插件 · 更新 `,t.indexedAt?new Date(t.indexedAt).toLocaleString():`—`,` · npm `,t.sources?.npm||0,` · GitHub `,t.sources?.github||0,` · 社区 `,t.sources?.community||0]}),K.length?(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(`div`,{className:`grid grid-cols-1 gap-3 @min-[640px]:grid-cols-2 @min-[1000px]:grid-cols-3`,children:K.slice(0,j).map(e=>(0,I.jsxs)(`div`,{className:`flex min-h-[150px] flex-col rounded-lg border border-border bg-card p-4`,children:[(0,I.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,I.jsx)(`strong`,{className:`truncate font-mono text-sm text-foreground`,children:e.name}),(0,I.jsx)(A,{tone:W(e.source),children:U(e.source)})]}),(0,I.jsx)(`p`,{className:`mt-2 line-clamp-3 min-h-[36px] text-xs leading-relaxed text-muted-foreground`,children:e.description||`(无描述)`}),(0,I.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,I.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5`,children:e.category}),e.version?(0,I.jsxs)(`span`,{className:`font-mono`,children:[`v`,e.version]}):null,e.stars?(0,I.jsxs)(`span`,{children:[`⭐`,e.stars]}):null]}),(0,I.jsxs)(`div`,{className:`mt-auto flex items-center justify-between gap-2 pt-3`,children:[(0,I.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:e.author||``}),(0,I.jsx)(n,{onClick:()=>void J(e),size:`chip`,children:`安装`})]})]},e.name))}),j<K.length?(0,I.jsxs)(n,{className:`justify-self-center`,onClick:()=>N(e=>e+L),variant:`outline`,children:[`加载更多(`,j,`/`,K.length,`)`]}):null]}):(0,I.jsx)(`div`,{className:`grid place-items-center rounded-lg border border-dashed border-border py-16 text-sm text-muted-foreground`,children:`无匹配插件`})]}):(0,I.jsx)(`div`,{className:`grid place-items-center py-20 text-sm text-muted-foreground`,children:o?`正在构建插件索引(首次约需数分钟,可留在本页)…`:l||`加载插件索引…`}),(0,I.jsx)(y,{open:!!F,onOpenChange:e=>!e&&R(null),children:(0,I.jsxs)(x,{className:`max-w-[400px]`,children:[(0,I.jsx)(b,{children:(0,I.jsxs)(s,{children:[`安装插件 — `,F?.name]})}),(0,I.jsx)(`div`,{className:`grid gap-2`,children:(0,I.jsx)(g,{value:H,onValueChange:G,className:`grid gap-2`,children:[[`native`,`原生实例`],[`all`,`所有实例(含原生)`]].concat(B.map(e=>[`id:`+e.id,e.name+`(`+e.id.slice(0,8)+`…)`])).map(([e,t])=>(0,I.jsxs)(`label`,{className:r(`flex cursor-pointer items-center gap-2 rounded-md border px-3 py-2 text-sm`,H===e?`border-primary/40 bg-primary/[0.05] text-foreground`:`border-border text-muted-foreground hover:bg-muted`),children:[(0,I.jsx)(m,{value:e}),t]},e))})}),(0,I.jsxs)(`div`,{className:`mt-3 flex justify-end gap-2`,children:[(0,I.jsx)(n,{onClick:()=>R(null),variant:`outline`,children:`取消`}),(0,I.jsx)(n,{onClick:()=>void Y(),children:`开始安装`})]})]})})]})}var U=e=>({npm:`npm`,github:`GitHub`,community:`社区`,official:`官方`})[e]??e,W=e=>e===`official`?`boot`:e===`npm`?`ok`:e===`github`?`warn`:`off`;function G(){let[i,o]=(0,P.useState)(null),[s,c]=(0,P.useState)(`all`),[l,u]=(0,P.useState)(new Set),[f,p]=(0,P.useState)(new Map),[m,h]=(0,P.useState)(!1),{busy:g,run:_}=O(),v=t(),y=async()=>{let e=await d.pluginsInstalled().catch(()=>null);o(e)};(0,P.useEffect)(()=>{y()},[]);let b=i?.thirdParty??[],x=e=>e.targets&&e.targets.length?e.targets:[`native`],T=b.filter(e=>s===`all`||x(e).includes(s)),M=e=>u(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),N=T.length>0&&T.every(e=>l.has(e.name)),L=()=>u(N?new Set:new Set(T.map(e=>e.name))),B=T.filter(e=>l.has(e.name)),V=B.some(e=>f.has(e.name)),H=B.filter(e=>e.enabled),U=B.filter(e=>!e.enabled);async function W(){h(!0);try{let e=await d.pluginsCheckUpdates(!0),t=e.refreshing?await z(()=>d.pluginsCheckUpdates(),e=>!!e.refreshing):e,n=new Map;for(let e of t.plugins??[]){if(!e.updateAvailable)continue;let t=e.targets?.find(e=>e.latest)?.latest||``;n.set(e.name,t)}p(n);let r=(t.plugins??[]).filter(e=>e.error),i=n.size?`发现 `+n.size+` 个可更新插件`:`全部插件已是最新`;!t.checkedAt&&t.error?a.error(`检查更新失败:`+t.error):r.length?a.warning(r.length+` 个插件取不到最新版本(`+(r[0].error||``)+(r.length>1?` 等`:``)+`)· `+i):a.success(i),await y()}catch(e){a.error(String(e))}h(!1)}async function G(){let e=B.filter(e=>f.has(e.name)).map(e=>e.name);if(!e.length){a.info(`所选插件均无可用更新`);return}u(new Set),p(t=>{let n=new Map(t);for(let t of e)n.delete(t);return n}),await _(`upd-sel`,async()=>{let t=[];for(let n of e)try{let e=await d.pluginUpdate(n);e.jobId&&t.push(e.jobId)}catch{}await R(t,`更新`,e.length)},{success:`已提交 `+e.length+` 个插件的更新任务`,refresh:!1,onDone:()=>void y()})}async function K(){let e=B.map(e=>e.name);await v({title:`卸载所选插件?`,description:(0,I.jsxs)(I.Fragment,{children:[`将卸载所选 `,e.length,` 个插件:`,(0,I.jsx)(`ul`,{className:`mt-2 max-h-[180px] overflow-auto rounded-md border border-border/70 bg-muted/40 px-3 py-2`,children:e.map(e=>(0,I.jsx)(`li`,{className:`truncate text-foreground`,children:e},e))})]}),confirmText:`卸载`,tone:`destructive`})&&(u(new Set),await _(`uni-sel`,async()=>{let t=[];for(let n of e)try{let e=await d.pluginUninstall(n);e.jobId&&t.push(e.jobId)}catch{}await R(t,`卸载`,e.length)},{success:`已提交 `+e.length+` 个插件的卸载任务`,refresh:!1,onDone:()=>void y()}))}async function q(){let e=H.map(e=>e.name);u(new Set),await _(`stop-sel`,async()=>{for(let t of e)try{await d.pluginDisable(t)}catch{}},{success:`已停止 `+e.length+` 个插件`,refresh:!1,onDone:()=>void y()})}async function J(){let e=U.map(e=>e.name);u(new Set),await _(`start-sel`,async()=>{for(let t of e)try{await d.pluginEnable(t)}catch{}},{success:`已启动 `+e.length+` 个插件`,refresh:!1,onDone:()=>void y()})}let Y=`grid grid-cols-[88px_minmax(0,1fr)_120px_84px_36px] items-center gap-3`;return(0,I.jsxs)(j,{className:`overflow-hidden`,children:[(0,I.jsx)(k,{title:`已安装插件`+(i?`(`+T.length+`)`:``),subtitle:s===`all`?`全部实例`:`实例:`+((i?.targets??[]).find(e=>e.id===s)?.name??s),actions:(0,I.jsxs)(I.Fragment,{children:[V?(0,I.jsxs)(n,{disabled:g===`upd-sel`,onClick:()=>void G(),size:`sm`,children:[(0,I.jsx)(w,{className:`size-3.5`}),`更新(`,B.filter(e=>f.has(e.name)).length,`)`]}):(0,I.jsxs)(n,{disabled:m,onClick:()=>void W(),size:`sm`,variant:`outline`,children:[(0,I.jsx)(w,{className:r(`size-3.5`,m&&`animate-spin`)}),m?`检查中…`:`检查更新`]}),B.length>0?(0,I.jsxs)(I.Fragment,{children:[H.length>0?(0,I.jsxs)(n,{disabled:g===`stop-sel`,onClick:()=>void q(),size:`sm`,variant:`outline`,children:[(0,I.jsx)(S,{className:`size-3.5`}),`停用(`,H.length,`)`]}):null,U.length>0?(0,I.jsxs)(n,{disabled:g===`start-sel`,onClick:()=>void J(),size:`sm`,variant:`outline`,children:[(0,I.jsx)(C,{className:`size-3.5`}),`启动(`,U.length,`)`]}):null,(0,I.jsxs)(n,{className:`h-[30px]`,disabled:g===`uni-sel`,onClick:()=>void K(),size:`sm`,variant:`destructive`,children:[(0,I.jsx)(E,{className:`size-3.5`}),`卸载(`,B.length,`)`]})]}):null]})}),(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 border-b border-border/60 px-5 py-2.5`,children:[(0,I.jsx)(n,{className:r(s===`all`?`bg-primary/10 text-primary hover:bg-primary/15`:`text-muted-foreground hover:bg-muted hover:text-foreground`),onClick:()=>c(`all`),size:`sm`,variant:`ghost`,children:`全部实例`}),(i?.targets??[]).map(e=>(0,I.jsx)(n,{className:r(s===e.id?`bg-primary/10 text-primary hover:bg-primary/15`:`text-muted-foreground hover:bg-muted hover:text-foreground`),onClick:()=>c(e.id),size:`sm`,variant:`ghost`,children:e.name},e.id))]}),i?T.length?(0,I.jsx)(I.Fragment,{children:(0,I.jsxs)(`div`,{className:`overflow-x-auto`,children:[(0,I.jsxs)(`div`,{className:r(Y,`min-w-[720px] border-b border-border/70 bg-muted px-5 py-2 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`),children:[(0,I.jsx)(`span`,{children:`来源`}),(0,I.jsx)(`span`,{children:`插件`}),(0,I.jsx)(`span`,{children:`版本`}),(0,I.jsx)(`span`,{className:`text-right`,children:`大小`}),(0,I.jsx)(`span`,{className:`flex justify-end`,children:(0,I.jsx)(e,{"aria-label":`全选`,checked:N,onChange:L})})]}),(0,I.jsx)(`div`,{className:`max-h-[560px] overflow-auto`,children:T.map(t=>{let n=l.has(t.name),i=f.get(t.name);return(0,I.jsxs)(`label`,{className:r(Y,`min-h-[46px] min-w-[720px] w-full cursor-pointer border-b border-border/50 px-5 py-2 text-left transition-colors last:border-b-0 hover:bg-muted/40`,n&&`bg-muted/70 shadow-[inset_3px_0_0_var(--primary)]`),children:[(0,I.jsx)(`span`,{className:`inline-flex w-fit min-w-0 items-center`,children:(0,I.jsx)(A,{tone:t.bundle?`boot`:t.source?.includes(`github`)?`warn`:t.source===`npm`?`ok`:`off`,children:t.bundle?`bundle`:t.source===`npm`?`npm`:t.source?.includes(`github`)?`GitHub`:t.source&&t.source!==t.name?`本地`:`—`})}),(0,I.jsx)(`span`,{className:`grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-2`,children:(0,I.jsxs)(`span`,{className:`grid min-w-0 gap-0.5`,children:[(0,I.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,I.jsx)(`strong`,{className:`truncate font-mono text-[13px] font-semibold leading-tight text-foreground`,children:t.name}),(0,I.jsx)(A,{tone:t.enabled?`ok`:`off`,children:t.enabled?`已启用`:`已停用`})]}),t.description?(0,I.jsx)(`span`,{className:`truncate text-xs leading-tight text-muted-foreground`,children:t.description}):null]})}),(0,I.jsx)(`span`,{className:`min-w-0`,children:i?(0,I.jsxs)(`span`,{className:`inline-flex flex-wrap items-center gap-1.5`,children:[(0,I.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:t.version?`v`+t.version:`—`}),(0,I.jsx)(A,{tone:`warn`,children:`可更新`})]}):(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.version?`v`+t.version:`—`})}),(0,I.jsx)(`span`,{className:`text-right font-mono text-xs tabular-nums text-foreground`,children:t.size?F(t.size):`—`}),(0,I.jsx)(`span`,{className:`flex justify-end`,children:(0,I.jsx)(e,{"aria-label":`选择 `+t.name,checked:n,onChange:()=>M(t.name)})})]},t.name)})})]})}):(0,I.jsxs)(`div`,{className:`grid place-items-center rounded-lg border-0 py-16 text-center`,children:[(0,I.jsx)(D,{className:`mx-auto mb-3 size-8 text-muted-foreground`}),(0,I.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`当前实例均未安装第三方插件`})]}):(0,I.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`加载中…`})]})}export{B as PluginsPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,F as t,I as n,L as r,N as i,O as a,R as o,S as s,U as c,V as l,_ as u,a as d,d as f,f as p,g as m,l as h,n as g,o as _,p as v,t as y,u as b,v as x,x as S,y as C}from"./supervisor-Blfqgw-f.js";import{a as w,i as T,n as E,s as D,t as O}from"./openExternal-BL2ow_UN.js";import{n as k,t as A}from"./rocket-OqsLWeGD.js";import{t as j}from"./refresh-cw-CHZo8X7a.js";import{t as M}from"./jobs-BjLbfJTM.js";import{c as N,f as P,l as F}from"./supervisor-C0cZTc5d.js";import{t as I}from"./useSupervisorAction-DUxfx47b.js";import{a as L,c as R,i as z,o as B,s as V,t as H}from"./widgets-C9CEOdGF.js";import{n as U}from"./format-QeaTKFhQ.js";var W=i(`ban`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M4.929 4.929 19.07 19.071`,key:`196cmz`}]]),G=i(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),K=i(`repeat`,[[`path`,{d:`m17 2 4 4-4 4`,key:`nntrym`}],[`path`,{d:`M3 11v-1a4 4 0 0 1 4-4h14`,key:`84bu3i`}],[`path`,{d:`m7 22-4-4 4-4`,key:`1wqhfi`}],[`path`,{d:`M21 13v1a4 4 0 0 1-4 4H3`,key:`1rx37r`}]]),q=i(`terminal`,[[`path`,{d:`M12 19h8`,key:`baeox8`}],[`path`,{d:`m4 17 6-6-6-6`,key:`1yngyt`}]]),J=c(l(),1),Y=o();function X(e){if(!e)return!1;let t=e=>!!(e&&(e.status===`rate-limited`||Number(e.percent)>=100));return t(e.rolling)||t(e.weekly)||t(e.monthly)}function Z(e){return!e||!Number.isFinite(e)?``:new Date(e).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}function Q(e){return[...e].sort((e,t)=>{let n=e=>e.selected?0:e.usable&&!X(e.quota)?1:2;return n(e)-n(t)})}var $=`grid-cols-[minmax(0,1fr)_230px_84px]`;function ee({onRegisterActions:t}){let{snap:i}=y(),{busy:a,run:o}=I(),[s,c]=(0,J.useState)(!1),[l,u]=(0,J.useState)(!1),f=i.router,p=i.providers;(0,J.useEffect)(()=>(t?.({onAdd:()=>c(!0),onDelete:()=>u(!0)}),()=>t?.(null)),[t]);function m(e,t,n){return o(e,t,{success:n})}let h=p?.providers??[];return(0,Y.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,Y.jsxs)(H,{children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-b border-border/70 px-5 py-3.5`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Y.jsx)(R,{tone:f?.running?`ok`:`off`,ping:!!f?.running}),(0,Y.jsx)(`strong`,{className:`text-xl font-semibold tracking-[-0.01em] text-foreground`,children:f?.running?`路由运行中`:`路由已停止`})]}),(0,Y.jsx)(n,{"aria-label":f?.running?`停止路由`:`启动路由`,className:r(`px-1`,f?.running?`text-status-error`:`text-primary`),disabled:a===`sw`,onClick:()=>void m(`sw`,()=>f?.running?d.lifecycleStop(`router`):d.lifecycleStart(`router`),f?.running?`路由已停止`:`路由已启动`),title:f?.running?`停止路由`:`启动路由`,variant:`ghost`,children:f?.running?(0,Y.jsx)(k,{className:`size-6`}):(0,Y.jsx)(A,{className:`size-6`})})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 divide-y divide-border/60 sm:grid-cols-2 sm:divide-y-0 lg:grid-cols-4 lg:divide-x lg:divide-border/60`,children:[(0,Y.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,Y.jsx)(z,{icon:(0,Y.jsx)(P,{className:`size-4`}),label:`总请求 / 失败`,value:U(f?.usage?.requests)+` / `+U(f?.usage?.errors),mono:!0})}),(0,Y.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,Y.jsx)(z,{icon:(0,Y.jsx)(e,{className:`size-4`}),label:`总 Tokens`,value:U(f?.usage?.totalTokens),mono:!0})}),(0,Y.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,Y.jsx)(z,{icon:(0,Y.jsx)(q,{className:`size-4`}),label:`Prompt / Completion`,value:U(f?.usage?.promptTokens)+` / `+U(f?.usage?.completionTokens),mono:!0})}),(0,Y.jsx)(`div`,{className:`px-5 py-3.5`,children:(0,Y.jsx)(z,{icon:(0,Y.jsx)(G,{className:`size-4`}),label:`估算费用`,value:f?.usage?.costUsd?`$`+Number(f.usage.costUsd).toFixed(4):`—`,mono:!0,warn:!f?.usage?.costUsd})})]})]}),h.length?(0,Y.jsx)(`div`,{className:`grid gap-4 @min-[900px]:grid-cols-2`,children:h.map(e=>(0,Y.jsx)(ne,{p:e,proxyApps:p?.proxyApps??[],busy:a===e.id,onAction:m},e.id))}):(0,Y.jsx)(`div`,{className:`grid min-h-[200px] place-items-center rounded-lg border border-dashed border-border text-center`,children:(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(P,{className:`mx-auto mb-3 size-8 text-muted-foreground`}),(0,Y.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:`尚未添加供应商`}),(0,Y.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`点击「添加供应商」录入 API Key / Command Code`})]})}),(0,Y.jsx)(se,{open:s,onOpenChange:c,presets:p?.presets??[],proxyApps:p?.proxyApps??[],onDone:()=>g.refresh()}),(0,Y.jsx)(te,{open:l,onOpenChange:u,providers:h})]})}function te({open:e,onOpenChange:r,providers:i}){let[o,c]=(0,J.useState)(null),l=t();async function u(e){if(await l({title:`删除供应商「`+e.name+`」?`,description:`其下全部账号与 Key 将被移除,不可恢复。`,confirmText:`删除`,tone:`destructive`})){c(e.id);try{await d.providerRemove(e.id),a.success(`已删除供应商「`+e.name+`」`),await g.refresh()}catch(e){a.error(String(e))}finally{c(null)}}}return(0,Y.jsx)(x,{open:e,onOpenChange:r,children:(0,Y.jsxs)(C,{className:`max-w-[440px]`,children:[(0,Y.jsx)(S,{children:(0,Y.jsx)(s,{children:`删除供应商`})}),(0,Y.jsx)(`div`,{className:`grid gap-1.5`,children:i.length?i.map(e=>(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded-md border border-border/70 bg-muted/40 px-3 py-2`,children:[(0,Y.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,Y.jsx)(`strong`,{className:`truncate text-sm font-medium text-foreground`,children:e.name}),(0,Y.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[e.kind===`proxy`?`反代`:`直连`,` · `,(e.accounts??[]).length,` 账号`]})]}),(0,Y.jsxs)(n,{disabled:o===e.id,onClick:()=>void u(e),size:`chip`,variant:`destructive`,children:[o===e.id?(0,Y.jsx)(j,{className:`size-3 animate-spin`}):(0,Y.jsx)(N,{className:`size-3`}),`删除`]})]},e.id)):(0,Y.jsx)(`p`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`暂无供应商`})}),(0,Y.jsx)(`div`,{className:`mt-3 flex justify-end`,children:(0,Y.jsx)(n,{onClick:()=>r(!1),variant:`outline`,children:`关闭`})})]})})}function ne({p:e,proxyApps:t,busy:i,onAction:o}){let s=Q(e.accounts??[]),c=s.find(e=>e.selected)||s.find(e=>e.usable&&!X(e.quota))||s[0],[l,u]=(0,J.useState)(!1),f=e.kind===`proxy`?(t??[]).find(t=>t.id===e.proxyAppId)??null:null,p=e.apiBase||(e.apiPort?`http://127.0.0.1:`+e.apiPort+`/v1`:null);return(0,Y.jsxs)(H,{className:`flex min-h-0 flex-col overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 border-b border-border/70 bg-muted px-5 py-3`,children:[(0,Y.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,Y.jsx)(`strong`,{className:`truncate text-sm font-semibold text-foreground`,children:e.name}),e.kind===`proxy`&&f&&f.installed?f.updateAvailable?(0,Y.jsxs)(n,{className:`gap-1 rounded-full px-2.5 text-xs text-warning`,disabled:i,onClick:()=>void o(`proxy-upd-`+e.id,async()=>{let t=e.proxyAppId,n=await d.proxyUpdateApply(t);if(n.ok===!1){a.error(n.error||`提交失败`);return}let r=a.loading(`正在更新 `+e.name+` 的全部实例…`),i=await M(()=>d.proxyUpdateStatus(t),{onTick:t=>{let n=t?.steps||[],i=n.filter(e=>e.state===`done`).length;n.length&&a.loading(`正在更新 `+e.name+`…(`+i+`/`+n.length+` 实例)`,{id:r})}}),o=i.snapshot;i.state===`done`?a.success(`更新完成`+(o?.restarted?`(已重启 `+o.restarted+` 个实例)`:``),{id:r}):i.state===`failed`?a.error(`更新失败:`+(i.error||(o?.errors?o.errors+` 个实例失败`:`未知原因`)),{id:r}):a.warning(`更新仍在进行(超时未完成,可稍后查看)`,{id:r}),await g.refresh()},void 0),size:`chip`,title:`检测到新版本,点击更新该应用全部实例`,variant:`outline`,children:[(0,Y.jsx)(j,{className:`size-3`}),`更新 v`,f.latest]}):(0,Y.jsxs)(n,{className:`gap-1 rounded-full px-2.5 text-xs font-mono text-muted-foreground`,disabled:i,onClick:()=>{o(`proxy-chk-`+e.id,async()=>{let t=await d.proxyUpdateCheck();if(await g.refresh(),!t.ok){a.error(t.error||`版本检测失败`);return}let n=t.versions?.[e.proxyAppId||``]||null,r=f.installed;a.info(n&&n!==r?`发现新版本 v`+n+`,点击版本胶囊更新`:`已是最新版本 v`+r)},void 0)},size:`chip`,title:`检测是否有新版本`,variant:`outline`,children:[`v`,f.installed,(0,Y.jsx)(j,{className:r(`size-3`,i&&`animate-spin`)})]}):null]}),(0,Y.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-1.5`,children:[(0,Y.jsxs)(n,{disabled:i,onClick:()=>u(!0),size:`sm`,variant:`outline`,children:[(0,Y.jsx)(F,{className:`size-3.5`}),`添加`]}),e.activated?(0,Y.jsxs)(n,{disabled:i,onClick:()=>void o(`deact`,()=>d.providerDeactivate(e.id).then(()=>void 0),`已停用供应商(资源已回收)`),size:`sm`,variant:`outline`,children:[(0,Y.jsx)(k,{className:`size-3.5`}),`停用`]}):(0,Y.jsxs)(n,{disabled:i,onClick:()=>void o(`act`,()=>d.providerActivate(e.id).then(()=>void 0),`已启用供应商`),size:`sm`,variant:`outline`,children:[(0,Y.jsx)(A,{className:`size-3.5`}),`启用`]})]})]}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 px-5 py-2.5`,children:[(0,Y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`API 地址`}),(0,Y.jsx)(`div`,{className:`flex h-8 min-w-0 flex-1 items-center gap-2 rounded-md border border-border bg-card px-2.5`,children:e.activated&&p?(0,Y.jsx)(`code`,{className:`min-w-0 flex-1 truncate font-mono text-xs text-foreground`,children:p}):(0,Y.jsx)(`span`,{className:`truncate text-xs text-muted-foreground/70`,children:`服务未启用`})}),e.activated&&p?(0,Y.jsxs)(n,{onClick:()=>void navigator.clipboard.writeText(p||``).then(()=>a.success(`已复制 API 地址`)),size:`sm`,title:`复制该供应商 API 地址`,variant:`outline`,children:[(0,Y.jsx)(D,{className:`size-3.5`}),`复制`]}):null]}),c?(0,Y.jsx)(ie,{acc:c,busy:i,p:e,onAction:o}):(0,Y.jsx)(`div`,{className:`px-5 py-3 text-xs text-muted-foreground`,children:`暂无账号数据`}),s.length?(0,Y.jsxs)(`div`,{className:`flex min-h-0 flex-col border-t border-border/60`,children:[(0,Y.jsxs)(`div`,{className:r(`grid items-center gap-2 border-b border-border/60 bg-muted/60 px-5 py-2 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`,$),children:[(0,Y.jsx)(`span`,{children:`Key`}),(0,Y.jsx)(`span`,{className:`text-center`,children:`用量`}),(0,Y.jsx)(`span`,{className:`text-center`,children:`操作`})]}),(0,Y.jsx)(`div`,{className:`max-h-[288px] min-h-0 overflow-y-auto overscroll-contain`,children:s.map((t,n)=>(0,Y.jsx)(`div`,{className:r(n>0&&`border-t border-border/50`),children:(0,Y.jsx)(ae,{a:t,p:e,busy:i,onAction:o})},t.keyId))})]}):(0,Y.jsx)(`p`,{className:`border-t border-border/60 px-5 py-3 text-xs text-muted-foreground`,children:`暂无 Keys — 点「添加」录入`}),(0,Y.jsx)(re,{open:l,onOpenChange:u,p:e})]})}function re({open:e,onOpenChange:r,p:i}){let o=i.accounts??[],c=t(),[l,u]=(0,J.useState)(``),[f,p]=(0,J.useState)(!1),[h,v]=(0,J.useState)(!1),[y,b]=(0,J.useState)(``),D=i.kind===`proxy`;(0,J.useEffect)(()=>{e&&b(``)},[e]);async function k(){v(!0);try{let e=await E(()=>d.proxyLoginStart());if(b(w(e)),!e||e.ok!==!0)return;let t=T(e);t&&a.warning(t,{duration:12e3});let n=await d.proxyLoginWait(e.waitMs??18e4);if(!n.ok||!n.apiKey){a.error(n.error||`登录未完成`);return}await d.proxyAddKey(i.id,n.apiKey),a.success(`已通过登录添加账号 `+(n.userName||n.keyName||``)),r(!1),await g.refresh()}catch(e){a.error(String(e))}finally{v(!1)}}async function A(){let e=l.split(/[,;\s]+/).map(e=>e.trim()).filter(Boolean);if(!e.length){a.error(`请输入至少一个 Key`);return}p(!0);try{if(D)for(let t of e){let e=await d.proxyAddKey(i.id,t);if(e&&e.limited===`credits`){let t=e.account?.limit?.recovery;a.warning(`已添加:该账号额度用尽`+(t?.type===`at`&&t.at?`(预计 ${Z(t.at)} 自动恢复)`:`(等待月度重置后自动恢复)`))}}else{let t=await d.providerKeysSet(i.id,{add:e});if(t.ok===!1){a.error(t.error||`添加失败`);return}let n=typeof t.added==`number`?t.added:e.length,o=t.discardedKeys||[];if(o.length){let e=o.slice(0,3).map(e=>`${e.key}(${e.error})`).join(`;`);a.warning(`已添加 ${n} 个,${o.length} 个失败被丢弃:${e}${o.length>3?` …`:``}`)}else a.success(`已添加 `+n+` 个 Key(`+(D?`反代账号`:`API Key`)+`)`);u(``),r(!1),await g.refresh();return}a.success(`已添加 `+e.length+` 个 Key(`+(D?`反代账号`:`API Key`)+`)`),u(``),r(!1),await g.refresh()}catch(e){a.error(String(e))}finally{p(!1)}}async function j(e){if(await c({title:`移除 Key `+e+`?`,description:`该凭据将从供应商中移除,不可恢复。`,confirmText:`移除`,tone:`destructive`})){p(!0);try{if(D){let t=o.find(t=>t.maskedKey===e||e.startsWith(t.maskedKey));t&&await d.proxyRemoveKey(i.id,t.keyId)}else{let t=await d.providerKeysSet(i.id,{removeMasked:[e]});if(t.ok===!1){a.error(t.error||`移除失败`);return}}a.success(`已移除`),r(!1),await g.refresh()}catch(e){a.error(String(e))}finally{p(!1)}}}return(0,Y.jsx)(x,{open:e,onOpenChange:r,children:(0,Y.jsxs)(C,{className:`max-w-[440px]`,children:[(0,Y.jsx)(S,{children:(0,Y.jsxs)(s,{children:[`添加 / 管理 Key — `,i.name]})}),(0,Y.jsxs)(`div`,{className:`grid gap-3`,children:[D?(0,Y.jsxs)(`div`,{className:`grid gap-2 rounded-md border border-border/70 bg-muted/40 px-3 py-2.5`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Y.jsxs)(`div`,{className:`grid gap-0.5`,children:[(0,Y.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:`一键登录`}),(0,Y.jsx)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:`浏览器打开 Command Code 授权,自动添加账号`})]}),(0,Y.jsx)(n,{disabled:h||f,onClick:()=>void k(),size:`sm`,children:h?`等待授权…`:`一键登录`})]}),y?(0,Y.jsxs)(`div`,{className:`grid gap-1 border-t border-border/60 pt-2`,children:[(0,Y.jsx)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:h?`等待授权中。窗口没弹出或停在空白页时,复制这一行在你的浏览器里打开:`:`本轮授权地址(窗口停在空白页时复制这一行手动打开):`}),(0,Y.jsx)(O,{url:y})]}):null]}):null,(0,Y.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Y.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:[D?`已录入账号(反代)`:`已录入 API Key`,`(`,o.length,`)`]}),o.length?(0,Y.jsx)(`div`,{className:`grid max-h-[180px] gap-1 overflow-auto`,children:o.map(e=>(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded-md border border-border/70 bg-muted/40 px-2.5 py-1.5`,children:[(0,Y.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,Y.jsx)(`code`,{className:`truncate font-mono text-xs`,children:e.maskedKey}),e.selected?(0,Y.jsx)(B,{tone:`ok`,children:`当前`}):null]}),(0,Y.jsx)(n,{size:`chip`,variant:`ghost`,className:`text-destructive`,disabled:f,onClick:()=>void j(e.maskedKey),title:`移除该 Key`,children:(0,Y.jsx)(N,{className:`size-3.5`})})]},e.keyId))}):(0,Y.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`尚未录入 `,D?`账号`:`Key`]})]}),(0,Y.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Y.jsxs)(m,{className:`text-xs text-muted-foreground`,children:[`添加 `,D?`账号 Key / Command Code`:`API Key`,`(每行一个,支持逗号/分号分隔)`]}),(0,Y.jsx)(_,{className:`h-20 resize-none font-mono text-xs`,placeholder:D?`sk-... 或 Command Code,每行一个`:`sk-... 每行一个`,value:l,onChange:e=>u(e.target.value)})]})]}),(0,Y.jsxs)(`div`,{className:`mt-3 flex justify-end gap-2`,children:[(0,Y.jsx)(n,{onClick:()=>r(!1),variant:`outline`,children:`取消`}),(0,Y.jsx)(n,{disabled:f||!l.trim(),onClick:()=>void A(),children:f?`保存中…`:`添加`})]})]})})}function ie({acc:t,busy:i,p:a,onAction:o}){let s=t.quota,c=!!t.selected,l=!!t.locked,u=s&&s.monthlyRemaining,f=s?.monthly?.percent,p=Number.isFinite(Number(f))?f+`%`:Number.isFinite(Number(u))?`$ `+Number(u).toFixed(2):`—`;return(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-4 px-5 py-3`,children:[(0,Y.jsxs)(`div`,{className:`grid min-w-[180px] content-center gap-1`,children:[(0,Y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:c?l?`当前账号(锁定)`:`当前在用账号`:`选择账号`}),(0,Y.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,Y.jsx)(L,{className:`max-w-[150px]`,children:t.maskedKey}),c?(0,Y.jsxs)(n,{className:`gap-1 px-2`,disabled:i,onClick:()=>o(`refresh`,()=>d.providerRefresh(a.id).then(()=>void 0),`额度已刷新`),size:`chip`,variant:`outline`,children:[(0,Y.jsx)(j,{className:r(`size-3`,i&&`animate-spin`)}),`刷新`]}):null]})]}),(0,Y.jsxs)(`div`,{className:`grid min-w-0 flex-1 grid-cols-3 items-stretch gap-2`,children:[(0,Y.jsx)(V,{icon:(0,Y.jsx)(j,{className:`size-3.5`}),label:`5小时`,value:(s?.rolling?.percent??0)+`%`,danger:s?.rolling?.status===`rate-limited`}),(0,Y.jsx)(V,{icon:(0,Y.jsx)(e,{className:`size-3.5`}),label:`每周`,value:(s?.weekly?.percent??0)+`%`,danger:s?.weekly?.status===`rate-limited`}),(0,Y.jsx)(V,{icon:(0,Y.jsx)(P,{className:`size-3.5`}),label:`每月`,value:p,danger:s?.monthly?.status===`rate-limited`||Number(s?.monthly?.percent??0)>=100})]})]})}function ae({a:e,p:t,busy:i,onAction:a}){let o=!!e.selected,s=e.instanceStatus===`frozen`?`frozen`:e.status||``,c=e.limit?.kind,l=s===`frozen`||!!c||!o&&X(e.quota),u=c===`credits`?e.limit?.recovery?.type===`at`&&e.limit?.recovery?.at?`额度用尽(预计 ${Z(e.limit.recovery.at)} 月度重置后自动恢复)`:`额度用尽(待月度重置后自动恢复)`:c===`window`?e.limit?.reason??`时间窗额度已用尽(到 resetAt 自动恢复)`:c===`banned`?`账号被封禁`:null,f=U(e.requests||0)+` 次 · `+U(e.totalTokens||0)+` tok`,[p,m]=(0,J.useState)(!1),h;return h=l&&!o?(0,Y.jsxs)(n,{size:`chip`,variant:`outline`,className:`w-[70px] gap-1 px-1.5`,onClick:()=>m(!0),title:u??`查看该账号限额情况`,children:[(0,Y.jsx)(W,{className:`size-3.5`}),`限额`]}):o?(0,Y.jsxs)(n,{disabled:i,onClick:()=>a(`refresh`,()=>d.providerRefresh(t.id).then(()=>void 0),`额度已刷新`),size:`chip`,variant:`outline`,className:`w-[70px] gap-1 px-1.5`,children:[(0,Y.jsx)(j,{className:r(`size-3.5`,i&&`animate-spin`)}),`刷新`]}):(0,Y.jsxs)(n,{disabled:i,size:`chip`,variant:`outline`,className:`w-[70px] gap-1 px-1.5`,onClick:()=>{t.kind===`proxy`?a(`sel`,()=>d.proxySelect(t.id,e.keyId).then(()=>void 0),`已切换账号`):a(`use`,()=>d.providerKeyUse(t.id,e.keyId).then(()=>void 0),`已锁定 Key`)},children:[(0,Y.jsx)(K,{className:`size-3.5`}),`切换`]}),(0,Y.jsxs)(`div`,{className:r(`grid items-center gap-2 px-5 py-2.5 hover:bg-muted/40`,$,o&&`bg-muted/60 shadow-[inset_3px_0_0_var(--primary)]`),children:[(0,Y.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,Y.jsx)(L,{children:e.maskedKey}),s===`registering`?(0,Y.jsx)(B,{tone:`off`,children:`检测中…`}):null,s===`banned`?(0,Y.jsx)(B,{tone:`err`,children:`封号`}):null,c===`credits`?(0,Y.jsx)(`span`,{title:e.limit?.reason??`额度用尽`,children:(0,Y.jsx)(B,{tone:`err`,children:`额度用尽`})}):null,c===`window`?(0,Y.jsx)(`span`,{title:e.limit?.reason??`时间窗额度已用尽`,children:(0,Y.jsx)(B,{tone:`warn`,children:`窗口用尽`})}):null]}),(0,Y.jsx)(`span`,{className:`truncate text-right text-xs tabular-nums text-muted-foreground`,title:f,children:f}),(0,Y.jsx)(`div`,{className:`flex justify-end`,children:h}),(0,Y.jsx)(oe,{open:p,onOpenChange:m,a:e,p:t})]})}function oe({open:e,onOpenChange:t,a:r,p:i}){let a=r.quota,o=(()=>{let e=a?.monthly?.percent;if(e!=null&&Number.isFinite(Number(e)))return Number(e);let t=Number(a?.credits?.monthlyCredits??a?.monthlyRemaining);return Number.isFinite(t)&&t>=0?Math.min(100,Math.round((10-t)/10*100)):0})(),c=a?.monthly?.status?{...a.monthly,percent:o}:{status:`ok`,percent:o,resetsAt:a?.monthly?.resetsAt},l=(()=>{let e=a?.credits?.monthlyCredits,t=a?.monthlyRemaining,n=e!=null&&Number.isFinite(Number(e))?Number(e):t!=null&&Number.isFinite(Number(t))?Number(t):null;return n===null?null:`剩余 $`+n.toFixed(2)})(),u=(e,t,n)=>(0,Y.jsxs)(`div`,{className:`grid gap-1 rounded-md border border-border/70 bg-muted/40 px-3 py-2.5`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Y.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:t}),(0,Y.jsx)(B,{tone:e?.status===`rate-limited`||Number(e?.percent)>=100?`err`:`ok`,children:e?.status===`rate-limited`||Number(e?.percent)>=100?`已限额`:`正常`})]}),(0,Y.jsxs)(`strong`,{className:`text-xl font-semibold tabular-nums text-foreground`,children:[e?.percent??0,`%`]}),n?(0,Y.jsx)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:n}):null,e?.resetsAt?(0,Y.jsxs)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:[`重置:`,new Date(e.resetsAt).toLocaleString(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})]}):null]});return(0,Y.jsx)(x,{open:e,onOpenChange:t,children:(0,Y.jsxs)(C,{className:`max-w-[420px]`,children:[(0,Y.jsx)(S,{children:(0,Y.jsx)(s,{children:`限额详情`})}),(0,Y.jsxs)(`div`,{className:`grid gap-1`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Y.jsx)(`span`,{children:`账号`}),(0,Y.jsx)(`code`,{className:`font-mono`,children:r.maskedKey}),(0,Y.jsx)(`span`,{className:`ml-auto text-xs`,children:i.name})]}),a?(0,Y.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[u(a.rolling,`5小时`),u(a.weekly,`每周`),u(c,`每月`),a.credits||a.monthlyRemaining!=null?(0,Y.jsxs)(`div`,{className:`col-span-3 flex flex-col gap-1 rounded-md border border-border/70 bg-muted/40 px-3 py-2`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-xs font-medium text-foreground`,children:`月度额度(Command)`}),a.credits?.belowThreshold?(0,Y.jsx)(B,{tone:`warn`,children:`低于充值线`}):a.credits&&Number.isFinite(Number(a.credits.monthlyCredits))&&Number(a.credits.monthlyCredits)<=0?(0,Y.jsx)(B,{tone:`err`,children:`额度用尽`}):(0,Y.jsx)(B,{tone:`ok`,children:`正常`})]}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Y.jsx)(`span`,{className:`text-[11px] leading-tight text-muted-foreground`,children:Number(a.monthlyResetAt)>Date.now()?`月度额度预计 ${Z(Number(a.monthlyResetAt))} 重置(随订阅续期)`:`月度额度已于 ${Z(Number(a.monthlyResetAt))} 重置`}),l?(0,Y.jsx)(`span`,{className:`text-sm font-semibold tabular-nums text-foreground`,children:l}):null]})]}):null]}):(0,Y.jsx)(`p`,{className:`py-6 text-center text-sm text-muted-foreground`,children:`暂无额度数据 — 点「刷新」获取`}),a?(0,Y.jsxs)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:[`当前用量统计:`,U(r.requests||0),` 次请求 · `,U(r.totalTokens||0),` tokens`,a.monthly?.resetsAt?`。最迟限额将于月窗口重置后自动解除。`:``]}):null]}),(0,Y.jsx)(`div`,{className:`mt-3 flex justify-end`,children:(0,Y.jsx)(n,{onClick:()=>t(!1),variant:`outline`,children:`关闭`})})]})})}function se({open:e,onOpenChange:t,presets:i,proxyApps:o,onDone:c}){let[l,g]=(0,J.useState)(``),[_,y]=(0,J.useState)(``),[w,T]=(0,J.useState)(``),[E,D]=(0,J.useState)(`preset`),[O,k]=(0,J.useState)(!1);async function A(){if(E===`preset`&&!l){a.error(`请选择供应商`);return}if(E===`proxy`&&!_){a.error(`请选择反代应用`);return}k(!0);try{let e=E===`preset`?await d.providerAdd({presetId:l,name:w||void 0,keys:[]}):await d.providerAdd({kind:`proxy`,appId:_,name:w||void 0,keys:[]});if(e.ok===!1){a.error(e.error||`添加失败`);return}a.success(`已添加供应商,请在卡片上点「添加」录入 Key`),t(!1),T(``),g(``),y(``),c()}catch(e){a.error(String(e))}finally{k(!1)}}let j=(i??[]).find(e=>e.id===l);return(0,Y.jsx)(x,{open:e,onOpenChange:t,children:(0,Y.jsxs)(C,{className:`max-w-[420px]`,children:[(0,Y.jsx)(S,{children:(0,Y.jsx)(s,{children:`添加供应商`})}),(0,Y.jsxs)(`div`,{className:`grid gap-3`,children:[(0,Y.jsx)(`div`,{className:`flex gap-1.5 rounded-lg bg-muted p-1`,children:[`preset`,`proxy`].map(e=>(0,Y.jsx)(n,{className:r(`flex-1 rounded-md font-medium`,E===e?`bg-card text-foreground shadow-sm`:`bg-transparent text-muted-foreground hover:bg-card/60 hover:text-foreground`),onClick:()=>D(e),size:`sm`,variant:`ghost`,children:e===`preset`?`直连预设`:`反代应用`},e))}),E===`preset`?(0,Y.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Y.jsx)(m,{children:`供应商`}),(0,Y.jsxs)(h,{value:l,onValueChange:g,children:[(0,Y.jsx)(p,{className:`w-full`,children:(0,Y.jsx)(v,{placeholder:`-- 选择供应商 --`})}),(0,Y.jsx)(b,{children:(i??[]).map(e=>(0,Y.jsx)(f,{value:e.id,children:e.name},e.id))})]}),j?.note?(0,Y.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:j.note}):null]}):(0,Y.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Y.jsx)(m,{children:`反代应用`}),(0,Y.jsxs)(h,{value:_,onValueChange:y,children:[(0,Y.jsx)(p,{className:`w-full`,children:(0,Y.jsx)(v,{placeholder:`-- 选择应用 --`})}),(0,Y.jsx)(b,{children:(o??[]).map(e=>(0,Y.jsx)(f,{value:e.id,children:e.name},e.id))})]})]}),(0,Y.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,Y.jsx)(m,{children:`供应商名称(可选)`}),(0,Y.jsx)(u,{placeholder:`自定义名称,如:Open Code ZEN`,value:w,onChange:e=>T(e.target.value)})]}),(0,Y.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`只添加供应商不填 Key;添加后在供应商卡片上点「添加」录入 API Key。`})]}),(0,Y.jsxs)(`div`,{className:`mt-4 flex justify-end gap-2`,children:[(0,Y.jsx)(n,{onClick:()=>t(!1),variant:`outline`,children:`取消`}),(0,Y.jsx)(n,{disabled:O,onClick:()=>void A(),children:O?`添加中…`:`添加供应商`})]})]})})}export{ee as RouterPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e,F as t,I as n,L as r,M as i,O as a,R as o,S as s,T as c,U as l,V as u,_ as d,a as f,d as p,f as m,h,i as g,j as _,l as v,m as y,p as b,s as x,u as S,v as C,w,x as T,y as E}from"./supervisor-Blfqgw-f.js";import{t as D}from"./refresh-cw-CHZo8X7a.js";import{c as O,l as k}from"./supervisor-C0cZTc5d.js";import{t as A}from"./useSupervisorAction-DUxfx47b.js";import{n as j,o as M,t as N}from"./widgets-C9CEOdGF.js";var P=l(u(),1),F=o();function I(){let[e,t]=(0,P.useState)(null),[r,i]=(0,P.useState)(null),[o,s]=(0,P.useState)(null),[c,l]=(0,P.useState)(``),[u,h]=(0,P.useState)(`hide`),{busy:_,run:y}=A(),C=(0,P.useCallback)(async()=>{let[e,n,r,a]=await Promise.all([f.autostart().catch(()=>null),f.lanPanel().catch(()=>null),f.accessKey().catch(()=>null),f.closeAction().catch(()=>null)]);e&&t(e.on),n&&i(n),r&&s(r),a&&h(a.closeAction)},[]);(0,P.useEffect)(()=>{C()},[C]);async function w(e){t(e);try{let n=await f.setAutostart(e);n.ok===!1?(a.error(n.error||`设置失败`),t(!e)):a.success(e?`已开启开机自启(整条服务链)`:`已关闭开机自启`)}catch(n){a.error(String(n)),t(!e)}}async function T(e){i(t=>t&&{...t,enabled:e});try{let t=await f.setLanPanel(e);if(t.ok===!1){a.error(t.error||`设置失败`),i(t=>t&&{...t,enabled:!e});return}i(t),a.success(e?`已开启局域网访问`:`已关闭局域网访问(仅本机)`)}catch(t){a.error(String(t)),i(t=>t&&{...t,enabled:!e})}}async function E(){let e=c.trim();if(e&&e.length<8){a.error(`访问密钥至少 8 位(建议 16+ 位随机串)`);return}await y(`akk`,()=>f.setAccessKey(e),{success:e?`访问密钥已设置`:`访问密钥已清除`,refresh:!1,onDone:()=>{l(``),C()}})&&g(e)}async function D(e){let t=e===`exit`?`exit`:`hide`;h(t),await y(`ca`,()=>f.setCloseAction(t),{success:t===`exit`?`已设为:关闭窗口时退出管家`:`已设为:关闭窗口时隐藏至托盘`,refresh:!1})}return(0,F.jsxs)(F.Fragment,{children:[(0,F.jsxs)(N,{children:[(0,F.jsx)(j,{title:`启动`,subtitle:`开机行为与偏好`}),(0,F.jsxs)(`div`,{className:`grid gap-4 px-5 py-4`,children:[(0,F.jsxs)(`div`,{className:`flex items-start justify-between gap-6`,children:[(0,F.jsxs)(`div`,{className:`min-w-0`,children:[(0,F.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`开机自动启动管家`}),(0,F.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:`开机登录后自动启动 DeepSeek Harness 管家(本程序)。不会自动启动任何单个实例——实例是否被自动拉起,由各自「进程监控」开关决定。`})]}),e===null?(0,F.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`…`}):(0,F.jsx)(`span`,{title:`开机自启`,children:(0,F.jsx)(x,{checked:e,onCheckedChange:e=>void w(e)})})]}),(0,F.jsxs)(`div`,{className:`flex items-start justify-between gap-6 border-t border-border/60 pt-4`,children:[(0,F.jsxs)(`div`,{className:`min-w-0`,children:[(0,F.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`关闭窗口时`}),(0,F.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:`隐藏至托盘:管家与服务继续在后台运行;退出管家:关闭并停止全部服务。`})]}),(0,F.jsxs)(v,{value:u,onValueChange:e=>void D(e),children:[(0,F.jsx)(m,{className:`w-[150px]`,children:(0,F.jsx)(b,{})}),(0,F.jsxs)(S,{children:[(0,F.jsx)(p,{value:`hide`,children:`隐藏至托盘`}),(0,F.jsx)(p,{value:`exit`,children:`退出管家`})]})]})]})]})]}),(0,F.jsxs)(N,{children:[(0,F.jsx)(j,{title:`访问`}),(0,F.jsxs)(`div`,{className:`grid gap-4 px-5 py-4`,children:[(0,F.jsxs)(`div`,{className:`flex items-start justify-between gap-6`,children:[(0,F.jsxs)(`div`,{className:`min-w-0`,children:[(0,F.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`管家局域网访问`}),r?r.enabled?(0,F.jsxs)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:[`开启后,局域网内设备可通过\xA0`,(r.urls??[]).map((e,t)=>(0,F.jsxs)(`span`,{children:[t>0?`、 `:null,(0,F.jsx)(`code`,{className:`rounded bg-muted px-1 py-px font-mono text-foreground`,children:e})]},e)),`\xA0访问本面板。`]}):(0,F.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:`关闭后仅本机可访问,局域网设备不可用。`}):null]}),r===null?(0,F.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`…`}):(0,F.jsx)(`span`,{title:`局域网访问`,children:(0,F.jsx)(x,{checked:r.enabled,onCheckedChange:e=>void T(e)})})]}),(0,F.jsx)(`div`,{className:`flex items-start justify-between gap-6 border-t border-border/60 pt-4`,children:(0,F.jsxs)(`div`,{className:`min-w-0`,children:[(0,F.jsx)(`strong`,{className:`block text-sm font-medium text-foreground`,children:`访问密钥`}),(0,F.jsxs)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:[`局域网或公网访问本面板需携带此密钥;本机访问不受影响。留空保存可清除。`,o?.configured?(0,F.jsx)(`span`,{className:`mt-1 block text-status-ok`,children:`当前:已设置`}):(0,F.jsx)(`span`,{className:`mt-1 block text-muted-foreground`,children:`当前:未设置`})]})]})}),(0,F.jsxs)(`div`,{className:`flex gap-2`,children:[(0,F.jsx)(d,{type:`password`,autoComplete:`new-password`,placeholder:`输入 ≥8 位访问密钥(建议随机长串)`,value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{e.key===`Enter`&&E()},className:`flex-1`}),(0,F.jsx)(n,{variant:`outline`,onClick:()=>l(``),disabled:!c&&!o?.configured,children:`清除`}),(0,F.jsx)(n,{disabled:_===`akk`,onClick:()=>void E(),children:o?.configured?`更新密钥`:`设置密钥`})]})]})]})]})}function L(){let[t,o]=(0,P.useState)(null),[s,l]=(0,P.useState)(`auto`),[u,p]=(0,P.useState)([]),[m,g]=(0,P.useState)(``),[v,b]=(0,P.useState)(``),[x,S]=(0,P.useState)(!1),C=(0,P.useRef)(null),{busy:T,run:E}=A();(0,P.useEffect)(()=>{if(!x||!C.current)return;let e=window.setTimeout(()=>{let e=C.current;e&&e.scrollIntoView({block:`start`,behavior:`smooth`})},320);return()=>window.clearTimeout(e)},[x]);let I=(0,P.useCallback)(async()=>{let e=await f.registry().catch(()=>null);o(e)},[]);(0,P.useEffect)(()=>{I()},[I]),(0,P.useEffect)(()=>{t&&(l(t.mode||`auto`),p((t.candidates??[]).map(e=>e.origin)),g(t.manualOrigin||``))},[t]);let L=()=>{let e=v.trim();if(!/^https?:\/\//.test(e)){a.error(`请输入合法的镜像 URL`);return}if(u.includes(e)){a.info(`已在列表中`);return}p(t=>[...t,e]),b(``)};async function z(){let e={mode:s,origins:u};if(s===`manual`){if(!/^https?:\/\//.test(m.trim())){a.error(`手动模式需提供合法镜像 URL`);return}e.manualOrigin=m.trim()}await E(`reg`,()=>f.registrySet(e),{success:`已保存镜像配置`,refresh:!1,onDone:()=>void I()})}async function B(){await E(`regr`,()=>f.registryRefresh(),{success:`已探测镜像`,refresh:!1,onDone:()=>void I()})}let V=e=>{let n=(t?.probes??[]).find(t=>t.origin===e);return n&&n.ok?n.latencyMs:null},H=e=>{let n=(t?.registries??[]).find(t=>t.base===e);if(n&&!n.usable)return`形态非法:`+(n.violation||`未知`);let r=(t?.probes??[]).find(t=>t.origin===e);return r&&!r.ok?`不可达:`+(r.error||`未知`):`未探测`};return(0,F.jsxs)(N,{children:[(0,F.jsx)(j,{title:`镜像源`,subtitle:`npm 拉取 / 更新检测共用此源`}),(0,F.jsxs)(`div`,{className:`grid gap-3 px-5 py-4`,children:[(0,F.jsxs)(y,{value:s,onValueChange:e=>l(e),className:`flex gap-3`,children:[(0,F.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5 text-sm`,children:[(0,F.jsx)(h,{value:`auto`,id:`reg-auto`}),(0,F.jsx)(`span`,{children:`自动(按延迟选最快)`})]}),(0,F.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5 text-sm`,children:[(0,F.jsx)(h,{value:`manual`,id:`reg-manual`}),(0,F.jsx)(`span`,{children:`手动(固定指定)`})]})]}),s===`manual`?(0,F.jsx)(`div`,{className:`grid gap-1.5`,children:(0,F.jsxs)(`div`,{className:`flex gap-2`,children:[(0,F.jsx)(d,{placeholder:`https://registry.npmmirror.com`,value:m,onChange:e=>g(e.target.value),className:`flex-1`}),(0,F.jsx)(n,{variant:`outline`,onClick:()=>void R(m),children:`测试`})]})}):null,(0,F.jsxs)(e,{open:x,onOpenChange:S,className:`grid gap-1`,children:[(0,F.jsxs)(c,{ref:C,children:[(0,F.jsxs)(`span`,{className:`text-xs font-medium text-foreground`,children:[`候选镜像列表(`,u.length,`)`]}),x?(0,F.jsx)(_,{className:`size-3.5 text-muted-foreground`}):(0,F.jsx)(i,{className:`size-3.5 text-muted-foreground`})]}),x?null:(0,F.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded-md border border-border/70 px-3 py-1.5`,children:[(0,F.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,F.jsx)(M,{tone:`ok`,children:`当前`}),(0,F.jsx)(`code`,{className:`truncate font-mono text-xs text-muted-foreground`,children:t?.origin||`未选择`})]}),t?.origin&&V(t.origin)!=null?(0,F.jsxs)(`span`,{className:`shrink-0 text-xs font-medium tabular-nums`,children:[V(t.origin),`ms`]}):null]}),(0,F.jsx)(w,{children:(0,F.jsx)(`div`,{className:`rounded-md border border-border/70`,children:u.map((e,r)=>(0,F.jsxs)(`div`,{className:`flex items-center justify-between gap-2 border-b border-border/50 px-3 py-1.5 last:border-b-0`,children:[(0,F.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[t?.origin===e?(0,F.jsx)(M,{tone:`ok`,children:`当前`}):null,(0,F.jsx)(`code`,{className:`truncate font-mono text-xs text-muted-foreground`,children:e})]}),(0,F.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[V(e)==null?(0,F.jsx)(`span`,{className:`text-xs text-muted-foreground/50`,title:H(e),children:`—`}):(0,F.jsxs)(`span`,{className:`text-xs font-medium tabular-nums`,title:`延迟毫秒数(自动探测)`,children:[V(e),(0,F.jsx)(`span`,{className:`text-muted-foreground/60`,children:`ms`})]}),(0,F.jsx)(n,{size:`chip`,variant:`ghost`,onClick:()=>p(t=>t.filter(t=>t!==e)),title:`移除该候选镜像`,children:(0,F.jsx)(O,{className:`size-3.5 text-destructive`})})]})]},r))})})]}),(0,F.jsxs)(`div`,{className:`flex gap-2`,children:[(0,F.jsx)(d,{placeholder:`https://… 添加自定义镜像`,value:v,onChange:e=>b(e.target.value),className:`flex-1`,onKeyDown:e=>{e.key===`Enter`&&L()}}),(0,F.jsxs)(n,{variant:`outline`,onClick:L,children:[(0,F.jsx)(k,{className:`size-4`}),`添加`]})]}),(0,F.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,F.jsxs)(n,{size:`sm`,disabled:T===`regr`,onClick:()=>void B(),variant:`outline`,children:[(0,F.jsx)(D,{className:r(`size-3.5`,T===`regr`&&`animate-spin`)}),`重新探测`]}),(0,F.jsx)(n,{disabled:T===`reg`,onClick:()=>void z(),children:`保存`})]})]})]})}async function R(e){if(!/^https?:\/\//.test(e)){a.error(`请输入合法镜像 URL`);return}a.info(`测试中…`);try{let t=await f.registryProbe(e.replace(/\/+$/,``));t&&t.ok===!0&&typeof t.latencyMs==`number`?a.success(`可达,延迟 `+t.latencyMs+` ms`):t&&typeof t.error==`string`&&t.error?a.error(`探测失败:`+t.error):a.error(`不可达`)}catch(e){a.error(`探测失败:`+(e instanceof Error?e.message:String(e)))}}var z={schema:1,note:`跨语言共享常量(Node 内核 ↔ Rust 桌面壳)的单一来源。Rust 侧 include_str! 编译期嵌入,Node 侧读取;两侧不再各存一份副本,故不可能漂移。范式取自 shell/shell-release/version-vectors.json(本仓已验证的跨语言单源先例)。`,product:{name:`lobox`,cliName:`lobox`,guiBinName:`lobox-shell`,guiCrateName:`lobox-shell`},state:{dirName:`lobox`,supervisorSubdir:`supervisor`,shellSubdir:`shell`,legacyHarnessDir:`.dsh`,winBaseEnv:`LOCALAPPDATA`,linuxXdgEnv:`XDG_STATE_HOME`},env:{stateRoot:`DSH_SUPERVISOR_HOME`,config:`DSH_SUPERVISOR_CONFIG`},proc:{matchGuard:`*lobox*|*lob-ox*|*dsh*`,matchGuardNote:`进程归属判据。必须覆盖三种真实形态:CLI/壳可执行名 lobox、npm scope @lob-ox(连字符,不等于 lobox)、以及旧产品名 dsh 的历史安装。漏任一种都会让无锚点兜底判据对该形态返回非我方。`},bridge:{msgKernelUpdateRequest:`lobox:kernel-update-request`,msgKernelUpdateResult:`lobox:kernel-update-result`,msgKernelUpdateProgress:`lobox:kernel-update-progress`},net:{apiPort:37360,routerCtlPort:43107,lanCtlPort:43108,deprecatedApiPorts:[36360],dshDefaultPort:3080},runtime:{minNode:`v22.12.0`,npmDefaultRegistry:`https://registry.npmjs.org`}},B=z.bridge.msgKernelUpdateRequest,V=z.bridge.msgKernelUpdateResult,H=z.bridge.msgKernelUpdateProgress,U=12e5;function W(e){return new Promise(t=>{if(!G()){t({ok:!1,error:`内核更新由桌面壳执行:请在桌面壳面板中操作。`});return}let n=`kupd-`+Date.now()+`-`+Math.random().toString(36).slice(2,8),r=Date.now(),i=!1,a=null,o=setTimeout(s,U);function s(){l(a?{ok:!1,error:`桌面壳无响应(更新请求超时;最后一次进度:`+a+`)`}:{ok:!1,error:`桌面壳无响应(更新请求超时)`})}let c=e=>{clearTimeout(o),o=setTimeout(s,Math.max(0,e))},l=e=>{i||(i=!0,window.removeEventListener(`message`,u),clearTimeout(o),t(e))},u=t=>{let i=t.data;if(!(!i||typeof i!=`object`)&&t.source===window.parent&&i.v===2&&(i.type===V||i.type===H)&&i.requestId===n){if(i.type===H){let t=typeof i.status==`string`&&i.status?i.status:null;t&&(a=t),e?.({stage:typeof i.stage==`string`?i.stage:null,status:t,progress:typeof i.progress==`number`?i.progress:null});let n=typeof i.maxWaitMs==`number`?i.maxWaitMs:0;n>0&&c(n-(Date.now()-r));return}l({ok:i.ok===!0,stage:i.stage??null,version:i.version??null,restartUncertain:i.restartUncertain===!0,error:i.error??null})}};window.addEventListener(`message`,u);try{window.parent.postMessage({v:2,type:B,requestId:n},`*`)}catch(e){l({ok:!1,error:String(e)})}})}function G(){try{return window.parent!==window}catch{return!1}}var K=`DeepSeek Harness 管家`,q=`独立于 Harness 运行的系统级守卫:负责启动、存活监测与故障自动重启被监管目标,提供生命周期管理、智能路由、远程控制与多实例沙箱的运维面板。`,J=e=>e?String(e).replace(/^v/i,``):`—`;function Y(){let[e,i]=(0,P.useState)(null),[o,c]=(0,P.useState)(null),[l,u]=(0,P.useState)(!1),[d,p]=(0,P.useState)(`dsh`),[m,h]=(0,P.useState)(``),[g,_]=(0,P.useState)(null),{busy:v,run:y}=A(),b=t(),x=(0,P.useCallback)(async e=>{p(e),h(``),u(!0);try{let t=e===`dsh`?await f.dshChangelog():await f.guardChangelog();h(t||`(无内容)`)}catch(e){h(`加载失败:`+String(e))}},[]),S=(0,P.useCallback)(async()=>{let[e,t]=await Promise.all([f.guardVersion().catch(()=>null),f.shellStatus().catch(()=>null)]);i(e||{}),c(t?{version:t.identity?.version||null,capable:t.identity?.selfUpdateCapable===!0,installKind:t.identity?.installKind}:{})},[]);(0,P.useEffect)(()=>{S()},[S]),(0,P.useEffect)(()=>{let e=!0;return(async()=>{let[t,n]=await Promise.all([f.selfUpdateStatus().catch(()=>null),f.shellCheckUpdate().catch(()=>null)]);e&&(t&&t.ok!==!1&&i(e=>({...e||{},...t})),n&&c(e=>({...e||{},latest:n.latest||null,updateAvailable:n.updateAvailable===!0,error:n.error||null})))})(),()=>{e=!1}},[]);let w=async()=>{await y(`chk`,async()=>{let e=`内核:状态未知`,t=await f.selfUpdateStatus().catch(()=>null);if(t&&t.ok!==!1)i(t||{}),e=t.updateAvailable&&t.latest?`内核有新版本 `+J(t.latest)+`(当前 `+J(t.installed)+`)`:`内核已是最新(`+J(t.installed)+`)`;else{let n=await f.guardVersion().catch(()=>null);if(n?.upstream===`git-repo`){let t=await f.guardVersionCheck().catch(()=>null);i({...n||{},...t||{}}),e=t?.updateAvailable?`内核源码仓库有上游更新(当前提交 `+(t.commit||n?.commit||`—`)+`)`:`内核源码仓库已是最新(提交 `+(n?.commit||t?.commit||`—`)+`)`}else e=`内核:`+(t&&t.error||`自更新未配置`)}let n=await f.shellCheckUpdate().catch(()=>null),r=`桌面壳:状态未知`;n&&n.ok!==!1?(c(e=>({...e||{},latest:n.latest||null,updateAvailable:n.updateAvailable===!0,error:null})),r=n.updateAvailable&&n.latest?`桌面壳有新版本 `+J(n.latest)+`(当前 `+J(n.installed)+`)`:`桌面壳已是最新(`+J(n.installed)+`)`):(c(e=>({...e||{},error:n&&n.error||`检测失败`})),r=`桌面壳:`+(n&&n.error||`检测失败`)),t?.updateAvailable&&t?.latest||n?.updateAvailable&&n?.latest?a.warning(e+`;`+r):a.success(e+`;`+r)},{refresh:!1})},O=async()=>{if(!G()){a.error(`内核更新由桌面壳执行:请在桌面壳面板中操作。`);return}await b({title:`发现内核新版本 `+J(e?.latest)+`,是否立即更新?`,description:`内核将由桌面壳安装,并自动重启守卫。`,confirmText:`更新`})&&await y(`upd`,async()=>{_({status:`已向桌面壳发出更新请求,等待响应…`});let t=await W(_);if(!t.ok){a.error(t.error||`更新失败`);return}let n=J(t.version||e?.latest);t.restartUncertain?a.warning(`内核已更新至 `+n+`,但守卫可能未自动重启,请手动确认。`):a.success(`内核已更新至 `+n+`,守卫已重启。`)},{refresh:!0,onDone:()=>_(null)})},k=!!(e?.updateAvailable&&e?.latest&&e.latest!==e?.installed),I=!!(o?.updateAvailable&&o?.latest&&o.latest!==o?.version),L=o?.capable===!1;return(0,F.jsxs)(N,{children:[(0,F.jsx)(j,{title:`关于`,subtitle:K,actions:(0,F.jsxs)(n,{size:`sm`,disabled:v===`chk`,onClick:()=>void w(),variant:`outline`,children:[(0,F.jsx)(D,{className:r(`size-3.5`,v===`chk`&&`animate-spin`)}),`检查更新`]})}),(0,F.jsxs)(`div`,{className:`grid gap-3 px-5 py-4`,children:[(0,F.jsxs)(`div`,{className:`grid grid-cols-[96px_minmax(0,1fr)] items-baseline gap-3`,children:[(0,F.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`桌面壳版本`}),(0,F.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2 text-sm font-medium text-foreground`,children:[J(o?.version),o?.installKind?(0,F.jsxs)(`span`,{className:`text-xs font-normal text-muted-foreground`,children:[`(`,o.installKind,`)`]}):null,I?(0,F.jsxs)(F.Fragment,{children:[(0,F.jsxs)(M,{tone:`warn`,children:[`可更新 `,J(o?.latest)]}),(0,F.jsx)(M,{tone:`off`,children:`请重启桌面壳应用更新`})]}):null,L?(0,F.jsx)(M,{tone:`off`,children:`当前形态不支持自更新`}):null,o?.error?(0,F.jsx)(`span`,{className:`text-xs font-normal text-muted-foreground`,children:o.error}):null]})]}),(0,F.jsxs)(`div`,{className:`grid grid-cols-[96px_minmax(0,1fr)] items-baseline gap-3`,children:[(0,F.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`内核版本`}),(0,F.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2 text-sm font-medium text-foreground`,children:[J(e?.installed||e?.version),k?(0,F.jsxs)(F.Fragment,{children:[(0,F.jsxs)(M,{tone:`warn`,children:[`可更新 `,J(e?.latest)]}),G()?(0,F.jsxs)(n,{size:`chip`,disabled:v===`upd`,onClick:()=>void O(),variant:`outline`,children:[(0,F.jsx)(D,{className:r(`size-3`,v===`upd`&&`animate-spin`)}),`更新`]}):(0,F.jsx)(M,{tone:`off`,children:`请在桌面壳中更新`})]}):null]})]}),g?(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-xs leading-relaxed text-muted-foreground`,children:[(0,F.jsx)(D,{className:`size-3 shrink-0 animate-spin`}),(0,F.jsx)(`span`,{className:`min-w-0 flex-1 break-words`,children:g.status||`桌面壳处理中…`}),typeof g.progress==`number`?(0,F.jsxs)(`span`,{className:`tabular-nums font-medium text-foreground`,children:[Math.round(g.progress*100),`%`]}):null]}):null,(0,F.jsx)(`p`,{className:`border-t border-border/60 pt-3 text-xs leading-relaxed text-muted-foreground`,children:q}),(0,F.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border/60 pt-3`,children:[(0,F.jsx)(n,{size:`chip`,variant:`outline`,onClick:()=>void x(`dsh`),children:`DSH 更新日志`}),(0,F.jsx)(n,{size:`chip`,variant:`outline`,onClick:()=>void x(`guard`),children:`管家更新日志`})]})]}),(0,F.jsx)(C,{open:l,onOpenChange:u,children:(0,F.jsxs)(E,{className:`max-w-[560px]`,children:[(0,F.jsx)(T,{children:(0,F.jsx)(s,{children:d===`dsh`?`DeepSeek Harness 更新日志`:`管家更新日志`})}),(0,F.jsx)(`pre`,{className:`max-h-[50vh] overflow-auto whitespace-pre-wrap break-words rounded-md border border-border/60 bg-muted/30 p-3 text-xs leading-relaxed text-foreground`,children:m||`加载中…`})]})})]})}function X(){return(0,F.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,F.jsx)(I,{}),(0,F.jsx)(L,{}),(0,F.jsx)(Y,{})]})}export{X as SettingsPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e){if(!e||typeof e!=`object`)return null;let t=e.state;return t===`done`||t===`failed`||t===`running`?t:null}async function t(t,n={}){let r=Math.max(300,n.intervalMs??1200),i=Math.max(r,n.timeoutMs??6e5),a=Date.now(),o=null;for(;;){if(n.signal?.aborted)return{state:`running`,snapshot:o,error:`已取消`};try{let r=await t();if(o=r,n.onTick)try{n.onTick(r)}catch{}let i=e(r);if(i===`done`)return{state:`done`,snapshot:r,error:null};if(i===`failed`)return{state:`failed`,snapshot:r,error:r?.error??null};let a=r?.error;if(a&&i===null)return{state:`failed`,snapshot:r,error:String(a)}}catch{}if(Date.now()-a>=i)return{state:`running`,snapshot:o,timedOut:!0};await new Promise(e=>setTimeout(e,r))}}export{t};
|