xiaozhi-client 1.7.8 → 1.7.10-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--primary: 221.2 83.2% 53.3%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--ring: 221.2 83.2% 53.3%;--radius: .65rem;--chart-1: 12 76% 61%;--chart-2: 173 58% 39%;--chart-3: 197 37% 24%;--chart-4: 43 74% 66%;--chart-5: 27 87% 67%;--spacing: .25rem}.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--primary: 217.2 91.2% 59.8%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 40% 98%;--border: 217.2 32.6% 17.5%;--input: 217.2 32.6% 17.5%;--ring: 224.3 76.3% 48%;--chart-1: 220 70% 50%;--chart-2: 160 60% 45%;--chart-3: 30 80% 55%;--chart-4: 280 65% 60%;--chart-5: 340 75% 55%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}button:focus,button:focus-visible,a:focus,a:focus-visible,[role=button]:focus,[role=button]:focus-visible,[role=link]:focus,[role=link]:focus-visible{outline:none!important;box-shadow:none!important}button:focus,button:focus-visible,a:focus,a:focus-visible,[role=button]:focus,[role=button]:focus-visible{--tw-ring-shadow: none !important}button:focus-visible,a:focus-visible,[role=button]:focus-visible,[role=link]:focus-visible{background-color:hsl(var(--accent))!important;color:hsl(var(--accent-foreground))!important;transition:background-color .2s ease,color .2s ease}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-1{right:.25rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\.5{top:.375rem}.top-3\.5{top:.875rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.-ml-1{margin-left:-.25rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-\[4px\]{margin-bottom:4px}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-24{margin-top:6rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.aspect-video{aspect-ratio:16 / 9}.size-3{width:.75rem;height:.75rem}.size-4{width:1rem;height:1rem}.size-8{width:2rem;height:2rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-\[300px\]{height:300px}.h-\[400px\]{height:400px}.h-\[40px\]{height:40px}.h-\[72px\]{height:72px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-\[--radix-select-content-available-height\]{max-height:var(--radix-select-content-available-height)}.max-h-\[500px\]{max-height:500px}.max-h-\[80vh\]{max-height:80vh}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.min-h-0{min-height:0px}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0px}.w-1{width:.25rem}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[--sidebar-width\]{width:var(--sidebar-width)}.w-\[1000px\]{width:1000px}.w-\[100px\]{width:100px}.w-\[120px\]{width:120px}.w-\[140px\]{width:140px}.w-\[1px\]{width:1px}.w-\[50px\]{width:50px}.w-\[600px\]{width:600px}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-10{min-width:2.5rem}.min-w-11{min-width:2.75rem}.min-w-5{min-width:1.25rem}.min-w-8{min-width:2rem}.min-w-9{min-width:2.25rem}.min-w-\[600px\]{min-width:600px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[--skeleton-width\]{max-width:var(--skeleton-width)}.max-w-\[800px\]{max-width:800px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\[--radix-select-content-transform-origin\]{transform-origin:var(--radix-select-content-transform-origin)}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-px{--tw-translate-x: -1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-px{--tw-translate-x: 1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.border{border-width:1px}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[--color-border\]{border-color:var(--color-border)}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-destructive\/20{border-color:hsl(var(--destructive) / .2)}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-sidebar-border{border-color:hsl(var(--sidebar-border))}.border-transparent{border-color:transparent}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[--color-bg\]{background-color:var(--color-bg)}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sidebar{background-color:hsl(var(--sidebar-background))}.bg-sidebar-border{background-color:hsl(var(--sidebar-border))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\[1px\]{padding:1px}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.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)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-sidebar-foreground{color:hsl(var(--sidebar-foreground))}.text-sidebar-foreground\/70{color:hsl(var(--sidebar-foreground) / .7)}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow: 0 0 0 1px hsl(var(--sidebar-border));--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-sidebar-ring{--tw-ring-color: hsl(var(--sidebar-ring))}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\,height\]{transition-property:width,height;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{animation-timing-function:linear}.running{animation-play-state:running}.\@container\/card{container-type:inline-size;container-name:card}.\@container\/main{container-type:inline-size;container-name:main}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.after\:inset-y-0:after{content:var(--tw-content);top:0;bottom:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-gray-200:hover{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.hover\:border-green-200:hover{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-green-100:hover{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.hover\:bg-green-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.hover\:bg-green-500:hover{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/5:hover{background-color:hsl(var(--primary) / .05)}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-500:hover{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-sidebar-accent:hover{background-color:hsl(var(--sidebar-accent))}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-green-700:hover{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.hover\:text-green-800:hover{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:text-primary-foreground:hover{color:hsl(var(--primary-foreground))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-sidebar-accent-foreground:hover{color:hsl(var(--sidebar-accent-foreground))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow: 0 0 0 1px hsl(var(--sidebar-accent));--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:hsl(var(--sidebar-border))}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-sidebar-ring:focus-visible{--tw-ring-color: hsl(var(--sidebar-ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.active\:bg-primary\/90:active{background-color:hsl(var(--primary) / .9)}.active\:bg-sidebar-accent:active{background-color:hsl(var(--sidebar-accent))}.active\:text-primary-foreground:active{color:hsl(var(--primary-foreground))}.active\:text-sidebar-accent-foreground:active{color:hsl(var(--sidebar-accent-foreground))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:scale-100:disabled{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group\/menu-item:focus-within .group-focus-within\/menu-item\:opacity-100{opacity:1}.group\/menu-item:hover .group-hover\/menu-item\:opacity-100{opacity:1}.group.toaster .group-\[\.toaster\]\:border-border{border-color:hsl(var(--border))}.group.toast .group-\[\.toast\]\:bg-muted{background-color:hsl(var(--muted))}.group.toast .group-\[\.toast\]\:bg-primary{background-color:hsl(var(--primary))}.group.toast .group-\[\.toast\]\:bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.group.toaster .group-\[\.toaster\]\:bg-background{background-color:hsl(var(--background))}.group.toast .group-\[\.toast\]\:text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.group.toast .group-\[\.toast\]\:text-muted-foreground{color:hsl(var(--muted-foreground))}.group.toast .group-\[\.toast\]\:text-primary-foreground{color:hsl(var(--primary-foreground))}.group.toaster .group-\[\.toaster\]\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.group.toaster .group-\[\.toaster\]\:text-foreground{color:hsl(var(--foreground))}.group.toaster .group-\[\.toaster\]\:text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.group.toaster .group-\[\.toaster\]\:text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.group.toaster .group-\[\.toaster\]\:text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.group.toaster .group-\[\.toaster\]\:shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.peer\/menu-button:hover~.peer-hover\/menu-button\:text-sidebar-accent-foreground{color:hsl(var(--sidebar-accent-foreground))}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:hsl(var(--sidebar-background))}.group\/menu-item:has([data-sidebar=menu-action]) .group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8{padding-right:2rem}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[orientation\=vertical\]\:h-4[data-orientation=vertical]{height:1rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:hsl(var(--sidebar-accent))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[slot\=sidebar-menu-button\]\:\!p-1\.5[data-slot=sidebar-menu-button]{padding:.375rem!important}.data-\[active\=true\]\:font-medium[data-active=true]{font-weight:500}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:hsl(var(--sidebar-accent-foreground))}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.\*\:data-\[slot\=card\]\:bg-gradient-to-t[data-slot=card]>*{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.\*\:data-\[slot\=card\]\:from-primary\/5[data-slot=card]>*{--tw-gradient-from: hsl(var(--primary) / .05) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.\*\:data-\[slot\=card\]\:to-card[data-slot=card]>*{--tw-gradient-to: hsl(var(--card)) var(--tw-gradient-to-position)}.data-\[state\=open\]\:hover\:bg-sidebar-accent:hover[data-state=open]{background-color:hsl(var(--sidebar-accent))}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground:hover[data-state=open]{color:hsl(var(--sidebar-accent-foreground))}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]{left:calc(var(--sidebar-width) * -1)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]{right:calc(var(--sidebar-width) * -1)}.group[data-side=left] .group-data-\[side\=left\]\:-right-4{right:-1rem}.group[data-side=right] .group-data-\[side\=right\]\:left-0{left:0}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:-mt-8{margin-top:-2rem}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:hidden{display:none}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!size-8{width:2rem!important;height:2rem!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]{width:var(--sidebar-width-icon)}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]{width:calc(var(--sidebar-width-icon) + 1rem)}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]{width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:w-0{width:0px}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[data-side=right] .group-data-\[side\=right\]\:rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:overflow-hidden{overflow:hidden}.group[data-variant=floating] .group-data-\[variant\=floating\]\:rounded-lg{border-radius:var(--radius)}.group[data-variant=floating] .group-data-\[variant\=floating\]\:border{border-width:1px}.group[data-side=left] .group-data-\[side\=left\]\:border-r{border-right-width:1px}.group[data-side=right] .group-data-\[side\=right\]\:border-l{border-left-width:1px}.group[data-variant=floating] .group-data-\[variant\=floating\]\:border-sidebar-border{border-color:hsl(var(--sidebar-border))}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-0{padding:0!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-2{padding:.5rem!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:opacity-0{opacity:0}.group[data-variant=floating] .group-data-\[variant\=floating\]\:shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:after\:left-full:after{content:var(--tw-content);left:100%}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:hover{background-color:hsl(var(--sidebar-background))}.peer\/menu-button[data-size=default]~.peer-data-\[size\=default\]\/menu-button\:top-1\.5{top:.375rem}.peer\/menu-button[data-size=lg]~.peer-data-\[size\=lg\]\/menu-button\:top-2\.5{top:.625rem}.peer\/menu-button[data-size=sm]~.peer-data-\[size\=sm\]\/menu-button\:top-1{top:.25rem}.peer\/menu-button[data-active=true]~.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground{color:hsl(var(--sidebar-accent-foreground))}@container main (min-width: 36rem){.\@xl\/main\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\@xl\/main\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}}@container main (min-width: 64rem){.\@5xl\/main\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\@5xl\/main\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}}@container card (min-width: 250px){.\@\[250px\]\/card\:text-3xl{font-size:1.875rem;line-height:2.25rem}}.group.toaster .dark\:group-\[\.toaster\]\:text-foreground:is(.dark *){color:hsl(var(--foreground))}.dark\:\*\:data-\[slot\=card\]\:bg-card[data-slot=card]>*:is(.dark *){background-color:hsl(var(--card))}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:flex{display:flex}.sm\:max-w-\[250px\]{max-width:250px}.sm\:max-w-\[500px\]{max-width:500px}.sm\:max-w-md{max-width:28rem}.sm\:max-w-sm{max-width:24rem}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2{gap:.5rem}.sm\:gap-2\.5{gap:.625rem}.sm\:gap-3{gap:.75rem}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width: 768px){.md\:block{display:block}.md\:flex{display:flex}.md\:gap-6{gap:1.5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:opacity-0{opacity:0}.after\:md\:hidden:after{content:var(--tw-content);display:none}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:m-2{margin:.5rem}.peer[data-state=collapsed][data-variant=inset]~.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2{margin-left:.5rem}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:ml-0{margin-left:0}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:rounded-xl{border-radius:.75rem}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}}@media (min-width: 1024px){.lg\:gap-2{gap:.5rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\:last-child\]\:truncate>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>svg\]\:size-4>svg{width:1rem;height:1rem}.\[\&\>svg\]\:h-2\.5>svg{height:.625rem}.\[\&\>svg\]\:h-3>svg{height:.75rem}.\[\&\>svg\]\:h-3\.5>svg{height:.875rem}.\[\&\>svg\]\:w-2\.5>svg{width:.625rem}.\[\&\>svg\]\:w-3>svg{width:.75rem}.\[\&\>svg\]\:w-3\.5>svg{width:.875rem}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-muted-foreground>svg{color:hsl(var(--muted-foreground))}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:hsl(var(--sidebar-accent-foreground))}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:hsl(var(--muted-foreground))}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke="#ccc"]{stroke:hsl(var(--border) / .5)}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:hsl(var(--border))}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer{outline:2px solid transparent;outline-offset:2px}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector,.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:hsl(var(--muted))}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-sector\]\:outline-none .recharts-sector,.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{outline:2px solid transparent;outline-offset:2px}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:-.5rem}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:-.5rem}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}
@@ -0,0 +1,34 @@
1
+ var da=Object.defineProperty;var ua=(a,t,s)=>t in a?da(a,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[t]=s;var U=(a,t,s)=>ua(a,typeof t!="symbol"?t+"":t,s);import{c as pt,d as gt,u as xt,r as o,t as j,j as e,S as pe,R as Vt,O as Ke,P as Ft,C as Je,a as bt,X as wt,b as Ge,D as Xe,e as Ht,f as Kt,g as ma,h as fa,i as ha,k as pa,l as ga,L as Jt,I as xa,m as Gt,n as ba,o as Pe,p as Xt,q as wa,s as Zt,v as Yt,w as Qt,A as es,x as ts,y as Sa,B as va,E as ja,F as Ne,W as Wt,G as zt,H as ss,J as ya,K as Ie,M as as,N as Na,Q as Ca,U as ka,V as Te,Y as Re,Z as rs,_ as Ea,$ as ns,a0 as os,a1 as Pa,a2 as is,a3 as cs,a4 as Ia,a5 as ls,a6 as Ta,a7 as ds,a8 as Ra,a9 as us,aa as ms,ab as Ma,ac as Wa,ad as fs,ae as za,af as Da,ag as $a,ah as Aa,ai as ye,aj as La,ak as Oa,al as Fe,am as hs,an as Ua,ao as Dt,ap as $t,aq as _a,ar as Ba,as as qa,at as nt,au as lt,av as Va,aw as ps,ax as Fa,ay as Ha,az as Ka,aA as gs,aB as xs,aC as bs,aD as Ja,aE as Ga,aF as ot,aG as Xa,aH as Za,aI as Ya,aJ as Qa}from"./react-vendor-BQ8xrEQC.js";import{t as er,c as ws,a as Me,T as tr}from"./utils-CL_mhP_N.js";import{z as H,o as Ss,b as sr,_ as ar,s as At,c as rr}from"./form-utils-BLxfHi50.js";import"./radix-ui-BA32w1ww.js";import"./vendor-DCIxzvIG.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))r(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const c of i.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&r(c)}).observe(document,{childList:!0,subtree:!0});function s(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerPolicy&&(i.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?i.credentials="include":n.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(n){if(n.ep)return;n.ep=!0;const i=s(n);fetch(n.href,i)}})();class nr{constructor(t){U(this,"baseUrl");if(t)this.baseUrl=t;else{const s=window.location.protocol,r=window.location.hostname,n=window.location.port;this.baseUrl=`${s}//${r}${n?`:${n}`:""}`}}async request(t,s={}){var c;const r=`${this.baseUrl}${t}`,n={headers:{"Content-Type":"application/json",...s.headers}},i=await fetch(r,{...n,...s});if(!i.ok){let f=`HTTP ${i.status}: ${i.statusText}`;try{f=((c=(await i.json()).error)==null?void 0:c.message)||f}catch{}throw new Error(f)}return i.json()}async getConfig(){const t=await this.request("/api/config");if(!t.success||!t.data)throw new Error("获取配置失败");return t.data}async updateConfig(t){const s=await this.request("/api/config",{method:"PUT",body:JSON.stringify(t)});if(!s.success)throw new Error(s.message||"配置更新失败")}async getMcpEndpoint(){const t=await this.request("/api/config/mcp-endpoint");if(!t.success||!t.data)throw new Error("获取 MCP 端点失败");return t.data.endpoint}async getMcpEndpoints(){const t=await this.request("/api/config/mcp-endpoints");if(!t.success||!t.data)throw new Error("获取 MCP 端点列表失败");return t.data.endpoints}async getMcpServers(){const t=await this.request("/api/config/mcp-servers");if(!t.success||!t.data)throw new Error("获取 MCP 服务配置失败");return t.data.servers}async getConnectionConfig(){const t=await this.request("/api/config/connection");if(!t.success||!t.data)throw new Error("获取连接配置失败");return t.data.connection}async reloadConfig(){const t=await this.request("/api/config/reload",{method:"POST"});if(!t.success||!t.data)throw new Error("重新加载配置失败");return t.data}async getConfigPath(){const t=await this.request("/api/config/path");if(!t.success||!t.data)throw new Error("获取配置文件路径失败");return t.data.path}async checkConfigExists(){var s;const t=await this.request("/api/config/exists");if(!t.success||((s=t.data)==null?void 0:s.exists)===void 0)throw new Error("检查配置是否存在失败");return t.data.exists}async getStatus(){const t=await this.request("/api/status");if(!t.success||!t.data)throw new Error("获取状态失败");return t.data}async getClientStatus(){const t=await this.request("/api/status/client");if(!t.success||!t.data)throw new Error("获取客户端状态失败");return t.data}async getRestartStatus(){const t=await this.request("/api/status/restart");if(!t.success)throw new Error("获取重启状态失败");return t.data||null}async checkClientConnected(){var s;const t=await this.request("/api/status/connected");if(!t.success||((s=t.data)==null?void 0:s.connected)===void 0)throw new Error("检查客户端连接失败");return t.data.connected}async getLastHeartbeat(){var s;const t=await this.request("/api/status/heartbeat");if(!t.success)throw new Error("获取最后心跳时间失败");return((s=t.data)==null?void 0:s.lastHeartbeat)||null}async getActiveMCPServers(){const t=await this.request("/api/status/mcp-servers");if(!t.success||!t.data)throw new Error("获取活跃 MCP 服务器失败");return t.data.servers}async updateClientStatus(t){const s=await this.request("/api/status/client",{method:"PUT",body:JSON.stringify(t)});if(!s.success)throw new Error(s.message||"更新客户端状态失败")}async setActiveMCPServers(t){const s=await this.request("/api/status/mcp-servers",{method:"PUT",body:JSON.stringify({servers:t})});if(!s.success)throw new Error(s.message||"设置活跃 MCP 服务器失败")}async resetStatus(){const t=await this.request("/api/status/reset",{method:"POST"});if(!t.success)throw new Error(t.message||"重置状态失败")}async addCustomTool(t,s,r,n){if(typeof t=="object"&&"type"in t&&"data"in t){const f=await this.request("/api/tools/custom",{method:"POST",body:JSON.stringify(t)});if(!f.success||!f.data)throw new Error(f.message||"添加自定义工具失败");return f.data.tool}const i=t,c=await this.request("/api/tools/custom",{method:"POST",body:JSON.stringify({workflow:i,customName:s,customDescription:r,parameterConfig:n})});if(!c.success||!c.data)throw new Error(c.message||"添加自定义工具失败");return c.data.tool}async updateCustomTool(t,s){const r=await this.request(`/api/tools/custom/${encodeURIComponent(t)}`,{method:"PUT",body:JSON.stringify(s)});if(!r.success||!r.data)throw new Error(r.message||"更新自定义工具失败");return r.data.tool}async removeCustomTool(t){const s=await this.request(`/api/tools/custom/${encodeURIComponent(t)}`,{method:"DELETE"});if(!s.success)throw new Error(s.message||"删除自定义工具失败")}async getCustomTools(){const t=await this.request("/api/tools/custom");if(!t.success||!t.data)throw new Error("获取自定义工具列表失败");return t.data.tools}async getToolsList(t="all"){const s=new URLSearchParams;t!=="all"&&s.append("status",t);const r=`/api/tools/list${s.toString()?`?${s.toString()}`:""}`,n=await this.request(r);if(!n.success||!n.data)throw new Error("获取工具列表失败");return n.data.list}async restartService(){const t=await this.request("/api/services/restart",{method:"POST"});if(!t.success)throw new Error(t.message||"重启服务失败")}async stopService(){const t=await this.request("/api/services/stop",{method:"POST"});if(!t.success)throw new Error(t.message||"停止服务失败")}async startService(){const t=await this.request("/api/services/start",{method:"POST"});if(!t.success)throw new Error(t.message||"启动服务失败")}async getServiceStatus(){const t=await this.request("/api/services/status");if(!t.success||!t.data)throw new Error("获取服务状态失败");return t.data}async getServiceHealth(){const t=await this.request("/api/services/health");if(!t.success||!t.data)throw new Error("获取服务健康状态失败");return t.data}async getVersion(){const t=await this.request("/api/version");if(!t.success||!t.data)throw new Error("获取版本信息失败");return t.data}async getVersionSimple(){const t=await this.request("/api/version/simple");if(!t.success||!t.data)throw new Error("获取版本号失败");return t.data}async clearVersionCache(){const t=await this.request("/api/version/cache/clear",{method:"POST"});if(!t.success)throw new Error(t.message||"清除版本缓存失败")}async updateVersion(t){const s=await this.request("/api/update",{method:"POST",body:JSON.stringify({version:t})});if(!s.success)throw new Error(s.message||"版本更新失败");return s.data}async getEndpointStatus(t){const s=await this.request(`/api/endpoints/${encodeURIComponent(t)}/status`);if(!s.success||!s.data)throw new Error("获取接入点状态失败");return s.data}async connectEndpoint(t){const s=await this.request(`/api/endpoints/${encodeURIComponent(t)}/connect`,{method:"POST"});if(!s.success)throw new Error(s.message||"连接接入点失败")}async disconnectEndpoint(t){const s=await this.request(`/api/endpoints/${encodeURIComponent(t)}/disconnect`,{method:"POST"});if(!s.success)throw new Error(s.message||"断开接入点失败")}async reconnectEndpoint(t){const s=await this.request(`/api/endpoints/${encodeURIComponent(t)}/reconnect`,{method:"POST"});if(!s.success)throw new Error(s.message||"重连接入点失败")}async addEndpoint(t){const s=await this.request("/api/endpoints/add",{method:"POST",body:JSON.stringify({endpoint:t})});if(!s.success||!s.data)throw new Error(s.message||"添加接入点失败");return s.data}async removeEndpoint(t){const s=await this.request(`/api/endpoints/${encodeURIComponent(t)}`,{method:"DELETE"});if(!s.success)throw new Error(s.message||"移除接入点失败")}async addMCPServer(t,s){const r={name:t,config:s},n=await this.request("/api/mcp-servers",{method:"POST",body:JSON.stringify(r)});if(!n.success||!n.data)throw new Error(n.message||"添加 MCP 服务器失败");return n.data}async removeMCPServer(t){const s=await this.request(`/api/mcp-servers/${encodeURIComponent(t)}`,{method:"DELETE"});if(!s.success||!s.data)throw new Error(s.message||"删除 MCP 服务器失败");return s.data}async getMCPServerStatus(t){const s=await this.request(`/api/mcp-servers/${encodeURIComponent(t)}/status`);if(!s.success||!s.data)throw new Error(s.message||"获取 MCP 服务器状态失败");return s.data}async listMCPServers(){const t=await this.request("/api/mcp-servers");if(!t.success||!t.data)throw new Error(t.message||"获取 MCP 服务器列表失败");return t.data}async checkMCPServerExists(t){var s;try{const r=await this.request(`/api/mcp-servers/${encodeURIComponent(t)}/exists`);return r.success&&((s=r.data)==null?void 0:s.exists)||!1}catch(r){if(r instanceof Error&&r.message.includes("404"))return!1;throw r}}async updateMCPServer(t,s){const r=await this.request(`/api/mcp-servers/${encodeURIComponent(t)}`,{method:"PUT",body:JSON.stringify({config:s})});if(!r.success||!r.data)throw new Error(r.message||"更新 MCP 服务器配置失败");return r.data}async restartMCPServer(t){const s=await this.request(`/api/mcp-servers/${encodeURIComponent(t)}/restart`,{method:"POST"});if(!s.success||!s.data)throw new Error(s.message||"重启 MCP 服务器失败");return s.data}}const A=new nr,dt={addServer:async(a,t)=>await A.addMCPServer(a,t),removeServer:async a=>await A.removeMCPServer(a),listServers:async()=>await A.listMCPServers(),getServerStatus:async a=>await A.getMCPServerStatus(a),serverExists:async a=>await A.checkMCPServerExists(a),updateServer:async(a,t)=>await A.updateMCPServer(a,t),restartServer:async a=>await A.restartMCPServer(a)};var J=(a=>(a.DISCONNECTED="disconnected",a.CONNECTING="connecting",a.CONNECTED="connected",a.RECONNECTING="reconnecting",a))(J||{});class or{constructor(){U(this,"listeners",new Map)}on(t,s){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(s),()=>{this.off(t,s)}}off(t,s){const r=this.listeners.get(t);r&&(r.delete(s),r.size===0&&this.listeners.delete(t))}emit(t,s){const r=this.listeners.get(t);if(r)for(const n of r)try{n(s)}catch(i){console.error(`[EventBus] 事件监听器执行失败 (${t}):`,i)}}clear(){this.listeners.clear()}getListenerCount(t){var s;return t?((s=this.listeners.get(t))==null?void 0:s.size)||0:Array.from(this.listeners.values()).reduce((r,n)=>r+n.size,0)}}const F=class F{constructor(t={}){U(this,"ws",null);U(this,"url");U(this,"state","disconnected");U(this,"eventBus",new or);U(this,"legacyListeners",{});U(this,"reconnectAttempts",0);U(this,"maxReconnectAttempts");U(this,"reconnectInterval");U(this,"reconnectTimer");U(this,"heartbeatTimer");U(this,"heartbeatInterval");U(this,"heartbeatTimeout");U(this,"lastHeartbeat",0);this.url=t.url||this.getDefaultWebSocketUrl(),this.maxReconnectAttempts=t.maxReconnectAttempts||5,this.reconnectInterval=t.reconnectInterval||3e3,this.heartbeatInterval=t.heartbeatInterval||3e4,this.heartbeatTimeout=t.heartbeatTimeout||35e3,this.setupLegacyEventBridge()}static getInstance(t){if(F.instance)return F.instance;if(F.isCreating)throw new Error("[WebSocketManager] 检测到循环创建,请检查代码逻辑");F.isCreating=!0;try{return F.instance=new F(t),console.log("[WebSocketManager] 单例实例已创建"),F.instance}finally{F.isCreating=!1}}static resetInstance(){F.instance&&(F.instance.disconnect(),F.instance.eventBus.clear(),F.instance=null,console.log("[WebSocketManager] 单例实例已重置"))}setupLegacyEventBridge(){this.eventBus.on("connection:connected",()=>{var t,s;(s=(t=this.legacyListeners).connected)==null||s.call(t)}),this.eventBus.on("connection:disconnected",()=>{var t,s;(s=(t=this.legacyListeners).disconnected)==null||s.call(t)}),this.eventBus.on("connection:error",({error:t})=>{var s,r;(r=(s=this.legacyListeners).error)==null||r.call(s,t)}),this.eventBus.on("data:configUpdate",t=>{var s,r;(r=(s=this.legacyListeners).configUpdate)==null||r.call(s,t)}),this.eventBus.on("data:statusUpdate",t=>{var s,r;(r=(s=this.legacyListeners).statusUpdate)==null||r.call(s,t)}),this.eventBus.on("data:restartStatus",t=>{var s,r;(r=(s=this.legacyListeners).restartStatus)==null||r.call(s,t)})}getDefaultWebSocketUrl(){const t=localStorage.getItem("xiaozhi-ws-url");if(t)return t;const s=window.location.protocol==="https:"?"wss:":"ws:",r=window.location.hostname,n=window.location.port==="5173"?9999:window.location.port;return`${s}//${r}${n?`:${n}`:""}`}connect(){if(!(this.state==="connected"||this.state==="connecting")){this.state="connecting",console.log(`[WebSocket] 连接到: ${this.url}`),this.eventBus.emit("connection:connecting",void 0);try{this.ws=new WebSocket(this.url),this.setupEventHandlers()}catch(t){console.error("[WebSocket] 连接失败:",t),this.handleConnectionError(t)}}}disconnect(){console.log("[WebSocket] 主动断开连接"),this.clearTimers(),this.state="disconnected",this.reconnectAttempts=0,this.ws&&(this.ws.close(),this.ws=null)}subscribe(t,s){return this.eventBus.on(t,s)}unsubscribe(t,s){this.eventBus.off(t,s)}getEventBus(){return this.eventBus}on(t,s){console.warn("[WebSocketManager] on() 方法已废弃,请使用 subscribe() 方法"),this.legacyListeners[t]=s}off(t){console.warn("[WebSocketManager] off() 方法已废弃,请使用 unsubscribe() 方法"),delete this.legacyListeners[t]}getState(){return this.state}isConnected(){var t;return this.state==="connected"&&((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN}setUrl(t){this.url!==t&&(this.url=t,localStorage.setItem("xiaozhi-ws-url",t),this.isConnected()&&(this.disconnect(),setTimeout(()=>this.connect(),1e3)))}send(t){if(!this.isConnected())return console.warn("[WebSocket] 连接未建立,无法发送消息"),!1;try{const s=typeof t=="string"?t:JSON.stringify(t);return this.ws.send(s),!0}catch(s){return console.error("[WebSocket] 发送消息失败:",s),this.eventBus.emit("connection:error",{error:s,context:"send_message"}),!1}}getUrl(){return this.url}getConnectionStats(){return{state:this.state,url:this.url,reconnectAttempts:this.reconnectAttempts,maxReconnectAttempts:this.maxReconnectAttempts,lastHeartbeat:this.lastHeartbeat,eventListenerCount:this.eventBus.getListenerCount()}}setupEventHandlers(){this.ws&&(this.ws.onopen=()=>{console.log("[WebSocket] 连接已建立"),this.state="connected",this.reconnectAttempts=0,this.startHeartbeat(),this.eventBus.emit("connection:connected",void 0)},this.ws.onmessage=t=>{try{const s=JSON.parse(t.data);this.handleMessage(s)}catch(s){console.error("[WebSocket] 消息解析失败:",s)}},this.ws.onclose=t=>{console.log(`[WebSocket] 连接已关闭 (code: ${t.code})`),this.handleConnectionClose()},this.ws.onerror=t=>{console.error("[WebSocket] 连接错误:",t),this.handleConnectionError(new Error("WebSocket 连接错误"))})}handleMessage(t){var s;console.log("[WebSocket] 收到消息:",t.type),this.eventBus.emit("system:message",t);try{switch(t.type){case"configUpdate":case"config":t.data&&this.eventBus.emit("data:configUpdate",t.data);break;case"statusUpdate":case"status":t.data&&this.eventBus.emit("data:statusUpdate",t.data);break;case"restartStatus":t.data&&this.eventBus.emit("data:restartStatus",t.data);break;case"endpoint_status_changed":t.data&&this.eventBus.emit("data:endpointStatusChanged",t.data);break;case"npm:install:started":t.data&&this.eventBus.emit("data:npmInstallStarted",t.data);break;case"npm:install:log":t.data&&this.eventBus.emit("data:npmInstallLog",t.data);break;case"npm:install:completed":t.data&&this.eventBus.emit("data:npmInstallCompleted",t.data);break;case"npm:install:failed":t.data&&this.eventBus.emit("data:npmInstallFailed",t.data);break;case"heartbeatResponse":this.lastHeartbeat=Date.now(),this.eventBus.emit("system:heartbeat",{timestamp:this.lastHeartbeat});break;case"error":{const r=new Error(((s=t.error)==null?void 0:s.message)||"服务器错误");console.error("[WebSocket] 服务器错误:",t.error),this.eventBus.emit("system:error",{error:r,message:t}),this.eventBus.emit("connection:error",{error:r,context:"server_error"});break}default:console.log("[WebSocket] 未处理的消息类型:",t.type)}}catch(r){console.error("[WebSocket] 消息处理失败:",r),this.eventBus.emit("system:error",{error:r,message:t})}}handleConnectionClose(){this.state="disconnected",this.clearTimers(),this.eventBus.emit("connection:disconnected",void 0),this.reconnectAttempts<this.maxReconnectAttempts?this.scheduleReconnect():(console.error("[WebSocket] 达到最大重连次数,停止重连"),this.eventBus.emit("connection:error",{error:new Error("达到最大重连次数"),context:"max_reconnect_attempts"}))}handleConnectionError(t){this.state="disconnected",this.clearTimers(),this.eventBus.emit("connection:error",{error:t,context:"connection_error"}),this.reconnectAttempts<this.maxReconnectAttempts?this.scheduleReconnect():console.error("[WebSocket] 达到最大重连次数,停止重连")}scheduleReconnect(){this.reconnectAttempts++,this.state="reconnecting",console.log(`[WebSocket] 安排重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts}) 在 ${this.reconnectInterval}ms 后`),this.eventBus.emit("connection:reconnecting",{attempt:this.reconnectAttempts,maxAttempts:this.maxReconnectAttempts}),this.reconnectTimer=setTimeout(()=>{this.connect()},this.reconnectInterval)}startHeartbeat(){this.lastHeartbeat=Date.now(),this.heartbeatTimer=setInterval(()=>{this.isConnected()&&(this.sendHeartbeat(),Date.now()-this.lastHeartbeat>this.heartbeatTimeout&&(console.warn("[WebSocket] 心跳超时,重新连接"),this.disconnect(),this.connect()))},this.heartbeatInterval)}sendHeartbeat(){var t;if(this.isConnected()){const s={type:"clientStatus",data:{status:"connected",timestamp:Date.now()}};(t=this.ws)==null||t.send(JSON.stringify(s))}}clearTimers(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0)}};U(F,"instance",null),U(F,"isCreating",!1);let ut=F;const $=ut.getInstance(),Lt={clientStatus:null,restartStatus:null,serviceStatus:null,serviceHealth:null,fullStatus:null,loading:{isLoading:!1,isRefreshing:!1,isRestarting:!1,lastUpdated:null,lastError:null},polling:{enabled:!1,interval:3e4,maxRetries:3,currentRetries:0},restartPolling:{enabled:!1,interval:1e3,maxAttempts:60,currentAttempts:0,timeout:6e4,startTime:null},lastSource:null};let Be=null,qe=null;const ae=pt()(gt((a,t)=>({...Lt,setClientStatus:(s,r="http")=>{console.log(`[StatusStore] 设置客户端状态,来源: ${r}`),a(n=>({clientStatus:s,lastSource:r,loading:{...n.loading,lastUpdated:Date.now(),lastError:null}}),!1,"setClientStatus")},setRestartStatus:(s,r="http")=>{console.log(`[StatusStore] 设置重启状态,来源: ${r}`),a(n=>({restartStatus:s,lastSource:r,loading:{...n.loading,lastUpdated:Date.now(),lastError:null}}),!1,"setRestartStatus")},setServiceStatus:s=>{console.log("[StatusStore] 设置服务状态"),a({serviceStatus:s},!1,"setServiceStatus")},setServiceHealth:s=>{console.log("[StatusStore] 设置服务健康状态"),a({serviceHealth:s},!1,"setServiceHealth")},setFullStatus:(s,r="http")=>{console.log(`[StatusStore] 设置完整状态,来源: ${r}`),a(n=>({fullStatus:s,clientStatus:s.client,restartStatus:s.restart||null,lastSource:r,loading:{...n.loading,lastUpdated:Date.now(),lastError:null}}),!1,"setFullStatus")},setLoading:s=>{a(r=>({loading:{...r.loading,...s}}),!1,"setLoading")},setError:s=>{a(r=>({loading:{...r.loading,lastError:s}}),!1,"setError")},getStatus:async()=>{const{fullStatus:s,loading:r}=t();return s&&r.lastUpdated&&Date.now()-r.lastUpdated<30*1e3?s:t().refreshStatus()},refreshStatus:async()=>{const{setLoading:s,setFullStatus:r,setError:n,polling:i}=t();try{s({isRefreshing:!0,lastError:null}),console.log("[StatusStore] 开始刷新状态");const c=await A.getStatus();return r(c,"http"),i.enabled&&t().setPollingConfig({currentRetries:0}),console.log("[StatusStore] 状态刷新成功"),c}catch(c){const f=c instanceof Error?c:new Error("状态刷新失败");if(console.error("[StatusStore] 状态刷新失败:",f),n(f),i.enabled){const b=i.currentRetries+1;t().setPollingConfig({currentRetries:b}),b>=i.maxRetries&&(console.warn("[StatusStore] 达到最大重试次数,停止轮询"),t().stopPolling())}throw f}finally{s({isRefreshing:!1})}},restartService:async()=>{const{setLoading:s,setRestartStatus:r,setError:n,startRestartPolling:i}=t();try{s({isRestarting:!0,lastError:null}),console.log("[StatusStore] 开始重启服务"),r({status:"restarting",timestamp:Date.now()},"http"),await A.restartService(),console.log("[StatusStore] 服务重启请求已发送,开始重连检查"),i()}catch(c){const f=c instanceof Error?c:new Error("服务重启失败");throw console.error("[StatusStore] 服务重启失败:",f),r({status:"failed",error:f.message,timestamp:Date.now()},"http"),n(f),s({isRestarting:!1}),f}},getServiceStatus:async()=>{try{console.log("[StatusStore] 获取服务状态");const s=await A.getServiceStatus();return t().setServiceStatus(s),s}catch(s){const r=s instanceof Error?s:new Error("获取服务状态失败");throw console.error("[StatusStore] 获取服务状态失败:",r),t().setError(r),r}},getServiceHealth:async()=>{try{console.log("[StatusStore] 获取服务健康状态");const s=await A.getServiceHealth();return t().setServiceHealth(s),s}catch(s){const r=s instanceof Error?s:new Error("获取服务健康状态失败");throw console.error("[StatusStore] 获取服务健康状态失败:",r),t().setError(r),r}},startPolling:(s=3e4)=>{const{polling:r,refreshStatus:n}=t();if(r.enabled){console.log("[StatusStore] 轮询已启用,跳过启动");return}console.log(`[StatusStore] 启动状态轮询,间隔: ${s}ms`),a(i=>({polling:{...i.polling,enabled:!0,interval:s,currentRetries:0}}),!1,"startPolling"),n().catch(i=>{console.error("[StatusStore] 轮询初始刷新失败:",i)}),Be=setInterval(()=>{t().polling.enabled&&n().catch(c=>{console.error("[StatusStore] 轮询刷新失败:",c)})},s)},stopPolling:()=>{console.log("[StatusStore] 停止状态轮询"),a(s=>({polling:{...s.polling,enabled:!1,currentRetries:0}}),!1,"stopPolling"),Be&&(clearInterval(Be),Be=null)},setPollingConfig:s=>{a(r=>({polling:{...r.polling,...s}}),!1,"setPollingConfig")},startRestartPolling:()=>{const{restartPolling:s,refreshStatus:r,setRestartStatus:n,setLoading:i}=t();if(s.enabled){console.log("[StatusStore] 重启轮询已启用,跳过启动");return}console.log("[StatusStore] 启动重启后重连检查轮询");const c=Date.now();a(f=>({restartPolling:{...f.restartPolling,enabled:!0,currentAttempts:0,startTime:c}}),!1,"startRestartPolling"),qe=setInterval(async()=>{var x;const f=t(),{restartPolling:b}=f;if(!b.enabled)return;const h=Date.now()-(b.startTime||0),m=b.currentAttempts+1;console.log(`[StatusStore] 重启重连检查 (第 ${m} 次,已用时 ${Math.round(h/1e3)}s)`);try{if(((x=(await r()).client)==null?void 0:x.status)==="connected"){console.log("[StatusStore] 服务重连成功,停止重启轮询"),n({status:"completed",timestamp:Date.now()},"polling"),f.stopRestartPolling(),i({isRestarting:!1});return}f.setRestartPollingConfig({currentAttempts:m}),(h>=b.timeout||m>=b.maxAttempts)&&(console.warn("[StatusStore] 重启重连检查超时或达到最大尝试次数"),n({status:"failed",error:"重连超时,服务可能未成功重启",timestamp:Date.now()},"polling"),f.stopRestartPolling(),i({isRestarting:!1}))}catch(d){console.log(`[StatusStore] 重启重连检查失败 (第 ${m} 次):`,d),f.setRestartPollingConfig({currentAttempts:m}),(h>=b.timeout||m>=b.maxAttempts)&&(console.error("[StatusStore] 重启重连检查超时或达到最大尝试次数"),n({status:"failed",error:"重连超时,服务可能未成功重启",timestamp:Date.now()},"polling"),f.stopRestartPolling(),i({isRestarting:!1}))}},s.interval)},stopRestartPolling:()=>{console.log("[StatusStore] 停止重启轮询"),a(s=>({restartPolling:{...s.restartPolling,enabled:!1,currentAttempts:0,startTime:null}}),!1,"stopRestartPolling"),qe&&(clearInterval(qe),qe=null)},setRestartPollingConfig:s=>{a(r=>({restartPolling:{...r.restartPolling,...s}}),!1,"setRestartPollingConfig")},reset:()=>{console.log("[StatusStore] 重置状态"),t().stopPolling(),t().stopRestartPolling(),a(Lt,!1,"reset")},initialize:async()=>{const{setLoading:s,refreshStatus:r}=t();try{s({isLoading:!0}),console.log("[StatusStore] 初始化状态 Store"),$.subscribe("data:statusUpdate",n=>{console.log("[StatusStore] 收到 WebSocket 状态更新"),t().setClientStatus(n,"websocket")}),$.subscribe("data:restartStatus",n=>{console.log("[StatusStore] 收到 WebSocket 重启状态更新"),t().setRestartStatus(n,"websocket")}),await r(),console.log("[StatusStore] 状态 Store 初始化完成")}catch(n){throw console.error("[StatusStore] 状态 Store 初始化失败:",n),n}finally{s({isLoading:!1})}}}),{name:"status-store"})),ir=()=>ae(a=>a.clientStatus),vs=()=>ae(a=>a.restartStatus),js=()=>ae(a=>a.restartPolling),cr=()=>ae(xt(a=>({getStatus:a.getStatus,refreshStatus:a.refreshStatus,restartService:a.restartService,getServiceStatus:a.getServiceStatus,getServiceHealth:a.getServiceHealth,startPolling:a.startPolling,stopPolling:a.stopPolling,setPollingConfig:a.setPollingConfig,startRestartPolling:a.startRestartPolling,stopRestartPolling:a.stopRestartPolling,setRestartPollingConfig:a.setRestartPollingConfig,reset:a.reset,initialize:a.initialize})));function lr(){const a=vs(),t=js(),s=o.useRef(null),r=o.useRef(null);o.useEffect(()=>{if(!a)return;const{status:n,timestamp:i,error:c}=a;if(!(s.current===n&&r.current===i))switch(s.current=n,r.current=i,n){case"restarting":j.info("正在重启服务...",{id:"restart-status-progress",description:"请耐心等待",duration:0});break;case"completed":{const f=t.enabled?`服务重启成功!重连检查完成 (${t.currentAttempts}次检查)`:"服务重启成功!";j.dismiss("restart-status-progress"),j.success(f,{id:"restart-status-success",description:"服务已恢复正常运行"});break}case"failed":{const f=c||"服务重启失败",b=t.enabled?`重连检查超时 (${t.currentAttempts}/${t.maxAttempts}次)`:"请检查服务状态或稍后重试";j.dismiss("restart-status-progress"),j.error(f,{id:"restart-status-failed",description:b});break}}},[a,t]),o.useEffect(()=>()=>{s.current=null,r.current=null},[])}function dr(){return lr(),null}function w(...a){return er(ws(a))}const St=Me("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),N=o.forwardRef(({className:a,variant:t,size:s,asChild:r=!1,...n},i)=>{const c=r?pe:"button";return e.jsx(c,{className:w(St({variant:t,size:s,className:a})),ref:i,...n})});N.displayName="Button";const te=o.forwardRef(({className:a,type:t,...s},r)=>e.jsx("input",{type:t,className:w("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",a),ref:r,"data-1p-ignore":!0,...s}));te.displayName="Input";const vt=o.forwardRef(({className:a,orientation:t="horizontal",decorative:s=!0,...r},n)=>e.jsx(Vt,{ref:n,decorative:s,orientation:t,className:w("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",a),...r}));vt.displayName=Vt.displayName;const ur=Ht,mr=Ft,ys=o.forwardRef(({className:a,...t},s)=>e.jsx(Ke,{className:w("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...t,ref:s}));ys.displayName=Ke.displayName;const fr=Me("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),Ns=o.forwardRef(({side:a="right",className:t,children:s,...r},n)=>e.jsxs(mr,{children:[e.jsx(ys,{}),e.jsxs(Je,{ref:n,className:w(fr({side:a}),t),...r,children:[s,e.jsxs(bt,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",children:[e.jsx(wt,{className:"h-4 w-4"}),e.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));Ns.displayName=Je.displayName;const Cs=({className:a,...t})=>e.jsx("div",{className:w("flex flex-col space-y-2 text-center sm:text-left",a),...t});Cs.displayName="SheetHeader";const ks=o.forwardRef(({className:a,...t},s)=>e.jsx(Ge,{ref:s,className:w("text-lg font-semibold text-foreground",a),...t}));ks.displayName=Ge.displayName;const Es=o.forwardRef(({className:a,...t},s)=>e.jsx(Xe,{ref:s,className:w("text-sm text-muted-foreground",a),...t}));Es.displayName=Xe.displayName;function be({className:a,...t}){return e.jsx("div",{className:w("animate-pulse rounded-md bg-muted",a),...t})}const Ps=ma,Is=fa,Ts=ha,jt=o.forwardRef(({className:a,sideOffset:t=4,...s},r)=>e.jsx(Kt,{ref:r,sideOffset:t,className:w("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",a),...s}));jt.displayName=Kt.displayName;const it=768;function hr(){const[a,t]=o.useState(void 0);return o.useEffect(()=>{const s=window.matchMedia(`(max-width: ${it-1}px)`),r=()=>{t(window.innerWidth<it)};return s.addEventListener("change",r),t(window.innerWidth<it),()=>s.removeEventListener("change",r)},[]),!!a}const pr="sidebar_state",gr=60*60*24*7,xr="16rem",br="18rem",wr="3rem",Sr="b",Rs=o.createContext(null);function Ze(){const a=o.useContext(Rs);if(!a)throw new Error("useSidebar must be used within a SidebarProvider.");return a}const yt=o.forwardRef(({defaultOpen:a=!0,open:t,onOpenChange:s,className:r,style:n,children:i,...c},f)=>{const b=hr(),[h,m]=o.useState(!1),[x,d]=o.useState(a),l=t??x,g=o.useCallback(P=>{const I=typeof P=="function"?P(l):P;s?s(I):d(I),document.cookie=`${pr}=${I}; path=/; max-age=${gr}`},[s,l]),v=o.useCallback(()=>b?m(P=>!P):g(P=>!P),[b,g]);o.useEffect(()=>{const P=I=>{I.key===Sr&&(I.metaKey||I.ctrlKey)&&(I.preventDefault(),v())};return window.addEventListener("keydown",P),()=>window.removeEventListener("keydown",P)},[v]);const p=l?"expanded":"collapsed",C=o.useMemo(()=>({state:p,open:l,setOpen:g,isMobile:b,openMobile:h,setOpenMobile:m,toggleSidebar:v}),[p,l,g,b,h,v]);return e.jsx(Rs.Provider,{value:C,children:e.jsx(Ps,{delayDuration:0,children:e.jsx("div",{style:{"--sidebar-width":xr,"--sidebar-width-icon":wr,...n},className:w("group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",r),ref:f,...c,children:i})})})});yt.displayName="SidebarProvider";const Ms=o.forwardRef(({side:a="left",variant:t="sidebar",collapsible:s="offcanvas",className:r,children:n,...i},c)=>{const{isMobile:f,state:b,openMobile:h,setOpenMobile:m}=Ze();return s==="none"?e.jsx("div",{className:w("flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground",r),ref:c,...i,children:n}):f?e.jsx(ur,{open:h,onOpenChange:m,...i,children:e.jsxs(Ns,{"data-sidebar":"sidebar","data-mobile":"true",className:"w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",style:{"--sidebar-width":br},side:a,children:[e.jsxs(Cs,{className:"sr-only",children:[e.jsx(ks,{children:"Sidebar"}),e.jsx(Es,{children:"Displays the mobile sidebar."})]}),e.jsx("div",{className:"flex h-full w-full flex-col",children:n})]})}):e.jsxs("div",{ref:c,className:"group peer hidden text-sidebar-foreground md:block","data-state":b,"data-collapsible":b==="collapsed"?s:"","data-variant":t,"data-side":a,children:[e.jsx("div",{className:w("relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear","group-data-[collapsible=offcanvas]:w-0","group-data-[side=right]:rotate-180",t==="floating"||t==="inset"?"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]":"group-data-[collapsible=icon]:w-[--sidebar-width-icon]")}),e.jsx("div",{className:w("fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",a==="left"?"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]":"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",t==="floating"||t==="inset"?"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]":"group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",r),...i,children:e.jsx("div",{"data-sidebar":"sidebar",className:"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow",children:n})})]})});Ms.displayName="Sidebar";const Ws=o.forwardRef(({className:a,onClick:t,...s},r)=>{const{toggleSidebar:n}=Ze();return e.jsxs(N,{ref:r,"data-sidebar":"trigger",variant:"ghost",size:"icon",className:w("h-7 w-7",a),onClick:i=>{t==null||t(i),n()},...s,children:[e.jsx(pa,{}),e.jsx("span",{className:"sr-only",children:"Toggle Sidebar"})]})});Ws.displayName="SidebarTrigger";const vr=o.forwardRef(({className:a,...t},s)=>{const{toggleSidebar:r}=Ze();return e.jsx("button",{ref:s,"data-sidebar":"rail","aria-label":"Toggle Sidebar",tabIndex:-1,onClick:r,title:"Toggle Sidebar",className:w("absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex","[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize","[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize","group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar","[[data-side=left][data-collapsible=offcanvas]_&]:-right-2","[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",a),...t})});vr.displayName="SidebarRail";const Nt=o.forwardRef(({className:a,...t},s)=>e.jsx("main",{ref:s,className:w("relative flex w-full flex-1 flex-col bg-background","md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",a),...t}));Nt.displayName="SidebarInset";const jr=o.forwardRef(({className:a,...t},s)=>e.jsx(te,{ref:s,"data-sidebar":"input",className:w("h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",a),...t}));jr.displayName="SidebarInput";const zs=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,"data-sidebar":"header",className:w("flex flex-col gap-2 p-2",a),...t}));zs.displayName="SidebarHeader";const yr=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,"data-sidebar":"footer",className:w("flex flex-col gap-2 p-2",a),...t}));yr.displayName="SidebarFooter";const Nr=o.forwardRef(({className:a,...t},s)=>e.jsx(vt,{ref:s,"data-sidebar":"separator",className:w("mx-2 w-auto bg-sidebar-border",a),...t}));Nr.displayName="SidebarSeparator";const Ds=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,"data-sidebar":"content",className:w("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",a),...t}));Ds.displayName="SidebarContent";const $s=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,"data-sidebar":"group",className:w("relative flex w-full min-w-0 flex-col p-2",a),...t}));$s.displayName="SidebarGroup";const Cr=o.forwardRef(({className:a,asChild:t=!1,...s},r)=>{const n=t?pe:"div";return e.jsx(n,{ref:r,"data-sidebar":"group-label",className:w("flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0","group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",a),...s})});Cr.displayName="SidebarGroupLabel";const kr=o.forwardRef(({className:a,asChild:t=!1,...s},r)=>{const n=t?pe:"button";return e.jsx(n,{ref:r,"data-sidebar":"group-action",className:w("absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0","after:absolute after:-inset-2 after:md:hidden","group-data-[collapsible=icon]:hidden",a),...s})});kr.displayName="SidebarGroupAction";const As=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,"data-sidebar":"group-content",className:w("w-full text-sm",a),...t}));As.displayName="SidebarGroupContent";const Ct=o.forwardRef(({className:a,...t},s)=>e.jsx("ul",{ref:s,"data-sidebar":"menu",className:w("flex w-full min-w-0 flex-col gap-1",a),...t}));Ct.displayName="SidebarMenu";const kt=o.forwardRef(({className:a,...t},s)=>e.jsx("li",{ref:s,"data-sidebar":"menu-item",className:w("group/menu-item relative",a),...t}));kt.displayName="SidebarMenuItem";const Er=Me("peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",{variants:{variant:{default:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",outline:"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"},size:{default:"h-8 text-sm",sm:"h-7 text-xs",lg:"h-12 text-sm group-data-[collapsible=icon]:!p-0"}},defaultVariants:{variant:"default",size:"default"}}),Et=o.forwardRef(({asChild:a=!1,isActive:t=!1,variant:s="default",size:r="default",tooltip:n,className:i,...c},f)=>{const b=a?pe:"button",{isMobile:h,state:m}=Ze(),x=e.jsx(b,{ref:f,"data-sidebar":"menu-button","data-size":r,"data-active":t,className:w(Er({variant:s,size:r}),i),...c});return n?(typeof n=="string"&&(n={children:n}),e.jsxs(Is,{children:[e.jsx(Ts,{asChild:!0,children:x}),e.jsx(jt,{side:"right",align:"center",hidden:m!=="collapsed"||h,...n})]})):x});Et.displayName="SidebarMenuButton";const Pr=o.forwardRef(({className:a,asChild:t=!1,showOnHover:s=!1,...r},n)=>{const i=t?pe:"button";return e.jsx(i,{ref:n,"data-sidebar":"menu-action",className:w("absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0","after:absolute after:-inset-2 after:md:hidden","peer-data-[size=sm]/menu-button:top-1","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","group-data-[collapsible=icon]:hidden",s&&"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",a),...r})});Pr.displayName="SidebarMenuAction";const Ir=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,"data-sidebar":"menu-badge",className:w("pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground","peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground","peer-data-[size=sm]/menu-button:top-1","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","group-data-[collapsible=icon]:hidden",a),...t}));Ir.displayName="SidebarMenuBadge";const Tr=o.forwardRef(({className:a,showIcon:t=!1,...s},r)=>{const n=o.useMemo(()=>`${Math.floor(Math.random()*40)+50}%`,[]);return e.jsxs("div",{ref:r,"data-sidebar":"menu-skeleton",className:w("flex h-8 items-center gap-2 rounded-md px-2",a),...s,children:[t&&e.jsx(be,{className:"size-4 rounded-md","data-sidebar":"menu-skeleton-icon"}),e.jsx(be,{className:"h-4 max-w-[--skeleton-width] flex-1","data-sidebar":"menu-skeleton-text",style:{"--skeleton-width":n}})]})});Tr.displayName="SidebarMenuSkeleton";const Rr=o.forwardRef(({className:a,...t},s)=>e.jsx("ul",{ref:s,"data-sidebar":"menu-sub",className:w("mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5","group-data-[collapsible=icon]:hidden",a),...t}));Rr.displayName="SidebarMenuSub";const Mr=o.forwardRef(({...a},t)=>e.jsx("li",{ref:t,...a}));Mr.displayName="SidebarMenuSubItem";const Wr=o.forwardRef(({asChild:a=!1,size:t="md",isActive:s,className:r,...n},i)=>{const c=a?pe:"a";return e.jsx(c,{ref:i,"data-sidebar":"menu-sub-button","data-size":t,"data-active":s,className:w("flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground","data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",t==="sm"&&"text-xs",t==="md"&&"text-sm","group-data-[collapsible=icon]:hidden",r),...n})});Wr.displayName="SidebarMenuSubButton";function zr({items:a}){const t=ga();return e.jsx($s,{children:e.jsx(As,{className:"flex flex-col gap-2",children:e.jsx(Ct,{children:a.map(s=>{const n=t.pathname===s.url;return e.jsx(kt,{children:e.jsx(Et,{className:w("min-w-8 duration-200 ease-linear hover:bg-primary/5",n?"bg-primary text-primary-foreground duration-200 ease-linear hover:bg-primary/90 hover:text-primary-foreground active:bg-primary/90 active:text-primary-foreground":"min-w-8 duration-200 ease-linear"),tooltip:s.title,asChild:!0,children:e.jsxs(Jt,{to:s.url,children:[s.icon&&e.jsx(s.icon,{}),e.jsx("span",{children:s.title})]})})},s.title)})})})})}const Dr=Me("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function Z({className:a,variant:t,...s}){return e.jsx("div",{className:w(Dr({variant:t}),a),...s})}function Ls({className:a,showDetails:t=!1,variant:s="secondary"}){const[r,n]=o.useState(null),[i,c]=o.useState(!0),[f,b]=o.useState(null),[h,m]=o.useState(!1);o.useEffect(()=>{(async()=>{try{c(!0),b(null);const g=await A.getVersion();n(g)}catch(g){b(g instanceof Error?g.message:"获取版本信息失败"),console.error("获取版本信息失败:",g)}finally{c(!1)}})()},[]);const x=async()=>{if(r!=null&&r.version)try{await navigator.clipboard.writeText(r.version),m(!0),setTimeout(()=>m(!1),2e3)}catch(l){console.error("复制版本号失败:",l)}};if(i)return e.jsx(Z,{variant:"outline",className:a,children:e.jsx("span",{className:"text-xs",children:"加载中..."})});if(f||!r)return e.jsx(Z,{variant:"outline",className:a,children:e.jsx("span",{className:"text-xs text-muted-foreground",children:"版本未知"})});const d=e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(xa,{className:"h-3 w-3"}),e.jsx("span",{className:"font-semibold",children:"版本详情"})]}),e.jsxs("div",{className:"text-xs space-y-0.5",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"名称:"})," ",r.name]}),e.jsxs("div",{children:[e.jsx("strong",{children:"版本:"})," ",r.version]}),e.jsxs("div",{children:[e.jsx("strong",{children:"描述:"})," ",r.description]}),e.jsxs("div",{children:[e.jsx("strong",{children:"作者:"})," ",r.author]})]}),e.jsx("div",{className:"pt-1 border-t",children:e.jsxs("button",{type:"button",onClick:x,className:"text-xs text-primary hover:underline flex items-center gap-1",children:[e.jsx(Gt,{className:"h-3 w-3"}),h?"已复制!":"复制版本号"]})})]});return e.jsx(Ps,{children:e.jsxs(Is,{children:[e.jsx(Ts,{asChild:!0,children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Z,{variant:s,className:`cursor-help hover:bg-secondary/80 transition-colors ${a}`,onClick:x,children:e.jsxs("span",{className:"text-xs font-medium",children:["v",r.version]})}),t&&e.jsx(Z,{variant:"outline",className:"text-xs",children:r.name})]})}),e.jsx(jt,{side:"right",align:"start",className:"max-w-xs",children:d})]})})}const $r={navMain:[{title:"仪表板",url:"/dashboard",icon:ba},{title:"全局配置",url:"/settings",icon:Pe}]};function Os({...a}){return e.jsxs(Ms,{collapsible:"offcanvas",...a,children:[e.jsx(zs,{children:e.jsx(Ct,{children:e.jsx(kt,{children:e.jsx(Et,{asChild:!0,className:"data-[slot=sidebar-menu-button]:!p-1.5",children:e.jsxs(Jt,{to:"/",className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-base font-semibold",children:"Xiaozhi Client"}),e.jsx(Ls,{className:"text-xs"})]})})})})}),e.jsx(Ds,{children:e.jsx(zr,{items:$r.navMain})})]})}const Ye=Sa,Ar=va,Lr=wa,Us=o.forwardRef(({className:a,...t},s)=>e.jsx(Xt,{className:w("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...t,ref:s}));Us.displayName=Xt.displayName;const We=o.forwardRef(({className:a,...t},s)=>e.jsxs(Lr,{children:[e.jsx(Us,{}),e.jsx(Zt,{ref:s,className:w("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...t})]}));We.displayName=Zt.displayName;const ze=({className:a,...t})=>e.jsx("div",{className:w("flex flex-col space-y-2 text-center sm:text-left",a),...t});ze.displayName="AlertDialogHeader";const De=({className:a,...t})=>e.jsx("div",{className:w("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...t});De.displayName="AlertDialogFooter";const $e=o.forwardRef(({className:a,...t},s)=>e.jsx(Yt,{ref:s,className:w("text-lg font-semibold",a),...t}));$e.displayName=Yt.displayName;const Ae=o.forwardRef(({className:a,...t},s)=>e.jsx(Qt,{ref:s,className:w("text-sm text-muted-foreground",a),...t}));Ae.displayName=Qt.displayName;const Le=o.forwardRef(({className:a,...t},s)=>e.jsx(es,{ref:s,className:w(St(),a),...t}));Le.displayName=es.displayName;const Oe=o.forwardRef(({className:a,...t},s)=>e.jsx(ts,{ref:s,className:w(St({variant:"outline"}),"mt-2 sm:mt-0",a),...t}));Oe.displayName=ts.displayName;const ue=Ht,ve=ja,Or=Ft,Qe=bt,_s=o.forwardRef(({className:a,...t},s)=>e.jsx(Ke,{ref:s,className:w("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...t}));_s.displayName=Ke.displayName;const ne=o.forwardRef(({className:a,children:t,...s},r)=>e.jsxs(Or,{children:[e.jsx(_s,{}),e.jsxs(Je,{ref:r,className:w("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...s,children:[t,e.jsxs(bt,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[e.jsx(wt,{className:"h-4 w-4"}),e.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));ne.displayName=Je.displayName;const oe=({className:a,...t})=>e.jsx("div",{className:w("flex flex-col space-y-1.5 text-center sm:text-left",a),...t});oe.displayName="DialogHeader";const ge=({className:a,...t})=>e.jsx("div",{className:w("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...t});ge.displayName="DialogFooter";const ie=o.forwardRef(({className:a,...t},s)=>e.jsx(Ge,{ref:s,className:w("text-lg font-semibold leading-none tracking-tight",a),...t}));ie.displayName=Ge.displayName;const he=o.forwardRef(({className:a,...t},s)=>e.jsx(Xe,{ref:s,className:w("text-sm text-muted-foreground",a),...t}));he.displayName=Xe.displayName;const Ot={config:null,loading:{isLoading:!1,isUpdating:!1,isRefreshing:!1,lastUpdated:null,lastError:null},lastSource:null},re=pt()(gt((a,t)=>({...Ot,setConfig:(s,r="http")=>{console.log(`[ConfigStore] 设置配置数据,来源: ${r}`),a(n=>({config:s,lastSource:r,loading:{...n.loading,lastUpdated:Date.now(),lastError:null}}),!1,"setConfig")},setLoading:s=>{a(r=>({loading:{...r.loading,...s}}),!1,"setLoading")},setError:s=>{a(r=>({loading:{...r.loading,lastError:s}}),!1,"setError")},getConfig:async()=>{const{config:s,loading:r}=t();return s&&r.lastUpdated&&Date.now()-r.lastUpdated<5*60*1e3?s:t().refreshConfig()},updateConfig:async s=>{const{setLoading:r,setConfig:n,setError:i}=t();try{r({isUpdating:!0,lastError:null}),console.log("[ConfigStore] 开始更新配置"),await A.updateConfig(s),n(s,"http"),console.log("[ConfigStore] 配置更新成功")}catch(c){const f=c instanceof Error?c:new Error("配置更新失败");throw console.error("[ConfigStore] 配置更新失败:",f),i(f),f}finally{r({isUpdating:!1})}},refreshConfig:async()=>{const{setLoading:s,setConfig:r,setError:n}=t();try{s({isRefreshing:!0,lastError:null}),console.log("[ConfigStore] 开始刷新配置");const i=await A.getConfig();return r(i,"http"),console.log("[ConfigStore] 配置刷新成功"),i}catch(i){const c=i instanceof Error?i:new Error("配置刷新失败");throw console.error("[ConfigStore] 配置刷新失败:",c),n(c),c}finally{s({isRefreshing:!1})}},reloadConfig:async()=>{const{setLoading:s,setConfig:r,setError:n}=t();try{s({isRefreshing:!0,lastError:null}),console.log("[ConfigStore] 开始重新加载配置");const i=await A.reloadConfig();return r(i,"http"),console.log("[ConfigStore] 配置重新加载成功"),i}catch(i){const c=i instanceof Error?i:new Error("配置重新加载失败");throw console.error("[ConfigStore] 配置重新加载失败:",c),n(c),c}finally{s({isRefreshing:!1})}},updateMcpEndpoint:async s=>{const{config:r,updateConfig:n}=t();if(!r)throw new Error("配置未加载,无法更新 MCP 端点");const i={...r,mcpEndpoint:s};await n(i)},updateMcpServers:async s=>{const{config:r,updateConfig:n}=t();if(!r)throw new Error("配置未加载,无法更新 MCP 服务");const i={...r,mcpServers:s};await n(i)},updateConnectionConfig:async s=>{const{config:r,updateConfig:n}=t();if(!r)throw new Error("配置未加载,无法更新连接配置");const i={...r,connection:s};await n(i)},updateModelScopeConfig:async s=>{const{config:r,updateConfig:n}=t();if(!r)throw new Error("配置未加载,无法更新 ModelScope 配置");const i={...r,modelscope:s};await n(i)},updateWebUIConfig:async s=>{const{config:r,updateConfig:n}=t();if(!r)throw new Error("配置未加载,无法更新 Web UI 配置");const i={...r,webUI:s};await n(i)},reset:()=>{console.log("[ConfigStore] 重置状态"),a(Ot,!1,"reset")},initialize:async()=>{const{setLoading:s,refreshConfig:r}=t();try{s({isLoading:!0}),console.log("[ConfigStore] 初始化配置 Store"),$.subscribe("data:configUpdate",n=>{console.log("[ConfigStore] 收到 WebSocket 配置更新"),t().setConfig(n,"websocket")}),await r(),console.log("[ConfigStore] 配置 Store 初始化完成")}catch(n){throw console.error("[ConfigStore] 配置 Store 初始化失败:",n),n}finally{s({isLoading:!1})}}}),{name:"config-store"})),je=()=>re(a=>a.config),Bs=()=>re(a=>{var t;return(t=a.config)==null?void 0:t.mcpEndpoint}),qs=()=>re(a=>{var t;return(t=a.config)==null?void 0:t.mcpServers}),Ur=()=>re(a=>{var t;return(t=a.config)==null?void 0:t.mcpServerConfig}),Pt=()=>re(xt(a=>({getConfig:a.getConfig,updateConfig:a.updateConfig,refreshConfig:a.refreshConfig,reloadConfig:a.reloadConfig,updateMcpEndpoint:a.updateMcpEndpoint,updateMcpServers:a.updateMcpServers,updateConnectionConfig:a.updateConnectionConfig,updateModelScopeConfig:a.updateModelScopeConfig,updateWebUIConfig:a.updateWebUIConfig,reset:a.reset,initialize:a.initialize}))),Ut=a=>`${a.slice(0,30)}...${a.slice(-10)}`,_r=a=>{if(!a.trim())return"请输入接入点地址";if(!a.startsWith("ws://")&&!a.startsWith("wss://"))return"接入点格式无效,请输入正确的WebSocket URL (ws:// 或 wss://)";try{new URL(a)}catch{return"接入点格式无效,请输入正确的URL格式"}return null};function Br(){const[a,t]=o.useState(!1),[s,r]=o.useState(!1),[n,i]=o.useState(""),[c,f]=o.useState(!1),[b,h]=o.useState(!1),[m,x]=o.useState(""),[d,l]=o.useState(!1),[g,v]=o.useState(""),[p,C]=o.useState({}),P=je(),I=Bs(),{refreshConfig:_}=Pt(),O=o.useCallback(async S=>{try{return await A.getEndpointStatus(S)}catch(y){return console.error(`获取接入点状态失败: ${S}`,y),{endpoint:S,connected:!1,initialized:!1,isReconnecting:!1,reconnectAttempts:0,reconnectDelay:0}}},[]),V=o.useCallback((S,y)=>{C(M=>({...M,[S]:{...M[S],...y}}))},[]),Y=o.useCallback(async S=>{const y={};for(const M of S)try{const W=await O(M);y[M]={connected:W.connected,isOperating:!1,lastOperation:{type:null,success:!1,message:"",timestamp:0}}}catch{y[M]={connected:!1,isOperating:!1,lastOperation:{type:null,success:!1,message:"",timestamp:0}}}C(y)},[O]),ce=async S=>{V(S,{isOperating:!0});try{await A.connectEndpoint(S),V(S,{connected:!0,isOperating:!1,lastOperation:{type:"connect",success:!0,message:"连接成功",timestamp:Date.now()}}),j.success("接入点连接成功")}catch(y){V(S,{isOperating:!1,lastOperation:{type:"connect",success:!1,message:y instanceof Error?y.message:"连接失败",timestamp:Date.now()}}),j.error(y instanceof Error?y.message:"接入点连接失败")}},le=async S=>{V(S,{isOperating:!0});try{await A.disconnectEndpoint(S),V(S,{connected:!1,isOperating:!1,lastOperation:{type:"disconnect",success:!0,message:"断开成功",timestamp:Date.now()}}),j.success("接入点断开成功")}catch(y){V(S,{isOperating:!1,lastOperation:{type:"disconnect",success:!1,message:y instanceof Error?y.message:"断开失败",timestamp:Date.now()}}),j.error(y instanceof Error?y.message:"接入点断开失败")}},me=async S=>{var y;try{if((y=navigator.clipboard)!=null&&y.writeText)await navigator.clipboard.writeText(S),j.success("接入点地址已复制到剪贴板");else{const M=document.createElement("textarea");M.value=S,M.style.position="fixed",M.style.opacity="0",document.body.appendChild(M),M.select();const W=document.execCommand("copy");if(document.body.removeChild(M),W)j.success("接入点地址已复制到剪贴板");else throw new Error("复制命令执行失败")}}catch(M){console.error("复制失败:",M),j.error("复制失败,请手动复制")}},fe=async()=>{f(!0);try{await A.removeEndpoint(n),await _(),C(S=>{const y={...S};return delete y[n],y}),j.success("接入点已删除"),r(!1),i("")}catch(S){console.error("删除接入点失败:",S),j.error(S instanceof Error?S.message:"删除接入点失败")}finally{f(!1)}},D=async()=>{const S=_r(m);if(S){v(S);return}if((Array.isArray(I)?I:[I]).includes(m)){v("该接入点已存在");return}if(!P){j.error("配置数据未加载,请稍后重试");return}l(!0);try{const M=await A.addEndpoint(m);await _(),C(W=>({...W,[m]:{connected:M.connected,isOperating:!1,lastOperation:{type:null,success:!1,message:"",timestamp:0}}})),j.success("接入点添加成功"),h(!1),x(""),v("")}catch(M){console.error("添加接入点失败:",M),j.error(M instanceof Error?M.message:"添加接入点失败")}finally{l(!1)}},u=()=>{x(""),v(""),h(!0)},T=S=>{x(S),g&&v("")},k=S=>{i(S),r(!0)},R=o.useMemo(()=>{let S=[];return Array.isArray(I)&&(S=I),typeof I=="string"&&I.length&&S.push(I),S},[I]);return o.useEffect(()=>{a&&R.length>0&&Y(R)},[a,R,Y]),o.useEffect(()=>{if(!a||R.length===0)return;const S=R.map(y=>$.subscribe("data:endpointStatusChanged",W=>{W.endpoint===y&&(console.log(`[McpEndpointSettingButton] 接收到端点 ${y} 状态变更:`,W),V(y,{connected:W.connected,isOperating:!1,lastOperation:{type:W.operation,success:W.success,message:W.message||(W.connected?"连接成功":"断开成功"),timestamp:W.timestamp}}),W.success?j.success(`端点 ${W.operation==="connect"?"连接":W.operation==="disconnect"?"断开":"重连"}成功`):j.error(`端点 ${W.operation==="connect"?"连接":W.operation==="disconnect"?"断开":"重连"}失败: ${W.message||"未知错误"}`))}));return()=>{for(const y of S)y()}},[a,R,V]),e.jsxs(ue,{open:a,onOpenChange:t,children:[e.jsx(ve,{asChild:!0,children:e.jsx(N,{variant:"secondary",size:"icon",className:"size-8",children:e.jsx(Pe,{className:"size-4"})})}),e.jsxs(ne,{className:"min-w-[600px] max-w-[800px] max-h-[80vh] overflow-y-auto",children:[e.jsxs(oe,{className:"mb-4",children:[e.jsx(ie,{children:"配置小智服务端接入点"}),e.jsx(he,{children:"点击保存后,需要重启服务才会生效。"})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[R.map(S=>{const y=p[S],M=(y==null?void 0:y.connected)||!1,W=(y==null?void 0:y.isOperating)||!1;return e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between p-4 bg-slate-50 rounded-md font-mono gap-3 transition-all duration-200 hover:bg-slate-100",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-3 flex-1 min-w-0",children:[e.jsx("span",{className:"flex-1 text-ellipsis overflow-hidden whitespace-nowrap text-sm sm:text-base",children:Ut(S)}),e.jsxs(Z,{className:`flex items-center gap-1 transition-all duration-200 text-xs sm:text-sm ${M?"bg-green-100 text-green-800 border-green-200 hover:text-green-800 hover:border-green-200 hover:bg-green-100":"bg-gray-100 text-gray-600 border-gray-200 hover:bg-gray-100 hover:text-gray-600 hover:border-gray-200"}`,children:[W?e.jsx(Ne,{className:"size-3 animate-spin"}):M?e.jsx(Wt,{className:"size-3"}):e.jsx(zt,{className:"size-3"}),W?"操作中":M?"已连接":"未连接"]})]}),e.jsxs("div",{className:"flex items-center gap-1 sm:gap-2 flex-wrap justify-end",children:[e.jsx(N,{variant:"outline",size:"icon",onClick:()=>me(S),title:"复制完整地址",className:"transition-all duration-200 hover:scale-105",children:e.jsx(Gt,{className:"size-4"})}),M?e.jsx(N,{variant:"outline",size:"icon",onClick:()=>le(S),title:"断开连接",disabled:W,className:"text-red-600 hover:text-red-700 hover:bg-red-50 transition-all duration-200 hover:scale-105 disabled:scale-100 disabled:opacity-50",children:W?e.jsx(Ne,{className:"size-4 animate-spin"}):e.jsx(zt,{className:"size-4"})}):e.jsx(N,{variant:"outline",size:"icon",onClick:()=>ce(S),title:"连接",disabled:W,className:"text-green-600 hover:text-green-700 hover:bg-green-50 transition-all duration-200 hover:scale-105 disabled:scale-100 disabled:opacity-50",children:W?e.jsx(Ne,{className:"size-4 animate-spin"}):e.jsx(Wt,{className:"size-4"})}),e.jsx(N,{variant:"outline",size:"icon",onClick:()=>k(S),title:"删除此接入点",className:"transition-all duration-200 hover:scale-105 hover:text-red-600",children:e.jsx(ss,{className:"size-4 text-red-500"})})]})]},S)}),R.length===0&&e.jsxs("div",{className:"flex flex-col items-center flex-1 text-sm text-muted-foreground text-center justify-center gap-2",children:[e.jsx(ya,{}),e.jsx("span",{children:"暂无接入点,请添加"})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row items-center gap-2 mt-4",children:[e.jsxs(N,{className:"flex-1 flex items-center gap-2",onClick:u,children:[e.jsx(Ie,{className:"size-4"}),e.jsx("span",{className:"text-sm sm:text-base",children:"添加小智服务端接入点"})]}),e.jsx(N,{variant:"outline",className:"flex-1 flex items-center gap-2",onClick:()=>window.open("https://xiaozhi.me/console/agents","_blank"),children:e.jsx("span",{className:"text-sm sm:text-base",children:"打开小智服务端"})})]})]})]}),e.jsx(Ye,{open:s,onOpenChange:r,children:e.jsxs(We,{children:[e.jsxs(ze,{children:[e.jsx($e,{children:"确认删除接入点"}),e.jsxs(Ae,{children:['确定要删除接入点 "',Ut(n),'" 吗?此操作无法撤销。']})]}),e.jsxs(De,{children:[e.jsx(Oe,{disabled:c,children:"取消"}),e.jsx(Le,{onClick:fe,disabled:c,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:c?"删除中...":"确定删除"})]})]})}),e.jsx(ue,{open:b,onOpenChange:h,children:e.jsxs(ne,{className:"sm:max-w-[500px]",children:[e.jsxs(oe,{children:[e.jsx(ie,{children:"添加新的接入点"}),e.jsx(he,{children:"请输入小智服务端接入点地址"})]}),e.jsx("div",{className:"grid gap-4 py-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx(te,{placeholder:"请输入接入点地址,例如:wss://api.xiaozhi.me/mcp/?token=... 或 ws(s)://<hostname>:<port>",value:m,onChange:S=>T(S.target.value),disabled:d,className:"font-mono text-sm"}),g&&e.jsx("p",{className:"text-sm text-red-500",children:g})]})}),e.jsxs(ge,{children:[e.jsx(Qe,{asChild:!0,children:e.jsx(N,{variant:"outline",disabled:d,children:"取消"})}),e.jsx(N,{onClick:D,disabled:d||!m.trim(),children:d?"添加中...":"确定"})]})]})})]})}const qr=Me("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),Vs=o.forwardRef(({className:a,...t},s)=>e.jsx(as,{ref:s,className:w(qr(),a),...t}));Vs.displayName=as.displayName;const Ue=Ca,Fs=o.createContext({}),Q=({...a})=>e.jsx(Fs.Provider,{value:{name:a.name},children:e.jsx(ka,{...a})}),et=()=>{const a=o.useContext(Fs),t=o.useContext(Hs),{getFieldState:s,formState:r}=Na(),n=s(a.name,r);if(!a)throw new Error("useFormField should be used within <FormField>");const{id:i}=t;return{id:i,name:a.name,formItemId:`${i}-form-item`,formDescriptionId:`${i}-form-item-description`,formMessageId:`${i}-form-item-message`,...n}},Hs=o.createContext({}),G=o.forwardRef(({className:a,...t},s)=>{const r=o.useId();return e.jsx(Hs.Provider,{value:{id:r},children:e.jsx("div",{ref:s,className:w("space-y-2",a),...t})})});G.displayName="FormItem";const se=o.forwardRef(({className:a,...t},s)=>{const{error:r,formItemId:n}=et();return e.jsx(Vs,{ref:s,className:w(r&&"text-destructive",a),htmlFor:n,...t})});se.displayName="FormLabel";const X=o.forwardRef(({...a},t)=>{const{error:s,formItemId:r,formDescriptionId:n,formMessageId:i}=et();return e.jsx(pe,{ref:t,id:r,"aria-describedby":s?`${n} ${i}`:`${n}`,"aria-invalid":!!s,...a})});X.displayName="FormControl";const Vr=o.forwardRef(({className:a,...t},s)=>{const{formDescriptionId:r}=et();return e.jsx("p",{ref:s,id:r,className:w("text-sm text-muted-foreground",a),...t})});Vr.displayName="FormDescription";const ee=o.forwardRef(({className:a,children:t,...s},r)=>{const{error:n,formMessageId:i}=et(),c=n?String((n==null?void 0:n.message)??""):t;return c?e.jsx("p",{ref:r,id:i,className:w("text-sm font-medium text-destructive",a),...s,children:c}):null});ee.displayName="FormMessage";const _t={connectionState:J.DISCONNECTED,wsUrl:"",connectionStats:{reconnectAttempts:0,maxReconnectAttempts:5,lastHeartbeat:0,eventListenerCount:0},portChangeStatus:void 0,lastError:null,connectedAt:null,disconnectedAt:null},_e=pt()(gt((a,t)=>({..._t,setConnectionState:s=>{console.log("[WebSocketStore] 更新连接状态:",s);const r=Date.now(),n={connectionState:s};s===J.CONNECTED?(n.connectedAt=r,n.lastError=null):s===J.DISCONNECTED&&(n.disconnectedAt=r),a(n,!1,"setConnectionState");const i=$.getConnectionStats();t().setConnectionStats(i)},setWsUrl:s=>{console.log("[WebSocketStore] 更新 WebSocket URL:",s),a({wsUrl:s},!1,"setWsUrl")},setConnectionStats:s=>{a({connectionStats:s},!1,"setConnectionStats")},setLastError:s=>{console.log("[WebSocketStore] 更新连接错误:",s==null?void 0:s.message),a({lastError:s},!1,"setLastError")},setPortChangeStatus:s=>{console.log("[WebSocketStore] 更新端口变更状态:",s==null?void 0:s.status),a({portChangeStatus:s},!1,"setPortChangeStatus")},connect:async()=>{try{console.log("[WebSocketStore] 开始连接 WebSocket"),$.connect()}catch(s){const r=s instanceof Error?s:new Error("连接失败");throw console.error("[WebSocketStore] 连接失败:",r),t().setLastError(r),r}},disconnect:()=>{console.log("[WebSocketStore] 断开 WebSocket 连接"),$.disconnect()},reconnect:async()=>{try{console.log("[WebSocketStore] 重新连接 WebSocket"),$.disconnect(),await new Promise(s=>setTimeout(s,1e3)),$.connect()}catch(s){const r=s instanceof Error?s:new Error("重连失败");throw console.error("[WebSocketStore] 重连失败:",r),t().setLastError(r),r}},send:s=>{try{return $.send(s)}catch(r){const n=r instanceof Error?r:new Error("发送消息失败");return console.error("[WebSocketStore] 发送消息失败:",n),t().setLastError(n),!1}},updateUrl:s=>{console.log("[WebSocketStore] 更新 WebSocket URL:",s),$.setUrl(s),t().setWsUrl(s)},getConnectionInfo:()=>{const s=t();return{state:s.connectionState,url:s.wsUrl,stats:s.connectionStats,isConnected:s.connectionState===J.CONNECTED}},reset:()=>{console.log("[WebSocketStore] 重置状态"),a(_t,!1,"reset")},initialize:()=>{console.log("[WebSocketStore] 初始化 WebSocket Store"),$.subscribe("connection:connecting",()=>{t().setConnectionState(J.CONNECTING)}),$.subscribe("connection:connected",()=>{t().setConnectionState(J.CONNECTED)}),$.subscribe("connection:disconnected",()=>{t().setConnectionState(J.DISCONNECTED)}),$.subscribe("connection:reconnecting",()=>{t().setConnectionState(J.RECONNECTING);const r=$.getConnectionStats();t().setConnectionStats(r)}),$.subscribe("connection:error",({error:r})=>{t().setLastError(r)}),$.subscribe("system:heartbeat",()=>{const r=$.getConnectionStats();t().setConnectionStats(r)});const s=$.getConnectionStats();t().setConnectionStats(s),t().setWsUrl($.getUrl()),console.log("[WebSocketStore] WebSocket Store 初始化完成")},setConnected:s=>{console.warn("[WebSocketStore] setConnected 方法已废弃,请使用 setConnectionState");const r=s?J.CONNECTED:J.DISCONNECTED;t().setConnectionState(r)}}),{name:"websocket-store"})),Ks=()=>_e(a=>a.connectionState===J.CONNECTED),Fr=()=>_e(a=>a.wsUrl),Hr=()=>_e(a=>a.portChangeStatus),Js=()=>_e(xt(a=>({setConnectionState:a.setConnectionState,setWsUrl:a.setWsUrl,setConnectionStats:a.setConnectionStats,setLastError:a.setLastError,setPortChangeStatus:a.setPortChangeStatus,connect:a.connect,disconnect:a.disconnect,reconnect:a.reconnect,send:a.send,updateUrl:a.updateUrl,reset:a.reset,initialize:a.initialize,getConnectionInfo:a.getConnectionInfo,setConnected:a.setConnected})));async function Kr(a,t=3e3){try{const s=new AbortController,r=setTimeout(()=>s.abort(),t);let n;try{n=await fetch(`http://localhost:${a}/api/status`,{method:"GET",signal:s.signal})}catch{n=await fetch(`http://localhost:${a}/health`,{method:"GET",signal:s.signal})}return clearTimeout(r),n.ok}catch{return!1}}function Bt(a,t){const s=window.location.protocol==="https:"?"wss:":"ws:",r=window.location.hostname||"localhost";return s==="ws:"&&a===80||s==="wss:"&&a===443?`${s}//${r}`:`${s}//${r}:${a}`}function Jr(a){try{const t=new URL(a),s=Number.parseInt(t.port);return Number.isNaN(s)?null:s}catch{return null}}function Gs(){console.warn("[useWebSocket] 此 hook 已重构,建议使用新的专用 hooks:useWebSocketConnection()、useConfigData()、useStatusData()");const a=je(),t=ir(),s=vs(),r=Js(),n=Pt(),i=cr(),[c,f]=o.useState(""),b=o.useRef(!1);o.useEffect(()=>{if(b.current)return;b.current=!0,console.log("[useWebSocket] 初始化 WebSocket 连接和数据加载"),$.isConnected()||$.connect();const p=$.getUrl();f(p),(async()=>{try{await Promise.allSettled([n.getConfig(),i.getStatus()]),console.log("[useWebSocket] 初始数据加载完成")}catch(P){console.error("[useWebSocket] 初始数据加载失败:",P)}})()},[n,i]);const h=o.useCallback(p=>{const C=localStorage.getItem("xiaozhi-ws-url");if(C)return C;let P=9999;if(p)P=p;else if(window.location.port){const I=Number.parseInt(window.location.port);Number.isNaN(I)||(P=I)}else window.location.protocol==="http:"&&!window.location.port?P=80:window.location.protocol==="https:"&&!window.location.port&&(P=443);return Bt(P)},[]),m={connected:$.isConnected(),config:a,status:t,restartStatus:s||void 0},x=o.useCallback(async p=>{console.log("[useWebSocket] updateConfig 调用,使用新的 configActions");try{await n.updateConfig(p)}catch(C){throw console.error("[useWebSocket] 配置更新失败:",C),C}},[n]),d=o.useCallback(async()=>{console.log("[useWebSocket] refreshStatus 调用,使用新的 statusActions");try{await i.refreshStatus()}catch(p){throw console.error("[useWebSocket] 状态刷新失败:",p),p}},[i]),l=o.useCallback(async()=>{console.log("[useWebSocket] restartService 调用,使用新的 statusActions");try{await i.restartService()}catch(p){throw console.error("[useWebSocket] 服务重启失败:",p),p}},[i]),g=o.useCallback(p=>{if(console.log("[useWebSocket] setCustomWsUrl 调用,使用 WebSocketManager"),p)localStorage.setItem("xiaozhi-ws-url",p),$.setUrl(p);else{localStorage.removeItem("xiaozhi-ws-url");const C=h();$.setUrl(C)}f($.getUrl())},[h]),v=o.useCallback(async p=>{if((Jr(c)||9999)!==p){r.setPortChangeStatus({status:"checking",targetPort:p,timestamp:Date.now()});try{if(r.setPortChangeStatus({status:"checking",targetPort:p,timestamp:Date.now()}),!await Kr(p))throw new Error(`端口 ${p} 不可用`);const I=Bt(p);$.setUrl(I),f(I),console.log(`[WebSocket] 端口切换到 ${p} 成功完成`),r.setPortChangeStatus({status:"completed",targetPort:p,timestamp:Date.now()})}catch(P){const I=P instanceof Error?P.message:"端口切换失败";throw console.error(`[WebSocket] 端口切换到 ${p} 失败:`,I),r.setPortChangeStatus({status:"failed",targetPort:p,error:I,timestamp:Date.now()}),P}}},[c,r]);return{...m,updateConfig:x,refreshStatus:d,restartService:l,wsUrl:c,setCustomWsUrl:g,changePort:v}}const Gr=H.object({port:H.string().min(1,{message:"端口号不能为空"}).refine(a=>!Number.isNaN(Number(a)),{message:"请输入有效的数字"}).refine(a=>Number(a)>=1&&Number(a)<=65535,{message:"端口号必须在 1-65535 之间"}).refine(a=>Number.isInteger(Number(a)),{message:"端口号必须是整数"})});function Xr(){const[a,t]=o.useState(!1),[s,r]=o.useState(!1),n=je(),i=Ks(),c=Hr(),{changePort:f}=Gs(),b=Te({resolver:Re(Gr),defaultValues:{port:"9999"}});o.useEffect(()=>{var x;(x=n==null?void 0:n.webUI)!=null&&x.port&&b.reset({port:n.webUI.port.toString()})},[n,b]);const h=()=>{if(s)return"处理中...";if((c==null?void 0:c.status)==="checking")return"检测端口...";if((c==null?void 0:c.status)==="polling"){const{currentAttempt:x,maxAttempts:d}=c;return`等待服务重启 (${x||0}/${d||45})`}return(c==null?void 0:c.status)==="connecting"?"连接中...":i?"保存并重启":"保存并连接"};async function m(x){var g;const d=Number(x.port),l=(g=n==null?void 0:n.webUI)==null?void 0:g.port;if(d===l){t(!1);return}console.log(`[WebUrlSettingButton] 开始端口切换: ${l} -> ${d}`),r(!0);try{j.info(i?`正在将端口从 ${l} 切换到 ${d}...`:`正在连接到端口 ${d}...`),await f(d),j.success(i?`端口已成功切换到 ${d},页面即将刷新...`:`已成功连接到端口 ${d},页面即将刷新...`),t(!1)}catch(v){console.error("端口切换失败:",v);const p=v instanceof Error?v.message:"端口切换失败";j.error(`端口切换失败: ${p}`)}finally{r(!1)}}return e.jsxs(ue,{open:a,onOpenChange:t,children:[e.jsx(ve,{asChild:!0,children:e.jsx(N,{variant:"secondary",size:"icon",className:"size-8",children:e.jsx(Pe,{className:"h-4 w-4"})})}),e.jsx(ne,{className:"sm:max-w-[250px]",children:e.jsx(Ue,{...b,children:e.jsxs("form",{onSubmit:b.handleSubmit(m),children:[e.jsxs(oe,{className:"mb-4",children:[e.jsx(ie,{children:"配置服务端端口"}),e.jsx(he,{children:i?"修改端口后将自动重启服务并重新连接。":"请输入服务端端口号,系统将尝试连接。"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{children:["ws://",window.location.hostname,":"]}),e.jsx("div",{className:"w-[100px]",children:e.jsx(Q,{control:b.control,name:"port",render:({field:x})=>e.jsxs(G,{children:[e.jsx(X,{children:e.jsx(te,{placeholder:"服务端端口,默认9999",className:"font-mono text-sm",disabled:s,type:"number",...x})}),e.jsx(ee,{})]})})})]}),e.jsxs(ge,{className:"mt-4",children:[e.jsx(Qe,{asChild:!0,children:e.jsx(N,{variant:"outline",disabled:s,children:"取消"})}),e.jsx(N,{type:"submit",disabled:s||(c==null?void 0:c.status)==="polling",children:h()})]})]})})})]})}const de=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,className:w("rounded-lg border bg-card text-card-foreground shadow-sm",a),...t}));de.displayName="Card";const Ce=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,className:w("flex flex-col space-y-1.5 p-6",a),...t}));Ce.displayName="CardHeader";const ke=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,className:w("text-2xl font-semibold leading-none tracking-tight",a),...t}));ke.displayName="CardTitle";const Ee=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,className:w("text-sm text-muted-foreground",a),...t}));Ee.displayName="CardDescription";const we=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,className:w("p-6 pt-0",a),...t}));we.displayName="CardContent";const He=o.forwardRef(({className:a,...t},s)=>e.jsx("div",{ref:s,className:w("flex items-center p-6 pt-0",a),...t}));He.displayName="CardFooter";const ct=({showValue:a=!0,value:t=0,maxValue:s=100,size:r=60,activeColor:n="#3b82f6",inactiveColor:i="#e5e7eb",symbol:c="%"})=>{const f=(r-6)/2,b=f*2*Math.PI,h=b,m=b-t/s*b;return e.jsxs("div",{className:"relative inline-flex items-center justify-center",children:[e.jsxs("svg",{width:r,height:r,className:"transform -rotate-90",children:[e.jsx("circle",{cx:r/2,cy:r/2,r:f,stroke:i,strokeWidth:6,fill:"none"}),e.jsx("circle",{cx:r/2,cy:r/2,r:f,stroke:n,strokeWidth:6,fill:"none",strokeDasharray:h,strokeDashoffset:m,strokeLinecap:"round",className:"transition-all duration-300 ease-in-out"})]}),a&&e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsxs("span",{className:"text-xs font-medium",children:[t,c]})})]})};function Zr(){const a=qs(),t=Ks(),s=Object.keys(a||{}).length,r=Fr(),n=Bs();return e.jsxs("div",{className:"*:data-[slot=card]:shadow-xs @xl/main:grid-cols-2 @5xl/main:grid-cols-4 grid grid-cols-1 gap-4 px-4 *:data-[slot=card]:bg-gradient-to-t *:data-[slot=card]:from-primary/5 *:data-[slot=card]:to-card dark:*:data-[slot=card]:bg-card lg:px-6",children:[e.jsxs(de,{className:"@container/card",children:[e.jsxs(Ce,{className:"relative",children:[e.jsx(Ee,{children:"小智接入点"}),e.jsx(ke,{className:"@[250px]/card:text-3xl text-2xl font-semibold tabular-nums",children:Array.isArray(n)?n.length:n?1:0}),e.jsx("div",{className:"absolute right-4 top-4 flex flex-col items-center",children:e.jsx(ct,{showValue:!1,value:Array.isArray(n)?n.length:n?1:0,maxValue:Math.max(Array.isArray(n)?n.length:1,1),activeColor:"#16a34a",inactiveColor:"#f87171",size:30,symbol:""})})]}),e.jsx(He,{className:"flex-col items-end gap-1 text-sm",children:e.jsx(Br,{})})]}),e.jsxs(de,{className:"@container/card",children:[e.jsxs(Ce,{className:"relative",children:[e.jsx(Ee,{children:"Xiaozhi Client"}),e.jsx(ke,{className:"@[250px]/card:text-3xl text-2xl font-semibold tabular-nums",children:t?"已连接":"未连接"}),e.jsx("div",{className:"absolute right-4 top-4",children:e.jsx(ct,{showValue:!1,value:1,maxValue:1,activeColor:t?"#16a34a":"#f87171",inactiveColor:t?"#16a34a":"#f87171",size:30,symbol:""})})]}),e.jsxs(He,{className:"flex items-center justify-between gap-1 text-sm",children:[e.jsx("div",{className:"text-muted-foreground",children:r}),e.jsx(Xr,{})]})]}),e.jsx(de,{className:"@container/card",children:e.jsxs(Ce,{className:"relative",children:[e.jsx(Ee,{children:"MCP服务"}),e.jsx(ke,{className:"@[250px]/card:text-3xl text-2xl font-semibold tabular-nums",children:s}),e.jsx("div",{className:"absolute right-4 top-4",children:e.jsx(ct,{showValue:!1,value:s,maxValue:s,activeColor:"#16a34a",inactiveColor:"#f87171",size:30,symbol:""})})]})})]})}const Xs=o.forwardRef(({className:a,...t},s)=>e.jsx(rs,{ref:s,className:w("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",a),...t,children:e.jsx(Ea,{className:w("flex items-center justify-center text-current"),children:e.jsx(ns,{className:"h-4 w-4"})})}));Xs.displayName=rs.displayName;const It=za,Tt=Da,tt=o.forwardRef(({className:a,children:t,...s},r)=>e.jsxs(os,{ref:r,className:w("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",a),...s,children:[t,e.jsx(Pa,{asChild:!0,children:e.jsx(is,{className:"h-4 w-4 opacity-50"})})]}));tt.displayName=os.displayName;const Zs=o.forwardRef(({className:a,...t},s)=>e.jsx(cs,{ref:s,className:w("flex cursor-default items-center justify-center py-1",a),...t,children:e.jsx(Ia,{className:"h-4 w-4"})}));Zs.displayName=cs.displayName;const Ys=o.forwardRef(({className:a,...t},s)=>e.jsx(ls,{ref:s,className:w("flex cursor-default items-center justify-center py-1",a),...t,children:e.jsx(is,{className:"h-4 w-4"})}));Ys.displayName=ls.displayName;const st=o.forwardRef(({className:a,children:t,position:s="popper",...r},n)=>e.jsx(Ta,{children:e.jsxs(ds,{ref:n,className:w("relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]",s==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",a),position:s,...r,children:[e.jsx(Zs,{}),e.jsx(Ra,{className:w("p-1",s==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:t}),e.jsx(Ys,{})]})}));st.displayName=ds.displayName;const Yr=o.forwardRef(({className:a,...t},s)=>e.jsx(us,{ref:s,className:w("py-1.5 pl-8 pr-2 text-sm font-semibold",a),...t}));Yr.displayName=us.displayName;const Se=o.forwardRef(({className:a,children:t,...s},r)=>e.jsxs(ms,{ref:r,className:w("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",a),...s,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(Ma,{children:e.jsx(ns,{className:"h-4 w-4"})})}),e.jsx(Wa,{children:t})]}));Se.displayName=ms.displayName;const Qr=o.forwardRef(({className:a,...t},s)=>e.jsx(fs,{ref:s,className:w("-mx-1 my-1 h-px bg-muted",a),...t}));Qr.displayName=fs.displayName;const en=Ss({fieldName:At().min(1,"字段名不能为空").regex(/^[a-zA-Z][a-zA-Z0-9_]*$/,"字段名必须以字母开头,只能包含字母、数字和下划线"),description:At().min(1,"描述不能为空").max(200,"描述不能超过200个字符"),type:ar(["string","number","boolean"]),required:sr()}),tn=Ss({parameters:rr(en).refine(a=>{const t=a.map(s=>s.fieldName);return t.length===new Set(t).size},{message:"字段名不能重复"})});function sn(a){if(!a||!a.properties)return[];const t=a.properties,s=a.required||[];return Object.entries(t).map(([r,n])=>{let i="string";return n.type==="integer"||n.type==="number"?i="number":n.type==="boolean"&&(i="boolean"),{fieldName:r,description:n.description||"",type:i,required:s.includes(r)}})}function Qs({open:a,onOpenChange:t,workflow:s,onConfirm:r,onCancel:n,title:i}){const c=Te({resolver:Re(tn),defaultValues:{parameters:[]}});o.useEffect(()=>{a&&c.reset({parameters:sn(s.inputSchema)})},[a,s,c.reset]);const{fields:f,append:b,remove:h}=$a({control:c.control,name:"parameters"}),m=()=>{b({fieldName:"",description:"",type:"string",required:!1})},x=g=>{h(g)},d=g=>{r(s,g.parameters),c.reset()},l=()=>{c.reset(),n()};return e.jsx(ue,{open:a,onOpenChange:t,children:e.jsxs(ne,{className:"max-w-4xl max-h-[80vh] overflow-y-auto",children:[e.jsxs(oe,{children:[e.jsx(ie,{children:i||`配置工作流参数 - ${s.workflow_name}`}),e.jsx(he,{children:"为工作流配置输入参数,这些参数将用于生成工具的输入架构。 您可以跳过此步骤使用默认的空参数配置。"})]}),e.jsx(Ue,{...c,children:e.jsxs("form",{onSubmit:c.handleSubmit(d),className:"space-y-6",children:[e.jsxs("div",{className:"space-y-4 mb-10",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-lg font-medium",children:"参数列表"}),e.jsxs(N,{type:"button",variant:"outline",size:"sm",onClick:m,className:"flex items-center gap-2",children:[e.jsx(Ie,{className:"h-4 w-4"}),"添加参数"]})]}),f.length===0&&e.jsx("div",{className:"text-center py-8 text-muted-foreground",children:'暂无参数,点击"添加参数"开始配置'}),f.map((g,v)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx(Q,{control:c.control,name:`parameters.${v}.fieldName`,render:({field:p})=>e.jsxs(G,{children:[e.jsx(se,{children:"字段名"}),e.jsx(X,{children:e.jsx(te,{placeholder:"例如: userName",...p})}),e.jsx(ee,{})]})}),e.jsx(Q,{control:c.control,name:`parameters.${v}.description`,render:({field:p})=>e.jsxs(G,{className:"flex-1",children:[e.jsx(se,{children:"描述"}),e.jsx(X,{children:e.jsx(te,{placeholder:"例如: 用户名称",...p})}),e.jsx(ee,{})]})}),e.jsx(Q,{control:c.control,name:`parameters.${v}.type`,render:({field:p})=>e.jsxs(G,{className:"w-[140px]",children:[e.jsx(se,{children:"参数类型"}),e.jsxs(It,{onValueChange:p.onChange,defaultValue:p.value,children:[e.jsx(X,{children:e.jsx(tt,{children:e.jsx(Tt,{placeholder:"选择参数类型"})})}),e.jsxs(st,{children:[e.jsx(Se,{value:"string",children:"string"}),e.jsx(Se,{value:"number",children:"number"}),e.jsx(Se,{value:"boolean",children:"boolean"})]})]}),e.jsx(ee,{})]})}),e.jsx(Q,{control:c.control,name:`parameters.${v}.required`,render:({field:p})=>e.jsxs(G,{children:[e.jsx(se,{children:"是否必填"}),e.jsx(X,{children:e.jsx("div",{className:"flex items-center justify-center h-[40px]",children:e.jsx(Xs,{checked:p.value,onCheckedChange:p.onChange})})})]})}),e.jsx("div",{className:"flex flex-col h-[72px] justify-end",children:e.jsx(N,{type:"button",variant:"link",size:"sm",onClick:()=>x(v),className:"text-destructive mb-[4px]",children:e.jsx(Aa,{className:"h-4 w-4"})})})]},g.id))]}),e.jsxs(ge,{children:[e.jsx(N,{type:"button",variant:"outline",onClick:l,children:"取消"}),e.jsx(N,{type:"submit",children:"确认配置"})]})]})})]})})}function mt(a){if(!a||typeof a!="object")throw new Error("服务配置必须是一个有效的对象");if("command"in a&&typeof a.command=="string")return"stdio";if("type"in a&&a.type==="sse")return"sse";if("url"in a&&typeof a.url=="string")return"streamable-http";throw new Error("无法识别的 MCP 服务配置类型。配置必须包含 command 字段(stdio)、type: 'sse' 字段(sse)或 url 字段(streamable-http)")}const Rt=o.forwardRef(({className:a,...t},s)=>e.jsx("textarea",{className:w("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",a),ref:s,...t}));Rt.displayName="Textarea";const an=H.object({config:H.string().min(2,{message:"配置不能为空"})});function qt(){const[a,t]=o.useState(!1),[s,r]=o.useState(!1),n=je(),i=Te({resolver:Re(an),defaultValues:{config:""}}),c=(h,m)=>{if(!m||typeof m!="object")return{valid:!1,error:`服务 "${h}" 的配置必须是一个对象`};const x="command"in m,d="type"in m,l="url"in m;if(x){if(!m.command||typeof m.command!="string")return{valid:!1,error:`服务 "${h}" 缺少必需的 command 字段或字段类型不正确`};if(!Array.isArray(m.args))return{valid:!1,error:`服务 "${h}" 的 args 字段必须是数组`}}else if(d&&m.type==="sse"){if(!m.url||typeof m.url!="string")return{valid:!1,error:`服务 "${h}" 缺少必需的 url 字段或字段类型不正确`}}else if(l){if(!m.url||typeof m.url!="string")return{valid:!1,error:`服务 "${h}" 缺少必需的 url 字段或字段类型不正确`};if(m.type&&m.type!=="streamable-http")return{valid:!1,error:`服务 "${h}" 的 type 字段如果存在,必须是 "streamable-http"`}}else return{valid:!1,error:`服务 "${h}" 的配置无效: 必须包含 command 字段(stdio)、type: 'sse' 字段(sse)或 url 字段(streamable-http)`};try{return mt(m),{valid:!0}}catch(g){return{valid:!1,error:`服务 "${h}" 的配置无效: ${g instanceof Error?g.message:"未知错误"}`}}},f=h=>{try{const m=h.trim();if(!m)return{success:!1,error:"配置不能为空"};const x=JSON.parse(m);let d;if(x.mcpServers&&typeof x.mcpServers=="object")d=x.mcpServers;else if(typeof x=="object"&&!Array.isArray(x))try{mt(x),d={[x.command?x.command.split("/").pop()||"mcp-server":x.type==="sse"?"sse-server":"http-server"]:x}}catch{d=x}else return{success:!1,error:"配置格式错误: 必须是对象格式"};for(const[l,g]of Object.entries(d)){const v=c(l,g);if(!v.valid)return{success:!1,error:v.error}}return{success:!0,data:d}}catch(m){return{success:!1,error:`JSON 格式错误: ${m instanceof Error?m.message:"无法解析 JSON"}`}}};async function b(h){if(!n){j.error("配置数据未加载,请稍后重试");return}r(!0);try{const m=f(h.config);if(!m.success){j.error(m.error||"配置验证失败");return}const x=m.data,d=await dt.listServers(),l=Object.keys(x).filter(v=>d.servers.some(p=>p.name===v));if(l.length>0){j.error(`服务名称冲突: 以下服务已存在: ${l.join(", ")}`);return}for(const[v,p]of Object.entries(x))if(!await dt.addServer(v,p))throw new Error("添加服务器失败");const g=Object.keys(x).length;j.success(g===1?`已添加 MCP 服务 "${Object.keys(x)[0]}"`:`已添加 ${g} 个 MCP 服务`),i.reset(),t(!1)}catch(m){console.error("更新配置失败:",m),j.error(m instanceof Error?m.message:"更新配置失败")}finally{r(!1)}}return e.jsxs(ue,{open:a,onOpenChange:t,children:[e.jsx(ve,{asChild:!0,children:e.jsxs(N,{size:"icon",className:"w-full",children:[e.jsx(Ie,{className:"h-4 w-4"}),e.jsx("span",{children:"添加MCP服务"})]})}),e.jsx(ne,{className:"sm:max-w-[500px]",children:e.jsx(Ue,{...i,children:e.jsxs("form",{onSubmit:i.handleSubmit(b),children:[e.jsxs(oe,{className:"mb-4",children:[e.jsx(ie,{children:"添加MCP服务"}),e.jsx(he,{children:"添加后,需要重启服务才会生效。"})]}),e.jsx("div",{className:"grid gap-4",children:e.jsx(Q,{control:i.control,name:"config",render:({field:h})=>e.jsxs(G,{children:[e.jsx(X,{children:e.jsx(Rt,{className:"resize-none h-[300px] font-mono text-sm",disabled:s,placeholder:`支持三种通信方式:
2
+
3
+ 1. 本地进程 (stdio):
4
+ {
5
+ "mcpServers": {
6
+ "local-server": {
7
+ "command": "npx",
8
+ "args": ["-y", "@example/mcp-server"]
9
+ }
10
+ }
11
+ }
12
+
13
+ 2. 服务器推送 (SSE):
14
+ {
15
+ "mcpServers": {
16
+ "sse-server": {
17
+ "type": "sse",
18
+ "url": "https://example.com/sse"
19
+ }
20
+ }
21
+ }
22
+
23
+ 3. 流式 HTTP:
24
+ {
25
+ "mcpServers": {
26
+ "http-server": {
27
+ "url": "https://example.com/mcp"
28
+ }
29
+ }
30
+ }`,...h})}),e.jsx(ee,{})]})})}),e.jsxs(ge,{className:"mt-4",children:[e.jsx(Qe,{asChild:!0,children:e.jsx(N,{variant:"outline",disabled:s,children:"取消"})}),e.jsx(N,{type:"submit",disabled:s,children:s?"保存中...":"保存"})]})]})})})]})}class rn{constructor(t){U(this,"baseUrl");if(t)this.baseUrl=t;else{const s=window.location.protocol,r=window.location.hostname,n=window.location.port;this.baseUrl=`${s}//${r}${n?`:${n}`:""}`}}async request(t,s={}){var c;const r=`${this.baseUrl}${t}`,n={headers:{"Content-Type":"application/json",...s.headers}},i=await fetch(r,{...n,...s});if(!i.ok){let f=`HTTP ${i.status}: ${i.statusText}`;try{f=((c=(await i.json()).error)==null?void 0:c.message)||f}catch{}throw new Error(f)}return i.json()}async fetchWorkspaces(){try{const t=await this.request("/api/coze/workspaces");if(!t.success||!t.data)throw new Error(t.message||"获取工作空间列表失败");return t.data}catch(t){throw console.error("获取工作空间列表失败:",t),t}}async fetchWorkflows(t){try{const s=new URLSearchParams;s.append("workspace_id",t.workspace_id),t.page_num!==void 0&&s.append("page_num",t.page_num.toString()),t.page_size!==void 0&&s.append("page_size",t.page_size.toString());const r=await this.request(`/api/coze/workflows?${s.toString()}`);if(!r.success||!r.data)throw new Error(r.message||"获取工作流列表失败");return r.data}catch(s){throw console.error("获取工作流列表失败:",s),s}}async clearCache(){try{const t=await this.request("/api/coze/cache/clear",{method:"POST"});if(!t.success)throw new Error(t.message||"清除缓存失败")}catch(t){throw console.error("清除缓存失败:",t),t}}async getCacheStats(){try{const t=await this.request("/api/coze/cache/stats");if(!t.success||!t.data)throw new Error(t.message||"获取缓存统计失败");return t.data}catch(t){throw console.error("获取缓存统计失败:",t),t}}}const Ve=new rn;function nn(a={}){const{autoLoadWorkspaces:t=!0,autoLoadWorkflows:s=!0,defaultPageSize:r=20,initialWorkspaceId:n}=a,[i,c]=o.useState([]),[f,b]=o.useState([]),[h,m]=o.useState(n||null),[x,d]=o.useState({selectedWorkspaceId:n||null,workspacesLoading:!1,workflowsLoading:!1,workspacesError:null,workflowsError:null}),[l,g]=o.useState(1),[v,p]=o.useState(r),[C,P]=o.useState(!1),I=o.useMemo(()=>i&&Array.isArray(i)&&i.find(D=>D.id===h)||null,[i,h]),_=o.useCallback(async()=>{d(D=>({...D,workspacesLoading:!0,workspacesError:null}));try{const D=await Ve.fetchWorkspaces();c(D.workspaces),d(u=>({...u,workspacesLoading:!1}))}catch(D){const u=D instanceof Error?D.message:"加载工作空间失败";d(T=>({...T,workspacesLoading:!1,workspacesError:u})),console.error("加载工作空间失败:",D)}},[]),O=o.useCallback(async(D={})=>{const u=D.workspace_id||h;if(!u){console.warn("无法加载工作流:未选择工作空间");return}d(T=>({...T,workflowsLoading:!0,workflowsError:null}));try{const T={workspace_id:u,page_num:D.page_num||l,page_size:D.page_size||v},k=await Ve.fetchWorkflows(T);b(k.items),P(k.hasMore),d(R=>({...R,workflowsLoading:!1}))}catch(T){const k=T instanceof Error?T.message:"加载工作流失败";d(R=>({...R,workflowsLoading:!1,workflowsError:k})),console.error("加载工作流失败:",T)}},[h,l,v]),V=o.useCallback(D=>{m(D),d(u=>({...u,selectedWorkspaceId:D})),b([]),g(1),P(!1),s&&D&&O({workspace_id:D,page_num:1})},[s,O]),Y=o.useCallback(async()=>{await _()},[_]),ce=o.useCallback(async()=>{h&&await O({workspace_id:h,page_num:l})},[O,h,l]),le=o.useCallback(async()=>{try{await Ve.clearCache(),t&&await _(),s&&h&&await O({workspace_id:h,page_num:1})}catch(D){throw console.error("清除缓存失败:",D),D}},[t,s,h,_,O]),me=o.useCallback(D=>{g(D),h&&O({workspace_id:h,page_num:D})},[h,O]),fe=o.useCallback(D=>{p(D),g(1),h&&O({workspace_id:h,page_num:1,page_size:D})},[h,O]);return o.useEffect(()=>{t&&_()},[t,_]),o.useEffect(()=>{s&&h&&(async()=>{d(u=>({...u,workflowsLoading:!0,workflowsError:null}));try{const u={workspace_id:h,page_num:1,page_size:v},T=await Ve.fetchWorkflows(u);b(T.items),P(T.hasMore),d(k=>({...k,workflowsLoading:!1}))}catch(u){const T=u instanceof Error?u.message:"加载工作流失败";d(k=>({...k,workflowsLoading:!1,workflowsError:T})),console.error("加载工作流失败:",u)}})()},[s,h,v]),{workspaces:i,workflows:f,selectedWorkspace:I,workspacesLoading:x.workspacesLoading,workflowsLoading:x.workflowsLoading,workspacesError:x.workspacesError,workflowsError:x.workflowsError,hasMoreWorkflows:C,selectWorkspace:V,loadWorkflows:O,refreshWorkspaces:Y,refreshWorkflows:ce,clearCache:le,setWorkflows:b,currentPage:l,pageSize:v,setPage:me,setPageSize:fe}}function on({onToolAdded:a}){var Mt;const[t,s]=o.useState(!1),[r,n]=o.useState(!1),[i,c]=o.useState({open:!1,action:"add"}),[f,b]=o.useState({open:!1}),[h,m]=o.useState(navigator.onLine),[x,d]=o.useState(new Set),[l,g]=o.useState(!1),{workspaces:v,workflows:p,selectedWorkspace:C,workspacesLoading:P,workflowsLoading:I,workspacesError:_,workflowsError:O,hasMoreWorkflows:V,currentPage:Y,selectWorkspace:ce,refreshWorkflows:le,setPage:me,setWorkflows:fe}=nn({autoLoadWorkspaces:!0,autoLoadWorkflows:!0});o.useEffect(()=>{const E=()=>m(!0),q=()=>m(!1);return window.addEventListener("online",E),window.addEventListener("offline",q),()=>{window.removeEventListener("online",E),window.removeEventListener("offline",q)}},[]),o.useEffect(()=>{if(!P&&v.length>0&&!C&&!l){const E=v[0];console.log(`自动选择第一个工作空间: ${E.name}`),ce(E.id),g(!0)}P&&l&&g(!1)},[v,P,C,l,ce]);const D=E=>{g(!0),ce(E)},u=E=>{if(!h){j.error("网络连接已断开,请检查网络后重试");return}const q=`add_${E.workflow_id}`;if(x.has(q)){j.warning("该工作流正在添加中,请勿重复操作");return}b({open:!0,workflow:E})},T=async(E,q)=>{const L=`add_${E.workflow_id}`;n(!0),d(z=>new Set(z).add(L));try{if(!E.workflow_id||!E.workflow_name||!E.app_id)throw new Error("工作流数据不完整,缺少必要字段");if(!h)throw new Error("网络连接已断开,请检查网络后重试");const z=q.length>0?{parameters:q}:void 0,K={type:"coze",data:{workflow:E,customName:void 0,customDescription:void 0,parameterConfig:z}},xe=await A.addCustomTool(K);j.success(`已添加工作流 "${E.workflow_name}" 为 MCP 工具 "${xe.name}"${q.length>0?`,配置了 ${q.length} 个参数`:""}`),fe(la=>la.map(rt=>rt.workflow_id===E.workflow_id?{...rt,isAddedAsTool:!0,toolName:xe.name}:rt)),a==null||a(),await le()}catch(z){console.error("添加工作流失败:",z);let K="添加工作流失败,请重试";z instanceof Error&&(z.message.includes("已存在")||z.message.includes("冲突")?K=`工作流 "${E.workflow_name}" 已存在,请勿重复添加`:z.message.includes("配置")||z.message.includes("token")?K="系统配置错误,请检查扣子API配置":z.message.includes("验证失败")||z.message.includes("格式")?K="工作流数据格式错误,请联系管理员":z.message.includes("网络")||z.message.includes("超时")||z.message.includes("连接")?K="网络连接失败,请检查网络后重试":z.message.includes("权限")?K="权限不足,请检查API权限配置":z.message.includes("频繁")?K="操作过于频繁,请稍后重试":K=z.message),j.error(K)}finally{n(!1),d(z=>{const K=new Set(z);return K.delete(L),K}),b({open:!1})}},k=()=>{b({open:!1})},R=async E=>{const q=`add_${E.workflow_id}`;n(!0),d(L=>new Set(L).add(q));try{if(!E.workflow_id||!E.workflow_name||!E.app_id)throw new Error("工作流数据不完整,缺少必要字段");if(!h)throw new Error("网络连接已断开,请检查网络后重试");const L={type:"coze",data:{workflow:E,customName:void 0,customDescription:void 0,parameterConfig:void 0}},z=await A.addCustomTool(L);j.success(`已添加工作流 "${E.workflow_name}" 为 MCP 工具 "${z.name}"`),fe(K=>K.map(xe=>xe.workflow_id===E.workflow_id?{...xe,isAddedAsTool:!0,toolName:z.name}:xe)),a==null||a(),await le()}catch(L){console.error("添加工作流失败:",L);let z="添加工作流失败,请重试";L instanceof Error&&(L.message.includes("已存在")||L.message.includes("冲突")?z=`工作流 "${E.workflow_name}" 已存在,请勿重复添加`:L.message.includes("配置")||L.message.includes("token")?z="系统配置错误,请检查扣子API配置":L.message.includes("验证失败")||L.message.includes("格式")?z="工作流数据格式错误,请联系管理员":L.message.includes("网络")||L.message.includes("超时")||L.message.includes("连接")?z="网络连接失败,请检查网络后重试":L.message.includes("权限")?z="权限不足,请检查API权限配置":L.message.includes("频繁")?z="操作过于频繁,请稍后重试":z=L.message),j.error(z)}finally{n(!1),d(L=>{const z=new Set(L);return z.delete(q),z}),c({open:!1,action:"add"})}},S=()=>{Y>1&&me(Y-1)},y=()=>{V&&me(Y+1)},M=()=>{C&&le()},W=()=>e.jsx("div",{className:"space-y-2",children:_?e.jsxs("div",{className:"flex items-center gap-2 p-3 text-sm text-red-600 bg-red-50 rounded-md",children:[e.jsx(Fe,{className:"h-4 w-4"}),e.jsxs("span",{children:["加载工作空间失败: ",_]})]}):e.jsxs(It,{value:(C==null?void 0:C.id)||"",onValueChange:D,disabled:P,children:[e.jsx(tt,{children:e.jsx(Tt,{placeholder:P?"加载中...":"请选择工作空间"})}),e.jsx(st,{children:v.map(E=>e.jsx(Se,{value:E.id,children:e.jsx("div",{className:"flex items-center gap-2",children:e.jsx("span",{children:E.name})})},E.id))})]})}),at=()=>C?O?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-center",children:[e.jsx(Fe,{className:"h-12 w-12 text-red-500 mb-4"}),e.jsx("h3",{className:"text-lg font-medium mb-2",children:"加载工作流失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:O}),e.jsxs(N,{onClick:M,variant:"outline",children:[e.jsx(hs,{className:"h-4 w-4 mr-2"}),"重试"]})]}):I?e.jsx("div",{className:"space-y-3",children:Array.from({length:3},(E,q)=>q).map(E=>e.jsxs("div",{className:"flex items-center gap-4 p-4 border rounded-lg",children:[e.jsx(be,{className:"w-10 h-10 rounded-lg","data-testid":"skeleton"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx(be,{className:"h-4 w-1/3","data-testid":"skeleton"}),e.jsx(be,{className:"h-3 w-2/3","data-testid":"skeleton"})]}),e.jsx(be,{className:"w-16 h-8","data-testid":"skeleton"})]},`skeleton-${E}`))}):p.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-center",children:[e.jsx(ye,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-medium mb-2",children:"暂无工作流"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"当前工作空间下没有可用的工作流"})]}):e.jsx("div",{className:"space-y-3 max-h-[500px] overflow-auto",children:p.map(E=>e.jsxs("div",{className:"flex items-center gap-4 p-4 border rounded-lg hover:bg-slate-50 transition-colors",children:[e.jsx("div",{className:"flex-shrink-0 w-10 h-10 bg-green-100 rounded-lg flex items-center justify-center text-lg",children:e.jsx(ye,{className:"h-5 w-5 text-green-600"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h4",{className:"font-medium text-sm truncate",children:E.workflow_name}),e.jsx(Z,{variant:"secondary",className:"text-xs",children:"工作流"})]}),e.jsx("p",{className:"text-sm text-muted-foreground line-clamp-2",children:E.description||"暂无描述"})]}),e.jsx("div",{className:"flex-shrink-0",children:E.isAddedAsTool?e.jsx(Z,{variant:"secondary",className:"text-xs bg-green-100 text-green-800",children:"已添加"}):e.jsxs(N,{size:"sm",onClick:()=>u(E),disabled:r,children:[r?e.jsx(Ne,{className:"h-4 w-4 animate-spin","data-testid":"loader"}):e.jsx(Ie,{className:"h-4 w-4"}),"添加"]})})]},E.workflow_id))}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-center",children:[e.jsx(ye,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-medium mb-2",children:"请先选择工作空间"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"选择一个工作空间后,将显示该空间下的工作流列表"})]}),ca=()=>!C||p.length===0?null:e.jsx("div",{className:"flex items-center justify-end",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(N,{variant:"link",size:"sm",onClick:S,disabled:Y===1,className:"text-muted-foreground",children:e.jsx(La,{className:"h-4 w-4"})}),e.jsx("div",{className:"flex items-center gap-1",children:e.jsx("span",{className:"text-sm",children:Y})}),e.jsx(N,{variant:"link",size:"sm",onClick:y,disabled:!V,className:"text-muted-foreground",children:e.jsx(Oa,{className:"h-4 w-4"})})]})});return e.jsxs(e.Fragment,{children:[e.jsxs(ue,{open:t,onOpenChange:s,children:[e.jsx(ve,{asChild:!0,children:e.jsxs(N,{variant:"outline",className:"w-full",children:[e.jsx(ye,{className:"h-4 w-4 mr-2"}),"工作流集成"]})}),e.jsxs(ne,{className:"flex flex-col max-w-full w-[1000px]",children:[e.jsx(oe,{className:"flex-shrink-0",children:e.jsxs(ie,{className:"flex items-center gap-2",children:[e.jsx(ye,{className:"h-5 w-5"}),"工作流集成"]})}),e.jsx("div",{className:"w-[120px]",children:W()}),e.jsx("div",{className:"flex-1 pr-2 w-full",children:at()}),ca()]})]}),f.workflow&&e.jsx(Qs,{open:f.open,onOpenChange:E=>b(q=>({...q,open:E})),workflow:f.workflow,onConfirm:T,onCancel:k,title:"配置工作流参数"}),e.jsx(Ye,{open:i.open,onOpenChange:E=>c(q=>({...q,open:E})),children:e.jsxs(We,{children:[e.jsxs(ze,{children:[e.jsx($e,{children:"确认添加工作流"}),e.jsxs(Ae,{children:['确定要将工作流 "',(Mt=i.workflow)==null?void 0:Mt.workflow_name,'" 添加为 MCP 工具吗?']})]}),e.jsxs(De,{children:[e.jsx(Oe,{children:"取消"}),e.jsx(Le,{onClick:()=>{i.workflow&&R(i.workflow)},children:"添加"})]})]})})]})}const cn=H.object({config:H.string().min(2,{message:"配置不能为空"})});function ln({mcpServer:a,mcpServerName:t}){const[s,r]=o.useState(!1),[n,i]=o.useState(!1),c=je(),{updateConfig:f}=Gs(),b=Te({resolver:Re(cn),defaultValues:{config:JSON.stringify(a,null,2)}});async function h(m){if(!c){j.error("配置数据未加载,请稍后重试");return}i(!0);try{let x;try{x=JSON.parse(m.config)}catch{j.error("JSON格式错误,请检查配置格式");return}if(!x||typeof x!="object"){j.error("配置格式无效");return}const d={...c,mcpServers:{...c.mcpServers,[t]:x}};await f(d),j.success("MCP服务器配置已更新"),r(!1)}catch(x){console.error("更新配置失败:",x),j.error(x instanceof Error?x.message:"更新配置失败")}finally{i(!1)}}return e.jsxs(ue,{open:s,onOpenChange:r,children:[e.jsx(ve,{asChild:!0,children:e.jsx(N,{variant:"secondary",size:"icon",className:"size-8",children:e.jsx(Pe,{className:"h-4 w-4"})})}),e.jsx(ne,{className:"sm:max-w-[500px]",children:e.jsx(Ue,{...b,children:e.jsxs("form",{onSubmit:b.handleSubmit(h),children:[e.jsxs(oe,{className:"mb-4",children:[e.jsxs(ie,{children:["配置 ",t," MCP"]}),e.jsx(he,{children:"点击保存后,需要重启服务才会生效。"})]}),e.jsx("div",{className:"grid gap-4",children:e.jsx(Q,{control:b.control,name:"config",render:({field:m})=>e.jsxs(G,{children:[e.jsx(X,{children:e.jsx(Rt,{placeholder:"MCP服务配置",className:"resize-none h-[300px] font-mono text-sm",disabled:n,...m})}),e.jsx(ee,{})]})})}),e.jsxs(ge,{className:"mt-4",children:[e.jsx(Qe,{asChild:!0,children:e.jsx(N,{variant:"outline",disabled:n,children:"取消"})}),e.jsx(N,{type:"submit",disabled:n,children:n?"保存中...":"保存"})]})]})})})]})}function dn({mcpServerName:a,onRemoveSuccess:t,disabled:s=!1}){const[r,n]=o.useState(!1),i=async()=>{try{if(n(!0),!await dt.removeServer(a))throw new Error("删除服务器失败");j.success(`MCP 服务 "${a}" 已删除`),t&&await t()}catch(c){console.error("删除 MCP 服务失败:",c),j.error(`删除 MCP 服务失败: ${c instanceof Error?c.message:"未知错误"}`)}finally{n(!1)}};return e.jsxs(Ye,{children:[e.jsx(Ar,{asChild:!0,children:e.jsx(N,{variant:"destructive",size:"icon",className:"size-8",disabled:s||r,children:e.jsx(ss,{className:"h-4 w-4"})})}),e.jsxs(We,{children:[e.jsxs(ze,{children:[e.jsxs($e,{children:["确定要删除这个(",a,")MCP服务吗?"]}),e.jsx(Ae,{children:"删除后,对应的工具列表也会移除。"})]}),e.jsxs(De,{children:[e.jsx(Oe,{children:"取消"}),e.jsx(Le,{onClick:i,disabled:s||r,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:r?"删除中...":"确定"})]})]})]})}function ea({disabled:a=!1,variant:t="outline",className:s="",restartingText:r="重启中...",defaultText:n="重启服务"}){const{loading:{isRestarting:i},restartService:c}=ae(),f=js(),b=async()=>{try{await c()}catch(m){console.error("[RestartButton] 重启失败:",m)}},h=()=>i?f.enabled&&f.startTime?"重连中...":r:n;return e.jsxs(N,{type:"button",onClick:b,variant:t,disabled:i||a,className:ws("flex items-center gap-2 w-[120px]",s),children:[i?e.jsx(Ne,{className:"size-4 animate-spin"}):e.jsx(Ua,{className:"size-4"}),h()]})}function un({updateConfig:a}){const t=Ur(),s=qs(),{refreshConfig:r}=Pt(),[n,i]=o.useState([]),[c,f]=o.useState([]),[b,h]=o.useState(!1),[m,x]=o.useState(null),d=o.useCallback((u,T)=>{var S,y;const{serviceName:k,toolName:R}=(()=>{var M,W;return!u||!u.handler?{serviceName:"unknown",toolName:(u==null?void 0:u.name)||"unknown"}:u.handler.type==="mcp"?{serviceName:((M=u.handler.config)==null?void 0:M.serviceName)||"unknown",toolName:((W=u.handler.config)==null?void 0:W.toolName)||u.name}:u.handler.type==="proxy"&&u.handler.platform==="coze"?{serviceName:"coze",toolName:u.name}:{serviceName:"custom",toolName:u.name}})();return{serverName:k,toolName:R,enable:T,name:u.name,description:u.description,usageCount:(S=u.stats)==null?void 0:S.usageCount,lastUsedTime:(y=u.stats)==null?void 0:y.lastUsedTime,inputSchema:u.inputSchema}},[]),l=o.useCallback(async()=>{h(!0),x(null);try{const[u,T]=await Promise.all([A.getToolsList("enabled"),A.getToolsList("disabled")]),k=u.map(S=>d(S,!0)),R=T.map(S=>d(S,!1));i(k),f(R)}catch(u){console.error("获取工具列表失败:",u);const T=u instanceof Error?u.message:"获取工具列表失败";if(x(T),j.error(T),t){const k=Object.entries(t).flatMap(([y,M])=>Object.entries((M==null?void 0:M.tools)||{}).map(([W,at])=>({serverName:y,toolName:W,...at}))),R=k.filter(y=>y.enable!==!1),S=k.filter(y=>y.enable===!1);i(R),f(S)}}finally{h(!1)}},[t,d]),[g,v]=o.useState(!1),p=o.useCallback(async()=>{if(!g)try{v(!0),await Promise.all([r(),l()])}catch(u){console.error("刷新数据失败:",u),j.error("刷新数据失败")}finally{v(!1)}},[r,l,g]),C=o.useCallback(async()=>{try{const[u,T]=await Promise.all([A.getToolsList("enabled"),A.getToolsList("disabled")]),k=u.map(S=>d(S,!0)),R=T.map(S=>d(S,!1));i(k),f(R)}catch(u){console.error("刷新工具列表失败:",u),j.error("刷新工具列表失败")}},[d]);o.useEffect(()=>{l()},[l]);const[P,I]=o.useState(null),[_,O]=o.useState({open:!1}),V=async(u,T)=>{try{if(T){const k=[...n,...c].find(R=>R.name===u);if(!k){j.error("找不到对应的工具信息");return}if(k.serverName==="coze"){I(u);return}await A.removeCustomTool(u),j.success(`删除工具 ${u} 成功`)}else{const k=[...n,...c].find(R=>R.name===u);if(!k){j.error("找不到对应的工具信息");return}k.serverName==="coze"?await A.addCustomTool({workflow_id:"",workflow_name:u,description:k.description||"",icon_url:"",app_id:""},u,k.description||""):await A.addCustomTool({type:"mcp",data:{serviceName:k.serverName,toolName:k.toolName,customName:u,customDescription:k.description||""}}),j.success(`添加工具 ${u} 成功`)}await C()}catch(k){console.error("切换工具状态失败:",k),j.error(k instanceof Error?k.message:"切换工具状态失败")}},Y=async()=>{if(P)try{await A.removeCustomTool(P),j.success(`删除工具 ${P} 成功`),await C()}catch(u){console.error("删除 Coze 工具失败:",u),j.error(u instanceof Error?u.message:"删除 Coze 工具失败")}finally{I(null)}},ce=()=>{I(null)},le=u=>{u.serverName==="coze"&&O({open:!0,tool:u})},me=u=>{var T,k,R;return u.serverName==="coze"&&((T=u.handler)==null?void 0:T.type)==="proxy"?{workflow_id:((k=u.handler.config)==null?void 0:k.workflow_id)||"",workflow_name:u.toolName,description:u.description||"",icon_url:"",app_id:((R=u.handler.config)==null?void 0:R.app_id)||"",creator:{id:"",name:""},created_at:0,updated_at:0,isAddedAsTool:!0,toolName:u.name,inputSchema:u.inputSchema}:{workflow_id:"",workflow_name:u.toolName,description:u.description||"",icon_url:"",app_id:"",creator:{id:"",name:""},created_at:0,updated_at:0,isAddedAsTool:!0,toolName:u.name,inputSchema:u.inputSchema}},fe=async(u,T)=>{if(_.tool)try{const k=T.length>0?{parameters:T}:void 0,R=me(_.tool);u.workflow_id&&(R.workflow_id=u.workflow_id),u.app_id&&(R.app_id=u.app_id);const S={type:"coze",data:{workflow:R,customName:void 0,customDescription:void 0,parameterConfig:k}};await A.updateCustomTool(_.tool.name,S),j.success(`工具 "${R.workflow_name}" 参数配置更新成功`),await C()}catch(k){console.error("更新工具参数配置失败:",k);let R="更新工具参数配置失败,请重试";k instanceof Error&&(R=k.message),j.error(R)}finally{O({open:!1})}},D=()=>{O({open:!1})};return!s||Object.keys(s).length===0?e.jsx("div",{className:"@container/main flex flex-1 flex-col gap-2",children:e.jsxs("div",{className:"flex flex-col gap-4 py-4 md:gap-6 md:py-6",children:[e.jsx("div",{className:"flex items-center justify-between px-4 lg:px-6",children:e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:"你的聚合 MCP 服务"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"在这里管理你的 MCP 服务器和工具。"})]})}),e.jsx("div",{className:"px-4 lg:px-6",children:e.jsx(de,{className:"border-dashed",children:e.jsxs(we,{className:"flex flex-col items-center justify-center py-12",children:[e.jsx(Dt,{className:"h-12 w-12 text-muted-foreground mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"还没有 MCP 服务"}),e.jsx("p",{className:"text-sm text-muted-foreground text-center mb-4",children:"添加你的第一个 MCP 服务器来开始使用强大的工具集成功能。"}),e.jsx(qt,{})]})})})]})}):e.jsxs("div",{className:"flex flex-col gap-4 px-4 lg:px-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold",children:"你的聚合 MCP 服务"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"你可以在这里管理你的 MCP 服务,包括启用/禁用工具,以及查看工具的详细信息。"})]}),g&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx("div",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-primary"}),"刷新中..."]})]}),e.jsxs("div",{className:"*:data-[slot=card]:shadow-xs @xl/main:grid-cols-8 @5xl/main:grid-cols-8 grid grid-cols-1 gap-4 *:data-[slot=card]:bg-gradient-to-t *:data-[slot=card]:from-primary/5 *:data-[slot=card]:to-card dark:*:data-[slot=card]:bg-card",children:[e.jsx(de,{className:"transition-all duration-200 col-span-3",children:e.jsx(we,{className:"p-4",children:e.jsxs("div",{className:"flex-col",children:[e.jsxs("h4",{className:"text-sm font-medium mb-3 flex items-center gap-2",children:[e.jsx($t,{className:"h-4 w-4"}),"使用中的工具 (",n.length,")",b&&e.jsx("span",{className:"text-xs text-muted-foreground",children:"(加载中...)"})]}),e.jsx("div",{className:"flex-1 space-y-2",children:b?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx("div",{className:"text-sm text-muted-foreground",children:"加载工具列表中..."})}):m?e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 px-4",children:[e.jsx("div",{className:"text-sm text-red-500 mb-2",children:m}),e.jsx(N,{variant:"outline",size:"sm",onClick:l,children:"重试"})]}):n.map(u=>e.jsxs("div",{className:"flex items-start justify-between p-4 bg-slate-50 rounded-md font-mono",children:[e.jsxs("div",{className:"text-md flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 justify-start",children:[e.jsx(Z,{variant:"secondary",className:"rounded-md",children:u.serverName}),e.jsx("span",{children:u.toolName})]}),e.jsx("p",{className:"text-sm text-muted-foreground my-2",children:u.description}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[e.jsx("span",{className:"text-muted-foreground",children:"使用次数:"})," ",e.jsx("span",{className:"text-primary font-bold",children:u.usageCount||0})]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[e.jsx("span",{className:"text-muted-foreground",children:"最后使用:"})," ",e.jsx("span",{className:"text-primary font-bold",children:u.lastUsedTime||"-"})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2 ml-4",children:[u.serverName==="coze"&&e.jsx(N,{variant:"secondary",size:"icon",className:"size-8 hover:bg-blue-500 hover:text-white",onClick:()=>le(u),title:"配置参数",children:e.jsx(Pe,{size:16})}),e.jsx(N,{variant:"secondary",size:"icon",className:"size-8 hover:bg-red-500 hover:text-white",onClick:()=>V(u.name,!0),children:e.jsx(_a,{size:18})})]})]},u.toolName))})]})})}),e.jsx(de,{className:"transition-all duration-200 col-span-3",children:e.jsx(we,{className:"p-4",children:e.jsxs("div",{className:"flex-col",children:[e.jsxs("h4",{className:"text-sm font-medium mb-3 flex items-center gap-2",children:[e.jsx($t,{className:"h-4 w-4"}),"未使用的工具 (",c.length,")",b&&e.jsx("span",{className:"text-xs text-muted-foreground",children:"(加载中...)"})]}),e.jsx("div",{className:"flex-1 space-y-2",children:b?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx("div",{className:"text-sm text-muted-foreground",children:"加载工具列表中..."})}):m?e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 px-4",children:[e.jsx("div",{className:"text-sm text-red-500 mb-2",children:m}),e.jsx(N,{variant:"outline",size:"sm",onClick:l,children:"重试"})]}):c.length===0?e.jsxs("div",{className:"flex-1 flex flex-col items-center gap-4 py-20 px-4 bg-slate-50 rounded-md font-mono h-full",children:[e.jsx(Dt,{strokeWidth:1.5,size:48,className:"text-muted-foreground"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"全部工具都已经启用"})]}):c.map(u=>e.jsxs("div",{className:"flex items-start justify-between p-4 bg-slate-50 rounded-md font-mono",children:[e.jsxs("div",{className:"text-md flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2 justify-start",children:[e.jsx(Z,{variant:"secondary",className:"rounded-md",children:u.serverName}),e.jsx("span",{children:u.toolName})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:u.description}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:[e.jsx("span",{className:"text-muted-foreground",children:"使用次数:"})," ",e.jsx("span",{className:"text-primary font-bold",children:u.usageCount||0})]}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[e.jsx("span",{className:"text-muted-foreground",children:"最后使用:"})," ",e.jsx("span",{className:"text-primary font-bold",children:u.lastUsedTime||"-"})]})]})]}),e.jsx("div",{className:"flex items-center gap-2 ml-4",children:e.jsx(N,{variant:"secondary",size:"icon",className:"size-8 hover:bg-green-500 hover:text-white",onClick:()=>V(u.name,!1),children:e.jsx(Ie,{className:"h-4 w-4"})})})]},u.toolName))})]})})}),e.jsxs("div",{className:"transition-all duration-200 gap-4 flex flex-col col-span-2",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(qt,{}),e.jsx(ea,{})]}),e.jsx(on,{onToolAdded:C})]}),Object.entries(s||{}).map(([u,T])=>e.jsxs(de,{className:"transition-all duration-200",children:[e.jsx(we,{className:"p-0",children:e.jsx("div",{className:"p-4 pb-2",children:e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx("div",{className:"flex items-start gap-4 flex-1",children:e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"flex items-center gap-2 mb-2",children:e.jsx("h3",{className:"text-lg font-semibold",children:u})})})}),e.jsxs("div",{className:"flex items-center gap-2 ml-4",children:[e.jsx(ln,{mcpServerName:u,mcpServer:T}),e.jsx(dn,{mcpServerName:u,onRemoveSuccess:p,disabled:g})]})]})})}),e.jsx(He,{className:"p-4 pt-2",children:e.jsx(Z,{variant:"outline",className:"text-xs",children:mt(T)})})]},u))]})]}),e.jsx(Ye,{open:P!==null,onOpenChange:u=>!u&&I(null),children:e.jsxs(We,{children:[e.jsxs(ze,{children:[e.jsx($e,{children:"确认移除 Coze 工作流工具"}),e.jsxs(Ae,{children:['移除后需要通过【工作流集成】重新添加并配置入参,确定要移除工具 "',P,'" 吗?']})]}),e.jsxs(De,{children:[e.jsx(Oe,{onClick:ce,children:"取消"}),e.jsx(Le,{onClick:Y,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"确认移除"})]})]})}),_.tool&&e.jsx(Qs,{open:_.open,onOpenChange:u=>O(T=>({...T,open:u})),workflow:_.tool,onConfirm:fe,onCancel:D,title:"配置工作流参数"})]})}function ta({title:a}){return e.jsxs("header",{className:"group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 flex h-12 shrink-0 items-center gap-2 border-b transition-[width,height] ease-linear",children:[e.jsxs("div",{className:"flex w-full items-center gap-1 px-4 lg:gap-2 lg:px-6",children:[e.jsx(Ws,{className:"-ml-1"}),e.jsx(vt,{orientation:"vertical",className:"mx-2 data-[orientation=vertical]:h-4"}),e.jsx("h1",{className:"text-base font-medium",children:a})]}),e.jsx("div",{className:"flex w-full justify-end items-center gap-1 px-4 lg:gap-2 lg:px-6",children:e.jsx("a",{href:"https://github.com/shenjingnan/xiaozhi-client",target:"_blank",rel:"noopener noreferrer",children:e.jsx(Ba,{size:24,className:"text-slate-500",fill:"currentColor"})})})]})}function sa(){const[a,t]=o.useState({status:"idle",logs:[]});o.useEffect(()=>{const b=$.subscribe("data:npmInstallStarted",d=>{console.log("[useNPMInstall] 安装开始:",d),t({status:"installing",version:d.version,installId:d.installId,logs:[]})}),h=$.subscribe("data:npmInstallLog",d=>{console.log("[useNPMInstall] 收到日志:",d),t(l=>l.installId===d.installId?{...l,logs:[...l.logs,{type:d.type,message:d.message,timestamp:d.timestamp}]}:l)}),m=$.subscribe("data:npmInstallCompleted",d=>{console.log("[useNPMInstall] 安装完成:",d),t(l=>l.installId===d.installId?{...l,status:"completed",duration:d.duration}:l)}),x=$.subscribe("data:npmInstallFailed",d=>{console.log("[useNPMInstall] 安装失败:",d),t(l=>l.installId===d.installId?{...l,status:"failed",error:d.error,duration:d.duration}:l)});return()=>{b(),h(),m(),x()}},[]);const s=o.useCallback(async b=>{var h;try{console.log("[useNPMInstall] 开始安装版本:",b);const x=await(await fetch("/api/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({version:b})})).json();if(!x.success)throw new Error(((h=x.error)==null?void 0:h.message)||"安装请求失败");return console.log("[useNPMInstall] 安装请求已接受:",x),x}catch(m){throw console.error("[useNPMInstall] 安装请求失败:",m),t(x=>({...x,status:"failed",error:m instanceof Error?m.message:"未知错误"})),m}},[]),r=o.useCallback(()=>{console.log("[useNPMInstall] 清除安装状态"),t({status:"idle",logs:[]})},[]),n=o.useCallback(()=>{switch(a.status){case"installing":return`正在安装 xiaozhi-client@${a.version}...`;case"completed":return"安装完成!";case"failed":return`安装失败: ${a.error}`;default:return""}},[a]),i=o.useCallback(()=>{switch(a.status){case"installing":return"text-blue-600";case"completed":return"text-green-600";case"failed":return"text-red-600";default:return"text-gray-600"}},[a]),c=o.useCallback(()=>a.status==="installing",[a.status]),f=o.useCallback(()=>a.status!=="installing",[a.status]);return{installStatus:a,startInstall:s,clearStatus:r,getStatusText:n,getStatusColor:i,isInstalling:c,canCloseDialog:f}}const aa=o.forwardRef(({className:a,children:t,...s},r)=>e.jsx("div",{ref:r,className:w("relative overflow-auto",a),...s,children:t}));aa.displayName="ScrollArea";const mn=o.forwardRef(({className:a,orientation:t="vertical",...s},r)=>e.jsx("div",{ref:r,className:w("flex touch-none select-none transition-colors",t==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",t==="horizontal"&&"h-2.5 w-full border-t border-t-transparent p-[1px]",a),...s,children:e.jsx("div",{className:"relative flex-1 rounded-full bg-border"})}));mn.displayName="ScrollBar";function ra({isOpen:a,onClose:t,version:s}){const{installStatus:r,startInstall:n,clearStatus:i,getStatusText:c,getStatusColor:f,isInstalling:b,canCloseDialog:h}=sa(),m=o.useRef(null);o.useEffect(()=>{a&&s&&(console.log("[InstallLogDialog] 对话框打开,开始安装版本:",s),i(),n(s).catch(p=>{console.error("[InstallLogDialog] 启动安装失败:",p)}))},[a,s,n,i]),o.useEffect(()=>{const p=setTimeout(()=>{m.current&&(m.current.scrollTop=m.current.scrollHeight)},100);return()=>clearTimeout(p)});const x=()=>{switch(r.status){case"installing":return e.jsx(nt,{className:"h-4 w-4 animate-pulse"});case"completed":return e.jsx(lt,{className:"h-4 w-4 text-green-600"});case"failed":return e.jsx(Va,{className:"h-4 w-4 text-red-600"});default:return null}},d=()=>{switch(r.status){case"installing":return"default";case"completed":return"secondary";case"failed":return"destructive";default:return"outline"}},l=p=>{let C=p;const P=[/\[0m/g,/\[31m/g,/\[32m/g,/\[33m/g,/\[34m/g,/\[35m/g,/\[36m/g,/\[37m/g,/\[90m/g,/\[91m/g,/\[92m/g,/\[93m/g,/\[94m/g,/\[95m/g,/\[96m/g,/\[97m/g];for(const I of P)C=C.replace(I,"");return C.split(`
31
+ `).filter(I=>I.trim()).map((I,_)=>e.jsx("div",{className:"leading-relaxed",children:I},`${I.slice(0,20)}-${_}`))},g=()=>{h()&&(i(),t())},v=p=>{p.key==="Escape"&&h()&&g()};return e.jsx(ue,{open:a,onOpenChange:g,children:e.jsxs(ne,{className:"max-w-4xl max-h-[80vh] flex flex-col",onKeyDown:v,children:[e.jsxs(oe,{className:"flex flex-row items-center justify-between space-y-0 pb-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ie,{className:"text-lg font-semibold",children:"安装日志"}),r.status!=="idle"&&e.jsxs(Z,{variant:d(),className:"flex items-center gap-1",children:[x(),c()]})]}),e.jsx(N,{variant:"ghost",size:"icon",onClick:g,disabled:!h(),className:"h-6 w-6",children:e.jsx(wt,{className:"h-4 w-4"})})]}),r.status!=="idle"&&e.jsxs("div",{className:"flex items-center justify-between p-3 bg-muted/50 rounded-md border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`font-medium ${f()}`,children:c()}),r.version&&e.jsxs(Z,{variant:"outline",className:"text-xs",children:["v",r.version]})]}),e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[r.duration&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(qa,{className:"h-3 w-3"}),e.jsxs("span",{children:["耗时: ",(r.duration/1e3).toFixed(1),"s"]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(nt,{className:"h-3 w-3"}),e.jsxs("span",{children:["日志: ",r.logs.length," 条"]})]})]})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(aa,{ref:m,className:"h-[400px] w-full rounded-md border bg-background",children:e.jsx("div",{className:"p-4 font-mono text-sm",children:r.logs.length===0?e.jsxs("div",{className:"text-muted-foreground flex items-center gap-2",children:[e.jsx(nt,{className:"h-4 w-4 animate-pulse"}),r.status==="installing"?"正在启动安装...":"等待安装开始..."]}):e.jsx("div",{className:"space-y-1",children:r.logs.map(p=>e.jsx("div",{className:`${p.type==="stderr"?"text-red-600":"text-foreground"} break-words`,children:l(p.message)},`${p.timestamp}-${p.message.slice(0,50)}`))})})})}),e.jsxs(ge,{className:"flex items-center justify-between pt-4 border-t",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:r.installId&&e.jsxs("span",{children:["安装ID: ",r.installId]})}),e.jsxs("div",{className:"flex gap-2",children:[r.status==="completed"&&e.jsxs(N,{variant:"outline",onClick:()=>window.location.reload(),className:"flex items-center gap-2",children:[e.jsx(lt,{className:"h-4 w-4"}),"重启应用"]}),e.jsx(N,{onClick:g,disabled:!h(),variant:r.status==="failed"?"destructive":"default",children:b()?"安装中...":r.status==="completed"?"完成":(r.status==="failed","关闭")})]})]})]})})}function fn({children:a}){const[t,s]=o.useState(!1),[r,n]=o.useState(""),[i,c]=o.useState(!1),{startInstall:f}=sa(),b=[{value:"1.7.8",label:"v1.7.8"},{value:"1.7.7",label:"v1.7.7"}],h=l=>{n(l)},m=async()=>{if(r)try{console.log("[VersionUpgradeDialog] 开始安装版本:",r),s(!1),c(!0),await f(r)}catch(l){console.error("[VersionUpgradeDialog] 安装失败:",l),c(!1)}},x=()=>{c(!1),n("")},d=l=>{l||n(""),s(l)};return e.jsxs(e.Fragment,{children:[e.jsxs(ue,{open:t,onOpenChange:d,children:[e.jsx(ve,{asChild:!0,children:a||e.jsxs(N,{className:"flex items-center gap-2",children:[e.jsx(ps,{className:"h-4 w-4"}),"升级版本"]})}),e.jsxs(ne,{className:"sm:max-w-md",children:[e.jsxs(oe,{children:[e.jsx(ie,{children:"选择安装版本"}),e.jsx(he,{children:"请选择要安装的 xiaozhi-client 版本"})]}),e.jsx("div",{className:"space-y-4 py-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"version-select",className:"text-sm font-medium",children:"版本选择"}),e.jsxs(It,{value:r,onValueChange:h,children:[e.jsx(tt,{id:"version-select",children:e.jsx(Tt,{placeholder:"请选择版本"})}),e.jsx(st,{children:b.map(l=>e.jsx(Se,{value:l.value,children:l.label},l.value))})]})]})}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(N,{variant:"outline",onClick:()=>s(!1),children:"取消"}),e.jsx(N,{onClick:m,disabled:!r,children:"确定安装"})]})]})]}),e.jsx(ra,{isOpen:i,onClose:x,version:r})]})}class hn{constructor(){U(this,"apiClient");U(this,"webSocketManager");U(this,"initialized",!1);this.apiClient=A,this.webSocketManager=$}async initialize(){this.initialized||(console.log("[NetworkService] 初始化网络服务"),this.webSocketManager.connect(),this.initialized=!0,console.log("[NetworkService] 网络服务初始化完成"))}destroy(){console.log("[NetworkService] 销毁网络服务"),this.webSocketManager.disconnect(),this.initialized=!1}async getConfig(){return this.apiClient.getConfig()}async updateConfig(t){return this.apiClient.updateConfig(t)}async getStatus(){return this.apiClient.getStatus()}async getClientStatus(){return this.apiClient.getClientStatus()}async restartService(){return this.apiClient.restartService()}async stopService(){return this.apiClient.stopService()}async startService(){return this.apiClient.startService()}async getServiceStatus(){return this.apiClient.getServiceStatus()}async getServiceHealth(){return this.apiClient.getServiceHealth()}async getMcpEndpoint(){return this.apiClient.getMcpEndpoint()}async getMcpEndpoints(){return this.apiClient.getMcpEndpoints()}async getMcpServers(){return this.apiClient.getMcpServers()}async getConnectionConfig(){return this.apiClient.getConnectionConfig()}async reloadConfig(){return this.apiClient.reloadConfig()}async getConfigPath(){return this.apiClient.getConfigPath()}async checkConfigExists(){return this.apiClient.checkConfigExists()}async getRestartStatus(){return this.apiClient.getRestartStatus()}async checkClientConnected(){return this.apiClient.checkClientConnected()}async getLastHeartbeat(){return this.apiClient.getLastHeartbeat()}async getActiveMCPServers(){return this.apiClient.getActiveMCPServers()}async updateClientStatus(t){return this.apiClient.updateClientStatus(t)}async setActiveMCPServers(t){return this.apiClient.setActiveMCPServers(t)}async resetStatus(){return this.apiClient.resetStatus()}getWebSocketState(){return this.webSocketManager.getState()}isWebSocketConnected(){return this.webSocketManager.isConnected()}setWebSocketUrl(t){this.webSocketManager.setUrl(t)}onWebSocketEvent(t,s){this.webSocketManager.on(t,s)}offWebSocketEvent(t){this.webSocketManager.off(t)}reconnectWebSocket(){this.webSocketManager.disconnect(),setTimeout(()=>{this.webSocketManager.connect()},1e3)}async getFullAppState(){const[t,s]=await Promise.all([this.getConfig(),this.getStatus()]);return{config:t,status:s,webSocketConnected:this.isWebSocketConnected()}}async updateConfigWithNotification(t,s=5e3){return new Promise((r,n)=>{const i=setTimeout(()=>{this.webSocketManager.off("configUpdate"),n(new Error("等待配置更新通知超时"))},s);this.webSocketManager.on("configUpdate",()=>{clearTimeout(i),this.webSocketManager.off("configUpdate"),r()}),this.updateConfig(t).catch(c=>{clearTimeout(i),this.webSocketManager.off("configUpdate"),n(c)})})}async restartServiceWithNotification(t=3e4){return new Promise((s,r)=>{const n=setTimeout(()=>{this.webSocketManager.off("restartStatus"),r(new Error("等待重启状态通知超时"))},t);this.webSocketManager.on("restartStatus",i=>{i.status==="completed"?(clearTimeout(n),this.webSocketManager.off("restartStatus"),s()):i.status==="failed"&&(clearTimeout(n),this.webSocketManager.off("restartStatus"),r(new Error(i.error||"服务重启失败")))}),this.restartService().catch(i=>{clearTimeout(n),this.webSocketManager.off("restartStatus"),r(i)})})}}const B=new hn;function pn(){const a=Js(),t=o.useRef(!1);o.useEffect(()=>{if(!t.current)return console.log("[NetworkService] 初始化网络服务"),t.current=!0,B.initialize().catch(l=>{console.error("[NetworkService] 初始化失败:",l)}),B.onWebSocketEvent("connected",()=>{console.log("[NetworkService] WebSocket 已连接"),a.setConnectionState(J.CONNECTED),s()}),B.onWebSocketEvent("disconnected",()=>{console.log("[NetworkService] WebSocket 已断开"),a.setConnectionState(J.DISCONNECTED)}),B.onWebSocketEvent("configUpdate",l=>{console.log("[NetworkService] 收到配置更新通知"),re.getState().setConfig(l,"websocket")}),B.onWebSocketEvent("statusUpdate",l=>{console.log("[NetworkService] 收到状态更新通知"),ae.getState().setClientStatus(l,"websocket")}),B.onWebSocketEvent("restartStatus",l=>{console.log("[NetworkService] 收到重启状态通知:",l),ae.getState().setRestartStatus(l,"websocket")}),B.onWebSocketEvent("error",l=>{console.error("[NetworkService] WebSocket 错误:",l)}),()=>{console.log("[NetworkService] 清理网络服务"),B.destroy(),t.current=!1}},[a]);const s=o.useCallback(async()=>{try{console.log("[NetworkService] 加载初始数据");const[l,g]=await Promise.all([B.getConfig(),B.getClientStatus()]);console.log("[NetworkService] 初始数据加载成功"),re.getState().setConfig(l,"http"),ae.getState().setClientStatus(g,"http")}catch(l){console.error("[NetworkService] 加载初始数据失败:",l)}},[]),r=o.useCallback(async()=>{try{const l=await B.getConfig();return re.getState().setConfig(l,"http"),l}catch(l){throw console.error("[NetworkService] 获取配置失败:",l),l}},[]),n=o.useCallback(async l=>{try{console.log("[NetworkService] 更新配置"),await B.updateConfig(l),re.getState().setConfig(l,"http"),console.log("[NetworkService] 配置更新成功")}catch(g){throw console.error("[NetworkService] 配置更新失败:",g),g}},[]),i=o.useCallback(async()=>{try{const l=await B.getStatus();return ae.getState().setClientStatus(l.client,"http"),l}catch(l){throw console.error("[NetworkService] 获取状态失败:",l),l}},[]),c=o.useCallback(async()=>{try{await i()}catch(l){console.error("[NetworkService] 刷新状态失败:",l)}},[i]),f=o.useCallback(async()=>{try{console.log("[NetworkService] 重启服务"),await B.restartService(),console.log("[NetworkService] 重启请求已发送")}catch(l){throw console.error("[NetworkService] 重启服务失败:",l),l}},[]),b=o.useCallback(async(l=3e4)=>{try{console.log("[NetworkService] 重启服务并等待通知"),await B.restartServiceWithNotification(l),console.log("[NetworkService] 服务重启完成")}catch(g){throw console.error("[NetworkService] 重启服务失败:",g),g}},[]),h=o.useCallback(async(l,g=5e3)=>{try{console.log("[NetworkService] 更新配置并等待通知"),await B.updateConfigWithNotification(l,g),console.log("[NetworkService] 配置更新完成")}catch(v){throw console.error("[NetworkService] 配置更新失败:",v),v}},[]),m=o.useCallback(l=>{console.log("[NetworkService] 设置自定义 WebSocket URL:",l),B.setWebSocketUrl(l),a.setWsUrl(l)},[a]),x=o.useCallback(async l=>{try{console.log(`[NetworkService] 切换到端口 ${l}`),a.setPortChangeStatus({status:"checking",targetPort:l,timestamp:Date.now()});const g=window.location.protocol==="https:"?"wss:":"ws:",v=window.location.hostname,p=`${g}//${v}:${l}`;await f(),await new Promise(C=>setTimeout(C,5e3)),m(p),window.location.reload()}catch(g){throw console.error("[NetworkService] 端口切换失败:",g),a.setPortChangeStatus({status:"failed",targetPort:l,error:g instanceof Error?g.message:"端口切换失败",timestamp:Date.now()}),g}},[a,f,m]),d=o.useCallback(()=>{const l=localStorage.getItem("xiaozhi-ws-url");if(l)return l;const g=window.location.protocol==="https:"?"wss:":"ws:",v=window.location.hostname,p=window.location.port;return`${g}//${v}${p?`:${p}`:""}`},[]);return{getConfig:r,updateConfig:n,getStatus:i,refreshStatus:c,restartService:f,updateConfigWithNotification:h,restartServiceWithNotification:b,setCustomWsUrl:m,getWebSocketUrl:d,changePort:x,loadInitialData:s,isWebSocketConnected:()=>B.isWebSocketConnected(),getWebSocketState:()=>B.getWebSocketState()}}async function gn(){console.log("[Stores] 开始初始化所有 stores");try{console.log("[Stores] 初始化 WebSocket store"),_e.getState().initialize(),console.log("[Stores] 初始化配置 store"),await re.getState().initialize(),console.log("[Stores] 初始化状态 store"),await ae.getState().initialize(),console.log("[Stores] 所有 stores 初始化完成")}catch(a){throw console.error("[Stores] Stores 初始化失败:",a),a}}const na=o.createContext(null);function xn({children:a}){const t=pn(),[s,r]=o.useState(!1);return o.useEffect(()=>{let n=!0;return(async()=>{try{console.log("[WebSocketProvider] 开始初始化 stores"),await gn(),n&&(r(!0),console.log("[WebSocketProvider] Stores 初始化完成"))}catch(c){console.error("[WebSocketProvider] Stores 初始化失败:",c),n&&r(!0)}})(),()=>{n=!1}},[]),s?e.jsx(na.Provider,{value:t,children:a}):e.jsx("div",{className:"flex items-center justify-center min-h-screen",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-2"}),e.jsx("p",{className:"text-sm text-gray-600",children:"正在初始化应用..."})]})})}function bn(){const a=o.useContext(na);if(!a)throw new Error("useNetworkServiceActions must be used within a NetworkServiceProvider");return a}const wn=xn,oa=bn;function Sn(){const{updateConfig:a}=oa();return e.jsxs(yt,{children:[e.jsx(Os,{variant:"inset"}),e.jsxs(Nt,{children:[e.jsx(ta,{title:"看板"}),e.jsx("div",{className:"flex flex-1 flex-col",children:e.jsx("div",{className:"@container/main flex flex-1 flex-col gap-2",children:e.jsxs("div",{className:"flex flex-col gap-4 py-4 md:gap-6 md:py-6",children:[e.jsx("div",{className:"px-4 md:px-6",children:e.jsx(fn,{})}),e.jsx(Zr,{}),e.jsx(un,{updateConfig:a})]})})})]})]})}function vn(){const[a,t]=o.useState(null),[s,r]=o.useState(null),[n,i]=o.useState(!1),[c,f]=o.useState(null),[b,h]=o.useState(!1),[m,x]=o.useState(""),d=o.useCallback(async()=>{try{f(null);const p=await A.getVersion();t(p),console.log("[VersionManager] 当前版本信息:",p)}catch(p){const C=p instanceof Error?p.message:"获取版本信息失败";f(C),console.error("[VersionManager] 获取版本信息失败:",p)}},[]),l=async()=>{if(a)try{i(!0),f(null),console.log("[VersionManager] 检查更新..."),await new Promise(C=>setTimeout(C,1e3));const p={currentVersion:a.version,latestVersion:"1.8.0",updateAvailable:!0,releaseNotes:`• 修复了若干 bug
32
+ • 新增实时日志功能
33
+ • 性能优化`,publishDate:new Date().toISOString()};r(p),console.log("[VersionManager] 更新检查结果:",p)}catch(p){const C=p instanceof Error?p.message:"检查更新失败";f(C),console.error("[VersionManager] 检查更新失败:",p)}finally{i(!1)}},g=p=>{console.log("[VersionManager] 开始更新到版本:",p),x(p),h(!0)},v=()=>{h(!1),x(""),setTimeout(()=>{d()},1e3)};return o.useEffect(()=>{d()},[d]),e.jsxs(de,{className:"w-full max-w-2xl",children:[e.jsx(Ce,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs(ke,{className:"flex items-center gap-2",children:[e.jsx(Fa,{className:"h-5 w-5"}),"版本管理"]}),e.jsx(Ee,{children:"管理应用版本和更新"})]}),e.jsx(Ls,{})]})}),e.jsxs(we,{className:"space-y-6",children:[c&&e.jsxs("div",{className:"flex items-center gap-2 p-3 bg-destructive/10 border border-destructive/20 rounded-md",children:[e.jsx(Fe,{className:"h-4 w-4 text-destructive"}),e.jsx("span",{className:"text-sm text-destructive",children:c})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-lg font-medium",children:"当前版本"}),a?e.jsxs("div",{className:"p-4 bg-muted/50 rounded-md space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"font-medium",children:["版本 ",a.version]}),e.jsx(Z,{variant:"secondary",children:a.name})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a.description}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["作者: ",a.author]})]}):e.jsx("div",{className:"p-4 bg-muted/50 rounded-md",children:e.jsx("span",{className:"text-muted-foreground",children:"加载中..."})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-lg font-medium",children:"更新检查"}),e.jsxs(N,{variant:"outline",size:"sm",onClick:l,disabled:n||!a,className:"flex items-center gap-2",children:[e.jsx(hs,{className:`h-4 w-4 ${n?"animate-spin":""}`}),n?"检查中...":"检查更新"]})]}),s&&e.jsx("div",{className:"p-4 border rounded-md space-y-3",children:s.updateAvailable?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Fe,{className:"h-4 w-4 text-blue-600"}),e.jsxs("span",{className:"font-medium text-blue-600",children:["发现新版本 ",s.latestVersion]})]}),s.publishDate&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx(Ha,{className:"h-3 w-3"}),"发布日期:"," ",new Date(s.publishDate).toLocaleDateString()]}),s.releaseNotes&&e.jsxs("div",{className:"mt-3",children:[e.jsx("h4",{className:"text-sm font-medium mb-2",children:"更新内容:"}),e.jsx("div",{className:"text-sm text-muted-foreground whitespace-pre-line bg-muted/30 p-2 rounded",children:s.releaseNotes})]}),e.jsxs("div",{className:"flex gap-2 pt-2",children:[e.jsxs(N,{onClick:()=>g(s.latestVersion),className:"flex items-center gap-2",children:[e.jsx(ps,{className:"h-4 w-4"}),"更新到 ",s.latestVersion]}),e.jsx(N,{variant:"outline",size:"sm",asChild:!0,children:e.jsxs("a",{href:"https://github.com/shenjingnan/xiaozhi-client/releases",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1",children:[e.jsx(Ka,{className:"h-3 w-3"}),"查看详情"]})})]})]}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(lt,{className:"h-4 w-4 text-green-600"}),e.jsxs("span",{className:"text-green-600",children:["当前版本 ",s.currentVersion," 是最新版本"]})]})})]})]}),e.jsx(ra,{isOpen:b,onClose:v,version:m})]})}const jn=Ja,ia=o.forwardRef(({className:a,...t},s)=>e.jsx(gs,{ref:s,className:w("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",a),...t}));ia.displayName=gs.displayName;const ft=o.forwardRef(({className:a,...t},s)=>e.jsx(xs,{ref:s,className:w("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",a),...t}));ft.displayName=xs.displayName;const ht=o.forwardRef(({className:a,...t},s)=>e.jsx(bs,{ref:s,className:w("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",a),...t}));ht.displayName=bs.displayName;const yn=H.object({modelscope:H.object({apiKey:H.string().optional()}),platforms:H.object({coze:H.object({token:H.string().optional()})}),connection:H.object({heartbeatInterval:H.number().min(1e3,{message:"心跳间隔不能小于1000毫秒"}),heartbeatTimeout:H.number().min(1e3,{message:"心跳超时不能小于1000毫秒"}),reconnectInterval:H.number().min(1e3,{message:"重连间隔不能小于1000毫秒"})})});function Nn(){var c,f,b,h,m,x;const a=je(),{updateConfig:t}=oa(),[s,r]=o.useState(!1),n=Te({resolver:Re(yn),defaultValues:{platforms:{coze:{token:((f=(c=a==null?void 0:a.platforms)==null?void 0:c.coze)==null?void 0:f.token)||""}},modelscope:{apiKey:((b=a==null?void 0:a.modelscope)==null?void 0:b.apiKey)||""},connection:{heartbeatInterval:((h=a==null?void 0:a.connection)==null?void 0:h.heartbeatInterval)||3e4,heartbeatTimeout:((m=a==null?void 0:a.connection)==null?void 0:m.heartbeatTimeout)||1e4,reconnectInterval:((x=a==null?void 0:a.connection)==null?void 0:x.reconnectInterval)||5e3}}});o.useEffect(()=>{var d,l,g,v;n.reset({modelscope:{apiKey:((d=a==null?void 0:a.modelscope)==null?void 0:d.apiKey)||""},connection:{heartbeatInterval:((l=a==null?void 0:a.connection)==null?void 0:l.heartbeatInterval)||3e4,heartbeatTimeout:((g=a==null?void 0:a.connection)==null?void 0:g.heartbeatTimeout)||1e4,reconnectInterval:((v=a==null?void 0:a.connection)==null?void 0:v.reconnectInterval)||5e3}})},[a,n.reset]);async function i(d){var l;if(!a){j.error("配置数据未加载,请稍后重试");return}r(!0);try{const g={...a,modelscope:{apiKey:d.modelscope.apiKey},connection:{heartbeatInterval:d.connection.heartbeatInterval,heartbeatTimeout:d.connection.heartbeatTimeout,reconnectInterval:d.connection.reconnectInterval},platforms:{...(a==null?void 0:a.platforms)??{},coze:{...((l=a==null?void 0:a.platforms)==null?void 0:l.coze)??{},token:d.platforms.coze.token}}};await t(g),j.success("配置已更新")}catch(g){console.error("更新配置失败:",g),j.error(g instanceof Error?g.message:"更新配置失败")}finally{r(!1)}}return e.jsxs(yt,{children:[e.jsx(Os,{variant:"inset"}),e.jsxs(Nt,{children:[e.jsx(ta,{title:"设置"}),e.jsx("div",{className:"flex flex-1 flex-col p-4",children:e.jsx("div",{className:"@container/main flex flex-1 flex-col gap-2 items-center",children:e.jsx("div",{className:"flex flex-col gap-4 py-4 md:gap-6 md:py-6 w-full max-w-4xl",children:e.jsxs(jn,{defaultValue:"general",className:"w-full",children:[e.jsxs(ia,{className:"grid w-full grid-cols-2",children:[e.jsx(ft,{value:"general",children:"常规设置"}),e.jsx(ft,{value:"version",children:"版本管理"})]}),e.jsx(ht,{value:"general",className:"mt-6",children:e.jsx("div",{className:"w-[600px] mx-auto",children:e.jsx(Ue,{...n,children:e.jsx("form",{onSubmit:n.handleSubmit(i),children:e.jsxs("div",{className:"grid gap-4",children:[e.jsx(Q,{control:n.control,name:"modelscope.apiKey",render:({field:d})=>e.jsxs(G,{children:[e.jsx(se,{children:"魔搭社区 API Key"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(X,{children:e.jsx(te,{placeholder:"魔搭社区 API Key",className:"font-mono text-sm",type:"password",disabled:s,autoComplete:"off","data-1p-ignore":!0,...d})}),e.jsx(N,{variant:"outline",onClick:()=>{window.open("https://www.modelscope.cn/my/myaccesstoken","_blank")},children:"打开魔搭社区"})]}),e.jsx(ee,{})]})}),e.jsx(Q,{control:n.control,name:"platforms.coze.token",render:({field:d})=>e.jsxs(G,{children:[e.jsx(se,{children:"扣子身份凭证"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(X,{children:e.jsx(te,{placeholder:"扣子身份凭证",className:"font-mono text-sm",type:"password",autoComplete:"off","data-1p-ignore":!0,disabled:s,...d})}),e.jsx(N,{variant:"outline",onClick:()=>{window.open("https://www.coze.cn/open/oauth/sats","_blank")},children:"打开扣子平台"})]}),e.jsx(ee,{})]})}),e.jsx(Q,{control:n.control,name:"connection.heartbeatInterval",render:({field:d})=>e.jsxs(G,{children:[e.jsx(se,{children:"心跳间隔(毫秒)"}),e.jsxs("div",{className:"flex gap-2 items-center",children:[e.jsx(X,{children:e.jsx(te,{placeholder:"心跳间隔(毫秒)",className:"font-mono text-sm",type:"number",disabled:s,...d,value:d.value||"",onChange:l=>{const g=l.target.value;d.onChange(g===""?"":Number(g))}})}),e.jsx("span",{className:"text-sm text-muted-foreground w-[50px]",children:"毫秒"})]}),e.jsx(ee,{})]})}),e.jsx(Q,{control:n.control,name:"connection.heartbeatTimeout",render:({field:d})=>e.jsxs(G,{children:[e.jsx(se,{children:"心跳超时(毫秒)"}),e.jsxs("div",{className:"flex gap-2 items-center",children:[e.jsx(X,{children:e.jsx(te,{placeholder:"心跳超时(毫秒)",className:"font-mono text-sm",type:"number",disabled:s,...d,value:d.value||"",onChange:l=>{const g=l.target.value;d.onChange(g===""?"":Number(g))}})}),e.jsx("span",{className:"text-sm text-muted-foreground w-[50px]",children:"毫秒"})]}),e.jsx(ee,{})]})}),e.jsx(Q,{control:n.control,name:"connection.reconnectInterval",render:({field:d})=>e.jsxs(G,{children:[e.jsx(se,{children:"重连间隔(毫秒)"}),e.jsxs("div",{className:"flex gap-2 items-center",children:[e.jsx(X,{children:e.jsx(te,{placeholder:"重连间隔(毫秒)",className:"font-mono text-sm",type:"number",disabled:s,...d,value:d.value||"",onChange:l=>{const g=l.target.value;d.onChange(g===""?"":Number(g))}})}),e.jsx("span",{className:"text-sm text-muted-foreground w-[50px]",children:"毫秒"})]}),e.jsx(ee,{})]})}),e.jsxs("div",{className:"flex gap-2 justify-end",children:[e.jsx(N,{type:"submit",disabled:s,className:"flex-1",children:s?"保存中...":"保存"}),e.jsx(ea,{})]})]})})})})}),e.jsx(ht,{value:"version",className:"mt-6",children:e.jsx("div",{className:"w-[600px] mx-auto",children:e.jsx(vn,{})})})]})})})})]})]})}function Cn(){return e.jsxs(wn,{children:[e.jsx(dr,{}),e.jsxs(Ga,{children:[e.jsx(ot,{path:"/",element:e.jsx(Xa,{to:"/dashboard"})}),e.jsx(ot,{path:"/dashboard",element:e.jsx(Sn,{})}),e.jsx(ot,{path:"/settings",element:e.jsx(Nn,{})})]}),e.jsx(tr,{richColors:!0,toastOptions:{classNames:{description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-white group-[.toast]:text-black",error:"group toast group-[.toaster]:bg-red group-[.toaster]:text-red-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg",success:"group toast group-[.toaster]:bg-green group-[.toaster]:text-green-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg",warning:"group toast group-[.toaster]:bg-yellow group-[.toaster]:text-yellow-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg",info:"group toast group-[.toaster]:bg-blue group-[.toaster]:text-blue-600 dark:group-[.toaster]:text-foreground group-[.toaster]:shadow-lg"}}})]})}Za.createRoot(document.getElementById("root")).render(e.jsx(Ya.StrictMode,{children:e.jsx(Qa,{children:e.jsx(Cn,{})})}));
34
+ //# sourceMappingURL=index-DhYoZCMt.js.map