diff --git a/lib/public/assets/icons/whatsapp.svg b/lib/public/assets/icons/whatsapp.svg new file mode 100644 index 0000000..70e0037 --- /dev/null +++ b/lib/public/assets/icons/whatsapp.svg @@ -0,0 +1,14 @@ + + + + + diff --git a/lib/public/css/tailwind.generated.css b/lib/public/css/tailwind.generated.css index 270c757..22f2c45 100644 --- a/lib/public/css/tailwind.generated.css +++ b/lib/public/css/tailwind.generated.css @@ -1 +1 @@ -*,:after,:before{--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:rgba(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:rgba(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: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{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,pre,samp{font-family:JetBrains Mono,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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-3{left:.75rem}.right-0{right:0}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.right-5{right:1.25rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.top-5{top:1.25rem}.top-6{top:1.5rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[80\]{z-index:80}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-0\.5{margin-left:-.125rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-2\.5{margin-right:.625rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.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-40{height:10rem}.h-44{height:11rem}.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-\[22px\]{height:22px}.h-\[34px\]{height:34px}.h-full{height:100%}.h-px{height:1px}.max-h-80{max-height:20rem}.max-h-\[66vh\]{max-height:66vh}.max-h-\[92vh\]{max-height:92vh}.min-h-6{min-height:1.5rem}.min-h-\[200px\]{min-height:200px}.min-h-\[220px\]{min-height:220px}.min-h-\[26rem\]{min-height:26rem}.min-h-\[300px\]{min-height:300px}.min-h-\[320px\]{min-height:320px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[88px\]{min-width:88px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-64{max-width:16rem}.max-w-80{max-width:20rem}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-rotate-90{--tw-rotate:-90deg}.-rotate-90,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-90{--tw-rotate:90deg}.rotate-90,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(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}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.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}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-1{row-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(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*(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*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(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*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:var(--border)}.justify-self-start{justify-self:start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-y{border-top-width:1px}.border-b,.border-y{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-400\/30{border-color:rgba(96,165,250,.3)}.border-border{border-color:var(--border)}.border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity,1))}.border-cyan-400\/30{border-color:rgba(34,211,238,.3)}.border-cyan-500\/40{border-color:rgba(6,182,212,.4)}.border-fg-muted{border-color:var(--text-muted)}.border-gray-400\/30{border-color:rgba(156,163,175,.3)}.border-green-500\/30{border-color:rgba(34,197,94,.3)}.border-purple-400\/30{border-color:rgba(192,132,252,.3)}.border-red-500\/20{border-color:rgba(239,68,68,.2)}.border-status-error-border{border-color:var(--status-error-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-transparent{border-color:transparent}.border-white\/10{border-color:hsla(0,0%,100%,.1)}.border-yellow-500\/30{border-color:rgba(234,179,8,.3)}.border-yellow-500\/35{border-color:rgba(234,179,8,.35)}.border-yellow-500\/40{border-color:rgba(234,179,8,.4)}.border-t-transparent{border-top-color:transparent}.bg-\[\#151922\]{--tw-bg-opacity:1;background-color:rgb(21 25 34/var(--tw-bg-opacity,1))}.bg-blue-400\/10{background-color:rgba(96,165,250,.1)}.bg-blue-500\/10{background-color:rgba(59,130,246,.1)}.bg-border{background-color:var(--border)}.bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity,1))}.bg-cyan-400\/10{background-color:rgba(34,211,238,.1)}.bg-cyan-500\/10{background-color:rgba(6,182,212,.1)}.bg-field{background-color:var(--field-bg-contrast)}.bg-gray-400\/10{background-color:rgba(156,163,175,.1)}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-gray-500\/10{background-color:hsla(220,9%,46%,.1)}.bg-gray-500\/70{background-color:hsla(220,9%,46%,.7)}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-green-500\/10{background-color:rgba(34,197,94,.1)}.bg-green-500\/90{background-color:rgba(34,197,94,.9)}.bg-indigo-500\/10{background-color:rgba(99,102,241,.1)}.bg-overlay{background-color:var(--overlay)}.bg-purple-400\/10{background-color:rgba(192,132,252,.1)}.bg-purple-500\/10{background-color:rgba(168,85,247,.1)}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-red-500\/10{background-color:rgba(239,68,68,.1)}.bg-red-500\/90{background-color:rgba(239,68,68,.9)}.bg-status-error-bg{background-color:var(--status-error-bg)}.bg-status-info-bg{background-color:var(--status-info-bg)}.bg-status-success-bg{background-color:var(--status-success-bg)}.bg-status-warning-bg{background-color:var(--status-warning-bg)}.bg-surface{background-color:var(--bg-sidebar)}.bg-transparent{background-color:transparent}.bg-white\/15{background-color:hsla(0,0%,100%,.15)}.bg-white\/5{background-color:hsla(0,0%,100%,.05)}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.bg-yellow-400\/90{background-color:rgba(250,204,21,.9)}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.bg-yellow-500\/10{background-color:rgba(234,179,8,.1)}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.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-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0\.5{padding-bottom:.125rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-12{padding-top:3rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.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-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-\[18px\]{line-height:18px}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.text-\[var\(--text-muted\)\]{color:var(--text-muted)}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-body{color:var(--text)}.text-bright{color:var(--text-bright)}.text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity,1))}.text-fg-dim{color:var(--text-dim)}.text-fg-muted{color:var(--text-muted)}.text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity,1))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.text-status-error{color:var(--status-error)}.text-status-error-muted{color:var(--status-error-muted)}.text-status-info{color:var(--status-info)}.text-status-success{color:var(--status-success)}.text-status-success-muted{color:var(--status-success-muted)}.text-status-warning{color:var(--status-warning)}.text-status-warning-muted{color:var(--status-warning-muted)}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/80{color:hsla(0,0%,100%,.8)}.underline{text-decoration-line:underline}.placeholder-fg-dim::-moz-placeholder{color:var(--text-dim)}.placeholder-fg-dim::placeholder{color:var(--text-dim)}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px 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-\[0_0_0_1px_rgba\(234\2c 179\2c 8\2c 0\.22\)\2c 0_0_18px_rgba\(234\2c 179\2c 8\2c 0\.12\)\]{--tw-shadow:0 0 0 1px rgba(234,179,8,.22),0 0 18px rgba(234,179,8,.12);--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color),0 0 18px 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-\[0_0_0_1px_rgba\(34\2c 211\2c 238\2c 0\.08\)\]{--tw-shadow:0 0 0 1px rgba(34,211,238,.08);--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color)}.shadow-\[0_0_0_1px_rgba\(34\2c 211\2c 238\2c 0\.08\)\],.shadow-lg{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 rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.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,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[filter\]{transition-property:filter;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-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.first\:rounded-l-lg:first-child{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.last\:rounded-r-lg:last-child{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.last\:border-0:last-child{border-width:0}.last\:border-b-0:last-child{border-bottom-width:0}.focus-within\:border-fg-muted:focus-within{border-color:var(--text-muted)}.focus-within\:text-body:focus-within{color:var(--text)}.hover\:border-fg-muted:hover{border-color:var(--text-muted)}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.hover\:border-white\/20:hover{border-color:hsla(0,0%,100%,.2)}.hover\:border-yellow-400\/60:hover{border-color:rgba(250,204,21,.6)}.hover\:bg-field:hover{background-color:var(--field-bg-contrast)}.hover\:bg-surface:hover{background-color:var(--bg-sidebar)}.hover\:bg-yellow-500\/15:hover{background-color:rgba(234,179,8,.15)}.hover\:text-body:hover{color:var(--text)}.hover\:text-bright:hover{color:var(--text-bright)}.hover\:text-status-error:hover{color:var(--status-error)}.hover\:text-status-error-muted:hover{color:var(--status-error-muted)}.hover\:text-status-success:hover{color:var(--status-success)}.hover\:text-status-warning:hover{color:var(--status-warning)}.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-90:hover{opacity:.9}.hover\:brightness-110:hover{--tw-brightness:brightness(1.1)}.hover\:brightness-110:hover,.hover\:brightness-125:hover{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)}.hover\:brightness-125:hover{--tw-brightness:brightness(1.25)}.focus\:border-fg-muted:focus{border-color:var(--text-muted)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1: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(1px + 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-border:focus{--tw-ring-color:var(--border)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group[open] .group-open\:rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[open] .group-open\:border-b{border-bottom-width:1px}.group[open] .group-open\:border-border{border-color:var(--border)}.group:hover .group-hover\:bg-surface{background-color:var(--bg-sidebar)}.group:hover .group-hover\:bg-white\/10{background-color:hsla(0,0%,100%,.1)}.group:hover .group-hover\:text-body{color:var(--text)}@media (min-width:640px){.sm\:flex{display:flex}.sm\:w-auto{width:auto}.sm\:min-w-0{min-width:0}.sm\:flex-1{flex:1 1 0%}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}}@media (min-width:768px){.md\:inline{display:inline}.md\:inline-flex{display:inline-flex}.md\:hidden{display:none}.md\:min-w-0{min-width:0}.md\:shrink-0{flex-shrink:0}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:.75rem}.md\:text-right{text-align:right}} \ No newline at end of file +*,:after,:before{--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:rgba(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:rgba(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: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{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,pre,samp{font-family:JetBrains Mono,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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-3{left:.75rem}.right-0{right:0}.right-2\.5{right:.625rem}.right-3{right:.75rem}.right-4{right:1rem}.right-5{right:1.25rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.top-5{top:1.25rem}.top-6{top:1.5rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[80\]{z-index:80}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-0\.5{margin-left:-.125rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-2\.5{margin-right:.625rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.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-40{height:10rem}.h-44{height:11rem}.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-\[22px\]{height:22px}.h-\[34px\]{height:34px}.h-\[440px\]{height:440px}.h-full{height:100%}.h-px{height:1px}.max-h-80{max-height:20rem}.max-h-\[66vh\]{max-height:66vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[92vh\]{max-height:92vh}.min-h-6{min-height:1.5rem}.min-h-\[200px\]{min-height:200px}.min-h-\[220px\]{min-height:220px}.min-h-\[26rem\]{min-height:26rem}.min-h-\[300px\]{min-height:300px}.min-h-\[320px\]{min-height:320px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[88px\]{min-width:88px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-64{max-width:16rem}.max-w-80{max-width:20rem}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-rotate-90{--tw-rotate:-90deg}.-rotate-90,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-90{--tw-rotate:90deg}.rotate-90,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(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}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.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}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-1{row-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(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*(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*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(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*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:var(--border)}.justify-self-start{justify-self:start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-y{border-top-width:1px}.border-b,.border-y{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-400\/30{border-color:rgba(96,165,250,.3)}.border-border{border-color:var(--border)}.border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity,1))}.border-cyan-400\/30{border-color:rgba(34,211,238,.3)}.border-cyan-500\/40{border-color:rgba(6,182,212,.4)}.border-fg-muted{border-color:var(--text-muted)}.border-gray-400\/30{border-color:rgba(156,163,175,.3)}.border-green-500\/30{border-color:rgba(34,197,94,.3)}.border-purple-400\/30{border-color:rgba(192,132,252,.3)}.border-red-500\/20{border-color:rgba(239,68,68,.2)}.border-status-error-border{border-color:var(--status-error-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-transparent{border-color:transparent}.border-white\/10{border-color:hsla(0,0%,100%,.1)}.border-yellow-500\/30{border-color:rgba(234,179,8,.3)}.border-yellow-500\/35{border-color:rgba(234,179,8,.35)}.border-yellow-500\/40{border-color:rgba(234,179,8,.4)}.border-t-transparent{border-top-color:transparent}.bg-\[\#151922\]{--tw-bg-opacity:1;background-color:rgb(21 25 34/var(--tw-bg-opacity,1))}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-blue-400\/10{background-color:rgba(96,165,250,.1)}.bg-blue-500\/10{background-color:rgba(59,130,246,.1)}.bg-border{background-color:var(--border)}.bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity,1))}.bg-cyan-400\/10{background-color:rgba(34,211,238,.1)}.bg-cyan-500\/10{background-color:rgba(6,182,212,.1)}.bg-field{background-color:var(--field-bg-contrast)}.bg-gray-400\/10{background-color:rgba(156,163,175,.1)}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-gray-500\/10{background-color:hsla(220,9%,46%,.1)}.bg-gray-500\/70{background-color:hsla(220,9%,46%,.7)}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-green-500\/10{background-color:rgba(34,197,94,.1)}.bg-green-500\/90{background-color:rgba(34,197,94,.9)}.bg-indigo-500\/10{background-color:rgba(99,102,241,.1)}.bg-overlay{background-color:var(--overlay)}.bg-purple-400\/10{background-color:rgba(192,132,252,.1)}.bg-purple-500\/10{background-color:rgba(168,85,247,.1)}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-red-500\/10{background-color:rgba(239,68,68,.1)}.bg-red-500\/90{background-color:rgba(239,68,68,.9)}.bg-status-error-bg{background-color:var(--status-error-bg)}.bg-status-info-bg{background-color:var(--status-info-bg)}.bg-status-success-bg{background-color:var(--status-success-bg)}.bg-status-warning-bg{background-color:var(--status-warning-bg)}.bg-surface{background-color:var(--bg-sidebar)}.bg-transparent{background-color:transparent}.bg-white\/15{background-color:hsla(0,0%,100%,.15)}.bg-white\/5{background-color:hsla(0,0%,100%,.05)}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.bg-yellow-400\/90{background-color:rgba(250,204,21,.9)}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.bg-yellow-500\/10{background-color:rgba(234,179,8,.1)}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.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-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0\.5{padding-bottom:.125rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-12{padding-top:3rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.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-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-\[1\.1\]{line-height:1.1}.leading-\[18px\]{line-height:18px}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.text-\[var\(--text-muted\)\]{color:var(--text-muted)}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-body{color:var(--text)}.text-bright{color:var(--text-bright)}.text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity,1))}.text-fg-dim{color:var(--text-dim)}.text-fg-muted{color:var(--text-muted)}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity,1))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.text-status-error{color:var(--status-error)}.text-status-error-muted{color:var(--status-error-muted)}.text-status-info{color:var(--status-info)}.text-status-success{color:var(--status-success)}.text-status-success-muted{color:var(--status-success-muted)}.text-status-warning{color:var(--status-warning)}.text-status-warning-muted{color:var(--status-warning-muted)}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/80{color:hsla(0,0%,100%,.8)}.underline{text-decoration-line:underline}.placeholder-fg-dim::-moz-placeholder{color:var(--text-dim)}.placeholder-fg-dim::placeholder{color:var(--text-dim)}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px 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-\[0_0_0_1px_rgba\(234\2c 179\2c 8\2c 0\.22\)\2c 0_0_18px_rgba\(234\2c 179\2c 8\2c 0\.12\)\]{--tw-shadow:0 0 0 1px rgba(234,179,8,.22),0 0 18px rgba(234,179,8,.12);--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color),0 0 18px 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-\[0_0_0_1px_rgba\(34\2c 211\2c 238\2c 0\.08\)\]{--tw-shadow:0 0 0 1px rgba(34,211,238,.08);--tw-shadow-colored:0 0 0 1px var(--tw-shadow-color)}.shadow-\[0_0_0_1px_rgba\(34\2c 211\2c 238\2c 0\.08\)\],.shadow-lg{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 rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.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,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[filter\]{transition-property:filter;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-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.first\:rounded-l-lg:first-child{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.last\:rounded-r-lg:last-child{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.last\:border-0:last-child{border-width:0}.last\:border-b-0:last-child{border-bottom-width:0}.focus-within\:border-fg-muted:focus-within{border-color:var(--text-muted)}.focus-within\:text-body:focus-within{color:var(--text)}.hover\:border-fg-muted:hover{border-color:var(--text-muted)}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.hover\:border-white\/20:hover{border-color:hsla(0,0%,100%,.2)}.hover\:border-yellow-400\/60:hover{border-color:rgba(250,204,21,.6)}.hover\:bg-field:hover{background-color:var(--field-bg-contrast)}.hover\:bg-surface:hover{background-color:var(--bg-sidebar)}.hover\:bg-yellow-500\/15:hover{background-color:rgba(234,179,8,.15)}.hover\:text-body:hover{color:var(--text)}.hover\:text-bright:hover{color:var(--text-bright)}.hover\:text-status-error:hover{color:var(--status-error)}.hover\:text-status-error-muted:hover{color:var(--status-error-muted)}.hover\:text-status-success:hover{color:var(--status-success)}.hover\:text-status-warning:hover{color:var(--status-warning)}.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-90:hover{opacity:.9}.hover\:brightness-110:hover{--tw-brightness:brightness(1.1)}.hover\:brightness-110:hover,.hover\:brightness-125:hover{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)}.hover\:brightness-125:hover{--tw-brightness:brightness(1.25)}.focus\:border-fg-muted:focus{border-color:var(--text-muted)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1: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(1px + 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-border:focus{--tw-ring-color:var(--border)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group[open] .group-open\:rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[open] .group-open\:border-b{border-bottom-width:1px}.group[open] .group-open\:border-border{border-color:var(--border)}.group:hover .group-hover\:bg-surface{background-color:var(--bg-sidebar)}.group:hover .group-hover\:bg-white\/10{background-color:hsla(0,0%,100%,.1)}.group:hover .group-hover\:text-body{color:var(--text)}@media (min-width:640px){.sm\:flex{display:flex}.sm\:w-auto{width:auto}.sm\:min-w-0{min-width:0}.sm\:flex-1{flex:1 1 0%}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}}@media (min-width:768px){.md\:inline{display:inline}.md\:inline-flex{display:inline-flex}.md\:hidden{display:none}.md\:min-w-0{min-width:0}.md\:shrink-0{flex-shrink:0}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:.75rem}.md\:text-right{text-align:right}} \ No newline at end of file diff --git a/lib/public/dist/app.bundle.js b/lib/public/dist/app.bundle.js index 37237f1..eec7a02 100644 --- a/lib/public/dist/app.bundle.js +++ b/lib/public/dist/app.bundle.js @@ -1,5 +1,5 @@ -import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa={},ra=[],Ck=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Rr=Array.isArray;function _n(t,e){for(var n in e)t[n]=e[n];return t}function Jc(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function T(t,e,n){var s,o,r,i={};for(r in e)r=="key"?s=e[r]:r=="ref"?o=e[r]:i[r]=e[r];if(arguments.length>2&&(i.children=arguments.length>3?Tr.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(r in t.defaultProps)i[r]===void 0&&(i[r]=t.defaultProps[r]);return Ar(t,i,s,o,null)}function Ar(t,e,n,s,o){var r={type:t,props:e,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++qf,__i:-1,__u:0};return o==null&&Se.vnode!=null&&Se.vnode(r),r}function ln(t){return t.children}function hn(t,e){this.props=t,this.context=e}function $o(t,e){if(e==null)return t.__?$o(t.__,t.__i+1):null;for(var n;ee&&hs.sort(Zf),t=hs.shift(),e=hs.length,_k(t)}finally{hs.length=ia.__r=0}}function eh(t,e,n,s,o,r,i,a,l,c,d){var u,p,f,g,m,h,b,x=s&&s.__k||ra,v=e.length;for(l=Mk(n,e,x,l,v),u=0;u0?i=t.__k[r]=Ar(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):t.__k[r]=i,l=r+p,i.__=t,i.__b=t.__b+1,a=null,(c=i.__i=Ak(i,n,l,u))!=-1&&(u--,(a=n[c])&&(a.__u|=2)),a==null||a.__v==null?(c==-1&&(o>d?p--:ol?p--:p++,i.__u|=4))):t.__k[r]=null;if(u)for(r=0;r(d?1:0)){for(o=n-1,r=n+1;o>=0||r=0?o--:r++])!=null&&(2&c.__u)==0&&a==c.key&&l==c.type)return i}return-1}function Kf(t,e,n){e[0]=="-"?t.setProperty(e,n??""):t[e]=n==null?"":typeof n!="number"||Ck.test(e)?n:n+"px"}function sa(t,e,n,s,o){var r,i;e:if(e=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof s=="string"&&(t.style.cssText=s=""),s)for(e in s)n&&e in n||Kf(t.style,e,"");if(n)for(e in n)s&&n[e]==s[e]||Kf(t.style,e,n[e])}else if(e[0]=="o"&&e[1]=="n")r=e!=(e=e.replace(Yf,"$1")),i=e.toLowerCase(),e=i in t||e=="onFocusOut"||e=="onFocusIn"?i.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+r]=n,n?s?n.u=s.u:(n.u=qc,t.addEventListener(e,r?Uc:zc,r)):t.removeEventListener(e,r?Uc:zc,r);else{if(o=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&n==1?"":n))}}function Gf(t){return function(e){if(this.l){var n=this.l[e.type+t];if(e.t==null)e.t=qc++;else if(e.t0?t:Rr(t)?t.map(sh):_n({},t)}function Tk(t,e,n,s,o,r,i,a,l){var c,d,u,p,f,g,m,h=n.props||oa,b=e.props,x=e.type;if(x=="svg"?o="http://www.w3.org/2000/svg":x=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),r!=null){for(c=0;c2&&(a.children=arguments.length>3?Tr.call(arguments,2):n),Ar(t.type,a,s||t.key,o||t.ref,null)}function ko(t){function e(n){var s,o;return this.getChildContext||(s=new Set,(o={})[e.__c]=this,this.getChildContext=function(){return o},this.componentWillUnmount=function(){s=null},this.shouldComponentUpdate=function(r){this.props.value!=r.value&&s.forEach(function(i){i.__e=!0,Kc(i)})},this.sub=function(r){s.add(r);var i=r.componentWillUnmount;r.componentWillUnmount=function(){s&&s.delete(r),i&&i.call(r)}}),n.children}return e.__c="__cC"+Xf++,e.__=t,e.Provider=e.__l=(e.Consumer=function(n,s){return n.children(s)}).contextType=e,e}Tr=ra.slice,Se={__e:function(t,e,n,s){for(var o,r,i;e=e.__;)if((o=e.__c)&&!o.__)try{if((r=o.constructor)&&r.getDerivedStateFromError!=null&&(o.setState(r.getDerivedStateFromError(t)),i=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(t,s||{}),i=o.__d),i)return o.__E=o}catch(a){t=a}throw t}},qf=0,Pr=function(t){return t!=null&&t.constructor===void 0},hn.prototype.setState=function(t,e){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=_n({},this.state),typeof t=="function"&&(t=t(_n({},n),this.props)),t&&_n(n,t),t!=null&&this.__v&&(e&&this._sb.push(e),Kc(this))},hn.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Kc(this))},hn.prototype.render=ln,hs=[],Jf=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Zf=function(t,e){return t.__v.__b-e.__v.__b},ia.__r=0,Yf=/(PointerCapture)$|Capture$/i,qc=0,zc=Gf(!1),Uc=Gf(!0),Xf=0;var Ws,tt,Xc,rh,Ir=0,fh=[],ut=Se,ih=ut.__b,ah=ut.__r,lh=ut.diffed,ch=ut.__c,dh=ut.unmount,uh=ut.__;function Dr(t,e){ut.__h&&ut.__h(tt,t,Ir||e),Ir=0;var n=tt.__H||(tt.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function y(t){return Ir=1,hh(mh,t)}function hh(t,e,n){var s=Dr(Ws++,2);if(s.t=t,!s.__c&&(s.__=[n?n(e):mh(void 0,e),function(a){var l=s.__N?s.__N[0]:s.__[0],c=s.t(l,a);l!==c&&(s.__N=[c,s.__[1]],s.__c.setState({}))}],s.__c=tt,!tt.__f)){var o=function(a,l,c){if(!s.__c.__H)return!0;var d=s.__c.__H.__.filter(function(p){return p.__c});if(d.every(function(p){return!p.__N}))return!r||r.call(this,a,l,c);var u=s.__c.props!==a;return d.some(function(p){if(p.__N){var f=p.__[0];p.__=p.__N,p.__N=void 0,f!==p.__[0]&&(u=!0)}}),r&&r.call(this,a,l,c)||u};tt.__f=!0;var r=tt.shouldComponentUpdate,i=tt.componentWillUpdate;tt.componentWillUpdate=function(a,l,c){if(this.__e){var d=r;r=void 0,o(a,l,c),r=d}i&&i.call(this,a,l,c)},tt.shouldComponentUpdate=o}return s.__N||s.__}function L(t,e){var n=Dr(Ws++,3);!ut.__s&&ed(n.__H,e)&&(n.__=t,n.u=e,tt.__H.__h.push(n))}function Vs(t,e){var n=Dr(Ws++,4);!ut.__s&&ed(n.__H,e)&&(n.__=t,n.u=e,tt.__h.push(n))}function ee(t){return Ir=5,F(function(){return{current:t}},[])}function F(t,e){var n=Dr(Ws++,7);return ed(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function q(t,e){return Ir=8,F(function(){return t},e)}function Nr(t){var e=tt.context[t.__c],n=Dr(Ws++,9);return n.c=t,e?(n.__==null&&(n.__=!0,e.sub(tt)),e.props.value):t.__}function Rk(){for(var t;t=fh.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(aa),e.__h.some(Qc),e.__h=[]}catch(n){e.__h=[],ut.__e(n,t.__v)}}}ut.__b=function(t){tt=null,ih&&ih(t)},ut.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),uh&&uh(t,e)},ut.__r=function(t){ah&&ah(t),Ws=0;var e=(tt=t.__c).__H;e&&(Xc===tt?(e.__h=[],tt.__h=[],e.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(e.__h.some(aa),e.__h.some(Qc),e.__h=[],Ws=0)),Xc=tt},ut.diffed=function(t){lh&&lh(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(fh.push(e)!==1&&rh===ut.requestAnimationFrame||((rh=ut.requestAnimationFrame)||Lk)(Rk)),e.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Xc=tt=null},ut.__c=function(t,e){e.some(function(n){try{n.__h.some(aa),n.__h=n.__h.filter(function(s){return!s.__||Qc(s)})}catch(s){e.some(function(o){o.__h&&(o.__h=[])}),e=[],ut.__e(s,n.__v)}}),ch&&ch(t,e)},ut.unmount=function(t){dh&&dh(t);var e,n=t.__c;n&&n.__H&&(n.__H.__.some(function(s){try{aa(s)}catch(o){e=o}}),n.__H=void 0,e&&ut.__e(e,n.__v))};var ph=typeof requestAnimationFrame=="function";function Lk(t){var e,n=function(){clearTimeout(s),ph&&cancelAnimationFrame(e),setTimeout(t)},s=setTimeout(n,35);ph&&(e=requestAnimationFrame(n))}function aa(t){var e=tt,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),tt=e}function Qc(t){var e=tt;t.__c=t.__(),tt=e}function ed(t,e){return!t||t.length!==e.length||e.some(function(n,s){return n!==t[s]})}function mh(t,e){return typeof e=="function"?e(t):e}var bh=function(t,e,n,s){var o;e[0]=0;for(var r=1;r=5&&((i||!p&&r===5)&&(l.push(r,0,i,o),r=6),p&&(l.push(r,p,0,o),r=6)),i=""},d=0;d"?(r=1,i=""):i=s+i[0]:a?s===a?a="":i+=s:s==='"'||s==="'"?a=s:s===">"?(c(),r=1):r&&(s==="="?(r=5,o=i,i=""):s==="/"&&(r<5||n[d][u+1]===">")?(c(),r===3&&(l=l[0]),r=l,(l=l[0]).push(2,0,r),r=0):s===" "||s===" "||s===` -`||s==="\r"?(c(),r=2):i+=s),r===3&&i==="!--"&&(r=4,l=l[0])}return c(),l})(t)),e),arguments,[])).length>1?e:e[0]}function xh(t,e){if(t instanceof RegExp)return{keys:!1,pattern:t};var n,s,o,r,i=[],a="",l=t.split("/");for(l[0]||l.shift();o=l.shift();)n=o[0],n==="*"?(i.push(n),a+=o[1]==="?"?"(?:/(.*))?":"/(.*)"):n===":"?(s=o.indexOf("?",1),r=o.indexOf(".",1),i.push(o.substring(1,~s?s:~r?r:o.length)),a+=~s&&!~r?"(?:/([^/]+?))?":"/([^/]+?)",~r&&(a+=(~s?"?":"")+"\\"+o.substring(r))):a+="/"+o;return{keys:i,pattern:new RegExp("^"+a+(e?"(?=$|/)":"/?$"),"i")}}var Ek=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function td(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}function yh(t,e,n){n&&!Ek&&(e=n);let s=e(),[{_instance:o},r]=y({_instance:{_value:s,_getSnapshot:e}});return Vs(()=>{o._value=s,o._getSnapshot=e,td(o._value,e())||r({_instance:o})},[t,s,e]),L(()=>(td(o._value,o._getSnapshot())||r({_instance:o}),t(()=>{td(o._value,o._getSnapshot())||r({_instance:o})})),[t]),s}var nd=t=>{let e=ee([t,(...n)=>e[0](...n)]).current;return Vs(()=>{e[0]=t}),e[1]};var Ik="popstate",sd="pushState",od="replaceState",Dk="hashchange",vh=[Ik,sd,od,Dk],Nk=t=>{for(let e of vh)addEventListener(e,t);return()=>{for(let e of vh)removeEventListener(e,t)}},Sh=(t,e)=>yh(Nk,t,e),$h=()=>location.search,Ch=({ssrSearch:t}={})=>Sh($h,t!=null?()=>t:$h),wh=()=>location.pathname,Ok=({ssrPath:t}={})=>Sh(wh,t!=null?()=>t:wh);var Bk=(t,{replace:e=!1,state:n=null}={})=>history[e?od:sd](n,"",t),_h=(t={})=>[Ok(t),Bk],kh=Symbol.for("wouter_v3");if(typeof history<"u"&&typeof window[kh]>"u"){for(let t of[sd,od]){let e=history[t];history[t]=function(){let n=e.apply(this,arguments),s=new Event(t);return s.arguments=arguments,dispatchEvent(s),n}}Object.defineProperty(window,kh,{value:!0})}var Fk=(t,e)=>e.toLowerCase().indexOf(t.toLowerCase())?"~"+e:e.slice(t.length)||"/",Ah=(t="")=>t==="/"?"":t,Th=(t,e)=>t[0]==="~"?t.slice(1):Ah(e)+t,Ph=(t="",e)=>Fk(Mh(Ah(t)),Mh(e));var Mh=t=>{try{return decodeURI(t)}catch{return t}};var Lh={hook:_h,searchHook:Ch,parser:xh,base:"",ssrPath:void 0,ssrSearch:void 0,ssrContext:void 0,hrefs:t=>t,aroundNav:(t,e,n)=>t(e,n)},Eh=ko(Lh),Or=()=>Nr(Eh),Ih={},Dh=ko(Ih),Hk=()=>Nr(Dh),la=t=>{let[e,n]=t.hook(t);return[Ph(t.base,e),nd((s,o)=>t.aroundNav(n,Th(s,t.base),o))]},ca=()=>la(Or());var Nh=(t,e,n,s)=>{let{pattern:o,keys:r}=e instanceof RegExp?{keys:!1,pattern:e}:t(e||"*",s),i=o.exec(n)||[],[a,...l]=i;return a!==void 0?[!0,(()=>{let c=r!==!1?Object.fromEntries(r.map((u,p)=>[u,l[p]])):i.groups,d={...l};return c&&Object.assign(d,c),d})(),...s?[a]:[]]:[!1,null]};var da=({children:t,...e})=>{let n=Or(),s=e.hook?Lh:n,o=s,[r,i=e.ssrSearch??""]=e.ssrPath?.split("?")??[];r&&(e.ssrSearch=i,e.ssrPath=r),e.hrefs=e.hrefs??e.hook?.hrefs,e.searchHook=e.searchHook??e.hook?.searchHook;let a=ee({}),l=a.current,c=l;for(let d in s){let u=d==="base"?s[d]+(e[d]??""):e[d]??s[d];l===c&&u!==c[d]&&(a.current=c={...c}),c[d]=u,(u!==s[d]||u!==o[d])&&(o=c)}return T(Eh.Provider,{value:o,children:t})},Rh=({children:t,component:e},n)=>e?T(e,{params:n}):typeof t=="function"?t(n):t,Wk=t=>{let e=ee(Ih),n=e.current;return e.current=Object.keys(t).length!==Object.keys(n).length||Object.entries(t).some(([s,o])=>o!==n[s])?t:n};var rt=({path:t,nest:e,match:n,...s})=>{let o=Or(),[r]=la(o),[i,a,l]=n??Nh(o.parser,t,r,e),c=Wk({...Hk(),...a});if(!i)return null;let d=l?T(da,{base:l},Rh(s,c)):Rh(s,c);return T(Dh.Provider,{value:c,children:d})},l4=(t,e)=>{let n=Or(),[s,o]=la(n),{to:r="",href:i=r,onClick:a,asChild:l,children:c,className:d,replace:u,state:p,transition:f,...g}=t,m=nd(b=>{b.ctrlKey||b.metaKey||b.altKey||b.shiftKey||b.button!==0||(a?.(b),b.defaultPrevented||(b.preventDefault(),o(i,t)))}),h=n.hrefs(i[0]==="~"?i.slice(1):n.base+i,n);return l&&Pr(c)?Er(c,{onClick:m,href:h}):T("a",{...g,onClick:m,href:h,className:d?.call?d(s===i):d,children:c,ref:e})},Oh=t=>Array.isArray(t)?t.flatMap(e=>Oh(e&&e.type===ln?e.props.children:e)):[t],rd=({children:t,location:e})=>{let n=Or(),[s]=la(n);for(let o of Oh(t)){let r=0;if(Pr(o)&&(r=Nh(n.parser,o.props.path,e||s,o.props.nest))[0])return Er(o,{match:r})}return null};var id=t=>{if(typeof t!="string"||!t.trim())return{};try{return JSON.parse(t)}catch{return{}}},Bh=({url:t="",onMessage:e=()=>{},onError:n=()=>{}})=>{if(typeof window?.EventSource!="function")throw new Error("Server events are not supported in this browser");let s=new window.EventSource(String(t||""),{withCredentials:!0}),o=l=>{e({event:"phase",data:id(l?.data||"")})},r=l=>{e({event:"done",data:id(l?.data||"")})},i=l=>{e({event:"error",data:id(l?.data||"")})},a=l=>{n(l)};return s.addEventListener("phase",o),s.addEventListener("done",r),s.addEventListener("error",i),s.onerror=a,()=>{s.removeEventListener("phase",o),s.removeEventListener("done",r),s.removeEventListener("error",i),s.onerror=null,s.close()}};var Fh="x-client-timezone",Vk=()=>{try{return Intl?.DateTimeFormat?.().resolvedOptions?.().timeZone||""}catch{return""}},Y=async(t,e={})=>{let n={...e},s=new Headers(e?.headers||{});if(!s.has(Fh)){let r=Vk();r&&s.set(Fh,r)}n.headers=s;let o=await fetch(t,n);if(o.status===401){try{window.localStorage?.clear?.()}catch{}throw window.location.href="/setup",new Error("Unauthorized")}return o},Hh=({onMessage:t=()=>{},onOpen:e=()=>{},onError:n=()=>{}}={})=>{if(typeof window?.EventSource!="function")throw new Error("Server events are not supported in this browser");let s=new window.EventSource("/api/events/status",{withCredentials:!0}),o=r=>{let i={};try{i=r?.data?JSON.parse(r.data):{}}catch{}t(i||{})};return s.addEventListener("status",o),s.onopen=()=>e(),s.onerror=r=>n(r),()=>{s.removeEventListener("status",o),s.onopen=null,s.onerror=null,s.close()}};async function So(){return(await Y("/api/status")).json()}async function Co(){return(await Y("/api/pairings")).json()}async function _o(t,e,n=""){return(await Y(`/api/pairings/${t}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({channel:e,accountId:n})})).json()}async function Mo(t,e,n=""){let s=await Y(`/api/pairings/${t}/reject`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({channel:e,accountId:n})});return fe(s,"Could not reject pairing")}async function Wh(){return(await Y("/api/google/accounts")).json()}async function Vh({accountId:t="",client:e=""}={}){let n=new URLSearchParams;t&&n.set("accountId",String(t)),e&&n.set("client",String(e));let s=n.toString()?`?${n.toString()}`:"";return(await Y(`/api/google/credentials${s}`)).json()}async function jh(t=""){let e=new URLSearchParams;t&&e.set("accountId",String(t));let n=e.toString()?`?${e.toString()}`:"";return(await Y(`/api/google/check${n}`)).json()}async function zh({clientId:t,clientSecret:e,email:n,services:s=[],client:o="default",personal:r=!1,accountId:i=""}){return(await Y("/api/google/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:t,clientSecret:e,email:n,services:s,client:o,personal:r,accountId:i})})).json()}async function Uh({email:t,services:e=[],client:n="default",personal:s=!1,accountId:o=""}){return(await Y("/api/google/accounts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t,services:e,client:n,personal:s,accountId:o})})).json()}async function Kh(t=""){return(await Y("/api/google/disconnect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:t})})).json()}var Gh=async()=>{let t=await Y("/api/gmail/config");return fe(t,"Could not load Gmail watch config")},qh=async({client:t="default",topicPath:e="",projectId:n="",regeneratePushToken:s=!1}={})=>{let o=await Y("/api/gmail/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client:t,topicPath:e,projectId:n,regeneratePushToken:s})});return fe(o,"Could not save Gmail watch config")},Jh=async(t,{destination:e=null}={})=>{let n=await Y("/api/gmail/watch/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:String(t||""),...e?{destination:e}:{}})});return fe(n,"Could not start Gmail watch")},Zh=async t=>{let e=await Y("/api/gmail/watch/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:String(t||"")})});return fe(e,"Could not stop Gmail watch")},Yh=async({accountId:t="",force:e=!0}={})=>{let n=await Y("/api/gmail/watch/renew",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:String(t||""),force:!!e})});return fe(n,"Could not renew Gmail watch")},Xh=async()=>{let t=await Y("/api/agent/sessions");return fe(t,"Could not load agent sessions")},ua=async()=>{let t=await Y("/api/doctor/status");return fe(t,"Could not load Doctor status")},Qh=async()=>{let t=await Y("/api/doctor/run",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});return fe(t,"Could not start Doctor run")};var em=async(t=10)=>{let e=new URLSearchParams({limit:String(t)}),n=await Y(`/api/doctor/runs?${e.toString()}`);return fe(n,"Could not load Doctor runs")},tm=async({runId:t="all"}={})=>{let e=new URLSearchParams;String(t||"").trim()&&e.set("runId",String(t||""));let n=e.toString()?`?${e.toString()}`:"",s=await Y(`/api/doctor/cards${n}`);return fe(s,"Could not load Doctor findings")};var pa=async({cardId:t,status:e})=>{let n=await Y(`/api/doctor/cards/${encodeURIComponent(String(t||""))}/status`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:String(e||"")})});return fe(n,"Could not update Doctor card status")},nm=async({cardId:t,sessionId:e="",replyChannel:n="",replyTo:s="",prompt:o=""}={})=>{let r=await Y(`/api/doctor/findings/${encodeURIComponent(String(t||""))}/fix`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:String(e||""),replyChannel:String(n||""),replyTo:String(s||""),prompt:String(o||"")})});return fe(r,"Could not send Doctor fix request")},fa=async({message:t="",sessionKey:e=""}={})=>{let n=await Y("/api/agent/message",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:String(t||""),sessionKey:String(e||"")})});return fe(n,"Could not send message to agent")};async function sm(){let t=await Y("/api/gateway/restart",{method:"POST"});return fe(t,"Could not restart gateway")}async function om(){let t=await Y("/api/restart-status");return fe(t,"Could not load restart status")}async function rm(){let t=await Y("/api/restart-status/dismiss",{method:"POST"});return fe(t,"Could not dismiss restart status")}async function im(){let t=await Y("/api/watchdog/status");return fe(t,"Could not load watchdog status")}async function am(t=30){let e=new URLSearchParams({days:String(t)}),n=await Y(`/api/usage/summary?${e.toString()}`);return fe(n,"Could not load usage summary")}async function lm(t=50){let e=new URLSearchParams({limit:String(t)}),n=await Y(`/api/usage/sessions?${e.toString()}`);return fe(n,"Could not load usage sessions")}async function cm(t){let e=await Y(`/api/usage/sessions/${encodeURIComponent(String(t||""))}`);return fe(e,"Could not load usage session detail")}async function dm(t=20){let e=await Y(`/api/watchdog/events?limit=${encodeURIComponent(String(t))}`);return fe(e,"Could not load watchdog events")}async function um(t=65536){let e=await Y(`/api/watchdog/logs?tail=${encodeURIComponent(String(t))}`);if(!e.ok)throw new Error("Could not load watchdog logs");return e.text()}async function ad(t){let e=await Y("/api/watchdog/terminal/close",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:String(t||"")})});return fe(e,"Could not close watchdog terminal")}async function ha(){let t=await Y("/api/watchdog/repair",{method:"POST"});return fe(t,"Could not trigger watchdog repair")}async function pm(){let t=await Y("/api/watchdog/resources");return fe(t,"Could not load system resources")}async function fm(){let t=await Y("/api/watchdog/settings");return fe(t,"Could not load watchdog settings")}async function ld(t){let e=await Y("/api/watchdog/settings",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return fe(e,"Could not update watchdog settings")}async function hm(){return(await Y("/api/gateway/dashboard")).json()}async function mm(t=!1){return(await Y(`/api/openclaw/version${t?"?refresh=1":""}`)).json()}async function ma(){return(await Y("/api/openclaw/update",{method:"POST"})).json()}async function gm(t=!1){return(await Y(`/api/alphaclaw/version${t?"?refresh=1":""}`)).json()}async function bm(t=""){let e=String(t||"").trim(),n=e?`?${new URLSearchParams({tag:e}).toString()}`:"";try{let s=await Y(`/api/alphaclaw/release-notes${n}`);return await fe(s,"Could not load release notes")}catch{let s=e?`https://api.github.com/repos/chrysb/alphaclaw/releases/tags/${encodeURIComponent(e)}`:"https://api.github.com/repos/chrysb/alphaclaw/releases/latest",o=await fetch(s,{headers:{Accept:"application/vnd.github+json"}}),r=await o.text(),i=null;try{i=r?JSON.parse(r):null}catch{throw new Error(r||"Could not load release notes")}if(!o.ok)throw new Error(i?.message||r||"Could not load release notes");return{ok:!0,tag:String(i?.tag_name||e||""),name:String(i?.name||""),body:String(i?.body||""),htmlUrl:String(i?.html_url||""),publishedAt:String(i?.published_at||"")}}}async function xm(){return(await Y("/api/alphaclaw/update",{method:"POST"})).json()}async function ym(t){let e=await Y("/api/sync-cron",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),n=await e.text(),s;try{s=n?JSON.parse(n):{}}catch{throw new Error(n||"Could not parse sync cron response")}if(!e.ok)throw new Error(s.error||n||`HTTP ${e.status}`);return s}async function vm({sortBy:t="nextRunAtMs",sortDir:e="asc"}={}){let n=new URLSearchParams;t&&n.set("sortBy",String(t)),e&&n.set("sortDir",String(e));let s=n.toString()?`?${n.toString()}`:"",o=await Y(`/api/cron/jobs${s}`);return fe(o,"Could not load cron jobs")}async function $m(){let t=await Y("/api/cron/status");return fe(t,"Could not load cron status")}async function cd(t,{limit:e=20,offset:n=0,status:s="all",deliveryStatus:o="all",sortDir:r="desc",query:i=""}={}){let a=new URLSearchParams({limit:String(e),offset:String(n),status:String(s||"all"),deliveryStatus:String(o||"all"),sortDir:String(r||"desc")});String(i||"").trim()&&a.set("query",String(i).trim());let l=encodeURIComponent(String(t||"")),c=await Y(`/api/cron/jobs/${l}/runs?${a.toString()}`);return fe(c,"Could not load cron run history")}async function wm(t,{days:e=30}={}){let n=new URLSearchParams({days:String(e)}),s=encodeURIComponent(String(t||"")),o=await Y(`/api/cron/jobs/${s}/usage?${n.toString()}`);return fe(o,"Could not load cron job usage")}async function km(t,{range:e="7d"}={}){let n=new URLSearchParams({range:String(e||"7d")}),s=encodeURIComponent(String(t||"")),o=await Y(`/api/cron/jobs/${s}/trends?${n.toString()}`);return fe(o,"Could not load cron job trends")}async function Sm({days:t=30}={}){let e=new URLSearchParams({days:String(t)}),n=await Y(`/api/cron/usage/bulk?${e.toString()}`);return fe(n,"Could not load cron usage overview")}async function Cm({sinceMs:t=0,limitPerJob:e=20,status:n="all",deliveryStatus:s="all",sortDir:o="desc"}={}){let r=new URLSearchParams({sinceMs:String(t||0),limitPerJob:String(e||20),status:String(n||"all"),deliveryStatus:String(s||"all"),sortDir:String(o||"desc")}),i=await Y(`/api/cron/runs/bulk?${r.toString()}`);return fe(i,"Could not load cron run outcomes")}async function _m(t){let e=encodeURIComponent(String(t||"")),n=await Y(`/api/cron/jobs/${e}/run`,{method:"POST"});return fe(n,"Could not trigger cron job run")}async function Mm(t,e){let n=encodeURIComponent(String(t||"")),o=await Y(`/api/cron/jobs/${n}/${e?"enable":"disable"}`,{method:"POST"});return fe(o,"Could not update cron job state")}async function Am(t,e){let n=encodeURIComponent(String(t||"")),s=await Y(`/api/cron/jobs/${n}/prompt`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:String(e||"")})});return fe(s,"Could not update cron prompt")}async function Tm(t,{sessionTarget:e="",wakeMode:n="",deliveryMode:s="",deliveryChannel:o="",deliveryTo:r=""}={}){let i=encodeURIComponent(String(t||"")),a=await Y(`/api/cron/jobs/${i}/routing`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionTarget:String(e||""),wakeMode:String(n||""),deliveryMode:String(s||""),deliveryChannel:String(o||""),deliveryTo:String(r||"")})});return fe(a,"Could not update cron routing")}async function ga(){return(await Y("/api/devices")).json()}async function ba(t){return(await Y(`/api/devices/${t}/approve`,{method:"POST"})).json()}async function xa(t){return(await Y(`/api/devices/${t}/reject`,{method:"POST"})).json()}var Pm=async()=>{let t=await Y("/api/nodes");return fe(t,"Could not load nodes")};var Rm=async t=>{let e=encodeURIComponent(String(t||"")),n=await Y(`/api/nodes/${e}`,{method:"DELETE"});return fe(n,"Could not remove node")},Lm=async t=>{let e=encodeURIComponent(String(t||"")),n=new AbortController,s=setTimeout(()=>n.abort(),2e4);try{let o=await Y(`/api/nodes/${e}/route`,{method:"POST",signal:n.signal});return fe(o,"Could not route execution to node")}catch(o){throw String(o?.name||"")==="AbortError"?new Error("Routing timed out. Gateway may be restarting or unavailable."):o}finally{clearTimeout(s)}},ya=async()=>{let t=await Y("/api/nodes/connect-info");return fe(t,"Could not load connect info")},Em=async(t,e="user")=>{let n=encodeURIComponent(String(t||"")),s=new URLSearchParams({profile:String(e||"user")}),o=await Y(`/api/nodes/${n}/browser-status?${s.toString()}`);return fe(o,"Could not load node browser status")};var Im=async()=>(await Y("/api/auth/status")).json(),Dm=async()=>(await Y("/api/auth/logout",{method:"POST"})).json();async function Nm(){return(await Y("/api/onboard/status")).json()}async function Om(t,e,{importMode:n=!1}={}){return(await Y("/api/onboard",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({vars:t,modelKey:e,importMode:n})})).json()}async function va(t,e,n="new"){return(await Y("/api/onboard/github/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:t,token:e,mode:n})})).json()}async function Bm(t){return(await Y("/api/onboard/import/scan",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({tempDir:t})})).json()}async function Fm({tempDir:t,approvedSecrets:e=[],skipSecretExtraction:n=!1,githubRepo:s="",githubToken:o=""}){return(await Y("/api/onboard/import/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({tempDir:t,approvedSecrets:e,skipSecretExtraction:n,githubRepo:s,githubToken:o})})).json()}var Br=async()=>(await Y("/api/models")).json();var Hm=async({agentId:t}={})=>{let e=t?`?agentId=${encodeURIComponent(t)}`:"";return(await Y(`/api/models/config${e}`)).json()},Wm=async({primary:t,configuredModels:e,profiles:n,authOrder:s,agentId:o}={})=>{let r=o?`?agentId=${encodeURIComponent(o)}`:"";return(await Y(`/api/models/config${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({primary:t,configuredModels:e,profiles:n,authOrder:s})})).json()};var Ao=async()=>{let t=await Y("/api/agents");return fe(t,"Could not load agents")},To=async()=>{let t=await Y("/api/channels/accounts");return fe(t,"Could not load channel accounts")},Vm=async({provider:t="",accountId:e="default"}={})=>{let n=new URLSearchParams({provider:String(t||""),accountId:String(e||"default")}),s=await Y(`/api/channels/accounts/token?${n.toString()}`);return fe(s,"Could not load channel token")},jm=async t=>{let e=await Y("/api/channels/accounts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return fe(e,"Could not create channel account")},zm=async t=>{let e=await Y("/api/channels/accounts/jobs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return fe(e,"Could not start channel account operation")},Um=({operationId:t="",onMessage:e=()=>{},onError:n=()=>{}})=>Bh({url:`/api/operations/${encodeURIComponent(String(t||""))}/events`,onMessage:e,onError:n}),Fr=async t=>{let e=await Y("/api/channels/accounts",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return fe(e,"Could not update channel account")},$a=async t=>{let e=await Y("/api/channels/accounts",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return fe(e,"Could not delete channel account")};var Km=async t=>{let e=await Y(`/api/agents/${encodeURIComponent(String(t||""))}/workspace-size`);return fe(e,"Could not load workspace size")},Gm=async t=>{let e=await Y(`/api/agents/${encodeURIComponent(String(t||""))}/bindings`);return fe(e,"Could not load agent bindings")},qm=async t=>{let e=await Y("/api/agents",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return fe(e,"Could not create agent")},Jm=async(t,e)=>{let n=await Y(`/api/agents/${encodeURIComponent(String(t||""))}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e||{})});return fe(n,"Could not update agent")};var Zm=async(t,{keepWorkspace:e=!0}={})=>{let n=new URLSearchParams({keepWorkspace:e?"true":"false"}),s=await Y(`/api/agents/${encodeURIComponent(String(t||""))}?${n.toString()}`,{method:"DELETE"});return fe(s,"Could not delete agent")},Ym=async t=>{let e=await Y(`/api/agents/${encodeURIComponent(String(t||""))}/default`,{method:"POST"});return fe(e,"Could not set default agent")},Po=async()=>(await Y("/api/codex/status")).json(),Hr=async()=>(await Y("/api/codex/disconnect",{method:"POST"})).json(),Wr=async t=>(await Y("/api/codex/exchange",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:t})})).json();async function Vr(){return(await Y("/api/env")).json()}async function dd(t){let e=await Y("/api/env",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({vars:t})}),n=await e.text(),s;try{s=n?JSON.parse(n):{}}catch{throw new Error(n||"Could not parse env save response")}if(!e.ok)throw new Error(s.error||n||`HTTP ${e.status}`);return s}var fe=async(t,e)=>{let n=await t.text(),s;try{s=n?JSON.parse(n):{}}catch{throw new Error(n||e)}if(!t.ok||s?.ok===!1)throw new Error(s.error||n||`HTTP ${t.status}`);return s};async function Xm(){let t=await Y("/api/webhooks");return fe(t,"Could not load webhooks")}async function Qm(t){let e=await Y(`/api/webhooks/${encodeURIComponent(t)}`);return fe(e,"Could not load webhook detail")}async function eg(t,{destination:e=null,oauthCallback:n=!1}={}){let s=await Y("/api/webhooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,...e?{destination:e}:{},oauthCallback:!!n})});return fe(s,"Could not create webhook")}async function tg(t,{deleteTransformDir:e=!1}={}){let n=await Y(`/api/webhooks/${encodeURIComponent(t)}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({deleteTransformDir:!!e})});return fe(n,"Could not delete webhook")}async function ng(t,{destination:e=null}={}){let n=await Y(`/api/webhooks/${encodeURIComponent(t)}/destination`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({destination:e})});return fe(n,"Could not update webhook destination")}async function sg(t){let e=await Y(`/api/webhooks/${encodeURIComponent(t)}/oauth-callback/rotate`,{method:"POST"});return fe(e,"Could not rotate OAuth callback")}async function og(t,{limit:e=50,offset:n=0,status:s="all"}={}){let o=new URLSearchParams({limit:String(e),offset:String(n),status:String(s||"all")}),r=await Y(`/api/webhooks/${encodeURIComponent(t)}/requests?${o.toString()}`);return fe(r,"Could not load webhook requests")}async function rg(t,e){let n=await Y(`/api/webhooks/${encodeURIComponent(t)}/requests/${encodeURIComponent(String(e))}`);return fe(n,"Could not load webhook request")}var ig=async(t=10)=>{let e=new URLSearchParams({depth:String(t)}),n=await Y(`/api/browse/tree?${e.toString()}`);return fe(n,"Could not load file tree")},ud=async t=>{let e=new URLSearchParams({path:String(t||"")}),n=await Y(`/api/browse/read?${e.toString()}`);return fe(n,"Could not load file content")},ag=async(t,e)=>{let n=String(t||""),s=typeof e=="string"?e:String(e??""),o=await Y("/api/browse/write",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n,content:s})});return fe(o,"Could not save file")},lg=async t=>{let e=await Y("/api/browse/create-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return fe(e,"Could not create file")},cg=async t=>{let e=await Y("/api/browse/create-folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return fe(e,"Could not create folder")},dg=async(t,e)=>{let n=await Y("/api/browse/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({from:String(t||""),to:String(e||"")})});return fe(n,"Could not move path")},wa=async t=>{let e=await Y("/api/browse/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return fe(e,"Could not delete file")},ug=async t=>{let e=new URLSearchParams({path:String(t||"")}),n=await Y(`/api/browse/download?${e.toString()}`);if(!n.ok){let a=await n.text();throw new Error(a||"Could not download file")}let s=await n.blob(),o=window?.URL||URL;if(!o?.createObjectURL||!o?.revokeObjectURL)throw new Error("Download is not supported in this browser");let r=o.createObjectURL(s),i=String(t||"").split("/").filter(Boolean).pop()||"download";try{let a=document.createElement("a");a.href=r,a.download=i,document.body?.appendChild(a),a.click(),a.remove()}finally{o.revokeObjectURL(r)}return{ok:!0}},pg=async t=>{let e=await Y("/api/browse/restore",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return fe(e,"Could not restore file")},pd=async()=>{let t=await Y("/api/browse/git-summary");return fe(t,"Could not load git summary")},fg=async t=>{let e=new URLSearchParams({path:String(t||"")}),n=await Y(`/api/browse/git-diff?${e.toString()}`);return fe(n,"Could not load file diff")},hg=async({filePath:t,table:e,limit:n=50,offset:s=0})=>{let o=new URLSearchParams({path:String(t||""),table:String(e||""),limit:String(n),offset:String(s)}),r=await Y(`/api/browse/sqlite-table?${o.toString()}`);return fe(r,"Could not load sqlite table data")},mg=async(t="")=>{let e=await Y("/api/browse/git-sync",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:String(t||"")})});return fe(e,"Could not sync changes")};var js=t=>String(t||"").split("/")[0]||"",Ro=t=>{let e=String(t||"").trim();return e==="openai-codex"?"openai":e==="volcengine-plan"?"volcengine":e==="byteplus-plan"?"byteplus":e},jk=[{label:"Opus 4.6",preferredKeys:["anthropic/claude-opus-4-6"]},{label:"Sonnet 4.6",preferredKeys:["anthropic/claude-sonnet-4-6"]},{label:"Codex 5.3",preferredKeys:["openai-codex/gpt-5.3-codex"]},{label:"GPT-5.4",preferredKeys:["openai-codex/gpt-5.4"]},{label:"Gemini 3.1 Pro",preferredKeys:["google/gemini-3.1-pro-preview"]}],Lo=t=>{let e=[],n=new Set;return jk.forEach(s=>{let o=s.preferredKeys.map(r=>t.find(i=>i.key===r)).find(Boolean);!o||n.has(o.key)||(e.push({...o,featuredLabel:s.label}),n.add(o.key))}),e},Mn={anthropic:[{key:"ANTHROPIC_API_KEY",label:"Anthropic API Key",url:"https://console.anthropic.com",linkText:"Get key",placeholder:"sk-ant-..."},{key:"ANTHROPIC_TOKEN",label:"Anthropic Setup Token",hint:"From claude setup-token (uses your Claude subscription)",linkText:"Get token",placeholder:"Token..."}],openai:[{key:"OPENAI_API_KEY",label:"OpenAI API Key",url:"https://platform.openai.com",linkText:"Get key",placeholder:"sk-..."}],google:[{key:"GEMINI_API_KEY",label:"Gemini API Key",url:"https://aistudio.google.com",linkText:"Get key",placeholder:"AI..."}],opencode:[{key:"OPENCODE_API_KEY",label:"OpenCode API Key",placeholder:"oc-..."}],openrouter:[{key:"OPENROUTER_API_KEY",label:"OpenRouter API Key",url:"https://openrouter.ai",linkText:"Get key",placeholder:"sk-or-..."}],zai:[{key:"ZAI_API_KEY",label:"Z.AI API Key",placeholder:"zai-..."}],"vercel-ai-gateway":[{key:"AI_GATEWAY_API_KEY",label:"AI Gateway API Key",placeholder:"aigw_..."}],kilocode:[{key:"KILOCODE_API_KEY",label:"KiloCode API Key",placeholder:"kilo_..."}],xai:[{key:"XAI_API_KEY",label:"xAI API Key",placeholder:"xai-..."}],mistral:[{key:"MISTRAL_API_KEY",label:"Mistral API Key",url:"https://console.mistral.ai",linkText:"Get key",placeholder:"sk-..."}],voyage:[{key:"VOYAGE_API_KEY",label:"Voyage API Key",url:"https://dash.voyageai.com",linkText:"Get key",placeholder:"pa-..."}],groq:[{key:"GROQ_API_KEY",label:"Groq API Key",url:"https://console.groq.com",linkText:"Get key",placeholder:"gsk_..."}],cerebras:[{key:"CEREBRAS_API_KEY",label:"Cerebras API Key",placeholder:"csk-..."}],moonshot:[{key:"MOONSHOT_API_KEY",label:"Moonshot API Key",placeholder:"sk-..."}],"kimi-coding":[{key:"KIMI_API_KEY",label:"Kimi API Key",placeholder:"sk-..."}],volcengine:[{key:"VOLCANO_ENGINE_API_KEY",label:"Volcano Engine API Key",placeholder:"ve-..."}],byteplus:[{key:"BYTEPLUS_API_KEY",label:"BytePlus API Key",placeholder:"bp-..."}],synthetic:[{key:"SYNTHETIC_API_KEY",label:"Synthetic API Key",placeholder:"syn-..."}],minimax:[{key:"MINIMAX_API_KEY",label:"MiniMax API Key",placeholder:"minimax-..."}],deepgram:[{key:"DEEPGRAM_API_KEY",label:"Deepgram API Key",url:"https://console.deepgram.com",linkText:"Get key",placeholder:"dg-..."}],vllm:[{key:"VLLM_API_KEY",label:"vLLM API Key",placeholder:"vllm-local"}]},zs={anthropic:"Anthropic",openai:"OpenAI",google:"Gemini",opencode:"OpenCode Zen",openrouter:"OpenRouter",zai:"Z.AI","vercel-ai-gateway":"Vercel AI Gateway",kilocode:"Kilo Gateway",xai:"xAI",mistral:"Mistral",cerebras:"Cerebras",moonshot:"Moonshot","kimi-coding":"Kimi Coding",volcengine:"Volcano Engine",byteplus:"BytePlus",synthetic:"Synthetic",minimax:"MiniMax",voyage:"Voyage",groq:"Groq",deepgram:"Deepgram",vllm:"vLLM"},jr=["anthropic","openai","google","zai","xai","openrouter","opencode","kilocode","vercel-ai-gateway","minimax","moonshot","kimi-coding","volcengine","byteplus","synthetic","mistral","cerebras","voyage","groq","deepgram","vllm"];var gg=[{id:"embeddings",label:"Memory Embeddings",tag:"Embeddings",providers:["openai","google","voyage","mistral"]},{id:"audio",label:"Audio Transcription",tag:"Audio",hasDefault:!0,providers:["openai","groq","deepgram","google","mistral"]}],bg=t=>{if(t==="openai-codex")return new Set;let e=Ro(t),n=Mn[e]||[];return new Set(n.map(s=>s.key))},xg=Object.values(Mn).flat().filter((t,e,n)=>n.findIndex(s=>s.key===t.key)===e);var Eo=P.bind(T),fd="new",hd="existing",An="fresh",Bt="import",Tn="create",qn="existing-empty",zk=t=>String(t||"").trim().replace(/^git@github\.com:/,"").replace(/^https:\/\/github\.com\//,"").replace(/\.git$/,""),zr=t=>{let e=zk(t);if(!e)return!1;let n=e.split("/").filter(Boolean);return n.length===2&&!n.some(s=>/\s/.test(s))},Ht=[{id:"github",title:"GitHub",description:"Auto-backup your config and workspace",fields:[{key:"_GITHUB_SOURCE_REPO",label:"Source Repo",placeholder:"username/existing-openclaw",isText:!0},{key:"GITHUB_WORKSPACE_REPO",label:"New Workspace Repo",placeholder:"username/my-agent",isText:!0},{key:"GITHUB_TOKEN",label:"Personal Access Token",hint:Eo`Create a${" "}2&&(i.children=arguments.length>3?Lr.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(r in t.defaultProps)i[r]===void 0&&(i[r]=t.defaultProps[r]);return Rr(t,i,s,o,null)}function Rr(t,e,n,s,o){var r={type:t,props:e,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++Zf,__i:-1,__u:0};return o==null&&_e.vnode!=null&&_e.vnode(r),r}function ln(t){return t.children}function hn(t,e){this.props=t,this.context=e}function wo(t,e){if(e==null)return t.__?wo(t.__,t.__i+1):null;for(var n;ee&&bs.sort(Xf),t=bs.shift(),e=bs.length,Dk(t)}finally{bs.length=ca.__r=0}}function nh(t,e,n,s,o,r,i,a,l,c,d){var u,p,f,g,m,h,x,b=s&&s.__k||la,v=e.length;for(l=Nk(n,e,b,l,v),u=0;u0?i=t.__k[r]=Rr(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):t.__k[r]=i,l=r+p,i.__=t,i.__b=t.__b+1,a=null,(c=i.__i=Ok(i,n,l,u))!=-1&&(u--,(a=n[c])&&(a.__u|=2)),a==null||a.__v==null?(c==-1&&(o>d?p--:ol?p--:p++,i.__u|=4))):t.__k[r]=null;if(u)for(r=0;r(d?1:0)){for(o=n-1,r=n+1;o>=0||r=0?o--:r++])!=null&&(2&c.__u)==0&&a==c.key&&l==c.type)return i}return-1}function qf(t,e,n){e[0]=="-"?t.setProperty(e,n??""):t[e]=n==null?"":typeof n!="number"||Ik.test(e)?n:n+"px"}function ia(t,e,n,s,o){var r,i;e:if(e=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof s=="string"&&(t.style.cssText=s=""),s)for(e in s)n&&e in n||qf(t.style,e,"");if(n)for(e in n)s&&n[e]==s[e]||qf(t.style,e,n[e])}else if(e[0]=="o"&&e[1]=="n")r=e!=(e=e.replace(Qf,"$1")),i=e.toLowerCase(),e=i in t||e=="onFocusOut"||e=="onFocusIn"?i.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+r]=n,n?s?n.u=s.u:(n.u=Jc,t.addEventListener(e,r?Kc:Uc,r)):t.removeEventListener(e,r?Kc:Uc,r);else{if(o=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&n==1?"":n))}}function Jf(t){return function(e){if(this.l){var n=this.l[e.type+t];if(e.t==null)e.t=Jc++;else if(e.t0?t:Ir(t)?t.map(rh):_n({},t)}function Bk(t,e,n,s,o,r,i,a,l){var c,d,u,p,f,g,m,h=n.props||aa,x=e.props,b=e.type;if(b=="svg"?o="http://www.w3.org/2000/svg":b=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),r!=null){for(c=0;c2&&(a.children=arguments.length>3?Lr.call(arguments,2):n),Rr(t.type,a,s||t.key,o||t.ref,null)}function So(t){function e(n){var s,o;return this.getChildContext||(s=new Set,(o={})[e.__c]=this,this.getChildContext=function(){return o},this.componentWillUnmount=function(){s=null},this.shouldComponentUpdate=function(r){this.props.value!=r.value&&s.forEach(function(i){i.__e=!0,Gc(i)})},this.sub=function(r){s.add(r);var i=r.componentWillUnmount;r.componentWillUnmount=function(){s&&s.delete(r),i&&i.call(r)}}),n.children}return e.__c="__cC"+eh++,e.__=t,e.Provider=e.__l=(e.Consumer=function(n,s){return n.children(s)}).contextType=e,e}Lr=la.slice,_e={__e:function(t,e,n,s){for(var o,r,i;e=e.__;)if((o=e.__c)&&!o.__)try{if((r=o.constructor)&&r.getDerivedStateFromError!=null&&(o.setState(r.getDerivedStateFromError(t)),i=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(t,s||{}),i=o.__d),i)return o.__E=o}catch(a){t=a}throw t}},Zf=0,Er=function(t){return t!=null&&t.constructor===void 0},hn.prototype.setState=function(t,e){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=_n({},this.state),typeof t=="function"&&(t=t(_n({},n),this.props)),t&&_n(n,t),t!=null&&this.__v&&(e&&this._sb.push(e),Gc(this))},hn.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Gc(this))},hn.prototype.render=ln,bs=[],Yf=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Xf=function(t,e){return t.__v.__b-e.__v.__b},ca.__r=0,Qf=/(PointerCapture)$|Capture$/i,Jc=0,Uc=Jf(!1),Kc=Jf(!0),eh=0;var Us,ot,Qc,ah,Or=0,mh=[],ht=_e,lh=ht.__b,ch=ht.__r,dh=ht.diffed,uh=ht.__c,ph=ht.unmount,fh=ht.__;function Br(t,e){ht.__h&&ht.__h(ot,t,Or||e),Or=0;var n=ot.__H||(ot.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function y(t){return Or=1,gh(bh,t)}function gh(t,e,n){var s=Br(Us++,2);if(s.t=t,!s.__c&&(s.__=[n?n(e):bh(void 0,e),function(a){var l=s.__N?s.__N[0]:s.__[0],c=s.t(l,a);l!==c&&(s.__N=[c,s.__[1]],s.__c.setState({}))}],s.__c=ot,!ot.__f)){var o=function(a,l,c){if(!s.__c.__H)return!0;var d=s.__c.__H.__.filter(function(p){return p.__c});if(d.every(function(p){return!p.__N}))return!r||r.call(this,a,l,c);var u=s.__c.props!==a;return d.some(function(p){if(p.__N){var f=p.__[0];p.__=p.__N,p.__N=void 0,f!==p.__[0]&&(u=!0)}}),r&&r.call(this,a,l,c)||u};ot.__f=!0;var r=ot.shouldComponentUpdate,i=ot.componentWillUpdate;ot.componentWillUpdate=function(a,l,c){if(this.__e){var d=r;r=void 0,o(a,l,c),r=d}i&&i.call(this,a,l,c)},ot.shouldComponentUpdate=o}return s.__N||s.__}function L(t,e){var n=Br(Us++,3);!ht.__s&&td(n.__H,e)&&(n.__=t,n.u=e,ot.__H.__h.push(n))}function Ks(t,e){var n=Br(Us++,4);!ht.__s&&td(n.__H,e)&&(n.__=t,n.u=e,ot.__h.push(n))}function te(t){return Or=5,F(function(){return{current:t}},[])}function F(t,e){var n=Br(Us++,7);return td(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function G(t,e){return Or=8,F(function(){return t},e)}function Fr(t){var e=ot.context[t.__c],n=Br(Us++,9);return n.c=t,e?(n.__==null&&(n.__=!0,e.sub(ot)),e.props.value):t.__}function Wk(){for(var t;t=mh.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(da),e.__h.some(ed),e.__h=[]}catch(n){e.__h=[],ht.__e(n,t.__v)}}}ht.__b=function(t){ot=null,lh&&lh(t)},ht.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),fh&&fh(t,e)},ht.__r=function(t){ch&&ch(t),Us=0;var e=(ot=t.__c).__H;e&&(Qc===ot?(e.__h=[],ot.__h=[],e.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(e.__h.some(da),e.__h.some(ed),e.__h=[],Us=0)),Qc=ot},ht.diffed=function(t){dh&&dh(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(mh.push(e)!==1&&ah===ht.requestAnimationFrame||((ah=ht.requestAnimationFrame)||Hk)(Wk)),e.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Qc=ot=null},ht.__c=function(t,e){e.some(function(n){try{n.__h.some(da),n.__h=n.__h.filter(function(s){return!s.__||ed(s)})}catch(s){e.some(function(o){o.__h&&(o.__h=[])}),e=[],ht.__e(s,n.__v)}}),uh&&uh(t,e)},ht.unmount=function(t){ph&&ph(t);var e,n=t.__c;n&&n.__H&&(n.__H.__.some(function(s){try{da(s)}catch(o){e=o}}),n.__H=void 0,e&&ht.__e(e,n.__v))};var hh=typeof requestAnimationFrame=="function";function Hk(t){var e,n=function(){clearTimeout(s),hh&&cancelAnimationFrame(e),setTimeout(t)},s=setTimeout(n,35);hh&&(e=requestAnimationFrame(n))}function da(t){var e=ot,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),ot=e}function ed(t){var e=ot;t.__c=t.__(),ot=e}function td(t,e){return!t||t.length!==e.length||e.some(function(n,s){return n!==t[s]})}function bh(t,e){return typeof e=="function"?e(t):e}var yh=function(t,e,n,s){var o;e[0]=0;for(var r=1;r=5&&((i||!p&&r===5)&&(l.push(r,0,i,o),r=6),p&&(l.push(r,p,0,o),r=6)),i=""},d=0;d"?(r=1,i=""):i=s+i[0]:a?s===a?a="":i+=s:s==='"'||s==="'"?a=s:s===">"?(c(),r=1):r&&(s==="="?(r=5,o=i,i=""):s==="/"&&(r<5||n[d][u+1]===">")?(c(),r===3&&(l=l[0]),r=l,(l=l[0]).push(2,0,r),r=0):s===" "||s===" "||s===` +`||s==="\r"?(c(),r=2):i+=s),r===3&&i==="!--"&&(r=4,l=l[0])}return c(),l})(t)),e),arguments,[])).length>1?e:e[0]}function vh(t,e){if(t instanceof RegExp)return{keys:!1,pattern:t};var n,s,o,r,i=[],a="",l=t.split("/");for(l[0]||l.shift();o=l.shift();)n=o[0],n==="*"?(i.push(n),a+=o[1]==="?"?"(?:/(.*))?":"/(.*)"):n===":"?(s=o.indexOf("?",1),r=o.indexOf(".",1),i.push(o.substring(1,~s?s:~r?r:o.length)),a+=~s&&!~r?"(?:/([^/]+?))?":"/([^/]+?)",~r&&(a+=(~s?"?":"")+"\\"+o.substring(r))):a+="/"+o;return{keys:i,pattern:new RegExp("^"+a+(e?"(?=$|/)":"/?$"),"i")}}var Vk=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function nd(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}function $h(t,e,n){n&&!Vk&&(e=n);let s=e(),[{_instance:o},r]=y({_instance:{_value:s,_getSnapshot:e}});return Ks(()=>{o._value=s,o._getSnapshot=e,nd(o._value,e())||r({_instance:o})},[t,s,e]),L(()=>(nd(o._value,o._getSnapshot())||r({_instance:o}),t(()=>{nd(o._value,o._getSnapshot())||r({_instance:o})})),[t]),s}var sd=t=>{let e=te([t,(...n)=>e[0](...n)]).current;return Ks(()=>{e[0]=t}),e[1]};var jk="popstate",od="pushState",rd="replaceState",zk="hashchange",wh=[jk,od,rd,zk],Uk=t=>{for(let e of wh)addEventListener(e,t);return()=>{for(let e of wh)removeEventListener(e,t)}},_h=(t,e)=>$h(Uk,t,e),kh=()=>location.search,Ah=({ssrSearch:t}={})=>_h(kh,t!=null?()=>t:kh),Sh=()=>location.pathname,Kk=({ssrPath:t}={})=>_h(Sh,t!=null?()=>t:Sh);var Gk=(t,{replace:e=!1,state:n=null}={})=>history[e?rd:od](n,"",t),Mh=(t={})=>[Kk(t),Gk],Ch=Symbol.for("wouter_v3");if(typeof history<"u"&&typeof window[Ch]>"u"){for(let t of[od,rd]){let e=history[t];history[t]=function(){let n=e.apply(this,arguments),s=new Event(t);return s.arguments=arguments,dispatchEvent(s),n}}Object.defineProperty(window,Ch,{value:!0})}var qk=(t,e)=>e.toLowerCase().indexOf(t.toLowerCase())?"~"+e:e.slice(t.length)||"/",Ph=(t="")=>t==="/"?"":t,Rh=(t,e)=>t[0]==="~"?t.slice(1):Ph(e)+t,Lh=(t="",e)=>qk(Th(Ph(t)),Th(e));var Th=t=>{try{return decodeURI(t)}catch{return t}};var Ih={hook:Mh,searchHook:Ah,parser:vh,base:"",ssrPath:void 0,ssrSearch:void 0,ssrContext:void 0,hrefs:t=>t,aroundNav:(t,e,n)=>t(e,n)},Dh=So(Ih),Wr=()=>Fr(Dh),Nh={},Oh=So(Nh),Jk=()=>Fr(Oh),ua=t=>{let[e,n]=t.hook(t);return[Lh(t.base,e),sd((s,o)=>t.aroundNav(n,Rh(s,t.base),o))]},pa=()=>ua(Wr());var Bh=(t,e,n,s)=>{let{pattern:o,keys:r}=e instanceof RegExp?{keys:!1,pattern:e}:t(e||"*",s),i=o.exec(n)||[],[a,...l]=i;return a!==void 0?[!0,(()=>{let c=r!==!1?Object.fromEntries(r.map((u,p)=>[u,l[p]])):i.groups,d={...l};return c&&Object.assign(d,c),d})(),...s?[a]:[]]:[!1,null]};var fa=({children:t,...e})=>{let n=Wr(),s=e.hook?Ih:n,o=s,[r,i=e.ssrSearch??""]=e.ssrPath?.split("?")??[];r&&(e.ssrSearch=i,e.ssrPath=r),e.hrefs=e.hrefs??e.hook?.hrefs,e.searchHook=e.searchHook??e.hook?.searchHook;let a=te({}),l=a.current,c=l;for(let d in s){let u=d==="base"?s[d]+(e[d]??""):e[d]??s[d];l===c&&u!==c[d]&&(a.current=c={...c}),c[d]=u,(u!==s[d]||u!==o[d])&&(o=c)}return T(Dh.Provider,{value:o,children:t})},Eh=({children:t,component:e},n)=>e?T(e,{params:n}):typeof t=="function"?t(n):t,Zk=t=>{let e=te(Nh),n=e.current;return e.current=Object.keys(t).length!==Object.keys(n).length||Object.entries(t).some(([s,o])=>o!==n[s])?t:n};var lt=({path:t,nest:e,match:n,...s})=>{let o=Wr(),[r]=ua(o),[i,a,l]=n??Bh(o.parser,t,r,e),c=Zk({...Jk(),...a});if(!i)return null;let d=l?T(fa,{base:l},Eh(s,c)):Eh(s,c);return T(Oh.Provider,{value:c,children:d})},$L=(t,e)=>{let n=Wr(),[s,o]=ua(n),{to:r="",href:i=r,onClick:a,asChild:l,children:c,className:d,replace:u,state:p,transition:f,...g}=t,m=sd(x=>{x.ctrlKey||x.metaKey||x.altKey||x.shiftKey||x.button!==0||(a?.(x),x.defaultPrevented||(x.preventDefault(),o(i,t)))}),h=n.hrefs(i[0]==="~"?i.slice(1):n.base+i,n);return l&&Er(c)?Nr(c,{onClick:m,href:h}):T("a",{...g,onClick:m,href:h,className:d?.call?d(s===i):d,children:c,ref:e})},Fh=t=>Array.isArray(t)?t.flatMap(e=>Fh(e&&e.type===ln?e.props.children:e)):[t],id=({children:t,location:e})=>{let n=Wr(),[s]=ua(n);for(let o of Fh(t)){let r=0;if(Er(o)&&(r=Bh(n.parser,o.props.path,e||s,o.props.nest))[0])return Nr(o,{match:r})}return null};var ad=t=>{if(typeof t!="string"||!t.trim())return{};try{return JSON.parse(t)}catch{return{}}},Wh=({url:t="",onMessage:e=()=>{},onError:n=()=>{}})=>{if(typeof window?.EventSource!="function")throw new Error("Server events are not supported in this browser");let s=new window.EventSource(String(t||""),{withCredentials:!0}),o=l=>{e({event:"phase",data:ad(l?.data||"")})},r=l=>{e({event:"done",data:ad(l?.data||"")})},i=l=>{e({event:"error",data:ad(l?.data||"")})},a=l=>{n(l)};return s.addEventListener("phase",o),s.addEventListener("done",r),s.addEventListener("error",i),s.onerror=a,()=>{s.removeEventListener("phase",o),s.removeEventListener("done",r),s.removeEventListener("error",i),s.onerror=null,s.close()}};var Hh="x-client-timezone",Yk=()=>{try{return Intl?.DateTimeFormat?.().resolvedOptions?.().timeZone||""}catch{return""}},X=async(t,e={})=>{let n={...e},s=new Headers(e?.headers||{});if(!s.has(Hh)){let r=Yk();r&&s.set(Hh,r)}n.headers=s;let o=await fetch(t,n);if(o.status===401){try{window.localStorage?.clear?.()}catch{}throw window.location.href="/setup",new Error("Unauthorized")}return o},Vh=({onMessage:t=()=>{},onOpen:e=()=>{},onError:n=()=>{}}={})=>{if(typeof window?.EventSource!="function")throw new Error("Server events are not supported in this browser");let s=new window.EventSource("/api/events/status",{withCredentials:!0}),o=r=>{let i={};try{i=r?.data?JSON.parse(r.data):{}}catch{}t(i||{})};return s.addEventListener("status",o),s.onopen=()=>e(),s.onerror=r=>n(r),()=>{s.removeEventListener("status",o),s.onopen=null,s.onerror=null,s.close()}};async function Co(){return(await X("/api/status")).json()}async function _o(){return(await X("/api/pairings")).json()}async function Ao(t,e,n=""){return(await X(`/api/pairings/${t}/approve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({channel:e,accountId:n})})).json()}async function Mo(t,e,n=""){let s=await X(`/api/pairings/${t}/reject`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({channel:e,accountId:n})});return me(s,"Could not reject pairing")}async function jh(){return(await X("/api/google/accounts")).json()}async function zh({accountId:t="",client:e=""}={}){let n=new URLSearchParams;t&&n.set("accountId",String(t)),e&&n.set("client",String(e));let s=n.toString()?`?${n.toString()}`:"";return(await X(`/api/google/credentials${s}`)).json()}async function Uh(t=""){let e=new URLSearchParams;t&&e.set("accountId",String(t));let n=e.toString()?`?${e.toString()}`:"";return(await X(`/api/google/check${n}`)).json()}async function Kh({clientId:t,clientSecret:e,email:n,services:s=[],client:o="default",personal:r=!1,accountId:i=""}){return(await X("/api/google/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientId:t,clientSecret:e,email:n,services:s,client:o,personal:r,accountId:i})})).json()}async function Gh({email:t,services:e=[],client:n="default",personal:s=!1,accountId:o=""}){return(await X("/api/google/accounts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t,services:e,client:n,personal:s,accountId:o})})).json()}async function qh(t=""){return(await X("/api/google/disconnect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:t})})).json()}var Jh=async()=>{let t=await X("/api/gmail/config");return me(t,"Could not load Gmail watch config")},Zh=async({client:t="default",topicPath:e="",projectId:n="",regeneratePushToken:s=!1}={})=>{let o=await X("/api/gmail/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client:t,topicPath:e,projectId:n,regeneratePushToken:s})});return me(o,"Could not save Gmail watch config")},Yh=async(t,{destination:e=null}={})=>{let n=await X("/api/gmail/watch/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:String(t||""),...e?{destination:e}:{}})});return me(n,"Could not start Gmail watch")},Xh=async t=>{let e=await X("/api/gmail/watch/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:String(t||"")})});return me(e,"Could not stop Gmail watch")},Qh=async({accountId:t="",force:e=!0}={})=>{let n=await X("/api/gmail/watch/renew",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accountId:String(t||""),force:!!e})});return me(n,"Could not renew Gmail watch")},em=async()=>{let t=await X("/api/agent/sessions");return me(t,"Could not load agent sessions")},ha=async()=>{let t=await X("/api/doctor/status");return me(t,"Could not load Doctor status")},tm=async()=>{let t=await X("/api/doctor/run",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});return me(t,"Could not start Doctor run")};var nm=async(t=10)=>{let e=new URLSearchParams({limit:String(t)}),n=await X(`/api/doctor/runs?${e.toString()}`);return me(n,"Could not load Doctor runs")},sm=async({runId:t="all"}={})=>{let e=new URLSearchParams;String(t||"").trim()&&e.set("runId",String(t||""));let n=e.toString()?`?${e.toString()}`:"",s=await X(`/api/doctor/cards${n}`);return me(s,"Could not load Doctor findings")};var ma=async({cardId:t,status:e})=>{let n=await X(`/api/doctor/cards/${encodeURIComponent(String(t||""))}/status`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:String(e||"")})});return me(n,"Could not update Doctor card status")},om=async({cardId:t,sessionId:e="",replyChannel:n="",replyTo:s="",prompt:o=""}={})=>{let r=await X(`/api/doctor/findings/${encodeURIComponent(String(t||""))}/fix`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:String(e||""),replyChannel:String(n||""),replyTo:String(s||""),prompt:String(o||"")})});return me(r,"Could not send Doctor fix request")},ga=async({message:t="",sessionKey:e=""}={})=>{let n=await X("/api/agent/message",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:String(t||""),sessionKey:String(e||"")})});return me(n,"Could not send message to agent")};async function rm(){let t=await X("/api/gateway/restart",{method:"POST"});return me(t,"Could not restart gateway")}async function ba(){let t=await X("/api/restart-status");return me(t,"Could not load restart status")}async function im(){let t=await X("/api/restart-status/dismiss",{method:"POST"});return me(t,"Could not dismiss restart status")}async function am(){let t=await X("/api/watchdog/status");return me(t,"Could not load watchdog status")}async function lm(t=30){let e=new URLSearchParams({days:String(t)}),n=await X(`/api/usage/summary?${e.toString()}`);return me(n,"Could not load usage summary")}async function cm(t=50){let e=new URLSearchParams({limit:String(t)}),n=await X(`/api/usage/sessions?${e.toString()}`);return me(n,"Could not load usage sessions")}async function dm(t){let e=await X(`/api/usage/sessions/${encodeURIComponent(String(t||""))}`);return me(e,"Could not load usage session detail")}async function um(t=20){let e=await X(`/api/watchdog/events?limit=${encodeURIComponent(String(t))}`);return me(e,"Could not load watchdog events")}async function pm(t=65536){let e=await X(`/api/watchdog/logs?tail=${encodeURIComponent(String(t))}`);if(!e.ok)throw new Error("Could not load watchdog logs");return e.text()}async function ld(t){let e=await X("/api/watchdog/terminal/close",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:String(t||"")})});return me(e,"Could not close watchdog terminal")}async function xa(){let t=await X("/api/watchdog/repair",{method:"POST"});return me(t,"Could not trigger watchdog repair")}async function fm(){let t=await X("/api/watchdog/resources");return me(t,"Could not load system resources")}async function hm(){let t=await X("/api/watchdog/settings");return me(t,"Could not load watchdog settings")}async function cd(t){let e=await X("/api/watchdog/settings",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return me(e,"Could not update watchdog settings")}async function mm(){return(await X("/api/gateway/dashboard")).json()}async function gm(t=!1){return(await X(`/api/openclaw/version${t?"?refresh=1":""}`)).json()}async function ya(){return(await X("/api/openclaw/update",{method:"POST"})).json()}async function bm(t=!1){return(await X(`/api/alphaclaw/version${t?"?refresh=1":""}`)).json()}async function xm(t=""){let e=String(t||"").trim(),n=e?`?${new URLSearchParams({tag:e}).toString()}`:"";try{let s=await X(`/api/alphaclaw/release-notes${n}`);return await me(s,"Could not load release notes")}catch{let s=e?`https://api.github.com/repos/chrysb/alphaclaw/releases/tags/${encodeURIComponent(e)}`:"https://api.github.com/repos/chrysb/alphaclaw/releases/latest",o=await fetch(s,{headers:{Accept:"application/vnd.github+json"}}),r=await o.text(),i=null;try{i=r?JSON.parse(r):null}catch{throw new Error(r||"Could not load release notes")}if(!o.ok)throw new Error(i?.message||r||"Could not load release notes");return{ok:!0,tag:String(i?.tag_name||e||""),name:String(i?.name||""),body:String(i?.body||""),htmlUrl:String(i?.html_url||""),publishedAt:String(i?.published_at||"")}}}async function ym(){return(await X("/api/alphaclaw/update",{method:"POST"})).json()}async function vm(t){let e=await X("/api/sync-cron",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),n=await e.text(),s;try{s=n?JSON.parse(n):{}}catch{throw new Error(n||"Could not parse sync cron response")}if(!e.ok)throw new Error(s.error||n||`HTTP ${e.status}`);return s}async function $m({sortBy:t="nextRunAtMs",sortDir:e="asc"}={}){let n=new URLSearchParams;t&&n.set("sortBy",String(t)),e&&n.set("sortDir",String(e));let s=n.toString()?`?${n.toString()}`:"",o=await X(`/api/cron/jobs${s}`);return me(o,"Could not load cron jobs")}async function wm(){let t=await X("/api/cron/status");return me(t,"Could not load cron status")}async function dd(t,{limit:e=20,offset:n=0,status:s="all",deliveryStatus:o="all",sortDir:r="desc",query:i=""}={}){let a=new URLSearchParams({limit:String(e),offset:String(n),status:String(s||"all"),deliveryStatus:String(o||"all"),sortDir:String(r||"desc")});String(i||"").trim()&&a.set("query",String(i).trim());let l=encodeURIComponent(String(t||"")),c=await X(`/api/cron/jobs/${l}/runs?${a.toString()}`);return me(c,"Could not load cron run history")}async function km(t,{days:e=30}={}){let n=new URLSearchParams({days:String(e)}),s=encodeURIComponent(String(t||"")),o=await X(`/api/cron/jobs/${s}/usage?${n.toString()}`);return me(o,"Could not load cron job usage")}async function Sm(t,{range:e="7d"}={}){let n=new URLSearchParams({range:String(e||"7d")}),s=encodeURIComponent(String(t||"")),o=await X(`/api/cron/jobs/${s}/trends?${n.toString()}`);return me(o,"Could not load cron job trends")}async function Cm({days:t=30}={}){let e=new URLSearchParams({days:String(t)}),n=await X(`/api/cron/usage/bulk?${e.toString()}`);return me(n,"Could not load cron usage overview")}async function _m({sinceMs:t=0,limitPerJob:e=20,status:n="all",deliveryStatus:s="all",sortDir:o="desc"}={}){let r=new URLSearchParams({sinceMs:String(t||0),limitPerJob:String(e||20),status:String(n||"all"),deliveryStatus:String(s||"all"),sortDir:String(o||"desc")}),i=await X(`/api/cron/runs/bulk?${r.toString()}`);return me(i,"Could not load cron run outcomes")}async function Am(t){let e=encodeURIComponent(String(t||"")),n=await X(`/api/cron/jobs/${e}/run`,{method:"POST"});return me(n,"Could not trigger cron job run")}async function Mm(t,e){let n=encodeURIComponent(String(t||"")),o=await X(`/api/cron/jobs/${n}/${e?"enable":"disable"}`,{method:"POST"});return me(o,"Could not update cron job state")}async function Tm(t,e){let n=encodeURIComponent(String(t||"")),s=await X(`/api/cron/jobs/${n}/prompt`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:String(e||"")})});return me(s,"Could not update cron prompt")}async function Pm(t,{sessionTarget:e="",wakeMode:n="",deliveryMode:s="",deliveryChannel:o="",deliveryTo:r=""}={}){let i=encodeURIComponent(String(t||"")),a=await X(`/api/cron/jobs/${i}/routing`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionTarget:String(e||""),wakeMode:String(n||""),deliveryMode:String(s||""),deliveryChannel:String(o||""),deliveryTo:String(r||"")})});return me(a,"Could not update cron routing")}async function va(){return(await X("/api/devices")).json()}async function $a(t){return(await X(`/api/devices/${t}/approve`,{method:"POST"})).json()}async function wa(t){return(await X(`/api/devices/${t}/reject`,{method:"POST"})).json()}var Rm=async()=>{let t=await X("/api/nodes");return me(t,"Could not load nodes")};var Lm=async t=>{let e=encodeURIComponent(String(t||"")),n=await X(`/api/nodes/${e}`,{method:"DELETE"});return me(n,"Could not remove node")},Em=async t=>{let e=encodeURIComponent(String(t||"")),n=new AbortController,s=setTimeout(()=>n.abort(),2e4);try{let o=await X(`/api/nodes/${e}/route`,{method:"POST",signal:n.signal});return me(o,"Could not route execution to node")}catch(o){throw String(o?.name||"")==="AbortError"?new Error("Routing timed out. Gateway may be restarting or unavailable."):o}finally{clearTimeout(s)}},ka=async()=>{let t=await X("/api/nodes/connect-info");return me(t,"Could not load connect info")},Im=async(t,e="user")=>{let n=encodeURIComponent(String(t||"")),s=new URLSearchParams({profile:String(e||"user")}),o=await X(`/api/nodes/${n}/browser-status?${s.toString()}`);return me(o,"Could not load node browser status")};var Dm=async()=>(await X("/api/auth/status")).json(),Nm=async()=>(await X("/api/auth/logout",{method:"POST"})).json();async function Om(){return(await X("/api/onboard/status")).json()}async function Bm(t,e,{importMode:n=!1}={}){return(await X("/api/onboard",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({vars:t,modelKey:e,importMode:n})})).json()}async function Sa(t,e,n="new"){return(await X("/api/onboard/github/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:t,token:e,mode:n})})).json()}async function Fm(t){return(await X("/api/onboard/import/scan",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({tempDir:t})})).json()}async function Wm({tempDir:t,approvedSecrets:e=[],skipSecretExtraction:n=!1,githubRepo:s="",githubToken:o=""}){return(await X("/api/onboard/import/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({tempDir:t,approvedSecrets:e,skipSecretExtraction:n,githubRepo:s,githubToken:o})})).json()}var Hr=async()=>(await X("/api/models")).json();var Hm=async({agentId:t}={})=>{let e=t?`?agentId=${encodeURIComponent(t)}`:"";return(await X(`/api/models/config${e}`)).json()},Vm=async({primary:t,configuredModels:e,profiles:n,authOrder:s,agentId:o}={})=>{let r=o?`?agentId=${encodeURIComponent(o)}`:"";return(await X(`/api/models/config${r}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({primary:t,configuredModels:e,profiles:n,authOrder:s})})).json()};var To=async()=>{let t=await X("/api/agents");return me(t,"Could not load agents")},Po=async()=>{let t=await X("/api/channels/accounts");return me(t,"Could not load channel accounts")},jm=async({provider:t="",accountId:e="default"}={})=>{let n=new URLSearchParams({provider:String(t||""),accountId:String(e||"default")}),s=await X(`/api/channels/accounts/token?${n.toString()}`);return me(s,"Could not load channel token")},zm=async t=>{let e=await X("/api/channels/accounts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return me(e,"Could not create channel account")},Um=async t=>{let e=await X("/api/channels/accounts/jobs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return me(e,"Could not start channel account operation")},Km=({operationId:t="",onMessage:e=()=>{},onError:n=()=>{}})=>Wh({url:`/api/operations/${encodeURIComponent(String(t||""))}/events`,onMessage:e,onError:n}),Vr=async t=>{let e=await X("/api/channels/accounts",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return me(e,"Could not update channel account")},Ca=async t=>{let e=await X("/api/channels/accounts",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return me(e,"Could not delete channel account")},Gm=async t=>{let e=await X("/api/channels/accounts/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return me(e,"Could not run channel login")},qm=async({provider:t="",accountId:e="default"}={})=>{let n=new URLSearchParams({provider:String(t||""),accountId:String(e||"default")}),s=await X(`/api/channels/accounts/login-status?${n.toString()}`);return me(s,"Could not load channel login status")};var Jm=async t=>{let e=await X(`/api/agents/${encodeURIComponent(String(t||""))}/workspace-size`);return me(e,"Could not load workspace size")},Zm=async t=>{let e=await X(`/api/agents/${encodeURIComponent(String(t||""))}/bindings`);return me(e,"Could not load agent bindings")},Ym=async t=>{let e=await X("/api/agents",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})});return me(e,"Could not create agent")},Xm=async(t,e)=>{let n=await X(`/api/agents/${encodeURIComponent(String(t||""))}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e||{})});return me(n,"Could not update agent")};var Qm=async(t,{keepWorkspace:e=!0}={})=>{let n=new URLSearchParams({keepWorkspace:e?"true":"false"}),s=await X(`/api/agents/${encodeURIComponent(String(t||""))}?${n.toString()}`,{method:"DELETE"});return me(s,"Could not delete agent")},eg=async t=>{let e=await X(`/api/agents/${encodeURIComponent(String(t||""))}/default`,{method:"POST"});return me(e,"Could not set default agent")},Ro=async()=>(await X("/api/codex/status")).json(),jr=async()=>(await X("/api/codex/disconnect",{method:"POST"})).json(),zr=async t=>(await X("/api/codex/exchange",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:t})})).json();async function Ur(){return(await X("/api/env")).json()}async function ud(t){let e=await X("/api/env",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({vars:t})}),n=await e.text(),s;try{s=n?JSON.parse(n):{}}catch{throw new Error(n||"Could not parse env save response")}if(!e.ok)throw new Error(s.error||n||`HTTP ${e.status}`);return s}var me=async(t,e)=>{let n=await t.text(),s;try{s=n?JSON.parse(n):{}}catch{throw new Error(n||e)}if(!t.ok||s?.ok===!1)throw new Error(s.error||n||`HTTP ${t.status}`);return s};async function tg(){let t=await X("/api/webhooks");return me(t,"Could not load webhooks")}async function ng(t){let e=await X(`/api/webhooks/${encodeURIComponent(t)}`);return me(e,"Could not load webhook detail")}async function sg(t,{destination:e=null,oauthCallback:n=!1}={}){let s=await X("/api/webhooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,...e?{destination:e}:{},oauthCallback:!!n})});return me(s,"Could not create webhook")}async function og(t,{deleteTransformDir:e=!1}={}){let n=await X(`/api/webhooks/${encodeURIComponent(t)}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({deleteTransformDir:!!e})});return me(n,"Could not delete webhook")}async function rg(t,{destination:e=null}={}){let n=await X(`/api/webhooks/${encodeURIComponent(t)}/destination`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({destination:e})});return me(n,"Could not update webhook destination")}async function ig(t){let e=await X(`/api/webhooks/${encodeURIComponent(t)}/oauth-callback/rotate`,{method:"POST"});return me(e,"Could not rotate OAuth callback")}async function ag(t,{limit:e=50,offset:n=0,status:s="all"}={}){let o=new URLSearchParams({limit:String(e),offset:String(n),status:String(s||"all")}),r=await X(`/api/webhooks/${encodeURIComponent(t)}/requests?${o.toString()}`);return me(r,"Could not load webhook requests")}async function lg(t,e){let n=await X(`/api/webhooks/${encodeURIComponent(t)}/requests/${encodeURIComponent(String(e))}`);return me(n,"Could not load webhook request")}var cg=async(t=10)=>{let e=new URLSearchParams({depth:String(t)}),n=await X(`/api/browse/tree?${e.toString()}`);return me(n,"Could not load file tree")},pd=async t=>{let e=new URLSearchParams({path:String(t||"")}),n=await X(`/api/browse/read?${e.toString()}`);return me(n,"Could not load file content")},dg=async(t,e)=>{let n=String(t||""),s=typeof e=="string"?e:String(e??""),o=await X("/api/browse/write",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n,content:s})});return me(o,"Could not save file")},ug=async t=>{let e=await X("/api/browse/create-file",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return me(e,"Could not create file")},pg=async t=>{let e=await X("/api/browse/create-folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return me(e,"Could not create folder")},fg=async(t,e)=>{let n=await X("/api/browse/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({from:String(t||""),to:String(e||"")})});return me(n,"Could not move path")},_a=async t=>{let e=await X("/api/browse/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return me(e,"Could not delete file")},hg=async t=>{let e=new URLSearchParams({path:String(t||"")}),n=await X(`/api/browse/download?${e.toString()}`);if(!n.ok){let a=await n.text();throw new Error(a||"Could not download file")}let s=await n.blob(),o=window?.URL||URL;if(!o?.createObjectURL||!o?.revokeObjectURL)throw new Error("Download is not supported in this browser");let r=o.createObjectURL(s),i=String(t||"").split("/").filter(Boolean).pop()||"download";try{let a=document.createElement("a");a.href=r,a.download=i,document.body?.appendChild(a),a.click(),a.remove()}finally{o.revokeObjectURL(r)}return{ok:!0}},mg=async t=>{let e=await X("/api/browse/restore",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:String(t||"")})});return me(e,"Could not restore file")},fd=async()=>{let t=await X("/api/browse/git-summary");return me(t,"Could not load git summary")},gg=async t=>{let e=new URLSearchParams({path:String(t||"")}),n=await X(`/api/browse/git-diff?${e.toString()}`);return me(n,"Could not load file diff")},bg=async({filePath:t,table:e,limit:n=50,offset:s=0})=>{let o=new URLSearchParams({path:String(t||""),table:String(e||""),limit:String(n),offset:String(s)}),r=await X(`/api/browse/sqlite-table?${o.toString()}`);return me(r,"Could not load sqlite table data")},xg=async(t="")=>{let e=await X("/api/browse/git-sync",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:String(t||"")})});return me(e,"Could not sync changes")};var Gs=t=>String(t||"").split("/")[0]||"",Lo=t=>{let e=String(t||"").trim();return e==="openai-codex"?"openai":e==="volcengine-plan"?"volcengine":e==="byteplus-plan"?"byteplus":e},Xk=[{label:"Opus 4.6",preferredKeys:["anthropic/claude-opus-4-6"]},{label:"Sonnet 4.6",preferredKeys:["anthropic/claude-sonnet-4-6"]},{label:"Codex 5.3",preferredKeys:["openai-codex/gpt-5.3-codex"]},{label:"GPT-5.4",preferredKeys:["openai-codex/gpt-5.4"]},{label:"Gemini 3.1 Pro",preferredKeys:["google/gemini-3.1-pro-preview"]}],Eo=t=>{let e=[],n=new Set;return Xk.forEach(s=>{let o=s.preferredKeys.map(r=>t.find(i=>i.key===r)).find(Boolean);!o||n.has(o.key)||(e.push({...o,featuredLabel:s.label}),n.add(o.key))}),e},An={anthropic:[{key:"ANTHROPIC_API_KEY",label:"Anthropic API Key",url:"https://console.anthropic.com",linkText:"Get key",placeholder:"sk-ant-..."},{key:"ANTHROPIC_TOKEN",label:"Anthropic Setup Token",hint:"From claude setup-token (uses your Claude subscription)",linkText:"Get token",placeholder:"Token..."}],openai:[{key:"OPENAI_API_KEY",label:"OpenAI API Key",url:"https://platform.openai.com",linkText:"Get key",placeholder:"sk-..."}],google:[{key:"GEMINI_API_KEY",label:"Gemini API Key",url:"https://aistudio.google.com",linkText:"Get key",placeholder:"AI..."}],opencode:[{key:"OPENCODE_API_KEY",label:"OpenCode API Key",placeholder:"oc-..."}],openrouter:[{key:"OPENROUTER_API_KEY",label:"OpenRouter API Key",url:"https://openrouter.ai",linkText:"Get key",placeholder:"sk-or-..."}],zai:[{key:"ZAI_API_KEY",label:"Z.AI API Key",placeholder:"zai-..."}],"vercel-ai-gateway":[{key:"AI_GATEWAY_API_KEY",label:"AI Gateway API Key",placeholder:"aigw_..."}],kilocode:[{key:"KILOCODE_API_KEY",label:"KiloCode API Key",placeholder:"kilo_..."}],xai:[{key:"XAI_API_KEY",label:"xAI API Key",placeholder:"xai-..."}],mistral:[{key:"MISTRAL_API_KEY",label:"Mistral API Key",url:"https://console.mistral.ai",linkText:"Get key",placeholder:"sk-..."}],voyage:[{key:"VOYAGE_API_KEY",label:"Voyage API Key",url:"https://dash.voyageai.com",linkText:"Get key",placeholder:"pa-..."}],groq:[{key:"GROQ_API_KEY",label:"Groq API Key",url:"https://console.groq.com",linkText:"Get key",placeholder:"gsk_..."}],cerebras:[{key:"CEREBRAS_API_KEY",label:"Cerebras API Key",placeholder:"csk-..."}],moonshot:[{key:"MOONSHOT_API_KEY",label:"Moonshot API Key",placeholder:"sk-..."}],"kimi-coding":[{key:"KIMI_API_KEY",label:"Kimi API Key",placeholder:"sk-..."}],volcengine:[{key:"VOLCANO_ENGINE_API_KEY",label:"Volcano Engine API Key",placeholder:"ve-..."}],byteplus:[{key:"BYTEPLUS_API_KEY",label:"BytePlus API Key",placeholder:"bp-..."}],synthetic:[{key:"SYNTHETIC_API_KEY",label:"Synthetic API Key",placeholder:"syn-..."}],minimax:[{key:"MINIMAX_API_KEY",label:"MiniMax API Key",placeholder:"minimax-..."}],deepgram:[{key:"DEEPGRAM_API_KEY",label:"Deepgram API Key",url:"https://console.deepgram.com",linkText:"Get key",placeholder:"dg-..."}],vllm:[{key:"VLLM_API_KEY",label:"vLLM API Key",placeholder:"vllm-local"}]},qs={anthropic:"Anthropic",openai:"OpenAI",google:"Gemini",opencode:"OpenCode Zen",openrouter:"OpenRouter",zai:"Z.AI","vercel-ai-gateway":"Vercel AI Gateway",kilocode:"Kilo Gateway",xai:"xAI",mistral:"Mistral",cerebras:"Cerebras",moonshot:"Moonshot","kimi-coding":"Kimi Coding",volcengine:"Volcano Engine",byteplus:"BytePlus",synthetic:"Synthetic",minimax:"MiniMax",voyage:"Voyage",groq:"Groq",deepgram:"Deepgram",vllm:"vLLM"},Kr=["anthropic","openai","google","zai","xai","openrouter","opencode","kilocode","vercel-ai-gateway","minimax","moonshot","kimi-coding","volcengine","byteplus","synthetic","mistral","cerebras","voyage","groq","deepgram","vllm"];var yg=[{id:"embeddings",label:"Memory Embeddings",tag:"Embeddings",providers:["openai","google","voyage","mistral"]},{id:"audio",label:"Audio Transcription",tag:"Audio",hasDefault:!0,providers:["openai","groq","deepgram","google","mistral"]}],vg=t=>{if(t==="openai-codex")return new Set;let e=Lo(t),n=An[e]||[];return new Set(n.map(s=>s.key))},$g=Object.values(An).flat().filter((t,e,n)=>n.findIndex(s=>s.key===t.key)===e);var Io=P.bind(T),hd="new",md="existing",Mn="fresh",Bt="import",Tn="create",Jn="existing-empty",Qk=t=>String(t||"").trim().replace(/^git@github\.com:/,"").replace(/^https:\/\/github\.com\//,"").replace(/\.git$/,""),Gr=t=>{let e=Qk(t);if(!e)return!1;let n=e.split("/").filter(Boolean);return n.length===2&&!n.some(s=>/\s/.test(s))},Wt=[{id:"github",title:"GitHub",description:"Auto-backup your config and workspace",fields:[{key:"_GITHUB_SOURCE_REPO",label:"Source Repo",placeholder:"username/existing-openclaw",isText:!0},{key:"GITHUB_WORKSPACE_REPO",label:"New Workspace Repo",placeholder:"username/my-agent",isText:!0},{key:"GITHUB_TOKEN",label:"Personal Access Token",hint:Io`Create a${" "}fine-grained token${" "}with Contents + Metadata access`,placeholder:"ghp_... or github_pat_..."}],validate:t=>{let e=t._GITHUB_FLOW||An,n=zr(t.GITHUB_WORKSPACE_REPO),s=e!==Bt||zr(t._GITHUB_SOURCE_REPO);return!!(t.GITHUB_TOKEN&&n&&s)}},{id:"ai",title:"Primary Agent Model",description:"Choose your main model and authenticate its provider",fields:xg,validate:(t,e={})=>!!(t.MODEL_KEY&&e.hasAi)},{id:"channels",title:"Channels",description:"At least one is required to talk to your agent",fields:[{key:"TELEGRAM_BOT_TOKEN",label:"Telegram Bot Token",hint:Eo`From${" "}${" "}with Contents + Metadata access`,placeholder:"ghp_... or github_pat_..."}],validate:t=>{let e=t._GITHUB_FLOW||Mn,n=Gr(t.GITHUB_WORKSPACE_REPO),s=e!==Bt||Gr(t._GITHUB_SOURCE_REPO);return!!(t.GITHUB_TOKEN&&n&&s)}},{id:"ai",title:"Primary Agent Model",description:"Choose your main model and authenticate its provider",fields:$g,validate:(t,e={})=>!!(t.MODEL_KEY&&e.hasAi)},{id:"channels",title:"Channels",description:"At least one is required to talk to your agent",fields:[{key:"TELEGRAM_BOT_TOKEN",label:"Telegram Bot Token",hint:Io`From${" "}full guide`,placeholder:"123456789:AAH..."},{key:"DISCORD_BOT_TOKEN",label:"Discord Bot Token",hint:Eo`From${" "}`,placeholder:"123456789:AAH..."},{key:"DISCORD_BOT_TOKEN",label:"Discord Bot Token",hint:Io`From${" "}full guide`,placeholder:"MTQ3..."},{key:"SLACK_BOT_TOKEN",label:"Slack Bot Token",hint:Eo`From your Slack app's${" "}`,placeholder:"MTQ3..."},{key:"SLACK_BOT_TOKEN",label:"Slack Bot Token",hint:Io`From your Slack app's${" "}full guide`,placeholder:"xoxb-..."},{key:"SLACK_APP_TOKEN",label:"Slack App Token (Socket Mode)",hint:Eo`From${" "}`,placeholder:"xoxb-..."},{key:"SLACK_APP_TOKEN",label:"Slack App Token (Socket Mode)",hint:Io`From${" "}Basic Information${" "}→ App-Level Tokens (needs${" "}connections:write${" "}scope)`,placeholder:"xapp-..."}],validate:t=>!!(t.TELEGRAM_BOT_TOKEN||t.DISCORD_BOT_TOKEN||t.SLACK_BOT_TOKEN&&t.SLACK_APP_TOKEN)},{id:"tools",title:"Tools (optional)",description:"Enable extra capabilities for your agent",fields:[{key:"BRAVE_API_KEY",label:"Brave Search API Key",hint:Eo`From${" "}${" "}→ App-Level Tokens (needs${" "}connections:write${" "}scope)`,placeholder:"xapp-..."}],validate:t=>!!(t.TELEGRAM_BOT_TOKEN||t.DISCORD_BOT_TOKEN||t.SLACK_BOT_TOKEN&&t.SLACK_APP_TOKEN)},{id:"tools",title:"Tools (optional)",description:"Enable extra capabilities for your agent",fields:[{key:"BRAVE_API_KEY",label:"Brave Search API Key",hint:Io`From${" "}brave.com/search/api${" "}-${" "}free tier available`,placeholder:"BSA..."}],validate:()=>!0}];var Uk=P.bind(T),yg=({onSelectFlow:t})=>Uk` + >${" "}-${" "}free tier available`,placeholder:"BSA..."}],validate:()=>!0}];var eS=P.bind(T),wg=({onSelectFlow:t})=>eS`
- `;var Kk=P.bind(T),Ce=({className:t="h-4 w-4",ariaHidden:e=!0,style:n=""})=>Kk` + `;var tS=P.bind(T),Ae=({className:t="h-4 w-4",ariaHidden:e=!0,style:n=""})=>tS` -`;var Io=P.bind(T),vg={primary:"ac-btn-cyan",secondary:"ac-btn-secondary",success:"ac-btn-green",danger:"ac-btn-danger",ghost:"ac-btn-ghost"},Gk=(t,e)=>t==="subtle"||t==="neutral"?e?"border border-border text-fg-muted hover:text-body hover:border-fg-muted":"border border-border text-fg-muted":t==="warning"?e?"border border-yellow-500/35 text-status-warning-muted bg-yellow-500/10 hover:border-yellow-400/60 hover:text-status-warning hover:bg-yellow-500/15":"border border-yellow-500/35 text-status-warning-muted bg-yellow-500/10":vg[t]||vg.primary,$g={sm:"h-7 text-xs leading-none px-2.5 py-1 rounded-lg",md:"h-9 text-sm font-medium leading-none px-4 rounded-xl",lg:"h-10 text-sm font-medium leading-none px-5 rounded-lg"},wg={sm:"h-7 w-7 p-0 rounded-lg",md:"h-9 w-9 p-0 rounded-xl",lg:"h-10 w-10 p-0 rounded-lg"},Z=({onClick:t,type:e="button",disabled:n=!1,loading:s=!1,tone:o="primary",size:r="sm",idleLabel:i="Action",loadingLabel:a="Working...",loadingMode:l="replace",className:c="",idleIcon:d=null,idleIconClassName:u="h-3 w-3",iconOnly:p=!1,title:f="",ariaLabel:g=""})=>{let m=n||s,b=Gk(o,!m),x=p?wg[r]||wg.sm:$g[r]||$g.sm,v=s?`cursor-not-allowed ${o==="warning"?"opacity-90 animate-pulse shadow-[0_0_0_1px_rgba(234,179,8,0.22),0_0_18px_rgba(234,179,8,0.12)]":"opacity-80"}`:"",w=r==="md"||r==="lg"?"h-4 w-4":"h-3 w-3",$=l==="inline",S=d,C=p&&S?Io`<${S} className=${u} />`:S?Io` +`;var Do=P.bind(T),kg={primary:"ac-btn-cyan",secondary:"ac-btn-secondary",success:"ac-btn-green",danger:"ac-btn-danger",ghost:"ac-btn-ghost"},nS=(t,e)=>t==="subtle"||t==="neutral"?e?"border border-border text-fg-muted hover:text-body hover:border-fg-muted":"border border-border text-fg-muted":t==="warning"?e?"border border-yellow-500/35 text-status-warning-muted bg-yellow-500/10 hover:border-yellow-400/60 hover:text-status-warning hover:bg-yellow-500/15":"border border-yellow-500/35 text-status-warning-muted bg-yellow-500/10":kg[t]||kg.primary,Sg={sm:"h-7 text-xs leading-none px-2.5 py-1 rounded-lg",md:"h-9 text-sm font-medium leading-none px-4 rounded-xl",lg:"h-10 text-sm font-medium leading-none px-5 rounded-lg"},Cg={sm:"h-7 w-7 p-0 rounded-lg",md:"h-9 w-9 p-0 rounded-xl",lg:"h-10 w-10 p-0 rounded-lg"},Z=({onClick:t,type:e="button",disabled:n=!1,loading:s=!1,tone:o="primary",size:r="sm",idleLabel:i="Action",loadingLabel:a="Working...",loadingMode:l="replace",className:c="",idleIcon:d=null,idleIconClassName:u="h-3 w-3",iconOnly:p=!1,title:f="",ariaLabel:g=""})=>{let m=n||s,x=nS(o,!m),b=p?Cg[r]||Cg.sm:Sg[r]||Sg.sm,v=s?`cursor-not-allowed ${o==="warning"?"opacity-90 animate-pulse shadow-[0_0_0_1px_rgba(234,179,8,0.22),0_0_18px_rgba(234,179,8,0.12)]":"opacity-80"}`:"",$=r==="md"||r==="lg"?"h-4 w-4":"h-3 w-3",w=l==="inline",S=d,C=p&&S?Do`<${S} className=${u} />`:S?Do` <${S} className=${u} /> ${i} - `:i,_=s&&!$?a:C;return Io` + `:i,_=s&&!w?a:C;return Do` - `};var ka=(t=[])=>(Array.isArray(t)?t:[]).filter(e=>e?.confidence==="high").map(e=>({...e,suggestedEnvVar:e?.suggestedEnvVar||""})),kg=(t=[])=>(Array.isArray(t)?t:[]).reduce((e,n)=>{let s=String(n?.suggestedEnvVar||"").trim(),o=String(n?.value||"");return!s||!o||(e[s]=o),e},{});var qt=P.bind(T),qk=[{key:"gatewayConfig",label:"Gateway Config",icon:"\u2699\uFE0F",description:"openclaw.json configuration",showFiles:!0},{key:"envFiles",label:"Environment Files",icon:"\u{1F510}",description:".env files with variables",showFiles:!0},{key:"workspaceFiles",label:"Workspace Files",icon:"\u{1F4C4}",description:"Prompt files (AGENTS.md, SOUL.md, etc.)",showFiles:!0},{key:"skills",label:"Skills",icon:"\u{1F6E0}",description:"Custom skill definitions",showFiles:!0},{key:"cronJobs",label:"Cron Jobs",icon:"\u23F0",description:"Scheduled tasks",showFiles:!0},{key:"webhooks",label:"Hooks",icon:"\u{1F517}",description:"Webhook mappings and internal hooks",showDirs:!0},{key:"memory",label:"Memory",icon:"\u{1F9E0}",description:"Agent memory and embeddings",showDirs:!0}],Jk=({category:t,data:e})=>{let[n,s]=y(!1);if(!e?.found)return null;let o=t.key==="webhooks",r=Array.isArray(e.transformWarnings)?e.transformWarnings:[],i=new Set(r.map(d=>String(d.actualPath||"").trim()).filter(Boolean).map(d=>d.split("/").slice(0,-2).join("/"))),a=[...e.jobNames||[],...e.hookNames||[],...e.files||[],...(e.dirs||[]).filter(d=>!i.has(d)),...e.extraMarkdown||[]],l=typeof e.jobCount=="number"&&e.jobCount>0?e.jobCount:typeof e.hookCount=="number"&&e.hookCount>0?e.hookCount:a.length,c=typeof e.warningCount=="number"?e.warningCount:r.length;return qt` + `};var Aa=(t=[])=>(Array.isArray(t)?t:[]).filter(e=>e?.confidence==="high").map(e=>({...e,suggestedEnvVar:e?.suggestedEnvVar||""})),_g=(t=[])=>(Array.isArray(t)?t:[]).reduce((e,n)=>{let s=String(n?.suggestedEnvVar||"").trim(),o=String(n?.value||"");return!s||!o||(e[s]=o),e},{});var qt=P.bind(T),sS=[{key:"gatewayConfig",label:"Gateway Config",icon:"\u2699\uFE0F",description:"openclaw.json configuration",showFiles:!0},{key:"envFiles",label:"Environment Files",icon:"\u{1F510}",description:".env files with variables",showFiles:!0},{key:"workspaceFiles",label:"Workspace Files",icon:"\u{1F4C4}",description:"Prompt files (AGENTS.md, SOUL.md, etc.)",showFiles:!0},{key:"skills",label:"Skills",icon:"\u{1F6E0}",description:"Custom skill definitions",showFiles:!0},{key:"cronJobs",label:"Cron Jobs",icon:"\u23F0",description:"Scheduled tasks",showFiles:!0},{key:"webhooks",label:"Hooks",icon:"\u{1F517}",description:"Webhook mappings and internal hooks",showDirs:!0},{key:"memory",label:"Memory",icon:"\u{1F9E0}",description:"Agent memory and embeddings",showDirs:!0}],oS=({category:t,data:e})=>{let[n,s]=y(!1);if(!e?.found)return null;let o=t.key==="webhooks",r=Array.isArray(e.transformWarnings)?e.transformWarnings:[],i=new Set(r.map(d=>String(d.actualPath||"").trim()).filter(Boolean).map(d=>d.split("/").slice(0,-2).join("/"))),a=[...e.jobNames||[],...e.hookNames||[],...e.files||[],...(e.dirs||[]).filter(d=>!i.has(d)),...e.extraMarkdown||[]],l=typeof e.jobCount=="number"&&e.jobCount>0?e.jobCount:typeof e.hookCount=="number"&&e.hookCount>0?e.hookCount:a.length,c=typeof e.warningCount=="number"?e.warningCount:r.length;return qt`
- `},Sg=({scanResult:t,scanning:e,error:n,onApprove:s,onShowSecretReview:o,onBack:r})=>{if(e)return qt` + `},Ag=({scanResult:t,scanning:e,error:n,onApprove:s,onShowSecretReview:o,onBack:r})=>{if(e)return qt`
- <${Ce} /> + <${Ae} />

Scanning repository...

`;if(n)return qt` @@ -270,8 +270,8 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa
- ${qk.map(l=>qt` - <${Jk} + ${sS.map(l=>qt` + <${oS} key=${l.key} category=${l} data=${t[l.key]} @@ -351,7 +351,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa className="w-full" /> <${Z} - onClick=${()=>s(ka(t.secrets))} + onClick=${()=>s(Aa(t.secrets))} loading=${e} tone="primary" size="md" @@ -361,7 +361,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa />
- `};var md=P.bind(T),Rt=({value:t="",onInput:e,onBlur:n,placeholder:s="",inputClass:o="",disabled:r=!1,loading:i=!1,isSecret:a=!0})=>{let[l,c]=y(!1),d=a,u=r||i;return md` + `};var gd=P.bind(T),Et=({value:t="",onInput:e,onBlur:n,placeholder:s="",inputClass:o="",disabled:r=!1,loading:i=!1,isSecret:a=!0})=>{let[l,c]=y(!1),d=a,u=r||i;return gd`
- ${i?md`<${Ce} className="h-3 w-3 text-fg-muted shrink-0" />`:null} - ${d?md``:null}
- `};var gd=P.bind(T),Zk=t=>{let e=String(t||"").trim();return!!e&&e!=="placeholder"},Yk=({item:t,value:e,onInput:n})=>gd` + `};var bd=P.bind(T),rS=t=>{let e=String(t||"").trim();return!!e&&e!=="placeholder"},iS=({item:t,value:e,onInput:n})=>bd`
@@ -395,22 +395,22 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa
- <${Rt} + <${Et} value=${e} onInput=${s=>n(s.target.value)} placeholder="Enter value" inputClass="w-full bg-field border border-border rounded-lg px-3 py-2 text-xs text-body outline-none focus:border-fg-muted font-mono" /> - `,Cg=({placeholderReview:t,vals:e,setValue:n,onContinue:s})=>{let o=Array.isArray(t?.vars)?t.vars:[],i=F(()=>o.filter(a=>!Zk(e[a.key])).map(a=>a.key),[o,e]).length;return o.length===0?null:gd` + `,Mg=({placeholderReview:t,vals:e,setValue:n,onContinue:s})=>{let o=Array.isArray(t?.vars)?t.vars:[],i=F(()=>o.filter(a=>!rS(e[a.key])).map(a=>a.key),[o,e]).length;return o.length===0?null:bd`

Add Missing Env Vars

- ${o.map(a=>gd` - <${Yk} + ${o.map(a=>bd` + <${iS} key=${a.key} item=${a} value=${String(e[a.key]||"")==="placeholder"?"":e[a.key]||""} @@ -435,7 +435,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa />
- `};var Pn=P.bind(T),Xk=({secret:t,selected:e,onToggle:n,envVarName:s,onEnvVarChange:o})=>Pn` + `};var Pn=P.bind(T),aS=({secret:t,selected:e,onToggle:n,envVarName:s,onEnvVarChange:o})=>Pn`
@@ -485,9 +485,9 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa
`} - `,_g=({secrets:t=[],onApprove:e,onBack:n,loading:s,error:o})=>{let[r,i]=y(()=>{let u={};for(let p of t)u[p.configPath]={selected:p.confidence==="high",envVarName:p.suggestedEnvVar||""};return u}),a=q(u=>{i(p=>({...p,[u]:{...p[u],selected:!p[u]?.selected}}))},[]),l=q((u,p)=>{i(f=>({...f,[u]:{...f[u],envVarName:p}}))},[]),c=Object.values(r).filter(u=>u.selected).length,d=()=>{let u=ka(t.map(p=>({...p,confidence:r[p.configPath]?.selected?"high":"medium",suggestedEnvVar:r[p.configPath]?.envVarName||p.suggestedEnvVar})));e(u)};return s?Pn` + `,Tg=({secrets:t=[],onApprove:e,onBack:n,loading:s,error:o})=>{let[r,i]=y(()=>{let u={};for(let p of t)u[p.configPath]={selected:p.confidence==="high",envVarName:p.suggestedEnvVar||""};return u}),a=G(u=>{i(p=>({...p,[u]:{...p[u],selected:!p[u]?.selected}}))},[]),l=G((u,p)=>{i(f=>({...f,[u]:{...f[u],envVarName:p}}))},[]),c=Object.values(r).filter(u=>u.selected).length,d=()=>{let u=Aa(t.map(p=>({...p,confidence:r[p.configPath]?.selected?"high":"medium",suggestedEnvVar:r[p.configPath]?.envVarName||p.suggestedEnvVar})));e(u)};return s?Pn`
- <${Ce} /> + <${Ae} />

Applying import...

`:Pn` @@ -510,7 +510,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa
${t.map(u=>Pn` - <${Xk} + <${aS} key=${u.configPath} secret=${u} selected=${r[u.configPath]?.selected||!1} @@ -538,7 +538,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa />
- `};var Mg=P.bind(T),Ag=({groups:t,step:e,isPreStep:n,isSetupStep:s,isPairingStep:o,stepNumber:r,activeStepLabel:i})=>{let a=[...t,{id:"setup",title:"Initializing"},{id:"pairing",title:"Pairing"}];return Mg` + `};var Pg=P.bind(T),Rg=({groups:t,step:e,isPreStep:n,isSetupStep:s,isPairingStep:o,stepNumber:r,activeStepLabel:i})=>{let a=[...t,{id:"setup",title:"Initializing"},{id:"pairing",title:"Pairing"}];return Pg`
- ${a.map((l,c)=>{let d=c===e,u=c{let d=c===e,u=c
`})}
- `};var Tg=P.bind(T),Pg=[{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be careful what you give access to. Read access is always safer than write access."},{label:"\u{1F9E0} Best practice",text:"Trust but verify. Your agent may not always know what it's doing, so check the results."},{label:"\u{1F4A1} Idea",text:"Ask your agent to create a morning briefing for you."},{label:"\u{1F9E0} Best practice",text:"Ask your agent to review its own code and make sure it's doing what you want it to do."},{label:"\u{1F4A1} Idea",text:"Tell your agent to review the latest news and provide a summary."},{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be incredibly careful installing skills from the internet - they may contain malicious code."}],Rg=({error:t,loading:e,onRetry:n,onBack:s})=>{let[o,r]=y(0);if(L(()=>{if(t||!e)return;let a=setInterval(()=>{r(l=>(l+1)%Pg.length)},5200);return()=>clearInterval(a)},[t,e]),t)return Tg` + `};var Lg=P.bind(T),Eg=[{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be careful what you give access to. Read access is always safer than write access."},{label:"\u{1F9E0} Best practice",text:"Trust but verify. Your agent may not always know what it's doing, so check the results."},{label:"\u{1F4A1} Idea",text:"Ask your agent to create a morning briefing for you."},{label:"\u{1F9E0} Best practice",text:"Ask your agent to review its own code and make sure it's doing what you want it to do."},{label:"\u{1F4A1} Idea",text:"Tell your agent to review the latest news and provide a summary."},{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be incredibly careful installing skills from the internet - they may contain malicious code."}],Ig=({error:t,loading:e,onRetry:n,onBack:s})=>{let[o,r]=y(0);if(L(()=>{if(t||!e)return;let a=setInterval(()=>{r(l=>(l+1)%Eg.length)},5200);return()=>clearInterval(a)},[t,e]),t)return Lg`

Setup failed

Fix the values and try again.

@@ -596,12 +596,12 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa ${e?"Retrying...":"Retry"}
- `;let i=Pg[o];return Tg` + `;let i=Eg[o];return Lg`
- <${Ce} className="h-8 w-8 text-white" /> + <${Ae} className="h-8 w-8 text-white" />

Initializing OpenClaw...

@@ -614,11 +614,11 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa ${i.text}
- `};var Qk=P.bind(T),Lg={success:"bg-green-500/10 text-status-success-muted",warning:"bg-yellow-500/10 text-status-warning-muted",danger:"bg-red-500/10 text-status-error-muted",neutral:"bg-gray-500/10 text-fg-muted",info:"bg-blue-500/10 text-blue-400",accent:"bg-purple-500/10 text-purple-400",cyan:"bg-cyan-500/10 text-cyan-400",secondary:"bg-indigo-500/10 text-indigo-300"},ae=({tone:t="neutral",children:e})=>Qk` - + `};var lS=P.bind(T),Dg={success:"bg-green-500/10 text-status-success-muted",warning:"bg-yellow-500/10 text-status-warning-muted",danger:"bg-red-500/10 text-status-error-muted",neutral:"bg-gray-500/10 text-fg-muted",info:"bg-blue-500/10 text-blue-400",accent:"bg-purple-500/10 text-purple-400",cyan:"bg-cyan-500/10 text-cyan-400",secondary:"bg-indigo-500/10 text-indigo-300"},de=({tone:t="neutral",children:e})=>lS` + ${e} -`;function tS(t,e){for(var n in e)t[n]=e[n];return t}function Eg(t,e){for(var n in t)if(n!=="__source"&&!(n in e))return!0;for(var s in e)if(s!=="__source"&&t[s]!==e[s])return!0;return!1}function Ig(t,e){this.props=t,this.context=e}(Ig.prototype=new hn).isPureReactComponent=!0,Ig.prototype.shouldComponentUpdate=function(t,e){return Eg(this.props,t)||Eg(this.state,e)};var Dg=Se.__b;Se.__b=function(t){t.type&&t.type.__f&&t.ref&&(t.props.ref=t.ref,t.ref=null),Dg&&Dg(t)};var xL=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;var nS=Se.__e;Se.__e=function(t,e,n,s){if(t.then){for(var o,r=e;r=r.__;)if((o=r.__c)&&o.__c)return e.__e==null&&(e.__e=n.__e,e.__k=n.__k),o.__c(t,e)}nS(t,e,n,s)};var Ng=Se.unmount;function Vg(t,e,n){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach(function(s){typeof s.__c=="function"&&s.__c()}),t.__c.__H=null),(t=tS({},t)).__c!=null&&(t.__c.__P===n&&(t.__c.__P=e),t.__c.__e=!0,t.__c=null),t.__k=t.__k&&t.__k.map(function(s){return Vg(s,e,n)})),t}function jg(t,e,n){return t&&n&&(t.__v=null,t.__k=t.__k&&t.__k.map(function(s){return jg(s,e,n)}),t.__c&&t.__c.__P===e&&(t.__e&&n.appendChild(t.__e),t.__c.__e=!0,t.__c.__P=n)),t}function bd(){this.__u=0,this.o=null,this.__b=null}function zg(t){var e=t.__&&t.__.__c;return e&&e.__a&&e.__a(t)}function Sa(){this.i=null,this.l=null}Se.unmount=function(t){var e=t.__c;e&&(e.__z=!0),e&&e.__R&&e.__R(),e&&32&t.__u&&(t.type=null),Ng&&Ng(t)},(bd.prototype=new hn).__c=function(t,e){var n=e.__c,s=this;s.o==null&&(s.o=[]),s.o.push(n);var o=zg(s.__v),r=!1,i=function(){r||s.__z||(r=!0,n.__R=null,o?o(l):l())};n.__R=i;var a=n.__P;n.__P=null;var l=function(){if(!--s.__u){if(s.state.__a){var c=s.state.__a;s.__v.__k[0]=jg(c,c.__c.__P,c.__c.__O)}var d;for(s.setState({__a:s.__b=null});d=s.o.pop();)d.__P=a,d.forceUpdate()}};s.__u++||32&e.__u||s.setState({__a:s.__b=s.__v.__k[0]}),t.then(i,i)},bd.prototype.componentWillUnmount=function(){this.o=[]},bd.prototype.render=function(t,e){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),s=this.__v.__k[0].__c;this.__v.__k[0]=Vg(this.__b,n,s.__O=s.__P)}this.__b=null}var o=e.__a&&T(ln,null,t.fallback);return o&&(o.__u&=-33),[T(ln,null,e.__a?null:t.children),o]};var Og=function(t,e,n){if(++n[1]===n[0]&&t.l.delete(e),t.props.revealOrder&&(t.props.revealOrder[0]!=="t"||!t.l.size))for(n=t.i;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),e.h.removeChild(o)}}}wo(T(sS,{context:e.context},t.__v),e.v)}function Do(t,e){var n=T(oS,{__v:t,h:e});return n.containerInfo=e,n}(Sa.prototype=new hn).__a=function(t){var e=this,n=zg(e.__v),s=e.l.get(t);return s[0]++,function(o){var r=function(){e.props.revealOrder?(s.push(o),Og(e,t,s)):o()};n?n(r):r()}},Sa.prototype.render=function(t){this.i=null,this.l=new Map;var e=Lr(t.children);t.revealOrder&&t.revealOrder[0]==="b"&&e.reverse();for(var n=e.length;n--;)this.l.set(e[n],this.i=[1,0,this.i]);return t.children},Sa.prototype.componentDidUpdate=Sa.prototype.componentDidMount=function(){var t=this;this.l.forEach(function(e,n){Og(t,n,e)})};var rS=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,iS=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,aS=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,lS=/[A-Z0-9]/g,cS=typeof document<"u",dS=function(t){return(typeof Symbol<"u"&&typeof Symbol()=="symbol"?/fil|che|rad/:/fil|che|ra/).test(t)};hn.prototype.isReactComponent=!0,["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(hn.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:e})}})});var Bg=Se.event;Se.event=function(t){return Bg&&(t=Bg(t)),t.persist=function(){},t.isPropagationStopped=function(){return this.cancelBubble},t.isDefaultPrevented=function(){return this.defaultPrevented},t.nativeEvent=t};var Ug,uS={configurable:!0,get:function(){return this.class}},Fg=Se.vnode;Se.vnode=function(t){typeof t.type=="string"&&(function(e){var n=e.props,s=e.type,o={},r=s.indexOf("-")==-1;for(var i in n){var a=n[i];if(!(i==="value"&&"defaultValue"in n&&a==null||cS&&i==="children"&&s==="noscript"||i==="class"||i==="className")){var l=i.toLowerCase();i==="defaultValue"&&"value"in n&&n.value==null?i="value":i==="download"&&a===!0?a="":l==="translate"&&a==="no"?a=!1:l[0]==="o"&&l[1]==="n"?l==="ondoubleclick"?i="ondblclick":l!=="onchange"||s!=="input"&&s!=="textarea"||dS(n.type)?l==="onfocus"?i="onfocusin":l==="onblur"?i="onfocusout":aS.test(i)&&(i=l):l=i="oninput":r&&iS.test(i)?i=i.replace(lS,"-$&").toLowerCase():a===null&&(a=void 0),l==="oninput"&&o[i=l]&&(i="oninputCapture"),o[i]=a}}s=="select"&&(o.multiple&&Array.isArray(o.value)&&(o.value=Lr(n.children).forEach(function(c){c.props.selected=o.value.indexOf(c.props.value)!=-1})),o.defaultValue!=null&&(o.value=Lr(n.children).forEach(function(c){c.props.selected=o.multiple?o.defaultValue.indexOf(c.props.value)!=-1:o.defaultValue==c.props.value}))),n.class&&!n.className?(o.class=n.class,Object.defineProperty(o,"className",uS)):n.className&&(o.class=o.className=n.className),e.props=o})(t),t.$$typeof=rS,Fg&&Fg(t)};var Hg=Se.__r;Se.__r=function(t){Hg&&Hg(t),Ug=t.__c};var Wg=Se.diffed;Se.diffed=function(t){Wg&&Wg(t);var e=t.props,n=t.__e;n!=null&&t.type==="textarea"&&"value"in e&&e.value!==n.value&&(n.value=e.value==null?"":e.value),Ug=null};var Kg=P.bind(T),Ur=8,xd=8,pS=400,Gg=0,qg=t=>{if(!t||typeof document>"u")return!1;let e=document.activeElement;return!e||!t.contains(e)?!1:typeof e.matches=="function"&&e.matches(":focus-visible")},fS=(t,e)=>{if(!t)return null;let n=t.getBoundingClientRect(),s=e?.getBoundingClientRect?.()||{width:0,height:0},o=Ur+s.width/2,r=window.innerWidth-Ur-s.width/2,i=n.left+n.width/2,a=s.width?Math.min(Math.max(i,o),r):i,l=n.bottom+xd,c=n.top-xd-s.height>=Ur;return l+s.height+Ur>window.innerHeight&&c&&(l=n.top-xd-s.height),{left:`${a}px`,top:`${Math.max(Ur,l)}px`}},yt=({text:t="",widthClass:e="w-64",tooltipClassName:n="",triggerClassName:s="",children:o=null,disabled:r=!1,delay:i=0})=>{let a=ee(null),l=ee(null),c=ee(null),d=ee(!1),[u,p]=y(!1),[f,g]=y(null);L(()=>{if(!u||r||!t)return;let b=()=>{let x=fS(a.current,l.current);x&&g(x)};return b(),window.addEventListener("resize",b),window.addEventListener("scroll",b,!0),()=>{window.removeEventListener("resize",b),window.removeEventListener("scroll",b,!0)}},[u,r,t]);let m=()=>{if(r||!t)return;let b=Date.now()-Gga.current?.matches?.(":hover")||qg(a.current);if(i>0&&!b)clearTimeout(c.current),c.current=setTimeout(()=>{x()&&p(!0)},i);else{if(!x())return;p(!0)}},h=()=>{clearTimeout(c.current),u&&(Gg=Date.now()),p(!1)};return Kg` +`;function dS(t,e){for(var n in e)t[n]=e[n];return t}function Ng(t,e){for(var n in t)if(n!=="__source"&&!(n in e))return!0;for(var s in e)if(s!=="__source"&&t[s]!==e[s])return!0;return!1}function Og(t,e){this.props=t,this.context=e}(Og.prototype=new hn).isPureReactComponent=!0,Og.prototype.shouldComponentUpdate=function(t,e){return Ng(this.props,t)||Ng(this.state,e)};var Bg=_e.__b;_e.__b=function(t){t.type&&t.type.__f&&t.ref&&(t.props.ref=t.ref,t.ref=null),Bg&&Bg(t)};var R4=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;var uS=_e.__e;_e.__e=function(t,e,n,s){if(t.then){for(var o,r=e;r=r.__;)if((o=r.__c)&&o.__c)return e.__e==null&&(e.__e=n.__e,e.__k=n.__k),o.__c(t,e)}uS(t,e,n,s)};var Fg=_e.unmount;function Ug(t,e,n){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach(function(s){typeof s.__c=="function"&&s.__c()}),t.__c.__H=null),(t=dS({},t)).__c!=null&&(t.__c.__P===n&&(t.__c.__P=e),t.__c.__e=!0,t.__c=null),t.__k=t.__k&&t.__k.map(function(s){return Ug(s,e,n)})),t}function Kg(t,e,n){return t&&n&&(t.__v=null,t.__k=t.__k&&t.__k.map(function(s){return Kg(s,e,n)}),t.__c&&t.__c.__P===e&&(t.__e&&n.appendChild(t.__e),t.__c.__e=!0,t.__c.__P=n)),t}function xd(){this.__u=0,this.o=null,this.__b=null}function Gg(t){var e=t.__&&t.__.__c;return e&&e.__a&&e.__a(t)}function Ma(){this.i=null,this.l=null}_e.unmount=function(t){var e=t.__c;e&&(e.__z=!0),e&&e.__R&&e.__R(),e&&32&t.__u&&(t.type=null),Fg&&Fg(t)},(xd.prototype=new hn).__c=function(t,e){var n=e.__c,s=this;s.o==null&&(s.o=[]),s.o.push(n);var o=Gg(s.__v),r=!1,i=function(){r||s.__z||(r=!0,n.__R=null,o?o(l):l())};n.__R=i;var a=n.__P;n.__P=null;var l=function(){if(!--s.__u){if(s.state.__a){var c=s.state.__a;s.__v.__k[0]=Kg(c,c.__c.__P,c.__c.__O)}var d;for(s.setState({__a:s.__b=null});d=s.o.pop();)d.__P=a,d.forceUpdate()}};s.__u++||32&e.__u||s.setState({__a:s.__b=s.__v.__k[0]}),t.then(i,i)},xd.prototype.componentWillUnmount=function(){this.o=[]},xd.prototype.render=function(t,e){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),s=this.__v.__k[0].__c;this.__v.__k[0]=Ug(this.__b,n,s.__O=s.__P)}this.__b=null}var o=e.__a&&T(ln,null,t.fallback);return o&&(o.__u&=-33),[T(ln,null,e.__a?null:t.children),o]};var Wg=function(t,e,n){if(++n[1]===n[0]&&t.l.delete(e),t.props.revealOrder&&(t.props.revealOrder[0]!=="t"||!t.l.size))for(n=t.i;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),e.h.removeChild(o)}}}ko(T(pS,{context:e.context},t.__v),e.v)}function No(t,e){var n=T(fS,{__v:t,h:e});return n.containerInfo=e,n}(Ma.prototype=new hn).__a=function(t){var e=this,n=Gg(e.__v),s=e.l.get(t);return s[0]++,function(o){var r=function(){e.props.revealOrder?(s.push(o),Wg(e,t,s)):o()};n?n(r):r()}},Ma.prototype.render=function(t){this.i=null,this.l=new Map;var e=Dr(t.children);t.revealOrder&&t.revealOrder[0]==="b"&&e.reverse();for(var n=e.length;n--;)this.l.set(e[n],this.i=[1,0,this.i]);return t.children},Ma.prototype.componentDidUpdate=Ma.prototype.componentDidMount=function(){var t=this;this.l.forEach(function(e,n){Wg(t,n,e)})};var hS=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,mS=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,gS=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,bS=/[A-Z0-9]/g,xS=typeof document<"u",yS=function(t){return(typeof Symbol<"u"&&typeof Symbol()=="symbol"?/fil|che|rad/:/fil|che|ra/).test(t)};hn.prototype.isReactComponent=!0,["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(hn.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:e})}})});var Hg=_e.event;_e.event=function(t){return Hg&&(t=Hg(t)),t.persist=function(){},t.isPropagationStopped=function(){return this.cancelBubble},t.isDefaultPrevented=function(){return this.defaultPrevented},t.nativeEvent=t};var qg,vS={configurable:!0,get:function(){return this.class}},Vg=_e.vnode;_e.vnode=function(t){typeof t.type=="string"&&(function(e){var n=e.props,s=e.type,o={},r=s.indexOf("-")==-1;for(var i in n){var a=n[i];if(!(i==="value"&&"defaultValue"in n&&a==null||xS&&i==="children"&&s==="noscript"||i==="class"||i==="className")){var l=i.toLowerCase();i==="defaultValue"&&"value"in n&&n.value==null?i="value":i==="download"&&a===!0?a="":l==="translate"&&a==="no"?a=!1:l[0]==="o"&&l[1]==="n"?l==="ondoubleclick"?i="ondblclick":l!=="onchange"||s!=="input"&&s!=="textarea"||yS(n.type)?l==="onfocus"?i="onfocusin":l==="onblur"?i="onfocusout":gS.test(i)&&(i=l):l=i="oninput":r&&mS.test(i)?i=i.replace(bS,"-$&").toLowerCase():a===null&&(a=void 0),l==="oninput"&&o[i=l]&&(i="oninputCapture"),o[i]=a}}s=="select"&&(o.multiple&&Array.isArray(o.value)&&(o.value=Dr(n.children).forEach(function(c){c.props.selected=o.value.indexOf(c.props.value)!=-1})),o.defaultValue!=null&&(o.value=Dr(n.children).forEach(function(c){c.props.selected=o.multiple?o.defaultValue.indexOf(c.props.value)!=-1:o.defaultValue==c.props.value}))),n.class&&!n.className?(o.class=n.class,Object.defineProperty(o,"className",vS)):n.className&&(o.class=o.className=n.className),e.props=o})(t),t.$$typeof=hS,Vg&&Vg(t)};var jg=_e.__r;_e.__r=function(t){jg&&jg(t),qg=t.__c};var zg=_e.diffed;_e.diffed=function(t){zg&&zg(t);var e=t.props,n=t.__e;n!=null&&t.type==="textarea"&&"value"in e&&e.value!==n.value&&(n.value=e.value==null?"":e.value),qg=null};var Jg=P.bind(T),qr=8,yd=8,$S=400,Zg=0,Yg=t=>{if(!t||typeof document>"u")return!1;let e=document.activeElement;return!e||!t.contains(e)?!1:typeof e.matches=="function"&&e.matches(":focus-visible")},wS=(t,e)=>{if(!t)return null;let n=t.getBoundingClientRect(),s=e?.getBoundingClientRect?.()||{width:0,height:0},o=qr+s.width/2,r=window.innerWidth-qr-s.width/2,i=n.left+n.width/2,a=s.width?Math.min(Math.max(i,o),r):i,l=n.bottom+yd,c=n.top-yd-s.height>=qr;return l+s.height+qr>window.innerHeight&&c&&(l=n.top-yd-s.height),{left:`${a}px`,top:`${Math.max(qr,l)}px`}},$t=({text:t="",widthClass:e="w-64",tooltipClassName:n="",triggerClassName:s="",children:o=null,disabled:r=!1,delay:i=0})=>{let a=te(null),l=te(null),c=te(null),d=te(!1),[u,p]=y(!1),[f,g]=y(null);L(()=>{if(!u||r||!t)return;let x=()=>{let b=wS(a.current,l.current);b&&g(b)};return x(),window.addEventListener("resize",x),window.addEventListener("scroll",x,!0),()=>{window.removeEventListener("resize",x),window.removeEventListener("scroll",x,!0)}},[u,r,t]);let m=()=>{if(r||!t)return;let x=Date.now()-Zg<$S,b=()=>a.current?.matches?.(":hover")||Yg(a.current);if(i>0&&!x)clearTimeout(c.current),c.current=setTimeout(()=>{b()&&p(!0)},i);else{if(!b())return;p(!0)}},h=()=>{clearTimeout(c.current),u&&(Zg=Date.now()),p(!1)};return Jg` {d.current=!1}} onMouseEnter=${m} onMouseLeave=${h} - onFocusIn=${()=>{d.current||qg(a.current)&&m()}} - onFocusOut=${b=>{d.current=!1,!b.currentTarget.contains(b.relatedTarget)&&h()}} + onFocusIn=${()=>{d.current||Yg(a.current)&&m()}} + onFocusOut=${x=>{d.current=!1,!x.currentTarget.contains(x.relatedTarget)&&h()}} > ${o} - ${u&&!r&&t&&typeof document<"u"?Do(Kg` + ${u&&!r&&t&&typeof document<"u"?No(Jg` `,document.body):null} - `};var yd=P.bind(T),Xe=({options:t=[],value:e,onChange:n=()=>{},className:s="",size:o="sm",fullWidth:r=!1})=>yd` + `};var vd=P.bind(T),nt=({options:t=[],value:e,onChange:n=()=>{},className:s="",size:o="sm",fullWidth:r=!1})=>vd`
- ${t.map(i=>{let a=yd` + ${t.map(i=>{let a=vd` - `;return i.title?yd`<${yt} text=${i.title} delay=${1e3} widthClass="w-auto max-w-64 whitespace-normal">${a}`:a})} + `;return i.title?vd`<${$t} text=${i.title} delay=${1e3} widthClass="w-auto max-w-64 whitespace-normal">${a}`:a})}
-`;var Me=P.bind(T),Ca=({className:t=""})=>Me` +`;var Pe=P.bind(T),Ta=({className:t=""})=>Pe` -`,nt=({className:t=""})=>Me` +`,Qe=({className:t=""})=>Pe` -`,No=({className:t=""})=>Me` +`,Oo=({className:t=""})=>Pe` -`;var Jg=({className:t=""})=>Me` +`;var Xg=({className:t=""})=>Pe` -`,Zg=({className:t=""})=>Me` +`,Qg=({className:t=""})=>Pe` -`,Yg=({className:t=""})=>Me` +`,eb=({className:t=""})=>Pe` -`,Xg=({className:t=""})=>Me` +`,tb=({className:t=""})=>Pe` -`,Qg=({className:t=""})=>Me` +`,nb=({className:t=""})=>Pe` -`,eb=({className:t=""})=>Me` +`,sb=({className:t=""})=>Pe` -`,tb=({className:t=""})=>Me` +`,ob=({className:t=""})=>Pe` -`,nb=({className:t=""})=>Me` +`,rb=({className:t=""})=>Pe` -`,_a=({className:t=""})=>Me` +`,Pa=({className:t=""})=>Pe` -`,sb=({className:t=""})=>Me` +`,ib=({className:t=""})=>Pe` -`,ob=({className:t=""})=>Me` +`,ab=({className:t=""})=>Pe` -`,rb=({className:t=""})=>Me` +`,lb=({className:t=""})=>Pe` -`,ib=({className:t=""})=>Me` +`,cb=({className:t=""})=>Pe` -`,Ma=({className:t=""})=>Me` +`,Ra=({className:t=""})=>Pe` -`,ab=({className:t=""})=>Me` +`,db=({className:t=""})=>Pe` -`,lb=({className:t=""})=>Me` +`,ub=({className:t=""})=>Pe` -`,cb=({className:t=""})=>Me` +`,pb=({className:t=""})=>Pe` -`,db=({className:t=""})=>Me` +`,fb=({className:t=""})=>Pe` -`,ub=({className:t=""})=>Me` +`,hb=({className:t=""})=>Pe` -`,pb=({className:t=""})=>Me` +`,mb=({className:t=""})=>Pe` -`,vd=({className:t=""})=>Me` +`,$d=({className:t=""})=>Pe` -`,fb=({className:t=""})=>Me` +`,gb=({className:t=""})=>Pe` -`,Oo=({className:t=""})=>Me` +`,Bo=({className:t=""})=>Pe` -`,Aa=({className:t=""})=>Me` +`,La=({className:t=""})=>Pe` -`,Kr=({className:t=""})=>Me` +`,Jr=({className:t=""})=>Pe` -`,Gr=({className:t=""})=>Me` +`,Zr=({className:t=""})=>Pe` -`,hb=({className:t=""})=>Me` +`,bb=({className:t=""})=>Pe` -`,Us=({className:t=""})=>Me` +`,Zn=({className:t=""})=>Pe` -`,mb=({className:t=""})=>Me` +`,xb=({className:t=""})=>Pe` -`,gb=({className:t=""})=>Me` +`,yb=({className:t=""})=>Pe` -`,Ta=({className:t=""})=>Me` +`,Ea=({className:t=""})=>Pe` -`;var bb=({className:t=""})=>Me` +`;var vb=({className:t=""})=>Pe` -`,xb=({className:t=""})=>Me` +`,$b=({className:t=""})=>Pe` -`;var Pa=({className:t=""})=>Me` +`;var Ia=({className:t=""})=>Pe` -`;var Bo=P.bind(T),hS=({className:t=""})=>Bo` +`;var Fo=P.bind(T),kS=({className:t=""})=>Fo` -`,pt=({open:t=!1,onToggle:e=()=>{},onClose:n=()=>{},ariaLabel:s="Open menu",title:o="",menuRef:r=null,renderTrigger:i=null,triggerDisabled:a=!1,children:l=null})=>{let c=ee(null),d=u=>{if(c.current=u,typeof r=="function"){r(u);return}r&&typeof r=="object"&&(r.current=u)};return L(()=>{if(!t)return;let u=p=>{let f=c.current;f&&(f.contains(p.target)||n(p))};return window.addEventListener("click",u),()=>window.removeEventListener("click",u)},[t,n]),Bo` +`,mt=({open:t=!1,onToggle:e=()=>{},onClose:n=()=>{},ariaLabel:s="Open menu",title:o="",menuRef:r=null,renderTrigger:i=null,triggerDisabled:a=!1,children:l=null})=>{let c=te(null),d=u=>{if(c.current=u,typeof r=="function"){r(u);return}r&&typeof r=="object"&&(r.current=u)};return L(()=>{if(!t)return;let u=p=>{let f=c.current;f&&(f.contains(p.target)||n(p))};return window.addEventListener("click",u),()=>window.removeEventListener("click",u)},[t,n]),Fo`
- ${typeof i=="function"?i({open:t,onToggle:u=>{u.stopPropagation(),e(u)},ariaLabel:s,title:o||s}):Bo` + ${typeof i=="function"?i({open:t,onToggle:u=>{u.stopPropagation(),e(u)},ariaLabel:s,title:o||s}):Fo` `} - ${t?Bo` + ${t?Fo`
u.stopPropagation()}> ${l}
`:null}
-`},We=({children:t=null,onClick:e=()=>{},className:n="",iconSrc:s="",disabled:o=!1})=>Bo` +`},We=({children:t=null,onClick:e=()=>{},className:n="",iconSrc:s="",disabled:o=!1})=>Fo` -`;var $d=P.bind(T),Ra=({open:t=!1,onClose:e=()=>{},onToggle:n=()=>{},triggerDisabled:s=!1,channelIds:o=[],getChannelMeta:r=()=>({label:"Channel",iconSrc:""}),isChannelDisabled:i=()=>!1,onSelectChannel:a=()=>{}})=>$d` - <${pt} +`;var wd=P.bind(T),Da=({open:t=!1,onClose:e=()=>{},onToggle:n=()=>{},triggerDisabled:s=!1,channelIds:o=[],getChannelMeta:r=()=>({label:"Channel",iconSrc:""}),isChannelDisabled:i=()=>!1,onSelectChannel:a=()=>{}})=>wd` + <${mt} open=${t} ariaLabel="Add channel" title="Add channel" onClose=${e} onToggle=${n} - renderTrigger=${({onToggle:l,ariaLabel:c,title:d})=>$d` + renderTrigger=${({onToggle:l,ariaLabel:c,title:d})=>wd` <${Z} onClick=${l} disabled=${s} @@ -1123,7 +1123,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa size="sm" idleLabel="Add channel" loadingLabel="Opening..." - idleIcon=${No} + idleIcon=${Oo} idleIconClassName="h-3.5 w-3.5" iconOnly=${!0} title=${d} @@ -1131,7 +1131,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa /> `} > - ${o.map(l=>{let c=r(l),d=!!i(l);return $d` + ${o.map(l=>{let c=r(l),d=!!i(l);return wd` <${We} key=${l} iconSrc=${c.iconSrc} @@ -1141,19 +1141,86 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,qc,zc,Uc,Xf,oa ${c.label} `})} - -`;var wd=P.bind(T),Ks=({status:t="configured",ownerAgentName:e="",showAgentBadge:n=!1,channelId:s="",pairedCount:o=0})=>String(t||"").trim()!=="paired"?wd`<${ae} tone="warning">Awaiting pairing`:n&&e?wd` - <${ae} tone="neutral"> + +`;var kd=P.bind(T),Js=({status:t="configured",ownerAgentName:e="",showAgentBadge:n=!1,channelId:s="",pairedCount:o=0})=>String(t||"").trim()!=="paired"?kd`<${de} tone="warning">Awaiting pairing`:n&&e?kd` + <${de} tone="neutral"> ${e} - - `:wd` - <${ae} tone="success"> + + `:kd` + <${de} tone="success"> ${s==="telegram"||Number(o)<=1?"Paired":`Paired (${Number(o)})`} - - `;var mS=P.bind(T),st=({visible:t=!1,title:e="Confirm action",message:n="Are you sure you want to continue?",details:s=null,confirmLabel:o="Confirm",confirmLoadingLabel:r="Working...",cancelLabel:i="Cancel",onConfirm:a,onCancel:l,confirmTone:c="primary",confirmLoading:d=!1,confirmDisabled:u=!1})=>(L(()=>{if(!t)return;let f=g=>{g.key==="Escape"&&l?.()};return window.addEventListener("keydown",f),()=>window.removeEventListener("keydown",f)},[t,l]),t?mS` + + `;import{h as CS}from"https://esm.sh/preact";import _S from"https://esm.sh/htm";var SS=P.bind(T),Ie=({visible:t=!1,onClose:e=()=>{},closeOnOverlayClick:n=!0,closeOnEscape:s=!0,panelClassName:o="bg-modal border border-border rounded-xl p-5 max-w-md w-full space-y-3",children:r=null})=>{let i=te(!1);return L(()=>{if(!t||!s)return;let a=l=>{l.key==="Escape"&&e?.()};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[t,s,e]),t?No(SS` +
{i.current=a.target===a.currentTarget}} + onpointerup=${a=>{let l=n&&i.current&&a.target===a.currentTarget;i.current=!1,l&&e?.()}} + onpointercancel=${()=>{i.current=!1}} + onclick=${a=>{a.preventDefault()}} + > +
${r}
+
+ `,document.body):null};var wb=P.bind(T),De=({title:t="",actions:e=null,leading:n=null})=>wb` +
+
+ ${n||wb`

${t}

`} +
+
${e}
+
+`;var kb=_S.bind(CS),Sb=({visible:t=!1,loading:e=!1,title:n="Link Channel",output:s="",error:o="",runDisabled:r=!1,runLabel:i="Generate QR",runLoadingLabel:a="Running...",closeLabel:l="Close",onRun:c=async()=>{},onClose:d=()=>{}})=>{if(!t)return null;let u=!!String(s||"").trim(),p=!!String(o||"").trim(),f=u?String(s):p?String(o):"No output yet. Generate QR to start login.";return kb` + <${Ie} + visible=${t} + onClose=${d} + panelClassName="bg-modal border border-border rounded-xl p-6 max-w-2xl w-full space-y-4" + > + <${De} + title=${n} + actions=${kb` + + `} + /> +
+

+ Click "Generate QR" to run channel login and capture terminal output. +

+ -`,Yo=({editorShellClassName:t="file-viewer-editor-shell",editorShellAriaHidden:e,editorLineNumbers:n,editorLineNumbersRef:s,editorLineNumberRowRefs:o,shouldUseHighlightedEditor:r,highlightedEditorLines:i,editorHighlightRef:a,editorHighlightLineRefs:l,editorTextareaRef:c,renderContent:d,handleContentInput:u,handleEditorKeyDown:p,handleEditorScroll:f,handleEditorSelectionChange:g,isEditBlocked:m,isPreviewOnly:h,textareaWrap:b="soft"})=>Zo` +`,Yo=({editorShellClassName:t="file-viewer-editor-shell",editorShellAriaHidden:e,editorLineNumbers:n,editorLineNumbersRef:s,editorLineNumberRowRefs:o,shouldUseHighlightedEditor:r,highlightedEditorLines:i,editorHighlightRef:a,editorHighlightLineRefs:l,editorTextareaRef:c,renderContent:d,handleContentInput:u,handleEditorKeyDown:p,handleEditorScroll:f,handleEditorSelectionChange:g,isEditBlocked:m,isPreviewOnly:h,textareaWrap:x="soft"})=>Zo`
- ${n.map(x=>Zo` + ${n.map(b=>Zo`
{o.current[x-1]=v}} + ref=${v=>{o.current[b-1]=v}} > - ${x} + ${b}
`)}
${r?Zo`
- ${i.map(x=>Zo` + ${i.map(b=>Zo`
{l.current[x.lineNumber-1]=v}} + key=${b.lineNumber} + ref=${v=>{l.current[b.lineNumber-1]=v}} >
`)}
- <${Sy} + <${Ly} overlay=${!0} editorTextareaRef=${c} renderContent=${d} @@ -4113,11 +4196,11 @@ ${(n||"").split(` handleEditorSelectionChange=${g} isEditBlocked=${m} isPreviewOnly=${h} - textareaWrap=${b} + textareaWrap=${x} />
`:Zo` - <${Sy} + <${Ly} overlay=${!1} editorTextareaRef=${c} renderContent=${d} @@ -4127,11 +4210,11 @@ ${(n||"").split(` handleEditorSelectionChange=${g} isEditBlocked=${m} isPreviewOnly=${h} - textareaWrap=${b} + textareaWrap=${x} /> `}
-`;var W2=P.bind(T),Cy=({viewMode:t,previewRef:e,handlePreviewScroll:n,previewHtml:s,editorLineNumbers:o,editorLineNumbersRef:r,editorLineNumberRowRefs:i,shouldUseHighlightedEditor:a,highlightedEditorLines:l,editorHighlightRef:c,editorHighlightLineRefs:d,editorTextareaRef:u,renderContent:p,handleContentInput:f,handleEditorKeyDown:g,handleEditorScroll:m,handleEditorSelectionChange:h,isEditBlocked:b,isPreviewOnly:x})=>W2` +`;var X2=P.bind(T),Ey=({viewMode:t,previewRef:e,handlePreviewScroll:n,previewHtml:s,editorLineNumbers:o,editorLineNumbersRef:r,editorLineNumberRowRefs:i,shouldUseHighlightedEditor:a,highlightedEditorLines:l,editorHighlightRef:c,editorHighlightLineRefs:d,editorTextareaRef:u,renderContent:p,handleContentInput:f,handleEditorKeyDown:g,handleEditorScroll:m,handleEditorSelectionChange:h,isEditBlocked:x,isPreviewOnly:b})=>X2`
-`;var _y=1e3,My=5e3,ul=50,pl=25e4,fl=5e3;var Ay=()=>{try{return String(window.localStorage.getItem(Jr)||"").trim()==="preview"?"preview":"edit"}catch{return"edit"}},Ty=()=>{try{let t=window.localStorage.getItem(Ba);if(!t)return{};let e=JSON.parse(t);return!e||typeof e!="object"?{}:e}catch{return{}}},Py=t=>{let e=String(t||"").trim();if(!e)return null;let s=Ty()[e];return!s||typeof s!="object"?null:{start:s.start,end:s.end}},du=(t,e)=>{let n=String(t||"").trim();if(!(!n||!e||typeof e!="object"))try{let s=Ty();s[n]={start:e.start,end:e.end},window.localStorage.setItem(Ba,JSON.stringify(s))}catch{}};var Ry=t=>String(t||"").split("/").map(e=>e.trim()).filter(Boolean),hl=(t,e)=>{let n=Number.parseInt(String(t??""),10);return Number.isFinite(n)?Math.max(0,Math.min(e,n)):0},ml=t=>{let e=String(t||"");return e?e.split(/\r\n|\r|\n/).length:1},gl=({contentLength:t=0,lineCount:e=1,charThreshold:n=25e4,lineThreshold:s=5e3})=>Number(t)>Number(n)||Number(e)>Number(s);var Xo=t=>{if(!t)return 0;let e=t.scrollHeight-t.clientHeight;return e<=0?0:t.scrollTop/e},$s=(t,e)=>{if(!t)return;let n=t.scrollHeight-t.clientHeight;if(n<=0){t.scrollTop=0;return}let s=Math.max(0,Math.min(1,e));t.scrollTop=n*s},Ly=({viewMode:t,setViewMode:e,previewRef:n,editorTextareaRef:s,editorLineNumbersRef:o,editorHighlightRef:r})=>{let i=ee(0),a=ee(!1);return{viewScrollRatioRef:i,isSyncingScrollRef:a,handleEditorScroll:u=>{if(a.current)return;let p=u.currentTarget.scrollTop,f=Xo(u.currentTarget);i.current=f,o.current&&(o.current.scrollTop=p,r.current&&(r.current.scrollTop=p,r.current.scrollLeft=u.currentTarget.scrollLeft),n.current&&(a.current=!0,$s(n.current,f),window.requestAnimationFrame(()=>{a.current=!1})))},handlePreviewScroll:u=>{if(a.current)return;let p=Xo(u.currentTarget);i.current=p,a.current=!0,$s(s.current,p),$s(o.current,p),$s(r.current,p),window.requestAnimationFrame(()=>{a.current=!1})},handleChangeViewMode:u=>{if(u===t)return;let p=Xo(t==="preview"?n.current:s.current);i.current=p,e(u),window.requestAnimationFrame(()=>{a.current=!0,u==="preview"?$s(n.current,p):($s(s.current,p),$s(o.current,p),$s(r.current,p)),window.requestAnimationFrame(()=>{a.current=!1})})}}};var Ey=({hasSelectedPath:t,normalizedPath:e,isDiffView:n,isSqliteFile:s,sqliteSelectedTable:o,sqliteTableOffset:r,canEditFile:i,isFolderPath:a,loading:l,saving:c,initialContent:d,isDirty:u,setContent:p,setInitialContent:f,setFileKind:g,setImageDataUrl:m,setAudioDataUrl:h,setSqliteSummary:b,setSqliteSelectedTable:x,setSqliteTableOffset:v,setSqliteTableLoading:w,setSqliteTableError:$,setSqliteTableData:S,setError:C,setIsFolderPath:_,setExternalChangeNoticeShown:k,externalChangeNoticeShown:A,viewScrollRatioRef:O,setLoading:D})=>{let z=ee(""),E=ee(""),M=ee(!1);return L(()=>{let R=!0;return z.current="",E.current="",t?(p(""),f(""),m(""),h(""),b(null),x(""),v(0),w(!1),$(""),S(null),g("text"),C(""),_(!1),k(!1),O.current=0,n?(D(!1),z.current=e,E.current="",()=>{R=!1}):((async()=>{D(!0),C(""),_(!1);try{let I=await ud(e);if(!R)return;let U=I?.kind==="image"?"image":I?.kind==="audio"?"audio":I?.kind==="sqlite"?"sqlite":"text";if(g(U),U==="image"){m(String(I?.imageDataUrl||"")),h(""),b(null),x(""),v(0),w(!1),$(""),S(null),p(""),f(""),k(!1),O.current=0,z.current=e,E.current="";return}if(U==="audio"){h(String(I?.audioDataUrl||"")),m(""),b(null),x(""),v(0),w(!1),$(""),S(null),p(""),f(""),k(!1),O.current=0,z.current=e,E.current="";return}if(U==="sqlite"){let se=I?.sqliteSummary||null,K=se?.objects||[],j=K.find(X=>X?.type==="table")?.name||K[0]?.name||"";b(se),x(j),v(0),w(!1),$(""),S(null),m(""),h(""),p(""),f(""),k(!1),O.current=0,z.current=e,E.current="";return}m(""),h(""),b(null),x(""),v(0),w(!1),$(""),S(null);let W=I.content||"",G=zb(e);p(G||W),mn(e,!!(G&&G!==W),{dispatchEvent:se=>window.dispatchEvent(se)}),f(W),k(!1),O.current=0,z.current=e,E.current=""}catch(I){if(!R)return;g("text"),m(""),h(""),b(null),x(""),v(0),w(!1),$(""),S(null);let U=I.message||"Could not load file";if(/path is not a file/i.test(U)){p(""),f(""),_(!0),C(""),z.current=e,E.current="";return}C(U)}finally{R&&D(!1)}})(),()=>{R=!1})):(p(""),f(""),g("text"),m(""),h(""),b(null),x(""),v(0),w(!1),$(""),S(null),C(""),_(!1),O.current=0,z.current="",()=>{R=!1})},[t,e,n]),L(()=>{if(!s||!e||!o)return S(null),$(""),w(!1),()=>{};let R=!0;return(async()=>{w(!0),$("");try{let I=await hg({filePath:e,table:o,limit:ul,offset:r});if(!R)return;S(I)}catch(I){if(!R)return;$(I.message||"Could not load sqlite table")}finally{R&&w(!1)}})(),()=>{R=!1}},[s,e,o,r]),L(()=>{if(!t||a||!i||n)return()=>{};let R=async()=>{if(!(l||c)&&!M.current){M.current=!0;try{let U=(await ud(e)).content||"";if(U===d){k(!1);return}if(!u){p(U),f(U),xs(e),mn(e,!1,{dispatchEvent:W=>window.dispatchEvent(W)}),k(!1),window.dispatchEvent(new CustomEvent("alphaclaw:browse-tree-refresh"));return}A||(N("This file changed on disk. Save to overwrite or reload by re-opening.","error"),k(!0))}catch{}finally{M.current=!1}}},B=window.setInterval(R,My);return()=>{window.clearInterval(B)}},[t,a,i,n,l,c,e,d,u,A]),{loadedFilePathRef:z,restoredSelectionPathRef:E}};var Iy=({hasSelectedPath:t,isDiffView:e,isPreviewOnly:n,normalizedPath:s})=>{let[o,r]=y(!1),[i,a]=y(""),[l,c]=y(""),[d,u]=y({statusKind:"",isDeleted:!1});return L(()=>{let p=!0;return!t||!e||n?(r(!1),a(""),c(""),u({statusKind:"",isDeleted:!1}),()=>{p=!1}):((async()=>{r(!0),a("");try{let g=await fg(s);if(!p)return;c(String(g?.content||"")),u({statusKind:String(g?.statusKind||""),isDeleted:!!g?.isDeleted})}catch(g){if(!p)return;a(g.message||"Could not load diff"),u({statusKind:"",isDeleted:!1})}finally{p&&r(!1)}})(),()=>{p=!1})},[t,e,n,s]),{diffLoading:o,diffError:i,diffContent:l,diffStatus:d}};var Dy=({loadedFilePathRef:t,normalizedPath:e,canEditFile:n,hasSelectedPath:s,loading:o,content:r,initialContent:i})=>{L(()=>{if(t.current===e&&!(!n||!s||o)){if(r===i){xs(e),mn(e,!1,{dispatchEvent:a=>window.dispatchEvent(a)});return}za(e,r),mn(e,!0,{dispatchEvent:a=>window.dispatchEvent(a)})}},[n,s,o,r,i,e])};var Ny=({canEditFile:t,isPreviewOnly:e,isDiffView:n,viewMode:s,handleSave:o})=>{L(()=>{let r=i=>{(i.metaKey||i.ctrlKey)&&!i.shiftKey&&!i.altKey&&String(i.key||"").toLowerCase()==="s"&&(!t||e||n||s!=="edit"||(i.preventDefault(),o()))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[t,e,n,s,o])};var V2=(t,e)=>{let n=String(t||"").split(` -`),s=Math.max(0,Math.min(e-1,n.length-1)),o=0;for(let r=0;r{let r=window.getComputedStyle(e),i=Number.parseFloat(r.lineHeight||""),a=Number.isFinite(i)&&i>0?i:20,l=Math.max(0,t*a-e.clientHeight*.4);e.scrollTop=l,n.current&&(n.current.scrollTop=l),s.current&&(s.current.scrollTop=l),o.current=Xo(e)},By=t=>{if(!t)return;let e=t.querySelectorAll(".line-highlight-flash");for(let n of e)n.classList.remove("line-highlight-flash")},j2=(t,e,n)=>{if(!t)return;By(t);let s=t.querySelectorAll("[data-line-row]"),o=Math.min(n,s.length-1);for(let r=e;r<=o;r+=1){let i=s[r];i&&i.classList.add("line-highlight-flash")}},Fy=({canEditFile:t,isEditBlocked:e,loading:n,hasSelectedPath:s,normalizedPath:o,loadedFilePathRef:r,restoredSelectionPathRef:i,viewMode:a,content:l,lineTarget:c=0,lineEndTarget:d=0,editorTextareaRef:u,editorLineNumbersRef:p,editorHighlightRef:f,viewScrollRatioRef:g})=>{let m=ee("");L(()=>{c&&c>=1||m.current&&(By(p.current),m.current="")},[c,o,p]),L(()=>{if(e||!t||n||!s)return()=>{};if(r.current!==o)return()=>{};if(a!=="edit")return()=>{};if(!c||c<1)return()=>{};let h=d&&d>=c?d:c,b=`${o}:${c}-${h}`;if(m.current===b)return()=>{};let x=0,v=0,w=()=>{let $=u.current;if(!$){v+=1,v<6&&(x=window.requestAnimationFrame(w));return}let S=String(l||""),C=V2(S,c);$.setSelectionRange(C,C);let _=c-1,k=h-1;window.requestAnimationFrame(()=>{let A=u.current;A&&(Oy({lineIndex:_,textareaElement:A,editorLineNumbersRef:p,editorHighlightRef:f,viewScrollRatioRef:g}),j2(p.current,_,k))}),m.current=b,i.current=o};return x=window.requestAnimationFrame(w),()=>{x&&window.cancelAnimationFrame(x)}},[t,e,n,s,o,l,a,c,d,r,i,u,p,f,g]),L(()=>{if(e)return i.current="",()=>{};if(!t||n||!s)return()=>{};if(r.current!==o)return()=>{};if(i.current===o)return()=>{};if(a!=="edit")return()=>{};if(c&&c>=1)return()=>{};let h=Py(o);if(!h)return i.current=o,()=>{};let b=0,x=0,v=()=>{let w=u.current;if(!w){x+=1,x<6&&(b=window.requestAnimationFrame(v));return}let $=String(l||"").length,S=hl(h.start,$),C=hl(h.end,$);w.focus(),w.setSelectionRange(S,Math.max(S,C)),window.requestAnimationFrame(()=>{let _=u.current;if(!_)return;let k=String(l||""),A=hl(S,k.length),O=k.slice(0,A).split(` -`).length-1;Oy({lineIndex:O,textareaElement:_,editorLineNumbersRef:p,editorHighlightRef:f,viewScrollRatioRef:g})}),i.current=o};return b=window.requestAnimationFrame(v),()=>{b&&window.cancelAnimationFrame(b)}},[t,e,n,s,o,l,a,c,r,i,u,p,f,g])};var bl=({enabled:t=!1,syncKey:e="",editorLineNumberRowRefs:n,editorHighlightLineRefs:s})=>{let o=q(()=>{if(!t)return;let r=n?.current||[],i=s?.current||[],a=Math.min(r.length,i.length);for(let l=0;l{o()},[o,e]),L(()=>{if(!t)return()=>{};let r=()=>o();return window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[t,o]),{syncEditorLineNumberHeights:o}};var Hy=({filePath:t="",isPreviewOnly:e=!1,browseView:n="edit",lineTarget:s=0,lineEndTarget:o=0,onRequestClearSelection:r=()=>{},onRequestEdit:i=()=>{}})=>{let a=String(t||"").trim(),l=Ys(a),[c,d]=y(""),[u,p]=y(""),[f,g]=y("text"),[m,h]=y(""),[b,x]=y(""),[v,w]=y(null),[$,S]=y(""),[C,_]=y(0),[k,A]=y(!1),[O,D]=y(""),[z,E]=y(null),[M,R]=y(Ay),[B,I]=y(!1),[U,W]=y(!1),[G,se]=y(!1),[K,j]=y(!1),[X,de]=y(!1),[le,ie]=y(""),[ne,xe]=y(!1),[he,ue]=y(!1),[me,V]=y(!1),[J,oe]=y(()=>new Set),ce=ee(null),be=ee(null),Ve=ee(null),et=ee(null),kt=ee([]),Ot=ee([]),Q=a.length>0,pe=f==="image",te=f==="audio",Ee=f==="sqlite",ke=Q&&!ne&&!e&&!pe&&!te&&!Ee,H=String(n||"edit")==="diff",{viewScrollRatioRef:re,handleEditorScroll:ye,handlePreviewScroll:ve,handleChangeViewMode:Ie}=Ly({viewMode:M,setViewMode:R,previewRef:et,editorTextareaRef:Ve,editorLineNumbersRef:ce,editorHighlightRef:be}),{loadedFilePathRef:gt,restoredSelectionPathRef:Hc}=Ey({hasSelectedPath:Q,normalizedPath:a,isDiffView:H,isSqliteFile:Ee,sqliteSelectedTable:$,sqliteTableOffset:C,canEditFile:ke,isFolderPath:ne,loading:B,saving:G,initialContent:u,isDirty:ke&&c!==u,setLoading:I,setContent:d,setInitialContent:p,setFileKind:g,setImageDataUrl:h,setAudioDataUrl:x,setSqliteSummary:w,setSqliteSelectedTable:S,setSqliteTableOffset:_,setSqliteTableLoading:A,setSqliteTableError:D,setSqliteTableData:E,setError:ie,setIsFolderPath:xe,setExternalChangeNoticeShown:V,externalChangeNoticeShown:me,viewScrollRatioRef:re}),{diffLoading:Wc,diffError:ea,diffContent:Vc,diffStatus:Cr}=Iy({hasSelectedPath:Q,isDiffView:H,isPreviewOnly:e,normalizedPath:a}),jc=F(()=>Ry(a),[a]),ta=gt.current===a,Kt=ta?c:"",go=ke&&Kt!==(ta?u:""),bo=ke&&Zn(Zs,l),_r=ke&&!bo&&Zn(Ua,l),na=_r&&!J.has(l),ps=bo||na,xo=bo||_r,Fs=Q&&!ne&&!e&&!H&&!K&&!G&&!xo,fs=F(()=>vy(a),[a]),Gn=fs==="markdown",yo=F(()=>ml(Kt),[Kt]),ge=F(()=>gl({contentLength:Kt.length,lineCount:yo,charThreshold:pl,lineThreshold:fl}),[Kt,yo]),bt=fs!=="plain"&&!ge,Pt=!ge,xt=F(()=>Gn?lu(Kt):{entries:[],body:Kt},[Kt,Gn]),fn=F(()=>bt?dl(Kt,fs):[],[Kt,bt,fs]),Ke=F(()=>Pt?Array.from({length:yo},(we,je)=>je+1):[],[yo,Pt]),St=F(()=>Gn?Le.parse(xt.body||"",{gfm:!0,breaks:!0}):"",[xt.body,Gn]);bl({enabled:bt&&M==="edit",syncKey:`${a}:${Kt.length}:${fn.length}`,editorLineNumberRowRefs:kt,editorHighlightLineRefs:Ot}),L(()=>{!Gn&&M!=="edit"&&R("edit")},[Gn,M]),L(()=>{oe(new Set)},[a]),L(()=>{try{window.localStorage.setItem(Jr,M)}catch{}},[M]),L(()=>{if(!B)return W(!1),()=>{};let we=window.setTimeout(()=>{W(!0)},_y);return()=>window.clearTimeout(we)},[B]),Dy({loadedFilePathRef:gt,normalizedPath:a,canEditFile:ke,hasSelectedPath:Q,loading:B,content:c,initialContent:u}),Fy({canEditFile:ke,isEditBlocked:ps,loading:B,hasSelectedPath:Q,normalizedPath:a,loadedFilePathRef:gt,restoredSelectionPathRef:Hc,viewMode:M,content:c,lineTarget:s,lineEndTarget:o,editorTextareaRef:Ve,editorLineNumbersRef:ce,editorHighlightRef:be,viewScrollRatioRef:re});let Gt=q(async()=>{if(!(!ke||G||!go||ps)){se(!0),ie("");try{await ag(a,c),p(c),V(!1),xs(a),mn(a,!1,{dispatchEvent:we=>window.dispatchEvent(we)}),window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-saved",{detail:{path:a}}))}catch(we){let je=we.message||"Could not save file";N(je,"error")}finally{se(!1)}}},[ke,G,go,ps,a,c]),vo=q(async()=>{if(Fs){j(!0),ie("");try{let we=await wa(a),je=String(we?.path||a);V(!1),xs(a),mn(a,!1,{dispatchEvent:Mr=>window.dispatchEvent(Mr)}),window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-saved",{detail:{path:je}})),window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-deleted",{detail:{path:je}})),window.dispatchEvent(new CustomEvent("alphaclaw:browse-tree-refresh")),N("File deleted","success"),r()}catch(we){let je=we.message||"Could not delete file";ie(je),/path is not a file/i.test(je)?(N("Only files can be deleted","warning"),r()):N(je,"error")}finally{j(!1)}}},[Fs,a,r]),Hs=q(async()=>{if(!(!H||!Cr?.isDeleted||X)){de(!0);try{let we=await pg(a),je=String(we?.path||a);window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-saved",{detail:{path:je}})),window.dispatchEvent(new CustomEvent("alphaclaw:browse-tree-refresh")),N("File restored","success"),i(je)}catch(we){N(we.message||"Could not restore file","error")}finally{de(!1)}}},[Cr?.isDeleted,H,a,i,X]);Ny({canEditFile:ke,isPreviewOnly:e,isDiffView:H,viewMode:M,handleSave:Gt});let kk=()=>{l&&(oe(we=>{let je=new Set(we);return je.add(l),je}),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{let we=Ve.current;we&&(we.disabled||we.readOnly||we.focus())})}))},jf=q((we,je=null)=>{!Q||!ke||(je&&du(a,je),za(a,we),mn(a,we!==u,{dispatchEvent:Mr=>window.dispatchEvent(Mr)}))},[Q,ke,a,u]);return{state:{hasSelectedPath:Q,isPreviewOnly:e,loading:B,saving:G,deleting:K,restoring:X,showDelayedLoadingSpinner:U,error:le,isFolderPath:ne,isImageFile:pe,imageDataUrl:m,isAudioFile:te,audioDataUrl:b,isSqliteFile:Ee,sqliteSummary:v,sqliteSelectedTable:$,sqliteTableOffset:C,sqliteTableLoading:k,sqliteTableError:O,sqliteTableData:z,isDiffView:H,diffLoading:Wc,diffError:ea,diffContent:Vc,diffStatus:Cr,isMarkdownFile:Gn,frontmatterCollapsed:he,previewHtml:St,viewMode:M,renderContent:Kt},derived:{pathSegments:jc,isDirty:go,canEditFile:ke,canDeleteFile:Fs,isDeleteBlocked:xo,isEditBlocked:ps,isLockedFile:bo,isProtectedFile:_r,isProtectedLocked:na,shouldUseHighlightedEditor:bt,shouldRenderLineNumbers:Pt,parsedFrontmatter:xt,highlightedEditorLines:fn,editorLineNumbers:Ke},refs:{previewRef:et,editorLineNumbersRef:ce,editorLineNumberRowRefs:kt,editorHighlightRef:be,editorHighlightLineRefs:Ot,editorTextareaRef:Ve},actions:{setFrontmatterCollapsed:ue,setSqliteSelectedTable:S,setSqliteTableOffset:_,handleChangeViewMode:Ie,handleSave:Gt,handleDiscard:()=>{!ke||!go||G||K||(d(u),xs(a),mn(a,!1,{dispatchEvent:we=>window.dispatchEvent(we)}),N("Changes discarded","info"))},handleDelete:vo,handleRestore:Hs,handleEditProtectedFile:kk,handleContentInput:we=>{if(ps||e)return;let je=we.target.value;d(je),jf(je,{start:we.target.selectionStart,end:we.target.selectionEnd})},handleEditorKeyDown:we=>{if(we.key!=="Tab"||we.shiftKey||we.metaKey||we.ctrlKey||we.altKey||ps||e||!ke)return;let je=we.currentTarget;if(!je)return;we.preventDefault();let Mr=Number(je.selectionStart||0),Sk=Number(je.selectionEnd||0);je.setRangeText(" ",Mr,Sk,"end");let zf=je.value;d(zf),jf(zf,{start:je.selectionStart,end:je.selectionEnd})},handleEditorScroll:ye,handlePreviewScroll:ve,handleEditorSelectionChange:()=>{if(!Q||!ke||B)return;let we=Ve.current;we&&du(a,{start:we.selectionStart,end:we.selectionEnd})}},context:{normalizedPath:a}}};var dn=P.bind(T),Wy=({filePath:t="",isPreviewOnly:e=!1,browseView:n="edit",lineTarget:s=0,lineEndTarget:o=0,onRequestEdit:r=()=>{},onRequestClearSelection:i=()=>{}})=>{let[a,l]=y(!1),{state:c,derived:d,refs:u,actions:p,context:f}=Hy({filePath:t,isPreviewOnly:e,browseView:n,lineTarget:s,lineEndTarget:o,onRequestClearSelection:i,onRequestEdit:r});return!c.hasSelectedPath||c.isFolderPath?dn` +`;var Iy=1e3,Dy=5e3,ml=50,gl=25e4,bl=5e3;var Ny=()=>{try{return String(window.localStorage.getItem(Xr)||"").trim()==="preview"?"preview":"edit"}catch{return"edit"}},Oy=()=>{try{let t=window.localStorage.getItem(Va);if(!t)return{};let e=JSON.parse(t);return!e||typeof e!="object"?{}:e}catch{return{}}},By=t=>{let e=String(t||"").trim();if(!e)return null;let s=Oy()[e];return!s||typeof s!="object"?null:{start:s.start,end:s.end}},pu=(t,e)=>{let n=String(t||"").trim();if(!(!n||!e||typeof e!="object"))try{let s=Oy();s[n]={start:e.start,end:e.end},window.localStorage.setItem(Va,JSON.stringify(s))}catch{}};var Fy=t=>String(t||"").split("/").map(e=>e.trim()).filter(Boolean),xl=(t,e)=>{let n=Number.parseInt(String(t??""),10);return Number.isFinite(n)?Math.max(0,Math.min(e,n)):0},yl=t=>{let e=String(t||"");return e?e.split(/\r\n|\r|\n/).length:1},vl=({contentLength:t=0,lineCount:e=1,charThreshold:n=25e4,lineThreshold:s=5e3})=>Number(t)>Number(n)||Number(e)>Number(s);var Xo=t=>{if(!t)return 0;let e=t.scrollHeight-t.clientHeight;return e<=0?0:t.scrollTop/e},Cs=(t,e)=>{if(!t)return;let n=t.scrollHeight-t.clientHeight;if(n<=0){t.scrollTop=0;return}let s=Math.max(0,Math.min(1,e));t.scrollTop=n*s},Wy=({viewMode:t,setViewMode:e,previewRef:n,editorTextareaRef:s,editorLineNumbersRef:o,editorHighlightRef:r})=>{let i=te(0),a=te(!1);return{viewScrollRatioRef:i,isSyncingScrollRef:a,handleEditorScroll:u=>{if(a.current)return;let p=u.currentTarget.scrollTop,f=Xo(u.currentTarget);i.current=f,o.current&&(o.current.scrollTop=p,r.current&&(r.current.scrollTop=p,r.current.scrollLeft=u.currentTarget.scrollLeft),n.current&&(a.current=!0,Cs(n.current,f),window.requestAnimationFrame(()=>{a.current=!1})))},handlePreviewScroll:u=>{if(a.current)return;let p=Xo(u.currentTarget);i.current=p,a.current=!0,Cs(s.current,p),Cs(o.current,p),Cs(r.current,p),window.requestAnimationFrame(()=>{a.current=!1})},handleChangeViewMode:u=>{if(u===t)return;let p=Xo(t==="preview"?n.current:s.current);i.current=p,e(u),window.requestAnimationFrame(()=>{a.current=!0,u==="preview"?Cs(n.current,p):(Cs(s.current,p),Cs(o.current,p),Cs(r.current,p)),window.requestAnimationFrame(()=>{a.current=!1})})}}};var Hy=({hasSelectedPath:t,normalizedPath:e,isDiffView:n,isSqliteFile:s,sqliteSelectedTable:o,sqliteTableOffset:r,canEditFile:i,isFolderPath:a,loading:l,saving:c,initialContent:d,isDirty:u,setContent:p,setInitialContent:f,setFileKind:g,setImageDataUrl:m,setAudioDataUrl:h,setSqliteSummary:x,setSqliteSelectedTable:b,setSqliteTableOffset:v,setSqliteTableLoading:$,setSqliteTableError:w,setSqliteTableData:S,setError:C,setIsFolderPath:_,setExternalChangeNoticeShown:k,externalChangeNoticeShown:A,viewScrollRatioRef:D,setLoading:N})=>{let z=te(""),O=te(""),M=te(!1);return L(()=>{let R=!0;return z.current="",O.current="",t?(p(""),f(""),m(""),h(""),x(null),b(""),v(0),$(!1),w(""),S(null),g("text"),C(""),_(!1),k(!1),D.current=0,n?(N(!1),z.current=e,O.current="",()=>{R=!1}):((async()=>{N(!0),C(""),_(!1);try{let E=await pd(e);if(!R)return;let U=E?.kind==="image"?"image":E?.kind==="audio"?"audio":E?.kind==="sqlite"?"sqlite":"text";if(g(U),U==="image"){m(String(E?.imageDataUrl||"")),h(""),x(null),b(""),v(0),$(!1),w(""),S(null),p(""),f(""),k(!1),D.current=0,z.current=e,O.current="";return}if(U==="audio"){h(String(E?.audioDataUrl||"")),m(""),x(null),b(""),v(0),$(!1),w(""),S(null),p(""),f(""),k(!1),D.current=0,z.current=e,O.current="";return}if(U==="sqlite"){let se=E?.sqliteSummary||null,Y=se?.objects||[],j=Y.find(J=>J?.type==="table")?.name||Y[0]?.name||"";x(se),b(j),v(0),$(!1),w(""),S(null),m(""),h(""),p(""),f(""),k(!1),D.current=0,z.current=e,O.current="";return}m(""),h(""),x(null),b(""),v(0),$(!1),w(""),S(null);let H=E.content||"",K=Xb(e);p(K||H),mn(e,!!(K&&K!==H),{dispatchEvent:se=>window.dispatchEvent(se)}),f(H),k(!1),D.current=0,z.current=e,O.current=""}catch(E){if(!R)return;g("text"),m(""),h(""),x(null),b(""),v(0),$(!1),w(""),S(null);let U=E.message||"Could not load file";if(/path is not a file/i.test(U)){p(""),f(""),_(!0),C(""),z.current=e,O.current="";return}C(U)}finally{R&&N(!1)}})(),()=>{R=!1})):(p(""),f(""),g("text"),m(""),h(""),x(null),b(""),v(0),$(!1),w(""),S(null),C(""),_(!1),D.current=0,z.current="",()=>{R=!1})},[t,e,n]),L(()=>{if(!s||!e||!o)return S(null),w(""),$(!1),()=>{};let R=!0;return(async()=>{$(!0),w("");try{let E=await bg({filePath:e,table:o,limit:ml,offset:r});if(!R)return;S(E)}catch(E){if(!R)return;w(E.message||"Could not load sqlite table")}finally{R&&$(!1)}})(),()=>{R=!1}},[s,e,o,r]),L(()=>{if(!t||a||!i||n)return()=>{};let R=async()=>{if(!(l||c)&&!M.current){M.current=!0;try{let U=(await pd(e)).content||"";if(U===d){k(!1);return}if(!u){p(U),f(U),$s(e),mn(e,!1,{dispatchEvent:H=>window.dispatchEvent(H)}),k(!1),window.dispatchEvent(new CustomEvent("alphaclaw:browse-tree-refresh"));return}A||(I("This file changed on disk. Save to overwrite or reload by re-opening.","error"),k(!0))}catch{}finally{M.current=!1}}},B=window.setInterval(R,Dy);return()=>{window.clearInterval(B)}},[t,a,i,n,l,c,e,d,u,A]),{loadedFilePathRef:z,restoredSelectionPathRef:O}};var Vy=({hasSelectedPath:t,isDiffView:e,isPreviewOnly:n,normalizedPath:s})=>{let[o,r]=y(!1),[i,a]=y(""),[l,c]=y(""),[d,u]=y({statusKind:"",isDeleted:!1});return L(()=>{let p=!0;return!t||!e||n?(r(!1),a(""),c(""),u({statusKind:"",isDeleted:!1}),()=>{p=!1}):((async()=>{r(!0),a("");try{let g=await gg(s);if(!p)return;c(String(g?.content||"")),u({statusKind:String(g?.statusKind||""),isDeleted:!!g?.isDeleted})}catch(g){if(!p)return;a(g.message||"Could not load diff"),u({statusKind:"",isDeleted:!1})}finally{p&&r(!1)}})(),()=>{p=!1})},[t,e,n,s]),{diffLoading:o,diffError:i,diffContent:l,diffStatus:d}};var jy=({loadedFilePathRef:t,normalizedPath:e,canEditFile:n,hasSelectedPath:s,loading:o,content:r,initialContent:i})=>{L(()=>{if(t.current===e&&!(!n||!s||o)){if(r===i){$s(e),mn(e,!1,{dispatchEvent:a=>window.dispatchEvent(a)});return}qa(e,r),mn(e,!0,{dispatchEvent:a=>window.dispatchEvent(a)})}},[n,s,o,r,i,e])};var zy=({canEditFile:t,isPreviewOnly:e,isDiffView:n,viewMode:s,handleSave:o})=>{L(()=>{let r=i=>{(i.metaKey||i.ctrlKey)&&!i.shiftKey&&!i.altKey&&String(i.key||"").toLowerCase()==="s"&&(!t||e||n||s!=="edit"||(i.preventDefault(),o()))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[t,e,n,s,o])};var Q2=(t,e)=>{let n=String(t||"").split(` +`),s=Math.max(0,Math.min(e-1,n.length-1)),o=0;for(let r=0;r{let r=window.getComputedStyle(e),i=Number.parseFloat(r.lineHeight||""),a=Number.isFinite(i)&&i>0?i:20,l=Math.max(0,t*a-e.clientHeight*.4);e.scrollTop=l,n.current&&(n.current.scrollTop=l),s.current&&(s.current.scrollTop=l),o.current=Xo(e)},Ky=t=>{if(!t)return;let e=t.querySelectorAll(".line-highlight-flash");for(let n of e)n.classList.remove("line-highlight-flash")},e_=(t,e,n)=>{if(!t)return;Ky(t);let s=t.querySelectorAll("[data-line-row]"),o=Math.min(n,s.length-1);for(let r=e;r<=o;r+=1){let i=s[r];i&&i.classList.add("line-highlight-flash")}},Gy=({canEditFile:t,isEditBlocked:e,loading:n,hasSelectedPath:s,normalizedPath:o,loadedFilePathRef:r,restoredSelectionPathRef:i,viewMode:a,content:l,lineTarget:c=0,lineEndTarget:d=0,editorTextareaRef:u,editorLineNumbersRef:p,editorHighlightRef:f,viewScrollRatioRef:g})=>{let m=te("");L(()=>{c&&c>=1||m.current&&(Ky(p.current),m.current="")},[c,o,p]),L(()=>{if(e||!t||n||!s)return()=>{};if(r.current!==o)return()=>{};if(a!=="edit")return()=>{};if(!c||c<1)return()=>{};let h=d&&d>=c?d:c,x=`${o}:${c}-${h}`;if(m.current===x)return()=>{};let b=0,v=0,$=()=>{let w=u.current;if(!w){v+=1,v<6&&(b=window.requestAnimationFrame($));return}let S=String(l||""),C=Q2(S,c);w.setSelectionRange(C,C);let _=c-1,k=h-1;window.requestAnimationFrame(()=>{let A=u.current;A&&(Uy({lineIndex:_,textareaElement:A,editorLineNumbersRef:p,editorHighlightRef:f,viewScrollRatioRef:g}),e_(p.current,_,k))}),m.current=x,i.current=o};return b=window.requestAnimationFrame($),()=>{b&&window.cancelAnimationFrame(b)}},[t,e,n,s,o,l,a,c,d,r,i,u,p,f,g]),L(()=>{if(e)return i.current="",()=>{};if(!t||n||!s)return()=>{};if(r.current!==o)return()=>{};if(i.current===o)return()=>{};if(a!=="edit")return()=>{};if(c&&c>=1)return()=>{};let h=By(o);if(!h)return i.current=o,()=>{};let x=0,b=0,v=()=>{let $=u.current;if(!$){b+=1,b<6&&(x=window.requestAnimationFrame(v));return}let w=String(l||"").length,S=xl(h.start,w),C=xl(h.end,w);$.focus(),$.setSelectionRange(S,Math.max(S,C)),window.requestAnimationFrame(()=>{let _=u.current;if(!_)return;let k=String(l||""),A=xl(S,k.length),D=k.slice(0,A).split(` +`).length-1;Uy({lineIndex:D,textareaElement:_,editorLineNumbersRef:p,editorHighlightRef:f,viewScrollRatioRef:g})}),i.current=o};return x=window.requestAnimationFrame(v),()=>{x&&window.cancelAnimationFrame(x)}},[t,e,n,s,o,l,a,c,r,i,u,p,f,g])};var $l=({enabled:t=!1,syncKey:e="",editorLineNumberRowRefs:n,editorHighlightLineRefs:s})=>{let o=G(()=>{if(!t)return;let r=n?.current||[],i=s?.current||[],a=Math.min(r.length,i.length);for(let l=0;l{o()},[o,e]),L(()=>{if(!t)return()=>{};let r=()=>o();return window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[t,o]),{syncEditorLineNumberHeights:o}};var qy=({filePath:t="",isPreviewOnly:e=!1,browseView:n="edit",lineTarget:s=0,lineEndTarget:o=0,onRequestClearSelection:r=()=>{},onRequestEdit:i=()=>{}})=>{let a=String(t||"").trim(),l=Xs(a),[c,d]=y(""),[u,p]=y(""),[f,g]=y("text"),[m,h]=y(""),[x,b]=y(""),[v,$]=y(null),[w,S]=y(""),[C,_]=y(0),[k,A]=y(!1),[D,N]=y(""),[z,O]=y(null),[M,R]=y(Ny),[B,E]=y(!1),[U,H]=y(!1),[K,se]=y(!1),[Y,j]=y(!1),[J,pe]=y(!1),[le,ie]=y(""),[oe,xe]=y(!1),[he,ue]=y(!1),[be,V]=y(!1),[q,ae]=y(()=>new Set),fe=te(null),ne=te(null),ve=te(null),ge=te(null),Oe=te([]),qe=te([]),Q=a.length>0,ce=f==="image",ee=f==="audio",Ee=f==="sqlite",ke=Q&&!oe&&!e&&!ce&&!ee&&!Ee,W=String(n||"edit")==="diff",{viewScrollRatioRef:re,handleEditorScroll:$e,handlePreviewScroll:we,handleChangeViewMode:Te}=Wy({viewMode:M,setViewMode:R,previewRef:ge,editorTextareaRef:ve,editorLineNumbersRef:fe,editorHighlightRef:ne}),{loadedFilePathRef:at,restoredSelectionPathRef:_r}=Hy({hasSelectedPath:Q,normalizedPath:a,isDiffView:W,isSqliteFile:Ee,sqliteSelectedTable:w,sqliteTableOffset:C,canEditFile:ke,isFolderPath:oe,loading:B,saving:K,initialContent:u,isDirty:ke&&c!==u,setLoading:E,setContent:d,setInitialContent:p,setFileKind:g,setImageDataUrl:h,setAudioDataUrl:b,setSqliteSummary:$,setSqliteSelectedTable:S,setSqliteTableOffset:_,setSqliteTableLoading:A,setSqliteTableError:N,setSqliteTableData:O,setError:ie,setIsFolderPath:xe,setExternalChangeNoticeShown:V,externalChangeNoticeShown:be,viewScrollRatioRef:re}),{diffLoading:Ar,diffError:sa,diffContent:jc,diffStatus:Mr}=Vy({hasSelectedPath:Q,isDiffView:W,isPreviewOnly:e,normalizedPath:a}),zc=F(()=>Fy(a),[a]),oa=at.current===a,Kt=oa?c:"",bo=ke&&Kt!==(oa?u:""),xo=ke&&Qn(Ys,l),Tr=ke&&!xo&&Qn(Ja,l),ra=Tr&&!q.has(l),ms=xo||ra,yo=xo||Tr,js=Q&&!oe&&!e&&!W&&!Y&&!K&&!yo,gs=F(()=>My(a),[a]),qn=gs==="markdown",vo=F(()=>yl(Kt),[Kt]),ye=F(()=>vl({contentLength:Kt.length,lineCount:vo,charThreshold:gl,lineThreshold:bl}),[Kt,vo]),yt=gs!=="plain"&&!ye,Lt=!ye,vt=F(()=>qn?du(Kt):{entries:[],body:Kt},[Kt,qn]),fn=F(()=>yt?hl(Kt,gs):[],[Kt,yt,gs]),Je=F(()=>Lt?Array.from({length:vo},(Ce,Ue)=>Ue+1):[],[vo,Lt]),Ct=F(()=>qn?Fe.parse(vt.body||"",{gfm:!0,breaks:!0}):"",[vt.body,qn]);$l({enabled:yt&&M==="edit",syncKey:`${a}:${Kt.length}:${fn.length}`,editorLineNumberRowRefs:Oe,editorHighlightLineRefs:qe}),L(()=>{!qn&&M!=="edit"&&R("edit")},[qn,M]),L(()=>{ae(new Set)},[a]),L(()=>{try{window.localStorage.setItem(Xr,M)}catch{}},[M]),L(()=>{if(!B)return H(!1),()=>{};let Ce=window.setTimeout(()=>{H(!0)},Iy);return()=>window.clearTimeout(Ce)},[B]),jy({loadedFilePathRef:at,normalizedPath:a,canEditFile:ke,hasSelectedPath:Q,loading:B,content:c,initialContent:u}),Gy({canEditFile:ke,isEditBlocked:ms,loading:B,hasSelectedPath:Q,normalizedPath:a,loadedFilePathRef:at,restoredSelectionPathRef:_r,viewMode:M,content:c,lineTarget:s,lineEndTarget:o,editorTextareaRef:ve,editorLineNumbersRef:fe,editorHighlightRef:ne,viewScrollRatioRef:re});let Gt=G(async()=>{if(!(!ke||K||!bo||ms)){se(!0),ie("");try{await dg(a,c),p(c),V(!1),$s(a),mn(a,!1,{dispatchEvent:Ce=>window.dispatchEvent(Ce)}),window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-saved",{detail:{path:a}}))}catch(Ce){let Ue=Ce.message||"Could not save file";I(Ue,"error")}finally{se(!1)}}},[ke,K,bo,ms,a,c]),$o=G(async()=>{if(js){j(!0),ie("");try{let Ce=await _a(a),Ue=String(Ce?.path||a);V(!1),$s(a),mn(a,!1,{dispatchEvent:Pr=>window.dispatchEvent(Pr)}),window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-saved",{detail:{path:Ue}})),window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-deleted",{detail:{path:Ue}})),window.dispatchEvent(new CustomEvent("alphaclaw:browse-tree-refresh")),I("File deleted","success"),r()}catch(Ce){let Ue=Ce.message||"Could not delete file";ie(Ue),/path is not a file/i.test(Ue)?(I("Only files can be deleted","warning"),r()):I(Ue,"error")}finally{j(!1)}}},[js,a,r]),zs=G(async()=>{if(!(!W||!Mr?.isDeleted||J)){pe(!0);try{let Ce=await mg(a),Ue=String(Ce?.path||a);window.dispatchEvent(new CustomEvent("alphaclaw:browse-file-saved",{detail:{path:Ue}})),window.dispatchEvent(new CustomEvent("alphaclaw:browse-tree-refresh")),I("File restored","success"),i(Ue)}catch(Ce){I(Ce.message||"Could not restore file","error")}finally{pe(!1)}}},[Mr?.isDeleted,W,a,i,J]);zy({canEditFile:ke,isPreviewOnly:e,isDiffView:W,viewMode:M,handleSave:Gt});let Lk=()=>{l&&(ae(Ce=>{let Ue=new Set(Ce);return Ue.add(l),Ue}),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{let Ce=ve.current;Ce&&(Ce.disabled||Ce.readOnly||Ce.focus())})}))},Uf=G((Ce,Ue=null)=>{!Q||!ke||(Ue&&pu(a,Ue),qa(a,Ce),mn(a,Ce!==u,{dispatchEvent:Pr=>window.dispatchEvent(Pr)}))},[Q,ke,a,u]);return{state:{hasSelectedPath:Q,isPreviewOnly:e,loading:B,saving:K,deleting:Y,restoring:J,showDelayedLoadingSpinner:U,error:le,isFolderPath:oe,isImageFile:ce,imageDataUrl:m,isAudioFile:ee,audioDataUrl:x,isSqliteFile:Ee,sqliteSummary:v,sqliteSelectedTable:w,sqliteTableOffset:C,sqliteTableLoading:k,sqliteTableError:D,sqliteTableData:z,isDiffView:W,diffLoading:Ar,diffError:sa,diffContent:jc,diffStatus:Mr,isMarkdownFile:qn,frontmatterCollapsed:he,previewHtml:Ct,viewMode:M,renderContent:Kt},derived:{pathSegments:zc,isDirty:bo,canEditFile:ke,canDeleteFile:js,isDeleteBlocked:yo,isEditBlocked:ms,isLockedFile:xo,isProtectedFile:Tr,isProtectedLocked:ra,shouldUseHighlightedEditor:yt,shouldRenderLineNumbers:Lt,parsedFrontmatter:vt,highlightedEditorLines:fn,editorLineNumbers:Je},refs:{previewRef:ge,editorLineNumbersRef:fe,editorLineNumberRowRefs:Oe,editorHighlightRef:ne,editorHighlightLineRefs:qe,editorTextareaRef:ve},actions:{setFrontmatterCollapsed:ue,setSqliteSelectedTable:S,setSqliteTableOffset:_,handleChangeViewMode:Te,handleSave:Gt,handleDiscard:()=>{!ke||!bo||K||Y||(d(u),$s(a),mn(a,!1,{dispatchEvent:Ce=>window.dispatchEvent(Ce)}),I("Changes discarded","info"))},handleDelete:$o,handleRestore:zs,handleEditProtectedFile:Lk,handleContentInput:Ce=>{if(ms||e)return;let Ue=Ce.target.value;d(Ue),Uf(Ue,{start:Ce.target.selectionStart,end:Ce.target.selectionEnd})},handleEditorKeyDown:Ce=>{if(Ce.key!=="Tab"||Ce.shiftKey||Ce.metaKey||Ce.ctrlKey||Ce.altKey||ms||e||!ke)return;let Ue=Ce.currentTarget;if(!Ue)return;Ce.preventDefault();let Pr=Number(Ue.selectionStart||0),Ek=Number(Ue.selectionEnd||0);Ue.setRangeText(" ",Pr,Ek,"end");let Kf=Ue.value;d(Kf),Uf(Kf,{start:Ue.selectionStart,end:Ue.selectionEnd})},handleEditorScroll:$e,handlePreviewScroll:we,handleEditorSelectionChange:()=>{if(!Q||!ke||B)return;let Ce=ve.current;Ce&&pu(a,{start:Ce.selectionStart,end:Ce.selectionEnd})}},context:{normalizedPath:a}}};var dn=P.bind(T),Jy=({filePath:t="",isPreviewOnly:e=!1,browseView:n="edit",lineTarget:s=0,lineEndTarget:o=0,onRequestEdit:r=()=>{},onRequestClearSelection:i=()=>{}})=>{let[a,l]=y(!1),{state:c,derived:d,refs:u,actions:p,context:f}=qy({filePath:t,isPreviewOnly:e,browseView:n,lineTarget:s,lineEndTarget:o,onRequestClearSelection:i,onRequestEdit:r});return!c.hasSelectedPath||c.isFolderPath?dn`
[ ]
Browse and edit files
Syncs to git
`:dn`
- <${uy} + <${yy} pathSegments=${d.pathSegments} isDirty=${d.isDirty} isPreviewOnly=${c.isPreviewOnly} @@ -4193,7 +4276,7 @@ ${(n||"").split(` onRequestDelete=${()=>l(!0)} onRequestRestore=${p.handleRestore} /> - <${py} + <${vy} isDiffView=${c.isDiffView} onRequestEdit=${r} normalizedPath=${f.normalizedPath} @@ -4204,7 +4287,7 @@ ${(n||"").split(` handleEditProtectedFile=${p.handleEditProtectedFile} /> ${c.isDiffView?null:dn` - <${$y} + <${Ty} isMarkdownFile=${c.isMarkdownFile} parsedFrontmatter=${d.parsedFrontmatter} frontmatterCollapsed=${c.frontmatterCollapsed} @@ -4213,10 +4296,10 @@ ${(n||"").split(` `} ${c.loading?dn`
- ${c.showDelayedLoadingSpinner?dn`<${Ce} className="h-4 w-4" />`:null} + ${c.showDelayedLoadingSpinner?dn`<${Ae} className="h-4 w-4" />`:null}
`:c.error?dn`
${c.error}
`:c.isImageFile||c.isAudioFile?dn` - <${ky} + <${Ry} isImageFile=${c.isImageFile} imageDataUrl=${c.imageDataUrl} pathSegments=${d.pathSegments} @@ -4224,7 +4307,7 @@ ${(n||"").split(` audioDataUrl=${c.audioDataUrl} /> `:c.isSqliteFile?dn` - <${dy} + <${xy} sqliteSummary=${c.sqliteSummary} sqliteSelectedTable=${c.sqliteSelectedTable} setSqliteSelectedTable=${p.setSqliteSelectedTable} @@ -4233,17 +4316,17 @@ ${(n||"").split(` sqliteTableLoading=${c.sqliteTableLoading} sqliteTableError=${c.sqliteTableError} sqliteTableData=${c.sqliteTableData} - kSqlitePageSize=${ul} + kSqlitePageSize=${ml} /> `:c.isDiffView?dn` - <${wy} + <${Py} diffLoading=${c.diffLoading} diffError=${c.diffError} diffContent=${c.diffContent} /> `:dn` ${c.isMarkdownFile?dn` - <${Cy} + <${Ey} viewMode=${c.viewMode} previewRef=${u.previewRef} handlePreviewScroll=${p.handlePreviewScroll} @@ -4284,7 +4367,7 @@ ${(n||"").split(` /> `} `} - <${st} + <${rt} visible=${a} title="Delete file?" message=${`Delete ${f.normalizedPath||"this file"}? This can be restored from diff view before sync.`} @@ -4298,9 +4381,9 @@ ${(n||"").split(` onConfirm=${async()=>{await p.handleDelete(),l(!1)}} />
- `};var z2=P.bind(T),uu=({activeBrowsePath:t="",browseView:e="edit",lineTarget:n=0,lineEndTarget:s=0,selectedBrowsePath:o="",onNavigateToBrowseFile:r=()=>{},onEditSelectedBrowseFile:i=()=>{},onClearSelection:a=()=>{}})=>z2` + `};var t_=P.bind(T),fu=({activeBrowsePath:t="",browseView:e="edit",lineTarget:n=0,lineEndTarget:s=0,selectedBrowsePath:o="",onNavigateToBrowseFile:r=()=>{},onEditSelectedBrowseFile:i=()=>{},onClearSelection:a=()=>{}})=>t_`
- <${Wy} + <${Jy} filePath=${t} isPreviewOnly=${!1} browseView=${e} @@ -4310,7 +4393,7 @@ ${(n||"").split(` onRequestClearSelection=${a} />
-`;var ws="__all__",U2={0:"Sun",1:"Mon",2:"Tue",3:"Wed",4:"Thu",5:"Fri",6:"Sat",7:"Sun"},K2=({hourField:t,minuteField:e})=>{let n=Number.parseInt(String(t||""),10),s=Number.parseInt(String(e||""),10);if(!Number.isFinite(n)||!Number.isFinite(s))return"";let o=(n%24+24)%24,r=o>=12?"pm":"am",i=o%12===0?12:o%12,a=String(s).padStart(2,"0");return`${i}:${a}${r}`},Vy=t=>{let e=Number.parseInt(String(t||""),10);if(!Number.isFinite(e))return"";let n=(e%24+24)%24,s=n>=12?"pm":"am";return`${n%12===0?12:n%12}${s}`},G2=(t="")=>{let e=String(t||"").match(/^(\d{1,2})-(\d{1,2})$/);if(!e)return"";let n=Vy(e[1]),s=Vy(e[2]);return!n||!s?"":`${n}-${s}`},jy=(t="")=>{let e=String(t||"").trim().split(/\s+/);if(e.length<5)return"";let[n,s,o,r,i]=e;if(o==="*"&&r==="*"&&i==="*"&&s==="*"&&/^\*\/\d+$/.test(n))return`Every ${n.slice(2)}m`;if(o==="*"&&r==="*"&&i==="*"&&n==="0"&&/^\*\/\d+$/.test(s))return`Every ${s.slice(2)}h`;let a=K2({hourField:s,minuteField:n});if(o==="*"&&r==="*"&&i==="1-5"&&/^\*\/\d+$/.test(n)&&/^\d{1,2}-\d{1,2}$/.test(s)){let l=n.slice(2),c=G2(s);if(c)return`Every ${l}m, ${c} weekdays`}if(o==="*"&&r==="*"&&i==="1-5"&&a)return`Weekdays at ${a}`;if(o==="*"&&r==="*"&&/^([0-7])(,[0-7])*$/.test(i)&&a)return`Every ${i.split(",").map(c=>U2[c]||c).join(", ")} at ${a}`;if(o==="*"&&r==="*"&&i==="*"&&a)return`Daily at ${a}`;if(/^\d{1,2}$/.test(o)&&r==="*"&&i==="*"&&a){let l=Number.parseInt(o,10);if(Number.isFinite(l)&&l>=1&&l<=31)return`Monthly on day ${l} at ${a}`}return""},zy=(t="")=>String(t||"").trim().toLowerCase(),q2=()=>{try{return Intl?.DateTimeFormat?.().resolvedOptions?.().timeZone||""}catch{return""}},Uy=({scheduleTimeZone:t="",includeTimeZone:e=!1,includeTimeZoneWhenDifferent:n=!1,clientTimeZone:s=""})=>{let o=zy(t);if(!o)return!1;if(e)return!0;if(!n)return!1;let r=zy(s||q2());return r?r!==o:!0},Qo=(t={},{includeTimeZone:e=!1,includeTimeZoneWhenDifferent:n=!1,clientTimeZone:s=""}={})=>{let o=String(t?.kind||"").trim();if(o==="every"){let i=Number(t?.everyMs||0);return i>0?`Every ${bn(i)}`:"Every interval"}if(o==="at")return`At ${Yn(t?.at,{fallback:"scheduled time"})}`;if(o==="cron"){let i=String(t?.expr||"").trim();if(!i)return"Cron";let a=jy(i),l=String(t?.tz||"").trim(),c=Uy({scheduleTimeZone:l,includeTimeZone:e,includeTimeZoneWhenDifferent:n,clientTimeZone:s});return a?c?`${a} (${l})`:a:c?`${i} (${l})`:i}let r=String(t?.expr||t?.cron||t?.cronExpr||"").trim();if(r){let i=jy(r),a=String(t?.tz||t?.timezone||"").trim(),l=Uy({scheduleTimeZone:a,includeTimeZone:e,includeTimeZoneWhenDifferent:n,clientTimeZone:s});return i?l?`${i} (${a})`:i:l?`${r} (${a})`:r}return"Unknown schedule"},J2=(t,e=Date.now())=>{let n=Number(t||0);if(!Number.isFinite(n)||n<=0)return"\u2014";let s=n-e,o=s>0,r=Math.round(Math.abs(s)/1e3);if(r<60)return o?"in <1m":"just now";let i=Math.round(r/60);if(i<60)return o?`in ${i}m`:`${i}m ago`;let a=Math.round(i/60);if(a<24)return o?`in ${a}h`:`${a}h ago`;let l=Math.round(a/24);return o?`in ${l}d`:`${l}d ago`},Ky=(t,e=Date.now())=>{let n=Number(t||0);if(!Number.isFinite(n)||n<=0)return"\u2014";let s=Math.abs(n-e),o=Math.max(0,Math.round(s/1e3));if(o<60)return`${o}s`;let r=Math.round(o/60);if(r<60)return`${r}m`;let i=Math.round(r/60);if(i<24)return`${i}h`;let a=Math.round(i/24);return a<30?`${a}d`:`${Math.round(a/30)}mo`},Gy=(t,e=Date.now())=>{let n=Number(t||0);if(!Number.isFinite(n)||n<=0)return"\u2014";if(n>=e)return J2(n,e);let s=e-n;if(s<60*1e3)return"due now";let o=Math.round(s/1e3);if(o<60)return"overdue by <1m";let r=Math.round(o/60);if(r<60)return`overdue by ${r}m`;let i=Math.round(r/60);return i<24?`overdue by ${i}h`:`overdue by ${Math.round(i/24)}d`},qy=(t={})=>{if(t.enabled===!1)return"disabled";if(t?.state?.runningAtMs)return"running";let e=String(t?.state?.lastStatus||t?.state?.lastRunStatus||"").trim().toLowerCase();return e==="error"?"error":e==="ok"?"ok":"unknown"},Jy=(t="")=>t==="ok"?"bg-green-500":t==="error"?"bg-red-500":t==="running"?"bg-yellow-400":"bg-gray-500",Te=t=>Jt(Number(t||0)),it=t=>gn(Number(t||0)),rn=(t={})=>{let e=t?.usage||{},s=[e?.input_tokens,e?.inputTokens,e?.output_tokens,e?.outputTokens,e?.cache_read_tokens,e?.cacheReadTokens,e?.cache_write_tokens,e?.cacheWriteTokens].reduce((r,i)=>{let a=Number(i);return!Number.isFinite(a)||a<0?r:r+a},0);if(s>0)return s;let o=[e?.total_tokens,e?.totalTokens,t?.total_tokens,t?.totalTokens];for(let r of o){let i=Number(r);if(Number.isFinite(i)&&i>=0)return i}return 0},$n=(t={})=>{let e=t?.usage||{},n=[t?.estimatedCost,t?.estimated_cost,e?.estimatedCost,e?.estimated_cost,e?.totalCost,e?.total_cost,e?.costUsd,e?.cost];for(let s of n){let o=Number(s);if(Number.isFinite(o)&&o>=0)return o}return null},Z2=(t={})=>{let e=t?.state||{};try{return String(JSON.stringify(e)||"").toUpperCase().includes("HEARTBEAT_OK")}catch{return!1}},Y2=({jobId:t="",bulkRunsByJobId:e={}}={})=>{let n=String(t||"").trim();if(!n)return!1;let s=Array.isArray(e?.[n]?.entries)?e[n].entries:[];if(s.length===0)return!1;let o=s.reduce((i,a)=>Number(a?.ts||0)>Number(i?.ts||0)?a:i);return[o?.summary,o?.result?.summary,o?.payload?.summary].some(i=>String(i||"").toUpperCase().includes("HEARTBEAT_OK"))},X2=({job:t={},jobId:e="",bulkRunsByJobId:n={}}={})=>{let s=String(e||"").trim(),o=Array.isArray(n?.[s]?.entries)?n[s].entries:[],r=o.length>0?o.reduce((a,l)=>Number(l?.ts||0)>Number(a?.ts||0)?l:a):null;return String(r?.status||t?.state?.lastStatus||t?.state?.lastRunStatus||"").trim().toLowerCase()},Zy=(t=[],e={})=>{let n=[];return t.forEach(s=>{let o=String(s?.id||""),r=String(s?.payload?.message||"").toLowerCase();String(s?.delivery?.mode||"").toLowerCase()==="none"&&(r.includes("message tool")||r.includes("send to telegram"))&&n.push({tone:"warning",jobId:String(s?.id||""),title:`${s.name||s.id}: delivery mismatch`,body:"Job uses delivery.mode=none but prompt asks to send via message tool."}),Number(s?.state?.consecutiveErrors||0)>=2&&n.push({tone:"error",jobId:String(s?.id||""),title:`${s.name||s.id}: repeated errors`,body:`Consecutive errors: ${Number(s?.state?.consecutiveErrors||0)}.`});let a=X2({job:s,jobId:o,bulkRunsByJobId:e});s?.state?.lastDelivered===!1&&String(s?.state?.lastDeliveryStatus||"").trim().toLowerCase()==="not-delivered"&&a!=="ok"&&!Z2(s)&&!Y2({jobId:o,bulkRunsByJobId:e})&&n.push({tone:"warning",jobId:o,title:`${s.name||s.id}: not delivered`,body:"Latest run completed but was not delivered."})}),n.slice(0,8)},Yy=(t=[])=>t.filter(n=>n?.enabled!==!1).map(n=>Number(n?.state?.nextRunAtMs||0)).filter(n=>Number.isFinite(n)&&n>0).sort((n,s)=>n-s)[0]||null;var xl=P.bind(T),Q2=["daily","weekly","monthly","other"],e_={daily:"Daily",weekly:"Weekly",monthly:"Monthly",other:"Other"},t_=60,es=(t="")=>{let e=Number.parseInt(String(t||"").trim(),10);return Number.isFinite(e)?e:null},er=t=>{if(!Number.isFinite(t))return null;let e=t===7?0:t;return e>=0&&e<=6?e:null},n_=(t="")=>{let e=String(t||"").trim().toLowerCase();if(!e||e==="*")return null;let n=e.split(",").map(o=>o.trim()).filter(Boolean),s=[];return n.forEach(o=>{let r=o.match(/^(\d{1,2})-(\d{1,2})$/);if(r){let a=er(es(r[1])),l=er(es(r[2]));if(a==null||l==null)return;if(a<=l)for(let c=a;c<=l;c+=1)s.push(c);else{for(let c=a;c<=6;c+=1)s.push(c);for(let c=0;c<=l;c+=1)s.push(c)}return}let i=er(es(o));i!=null&&s.push(i)}),s.length===0?null:Math.min(...s)},s_=(t="")=>{let e=String(t||"").trim().toLowerCase();if(!e||e==="*")return[];let n=e.split(",").map(o=>o.trim()).filter(Boolean),s=new Set;return n.forEach(o=>{let r=o.match(/^(\d{1,2})-(\d{1,2})$/);if(r){let a=er(es(r[1])),l=er(es(r[2]));if(a==null||l==null)return;if(a<=l)for(let c=a;c<=l;c+=1)s.add(c);else{for(let c=a;c<=6;c+=1)s.add(c);for(let c=0;c<=l;c+=1)s.add(c)}return}let i=er(es(o));i!=null&&s.add(i)}),[...s].sort((o,r)=>o-r)},Qy=(t="")=>{let e=s_(t);return e.length!==5?!1:e.join(",")==="1,2,3,4,5"},o_=({minuteField:t="",hourField:e=""})=>{let n=es(t),s=es(e);return n==null||s==null||n<0||n>59||s<0||s>23?null:s*t_+n},r_=(t={})=>{let n=String(t?.expr||t?.cron||t?.cronExpr||"").trim().split(/\s+/);if(n.length<5)return null;let[s,o,r,i,a]=n;return{minuteField:s,hourField:o,dayOfMonthField:r,monthField:i,dayOfWeekField:a}},Xy=(t={},e="other")=>{let n=t?.schedule||{},s=String(n?.kind||"").trim().toLowerCase(),o=r_(n),r=o?o_({minuteField:o.minuteField,hourField:o.hourField}):null,i=String(t?.name||t?.id||"").toLowerCase();if(e==="daily"){if(s==="every"){let a=Number(n?.everyMs||Number.MAX_SAFE_INTEGER);return{groupRank:0,primary:Number.isFinite(a)?a:Number.MAX_SAFE_INTEGER,secondary:i}}if(o&&o.dayOfMonthField==="*"&&o.monthField==="*"&&o.dayOfWeekField==="*"&&r!=null)return{groupRank:1,primary:r,secondary:i};if(o&&o.dayOfMonthField==="*"&&o.monthField==="*"&&Qy(o.dayOfWeekField)&&r!=null)return{groupRank:2,primary:r,secondary:i}}if(e==="weekly"&&o){let a=n_(o.dayOfWeekField);return{groupRank:0,primary:a??Number.MAX_SAFE_INTEGER,secondary:r??Number.MAX_SAFE_INTEGER,tertiary:i}}if(e==="monthly"&&o){let a=es(o.dayOfMonthField);return{groupRank:0,primary:a??Number.MAX_SAFE_INTEGER,secondary:r??Number.MAX_SAFE_INTEGER,tertiary:i}}return{groupRank:99,primary:Number.MAX_SAFE_INTEGER,secondary:Number.MAX_SAFE_INTEGER,tertiary:i}},yl=(t,e)=>t===e?0:t>e?1:-1,vl=(t=[],e="other")=>[...t].sort((n,s)=>{let o=Xy(n,e),r=Xy(s,e),i=yl(o.groupRank,r.groupRank);if(i!==0)return i;let a=yl(o.primary,r.primary);if(a!==0)return a;let l=yl(o.secondary,r.secondary);return l!==0?l:yl(o.tertiary,r.tertiary)}),i_=(t={})=>{if(String(t?.kind||"").trim().toLowerCase()==="every"){let o=Number(t?.everyMs||0);if(Number.isFinite(o)&&o>0){if(o<=1440*60*1e3)return"daily";if(o<=10080*60*1e3)return"weekly";if(o<=744*60*60*1e3)return"monthly"}return"other"}let s=String(t?.expr||t?.cron||t?.cronExpr||"").trim().split(/\s+/);if(s.length>=5){let[,,o,r,i]=s;if(o==="*"&&r==="*"&&i==="*")return"daily";if(o==="*"&&r==="*"&&i!=="*")return Qy(i)?"daily":"weekly";if(o!=="*"&&r==="*")return"monthly"}return"other"},ev=({jobs:t=[],selectedRouteKey:e=ws,onSelectAllJobs:n=()=>{},onSelectJob:s=()=>{}})=>{let o=ee(null),[r,i]=y("");L(()=>{let d=window.requestAnimationFrame(()=>{o.current?.focus()});return()=>{window.cancelAnimationFrame(d)}},[]);let a=String(r||"").trim().toLowerCase(),l=F(()=>a?t.filter(d=>{let u=String(d?.name||"").toLowerCase(),p=String(d?.id||"").toLowerCase();return u.includes(a)||p.includes(a)}):t,[t,a]),c=F(()=>{let d={daily:[],weekly:[],monthly:[],other:[]};return l.forEach(u=>{let p=i_(u?.schedule);d[p]?d[p].push(u):d.other.push(u)}),{daily:vl(d.daily,"daily"),weekly:vl(d.weekly,"weekly"),monthly:vl(d.monthly,"monthly"),other:vl(d.other,"other")}},[l]);return xl` +`;var _s="__all__",n_={0:"Sun",1:"Mon",2:"Tue",3:"Wed",4:"Thu",5:"Fri",6:"Sat",7:"Sun"},s_=({hourField:t,minuteField:e})=>{let n=Number.parseInt(String(t||""),10),s=Number.parseInt(String(e||""),10);if(!Number.isFinite(n)||!Number.isFinite(s))return"";let o=(n%24+24)%24,r=o>=12?"pm":"am",i=o%12===0?12:o%12,a=String(s).padStart(2,"0");return`${i}:${a}${r}`},Zy=t=>{let e=Number.parseInt(String(t||""),10);if(!Number.isFinite(e))return"";let n=(e%24+24)%24,s=n>=12?"pm":"am";return`${n%12===0?12:n%12}${s}`},o_=(t="")=>{let e=String(t||"").match(/^(\d{1,2})-(\d{1,2})$/);if(!e)return"";let n=Zy(e[1]),s=Zy(e[2]);return!n||!s?"":`${n}-${s}`},Yy=(t="")=>{let e=String(t||"").trim().split(/\s+/);if(e.length<5)return"";let[n,s,o,r,i]=e;if(o==="*"&&r==="*"&&i==="*"&&s==="*"&&/^\*\/\d+$/.test(n))return`Every ${n.slice(2)}m`;if(o==="*"&&r==="*"&&i==="*"&&n==="0"&&/^\*\/\d+$/.test(s))return`Every ${s.slice(2)}h`;let a=s_({hourField:s,minuteField:n});if(o==="*"&&r==="*"&&i==="1-5"&&/^\*\/\d+$/.test(n)&&/^\d{1,2}-\d{1,2}$/.test(s)){let l=n.slice(2),c=o_(s);if(c)return`Every ${l}m, ${c} weekdays`}if(o==="*"&&r==="*"&&i==="1-5"&&a)return`Weekdays at ${a}`;if(o==="*"&&r==="*"&&/^([0-7])(,[0-7])*$/.test(i)&&a)return`Every ${i.split(",").map(c=>n_[c]||c).join(", ")} at ${a}`;if(o==="*"&&r==="*"&&i==="*"&&a)return`Daily at ${a}`;if(/^\d{1,2}$/.test(o)&&r==="*"&&i==="*"&&a){let l=Number.parseInt(o,10);if(Number.isFinite(l)&&l>=1&&l<=31)return`Monthly on day ${l} at ${a}`}return""},Xy=(t="")=>String(t||"").trim().toLowerCase(),r_=()=>{try{return Intl?.DateTimeFormat?.().resolvedOptions?.().timeZone||""}catch{return""}},Qy=({scheduleTimeZone:t="",includeTimeZone:e=!1,includeTimeZoneWhenDifferent:n=!1,clientTimeZone:s=""})=>{let o=Xy(t);if(!o)return!1;if(e)return!0;if(!n)return!1;let r=Xy(s||r_());return r?r!==o:!0},Qo=(t={},{includeTimeZone:e=!1,includeTimeZoneWhenDifferent:n=!1,clientTimeZone:s=""}={})=>{let o=String(t?.kind||"").trim();if(o==="every"){let i=Number(t?.everyMs||0);return i>0?`Every ${bn(i)}`:"Every interval"}if(o==="at")return`At ${es(t?.at,{fallback:"scheduled time"})}`;if(o==="cron"){let i=String(t?.expr||"").trim();if(!i)return"Cron";let a=Yy(i),l=String(t?.tz||"").trim(),c=Qy({scheduleTimeZone:l,includeTimeZone:e,includeTimeZoneWhenDifferent:n,clientTimeZone:s});return a?c?`${a} (${l})`:a:c?`${i} (${l})`:i}let r=String(t?.expr||t?.cron||t?.cronExpr||"").trim();if(r){let i=Yy(r),a=String(t?.tz||t?.timezone||"").trim(),l=Qy({scheduleTimeZone:a,includeTimeZone:e,includeTimeZoneWhenDifferent:n,clientTimeZone:s});return i?l?`${i} (${a})`:i:l?`${r} (${a})`:r}return"Unknown schedule"},i_=(t,e=Date.now())=>{let n=Number(t||0);if(!Number.isFinite(n)||n<=0)return"\u2014";let s=n-e,o=s>0,r=Math.round(Math.abs(s)/1e3);if(r<60)return o?"in <1m":"just now";let i=Math.round(r/60);if(i<60)return o?`in ${i}m`:`${i}m ago`;let a=Math.round(i/60);if(a<24)return o?`in ${a}h`:`${a}h ago`;let l=Math.round(a/24);return o?`in ${l}d`:`${l}d ago`},ev=(t,e=Date.now())=>{let n=Number(t||0);if(!Number.isFinite(n)||n<=0)return"\u2014";let s=Math.abs(n-e),o=Math.max(0,Math.round(s/1e3));if(o<60)return`${o}s`;let r=Math.round(o/60);if(r<60)return`${r}m`;let i=Math.round(r/60);if(i<24)return`${i}h`;let a=Math.round(i/24);return a<30?`${a}d`:`${Math.round(a/30)}mo`},tv=(t,e=Date.now())=>{let n=Number(t||0);if(!Number.isFinite(n)||n<=0)return"\u2014";if(n>=e)return i_(n,e);let s=e-n;if(s<60*1e3)return"due now";let o=Math.round(s/1e3);if(o<60)return"overdue by <1m";let r=Math.round(o/60);if(r<60)return`overdue by ${r}m`;let i=Math.round(r/60);return i<24?`overdue by ${i}h`:`overdue by ${Math.round(i/24)}d`},nv=(t={})=>{if(t.enabled===!1)return"disabled";if(t?.state?.runningAtMs)return"running";let e=String(t?.state?.lastStatus||t?.state?.lastRunStatus||"").trim().toLowerCase();return e==="error"?"error":e==="ok"?"ok":"unknown"},sv=(t="")=>t==="ok"?"bg-green-500":t==="error"?"bg-red-500":t==="running"?"bg-yellow-400":"bg-gray-500",Ne=t=>Zt(Number(t||0)),ct=t=>gn(Number(t||0)),rn=(t={})=>{let e=t?.usage||{},s=[e?.input_tokens,e?.inputTokens,e?.output_tokens,e?.outputTokens,e?.cache_read_tokens,e?.cacheReadTokens,e?.cache_write_tokens,e?.cacheWriteTokens].reduce((r,i)=>{let a=Number(i);return!Number.isFinite(a)||a<0?r:r+a},0);if(s>0)return s;let o=[e?.total_tokens,e?.totalTokens,t?.total_tokens,t?.totalTokens];for(let r of o){let i=Number(r);if(Number.isFinite(i)&&i>=0)return i}return 0},$n=(t={})=>{let e=t?.usage||{},n=[t?.estimatedCost,t?.estimated_cost,e?.estimatedCost,e?.estimated_cost,e?.totalCost,e?.total_cost,e?.costUsd,e?.cost];for(let s of n){let o=Number(s);if(Number.isFinite(o)&&o>=0)return o}return null},a_=(t={})=>{let e=t?.state||{};try{return String(JSON.stringify(e)||"").toUpperCase().includes("HEARTBEAT_OK")}catch{return!1}},l_=({jobId:t="",bulkRunsByJobId:e={}}={})=>{let n=String(t||"").trim();if(!n)return!1;let s=Array.isArray(e?.[n]?.entries)?e[n].entries:[];if(s.length===0)return!1;let o=s.reduce((i,a)=>Number(a?.ts||0)>Number(i?.ts||0)?a:i);return[o?.summary,o?.result?.summary,o?.payload?.summary].some(i=>String(i||"").toUpperCase().includes("HEARTBEAT_OK"))},c_=({job:t={},jobId:e="",bulkRunsByJobId:n={}}={})=>{let s=String(e||"").trim(),o=Array.isArray(n?.[s]?.entries)?n[s].entries:[],r=o.length>0?o.reduce((a,l)=>Number(l?.ts||0)>Number(a?.ts||0)?l:a):null;return String(r?.status||t?.state?.lastStatus||t?.state?.lastRunStatus||"").trim().toLowerCase()},ov=(t=[],e={})=>{let n=[];return t.forEach(s=>{let o=String(s?.id||""),r=String(s?.payload?.message||"").toLowerCase();String(s?.delivery?.mode||"").toLowerCase()==="none"&&(r.includes("message tool")||r.includes("send to telegram"))&&n.push({tone:"warning",jobId:String(s?.id||""),title:`${s.name||s.id}: delivery mismatch`,body:"Job uses delivery.mode=none but prompt asks to send via message tool."}),Number(s?.state?.consecutiveErrors||0)>=2&&n.push({tone:"error",jobId:String(s?.id||""),title:`${s.name||s.id}: repeated errors`,body:`Consecutive errors: ${Number(s?.state?.consecutiveErrors||0)}.`});let a=c_({job:s,jobId:o,bulkRunsByJobId:e});s?.state?.lastDelivered===!1&&String(s?.state?.lastDeliveryStatus||"").trim().toLowerCase()==="not-delivered"&&a!=="ok"&&!a_(s)&&!l_({jobId:o,bulkRunsByJobId:e})&&n.push({tone:"warning",jobId:o,title:`${s.name||s.id}: not delivered`,body:"Latest run completed but was not delivered."})}),n.slice(0,8)},rv=(t=[])=>t.filter(n=>n?.enabled!==!1).map(n=>Number(n?.state?.nextRunAtMs||0)).filter(n=>Number.isFinite(n)&&n>0).sort((n,s)=>n-s)[0]||null;var wl=P.bind(T),d_=["daily","weekly","monthly","other"],u_={daily:"Daily",weekly:"Weekly",monthly:"Monthly",other:"Other"},p_=60,ss=(t="")=>{let e=Number.parseInt(String(t||"").trim(),10);return Number.isFinite(e)?e:null},er=t=>{if(!Number.isFinite(t))return null;let e=t===7?0:t;return e>=0&&e<=6?e:null},f_=(t="")=>{let e=String(t||"").trim().toLowerCase();if(!e||e==="*")return null;let n=e.split(",").map(o=>o.trim()).filter(Boolean),s=[];return n.forEach(o=>{let r=o.match(/^(\d{1,2})-(\d{1,2})$/);if(r){let a=er(ss(r[1])),l=er(ss(r[2]));if(a==null||l==null)return;if(a<=l)for(let c=a;c<=l;c+=1)s.push(c);else{for(let c=a;c<=6;c+=1)s.push(c);for(let c=0;c<=l;c+=1)s.push(c)}return}let i=er(ss(o));i!=null&&s.push(i)}),s.length===0?null:Math.min(...s)},h_=(t="")=>{let e=String(t||"").trim().toLowerCase();if(!e||e==="*")return[];let n=e.split(",").map(o=>o.trim()).filter(Boolean),s=new Set;return n.forEach(o=>{let r=o.match(/^(\d{1,2})-(\d{1,2})$/);if(r){let a=er(ss(r[1])),l=er(ss(r[2]));if(a==null||l==null)return;if(a<=l)for(let c=a;c<=l;c+=1)s.add(c);else{for(let c=a;c<=6;c+=1)s.add(c);for(let c=0;c<=l;c+=1)s.add(c)}return}let i=er(ss(o));i!=null&&s.add(i)}),[...s].sort((o,r)=>o-r)},av=(t="")=>{let e=h_(t);return e.length!==5?!1:e.join(",")==="1,2,3,4,5"},m_=({minuteField:t="",hourField:e=""})=>{let n=ss(t),s=ss(e);return n==null||s==null||n<0||n>59||s<0||s>23?null:s*p_+n},g_=(t={})=>{let n=String(t?.expr||t?.cron||t?.cronExpr||"").trim().split(/\s+/);if(n.length<5)return null;let[s,o,r,i,a]=n;return{minuteField:s,hourField:o,dayOfMonthField:r,monthField:i,dayOfWeekField:a}},iv=(t={},e="other")=>{let n=t?.schedule||{},s=String(n?.kind||"").trim().toLowerCase(),o=g_(n),r=o?m_({minuteField:o.minuteField,hourField:o.hourField}):null,i=String(t?.name||t?.id||"").toLowerCase();if(e==="daily"){if(s==="every"){let a=Number(n?.everyMs||Number.MAX_SAFE_INTEGER);return{groupRank:0,primary:Number.isFinite(a)?a:Number.MAX_SAFE_INTEGER,secondary:i}}if(o&&o.dayOfMonthField==="*"&&o.monthField==="*"&&o.dayOfWeekField==="*"&&r!=null)return{groupRank:1,primary:r,secondary:i};if(o&&o.dayOfMonthField==="*"&&o.monthField==="*"&&av(o.dayOfWeekField)&&r!=null)return{groupRank:2,primary:r,secondary:i}}if(e==="weekly"&&o){let a=f_(o.dayOfWeekField);return{groupRank:0,primary:a??Number.MAX_SAFE_INTEGER,secondary:r??Number.MAX_SAFE_INTEGER,tertiary:i}}if(e==="monthly"&&o){let a=ss(o.dayOfMonthField);return{groupRank:0,primary:a??Number.MAX_SAFE_INTEGER,secondary:r??Number.MAX_SAFE_INTEGER,tertiary:i}}return{groupRank:99,primary:Number.MAX_SAFE_INTEGER,secondary:Number.MAX_SAFE_INTEGER,tertiary:i}},kl=(t,e)=>t===e?0:t>e?1:-1,Sl=(t=[],e="other")=>[...t].sort((n,s)=>{let o=iv(n,e),r=iv(s,e),i=kl(o.groupRank,r.groupRank);if(i!==0)return i;let a=kl(o.primary,r.primary);if(a!==0)return a;let l=kl(o.secondary,r.secondary);return l!==0?l:kl(o.tertiary,r.tertiary)}),b_=(t={})=>{if(String(t?.kind||"").trim().toLowerCase()==="every"){let o=Number(t?.everyMs||0);if(Number.isFinite(o)&&o>0){if(o<=1440*60*1e3)return"daily";if(o<=10080*60*1e3)return"weekly";if(o<=744*60*60*1e3)return"monthly"}return"other"}let s=String(t?.expr||t?.cron||t?.cronExpr||"").trim().split(/\s+/);if(s.length>=5){let[,,o,r,i]=s;if(o==="*"&&r==="*"&&i==="*")return"daily";if(o==="*"&&r==="*"&&i!=="*")return av(i)?"daily":"weekly";if(o!=="*"&&r==="*")return"monthly"}return"other"},lv=({jobs:t=[],selectedRouteKey:e=_s,onSelectAllJobs:n=()=>{},onSelectJob:s=()=>{}})=>{let o=te(null),[r,i]=y("");L(()=>{let d=window.requestAnimationFrame(()=>{o.current?.focus()});return()=>{window.cancelAnimationFrame(d)}},[]);let a=String(r||"").trim().toLowerCase(),l=F(()=>a?t.filter(d=>{let u=String(d?.name||"").toLowerCase(),p=String(d?.id||"").toLowerCase();return u.includes(a)||p.includes(a)}):t,[t,a]),c=F(()=>{let d={daily:[],weekly:[],monthly:[],other:[]};return l.forEach(u=>{let p=b_(u?.schedule);d[p]?d[p].push(u):d.other.push(u)}),{daily:Sl(d.daily,"daily"),weekly:Sl(d.weekly,"weekly"),monthly:Sl(d.monthly,"monthly"),other:Sl(d.other,"other")}},[l]);return wl`
- ${s.length>0?_t` + ${s.length>0?Mt`
- ${s.map((l,c)=>m0({row:{type:"entry",entry:l},rowIndex:`${e}:${c}`,variant:"overview",onSelectJob:n,showOpenJobButton:!1,itemClassName:"ac-history-item ac-history-item-flat border-b border-border rounded-none"}))} + ${s.map((l,c)=>kw({row:{type:"entry",entry:l},rowIndex:`${e}:${c}`,variant:"overview",onSelectJob:n,showOpenJobButton:!1,itemClassName:"ac-history-item ac-history-item-flat border-b border-border rounded-none"}))}
`:null} - ${t?.jobId?_t` + ${t?.jobId?Mt`
- `},m0=({row:t,rowIndex:e,variant:n="overview",onSelectJob:s=()=>{},showOpenJobButton:o=!1,itemClassName:r="ac-history-item"})=>{let i=t?.entry||t||{},a=i?.usage||{},l=Number(a?.input_tokens??a?.inputTokens??0),c=Number(a?.output_tokens??a?.outputTokens??0),d=rn(i),u=$n(i);return _t` + `},kw=({row:t,rowIndex:e,variant:n="overview",onSelectJob:s=()=>{},showOpenJobButton:o=!1,itemClassName:r="ac-history-item"})=>{let i=t?.entry||t||{},a=i?.usage||{},l=Number(a?.input_tokens??a?.inputTokens??0),c=Number(a?.output_tokens??a?.outputTokens??0),d=rn(i),u=$n(i);return Mt`
{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d
- ${ZT({runEntry:i,variant:n})} + ${aP({runEntry:i,variant:n})}
- ${i.summary?_t`
+ ${i.summary?Mt`
Summary: ${i.summary}
`:null} - ${i.error?_t`
+ ${i.error?Mt`
Error: ${i.error}
`:null}
@@ -4559,27 +4642,27 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d
Tokens in: ${Te(l)}${Ne(l)}
Tokens out: ${Te(c)}${Ne(c)}
Total tokens: - ${Te(d)} + ${Ne(d)}
Total cost: - ${u==null?"\u2014":`~${it(u)}`} + ${u==null?"\u2014":`~${ct(u)}`}
- ${o&&i?.jobId?_t` + ${o&&i?.jobId?Mt`
- `},ic=({entryCountLabel:t="",primaryFilterOptions:e=[],primaryFilterValue:n="all",onChangePrimaryFilter:s=()=>{},secondaryFilterOptions:o=[],secondaryFilterValue:r="all",onChangeSecondaryFilter:i=()=>{},activeFilterLabel:a="",onClearActiveFilter:l=()=>{},rows:c=[],emptyText:d="No runs found.",variant:u="overview",onSelectJob:p=()=>{},showOpenJobButton:f=!1,footer:g=null})=>_t` + `},dc=({entryCountLabel:t="",primaryFilterOptions:e=[],primaryFilterValue:n="all",onChangePrimaryFilter:s=()=>{},secondaryFilterOptions:o=[],secondaryFilterValue:r="all",onChangeSecondaryFilter:i=()=>{},activeFilterLabel:a="",onClearActiveFilter:l=()=>{},rows:c=[],emptyText:d="No runs found.",variant:u="overview",onSelectJob:p=()=>{},showOpenJobButton:f=!1,footer:g=null})=>Mt`
@@ -4600,13 +4683,13 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d
${t}
- <${Xe} + <${nt} options=${e} value=${n} onChange=${s} /> - ${Array.isArray(o)&&o.length>0?_t` - <${Xe} + ${Array.isArray(o)&&o.length>0?Mt` + <${nt} options=${o} value=${r} onChange=${i} @@ -4614,7 +4697,7 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d `:null}
- ${a?_t` + ${a?Mt`
{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d
`:null} - ${c.length===0?_t`
${d}
`:_t` + ${c.length===0?Mt`
${d}
`:Mt`
- ${c.map((m,h)=>m?.type==="collapsed-group"?XT({row:m,rowIndex:h,onSelectJob:p}):m0({row:m,rowIndex:h,variant:u,onSelectJob:p,showOpenJobButton:f}))} + ${c.map((m,h)=>m?.type==="collapsed-group"?cP({row:m,rowIndex:h,onSelectJob:p}):kw({row:m,rowIndex:h,variant:u,onSelectJob:p,showOpenJobButton:f}))}
`} ${g}
-`;var g0=P.bind(T),b0="cronPromptEditorHeightPx",QT=280,eP=180,x0=t=>{let e=Number(t),n=Number.isFinite(e)?Math.round(e):QT;return Math.max(eP,n)},tP=t=>{if(!t)return 0;let e=Number.parseFloat(window.getComputedStyle(t).height||"0");return Number.isFinite(e)?e:0},y0=({promptValue:t="",savedPromptValue:e="",onChangePrompt:n=()=>{},onSaveChanges:s=()=>{}})=>{let o=ee(null),r=ee(null),i=ee(null),a=ee([]),l=ee(null),c=ee([]),[d,u]=y(()=>{let w=Fe();return x0(w?.[b0])}),p=ml(t),f=!gl({contentLength:t.length,lineCount:p,charThreshold:pl,lineThreshold:fl}),g=F(()=>f?dl(t,"markdown"):[],[t,f]),m=Math.max(p,Array.isArray(g)?g.length:0),h=F(()=>Array.from({length:m},(w,$)=>$+1),[m]),b=t!==e;bl({enabled:f,syncKey:`${t.length}:${g.length}`,editorLineNumberRowRefs:a,editorHighlightLineRefs:c});let x=w=>{let $=w.currentTarget.scrollTop;i.current&&(i.current.scrollTop=$),l.current&&(l.current.scrollTop=$)},v=w=>{if((w.metaKey||w.ctrlKey)&&w.key.toLowerCase()==="s"&&(w.preventDefault(),s()),w.key==="Tab"){w.preventDefault();let $=r.current;if(!$)return;let S=$.selectionStart,C=$.selectionEnd,_=`${t.slice(0,S)} ${t.slice(C)}`;n(_),window.requestAnimationFrame(()=>{$.selectionStart=S+2,$.selectionEnd=S+2})}};return L(()=>{let w=o.current;if(!w||typeof ResizeObserver>"u")return()=>{};let $=null,S=new ResizeObserver(C=>{let _=C?.[0],k=x0(tP(_?.target));u(A=>Math.abs(A-k)>=1?k:A),$&&window.clearTimeout($),$=window.setTimeout(()=>{let A=Fe();A[b0]=k,Ct(A)},120)});return S.observe(w),()=>{S.disconnect(),$&&window.clearTimeout($)}},[]),g0` +`;var Sw=P.bind(T),Cw="cronPromptEditorHeightPx",dP=280,uP=180,_w=t=>{let e=Number(t),n=Number.isFinite(e)?Math.round(e):dP;return Math.max(uP,n)},pP=t=>{if(!t)return 0;let e=Number.parseFloat(window.getComputedStyle(t).height||"0");return Number.isFinite(e)?e:0},Aw=({promptValue:t="",savedPromptValue:e="",onChangePrompt:n=()=>{},onSaveChanges:s=()=>{}})=>{let o=te(null),r=te(null),i=te(null),a=te([]),l=te(null),c=te([]),[d,u]=y(()=>{let $=je();return _w($?.[Cw])}),p=yl(t),f=!vl({contentLength:t.length,lineCount:p,charThreshold:gl,lineThreshold:bl}),g=F(()=>f?hl(t,"markdown"):[],[t,f]),m=Math.max(p,Array.isArray(g)?g.length:0),h=F(()=>Array.from({length:m},($,w)=>w+1),[m]),x=t!==e;$l({enabled:f,syncKey:`${t.length}:${g.length}`,editorLineNumberRowRefs:a,editorHighlightLineRefs:c});let b=$=>{let w=$.currentTarget.scrollTop;i.current&&(i.current.scrollTop=w),l.current&&(l.current.scrollTop=w)},v=$=>{if(($.metaKey||$.ctrlKey)&&$.key.toLowerCase()==="s"&&($.preventDefault(),s()),$.key==="Tab"){$.preventDefault();let w=r.current;if(!w)return;let S=w.selectionStart,C=w.selectionEnd,_=`${t.slice(0,S)} ${t.slice(C)}`;n(_),window.requestAnimationFrame(()=>{w.selectionStart=S+2,w.selectionEnd=S+2})}};return L(()=>{let $=o.current;if(!$||typeof ResizeObserver>"u")return()=>{};let w=null,S=new ResizeObserver(C=>{let _=C?.[0],k=_w(pP(_?.target));u(A=>Math.abs(A-k)>=1?k:A),w&&window.clearTimeout(w),w=window.setTimeout(()=>{let A=je();A[Cw]=k,At(A)},120)});return S.observe($),()=>{S.disconnect(),w&&window.clearTimeout(w)}},[]),Sw`

Prompt - ${b?g0``:null} + ${x?Sw``:null}

{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d editorHighlightLineRefs=${c} editorTextareaRef=${r} renderContent=${t} - handleContentInput=${w=>n(w.target.value)} + handleContentInput=${$=>n($.target.value)} handleEditorKeyDown=${v} - handleEditorScroll=${x} + handleEditorScroll=${b} handleEditorSelectionChange=${()=>{}} isEditBlocked=${!1} isPreviewOnly=${!1} />
- `};var ac=P.bind(T),Ei="ac-surface-inset rounded-lg p-2.5 space-y-1.5",nP=[{label:"main",value:"main"},{label:"isolated",value:"isolated"}],sP=[{label:"now",value:"now"},{label:"next-heartbeat",value:"next-heartbeat"}],Bp="__none__",v0=(t,e)=>t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate(),oP=t=>t.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}).replace(/\s*([AP])M$/i,(e,n)=>`${String(n||"").toLowerCase()}m`).replace(/\s+/g,""),rP=t=>{let e=Number(t||0);if(!Number.isFinite(e)||e<=0)return"\u2014";let n=new Date(e);if(Number.isNaN(n.getTime()))return"\u2014";let s=new Date,o=new Date(s);o.setDate(s.getDate()+1);let r=v0(n,s),i=v0(n,o),a=oP(n);return r?a:i?`Tomorrow ${a}`:`${n.toLocaleDateString()} ${a}`},$0=({job:t=null,routingDraft:e=null,onChangeRoutingDraft:n=()=>{},destinationSessionKey:s="",onChangeDestinationSessionKey:o=()=>{},deliverySessions:r=[],loadingDeliverySessions:i=!1,deliverySessionsError:a="",savingChanges:l=!1,togglingJobEnabled:c=!1,onToggleEnabled:d=()=>{},onRunNow:u=()=>{},runningJob:p=!1,hasUnsavedChanges:f=!1})=>{if(!t)return null;let g=String(e?.sessionTarget||t?.sessionTarget||"main"),m=String(e?.wakeMode||t?.wakeMode||"now"),h=String(e?.deliveryMode||t?.delivery?.mode||"none"),b=F(()=>{let v=new Set,w=[],$=String(s||"").trim(),S=!1;if((Array.isArray(r)?r:[]).forEach(C=>{let _=String(C?.key||"").trim();if(!_)return;_===$&&(S=!0);let A=String(C?.label||C?.key||"Session").trim().toLowerCase();v.has(A)||(v.add(A),w.push(C))}),!S&&$){let C=(Array.isArray(r)?r:[]).find(_=>String(_?.key||"").trim()===$);C&&w.unshift(C)}return w},[r,s]),x=h==="announce"&&String(s||"").trim()?String(s||""):Bp;return ac` + `};var uc=P.bind(T),Ni="ac-surface-inset rounded-lg p-2.5 space-y-1.5",fP=[{label:"main",value:"main"},{label:"isolated",value:"isolated"}],hP=[{label:"now",value:"now"},{label:"next-heartbeat",value:"next-heartbeat"}],Wp="__none__",Mw=(t,e)=>t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate(),mP=t=>t.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}).replace(/\s*([AP])M$/i,(e,n)=>`${String(n||"").toLowerCase()}m`).replace(/\s+/g,""),gP=t=>{let e=Number(t||0);if(!Number.isFinite(e)||e<=0)return"\u2014";let n=new Date(e);if(Number.isNaN(n.getTime()))return"\u2014";let s=new Date,o=new Date(s);o.setDate(s.getDate()+1);let r=Mw(n,s),i=Mw(n,o),a=mP(n);return r?a:i?`Tomorrow ${a}`:`${n.toLocaleDateString()} ${a}`},Tw=({job:t=null,routingDraft:e=null,onChangeRoutingDraft:n=()=>{},destinationSessionKey:s="",onChangeDestinationSessionKey:o=()=>{},deliverySessions:r=[],loadingDeliverySessions:i=!1,deliverySessionsError:a="",savingChanges:l=!1,togglingJobEnabled:c=!1,onToggleEnabled:d=()=>{},onRunNow:u=()=>{},runningJob:p=!1,hasUnsavedChanges:f=!1})=>{if(!t)return null;let g=String(e?.sessionTarget||t?.sessionTarget||"main"),m=String(e?.wakeMode||t?.wakeMode||"now"),h=String(e?.deliveryMode||t?.delivery?.mode||"none"),x=F(()=>{let v=new Set,$=[],w=String(s||"").trim(),S=!1;if((Array.isArray(r)?r:[]).forEach(C=>{let _=String(C?.key||"").trim();if(!_)return;_===w&&(S=!0);let A=String(C?.label||C?.key||"Session").trim().toLowerCase();v.has(A)||(v.add(A),$.push(C))}),!S&&w){let C=(Array.isArray(r)?r:[]).find(_=>String(_?.key||"").trim()===w);C&&$.unshift(C)}return $},[r,s]),b=h==="announce"&&String(s||"").trim()?String(s||""):Wp;return uc`
ID: ${t.id}
-
+
Schedule
${Qo(t.schedule,{includeTimeZoneWhenDifferent:!0})}
-
+
Next run
- ${rP(t?.state?.nextRunAtMs)} + ${gP(t?.state?.nextRunAtMs)} - ${` (${Gy(t?.state?.nextRunAtMs)})`} + ${` (${tv(t?.state?.nextRunAtMs)})`}
-
+
Session target
- <${Xe} - options=${nP} + <${nt} + options=${fP} value=${g} - onChange=${v=>n((w={})=>({...w,sessionTarget:String(v||"main")}))} + onChange=${v=>n(($={})=>({...$,sessionTarget:String(v||"main")}))} />
-
+
Wake mode
- <${Xe} - options=${sP} + <${nt} + options=${hP} value=${m} - onChange=${v=>n((w={})=>({...w,wakeMode:String(v||"now")}))} + onChange=${v=>n(($={})=>({...$,wakeMode:String(v||"now")}))} />
-
+
Delivery
- ${i?ac`
+ ${i?uc`
Loading delivery sessions...
`:null} - ${a?ac`
+ ${a?uc`
${a}
`:null}
@@ -4757,22 +4840,22 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d />
- `};var Fp=P.bind(T),iP=[{label:"all",value:"all"},{label:"ok",value:"ok"},{label:"error",value:"error"},{label:"skipped",value:"skipped"}],w0=({job:t=null,runEntries:e=[],filteredRunEntries:n=[],runTotal:s=0,runHasMore:o=!1,loadingMoreRuns:r=!1,runStatusFilter:i="all",onSetRunStatusFilter:a=()=>{},onLoadMoreRuns:l=()=>{},onRunNow:c=()=>{},runningJob:d=!1,onToggleEnabled:u=()=>{},togglingJobEnabled:p=!1,usage:f=null,jobTrends:g=null,jobTrendRange:m="7d",selectedJobTrendBucketFilter:h=null,usageDays:b=30,onSetUsageDays:x=()=>{},onSetJobTrendRange:v=()=>{},onSetSelectedJobTrendBucketFilter:w=()=>{},promptValue:$="",savedPromptValue:S="",onChangePrompt:C=()=>{},onSaveChanges:_=()=>{},savingChanges:k=!1,routingDraft:A=null,onChangeRoutingDraft:O=()=>{},deliverySessions:D=[],loadingDeliverySessions:z=!1,deliverySessionsError:E="",destinationSessionKey:M="",onChangeDestinationSessionKey:R=()=>{}})=>{if(!t)return Fp` + `};var Hp=P.bind(T),bP=[{label:"all",value:"all"},{label:"ok",value:"ok"},{label:"error",value:"error"},{label:"skipped",value:"skipped"}],Pw=({job:t=null,runEntries:e=[],filteredRunEntries:n=[],runTotal:s=0,runHasMore:o=!1,loadingMoreRuns:r=!1,runStatusFilter:i="all",onSetRunStatusFilter:a=()=>{},onLoadMoreRuns:l=()=>{},onRunNow:c=()=>{},runningJob:d=!1,onToggleEnabled:u=()=>{},togglingJobEnabled:p=!1,usage:f=null,jobTrends:g=null,jobTrendRange:m="7d",selectedJobTrendBucketFilter:h=null,usageDays:x=30,onSetUsageDays:b=()=>{},onSetJobTrendRange:v=()=>{},onSetSelectedJobTrendBucketFilter:$=()=>{},promptValue:w="",savedPromptValue:S="",onChangePrompt:C=()=>{},onSaveChanges:_=()=>{},savingChanges:k=!1,routingDraft:A=null,onChangeRoutingDraft:D=()=>{},deliverySessions:N=[],loadingDeliverySessions:z=!1,deliverySessionsError:O="",destinationSessionKey:M="",onChangeDestinationSessionKey:R=()=>{}})=>{if(!t)return Hp`
Select a cron job to view details.
- `;let U=F(()=>{let W=String(A?.sessionTarget||t?.sessionTarget||"main"),G=String(A?.wakeMode||t?.wakeMode||"now"),se=String(A?.deliveryMode||t?.delivery?.mode||"none"),K=String(t?.sessionTarget||"main"),j=String(t?.wakeMode||"now"),X=String(t?.delivery?.mode||"none");return W!==K||G!==j||se!==X},[t,A?.deliveryMode,A?.sessionTarget,A?.wakeMode])||$!==S;return Fp` + `;let U=F(()=>{let H=String(A?.sessionTarget||t?.sessionTarget||"main"),K=String(A?.wakeMode||t?.wakeMode||"now"),se=String(A?.deliveryMode||t?.delivery?.mode||"none"),Y=String(t?.sessionTarget||"main"),j=String(t?.wakeMode||"now"),J=String(t?.delivery?.mode||"none");return H!==Y||K!==j||se!==J},[t,A?.deliveryMode,A?.sessionTarget,A?.wakeMode])||w!==S;return Hp`
- <${$0} + <${Tw} job=${t} routingDraft=${A} - onChangeRoutingDraft=${O} + onChangeRoutingDraft=${D} destinationSessionKey=${M} onChangeDestinationSessionKey=${R} - deliverySessions=${D} + deliverySessions=${N} loadingDeliverySessions=${z} - deliverySessionsError=${E} + deliverySessionsError=${O} savingChanges=${k} togglingJobEnabled=${p} onToggleEnabled=${u} @@ -4781,36 +4864,36 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d hasUnsavedChanges=${U} /> - <${y0} - promptValue=${$} + <${Aw} + promptValue=${w} savedPromptValue=${S} onChangePrompt=${C} onSaveChanges=${_} /> - <${tv} + <${cv} usage=${f} - usageDays=${b} - onSetUsageDays=${x} + usageDays=${x} + onSetUsageDays=${b} /> - <${h0} + <${ww} trends=${g} range=${m} onChangeRange=${v} selectedBucketFilter=${h} - onChangeSelectedBucketFilter=${w} + onChangeSelectedBucketFilter=${$} /> - <${ic} - entryCountLabel=${`${Te(h?n.length:s)} entries`} - primaryFilterOptions=${iP} + <${dc} + entryCountLabel=${`${Ne(h?n.length:s)} entries`} + primaryFilterOptions=${bP} primaryFilterValue=${i} onChangePrimaryFilter=${a} activeFilterLabel=${h?.label||""} - onClearActiveFilter=${()=>w(null)} + onClearActiveFilter=${()=>$(null)} rows=${h?n:e} variant="detail" - footer=${o?Fp` + footer=${o?Hp`
<${Z} onClick=${l} @@ -4825,7 +4908,7 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d />
- `};var Vn=(t,e=0)=>{let n=Number(t);return Number.isFinite(n)?n:e},k0=t=>{let e=new Date(Vn(t,Date.now()));return e.setMinutes(0,0,0),e.getTime()},Wp=t=>{let e=new Date(Vn(t,Date.now()));return e.setHours(0,0,0,0),e.getTime()},C0=(t={})=>{let n=String(t?.expr||t?.cron||t?.cronExpr||"").trim().split(/\s+/);if(n.length<5)return null;let[s,o,r,i,a]=n;return{minuteField:s,hourField:o,dayOfMonthField:r,monthField:i,dayOfWeekField:a}},aP=(t="",e=0,n=0)=>{if(/^\d+$/.test(t)){let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=e&&r<=n?[r]:[]}let s=t.match(/^(\d+)-(\d+)$/);if(s){let r=Number.parseInt(s[1],10),i=Number.parseInt(s[2],10);if(!Number.isFinite(r)||!Number.isFinite(i))return[];let a=Math.max(e,Math.min(n,r)),l=Math.max(e,Math.min(n,i));return a>l?[]:Array.from({length:l-a+1},(c,d)=>a+d)}let o=t.match(/^\*\/(\d+)$/);if(o){let r=Number.parseInt(o[1],10);if(!Number.isFinite(r)||r<=0)return[];let i=[];for(let a=e;a<=n;a+=r)i.push(a);return i}return t==="*"?Array.from({length:n-e+1},(r,i)=>e+i):[]},po=(t="",e=0,n=0)=>{let s=String(t||"").trim();if(!s)return new Set;let r=s.split(",").map(i=>i.trim()).filter(Boolean).flatMap(i=>aP(i,e,n));return new Set(r)},lP=(t=null)=>t?{minuteSet:po(t.minuteField,0,59),hourSet:po(t.hourField,0,23),dayOfMonthSet:po(t.dayOfMonthField,1,31),monthSet:po(t.monthField,1,12),dayOfWeekSet:po(t.dayOfWeekField,0,7)}:null,cP=(t,e=null)=>{if(!e)return!1;let{minuteSet:n,hourSet:s,dayOfMonthSet:o,monthSet:r,dayOfWeekSet:i}=e,a=t.getMinutes(),l=t.getHours(),c=t.getDate(),d=t.getMonth()+1,u=t.getDay(),p=u===0?[0,7]:[u],f=n.size===0||n.has(a),g=s.size===0||s.has(l),m=o.size===0||o.has(c),h=r.size===0||r.has(d),b=i.size===0||p.some(x=>i.has(x));return f&&g&&m&&h&&b},Hp=t=>{let e=new Date(t),n=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${n}-${s}-${o}`},dP=({nowMs:t=Date.now(),pastDays:e=3,futureDays:n=3}={})=>{let s=Vn(t,Date.now()),o=Math.max(0,Number.parseInt(String(e),10)||3),r=Math.max(0,Number.parseInt(String(n),10)||3),i=Wp(s-o*864e5),a=Wp(s+r*864e5)+864e5-1;return{nowMs:s,rangeStartMs:i,rangeEndMs:a,dayCount:o+r+1}},S0=({jobId:t="",scheduledAtMs:e=0}={})=>`${String(t||"")}:${Vn(e,0)}`,uP=(t={})=>{if(String(t?.schedule?.kind||"").trim().toLowerCase()!=="cron")return!1;let n=C0(t?.schedule||{});if(!n||n.dayOfMonthField!=="*"||n.monthField!=="*")return!1;let s=String(n.minuteField||"").trim().match(/^\*\/(\d+)$/),o=po(n.minuteField,0,59),r=po(n.hourField,0,23),i=r.size>0?r.size:24,a=o.size>0?o.size:1;if(s){let l=Number.parseInt(s[1],10);return!Number.isFinite(l)||l<=0?!1:l<=30&&i>=4}return a>=3&&i>=4},_0=(t=[])=>{let e=[],n=[];return t.forEach(s=>{String(s?.schedule?.kind||"").trim().toLowerCase()==="every"||uP(s)?e.push(s):n.push(s)}),{repeatingJobs:e,scheduledJobs:n}},M0=({jobs:t=[],nowMs:e=Date.now(),pastDays:n=3,futureDays:s=3}={})=>{let o=dP({nowMs:e,pastDays:n,futureDays:s}),r=[],i=Array.from({length:o.dayCount},(a,l)=>{let c=Wp(o.rangeStartMs+l*864e5);return{dayStartMs:c,dayKey:Hp(c),label:new Date(c).toLocaleDateString([],{weekday:"short",month:"numeric",day:"numeric"})}});return t.forEach(a=>{let l=String(a?.schedule?.kind||"").trim().toLowerCase();if(l==="every")return;if(l==="at"){let u=Vn(a?.schedule?.at,0);if(uo.rangeEndMs)return;let p=k0(u);r.push({key:S0({jobId:a.id,scheduledAtMs:u}),jobId:String(a?.id||""),jobName:String(a?.name||a?.id||""),scheduledAtMs:u,hourBucketMs:p,dayKey:Hp(p),hourOfDay:new Date(p).getHours()});return}let c=C0(a?.schedule||{});if(!c)return;let d=lP(c);if(d)for(let u=o.rangeStartMs;u<=o.rangeEndMs;u+=6e4){let p=new Date(u);if(!cP(p,d))continue;let f=k0(u);r.push({key:S0({jobId:a.id,scheduledAtMs:u}),jobId:String(a?.id||""),jobName:String(a?.name||a?.id||""),scheduledAtMs:u,hourBucketMs:f,dayKey:Hp(u),hourOfDay:p.getHours()})}}),r.sort((a,l)=>a.scheduledAtMs-l.scheduledAtMs),{range:o,days:i,slots:r}},pP=(t="")=>{let e=String(t||"").trim().toLowerCase();return e==="ok"||e==="error"||e==="skipped"?e:""},A0=({slots:t=[],bulkRunsByJobId:e={},nowMs:n=Date.now(),toleranceMs:s=27e5}={})=>{let o={},r=Vn(n,Date.now()),i=Math.max(0,Vn(s,45*6e4)),a={};Object.entries(e||{}).forEach(([c,d])=>{let p=(Array.isArray(d?.entries)?d.entries:[]).map(f=>({ts:Vn(f?.ts,0),status:pP(f?.status)})).filter(f=>f.ts>0&&f.status).sort((f,g)=>f.ts-g.ts);a[c]=p});let l={};return t.forEach(c=>{if(c.scheduledAtMs>r)return;let d=String(c.jobId||""),u=a[d]||[];if(u.length===0)return;let p=l[d]||new Set;l[d]=p;let f=null,g=Number.MAX_SAFE_INTEGER;u.forEach(m=>{if(p.has(m.ts))return;let h=Math.abs(m.ts-c.scheduledAtMs);h>i||h{let o=Vn(e,Date.now()),r=o+Vn(n,864e5);return t.filter(i=>i.scheduledAtMs>o&&i.scheduledAtMs<=r).sort((i,a)=>i.scheduledAtMs-a.scheduledAtMs).slice(0,s)};var $t=P.bind(T),fP=t=>{let e=new Date;return e.setHours(t,0,0,0),e.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})},P0=(t,e)=>`${String(t||"")}:${e}`,hP=t=>{let e=new Date(t),n=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${n}-${s}-${o}`},Vp=({isPast:t=!1,mappedStatus:e="",tokenTier:n="low"}={})=>{let s={unknown:"cron-calendar-slot-tier-unknown",low:"cron-calendar-slot-tier-low",medium:"cron-calendar-slot-tier-medium",high:"cron-calendar-slot-tier-high","very-high":"cron-calendar-slot-tier-very-high",disabled:"cron-calendar-slot-tier-disabled"},o=s[n]||s.low;return t?e==="ok"?`${o} cron-calendar-slot-ok`:e==="error"?`${o} cron-calendar-slot-error`:e==="skipped"?`${o} cron-calendar-slot-skipped`:`${o} cron-calendar-slot-past`:`${o} cron-calendar-slot-upcoming`},R0=()=>$t` + `};var jn=(t,e=0)=>{let n=Number(t);return Number.isFinite(n)?n:e},Rw=t=>{let e=new Date(jn(t,Date.now()));return e.setMinutes(0,0,0),e.getTime()},jp=t=>{let e=new Date(jn(t,Date.now()));return e.setHours(0,0,0,0),e.getTime()},Ew=(t={})=>{let n=String(t?.expr||t?.cron||t?.cronExpr||"").trim().split(/\s+/);if(n.length<5)return null;let[s,o,r,i,a]=n;return{minuteField:s,hourField:o,dayOfMonthField:r,monthField:i,dayOfWeekField:a}},xP=(t="",e=0,n=0)=>{if(/^\d+$/.test(t)){let r=Number.parseInt(t,10);return Number.isFinite(r)&&r>=e&&r<=n?[r]:[]}let s=t.match(/^(\d+)-(\d+)$/);if(s){let r=Number.parseInt(s[1],10),i=Number.parseInt(s[2],10);if(!Number.isFinite(r)||!Number.isFinite(i))return[];let a=Math.max(e,Math.min(n,r)),l=Math.max(e,Math.min(n,i));return a>l?[]:Array.from({length:l-a+1},(c,d)=>a+d)}let o=t.match(/^\*\/(\d+)$/);if(o){let r=Number.parseInt(o[1],10);if(!Number.isFinite(r)||r<=0)return[];let i=[];for(let a=e;a<=n;a+=r)i.push(a);return i}return t==="*"?Array.from({length:n-e+1},(r,i)=>e+i):[]},fo=(t="",e=0,n=0)=>{let s=String(t||"").trim();if(!s)return new Set;let r=s.split(",").map(i=>i.trim()).filter(Boolean).flatMap(i=>xP(i,e,n));return new Set(r)},yP=(t=null)=>t?{minuteSet:fo(t.minuteField,0,59),hourSet:fo(t.hourField,0,23),dayOfMonthSet:fo(t.dayOfMonthField,1,31),monthSet:fo(t.monthField,1,12),dayOfWeekSet:fo(t.dayOfWeekField,0,7)}:null,vP=(t,e=null)=>{if(!e)return!1;let{minuteSet:n,hourSet:s,dayOfMonthSet:o,monthSet:r,dayOfWeekSet:i}=e,a=t.getMinutes(),l=t.getHours(),c=t.getDate(),d=t.getMonth()+1,u=t.getDay(),p=u===0?[0,7]:[u],f=n.size===0||n.has(a),g=s.size===0||s.has(l),m=o.size===0||o.has(c),h=r.size===0||r.has(d),x=i.size===0||p.some(b=>i.has(b));return f&&g&&m&&h&&x},Vp=t=>{let e=new Date(t),n=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${n}-${s}-${o}`},$P=({nowMs:t=Date.now(),pastDays:e=3,futureDays:n=3}={})=>{let s=jn(t,Date.now()),o=Math.max(0,Number.parseInt(String(e),10)||3),r=Math.max(0,Number.parseInt(String(n),10)||3),i=jp(s-o*864e5),a=jp(s+r*864e5)+864e5-1;return{nowMs:s,rangeStartMs:i,rangeEndMs:a,dayCount:o+r+1}},Lw=({jobId:t="",scheduledAtMs:e=0}={})=>`${String(t||"")}:${jn(e,0)}`,wP=(t={})=>{if(String(t?.schedule?.kind||"").trim().toLowerCase()!=="cron")return!1;let n=Ew(t?.schedule||{});if(!n||n.dayOfMonthField!=="*"||n.monthField!=="*")return!1;let s=String(n.minuteField||"").trim().match(/^\*\/(\d+)$/),o=fo(n.minuteField,0,59),r=fo(n.hourField,0,23),i=r.size>0?r.size:24,a=o.size>0?o.size:1;if(s){let l=Number.parseInt(s[1],10);return!Number.isFinite(l)||l<=0?!1:l<=30&&i>=4}return a>=3&&i>=4},Iw=(t=[])=>{let e=[],n=[];return t.forEach(s=>{String(s?.schedule?.kind||"").trim().toLowerCase()==="every"||wP(s)?e.push(s):n.push(s)}),{repeatingJobs:e,scheduledJobs:n}},Dw=({jobs:t=[],nowMs:e=Date.now(),pastDays:n=3,futureDays:s=3}={})=>{let o=$P({nowMs:e,pastDays:n,futureDays:s}),r=[],i=Array.from({length:o.dayCount},(a,l)=>{let c=jp(o.rangeStartMs+l*864e5);return{dayStartMs:c,dayKey:Vp(c),label:new Date(c).toLocaleDateString([],{weekday:"short",month:"numeric",day:"numeric"})}});return t.forEach(a=>{let l=String(a?.schedule?.kind||"").trim().toLowerCase();if(l==="every")return;if(l==="at"){let u=jn(a?.schedule?.at,0);if(uo.rangeEndMs)return;let p=Rw(u);r.push({key:Lw({jobId:a.id,scheduledAtMs:u}),jobId:String(a?.id||""),jobName:String(a?.name||a?.id||""),scheduledAtMs:u,hourBucketMs:p,dayKey:Vp(p),hourOfDay:new Date(p).getHours()});return}let c=Ew(a?.schedule||{});if(!c)return;let d=yP(c);if(d)for(let u=o.rangeStartMs;u<=o.rangeEndMs;u+=6e4){let p=new Date(u);if(!vP(p,d))continue;let f=Rw(u);r.push({key:Lw({jobId:a.id,scheduledAtMs:u}),jobId:String(a?.id||""),jobName:String(a?.name||a?.id||""),scheduledAtMs:u,hourBucketMs:f,dayKey:Vp(u),hourOfDay:p.getHours()})}}),r.sort((a,l)=>a.scheduledAtMs-l.scheduledAtMs),{range:o,days:i,slots:r}},kP=(t="")=>{let e=String(t||"").trim().toLowerCase();return e==="ok"||e==="error"||e==="skipped"?e:""},Nw=({slots:t=[],bulkRunsByJobId:e={},nowMs:n=Date.now(),toleranceMs:s=27e5}={})=>{let o={},r=jn(n,Date.now()),i=Math.max(0,jn(s,45*6e4)),a={};Object.entries(e||{}).forEach(([c,d])=>{let p=(Array.isArray(d?.entries)?d.entries:[]).map(f=>({ts:jn(f?.ts,0),status:kP(f?.status)})).filter(f=>f.ts>0&&f.status).sort((f,g)=>f.ts-g.ts);a[c]=p});let l={};return t.forEach(c=>{if(c.scheduledAtMs>r)return;let d=String(c.jobId||""),u=a[d]||[];if(u.length===0)return;let p=l[d]||new Set;l[d]=p;let f=null,g=Number.MAX_SAFE_INTEGER;u.forEach(m=>{if(p.has(m.ts))return;let h=Math.abs(m.ts-c.scheduledAtMs);h>i||h{let o=jn(e,Date.now()),r=o+jn(n,864e5);return t.filter(i=>i.scheduledAtMs>o&&i.scheduledAtMs<=r).sort((i,a)=>i.scheduledAtMs-a.scheduledAtMs).slice(0,s)};var kt=P.bind(T),SP=t=>{let e=new Date;return e.setHours(t,0,0,0),e.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})},Bw=(t,e)=>`${String(t||"")}:${e}`,CP=t=>{let e=new Date(t),n=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${n}-${s}-${o}`},zp=({isPast:t=!1,mappedStatus:e="",tokenTier:n="low"}={})=>{let s={unknown:"cron-calendar-slot-tier-unknown",low:"cron-calendar-slot-tier-low",medium:"cron-calendar-slot-tier-medium",high:"cron-calendar-slot-tier-high","very-high":"cron-calendar-slot-tier-very-high",disabled:"cron-calendar-slot-tier-disabled"},o=s[n]||s.low;return t?e==="ok"?`${o} cron-calendar-slot-ok`:e==="error"?`${o} cron-calendar-slot-error`:e==="skipped"?`${o} cron-calendar-slot-skipped`:`${o} cron-calendar-slot-past`:`${o} cron-calendar-slot-upcoming`},Fw=()=>kt`
Token intensity {i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d >Very high
-`,mP=60*1e3,gP=10080*60*1e3,bP=2700*1e3,xP="unknown",yP=t=>new Date(t).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),vP=({runsByJobId:t={},nowMs:e=Date.now()}={})=>{let n=Number(e||Date.now())-gP;return Object.entries(t||{}).reduce((s,[o,r])=>{let a=(Array.isArray(r?.entries)?r.entries:[]).filter(u=>{let p=Number(u?.ts||0);return Number.isFinite(p)&&p>=n&&p<=e}),l=a.length,c=a.reduce((u,p)=>u+Number(rn(p)||0),0),d=a.reduce((u,p)=>{let f=$n(p);return u+Number(f??0)},0);return s[String(o||"")]={runCount:l,totalTokens:c,totalCost:d,avgTokensPerRun:l>0?Math.round(c/l):0,avgCostPerRun:l>0?d/l:0},s},{})},$P=({slots:t=[],runsByJobId:e={},nowMs:n=Date.now()}={})=>{let s={},o={},r=Object.entries(e||{}).reduce((i,[a,l])=>{let d=(Array.isArray(l?.entries)?l.entries:[]).map(u=>({...u,ts:Number(u?.ts||0)})).filter(u=>Number.isFinite(u.ts)&&u.ts>0).sort((u,p)=>u.ts-p.ts);return i[String(a||"")]=d,i},{});return t.forEach(i=>{if(Number(i?.scheduledAtMs||0)>n)return;let a=String(i?.jobId||""),l=r[a]||[];if(l.length===0)return;let c=o[a]||new Set;o[a]=c;let d=null,u=Number.MAX_SAFE_INTEGER;l.forEach(p=>{if(c.has(p.ts))return;let f=Math.abs(p.ts-Number(i?.scheduledAtMs||0));f>bP||f{let e=t.map(s=>Number(s||0)).filter(s=>Number.isFinite(s)&&s>0).sort((s,o)=>s-o);if(e.length===0)return null;let n=(s=0)=>{let o=Math.min(e.length-1,Math.floor((e.length-1)*s));return e[Math.max(0,o)]};return{q1:n(.25),q2:n(.5),p90:n(.9)}},jp=({enabled:t=!0,tokenValue:e=0,thresholds:n=null}={})=>{if(!t)return"disabled";let s=Number(e||0);return!Number.isFinite(s)||s<=0||!n?xP:s<=n.q1?"low":s<=n.q2?"medium":s<=n.p90?"high":"very-high"},zp=({jobName:t="",job:e=null,runSummary7d:n={},slotRun:s=null,latestRun:o=null,scheduledAtMs:r=0,scheduledStatus:i="",nowMs:a=Date.now()}={})=>{let l=Number(r||0)>0&&Number(r||0)<=a,c=Number(n?.runCount||0),d=Number(n?.avgTokensPerRun||0),u=Number(n?.avgCostPerRun||0),p=rn(s||{}),f=$n(s||{}),g=String(s?.status||"").trim().toLowerCase(),m=[String(t||"Job")];if(l?(m.push(`Run tokens: ${s?Te(p):"\u2014"}`),m.push(`Run cost: ${f==null?"\u2014":it(f)}`),m.push(`Run status: ${g||i||"unknown"}`),s?.ts&&m.push(`Run time: ${new Date(Number(s.ts||0)).toLocaleString()}`)):(m.push(`Avg tokens/run (last 7d): ${c>0?Te(d):"\u2014"}`),m.push(`Avg cost/run (last 7d): ${c>0?it(u):"\u2014"}`),m.push(`Runs (last 7d): ${c>0?Te(c):"none"}`)),!l&&o?.status?m.push(`Latest run: ${o.status} (${new Date(Number(o.ts||0)).toLocaleString()})`):l||m.push("Latest run: none"),Number(e?.state?.runningAtMs||0)>0&&m.push(`Current run: active (${new Date(Number(e.state.runningAtMs)).toLocaleString()})`),r>0){let h=new Date(r).toLocaleString(),b=i||(r<=Date.now()?"past":"upcoming");m.push(`Slot: ${b} (${h})`)}return m.join(` -`)},L0=({jobs:t=[],runsByJobId:e={},onSelectJob:n=()=>{}})=>{let[s,o]=y(!1),[r,i]=y(!1),[a,l]=y(()=>Date.now());L(()=>{let M=window.setInterval(()=>{l(Date.now())},mP);return()=>{window.clearInterval(M)}},[]);let c=hP(a),d=F(()=>new Date(a),[a]),u=d.getHours(),p=d.getMinutes()/60,{repeatingJobs:f,scheduledJobs:g}=F(()=>_0(t),[t]),m=F(()=>M0({jobs:g,nowMs:a}),[g,a]),h=F(()=>A0({slots:m.slots,bulkRunsByJobId:e,nowMs:a}),[m.slots,e,a]),b=F(()=>t.reduce((M,R)=>{let B=String(R?.id||"");return B&&(M[B]=R),M},{}),[t]),x=F(()=>Object.entries(e||{}).reduce((M,[R,B])=>{let U=(Array.isArray(B?.entries)?B.entries:[]).filter(W=>Number(W?.ts||0)>0).sort((W,G)=>Number(G?.ts||0)-Number(W?.ts||0))[0];return M[R]=U||null,M},{}),[e]),v=F(()=>vP({runsByJobId:e,nowMs:a}),[e,a]),w=F(()=>$P({slots:m.slots,runsByJobId:e,nowMs:a}),[m.slots,e,a]),$=F(()=>{let M=[];return m.slots.forEach(R=>{let B=b[R.jobId]||null;if(!B||B.enabled===!1)return;if(Number(R?.scheduledAtMs||0)<=a){let W=rn(w[R.key]||{});W>0&&M.push(W);return}let U=Number(v[R.jobId]?.avgTokensPerRun||0);U>0&&M.push(U)}),f.forEach(R=>{let B=String(R?.id||""),I=Number(v[B]?.avgTokensPerRun||0);I>0&&M.push(I)}),wP(M)},[b,a,f,w,v,m.slots]),S=q((M=null)=>{let R=String(M?.jobId||""),I=(b[R]||null)?.enabled!==!1;if(Number(M?.scheduledAtMs||0)<=a){let G=rn(w[String(M?.key||"")]||{});return jp({enabled:I,tokenValue:G,thresholds:$})}let W=Number(v[R]?.avgTokensPerRun||0);return jp({enabled:I,tokenValue:W,thresholds:$})},[b,a,w,v,$]),C=q((M="")=>{let R=b[M]||null;return jp({enabled:R?.enabled!==!1,tokenValue:Number(v[M]?.avgTokensPerRun||0),thresholds:$})},[b,v,$]),_=F(()=>T0({slots:m.slots,nowMs:a,limit:3}),[m.slots,a]),k=F(()=>{let M=a+864e5;return f.map(R=>{let B=String(R?.id||""),I=Number(R?.state?.nextRunAtMs||0);return!B||!Number.isFinite(I)||I<=a||I>M?null:{key:`noisy:${B}:${I}`,jobId:B,jobName:String(R?.name||B),scheduledAtMs:I}}).filter(Boolean).sort((R,B)=>R.scheduledAtMs-B.scheduledAtMs)},[f,a]),A=F(()=>r?[..._,...k].sort((M,R)=>Number(M?.scheduledAtMs||0)-Number(R?.scheduledAtMs||0)):_,[k,r,_]),O=F(()=>[...new Set(m.slots.map(R=>R.hourOfDay))].sort((R,B)=>R-B),[m.slots]),D=F(()=>m.slots.reduce((M,R)=>{let B=P0(R.dayKey,R.hourOfDay),I=M[B]||[];return I.push(R),M[B]=I,M},{}),[m.slots]),z=()=>$t` +`,_P=60*1e3,AP=10080*60*1e3,MP=2700*1e3,TP="unknown",PP=t=>new Date(t).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),RP=({runsByJobId:t={},nowMs:e=Date.now()}={})=>{let n=Number(e||Date.now())-AP;return Object.entries(t||{}).reduce((s,[o,r])=>{let a=(Array.isArray(r?.entries)?r.entries:[]).filter(u=>{let p=Number(u?.ts||0);return Number.isFinite(p)&&p>=n&&p<=e}),l=a.length,c=a.reduce((u,p)=>u+Number(rn(p)||0),0),d=a.reduce((u,p)=>{let f=$n(p);return u+Number(f??0)},0);return s[String(o||"")]={runCount:l,totalTokens:c,totalCost:d,avgTokensPerRun:l>0?Math.round(c/l):0,avgCostPerRun:l>0?d/l:0},s},{})},LP=({slots:t=[],runsByJobId:e={},nowMs:n=Date.now()}={})=>{let s={},o={},r=Object.entries(e||{}).reduce((i,[a,l])=>{let d=(Array.isArray(l?.entries)?l.entries:[]).map(u=>({...u,ts:Number(u?.ts||0)})).filter(u=>Number.isFinite(u.ts)&&u.ts>0).sort((u,p)=>u.ts-p.ts);return i[String(a||"")]=d,i},{});return t.forEach(i=>{if(Number(i?.scheduledAtMs||0)>n)return;let a=String(i?.jobId||""),l=r[a]||[];if(l.length===0)return;let c=o[a]||new Set;o[a]=c;let d=null,u=Number.MAX_SAFE_INTEGER;l.forEach(p=>{if(c.has(p.ts))return;let f=Math.abs(p.ts-Number(i?.scheduledAtMs||0));f>MP||f{let e=t.map(s=>Number(s||0)).filter(s=>Number.isFinite(s)&&s>0).sort((s,o)=>s-o);if(e.length===0)return null;let n=(s=0)=>{let o=Math.min(e.length-1,Math.floor((e.length-1)*s));return e[Math.max(0,o)]};return{q1:n(.25),q2:n(.5),p90:n(.9)}},Up=({enabled:t=!0,tokenValue:e=0,thresholds:n=null}={})=>{if(!t)return"disabled";let s=Number(e||0);return!Number.isFinite(s)||s<=0||!n?TP:s<=n.q1?"low":s<=n.q2?"medium":s<=n.p90?"high":"very-high"},Kp=({jobName:t="",job:e=null,runSummary7d:n={},slotRun:s=null,latestRun:o=null,scheduledAtMs:r=0,scheduledStatus:i="",nowMs:a=Date.now()}={})=>{let l=Number(r||0)>0&&Number(r||0)<=a,c=Number(n?.runCount||0),d=Number(n?.avgTokensPerRun||0),u=Number(n?.avgCostPerRun||0),p=rn(s||{}),f=$n(s||{}),g=String(s?.status||"").trim().toLowerCase(),m=[String(t||"Job")];if(l?(m.push(`Run tokens: ${s?Ne(p):"\u2014"}`),m.push(`Run cost: ${f==null?"\u2014":ct(f)}`),m.push(`Run status: ${g||i||"unknown"}`),s?.ts&&m.push(`Run time: ${new Date(Number(s.ts||0)).toLocaleString()}`)):(m.push(`Avg tokens/run (last 7d): ${c>0?Ne(d):"\u2014"}`),m.push(`Avg cost/run (last 7d): ${c>0?ct(u):"\u2014"}`),m.push(`Runs (last 7d): ${c>0?Ne(c):"none"}`)),!l&&o?.status?m.push(`Latest run: ${o.status} (${new Date(Number(o.ts||0)).toLocaleString()})`):l||m.push("Latest run: none"),Number(e?.state?.runningAtMs||0)>0&&m.push(`Current run: active (${new Date(Number(e.state.runningAtMs)).toLocaleString()})`),r>0){let h=new Date(r).toLocaleString(),x=i||(r<=Date.now()?"past":"upcoming");m.push(`Slot: ${x} (${h})`)}return m.join(` +`)},Ww=({jobs:t=[],runsByJobId:e={},onSelectJob:n=()=>{}})=>{let[s,o]=y(!1),[r,i]=y(!1),[a,l]=y(()=>Date.now());L(()=>{let M=window.setInterval(()=>{l(Date.now())},_P);return()=>{window.clearInterval(M)}},[]);let c=CP(a),d=F(()=>new Date(a),[a]),u=d.getHours(),p=d.getMinutes()/60,{repeatingJobs:f,scheduledJobs:g}=F(()=>Iw(t),[t]),m=F(()=>Dw({jobs:g,nowMs:a}),[g,a]),h=F(()=>Nw({slots:m.slots,bulkRunsByJobId:e,nowMs:a}),[m.slots,e,a]),x=F(()=>t.reduce((M,R)=>{let B=String(R?.id||"");return B&&(M[B]=R),M},{}),[t]),b=F(()=>Object.entries(e||{}).reduce((M,[R,B])=>{let U=(Array.isArray(B?.entries)?B.entries:[]).filter(H=>Number(H?.ts||0)>0).sort((H,K)=>Number(K?.ts||0)-Number(H?.ts||0))[0];return M[R]=U||null,M},{}),[e]),v=F(()=>RP({runsByJobId:e,nowMs:a}),[e,a]),$=F(()=>LP({slots:m.slots,runsByJobId:e,nowMs:a}),[m.slots,e,a]),w=F(()=>{let M=[];return m.slots.forEach(R=>{let B=x[R.jobId]||null;if(!B||B.enabled===!1)return;if(Number(R?.scheduledAtMs||0)<=a){let H=rn($[R.key]||{});H>0&&M.push(H);return}let U=Number(v[R.jobId]?.avgTokensPerRun||0);U>0&&M.push(U)}),f.forEach(R=>{let B=String(R?.id||""),E=Number(v[B]?.avgTokensPerRun||0);E>0&&M.push(E)}),EP(M)},[x,a,f,$,v,m.slots]),S=G((M=null)=>{let R=String(M?.jobId||""),E=(x[R]||null)?.enabled!==!1;if(Number(M?.scheduledAtMs||0)<=a){let K=rn($[String(M?.key||"")]||{});return Up({enabled:E,tokenValue:K,thresholds:w})}let H=Number(v[R]?.avgTokensPerRun||0);return Up({enabled:E,tokenValue:H,thresholds:w})},[x,a,$,v,w]),C=G((M="")=>{let R=x[M]||null;return Up({enabled:R?.enabled!==!1,tokenValue:Number(v[M]?.avgTokensPerRun||0),thresholds:w})},[x,v,w]),_=F(()=>Ow({slots:m.slots,nowMs:a,limit:3}),[m.slots,a]),k=F(()=>{let M=a+864e5;return f.map(R=>{let B=String(R?.id||""),E=Number(R?.state?.nextRunAtMs||0);return!B||!Number.isFinite(E)||E<=a||E>M?null:{key:`noisy:${B}:${E}`,jobId:B,jobName:String(R?.name||B),scheduledAtMs:E}}).filter(Boolean).sort((R,B)=>R.scheduledAtMs-B.scheduledAtMs)},[f,a]),A=F(()=>r?[..._,...k].sort((M,R)=>Number(M?.scheduledAtMs||0)-Number(R?.scheduledAtMs||0)):_,[k,r,_]),D=F(()=>[...new Set(m.slots.map(R=>R.hourOfDay))].sort((R,B)=>R-B),[m.slots]),N=F(()=>m.slots.reduce((M,R)=>{let B=Bw(R.dayKey,R.hourOfDay),E=M[B]||[];return E.push(R),M[B]=E,M},{}),[m.slots]),z=()=>kt`
- ${A.length===0?$t`
+ ${A.length===0?kt`
No upcoming jobs in the next 24 hours. -
`:$t` +
`:kt`
- ${A.map(M=>{let R=v[M.jobId]||{},B=Number(R?.avgTokensPerRun||0),I=Number(R?.avgCostPerRun||0),U=B>0||I>0?`Est. ${B>0?`${Te(B)} tk`:"\u2014 tk"} \xB7 ${I>0?it(I):"\u2014"}`:"Est. \u2014",W=zp({jobName:M.jobName,job:b[M.jobId]||null,runSummary7d:v[M.jobId]||{},slotRun:w[M.key]||null,latestRun:x[M.jobId],scheduledAtMs:M.scheduledAtMs,nowMs:a});return $t` - <${yt} - text=${W} + ${A.map(M=>{let R=v[M.jobId]||{},B=Number(R?.avgTokensPerRun||0),E=Number(R?.avgCostPerRun||0),U=B>0||E>0?`Est. ${B>0?`${Ne(B)} tk`:"\u2014 tk"} \xB7 ${E>0?ct(E):"\u2014"}`:"Est. \u2014",H=Kp({jobName:M.jobName,job:x[M.jobId]||null,runSummary7d:v[M.jobId]||{},slotRun:$[M.key]||null,latestRun:b[M.jobId],scheduledAtMs:M.scheduledAtMs,nowMs:a});return kt` + <${$t} + text=${H} widthClass="w-72" tooltipClassName="whitespace-pre-line" triggerClassName="block w-full" @@ -4858,12 +4941,12 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d - + `})}
`}
- ${k.length>0?$t` + ${k.length>0?kt` - `:$t``} - <${R0} /> + `:kt``} + <${Fw} />
- `,E=()=>$t` + `,O=()=>kt`
- ${O.length===0?$t`
+ ${D.length===0?kt`
No scheduled jobs in this rolling window. -
`:$t` +
`:kt`
- ${m.days.map(M=>$t` + ${m.days.map(M=>kt`
{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d `)}
- ${O.map(M=>$t` + ${D.map(M=>kt`
- ${fP(M)} + ${SP(M)}
- ${m.days.map(R=>{let B=P0(R.dayKey,M),I=D[B]||[],U=I.slice(0,3),W=Math.max(0,I.length-U.length);return $t` + ${m.days.map(R=>{let B=Bw(R.dayKey,M),E=N[B]||[],U=E.slice(0,3),H=Math.max(0,E.length-U.length);return kt`
- ${R.dayKey===c&&M===u?$t` + ${R.dayKey===c&&M===u?kt`
{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d
`:null} - ${U.map(G=>{let se=h[G.key]||"",K=G.scheduledAtMs<=a,j=S(G),X=zp({jobName:G.jobName,job:b[G.jobId]||null,runSummary7d:v[G.jobId]||{},slotRun:w[G.key]||null,latestRun:x[G.jobId],scheduledAtMs:G.scheduledAtMs,scheduledStatus:se,nowMs:a});return $t` - <${yt} - text=${X} + ${U.map(K=>{let se=h[K.key]||"",Y=K.scheduledAtMs<=a,j=S(K),J=Kp({jobName:K.jobName,job:x[K.jobId]||null,runSummary7d:v[K.jobId]||{},slotRun:$[K.key]||null,latestRun:b[K.jobId],scheduledAtMs:K.scheduledAtMs,scheduledStatus:se,nowMs:a});return kt` + <${$t} + text=${J} widthClass="w-72" tooltipClassName="whitespace-pre-line" triggerClassName="inline-flex w-full" >
n(G.jobId)} - onKeyDown=${de=>{de.key!=="Enter"&&de.key!==" "||(de.preventDefault(),n(G.jobId))}} + onClick=${()=>n(K.jobId)} + onKeyDown=${pe=>{pe.key!=="Enter"&&pe.key!==" "||(pe.preventDefault(),n(K.jobId))}} > - ${G.jobName} + ${K.jobName}
- + `})} - ${W>0?$t`
- +${W} more + ${H>0?kt`
+ +${H} more
`:null}
`})} @@ -4956,19 +5039,19 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d
`} - ${f.length>0?$t` + ${f.length>0?kt`
Repeating
- ${f.map(M=>{let R=String(M?.id||""),B=Number(v[R]?.avgTokensPerRun||0),I=zp({jobName:M.name||M.id,job:M,runSummary7d:v[R]||{},slotRun:null,latestRun:x[R],nowMs:a});return $t` - <${yt} - text=${I} + ${f.map(M=>{let R=String(M?.id||""),B=Number(v[R]?.avgTokensPerRun||0),E=Kp({jobName:M.name||M.id,job:M,runSummary7d:v[R]||{},slotRun:null,latestRun:b[R],nowMs:a});return kt` + <${$t} + text=${E} widthClass="w-72" tooltipClassName="whitespace-pre-line" triggerClassName="inline-flex max-w-full" >
n(R)} @@ -4977,16 +5060,16 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d ${M.name||M.id} ${Qo(M.schedule,{includeTimeZoneWhenDifferent:!0})} - ${B>0?` | avg ${Te(B)} tk`:""} + ${B>0?` | avg ${Ne(B)} tk`:""}
- + `})}
`:null}
- `;return $t` + `;return kt`

Up next

@@ -5001,7 +5084,7 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d ${z()}
- <${De} + <${Ie} visible=${s} onClose=${()=>o(!1)} panelClassName="cron-calendar-lightbox-panel" @@ -5014,30 +5097,30 @@ ${w}`}}}}}}),()=>{i.current&&(i.current.destroy(),i.current=null)}},[p,a,o,c,e,d onClick=${()=>o(!1)} aria-label="Close expanded calendar" > - <${nt} className="w-4 h-4" /> + <${Qe} className="w-4 h-4" />
- <${R0} /> + <${Fw} />
- ${E()} + ${O()}
- - `};var kP=P.bind(T),Ni="24h",xr="7d",Oi="30d",SP=[{label:"24h",value:Ni},{label:"7d",value:xr},{label:"30d",value:Oi}],Ii="outcomes",Di="tokens",lc="cost",CP=[{label:"outcomes",value:Ii},{label:"tokens",value:Di},{label:"cost",value:lc}],Up=t=>{let e=new Date(t);return e.setHours(0,0,0,0),e.getTime()},Kp=(t,e=0)=>{let n=new Date(t);return n.setDate(n.getDate()+Number(e||0)),n.getTime()},_P=(t=xr)=>t===Ni?{bucketCount:24,bucketMs:3600*1e3,formatLabel:e=>Xn(e,{range:Ni,valueType:"epoch-ms"}),showLabel:(e,n,s)=>n%3===0||n===s-1,alignToLocalDay:!1}:t===Oi?{bucketCount:30,bucketMs:1440*60*1e3,formatLabel:e=>Xn(e,{range:Oi,valueType:"epoch-ms"}),showLabel:(e,n,s)=>n%5===0||n===s-1,alignToLocalDay:!0}:{bucketCount:7,bucketMs:1440*60*1e3,formatLabel:e=>Xn(e,{range:xr,valueType:"epoch-ms"}),showLabel:()=>!0,alignToLocalDay:!0},MP=({bulkRunsByJobId:t={},nowMs:e=Date.now(),range:n=xr}={})=>{let s=_P(n),o=Number.isFinite(Number(e))?Number(e):Date.now(),r=s.alignToLocalDay?Kp(Up(o),-(s.bucketCount-1)):o-s.bucketCount*s.bucketMs,i=Array.from({length:s.bucketCount},(d,u)=>{let p=s.alignToLocalDay?Kp(r,u):r+u*s.bucketMs,f=u===s.bucketCount-1?o:s.alignToLocalDay?Kp(r,u+1):r+(u+1)*s.bucketMs;return{key:`trend-point-${u}`,startMs:p,endMs:f,ok:0,error:0,skipped:0,totalTokens:0,totalCost:0,costCount:0}}),a=s.alignToLocalDay?new Map(i.map((d,u)=>[Up(d.startMs),u])):null,l=i[0]?.startMs||r;Object.values(t||{}).forEach(d=>{(Array.isArray(d?.entries)?d.entries:[]).forEach(p=>{let f=Number(p?.ts||0);if(!Number.isFinite(f)||fo)return;let g=String(p?.status||"").trim().toLowerCase();if(!["ok","error","skipped"].includes(g))return;let m=s.alignToLocalDay?a?.get(Up(f)):Math.floor((f-l)/s.bucketMs);if(!Number.isFinite(Number(m))||m<0||m>=s.bucketCount)return;i[m][g]+=1,i[m].totalTokens+=rn(p);let h=$n(p);h!=null&&(i[m].totalCost+=h,i[m].costCount+=1)})});let c=i.map((d,u)=>{let p=d.ok+d.error+d.skipped;return{...d,total:p,label:s.formatLabel(d.startMs),showLabel:s.showLabel(d,u,i.length)}});return{points:c,maxTotal:Math.max(1,...c.map(d=>d.total))}},E0=({bulkRunsByJobId:t={},initialRange:e=Ni,selectedBucketFilter:n=null,onBucketFilterChange:s=()=>{}})=>{let o=ee(null),r=ee(null),[i,a]=y(Ii),[l,c]=y(e===Oi?Oi:e===xr?xr:Ni),d=F(()=>MP({bulkRunsByJobId:t,nowMs:Date.now(),range:l}),[t,l]);L(()=>{s(null)},[l,s]);let u=F(()=>!n||n.range!==l?"":d.points.find(m=>Number(m.startMs)===Number(n.startMs)&&Number(m.endMs)===Number(n.endMs))?.key||"",[l,n,d.points]),p=F(()=>d.points.findIndex(g=>g.key===u),[u,d.points]),f=F(()=>{let g="0.22",m="0.86",h=v=>p>=0&&p!==v,b=d.points.map(v=>v.showLabel?v.label:"");return i===Ii?{labels:b,datasets:[{label:"ok",data:d.points.map(v=>Number(v.ok||0)),stack:"outcomes",backgroundColor:d.points.map((v,w)=>`rgba(34,255,170,${h(w)?g:m})`),borderColor:d.points.map((v,w)=>`rgba(34,255,170,${h(w)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1},{label:"error",data:d.points.map(v=>Number(v.error||0)),stack:"outcomes",backgroundColor:d.points.map((v,w)=>`rgba(255,74,138,${h(w)?g:m})`),borderColor:d.points.map((v,w)=>`rgba(255,74,138,${h(w)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1},{label:"skipped",data:d.points.map(v=>Number(v.skipped||0)),stack:"outcomes",backgroundColor:d.points.map((v,w)=>`rgba(255,214,64,${h(w)?g:m})`),borderColor:d.points.map((v,w)=>`rgba(255,214,64,${h(w)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1}]}:{labels:b,datasets:[{label:i===Di?"tokens":"cost",data:d.points.map(v=>Number(i===Di?v.totalTokens||0:v.totalCost||0)),backgroundColor:d.points.map((v,w)=>i===Di?`rgba(34,211,238,${h(w)?g:"0.72"})`:`rgba(167,139,250,${h(w)?g:"0.72"})`),borderColor:d.points.map((v,w)=>i===Di?`rgba(34,211,238,${h(w)?"0.35":"1"})`:`rgba(167,139,250,${h(w)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1}]}},[i,p,d.points]);return L(()=>{let g=o.current;if(!g||!ls)return;r.current&&(r.current.destroy(),r.current=null);let m=h=>{let b=d.points[h];return b?{key:b.key,label:b.label,range:l,startMs:Number(b.startMs||0),endMs:Number(b.endMs||0)}:null};return r.current=new ls(g,{type:"bar",data:f,options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},animation:!1,onHover:(h,b)=>{let x=h?.native?.target;!x||!x.style||(x.style.cursor=Array.isArray(b)&&b.length>0?"pointer":"default")},onClick:(h,b)=>{let x=Number(b?.[0]?.index);if(!Number.isFinite(x))return;let v=m(x);if(v){if(v.key===u){s(null);return}s(v)}},scales:{x:{stacked:i===Ii,grid:{color:"rgba(148,163,184,0.08)"},ticks:{color:"rgba(156,163,175,1)",maxRotation:0,autoSkip:!1}},y:{stacked:i===Ii,beginAtZero:!0,grid:{color:"rgba(148,163,184,0.12)"},ticks:{precision:i===lc?void 0:0,color:"rgba(156,163,175,1)",callback:h=>i===lc?it(Number(h||0)):Te(Number(h||0))}}},plugins:{legend:{position:"bottom",labels:{color:"rgba(209,213,219,1)",boxWidth:10,boxHeight:10}},tooltip:{callbacks:{title:h=>String(h?.[0]?.label||""),label:h=>{let b=Number(h.parsed.y||0);return i===lc?`${h.dataset.label}: ${it(b)}`:`${h.dataset.label}: ${Te(b)}`},footer:h=>{let b=Number(h?.[0]?.dataIndex),x=d.points[b];if(!x)return"";let v=x.costCount>0?`~${it(x.totalCost)}`:"\u2014",w=Te(x.totalTokens||0);return`runs: ${x.total} -tokens: ${w} -cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s,l,u,d.points]),kP` + + `};var IP=P.bind(T),Fi="24h",xr="7d",Wi="30d",DP=[{label:"24h",value:Fi},{label:"7d",value:xr},{label:"30d",value:Wi}],Oi="outcomes",Bi="tokens",pc="cost",NP=[{label:"outcomes",value:Oi},{label:"tokens",value:Bi},{label:"cost",value:pc}],Gp=t=>{let e=new Date(t);return e.setHours(0,0,0,0),e.getTime()},qp=(t,e=0)=>{let n=new Date(t);return n.setDate(n.getDate()+Number(e||0)),n.getTime()},OP=(t=xr)=>t===Fi?{bucketCount:24,bucketMs:3600*1e3,formatLabel:e=>ts(e,{range:Fi,valueType:"epoch-ms"}),showLabel:(e,n,s)=>n%3===0||n===s-1,alignToLocalDay:!1}:t===Wi?{bucketCount:30,bucketMs:1440*60*1e3,formatLabel:e=>ts(e,{range:Wi,valueType:"epoch-ms"}),showLabel:(e,n,s)=>n%5===0||n===s-1,alignToLocalDay:!0}:{bucketCount:7,bucketMs:1440*60*1e3,formatLabel:e=>ts(e,{range:xr,valueType:"epoch-ms"}),showLabel:()=>!0,alignToLocalDay:!0},BP=({bulkRunsByJobId:t={},nowMs:e=Date.now(),range:n=xr}={})=>{let s=OP(n),o=Number.isFinite(Number(e))?Number(e):Date.now(),r=s.alignToLocalDay?qp(Gp(o),-(s.bucketCount-1)):o-s.bucketCount*s.bucketMs,i=Array.from({length:s.bucketCount},(d,u)=>{let p=s.alignToLocalDay?qp(r,u):r+u*s.bucketMs,f=u===s.bucketCount-1?o:s.alignToLocalDay?qp(r,u+1):r+(u+1)*s.bucketMs;return{key:`trend-point-${u}`,startMs:p,endMs:f,ok:0,error:0,skipped:0,totalTokens:0,totalCost:0,costCount:0}}),a=s.alignToLocalDay?new Map(i.map((d,u)=>[Gp(d.startMs),u])):null,l=i[0]?.startMs||r;Object.values(t||{}).forEach(d=>{(Array.isArray(d?.entries)?d.entries:[]).forEach(p=>{let f=Number(p?.ts||0);if(!Number.isFinite(f)||fo)return;let g=String(p?.status||"").trim().toLowerCase();if(!["ok","error","skipped"].includes(g))return;let m=s.alignToLocalDay?a?.get(Gp(f)):Math.floor((f-l)/s.bucketMs);if(!Number.isFinite(Number(m))||m<0||m>=s.bucketCount)return;i[m][g]+=1,i[m].totalTokens+=rn(p);let h=$n(p);h!=null&&(i[m].totalCost+=h,i[m].costCount+=1)})});let c=i.map((d,u)=>{let p=d.ok+d.error+d.skipped;return{...d,total:p,label:s.formatLabel(d.startMs),showLabel:s.showLabel(d,u,i.length)}});return{points:c,maxTotal:Math.max(1,...c.map(d=>d.total))}},Hw=({bulkRunsByJobId:t={},initialRange:e=Fi,selectedBucketFilter:n=null,onBucketFilterChange:s=()=>{}})=>{let o=te(null),r=te(null),[i,a]=y(Oi),[l,c]=y(e===Wi?Wi:e===xr?xr:Fi),d=F(()=>BP({bulkRunsByJobId:t,nowMs:Date.now(),range:l}),[t,l]);L(()=>{s(null)},[l,s]);let u=F(()=>!n||n.range!==l?"":d.points.find(m=>Number(m.startMs)===Number(n.startMs)&&Number(m.endMs)===Number(n.endMs))?.key||"",[l,n,d.points]),p=F(()=>d.points.findIndex(g=>g.key===u),[u,d.points]),f=F(()=>{let g="0.22",m="0.86",h=v=>p>=0&&p!==v,x=d.points.map(v=>v.showLabel?v.label:"");return i===Oi?{labels:x,datasets:[{label:"ok",data:d.points.map(v=>Number(v.ok||0)),stack:"outcomes",backgroundColor:d.points.map((v,$)=>`rgba(34,255,170,${h($)?g:m})`),borderColor:d.points.map((v,$)=>`rgba(34,255,170,${h($)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1},{label:"error",data:d.points.map(v=>Number(v.error||0)),stack:"outcomes",backgroundColor:d.points.map((v,$)=>`rgba(255,74,138,${h($)?g:m})`),borderColor:d.points.map((v,$)=>`rgba(255,74,138,${h($)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1},{label:"skipped",data:d.points.map(v=>Number(v.skipped||0)),stack:"outcomes",backgroundColor:d.points.map((v,$)=>`rgba(255,214,64,${h($)?g:m})`),borderColor:d.points.map((v,$)=>`rgba(255,214,64,${h($)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1}]}:{labels:x,datasets:[{label:i===Bi?"tokens":"cost",data:d.points.map(v=>Number(i===Bi?v.totalTokens||0:v.totalCost||0)),backgroundColor:d.points.map((v,$)=>i===Bi?`rgba(34,211,238,${h($)?g:"0.72"})`:`rgba(167,139,250,${h($)?g:"0.72"})`),borderColor:d.points.map((v,$)=>i===Bi?`rgba(34,211,238,${h($)?"0.35":"1"})`:`rgba(167,139,250,${h($)?"0.35":"1"})`),borderWidth:1,borderRadius:0,borderSkipped:!1}]}},[i,p,d.points]);return L(()=>{let g=o.current;if(!g||!us)return;r.current&&(r.current.destroy(),r.current=null);let m=h=>{let x=d.points[h];return x?{key:x.key,label:x.label,range:l,startMs:Number(x.startMs||0),endMs:Number(x.endMs||0)}:null};return r.current=new us(g,{type:"bar",data:f,options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},animation:!1,onHover:(h,x)=>{let b=h?.native?.target;!b||!b.style||(b.style.cursor=Array.isArray(x)&&x.length>0?"pointer":"default")},onClick:(h,x)=>{let b=Number(x?.[0]?.index);if(!Number.isFinite(b))return;let v=m(b);if(v){if(v.key===u){s(null);return}s(v)}},scales:{x:{stacked:i===Oi,grid:{color:"rgba(148,163,184,0.08)"},ticks:{color:"rgba(156,163,175,1)",maxRotation:0,autoSkip:!1}},y:{stacked:i===Oi,beginAtZero:!0,grid:{color:"rgba(148,163,184,0.12)"},ticks:{precision:i===pc?void 0:0,color:"rgba(156,163,175,1)",callback:h=>i===pc?ct(Number(h||0)):Ne(Number(h||0))}}},plugins:{legend:{position:"bottom",labels:{color:"rgba(209,213,219,1)",boxWidth:10,boxHeight:10}},tooltip:{callbacks:{title:h=>String(h?.[0]?.label||""),label:h=>{let x=Number(h.parsed.y||0);return i===pc?`${h.dataset.label}: ${ct(x)}`:`${h.dataset.label}: ${Ne(x)}`},footer:h=>{let x=Number(h?.[0]?.dataIndex),b=d.points[x];if(!b)return"";let v=b.costCount>0?`~${ct(b.totalCost)}`:"\u2014",$=Ne(b.totalTokens||0);return`runs: ${b.total} +tokens: ${$} +cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s,l,u,d.points]),IP`

Trends

- <${Xe} - options=${CP} + <${nt} + options=${NP} value=${i} onChange=${a} /> - <${Xe} - options=${SP} + <${nt} + options=${DP} value=${l} onChange=${c} /> @@ -5047,7 +5130,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- `};var cc=P.bind(T),D0="24h",Bi="7d",N0="30d",AP=[{label:"24h",value:D0},{label:"7d",value:Bi},{label:"30d",value:N0}],I0={[D0]:1440*60*1e3,[Bi]:10080*60*1e3,[N0]:720*60*60*1e3},Gp=3,TP={"Token hungry":"warning","Potentially wasteful":"danger","Most expensive":"accent"},PP=10,RP=1e5,LP=3,qp=(t=0)=>{let e=Number(t||0);return`${Te(e)} ${e===1?"run":"runs"}`},EP=(t=null)=>String(t?.delivery?.mode||t?.deliveryMode||"none").trim().toLowerCase(),Jp=(t=[],e=[])=>[...t].sort((n,s)=>{for(let o of e){let r=Number(o(n)||0),i=Number(o(s)||0);if(r!==i)return i-r}return String(n?.jobName||"").localeCompare(String(s?.jobName||""))}),IP=({jobs:t=[],bulkRunsByJobId:e={},rangeValue:n=Bi})=>{let s=Date.now(),o=Number(I0[n]||I0[Bi]),r=s-o,i=t.reduce((a,l)=>{let c=String(l?.id||"");return c&&(a[c]={jobId:c,jobName:String(l?.name||c),runCount:0,totalTokens:0,totalCost:0,hasCostData:!1,hasDelivery:EP(l)!=="none"}),a},{});return Object.entries(e||{}).forEach(([a,l])=>{let c=String(a||"");if(!c)return;i[c]||(i[c]={jobId:c,jobName:c,runCount:0,totalTokens:0,totalCost:0,hasCostData:!1,hasDelivery:!1}),(Array.isArray(l?.entries)?l.entries:[]).forEach(u=>{let p=Number(u?.ts||0);if(!Number.isFinite(p)||ps)return;i[c].runCount+=1,i[c].totalTokens+=Number(rn(u)||0);let f=$n(u);f!=null&&(i[c].hasCostData=!0,i[c].totalCost+=Number(f||0))})}),Object.values(i).map(a=>({...a,avgTokensPerRun:a.runCount>0?Math.round(a.totalTokens/a.runCount):0,avgCostPerRun:a.runCount>0?a.totalCost/a.runCount:0}))},DP=({title:t="",rows:e=[],onSelectJob:n=()=>{}})=>{let s=TP[t]||"neutral",o=e[0],r=e.slice(1);return cc` + `};var fc=P.bind(T),jw="24h",Hi="7d",zw="30d",FP=[{label:"24h",value:jw},{label:"7d",value:Hi},{label:"30d",value:zw}],Vw={[jw]:1440*60*1e3,[Hi]:10080*60*1e3,[zw]:720*60*60*1e3},Jp=3,WP={"Token hungry":"warning","Potentially wasteful":"danger","Most expensive":"accent"},HP=10,VP=1e5,jP=3,Zp=(t=0)=>{let e=Number(t||0);return`${Ne(e)} ${e===1?"run":"runs"}`},zP=(t=null)=>String(t?.delivery?.mode||t?.deliveryMode||"none").trim().toLowerCase(),Yp=(t=[],e=[])=>[...t].sort((n,s)=>{for(let o of e){let r=Number(o(n)||0),i=Number(o(s)||0);if(r!==i)return i-r}return String(n?.jobName||"").localeCompare(String(s?.jobName||""))}),UP=({jobs:t=[],bulkRunsByJobId:e={},rangeValue:n=Hi})=>{let s=Date.now(),o=Number(Vw[n]||Vw[Hi]),r=s-o,i=t.reduce((a,l)=>{let c=String(l?.id||"");return c&&(a[c]={jobId:c,jobName:String(l?.name||c),runCount:0,totalTokens:0,totalCost:0,hasCostData:!1,hasDelivery:zP(l)!=="none"}),a},{});return Object.entries(e||{}).forEach(([a,l])=>{let c=String(a||"");if(!c)return;i[c]||(i[c]={jobId:c,jobName:c,runCount:0,totalTokens:0,totalCost:0,hasCostData:!1,hasDelivery:!1}),(Array.isArray(l?.entries)?l.entries:[]).forEach(u=>{let p=Number(u?.ts||0);if(!Number.isFinite(p)||ps)return;i[c].runCount+=1,i[c].totalTokens+=Number(rn(u)||0);let f=$n(u);f!=null&&(i[c].hasCostData=!0,i[c].totalCost+=Number(f||0))})}),Object.values(i).map(a=>({...a,avgTokensPerRun:a.runCount>0?Math.round(a.totalTokens/a.runCount):0,avgCostPerRun:a.runCount>0?a.totalCost/a.runCount:0}))},KP=({title:t="",rows:e=[],onSelectJob:n=()=>{}})=>{let s=WP[t]||"neutral",o=e[0],r=e.slice(1);return fc`
- <${ae} tone=${s}>${t} + <${de} tone=${s}>${t}
- ${r.length>0?cc` + ${r.length>0?fc`
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s Show more
- ${r.map((i,a)=>cc` + ${r.map((i,a)=>fc`
`:null}
- `},O0=({jobs:t=[],bulkRunsByJobId:e={},onSelectJob:n=()=>{}})=>{let[s,o]=y(Bi),r=F(()=>IP({jobs:t,bulkRunsByJobId:e,rangeValue:s}),[e,t,s]),i=F(()=>Jp(r.filter(d=>d.runCount>=LP&&d.avgTokensPerRun>=RP),[d=>d.avgTokensPerRun,d=>d.totalTokens]).slice(0,Gp).map(d=>({...d,primaryLabel:`${Te(d.avgTokensPerRun)} avg tokens/run`,secondaryLabel:`${Te(d.totalTokens)} total tokens \xB7 ${qp(d.runCount)}`})),[r]),a=F(()=>Jp(r.filter(d=>d.runCount>=PP&&d.hasDelivery===!1&&(d.totalTokens>0||d.totalCost>0)),[d=>d.totalTokens,d=>d.runCount]).slice(0,Gp).map(d=>({...d,primaryLabel:`${qp(d.runCount)} with no delivery`,secondaryLabel:`${Te(d.totalTokens)} total tokens${d.hasCostData?` \xB7 ${it(d.totalCost)}`:""}`})),[r]),l=F(()=>Jp(r.filter(d=>d.runCount>0&&d.totalCost>0),[d=>d.totalCost,d=>d.avgCostPerRun]).slice(0,Gp).map(d=>({...d,primaryLabel:`${it(d.totalCost)} total estimated cost`,secondaryLabel:`${it(d.avgCostPerRun)} avg/run \xB7 ${qp(d.runCount)}`})),[r]),c=[{title:"Token hungry",rows:i},{title:"Potentially wasteful",rows:a},{title:"Most expensive",rows:l}].filter(d=>Array.isArray(d.rows)&&d.rows.length>0);return c.length===0?null:cc` + `},Uw=({jobs:t=[],bulkRunsByJobId:e={},onSelectJob:n=()=>{}})=>{let[s,o]=y(Hi),r=F(()=>UP({jobs:t,bulkRunsByJobId:e,rangeValue:s}),[e,t,s]),i=F(()=>Yp(r.filter(d=>d.runCount>=jP&&d.avgTokensPerRun>=VP),[d=>d.avgTokensPerRun,d=>d.totalTokens]).slice(0,Jp).map(d=>({...d,primaryLabel:`${Ne(d.avgTokensPerRun)} avg tokens/run`,secondaryLabel:`${Ne(d.totalTokens)} total tokens \xB7 ${Zp(d.runCount)}`})),[r]),a=F(()=>Yp(r.filter(d=>d.runCount>=HP&&d.hasDelivery===!1&&(d.totalTokens>0||d.totalCost>0)),[d=>d.totalTokens,d=>d.runCount]).slice(0,Jp).map(d=>({...d,primaryLabel:`${Zp(d.runCount)} with no delivery`,secondaryLabel:`${Ne(d.totalTokens)} total tokens${d.hasCostData?` \xB7 ${ct(d.totalCost)}`:""}`})),[r]),l=F(()=>Yp(r.filter(d=>d.runCount>0&&d.totalCost>0),[d=>d.totalCost,d=>d.avgCostPerRun]).slice(0,Jp).map(d=>({...d,primaryLabel:`${ct(d.totalCost)} total estimated cost`,secondaryLabel:`${ct(d.avgCostPerRun)} avg/run \xB7 ${Zp(d.runCount)}`})),[r]),c=[{title:"Token hungry",rows:i},{title:"Potentially wasteful",rows:a},{title:"Most expensive",rows:l}].filter(d=>Array.isArray(d.rows)&&d.rows.length>0);return c.length===0?null:fc`

Insights

- <${Xe} - options=${AP} + <${nt} + options=${FP} value=${s} onChange=${o} />
- ${c.map(d=>DP({title:d.title,rows:d.rows,onSelectJob:n}))} + ${c.map(d=>KP({title:d.title,rows:d.rows,onSelectJob:n}))}
- `};var NP=P.bind(T),cs=({title:t="",value:e="\u2014",toneClassName:n="",valueClassName:s="text-lg font-semibold text-body",monospace:o=!1}={})=>NP` + `};var GP=P.bind(T),ps=({title:t="",value:e="\u2014",toneClassName:n="",valueClassName:s="text-lg font-semibold text-body",monospace:o=!1}={})=>GP`

${t}

${e}
-`;var dc=P.bind(T),OP=100,B0=20,BP=2,Fi="24h",Hi="7d",Wi="30d",Zp="trendStart",Yp="trendEnd",Xp="trendRange",Qp="trendLabel",FP=[{label:"all",value:"all"},{label:"ok",value:"ok"},{label:"error",value:"error"},{label:"skipped",value:"skipped"}],HP=t=>t==="error"?"border-status-error-border bg-status-error-bg text-status-error":t==="warning"?"border-status-warning-border bg-status-warning-bg text-status-warning":"border-border bg-field text-body",WP=(t=[])=>{let e=t.filter(r=>r?.tone==="error").length,n=t.filter(r=>r?.tone==="warning").length;if(e+n<=0)return"No warnings currently need your attention";let o=[];return e>0&&o.push(`${e} error${e===1?"":"s"}`),n>0&&o.push(`${n} warning${n===1?"":"s"}`),`${o.join(" and ")} may need your attention`},VP=({bulkRunsByJobId:t={},jobs:e=[],limit:n=0}={})=>{let s=e.reduce((o,r)=>{let i=String(r?.id||"");return i&&(o[i]=String(r?.name||i)),o},{});return Object.entries(t||{}).flatMap(([o,r])=>(Array.isArray(r?.entries)?r.entries:[]).map(a=>({...a,jobId:String(o||""),jobName:s[o]||String(o||"")}))).filter(o=>Number(o?.ts||0)>0).sort((o,r)=>Number(r?.ts||0)-Number(o?.ts||0)).slice(0,Number(n||0)>0?Number(n||0):void 0)},jP=(t=[])=>{let e=[],n=0;for(;n=BP){let i=r.reduce((a,l)=>{let c=String(l?.status||"unknown");return a[c]=Number(a[c]||0)+1,a},{});e.push({type:"collapsed-group",jobId:String(s?.jobId||""),jobName:String(s?.jobName||s?.jobId||""),count:r.length,newestTs:Number(r[0]?.ts||0),oldestTs:Number(r[r.length-1]?.ts||0),statusCounts:i,entries:r}),n=o;continue}for(let i of r){if(e.length>=B0)break;e.push({type:"entry",entry:i})}n=o}return e},F0=()=>{let e=String(window.location.hash||"").replace(/^#/,"")||"/cron",[n,s=""]=e.split("?");return{pathPart:n||"/cron",params:new URLSearchParams(s)}},zP=()=>{let{params:t}=F0(),e=Number(t.get(Zp)||0),n=Number(t.get(Yp)||0),s=String(t.get(Xp)||Fi),o=String(t.get(Qp)||""),r=s===Fi||s===Hi||s===Wi;return!Number.isFinite(e)||!Number.isFinite(n)||n<=e?null:{startMs:e,endMs:n,range:r?s:Fi,label:o||"selected period"}},UP=(t=null)=>{let{pathPart:e,params:n}=F0();t?(n.set(Zp,String(Number(t.startMs||0))),n.set(Yp,String(Number(t.endMs||0))),n.set(Xp,t.range===Wi?Wi:t.range===Hi?Hi:Fi),n.set(Qp,String(t.label||""))):(n.delete(Zp),n.delete(Yp),n.delete(Xp),n.delete(Qp));let s=n.toString(),o=s?`#${e}?${s}`:`#${e}`,r=`${window.location.pathname}${window.location.search}${o}`;window.history.replaceState(window.history.state,"",r)},H0=({jobs:t=[],bulkUsageByJobId:e={},bulkRunsByJobId:n={},onSelectJob:s=()=>{}})=>{let[o,r]=y("all"),[i,a]=y(()=>zP()),l=t.filter(x=>x.enabled!==!1).length,c=t.length-l,d=Yy(t),u=Zy(t,n),p=F(()=>VP({bulkRunsByJobId:n,jobs:t}),[n,t]),f=F(()=>p.slice(0,OP),[p]),g=F(()=>{if(!i)return f;let x=Number(i?.startMs||0),v=Number(i?.endMs||0);return!Number.isFinite(x)||!Number.isFinite(v)||v<=x?f:p.filter(w=>{let $=Number(w?.ts||0);return Number.isFinite($)&&$>=x&&$g.filter(x=>o==="all"?!0:String(x?.status||"").trim().toLowerCase()===o),[o,g]),h=F(()=>jP(m),[m]),b=i?.range===Wi?Wi:i?.range===Hi?Hi:Fi;return L(()=>{UP(i)},[i]),dc` +`;var hc=P.bind(T),qP=100,Kw=20,JP=2,Vi="24h",ji="7d",zi="30d",Xp="trendStart",Qp="trendEnd",ef="trendRange",tf="trendLabel",ZP=[{label:"all",value:"all"},{label:"ok",value:"ok"},{label:"error",value:"error"},{label:"skipped",value:"skipped"}],YP=t=>t==="error"?"border-status-error-border bg-status-error-bg text-status-error":t==="warning"?"border-status-warning-border bg-status-warning-bg text-status-warning":"border-border bg-field text-body",XP=(t=[])=>{let e=t.filter(r=>r?.tone==="error").length,n=t.filter(r=>r?.tone==="warning").length;if(e+n<=0)return"No warnings currently need your attention";let o=[];return e>0&&o.push(`${e} error${e===1?"":"s"}`),n>0&&o.push(`${n} warning${n===1?"":"s"}`),`${o.join(" and ")} may need your attention`},QP=({bulkRunsByJobId:t={},jobs:e=[],limit:n=0}={})=>{let s=e.reduce((o,r)=>{let i=String(r?.id||"");return i&&(o[i]=String(r?.name||i)),o},{});return Object.entries(t||{}).flatMap(([o,r])=>(Array.isArray(r?.entries)?r.entries:[]).map(a=>({...a,jobId:String(o||""),jobName:s[o]||String(o||"")}))).filter(o=>Number(o?.ts||0)>0).sort((o,r)=>Number(r?.ts||0)-Number(o?.ts||0)).slice(0,Number(n||0)>0?Number(n||0):void 0)},e3=(t=[])=>{let e=[],n=0;for(;n=JP){let i=r.reduce((a,l)=>{let c=String(l?.status||"unknown");return a[c]=Number(a[c]||0)+1,a},{});e.push({type:"collapsed-group",jobId:String(s?.jobId||""),jobName:String(s?.jobName||s?.jobId||""),count:r.length,newestTs:Number(r[0]?.ts||0),oldestTs:Number(r[r.length-1]?.ts||0),statusCounts:i,entries:r}),n=o;continue}for(let i of r){if(e.length>=Kw)break;e.push({type:"entry",entry:i})}n=o}return e},Gw=()=>{let e=String(window.location.hash||"").replace(/^#/,"")||"/cron",[n,s=""]=e.split("?");return{pathPart:n||"/cron",params:new URLSearchParams(s)}},t3=()=>{let{params:t}=Gw(),e=Number(t.get(Xp)||0),n=Number(t.get(Qp)||0),s=String(t.get(ef)||Vi),o=String(t.get(tf)||""),r=s===Vi||s===ji||s===zi;return!Number.isFinite(e)||!Number.isFinite(n)||n<=e?null:{startMs:e,endMs:n,range:r?s:Vi,label:o||"selected period"}},n3=(t=null)=>{let{pathPart:e,params:n}=Gw();t?(n.set(Xp,String(Number(t.startMs||0))),n.set(Qp,String(Number(t.endMs||0))),n.set(ef,t.range===zi?zi:t.range===ji?ji:Vi),n.set(tf,String(t.label||""))):(n.delete(Xp),n.delete(Qp),n.delete(ef),n.delete(tf));let s=n.toString(),o=s?`#${e}?${s}`:`#${e}`,r=`${window.location.pathname}${window.location.search}${o}`;window.history.replaceState(window.history.state,"",r)},qw=({jobs:t=[],bulkUsageByJobId:e={},bulkRunsByJobId:n={},onSelectJob:s=()=>{}})=>{let[o,r]=y("all"),[i,a]=y(()=>t3()),l=t.filter(b=>b.enabled!==!1).length,c=t.length-l,d=rv(t),u=ov(t,n),p=F(()=>QP({bulkRunsByJobId:n,jobs:t}),[n,t]),f=F(()=>p.slice(0,qP),[p]),g=F(()=>{if(!i)return f;let b=Number(i?.startMs||0),v=Number(i?.endMs||0);return!Number.isFinite(b)||!Number.isFinite(v)||v<=b?f:p.filter($=>{let w=Number($?.ts||0);return Number.isFinite(w)&&w>=b&&wg.filter(b=>o==="all"?!0:String(b?.status||"").trim().toLowerCase()===o),[o,g]),h=F(()=>e3(m),[m]),x=i?.range===zi?zi:i?.range===ji?ji:Vi;return L(()=>{n3(i)},[i]),hc`
- <${cs} + <${ps} title="Total jobs" value=${t.length} monospace=${!0} /> - <${cs} + <${ps} title="Enabled" value=${l} monospace=${!0} /> - <${cs} + <${ps} title="Disabled" value=${c} monospace=${!0} @@ -5150,11 +5233,11 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- <${gb} + <${yb} className="w-4 h-4 text-status-warning shrink-0" />
- ${WP(u)} + ${XP(u)}
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- ${u.length===0?dc`
+ ${u.length===0?hc`
No warnings right now. -
`:dc` +
`:hc`
- ${u.map((x,v)=>dc` + ${u.map((b,v)=>hc`
{x?.jobId&&s(x.jobId)}} - onKeyDown=${w=>{x?.jobId&&(w.key!=="Enter"&&w.key!==" "||(w.preventDefault(),s(x.jobId)))}} + class=${`rounded-xl border p-3 text-xs ${YP(b.tone)} ${b?.jobId?"cursor-pointer hover:brightness-110":""}`} + role=${b?.jobId?"button":null} + tabindex=${b?.jobId?"0":null} + onclick=${()=>{b?.jobId&&s(b.jobId)}} + onKeyDown=${$=>{b?.jobId&&($.key!=="Enter"&&$.key!==" "||($.preventDefault(),s(b.jobId)))}} > -
${x.title}
-
${x.body}
+
${b.title}
+
${b.body}
`)}
@@ -5187,29 +5270,29 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s - <${L0} + <${Ww} jobs=${t} usageByJobId=${e} runsByJobId=${n} onSelectJob=${s} /> - <${O0} + <${Uw} jobs=${t} bulkRunsByJobId=${n} onSelectJob=${s} /> - <${E0} + <${Hw} bulkRunsByJobId=${n} - initialRange=${b} + initialRange=${x} selectedBucketFilter=${i} onBucketFilterChange=${a} /> - <${ic} - entryCountLabel=${`${Te(m.length)} entries`} - primaryFilterOptions=${FP} + <${dc} + entryCountLabel=${`${Ne(m.length)} entries`} + primaryFilterOptions=${ZP} primaryFilterValue=${o} onChangePrimaryFilter=${r} activeFilterLabel=${i?.label||""} @@ -5221,12 +5304,12 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s />
- `};var ef=(t="")=>String(t||"").trim(),Je=(t=null)=>ef(t?.key||t?.sessionKey||""),tf=(t="")=>{let n=ef(t).match(/^agent:([^:]+):/);return String(n?.[1]||"").trim()},uc=(t="")=>{let e=ef(t).toLowerCase();return e.includes(":direct:")||e.includes(":group:")},pc=t=>!!(String(t?.replyChannel||"").trim()&&String(t?.replyTo||"").trim())||uc(Je(t)),W0={destination:0,other:1},V0=(t=null)=>uc(Je(t))?W0.destination:W0.other,j0=(t=[])=>[...Array.isArray(t)?t:[]].sort((e,n)=>{let s=V0(e)-V0(n);if(s!==0)return s;let o=Number(n?.updatedAt||0)-Number(e?.updatedAt||0);return o!==0?o:Je(e).localeCompare(Je(n))}),z0=(t=null)=>{let e=String(t?.replyChannel||"").trim(),n=String(t?.replyTo||"").trim();if(!e||!n)return null;let s=tf(Je(t));return{channel:e,to:n,...s?{agentId:s}:{}}};var KP=()=>{try{let t=localStorage.getItem(Ad);if(!t)return[];let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}},GP=t=>{try{localStorage.setItem(Ad,JSON.stringify(t))}catch{}},U0=()=>{try{return localStorage.getItem(Td)||""}catch{return""}},qP=t=>{try{localStorage.setItem(Td,String(t||""))}catch{}},nf=(t,e)=>{if(e){let n=t.find(s=>Je(s)===e);if(n)return n}return t.find(n=>Je(n).toLowerCase()==="agent:main:main")||t.find(n=>uc(Je(n)))||t[0]||null},yr=({enabled:t=!1,filter:e}={})=>{let[n,s]=y([]),[o,r]=y(""),[i,a]=y(!1),[l,c]=y(""),d=q(f=>{let g=String(f||"");r(g),qP(g)},[]);L(()=>{if(!t)return;let f=!0,g=KP(),m=U0();if(g.length>0){s(g);let b=nf(g,m);r(Je(b))}return(async()=>{try{g.length===0&&a(!0),c("");let b=await Xh();if(!f)return;let x=Array.isArray(b?.sessions)?b.sessions:[];if(s(x),GP(x),g.length===0||!m){let v=nf(x,m);r(Je(v))}}catch(b){if(!f)return;g.length===0&&(s([]),r(""),c(b.message||"Could not load agent sessions"))}finally{f&&a(!1)}})(),()=>{f=!1}},[t]);let u=F(()=>j0(e?n.filter(e):n),[n,e]);L(()=>{if(!t)return;if(u.length===0){o&&r("");return}if(u.some(m=>Je(m)===String(o||"")))return;let g=nf(u,U0());r(Je(g))},[t,u,o]);let p=F(()=>u.find(f=>Je(f)===o)||null,[u,o]);return{sessions:u,selectedSessionKey:o,setSelectedSessionKey:d,selectedSession:p,loading:i,error:l}};var Is="__none__",Ds=({enabled:t=!1,resetKey:e=""}={})=>{let[n,s]=y(""),[o,r]=y(!1),{sessions:i,selectedSessionKey:a,setSelectedSessionKey:l,loading:c,error:d}=yr({enabled:t,filter:pc});L(()=>{t&&(s(""),r(!1))},[t,e]);let u=F(()=>{let h=i.find(b=>Je(b)===String(a||"").trim());return String(Je(h)||Je(i[0])).trim()},[i,a]),p=o?n:u,f=F(()=>i.find(h=>Je(h)===String(p||"").trim())||null,[p,i]),g=F(()=>z0(f),[f]),m=q(h=>{let b=String(h||"");s(b),r(!0),l(b)},[l]);return{sessions:i,loading:c,error:d,destinationSessionKey:p,setDestinationSessionKey:m,selectedDestinationSession:f,selectedDestination:g}};var JP=372,ZP=220,YP=480,sf="cronListPanelWidthPx",K0=25,XP=30,QP=30,G0="24h",q0="7d",J0="30d",ds={sessionTarget:"main",wakeMode:"now",deliveryMode:"none",deliveryChannel:"",deliveryTo:""},of=(t=null)=>({sessionTarget:String(t?.sessionTarget||ds.sessionTarget),wakeMode:String(t?.wakeMode||ds.wakeMode),deliveryMode:String(t?.delivery?.mode||ds.deliveryMode),deliveryChannel:String(t?.delivery?.channel||""),deliveryTo:String(t?.delivery?.to||"")}),Z0=t=>Math.max(ZP,Math.min(YP,t)),e3=(t="")=>String(t||"").trim()||ws,Y0=({jobId:t="",onSetLocation:e=()=>{}}={})=>{let n=e3(t),s=n===ws?"":n,o=ee(null),[r,i]=y(()=>{let H=Fe();return Number.isFinite(H?.[sf])?Z0(H[sf]):JP}),[a,l]=y(!1),[c,d]=y("all"),[u,p]=y([]),[f,g]=y(!1),[m,h]=y(0),[b,x]=y(0),[v,w]=y(!1),[$,S]=y(""),[C,_]=y(""),[k,A]=y(!1),[O,D]=y(!1),[z,E]=y(!1),[M,R]=y(ds),[B,I]=y(30),[U,W]=y(q0),[G,se]=y(null),{sessions:K,loading:j,error:X,destinationSessionKey:de,setDestinationSessionKey:le,selectedDestination:ie}=Ds({enabled:!!s,resetKey:String(s||"")}),ne=Re(()=>vm({sortBy:"nextRunAtMs",sortDir:"asc"}),15e3),xe=Re($m,3e4),he=Re(()=>s?cd(s,{limit:K0,offset:0,status:c,sortDir:"desc"}):Promise.resolve({ok:!0,runs:{entries:[],hasMore:!1,nextOffset:0}}),1e4,{enabled:!!s}),ue=Re(()=>s?wm(s,{days:B}):Promise.resolve({ok:!0,usage:null}),6e4,{enabled:!!s}),me=Re(()=>s?km(s,{range:U}):Promise.resolve({ok:!0,trends:null}),6e4,{enabled:!!s}),V=Re(()=>Sm({days:XP}),6e4,{enabled:!s}),J=Re(()=>Cm({sinceMs:Date.now()-QP*24*60*60*1e3,limitPerJob:1200}),3e4,{enabled:!s});L(()=>{let H=Fe();H[sf]=r,Ct(H)},[r]),L(()=>{he.data?.runs&&(p(Array.isArray(he.data.runs.entries)?he.data.runs.entries:[]),g(!!he.data.runs.hasMore),h(Number(he.data.runs.nextOffset||0)),x(Number(he.data.runs.total||0)))},[he.data]);let oe=F(()=>Array.isArray(ne.data?.jobs)?ne.data.jobs:[],[ne.data]),ce=F(()=>oe.find(H=>String(H?.id||"")===s)||null,[oe,s]);L(()=>{if(!s){S(""),_(""),R(ds);return}let H=String(ce?.payload?.message||"");S(H),_(H),R(of(ce))},[s,ce?.payload?.message]),L(()=>{s&&R(of(ce))},[s,ce?.sessionTarget,ce?.wakeMode,ce?.delivery?.mode]),L(()=>{p([]),g(!1),h(0),x(0),s&&he.refresh()},[s,c]),L(()=>{s&&ue.refresh()},[s,B]),L(()=>{s&&(se(null),me.refresh())},[U,s]);let be=F(()=>{let H=Array.isArray(u)?u:[],re=G;if(!re)return H;let ye=Number(re?.startMs||0),ve=Number(re?.endMs||0);return!Number.isFinite(ye)||!Number.isFinite(ve)||ve<=ye?H:H.filter(Ie=>{let gt=Number(Ie?.ts||0);return Number.isFinite(gt)&>>=ye&>{let re=o.current;if(!re)return;let ye=re.parentElement?.getBoundingClientRect();if(!ye)return;let ve=Z0(Math.round(H-ye.left));i(ve)},[]),et=q(H=>{H.preventDefault(),l(!0),Ve(H.clientX)},[Ve]);L(()=>{if(!a)return()=>{};let H=Ie=>Ve(Ie.clientX),re=()=>l(!1);window.addEventListener("pointermove",H),window.addEventListener("pointerup",re);let ye=document.body.style.userSelect,ve=document.body.style.cursor;return document.body.style.userSelect="none",document.body.style.cursor="col-resize",()=>{window.removeEventListener("pointermove",H),window.removeEventListener("pointerup",re),document.body.style.userSelect=ye,document.body.style.cursor=ve}},[a,Ve]);let kt=q(()=>{e("/cron")},[e]),Ot=q(H=>{e(`/cron/${encodeURIComponent(String(H||""))}`)},[e]),Q=q(()=>{ne.refresh(),xe.refresh(),he.refresh(),ue.refresh(),me.refresh(),V.refresh(),J.refresh()},[J.refresh,V.refresh,ne.refresh,he.refresh,xe.refresh,me.refresh,ue.refresh]),pe=q(async()=>{if(!(!s||O)){D(!0);try{await _m(s),N("Cron run triggered","success"),Q()}catch(H){N(H.message||"Could not run cron job","error")}finally{D(!1)}}},[Q,O,s]),te=q(async H=>{if(!(!s||z)){E(!0);try{await Mm(s,H),N(H?"Cron job enabled":"Cron job disabled","success"),Q()}catch(re){N(re.message||"Could not update cron job","error")}finally{E(!1)}}},[Q,s,z]),Ee=q(async()=>{if(!(!s||!f||v)){w(!0);try{let H=await cd(s,{limit:K0,offset:m,status:c,sortDir:"desc"}),re=Array.isArray(H?.runs?.entries)?H.runs.entries:[];p(ye=>[...ye,...re]),g(!!H?.runs?.hasMore),h(Number(H?.runs?.nextOffset||0)),x(Number(H?.runs?.total||0))}catch(H){N(H.message||"Could not load more runs","error")}finally{w(!1)}}},[v,f,m,c,s]),ke=q(async()=>{if(!s||!ce||k)return;let H=of(ce),re={sessionTarget:String(M?.sessionTarget||ds.sessionTarget),wakeMode:String(M?.wakeMode||ds.wakeMode),deliveryMode:String(M?.deliveryMode||ds.deliveryMode),deliveryChannel:String(M?.deliveryChannel||""),deliveryTo:String(M?.deliveryTo||"")},ye=re.sessionTarget===H.sessionTarget&&re.wakeMode===H.wakeMode&&re.deliveryMode===H.deliveryMode&&re.deliveryChannel===H.deliveryChannel&&re.deliveryTo===H.deliveryTo,ve=$===C;if(!(ye&&ve)){A(!0);try{ye||await Tm(s,re),ve||(await Am(s,$),_($)),N("Changes saved","success"),Q()}catch(Ie){N(Ie.message||"Could not save changes","error")}finally{A(!1)}}},[$,Q,M,C,k,ce,s]);return L(()=>{s&&String(M?.deliveryMode||"none")==="announce"&&(!ie?.channel&&!ie?.to||R((H=ds)=>{let re=String(ie?.channel||H.deliveryChannel||""),ye=String(ie?.to||H.deliveryTo||"");return re===String(H.deliveryChannel||"")&&ye===String(H.deliveryTo||"")?H:{...H,deliveryChannel:re,deliveryTo:ye}}))},[M?.deliveryMode,ie?.channel,ie?.to,s]),{refs:{listPanelRef:o},state:{jobs:oe,jobsError:ne.error,status:xe.data?.status||null,statusError:xe.error,selectedRouteKey:n,selectedJobId:s,selectedJob:ce,listPanelWidthPx:r,isResizingListPanel:a,runEntries:u,filteredRunEntries:be,runHasMore:f,runNextOffset:m,runTotal:b,runStatusFilter:c,runsError:he.error,loadingMoreRuns:v,usage:ue.data?.usage||null,jobTrends:me.data?.trends||null,usageError:ue.error,trendsError:me.error,usageDays:B,jobTrendRange:U===J0?J0:U===G0?G0:q0,selectedJobTrendBucketFilter:G,bulkUsageByJobId:V.data?.usage?.byJobId||{},bulkUsageError:V.error,bulkRunsByJobId:J.data?.runs?.byJobId||{},bulkRunsError:J.error,promptValue:$,savedPromptValue:C,savingChanges:k,runningJob:O,togglingJobEnabled:z,routingDraft:M,deliverySessions:K,loadingDeliverySessions:j,deliverySessionsError:X,destinationSessionKey:de},actions:{setRunStatusFilter:d,setUsageDays:I,setJobTrendRange:W,setSelectedJobTrendBucketFilter:se,setPromptValue:S,saveChanges:ke,refreshAll:Q,loadMoreRuns:Ee,runSelectedJobNow:pe,setSelectedJobEnabled:te,selectAllJobs:kt,selectJob:Ot,onListResizerPointerDown:et,setRoutingDraft:R,setDestinationSessionKey:le}}};var us=P.bind(T),X0=({jobId:t="",onSetLocation:e=()=>{}})=>{let{state:n,actions:s}=Y0({jobId:t,onSetLocation:e}),[o,r]=y(!1),i=ee(null),a=n.selectedRouteKey===ws,l=n.jobs.length===0,c=n.selectedJob,d=F(()=>{if(a)return"All jobs";let g=n.jobs.find(m=>String(m?.id||"")===String(n.selectedRouteKey||""));return String(g?.name||g?.id||"All jobs")},[a,n.jobs,n.selectedRouteKey]),u=F(()=>{if(a||!c)return!1;let g=String(n.routingDraft?.sessionTarget||c?.sessionTarget||"main"),m=String(n.routingDraft?.wakeMode||c?.wakeMode||"now"),h=String(n.routingDraft?.deliveryMode||c?.delivery?.mode||"none"),b=String(c?.sessionTarget||"main"),x=String(c?.wakeMode||"now"),v=String(c?.delivery?.mode||"none"),w=g!==b||m!==x||h!==v,$=n.promptValue!==n.savedPromptValue;return w||$},[a,c,n.promptValue,n.routingDraft?.deliveryMode,n.routingDraft?.sessionTarget,n.routingDraft?.wakeMode,n.savedPromptValue]);L(()=>{if(!o)return()=>{};let g=h=>{i.current?.contains(h.target)||r(!1)},m=h=>{h.key==="Escape"&&r(!1)};return window.addEventListener("pointerdown",g),window.addEventListener("keydown",m),()=>{window.removeEventListener("pointerdown",g),window.removeEventListener("keydown",m)}},[o]);let p=()=>{s.selectAllJobs(),r(!1)},f=g=>{s.selectJob(g),r(!1)};return us` + `};var nf=(t="")=>String(t||"").trim(),Xe=(t=null)=>nf(t?.key||t?.sessionKey||""),sf=(t="")=>{let n=nf(t).match(/^agent:([^:]+):/);return String(n?.[1]||"").trim()},mc=(t="")=>{let e=nf(t).toLowerCase();return e.includes(":direct:")||e.includes(":group:")},gc=t=>!!(String(t?.replyChannel||"").trim()&&String(t?.replyTo||"").trim())||mc(Xe(t)),Jw={destination:0,other:1},Zw=(t=null)=>mc(Xe(t))?Jw.destination:Jw.other,Yw=(t=[])=>[...Array.isArray(t)?t:[]].sort((e,n)=>{let s=Zw(e)-Zw(n);if(s!==0)return s;let o=Number(n?.updatedAt||0)-Number(e?.updatedAt||0);return o!==0?o:Xe(e).localeCompare(Xe(n))}),Xw=(t=null)=>{let e=String(t?.replyChannel||"").trim(),n=String(t?.replyTo||"").trim();if(!e||!n)return null;let s=sf(Xe(t));return{channel:e,to:n,...s?{agentId:s}:{}}};var s3=()=>{try{let t=localStorage.getItem(Pd);if(!t)return[];let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}},o3=t=>{try{localStorage.setItem(Pd,JSON.stringify(t))}catch{}},Qw=()=>{try{return localStorage.getItem(Rd)||""}catch{return""}},r3=t=>{try{localStorage.setItem(Rd,String(t||""))}catch{}},of=(t,e)=>{if(e){let n=t.find(s=>Xe(s)===e);if(n)return n}return t.find(n=>Xe(n).toLowerCase()==="agent:main:main")||t.find(n=>mc(Xe(n)))||t[0]||null},yr=({enabled:t=!1,filter:e}={})=>{let[n,s]=y([]),[o,r]=y(""),[i,a]=y(!1),[l,c]=y(""),d=G(f=>{let g=String(f||"");r(g),r3(g)},[]);L(()=>{if(!t)return;let f=!0,g=s3(),m=Qw();if(g.length>0){s(g);let x=of(g,m);r(Xe(x))}return(async()=>{try{g.length===0&&a(!0),c("");let x=await em();if(!f)return;let b=Array.isArray(x?.sessions)?x.sessions:[];if(s(b),o3(b),g.length===0||!m){let v=of(b,m);r(Xe(v))}}catch(x){if(!f)return;g.length===0&&(s([]),r(""),c(x.message||"Could not load agent sessions"))}finally{f&&a(!1)}})(),()=>{f=!1}},[t]);let u=F(()=>Yw(e?n.filter(e):n),[n,e]);L(()=>{if(!t)return;if(u.length===0){o&&r("");return}if(u.some(m=>Xe(m)===String(o||"")))return;let g=of(u,Qw());r(Xe(g))},[t,u,o]);let p=F(()=>u.find(f=>Xe(f)===o)||null,[u,o]);return{sessions:u,selectedSessionKey:o,setSelectedSessionKey:d,selectedSession:p,loading:i,error:l}};var Bs="__none__",Fs=({enabled:t=!1,resetKey:e=""}={})=>{let[n,s]=y(""),[o,r]=y(!1),{sessions:i,selectedSessionKey:a,setSelectedSessionKey:l,loading:c,error:d}=yr({enabled:t,filter:gc});L(()=>{t&&(s(""),r(!1))},[t,e]);let u=F(()=>{let h=i.find(x=>Xe(x)===String(a||"").trim());return String(Xe(h)||Xe(i[0])).trim()},[i,a]),p=o?n:u,f=F(()=>i.find(h=>Xe(h)===String(p||"").trim())||null,[p,i]),g=F(()=>Xw(f),[f]),m=G(h=>{let x=String(h||"");s(x),r(!0),l(x)},[l]);return{sessions:i,loading:c,error:d,destinationSessionKey:p,setDestinationSessionKey:m,selectedDestinationSession:f,selectedDestination:g}};var i3=372,a3=220,l3=480,rf="cronListPanelWidthPx",e0=25,c3=30,d3=30,t0="24h",n0="7d",s0="30d",fs={sessionTarget:"main",wakeMode:"now",deliveryMode:"none",deliveryChannel:"",deliveryTo:""},af=(t=null)=>({sessionTarget:String(t?.sessionTarget||fs.sessionTarget),wakeMode:String(t?.wakeMode||fs.wakeMode),deliveryMode:String(t?.delivery?.mode||fs.deliveryMode),deliveryChannel:String(t?.delivery?.channel||""),deliveryTo:String(t?.delivery?.to||"")}),o0=t=>Math.max(a3,Math.min(l3,t)),u3=(t="")=>String(t||"").trim()||_s,r0=({jobId:t="",onSetLocation:e=()=>{}}={})=>{let n=u3(t),s=n===_s?"":n,o=te(null),[r,i]=y(()=>{let W=je();return Number.isFinite(W?.[rf])?o0(W[rf]):i3}),[a,l]=y(!1),[c,d]=y("all"),[u,p]=y([]),[f,g]=y(!1),[m,h]=y(0),[x,b]=y(0),[v,$]=y(!1),[w,S]=y(""),[C,_]=y(""),[k,A]=y(!1),[D,N]=y(!1),[z,O]=y(!1),[M,R]=y(fs),[B,E]=y(30),[U,H]=y(n0),[K,se]=y(null),{sessions:Y,loading:j,error:J,destinationSessionKey:pe,setDestinationSessionKey:le,selectedDestination:ie}=Fs({enabled:!!s,resetKey:String(s||"")}),oe=Re(()=>$m({sortBy:"nextRunAtMs",sortDir:"asc"}),15e3),xe=Re(wm,3e4),he=Re(()=>s?dd(s,{limit:e0,offset:0,status:c,sortDir:"desc"}):Promise.resolve({ok:!0,runs:{entries:[],hasMore:!1,nextOffset:0}}),1e4,{enabled:!!s}),ue=Re(()=>s?km(s,{days:B}):Promise.resolve({ok:!0,usage:null}),6e4,{enabled:!!s}),be=Re(()=>s?Sm(s,{range:U}):Promise.resolve({ok:!0,trends:null}),6e4,{enabled:!!s}),V=Re(()=>Cm({days:c3}),6e4,{enabled:!s}),q=Re(()=>_m({sinceMs:Date.now()-d3*24*60*60*1e3,limitPerJob:1200}),3e4,{enabled:!s});L(()=>{let W=je();W[rf]=r,At(W)},[r]),L(()=>{he.data?.runs&&(p(Array.isArray(he.data.runs.entries)?he.data.runs.entries:[]),g(!!he.data.runs.hasMore),h(Number(he.data.runs.nextOffset||0)),b(Number(he.data.runs.total||0)))},[he.data]);let ae=F(()=>Array.isArray(oe.data?.jobs)?oe.data.jobs:[],[oe.data]),fe=F(()=>ae.find(W=>String(W?.id||"")===s)||null,[ae,s]);L(()=>{if(!s){S(""),_(""),R(fs);return}let W=String(fe?.payload?.message||"");S(W),_(W),R(af(fe))},[s,fe?.payload?.message]),L(()=>{s&&R(af(fe))},[s,fe?.sessionTarget,fe?.wakeMode,fe?.delivery?.mode]),L(()=>{p([]),g(!1),h(0),b(0),s&&he.refresh()},[s,c]),L(()=>{s&&ue.refresh()},[s,B]),L(()=>{s&&(se(null),be.refresh())},[U,s]);let ne=F(()=>{let W=Array.isArray(u)?u:[],re=K;if(!re)return W;let $e=Number(re?.startMs||0),we=Number(re?.endMs||0);return!Number.isFinite($e)||!Number.isFinite(we)||we<=$e?W:W.filter(Te=>{let at=Number(Te?.ts||0);return Number.isFinite(at)&&at>=$e&&at{let re=o.current;if(!re)return;let $e=re.parentElement?.getBoundingClientRect();if(!$e)return;let we=o0(Math.round(W-$e.left));i(we)},[]),ge=G(W=>{W.preventDefault(),l(!0),ve(W.clientX)},[ve]);L(()=>{if(!a)return()=>{};let W=Te=>ve(Te.clientX),re=()=>l(!1);window.addEventListener("pointermove",W),window.addEventListener("pointerup",re);let $e=document.body.style.userSelect,we=document.body.style.cursor;return document.body.style.userSelect="none",document.body.style.cursor="col-resize",()=>{window.removeEventListener("pointermove",W),window.removeEventListener("pointerup",re),document.body.style.userSelect=$e,document.body.style.cursor=we}},[a,ve]);let Oe=G(()=>{e("/cron")},[e]),qe=G(W=>{e(`/cron/${encodeURIComponent(String(W||""))}`)},[e]),Q=G(()=>{oe.refresh(),xe.refresh(),he.refresh(),ue.refresh(),be.refresh(),V.refresh(),q.refresh()},[q.refresh,V.refresh,oe.refresh,he.refresh,xe.refresh,be.refresh,ue.refresh]),ce=G(async()=>{if(!(!s||D)){N(!0);try{await Am(s),I("Cron run triggered","success"),Q()}catch(W){I(W.message||"Could not run cron job","error")}finally{N(!1)}}},[Q,D,s]),ee=G(async W=>{if(!(!s||z)){O(!0);try{await Mm(s,W),I(W?"Cron job enabled":"Cron job disabled","success"),Q()}catch(re){I(re.message||"Could not update cron job","error")}finally{O(!1)}}},[Q,s,z]),Ee=G(async()=>{if(!(!s||!f||v)){$(!0);try{let W=await dd(s,{limit:e0,offset:m,status:c,sortDir:"desc"}),re=Array.isArray(W?.runs?.entries)?W.runs.entries:[];p($e=>[...$e,...re]),g(!!W?.runs?.hasMore),h(Number(W?.runs?.nextOffset||0)),b(Number(W?.runs?.total||0))}catch(W){I(W.message||"Could not load more runs","error")}finally{$(!1)}}},[v,f,m,c,s]),ke=G(async()=>{if(!s||!fe||k)return;let W=af(fe),re={sessionTarget:String(M?.sessionTarget||fs.sessionTarget),wakeMode:String(M?.wakeMode||fs.wakeMode),deliveryMode:String(M?.deliveryMode||fs.deliveryMode),deliveryChannel:String(M?.deliveryChannel||""),deliveryTo:String(M?.deliveryTo||"")},$e=re.sessionTarget===W.sessionTarget&&re.wakeMode===W.wakeMode&&re.deliveryMode===W.deliveryMode&&re.deliveryChannel===W.deliveryChannel&&re.deliveryTo===W.deliveryTo,we=w===C;if(!($e&&we)){A(!0);try{$e||await Pm(s,re),we||(await Tm(s,w),_(w)),I("Changes saved","success"),Q()}catch(Te){I(Te.message||"Could not save changes","error")}finally{A(!1)}}},[w,Q,M,C,k,fe,s]);return L(()=>{s&&String(M?.deliveryMode||"none")==="announce"&&(!ie?.channel&&!ie?.to||R((W=fs)=>{let re=String(ie?.channel||W.deliveryChannel||""),$e=String(ie?.to||W.deliveryTo||"");return re===String(W.deliveryChannel||"")&&$e===String(W.deliveryTo||"")?W:{...W,deliveryChannel:re,deliveryTo:$e}}))},[M?.deliveryMode,ie?.channel,ie?.to,s]),{refs:{listPanelRef:o},state:{jobs:ae,jobsError:oe.error,status:xe.data?.status||null,statusError:xe.error,selectedRouteKey:n,selectedJobId:s,selectedJob:fe,listPanelWidthPx:r,isResizingListPanel:a,runEntries:u,filteredRunEntries:ne,runHasMore:f,runNextOffset:m,runTotal:x,runStatusFilter:c,runsError:he.error,loadingMoreRuns:v,usage:ue.data?.usage||null,jobTrends:be.data?.trends||null,usageError:ue.error,trendsError:be.error,usageDays:B,jobTrendRange:U===s0?s0:U===t0?t0:n0,selectedJobTrendBucketFilter:K,bulkUsageByJobId:V.data?.usage?.byJobId||{},bulkUsageError:V.error,bulkRunsByJobId:q.data?.runs?.byJobId||{},bulkRunsError:q.error,promptValue:w,savedPromptValue:C,savingChanges:k,runningJob:D,togglingJobEnabled:z,routingDraft:M,deliverySessions:Y,loadingDeliverySessions:j,deliverySessionsError:J,destinationSessionKey:pe},actions:{setRunStatusFilter:d,setUsageDays:E,setJobTrendRange:H,setSelectedJobTrendBucketFilter:se,setPromptValue:S,saveChanges:ke,refreshAll:Q,loadMoreRuns:Ee,runSelectedJobNow:ce,setSelectedJobEnabled:ee,selectAllJobs:Oe,selectJob:qe,onListResizerPointerDown:ge,setRoutingDraft:R,setDestinationSessionKey:le}}};var hs=P.bind(T),i0=({jobId:t="",onSetLocation:e=()=>{}})=>{let{state:n,actions:s}=r0({jobId:t,onSetLocation:e}),[o,r]=y(!1),i=te(null),a=n.selectedRouteKey===_s,l=n.jobs.length===0,c=n.selectedJob,d=F(()=>{if(a)return"All jobs";let g=n.jobs.find(m=>String(m?.id||"")===String(n.selectedRouteKey||""));return String(g?.name||g?.id||"All jobs")},[a,n.jobs,n.selectedRouteKey]),u=F(()=>{if(a||!c)return!1;let g=String(n.routingDraft?.sessionTarget||c?.sessionTarget||"main"),m=String(n.routingDraft?.wakeMode||c?.wakeMode||"now"),h=String(n.routingDraft?.deliveryMode||c?.delivery?.mode||"none"),x=String(c?.sessionTarget||"main"),b=String(c?.wakeMode||"now"),v=String(c?.delivery?.mode||"none"),$=g!==x||m!==b||h!==v,w=n.promptValue!==n.savedPromptValue;return $||w},[a,c,n.promptValue,n.routingDraft?.deliveryMode,n.routingDraft?.sessionTarget,n.routingDraft?.wakeMode,n.savedPromptValue]);L(()=>{if(!o)return()=>{};let g=h=>{i.current?.contains(h.target)||r(!1)},m=h=>{h.key==="Escape"&&r(!1)};return window.addEventListener("pointerdown",g),window.addEventListener("keydown",m),()=>{window.removeEventListener("pointerdown",g),window.removeEventListener("keydown",m)}},[o]);let p=()=>{s.selectAllJobs(),r(!1)},f=g=>{s.selectJob(g),r(!1)};return hs`
- <${Ne} - leading=${us` + <${De} + leading=${hs`
- ${o?us` + ${o?hs`
- <${ev} + <${lv} jobs=${n.jobs} selectedRouteKey=${n.selectedRouteKey} onSelectAllJobs=${p} @@ -5250,15 +5333,15 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s `:null}
`} - actions=${us` - ${a||l?us` + actions=${hs` + ${a||l?hs` <${Z} onClick=${s.refreshAll} tone="secondary" size="sm" idleLabel="Refresh" /> - `:us` + `:hs` <${Z} onClick=${s.saveChanges} loading=${n.savingChanges} @@ -5276,12 +5359,12 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- ${l?us` + ${l?hs`
- <${Ta} className="h-12 w-12 text-cyan-400" /> + <${Ea} className="h-12 w-12 text-cyan-400" />

No cron jobs yet @@ -5293,16 +5376,16 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s

- `:a?us` - <${H0} + `:a?hs` + <${qw} jobs=${n.jobs} status=${n.status} bulkUsageByJobId=${n.bulkUsageByJobId} bulkRunsByJobId=${n.bulkRunsByJobId} onSelectJob=${f} /> - `:us` - <${w0} + `:hs` + <${Pw} job=${n.selectedJob} runEntries=${n.runEntries} filteredRunEntries=${n.filteredRunEntries} @@ -5342,25 +5425,25 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- `};var t3=P.bind(T),rf=({jobId:t="",onSetLocation:e=()=>{}})=>t3` - <${X0} jobId=${t} onSetLocation=${e} /> -`;var tw=(t="")=>{let e=String(t||"").trim().toUpperCase();return e==="P0"?"danger":e==="P1"?"warning":"neutral"};var nw=(t="")=>{let e=String(t||"").trim().toLowerCase().replace(/[_-]+/g," ");return e==="token efficiency"?"info":e==="redundancy"?"accent":e==="mixed concerns"?"cyan":e==="workspace state"?"secondary":"info"},sw=(t="")=>{let e=String(t||"").trim().replace(/[_-]+/g," ");return e?e.replace(/\b\w/g,n=>n.toUpperCase()):"Workspace"},ow=(t=[])=>t.reduce((e,n)=>{let s=String(n?.priority||"").trim().toUpperCase();return(s==="P0"||s==="P1"||s==="P2")&&(e[s]+=1),e},{P0:0,P1:0,P2:0});var fc=(t=null,e=0)=>!t||t.runInProgress||t.needsInitialRun||!t.stale||!t.changeSummary?.hasMeaningfulChanges?!1:Number(e||0)<=Date.now(),rw=(t=null)=>{if(!t)return"";let e=Number(t.changeSummary?.changedFilesCount||0);return e>0?`Drift Doctor has not been run in the last week and ${e} file${e===1?"":"s"} changed since the last review.`:"Doctor has not been run in the last week."},Q0=(t=0)=>`${Number(t||0).toLocaleString()} chars`,ew=(t="")=>String(t||"").startsWith("hooks/bootstrap/"),hc=(t=null)=>{let e=t?.bootstrapContext,n=(e?.activeTruncatedFiles||[]).filter(o=>!ew(o?.path)),s=(e?.activeNearLimitFiles||[]).filter(o=>!ew(o?.path));return[...n.map(o=>({path:o.path,size:Q0(o.rawChars),statusText:`-${Number(Math.max(0,Number(o.rawChars||0)-Number(o.injectedChars||0))).toLocaleString()} cut`,statusTone:"danger"})),...s.map(o=>({path:o.path,size:Q0(o.rawChars),statusText:"Near limit",statusTone:"warning"}))]},iw=(t=null)=>hc(t).length>0,aw=(t=null)=>{let e=hc(t);if(!e.length)return"";let n=e.some(o=>o.statusTone==="danger"),s=e.some(o=>o.statusTone==="warning");return n&&s?"Some of your main files are being truncated or nearing the limit:":s?e.length===1?"One of your main files is nearing the limit:":"Some of your main files are nearing the limit:":e.length===1?"One of your main files is being truncated:":"Some of your main files are being truncated:"},lw=(t=null)=>{let e=Number(t?.changedFilesCount||0);return e===0?"No changes since last run":`${e} change${e===1?"":"s"} since last run`},cw=(t=null)=>!t||typeof t!="object"?"":t.status==="running"?"Running":t.status==="failed"?"Failed":(t.cardCount||0)===0?"No findings":`${t.cardCount||0} finding${t.cardCount===1?"":"s"}`,dw=(t=null)=>{if(!t||typeof t!="object")return[];if(t.status==="running")return[{tone:"cyan",count:0,label:"Running"}];if(t.status==="failed")return[{tone:"neutral",count:0,label:"Failed"}];if((t.cardCount||0)===0)return[{tone:"success",count:0,label:"No findings"}];let e=[];return Number(t?.priorityCounts?.P0||0)>0&&e.push({tone:"danger",count:0,label:"P0"}),Number(t?.priorityCounts?.P1||0)>0&&e.push({tone:"warning",count:0,label:"P1"}),e.length>0?e.slice(0,2):[{tone:"neutral",count:0,label:"P2"}]},uw=()=>[{value:"open",label:"Open"},{value:"dismissed",label:"Dismissed"},{value:"fixed",label:"Fixed"}];var n3=P.bind(T),pw=({cards:t=[]})=>{let e=ow(t);return n3` + `};var p3=P.bind(T),lf=({jobId:t="",onSetLocation:e=()=>{}})=>p3` + <${i0} jobId=${t} onSetLocation=${e} /> +`;var c0=(t="")=>{let e=String(t||"").trim().toUpperCase();return e==="P0"?"danger":e==="P1"?"warning":"neutral"};var d0=(t="")=>{let e=String(t||"").trim().toLowerCase().replace(/[_-]+/g," ");return e==="token efficiency"?"info":e==="redundancy"?"accent":e==="mixed concerns"?"cyan":e==="workspace state"?"secondary":"info"},u0=(t="")=>{let e=String(t||"").trim().replace(/[_-]+/g," ");return e?e.replace(/\b\w/g,n=>n.toUpperCase()):"Workspace"},p0=(t=[])=>t.reduce((e,n)=>{let s=String(n?.priority||"").trim().toUpperCase();return(s==="P0"||s==="P1"||s==="P2")&&(e[s]+=1),e},{P0:0,P1:0,P2:0});var bc=(t=null,e=0)=>!t||t.runInProgress||t.needsInitialRun||!t.stale||!t.changeSummary?.hasMeaningfulChanges?!1:Number(e||0)<=Date.now(),f0=(t=null)=>{if(!t)return"";let e=Number(t.changeSummary?.changedFilesCount||0);return e>0?`Drift Doctor has not been run in the last week and ${e} file${e===1?"":"s"} changed since the last review.`:"Doctor has not been run in the last week."},a0=(t=0)=>`${Number(t||0).toLocaleString()} chars`,l0=(t="")=>String(t||"").startsWith("hooks/bootstrap/"),xc=(t=null)=>{let e=t?.bootstrapContext,n=(e?.activeTruncatedFiles||[]).filter(o=>!l0(o?.path)),s=(e?.activeNearLimitFiles||[]).filter(o=>!l0(o?.path));return[...n.map(o=>({path:o.path,size:a0(o.rawChars),statusText:`-${Number(Math.max(0,Number(o.rawChars||0)-Number(o.injectedChars||0))).toLocaleString()} cut`,statusTone:"danger"})),...s.map(o=>({path:o.path,size:a0(o.rawChars),statusText:"Near limit",statusTone:"warning"}))]},h0=(t=null)=>xc(t).length>0,m0=(t=null)=>{let e=xc(t);if(!e.length)return"";let n=e.some(o=>o.statusTone==="danger"),s=e.some(o=>o.statusTone==="warning");return n&&s?"Some of your main files are being truncated or nearing the limit:":s?e.length===1?"One of your main files is nearing the limit:":"Some of your main files are nearing the limit:":e.length===1?"One of your main files is being truncated:":"Some of your main files are being truncated:"},g0=(t=null)=>{let e=Number(t?.changedFilesCount||0);return e===0?"No changes since last run":`${e} change${e===1?"":"s"} since last run`},b0=(t=null)=>!t||typeof t!="object"?"":t.status==="running"?"Running":t.status==="failed"?"Failed":(t.cardCount||0)===0?"No findings":`${t.cardCount||0} finding${t.cardCount===1?"":"s"}`,x0=(t=null)=>{if(!t||typeof t!="object")return[];if(t.status==="running")return[{tone:"cyan",count:0,label:"Running"}];if(t.status==="failed")return[{tone:"neutral",count:0,label:"Failed"}];if((t.cardCount||0)===0)return[{tone:"success",count:0,label:"No findings"}];let e=[];return Number(t?.priorityCounts?.P0||0)>0&&e.push({tone:"danger",count:0,label:"P0"}),Number(t?.priorityCounts?.P1||0)>0&&e.push({tone:"warning",count:0,label:"P1"}),e.length>0?e.slice(0,2):[{tone:"neutral",count:0,label:"P2"}]},y0=()=>[{value:"open",label:"Open"},{value:"dismissed",label:"Dismissed"},{value:"fixed",label:"Fixed"}];var f3=P.bind(T),v0=({cards:t=[]})=>{let e=p0(t);return f3`
- <${cs} title="Open Findings" value=${t.length} /> - <${cs} title="P0" value=${e.P0} toneClassName="text-status-error-muted" /> - <${cs} title="P1" value=${e.P1} toneClassName="text-status-warning-muted" /> - <${cs} title="P2" value=${e.P2} toneClassName="text-body" /> + <${ps} title="Open Findings" value=${t.length} /> + <${ps} title="P0" value=${e.P0} toneClassName="text-status-error-muted" /> + <${ps} title="P1" value=${e.P1} toneClassName="text-status-warning-muted" /> + <${ps} title="P2" value=${e.P2} toneClassName="text-body" />
- `};var lt=P.bind(T),s3=t=>t?typeof t=="string"?{path:t}:typeof t=="object"&&t.path?t:null:null,af=(t,e,n)=>e&&n&&n>e?`${t}:${e}-${n}`:e?`${t}:${e}`:t,lf=(t,e)=>{let n={};return t&&(n.line=t),e&&e>t&&(n.lineEnd=e),n},o3=(t,e,{startLine:n,endLine:s}={})=>{let o=af(t,n,s);return lt` + `};var ut=P.bind(T),h3=t=>t?typeof t=="string"?{path:t}:typeof t=="object"&&t.path?t:null:null,cf=(t,e,n)=>e&&n&&n>e?`${t}:${e}-${n}`:e?`${t}:${e}`:t,df=(t,e)=>{let n={};return t&&(n.line=t),e&&e>t&&(n.lineEnd=e),n},m3=(t,e,{startLine:n,endLine:s}={})=>{let o=cf(t,n,s);return ut` - `},fw=7,r3=({item:t,onOpenFile:e,isOutdated:n})=>{let s=t.snippet,o=String(s.text||"").split(` -`),r=o.length>fw,[i,a]=y(!r),l=i?o:o.slice(0,fw),c=String(s.endLine||s.startLine||1).length;return lt` + `},$0=7,g3=({item:t,onOpenFile:e,isOutdated:n})=>{let s=t.snippet,o=String(s.text||"").split(` +`),r=o.length>$0,[i,a]=y(!r),l=i?o:o.slice(0,$0),c=String(s.endLine||s.startLine||1).length;return ut`
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s - ${n?lt`file changed since scan`:lt`snapshot`} + >`:ut`snapshot`}
- ${l.map((d,u)=>lt` + ${l.map((d,u)=>ut`
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s >${d||" "}
`)} - ${i&&s.truncated?lt`
... truncated
`:""} + ${i&&s.truncated?ut`
... truncated
`:""}
- ${r&&!i?lt` + ${r&&!i?ut` `:null} - ${r&&i?lt` + ${r&&i?ut`
- `},i3=(t={},e,n)=>{if(t?.path&&t?.snippet){let s=n.has(t.path);return lt`<${r3} + `},b3=(t={},e,n)=>{if(t?.path&&t?.snippet){let s=n.has(t.path);return ut`<${g3} item=${t} onOpenFile=${e} isOutdated=${s} - />`}return t?.path?o3(t.path,e,{startLine:t.startLine,endLine:t.endLine}):t?.text?t.text:JSON.stringify(t)},hw=({cards:t=[],busyCardId:e=0,onAskAgentFix:n=()=>{},onUpdateStatus:s=()=>{},onOpenFile:o=()=>{},changedPaths:r=[],showRunMeta:i=!1,hideEmptyState:a=!1})=>{let l=new Set(r);return lt` + />`}return t?.path?m3(t.path,e,{startLine:t.startLine,endLine:t.endLine}):t?.text?t.text:JSON.stringify(t)},w0=({cards:t=[],busyCardId:e=0,onAskAgentFix:n=()=>{},onUpdateStatus:s=()=>{},onOpenFile:o=()=>{},changedPaths:r=[],showRunMeta:i=!1,hideEmptyState:a=!1})=>{let l=new Set(r);return ut`
- ${t.length?lt` + ${t.length?ut`
- ${t.map(c=>lt` + ${t.map(c=>ut`
- <${ae} tone=${tw(c.priority)}> + <${de} tone=${c0(c.priority)}> ${c.priority} - +

${c.title}

- <${ae} tone=${nw(c.category)}> - ${sw(c.category)} - - ${i?lt` + <${de} tone=${d0(c.category)}> + ${u0(c.category)} + + ${i?ut` Run #${c.runId} @@ -5461,7 +5544,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- ${c.summary?lt`

${c.summary} @@ -5487,17 +5570,17 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s ${c.recommendation}

- ${Array.isArray(c.targetPaths)&&c.targetPaths.length?lt` + ${Array.isArray(c.targetPaths)&&c.targetPaths.length?ut`
Target paths
- ${c.targetPaths.map(d=>{let u=s3(d);if(!u)return null;let p=af(u.path,u.startLine,u.endLine);return lt` + ${c.targetPaths.map(d=>{let u=h3(d);if(!u)return null;let p=cf(u.path,u.startLine,u.endLine);return ut` @@ -5505,13 +5588,13 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`:null} - ${Array.isArray(c.evidence)&&c.evidence.length?lt` + ${Array.isArray(c.evidence)&&c.evidence.length?ut`
Evidence
- ${c.evidence.map(d=>lt` + ${c.evidence.map(d=>ut`
- ${i3(d,o,l)} + ${b3(d,o,l)}
`)}
@@ -5527,26 +5610,26 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s idleLabel="Ask agent to fix" loadingLabel="Sending..." /> - ${c.status!=="fixed"?lt` + ${c.status!=="fixed"?ut` <${Z} onClick=${()=>s(c,"fixed")} tone="secondary" idleLabel="Mark fixed" /> - `:lt` + `:ut` <${Z} onClick=${()=>s(c,"open")} tone="secondary" idleLabel="Reopen" /> `} - ${c.status!=="dismissed"?lt` + ${c.status!=="dismissed"?ut` <${Z} onClick=${()=>s(c,"dismissed")} tone="ghost" idleLabel="Dismiss" /> - `:lt` + `:ut` <${Z} onClick=${()=>s(c,"open")} tone="ghost" @@ -5557,7 +5640,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`)}
- `:a?null:lt` + `:a?null:ut`

No findings currently for this selection. @@ -5565,45 +5648,45 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s

`}
- `};var jn=P.bind(T),vr=({label:t="Send to session",sessions:e=[],selectedSessionKey:n="",onChangeSessionKey:s=()=>{},disabled:o=!1,loading:r=!1,error:i="",allowNone:a=!1,noneValue:l="__none__",noneLabel:c="None",emptyOptionLabel:d="No sessions available",helperText:u="",emptyStateText:p="",loadingLabel:f="Loading sessions...",containerClassName:g="space-y-2",labelClassName:m="text-xs text-fg-muted",selectClassName:h="w-full bg-field border border-border rounded-lg px-3 py-2 text-xs text-body focus:border-fg-muted",helperClassName:b="text-xs text-fg-muted",statusClassName:x="text-xs text-fg-muted",errorClassName:v="text-xs text-status-error-muted"})=>{let w=n||(a?l:""),$=o||r;return jn` + `};var zn=P.bind(T),vr=({label:t="Send to session",sessions:e=[],selectedSessionKey:n="",onChangeSessionKey:s=()=>{},disabled:o=!1,loading:r=!1,error:i="",allowNone:a=!1,noneValue:l="__none__",noneLabel:c="None",emptyOptionLabel:d="No sessions available",helperText:u="",emptyStateText:p="",loadingLabel:f="Loading sessions...",containerClassName:g="space-y-2",labelClassName:m="text-xs text-fg-muted",selectClassName:h="w-full bg-field border border-border rounded-lg px-3 py-2 text-xs text-body focus:border-fg-muted",helperClassName:x="text-xs text-fg-muted",statusClassName:b="text-xs text-fg-muted",errorClassName:v="text-xs text-status-error-muted"})=>{let $=n||(a?l:""),w=o||r;return zn`
- ${t?jn``:null} + ${t?zn``:null} - ${u?jn`
${u}
`:null} - ${i?jn`
${i}
`:null} - ${!r&&!i&&p&&e.length===0?jn`
${p}
`:null} + ${u?zn`
${u}
`:null} + ${i?zn`
${i}
`:null} + ${!r&&!i&&p&&e.length===0?zn`
${p}
`:null}
- `};var mw=P.bind(T),mc=({visible:t=!1,title:e="Send to agent",messageLabel:n="Message",messageRows:s=8,initialMessage:o="",resetKey:r="",submitLabel:i="Send message",loadingLabel:a="Sending...",cancelLabel:l="Cancel",onClose:c=()=>{},onSubmit:d=async()=>!0,sessionFilter:u=void 0})=>{let{sessions:p,selectedSessionKey:f,setSelectedSessionKey:g,selectedSession:m,loading:h,error:b}=yr({enabled:t,filter:u}),[x,v]=y(""),[w,$]=y(!1);L(()=>{t&&v(String(o||""))},[t,o,r]);let S=async()=>{if(!m||w)return;let C=String(x||"").trim();if(C){$(!0);try{await d({selectedSession:m,selectedSessionKey:f,message:C})!==!1&&c()}finally{$(!1)}}};return mw` - <${De} + `};var k0=P.bind(T),yc=({visible:t=!1,title:e="Send to agent",messageLabel:n="Message",messageRows:s=8,initialMessage:o="",resetKey:r="",submitLabel:i="Send message",loadingLabel:a="Sending...",cancelLabel:l="Cancel",onClose:c=()=>{},onSubmit:d=async()=>!0,sessionFilter:u=void 0})=>{let{sessions:p,selectedSessionKey:f,setSelectedSessionKey:g,selectedSession:m,loading:h,error:x}=yr({enabled:t,filter:u}),[b,v]=y(""),[$,w]=y(!1);L(()=>{t&&v(String(o||""))},[t,o,r]);let S=async()=>{if(!m||$)return;let C=String(b||"").trim();if(C){w(!0);try{await d({selectedSession:m,selectedSessionKey:f,message:C})!==!1&&c()}finally{w(!1)}}};return k0` + <${Ie} visible=${t} - onClose=${()=>{w||c()}} + onClose=${()=>{$||c()}} panelClassName="bg-modal border border-border rounded-xl p-5 max-w-lg w-full space-y-4" > - <${Ne} + <${De} title=${e} - actions=${mw` + actions=${k0` `} /> @@ -5612,17 +5695,17 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s sessions=${p} selectedSessionKey=${f} onChangeSessionKey=${g} - disabled=${h||w} + disabled=${h||$} loading=${h} - error=${b} + error=${x} emptyOptionLabel="No sessions available" />
@@ -5630,24 +5713,24 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
<${Z} onClick=${c} - disabled=${w} + disabled=${$} tone="secondary" size="md" idleLabel=${l} /> <${Z} onClick=${S} - disabled=${!m||h||!!b||!String(x||"").trim()} - loading=${w} + disabled=${!m||h||!!x||!String(b||"").trim()} + loading=${$} tone="primary" size="md" idleLabel=${i} loadingLabel=${a} />
- - `};var a3=P.bind(T),gw=({visible:t=!1,card:e=null,onClose:n=()=>{},onComplete:s=()=>{}})=>{let o=async({selectedSession:r,message:i})=>{if(!e?.id)return!1;try{await nm({cardId:e.id,sessionId:r?.sessionId||"",replyChannel:r?.replyChannel||"",replyTo:r?.replyTo||"",prompt:i});try{await pa({cardId:e.id,status:"fixed"}),N("Doctor fix request sent and finding marked fixed","success")}catch(a){N(a.message||"Doctor fix request sent, but could not mark the finding fixed","warning")}return await s(),!0}catch(a){return N(a.message||"Could not send Doctor fix request","error"),!1}};return a3` - <${mc} + + `};var x3=P.bind(T),S0=({visible:t=!1,card:e=null,onClose:n=()=>{},onComplete:s=()=>{}})=>{let o=async({selectedSession:r,message:i})=>{if(!e?.id)return!1;try{await om({cardId:e.id,sessionId:r?.sessionId||"",replyChannel:r?.replyChannel||"",replyTo:r?.replyTo||"",prompt:i});try{await ma({cardId:e.id,status:"fixed"}),I("Doctor fix request sent and finding marked fixed","success")}catch(a){I(a.message||"Doctor fix request sent, but could not mark the finding fixed","warning")}return await s(),!0}catch(a){return I(a.message||"Could not send Doctor fix request","error"),!1}};return x3` + <${yc} visible=${t} title="Ask agent to fix" messageLabel="Instructions" @@ -5658,7 +5741,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s onClose=${n} onSubmit=${o} /> - `};var wt=P.bind(T),cf=15e3,bw=2e3,l3=()=>wt` + `};var St=P.bind(T),uf=15e3,C0=2e3,y3=()=>St` {r.current&&(r.current.destroy(),r.current=null)}},[f,i,s d="M8 20V14H16V20H19V4H5V20H8ZM10 20H14V16H10V20ZM21 20H23V22H1V20H3V3C3 2.44772 3.44772 2 4 2H20C20.5523 2 21 2.44772 21 3V20ZM11 8V6H13V8H15V10H13V12H11V10H9V8H11Z" > -`,xw=({isActive:t=!1,onOpenFile:e=()=>{}})=>{let n=Re(ua,cf,{enabled:t}),s=n.data?.status||null,o=s?.runInProgress?bw:cf,r=Re(()=>em(10),o,{enabled:t}),[i,a]=y("all"),[l,c]=y("open"),[d,u]=y(0),[p,f]=y(null),[g,m]=y(""),h=r.data?.runs||[],b=String(s?.activeRunId||""),x=String(i||""),w=x!==""&&x!=="all"&&!h.some(J=>String(J.id||"")===x)&&(g===x||s?.runInProgress&&b===x)?{id:Number(x||0),status:"running",summary:"",priorityCounts:{P0:0,P1:0,P2:0},statusCounts:{open:0,dismissed:0,fixed:0}}:null,$=w?[w,...h]:h,S=i!=="all"&&!!b&&String(i||"")===b,C=i==="all"?null:$.find(J=>String(J.id||"")===String(i||""))||null,_=Re(()=>tm({runId:i||"all"}),s?.runInProgress||C?.status==="running"?bw:cf,{enabled:t}),k=_.data?.cards||[];L(()=>{t&&(n.refresh(),r.refresh())},[t]),L(()=>{if(!h.length){if(g&&x===g||S&&s?.runInProgress)return;i!=="all"&&a("all");return}i==="all"||h.some(oe=>String(oe.id||"")===String(i||""))||S&&s?.runInProgress||a("all")},[h,x,i,S,g,s?.runInProgress]),L(()=>{if(!g)return;if(i!==g){a(g);return}let J=h.some(ce=>String(ce.id||"")===String(g||"")),oe=!!b&&b===g&&!!s?.runInProgress;!J&&!oe||m("")},[b,s?.runInProgress,g,h,i]),L(()=>{_.refresh()},[i]);let A=C?.status==="running"||S&&s?.runInProgress,O=F(()=>A?"":C?.summary||"",[C,A]),D=F(()=>uw(),[]),z=F(()=>lw(s?.changeSummary||null),[s]),E=F(()=>s?.runInProgress||s?.needsInitialRun?!0:Number(s?.changeSummary?.changedFilesCount||0)>0,[s]),M=E?"":"No workspace changes since the last completed Drift Doctor run.",R=F(()=>fc(s,0),[s]),B=F(()=>iw(s),[s]),I=F(()=>aw(s),[s]),U=F(()=>hc(s),[s]),W=!!s?.lastRunAt,G=h.length>0,se=r.data!==null||r.error!==null,K=_.data!==null||_.error!==null,j=!se||G&&!K,X=F(()=>l==="all"?k:k.filter(J=>String(J?.status||"open").trim().toLowerCase()===l),[k,l]),de=F(()=>k.filter(J=>String(J?.status||"open").trim().toLowerCase()==="open"),[k]),le=F(()=>$.slice(0,2),[$]),ie=F(()=>$.slice(2),[$]),ne=F(()=>i==="all"?"":ie.some(J=>String(J.id||"")===String(i||""))?String(i||""):"",[ie,i]),xe=(J=!1)=>["inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-xs transition-colors",J?"border-cyan-500/40 bg-cyan-500/10 text-status-info shadow-[0_0_0_1px_rgba(34,211,238,0.08)]":"border-border bg-field text-body hover:border-fg-muted hover:text-bright"].join(" "),he=(J="neutral")=>J==="success"?"bg-green-400":J==="warning"?"bg-yellow-400":J==="danger"?"bg-red-400":J==="cyan"?"ac-status-dot ac-status-dot--info":"bg-gray-500",ue=!j&&(h.length>0||!!g||!!b||!!s?.runInProgress),me=async()=>{try{let J=await Qh();if(N(J?.reusedPreviousRun?"No workspace changes since the last scan; reused previous findings":"Doctor run started","success"),J?.runId){let oe=String(J.runId);m(oe),a(oe)}n.refresh(),r.refresh(),_.refresh(),setTimeout(n.refresh,1200),setTimeout(r.refresh,1200),setTimeout(_.refresh,1200)}catch(J){N(J.message||"Could not start Doctor run","error")}},V=async(J,oe)=>{if(!(!J?.id||d))try{u(J.id),await pa({cardId:J.id,status:oe}),N("Doctor card updated","success"),await _.refresh(),await r.refresh(),await n.refresh()}catch(ce){N(ce.message||"Could not update Doctor card","error")}finally{u(0)}};return wt` +`,_0=({isActive:t=!1,onOpenFile:e=()=>{}})=>{let n=Re(ha,uf,{enabled:t}),s=n.data?.status||null,o=s?.runInProgress?C0:uf,r=Re(()=>nm(10),o,{enabled:t}),[i,a]=y("all"),[l,c]=y("open"),[d,u]=y(0),[p,f]=y(null),[g,m]=y(""),h=r.data?.runs||[],x=String(s?.activeRunId||""),b=String(i||""),$=b!==""&&b!=="all"&&!h.some(q=>String(q.id||"")===b)&&(g===b||s?.runInProgress&&x===b)?{id:Number(b||0),status:"running",summary:"",priorityCounts:{P0:0,P1:0,P2:0},statusCounts:{open:0,dismissed:0,fixed:0}}:null,w=$?[$,...h]:h,S=i!=="all"&&!!x&&String(i||"")===x,C=i==="all"?null:w.find(q=>String(q.id||"")===String(i||""))||null,_=Re(()=>sm({runId:i||"all"}),s?.runInProgress||C?.status==="running"?C0:uf,{enabled:t}),k=_.data?.cards||[];L(()=>{t&&(n.refresh(),r.refresh())},[t]),L(()=>{if(!h.length){if(g&&b===g||S&&s?.runInProgress)return;i!=="all"&&a("all");return}i==="all"||h.some(ae=>String(ae.id||"")===String(i||""))||S&&s?.runInProgress||a("all")},[h,b,i,S,g,s?.runInProgress]),L(()=>{if(!g)return;if(i!==g){a(g);return}let q=h.some(fe=>String(fe.id||"")===String(g||"")),ae=!!x&&x===g&&!!s?.runInProgress;!q&&!ae||m("")},[x,s?.runInProgress,g,h,i]),L(()=>{_.refresh()},[i]);let A=C?.status==="running"||S&&s?.runInProgress,D=F(()=>A?"":C?.summary||"",[C,A]),N=F(()=>y0(),[]),z=F(()=>g0(s?.changeSummary||null),[s]),O=F(()=>s?.runInProgress||s?.needsInitialRun?!0:Number(s?.changeSummary?.changedFilesCount||0)>0,[s]),M=O?"":"No workspace changes since the last completed Drift Doctor run.",R=F(()=>bc(s,0),[s]),B=F(()=>h0(s),[s]),E=F(()=>m0(s),[s]),U=F(()=>xc(s),[s]),H=!!s?.lastRunAt,K=h.length>0,se=r.data!==null||r.error!==null,Y=_.data!==null||_.error!==null,j=!se||K&&!Y,J=F(()=>l==="all"?k:k.filter(q=>String(q?.status||"open").trim().toLowerCase()===l),[k,l]),pe=F(()=>k.filter(q=>String(q?.status||"open").trim().toLowerCase()==="open"),[k]),le=F(()=>w.slice(0,2),[w]),ie=F(()=>w.slice(2),[w]),oe=F(()=>i==="all"?"":ie.some(q=>String(q.id||"")===String(i||""))?String(i||""):"",[ie,i]),xe=(q=!1)=>["inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-xs transition-colors",q?"border-cyan-500/40 bg-cyan-500/10 text-status-info shadow-[0_0_0_1px_rgba(34,211,238,0.08)]":"border-border bg-field text-body hover:border-fg-muted hover:text-bright"].join(" "),he=(q="neutral")=>q==="success"?"bg-green-400":q==="warning"?"bg-yellow-400":q==="danger"?"bg-red-400":q==="cyan"?"ac-status-dot ac-status-dot--info":"bg-gray-500",ue=!j&&(h.length>0||!!g||!!x||!!s?.runInProgress),be=async()=>{try{let q=await tm();if(I(q?.reusedPreviousRun?"No workspace changes since the last scan; reused previous findings":"Doctor run started","success"),q?.runId){let ae=String(q.runId);m(ae),a(ae)}n.refresh(),r.refresh(),_.refresh(),setTimeout(n.refresh,1200),setTimeout(r.refresh,1200),setTimeout(_.refresh,1200)}catch(q){I(q.message||"Could not start Doctor run","error")}},V=async(q,ae)=>{if(!(!q?.id||d))try{u(q.id),await ma({cardId:q.id,status:ae}),I("Doctor card updated","success"),await _.refresh(),await r.refresh(),await n.refresh()}catch(fe){I(fe.message||"Could not update Doctor card","error")}finally{u(0)}};return St`
- ${ue?wt` - <${Ne} + ${ue?St` + <${De} title="Drift Doctor" - actions=${wt` + actions=${St` <${Z} - onClick=${me} - disabled=${!E} + onClick=${be} + disabled=${!O} loading=${!!s?.runInProgress} idleLabel="Run Drift Doctor" loadingLabel="Running..." @@ -5686,61 +5769,61 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s `} /> `:null} - ${j?wt` + ${j?St`
- <${Ce} className="h-4 w-4" /> + <${Ae} className="h-4 w-4" /> Loading Drift Doctor...
`:null} - ${!j&&G?wt` + ${!j&&K?St`
- <${pw} cards=${de} /> + <${v0} cards=${pe} />
- ${W?wt` + ${H?St`
Last run ·${" "} - ${Wo(s?.lastRunAt,{fallback:"Never"})} + ${Ho(s?.lastRunAt,{fallback:"Never"})} ${z}
- ${B?wt` + ${B?St`
- ⚠️ ${I} + ⚠️ ${E}
- ${U.map(J=>wt` + ${U.map(q=>St`
- ${J.size} + ${q.size} - ${J.statusText} + ${q.statusText}
@@ -5754,7 +5837,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`:null} `:null} - ${R?wt` + ${R?St`
@@ -5766,7 +5849,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`:null} - ${ue?wt` + ${ue?St`

Findings

@@ -5779,41 +5862,41 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s > All runs - ${le.map(J=>{let oe=String(i||"")===String(J.id||""),ce=dw(J);return wt` + ${le.map(q=>{let ae=String(i||"")===String(q.id||""),fe=x0(q);return St` `})} - ${ie.length?wt` + ${ie.length?St`
- ${O?wt` + ${D?St`
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s ${C?.id?`Run #${C.id} summary`:"Run summary"}

- ${O} + ${D}

`:null} - ${A?wt` + ${A?St`
- <${Ce} className="h-3.5 w-3.5" /> + <${Ae} className="h-3.5 w-3.5" /> Run in progress. Findings will appear when analysis completes. @@ -5855,8 +5938,8 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`:null}
- <${hw} - cards=${X} + <${w0} + cards=${J} busyCardId=${d} onAskAgentFix=${f} onUpdateStatus=${V} @@ -5868,12 +5951,12 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`:null} - ${!j&&!ue?wt` + ${!j&&!ue?St`
- <${l3} /> + <${y3} />

Workspace health review @@ -5886,8 +5969,8 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s

<${Z} - onClick=${me} - disabled=${!E} + onClick=${be} + disabled=${!O} loading=${!!s?.runInProgress} size="lg" idleLabel="Run Drift Doctor" @@ -5902,21 +5985,21 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`:null} - <${gw} + <${S0} visible=${!!p} card=${p} onClose=${()=>f(null)} onComplete=${async()=>{await n.refresh(),await r.refresh(),await _.refresh()}} />
- `};var c3=P.bind(T),df=({onNavigateToBrowseFile:t=()=>{}})=>c3` + `};var v3=P.bind(T),pf=({onNavigateToBrowseFile:t=()=>{}})=>v3`
- <${xw} + <${_0} isActive=${!0} onOpenFile=${(e,n={})=>{let s=`workspace/${String(e||"").trim().replace(/^workspace\//,"")}`;t(s,{view:"edit",...n.line?{line:n.line}:{},...n.lineEnd?{lineEnd:n.lineEnd}:{}})}} />
-`;var d3=P.bind(T),zn=({header:t,children:e})=>d3` +`;var $3=P.bind(T),Un=({header:t,children:e})=>$3`
@@ -5929,29 +6012,29 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
-`;var Ue=P.bind(T),yw={ai:"AI Provider Keys",github:"GitHub",channels:"Channels",tools:"Tools",custom:"Custom"},u3=["ai","github","channels","tools","custom"],p3=new Set(["OPENAI_API_KEY","GEMINI_API_KEY"]),ww={Embeddings:{Icon:_a,label:"Memory embeddings"},Image:{Icon:nb,label:"Image generation"},TTS:{Icon:sb,label:"Text to speech"},STT:{Icon:ob,label:"Speech to text"}},vw=t=>t.trim().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),f3=/^(?:TELEGRAM_BOT_TOKEN|DISCORD_BOT_TOKEN|SLACK_BOT_TOKEN|SLACK_APP_TOKEN)(?:_[A-Z0-9_]+)?$/,h3=t=>{let e=String(t||"").trim();if(e.length<2)return e;let n=e.startsWith('"'),s=e.endsWith('"');if(n&&s)return e.slice(1,-1);let o=e.startsWith("'"),r=e.endsWith("'");return o&&r?e.slice(1,-1):e},gc=(t="")=>f3.test(String(t||"").trim().toUpperCase()),$w=t=>JSON.stringify((t||[]).map(e=>({key:String(e?.key||""),value:String(e?.value||"")})).sort((e,n)=>e.key.localeCompare(n.key))),m3=t=>{let e=Array.isArray(t)?[...t]:[],n=e.filter(o=>(o?.group||"custom")==="custom").sort((o,r)=>String(o?.key||"").localeCompare(String(r?.key||""))),s=0;return e.map(o=>{if((o?.group||"custom")!=="custom")return o;let r=n[s];return s+=1,r})},g3={ANTHROPIC_API_KEY:Ue`from${" "} +`;var Ge=P.bind(T),A0={ai:"AI Provider Keys",github:"GitHub",channels:"Channels",tools:"Tools",custom:"Custom"},w3=["ai","github","channels","tools","custom"],k3=new Set(["OPENAI_API_KEY","GEMINI_API_KEY"]),P0={Embeddings:{Icon:Pa,label:"Memory embeddings"},Image:{Icon:rb,label:"Image generation"},TTS:{Icon:ib,label:"Text to speech"},STT:{Icon:ab,label:"Speech to text"}},M0=t=>t.trim().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),S3=/^(?:TELEGRAM_BOT_TOKEN|DISCORD_BOT_TOKEN|SLACK_BOT_TOKEN|SLACK_APP_TOKEN)(?:_[A-Z0-9_]+)?$/,C3=t=>{let e=String(t||"").trim();if(e.length<2)return e;let n=e.startsWith('"'),s=e.endsWith('"');if(n&&s)return e.slice(1,-1);let o=e.startsWith("'"),r=e.endsWith("'");return o&&r?e.slice(1,-1):e},vc=(t="")=>S3.test(String(t||"").trim().toUpperCase()),T0=t=>JSON.stringify((t||[]).map(e=>({key:String(e?.key||""),value:String(e?.value||"")})).sort((e,n)=>e.key.localeCompare(n.key))),_3=t=>{let e=Array.isArray(t)?[...t]:[],n=e.filter(o=>(o?.group||"custom")==="custom").sort((o,r)=>String(o?.key||"").localeCompare(String(r?.key||""))),s=0;return e.map(o=>{if((o?.group||"custom")!=="custom")return o;let r=n[s];return s+=1,r})},A3={ANTHROPIC_API_KEY:Ge`from${" "} console.anthropic.com`,ANTHROPIC_TOKEN:Ue`from - claude setup-token`,OPENAI_API_KEY:Ue`from${" "} + >`,ANTHROPIC_TOKEN:Ge`from + claude setup-token`,OPENAI_API_KEY:Ge`from${" "} platform.openai.com`,GEMINI_API_KEY:Ue`from${" "} + >`,GEMINI_API_KEY:Ge`from${" "} aistudio.google.com`,ELEVENLABS_API_KEY:Ue`from${" "} + >`,ELEVENLABS_API_KEY:Ge`from${" "} {r.current&&(r.current.destroy(),r.current=null)}},[f,i,s >elevenlabs.io${" "} · ${" "} XI_API_KEY also - supported`,GITHUB_WORKSPACE_REPO:Ue`use + supported`,GITHUB_WORKSPACE_REPO:Ge`use owner/repo or https://github.com/owner/repo`,TELEGRAM_BOT_TOKEN:Ue`from${" "} + >`,TELEGRAM_BOT_TOKEN:Ge`from${" "} {r.current&&(r.current.destroy(),r.current=null)}},[f,i,s class="hover:underline" style="color: var(--accent-link)" >full guide`,DISCORD_BOT_TOKEN:Ue`from${" "} + >`,DISCORD_BOT_TOKEN:Ge`from${" "} {r.current&&(r.current.destroy(),r.current=null)}},[f,i,s class="hover:underline" style="color: var(--accent-link)" >full guide`,MISTRAL_API_KEY:Ue`from${" "} + >`,MISTRAL_API_KEY:Ge`from${" "} console.mistral.ai`,VOYAGE_API_KEY:Ue`from${" "} + >`,VOYAGE_API_KEY:Ge`from${" "} dash.voyageai.com`,GROQ_API_KEY:Ue`from${" "} + >`,GROQ_API_KEY:Ge`from${" "} console.groq.com`,DEEPGRAM_API_KEY:Ue`from${" "} + >`,DEEPGRAM_API_KEY:Ge`from${" "} console.deepgram.com`,BRAVE_API_KEY:Ue`from${" "} + >`,BRAVE_API_KEY:Ge`from${" "} brave.com/search/api${" "} — free tier available`},b3=t=>g3[t.key]||t.hint||"",x3=t=>(Array.isArray(t?.features)?t.features:[]).filter(e=>!!ww[e]),y3=t=>{let e=[],n=[];return(t||[]).forEach(s=>{let o=!!String(s?.value||"").trim();if(p3.has(s?.key)||o){e.push(s);return}n.push(s)}),{visible:e,hidden:n}},v3=({feature:t})=>{let e=ww[t];if(!e)return null;let{Icon:n,label:s}=e;return Ue` - <${yt} text=${s} widthClass="w-auto" tooltipClassName="whitespace-nowrap"> + >${" "} — free tier available`},M3=t=>A3[t.key]||t.hint||"",T3=t=>(Array.isArray(t?.features)?t.features:[]).filter(e=>!!P0[e]),P3=t=>{let e=[],n=[];return(t||[]).forEach(s=>{let o=!!String(s?.value||"").trim();if(k3.has(s?.key)||o){e.push(s);return}n.push(s)}),{visible:e,hidden:n}},R3=({feature:t})=>{let e=P0[t];if(!e)return null;let{Icon:n,label:s}=e;return Ge` + <${$t} text=${s} widthClass="w-auto" tooltipClassName="whitespace-nowrap"> {r.current&&(r.current.destroy(),r.current=null)}},[f,i,s > <${n} className="w-3.5 h-3.5" /> - - `},$3=({envVar:t,onChange:e,onDelete:n,disabled:s})=>{let o=b3(t),r=x3(t);return Ue` + + `},L3=({envVar:t,onChange:e,onDelete:n,disabled:s})=>{let o=M3(t),r=T3(t);return Ge`
@@ -6048,15 +6131,15 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s /> ${t.key}
- ${r.length>0?Ue` + ${r.length>0?Ge`
- ${r.map(i=>Ue`<${v3} key=${i} feature=${i} />`)} + ${r.map(i=>Ge`<${R3} key=${i} feature=${i} />`)}
`:null}
- <${Rt} + <${Et} value=${t.value} onInput=${i=>e(t.key,i.target.value)} placeholder=${t.value?"":"not set"} @@ -6064,7 +6147,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s inputClass="flex-1 min-w-0 bg-field border border-border rounded-lg px-3 py-1.5 text-sm text-body outline-none focus:border-fg-muted font-mono" disabled=${s} /> - ${t.group==="custom"?Ue``:null}
- ${o?Ue`

${o}

`:null} + ${o?Ge`

${o}

`:null}
- `},kw=({onRestartRequired:t=()=>{}})=>{let[e,n]=y([]),[s,o]=y(()=>new Set),[r,i]=y([]),[a,l]=y(0),[c,d]=y(!1),[u,p]=y(!1),[f,g]=y(!1),[m,h]=y(""),b=ee("[]"),{data:x,error:v,loading:w,refresh:$}=ct("/api/env",Vr,{maxAgeMs:3e4}),S=q(j=>{if(!j)return;let X=m3(j.vars||[]);b.current=$w(X),n(X),i([]),o(new Set(j.reservedKeys||[])),j.restartRequired&&t(!0)},[t]),C=q(async()=>{try{let j=await $({force:!0});S(j)}catch(j){console.error("Failed to load env vars:",j)}},[S,$]);L(()=>{x&&(c||u||S(x))},[S,c,x,u]),L(()=>{v&&console.error("Failed to load env vars:",v)},[v]),L(()=>{d($w(e)!==b.current)},[e]);let _=(j,X)=>{n(de=>de.map(le=>le.key===j?{...le,value:X}:le))},k=j=>{n(X=>X.filter(de=>de.key!==j)),i(X=>X.filter(de=>de!==j))},A=async()=>{if(!u){p(!0);try{let j=e.filter(ie=>ie.editable&&!gc(ie?.key)).map(ie=>({key:ie.key,value:ie.value})),de=!!(await dd(j))?.restartRequired;de&&t(!0),N(de?"Environment variables saved. Restart gateway to apply.":"Environment variables saved","success");let le=await $({force:!0});S(le),l(ie=>ie+1),d(!1)}catch(j){N("Failed to save: "+j.message,"error")}finally{p(!1)}}},[O,D]=y(""),z=j=>{let X=j.split(` -`).map(le=>le.trim()).filter(Boolean).filter(le=>!le.startsWith("#")),de=[];for(let le of X){let ie=le.indexOf("=");ie>0&&de.push({key:le.slice(0,ie).trim(),value:h3(le.slice(ie+1))})}return de},E=j=>{let X=0,de=[],le=[],ie=[];return n(ne=>{let xe=[...ne];for(let{key:he,value:ue}of j){let me=vw(he);if(!me)continue;if(gc(me)){le.push(me);continue}if(s.has(me)){de.push(me);continue}let V=xe.find(J=>J.key===me);V?V.value=ue:(xe.push({key:me,value:ue,label:me,group:"custom",hint:"",source:"env_file",editable:!0}),ie.push(me)),X++}return xe}),ie.length&&i(ne=>[...ne,...ie]),{added:X,blocked:de,managedChannelKeys:le}},M=(j,X)=>{let de=(j.clipboardData||window.clipboardData).getData("text"),le=z(de);if(le.length>1){j.preventDefault();let{added:ie,blocked:ne,managedChannelKeys:xe}=E(le);if(h(""),D(""),ne.length){let he=Array.from(new Set(ne));N(`Reserved vars can't be added: ${he.join(", ")}`,"error")}if(xe.length){let he=Array.from(new Set(xe));N(`Channel tokens are managed from Channels: ${he.join(", ")}`,"error")}ie&&N(`Added ${ie} variable${ie!==1?"s":""}`,"success");return}if(le.length===1){j.preventDefault(),h(le[0].key),D(le[0].value);return}},R=j=>{let X=z(j);if(X.length===1){h(X[0].key),D(X[0].value);return}h(j)},B=j=>{let X=z(j);if(X.length===1){h(X[0].key),D(X[0].value);return}D(j)},I=()=>{let j=vw(m);if(j){if(gc(j)){N(`Channel tokens are managed from Channels: ${j}`,"error");return}if(s.has(j)){N(`Reserved var can't be added: ${j}`,"error");return}E([{key:j,value:O}]),h(""),D("")}},U=e.filter(j=>!gc(j?.key)),W={};for(let j of U){let X=j.group||"custom";W[X]||(W[X]=[]),W[X].push(j)}if(W.custom?.length){let j=new Set(r),X=W.custom.filter(le=>!j.has(le.key)).sort((le,ie)=>String(le?.key||"").localeCompare(String(ie?.key||""))),de=W.custom.filter(le=>j.has(le.key));W.custom=[...X,...de]}let G=y3(W.ai||[]),se=j=>j.map(X=>Ue`<${$3} - key=${`${a}:${X.key}`} - envVar=${X} + `},R0=({onRestartRequired:t=()=>{}})=>{let[e,n]=y([]),[s,o]=y(()=>new Set),[r,i]=y([]),[a,l]=y(0),[c,d]=y(!1),[u,p]=y(!1),[f,g]=y(!1),[m,h]=y(""),x=te("[]"),{data:b,error:v,loading:$,refresh:w}=pt("/api/env",Ur,{maxAgeMs:3e4}),S=G(j=>{if(!j)return;let J=_3(j.vars||[]);x.current=T0(J),n(J),i([]),o(new Set(j.reservedKeys||[])),j.restartRequired&&t(!0)},[t]),C=G(async()=>{try{let j=await w({force:!0});S(j)}catch(j){console.error("Failed to load env vars:",j)}},[S,w]);L(()=>{b&&(c||u||S(b))},[S,c,b,u]),L(()=>{v&&console.error("Failed to load env vars:",v)},[v]),L(()=>{d(T0(e)!==x.current)},[e]);let _=(j,J)=>{n(pe=>pe.map(le=>le.key===j?{...le,value:J}:le))},k=j=>{n(J=>J.filter(pe=>pe.key!==j)),i(J=>J.filter(pe=>pe!==j))},A=async()=>{if(!u){p(!0);try{let j=e.filter(ie=>ie.editable&&!vc(ie?.key)).map(ie=>({key:ie.key,value:ie.value})),pe=!!(await ud(j))?.restartRequired;pe&&t(!0),I(pe?"Environment variables saved. Restart gateway to apply.":"Environment variables saved","success");let le=await w({force:!0});S(le),l(ie=>ie+1),d(!1)}catch(j){I("Failed to save: "+j.message,"error")}finally{p(!1)}}},[D,N]=y(""),z=j=>{let J=j.split(` +`).map(le=>le.trim()).filter(Boolean).filter(le=>!le.startsWith("#")),pe=[];for(let le of J){let ie=le.indexOf("=");ie>0&&pe.push({key:le.slice(0,ie).trim(),value:C3(le.slice(ie+1))})}return pe},O=j=>{let J=0,pe=[],le=[],ie=[];return n(oe=>{let xe=[...oe];for(let{key:he,value:ue}of j){let be=M0(he);if(!be)continue;if(vc(be)){le.push(be);continue}if(s.has(be)){pe.push(be);continue}let V=xe.find(q=>q.key===be);V?V.value=ue:(xe.push({key:be,value:ue,label:be,group:"custom",hint:"",source:"env_file",editable:!0}),ie.push(be)),J++}return xe}),ie.length&&i(oe=>[...oe,...ie]),{added:J,blocked:pe,managedChannelKeys:le}},M=(j,J)=>{let pe=(j.clipboardData||window.clipboardData).getData("text"),le=z(pe);if(le.length>1){j.preventDefault();let{added:ie,blocked:oe,managedChannelKeys:xe}=O(le);if(h(""),N(""),oe.length){let he=Array.from(new Set(oe));I(`Reserved vars can't be added: ${he.join(", ")}`,"error")}if(xe.length){let he=Array.from(new Set(xe));I(`Channel tokens are managed from Channels: ${he.join(", ")}`,"error")}ie&&I(`Added ${ie} variable${ie!==1?"s":""}`,"success");return}if(le.length===1){j.preventDefault(),h(le[0].key),N(le[0].value);return}},R=j=>{let J=z(j);if(J.length===1){h(J[0].key),N(J[0].value);return}h(j)},B=j=>{let J=z(j);if(J.length===1){h(J[0].key),N(J[0].value);return}N(j)},E=()=>{let j=M0(m);if(j){if(vc(j)){I(`Channel tokens are managed from Channels: ${j}`,"error");return}if(s.has(j)){I(`Reserved var can't be added: ${j}`,"error");return}O([{key:j,value:D}]),h(""),N("")}},U=e.filter(j=>!vc(j?.key)),H={};for(let j of U){let J=j.group||"custom";H[J]||(H[J]=[]),H[J].push(j)}if(H.custom?.length){let j=new Set(r),J=H.custom.filter(le=>!j.has(le.key)).sort((le,ie)=>String(le?.key||"").localeCompare(String(ie?.key||""))),pe=H.custom.filter(le=>j.has(le.key));H.custom=[...J,...pe]}let K=P3(H.ai||[]),se=j=>j.map(J=>Ge`<${L3} + key=${`${a}:${J.key}`} + envVar=${J} onChange=${_} onDelete=${k} disabled=${u} - />`),K=j=>{let X=W[j]||[];if(!X.length)return null;if(j==="ai"){let{visible:de,hidden:le}=G,ie=f&&le.length>0;return Ue` + />`),Y=j=>{let J=H[j]||[];if(!J.length)return null;if(j==="ai"){let{visible:pe,hidden:le}=K,ie=f&&le.length>0;return Ge`

- ${yw[j]||j} + ${A0[j]||j}

-
${se(de)}
- ${le.length>0?Ue` +
${se(pe)}
+ ${le.length>0?Ge`
`:null} - ${ie?Ue`
+ ${ie?Ge`
${se(le)}
`:null}
- `}return Ue` + `}return Ge`

- ${yw[j]||j} + ${A0[j]||j}

-
${se(X)}
+
${se(J)}
- `};return w&&!e.length?Ue` - <${zn} - header=${Ue`<${Ne} title="Envars" />`} + `};return $&&!e.length?Ge` + <${Un} + header=${Ge`<${De} title="Envars" />`} >
Loading environment variables...
- - `:Ue` - <${zn} - header=${Ue` - <${Ne} + + `:Ge` + <${Un} + header=${Ge` + <${De} title="Envars" - actions=${Ue` - <${Qn} visible=${c}> + actions=${Ge` + <${ns} visible=${c}> <${Z} onClick=${C} disabled=${u} @@ -6147,12 +6230,12 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s loadingLabel="Saving…" className="text-xs" /> - + `} /> `} > - ${u3.filter(j=>W[j]?.length).map(j=>K(j))} + ${w3.filter(j=>H[j]?.length).map(j=>Y(j))}
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s placeholder="KEY" onInput=${j=>R(j.target.value)} onPaste=${j=>M(j,"key")} - onKeyDown=${j=>j.key==="Enter"&&I()} + onKeyDown=${j=>j.key==="Enter"&&E()} class="w-full bg-field border border-border rounded-lg px-3 py-1.5 text-sm text-body outline-none focus:border-fg-muted font-mono uppercase" />
B(j.target.value)} onPaste=${j=>M(j,"val")} - onKeyDown=${j=>j.key==="Enter"&&I()} + onKeyDown=${j=>j.key==="Enter"&&E()} class="flex-1 bg-field border border-border rounded-lg px-3 py-1.5 text-sm text-body outline-none focus:border-fg-muted font-mono" />
- - `};var w3=P.bind(T),uf=({onRestartRequired:t=()=>{}})=>w3` - <${kw} onRestartRequired=${t} /> -`;var Qt=P.bind(T),k3=t=>{let e=Number(t||0);if(!Number.isFinite(e)||e<=0)return"0s";let n=Math.floor(e/1e3),s=Math.floor(n/86400),o=Math.floor(n/3600),r=Math.floor(n%3600/60),i=n%60;return s>0?`${s}d ${o%24}h ${r}m ${i}s`:o>0?`${o}h ${r}m ${i}s`:r>0?`${r}m ${i}s`:`${i}s`},S3=({label:t,currentVersion:e,fetchVersion:n,applyUpdate:s,updateInProgress:o=!1,onActionComplete:r=()=>{}})=>{let[i,a]=y(!1),[l,c]=y(e||null),[d,u]=y(null),[p,f]=y(!1),[g,m]=y(""),[h,b]=y(!1),[x,v]=y(!1),w=(()=>{try{return new URLSearchParams(window.location.search).get("simulateUpdate")==="1"}catch{return!1}})(),$=(()=>{if(!w)return null;try{return new URLSearchParams(window.location.search).get("simulateVersion")||"v0.0.0-preview"}catch{return"v0.0.0-preview"}})(),S=w||p,C=$||d,_=o||S,k=C?`Update to ${C}`:"Update",A="https://github.com/openclaw/openclaw/tags",O=S&&C;L(()=>{c(e||null)},[e]),L(()=>{let R=!0;return(async(I=!1)=>{try{let U=await n(I);if(!R)return;c(U.currentVersion||e||null),u(U.latestVersion||null),f(!!U.hasUpdate),m(U.ok?"":U.error||"")}catch(U){if(!R)return;m(U.message||"Could not check updates")}})(!1),()=>{R=!1}},[e,n]),L(()=>{if(o)return()=>{};let R=!0,B=setTimeout(async()=>{try{let I=await n(!0);if(!R)return;c(I.currentVersion||e||null),u(I.latestVersion||null),f(!!I.hasUpdate),m(I.ok?"":I.error||"")}catch{}},1200);return()=>{R=!1,clearTimeout(B)}},[o,e,n]),L(()=>{if(!S||!C){b(!1);return}b(!1)},[S,C]);let D=async()=>{let R=!!S;if(!(_?i||o:i)){a(!0),m("");try{let I=R?await s():await n(!0);c(I.currentVersion||l),u(I.latestVersion||null),f(!!I.hasUpdate),m(I.ok?"":I.error||""),R?I.ok?I.updated||I.restarting?N(I.restarting?`${t} updated \u2014 restarting...`:`Updated ${t} to ${I.currentVersion}`,"success"):N(`Already at latest ${t} version`,"success"):N(I.error||`${t} update failed`,"error"):I.hasUpdate&&I.latestVersion?N(`${t} update available: ${I.latestVersion}`,"warning"):N(`${t} is up to date`,"success"),await r({type:R?"update":"check",ok:!!I?.ok,result:I})}catch(I){m(I.message||(R?`Could not update ${t}`:"Could not check updates")),N(R?`Could not update ${t}`:"Could not check updates","error"),await r({type:R?"update":"check",ok:!1,error:I})}finally{a(!1)}}},z=()=>{if(!(_?i||o:i)){if(S&&C&&!h){v(!0);return}D()}},E=()=>{v(!1),D()},M=_?i||o:i;return Qt` + + `};var E3=P.bind(T),ff=({onRestartRequired:t=()=>{}})=>E3` + <${R0} onRestartRequired=${t} /> +`;var en=P.bind(T),I3=t=>{let e=Number(t||0);if(!Number.isFinite(e)||e<=0)return"0s";let n=Math.floor(e/1e3),s=Math.floor(n/86400),o=Math.floor(n/3600),r=Math.floor(n%3600/60),i=n%60;return s>0?`${s}d ${o%24}h ${r}m ${i}s`:o>0?`${o}h ${r}m ${i}s`:r>0?`${r}m ${i}s`:`${i}s`},D3=({label:t,currentVersion:e,fetchVersion:n,applyUpdate:s,updateInProgress:o=!1,onActionComplete:r=()=>{}})=>{let[i,a]=y(!1),[l,c]=y(e||null),[d,u]=y(null),[p,f]=y(!1),[g,m]=y(""),[h,x]=y(!1),[b,v]=y(!1),$=(()=>{try{return new URLSearchParams(window.location.search).get("simulateUpdate")==="1"}catch{return!1}})(),w=(()=>{if(!$)return null;try{return new URLSearchParams(window.location.search).get("simulateVersion")||"v0.0.0-preview"}catch{return"v0.0.0-preview"}})(),S=$||p,C=w||d,_=o||S,k=C?`Update to ${C}`:"Update",A="https://github.com/openclaw/openclaw/tags",D=S&&C;L(()=>{c(e||null)},[e]),L(()=>{let R=!0;return(async(E=!1)=>{try{let U=await n(E);if(!R)return;c(U.currentVersion||e||null),u(U.latestVersion||null),f(!!U.hasUpdate),m(U.ok?"":U.error||"")}catch(U){if(!R)return;m(U.message||"Could not check updates")}})(!1),()=>{R=!1}},[e,n]),L(()=>{if(o)return()=>{};let R=!0,B=setTimeout(async()=>{try{let E=await n(!0);if(!R)return;c(E.currentVersion||e||null),u(E.latestVersion||null),f(!!E.hasUpdate),m(E.ok?"":E.error||"")}catch{}},1200);return()=>{R=!1,clearTimeout(B)}},[o,e,n]),L(()=>{if(!S||!C){x(!1);return}x(!1)},[S,C]);let N=async()=>{let R=!!S;if(!(_?i||o:i)){a(!0),m("");try{let E=R?await s():await n(!0);c(E.currentVersion||l),u(E.latestVersion||null),f(!!E.hasUpdate),m(E.ok?"":E.error||""),R?E.ok?E.updated||E.restarting?I(E.restarting?`${t} updated \u2014 restarting...`:`Updated ${t} to ${E.currentVersion}`,"success"):I(`Already at latest ${t} version`,"success"):I(E.error||`${t} update failed`,"error"):E.hasUpdate&&E.latestVersion?I(`${t} update available: ${E.latestVersion}`,"warning"):I(`${t} is up to date`,"success"),await r({type:R?"update":"check",ok:!!E?.ok,result:E})}catch(E){m(E.message||(R?`Could not update ${t}`:"Could not check updates")),I(R?`Could not update ${t}`:"Could not check updates","error"),await r({type:R?"update":"check",ok:!1,error:E})}finally{a(!1)}}},z=()=>{if(!(_?i||o:i)){if(S&&C&&!h){v(!0);return}N()}},O=()=>{v(!1),N()},M=_?i||o:i;return en`

${t}${" "}${l?`${l}`:"..."}

- ${g&&S&&Qt`
${g}
`}
- ${S&&C&&Qt` + ${S&&C&&en` b(!0)} + onclick=${()=>x(!0)} class="hidden md:inline text-xs text-fg-muted hover:text-body transition-colors" >View changelog `} - ${O?Qt` + ${D?en` <${tn} onClick=${z} loading=${M} @@ -6231,7 +6314,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s loadingLabel=${_?"Updating...":"Checking..."} className="hidden md:inline-flex" /> - `:Qt` + `:en` <${tn} onClick=${z} loading=${M} @@ -6242,13 +6325,13 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s `}
- ${O&&Qt` + ${D&&en` `} - <${st} - visible=${x} + <${rt} + visible=${b} title="Update without changelog?" message="Are you sure you want to update without viewing the changelog?" confirmLabel=${`Update to ${C||"latest"}`} cancelLabel="Cancel" confirmTone="warning" onCancel=${()=>v(!1)} - onConfirm=${E} + onConfirm=${O} /> - `},bc=({status:t,openclawVersion:e,restarting:n=!1,onRestart:s,watchdogStatus:o=null,onOpenWatchdog:r,onRepair:i,repairing:a=!1,openclawUpdateInProgress:l=!1,onOpenclawVersionActionComplete:c=()=>{},onOpenclawUpdate:d=ma})=>{let[u,p]=y(()=>Date.now()),f=t==="running"&&!n,g=f?"ac-status-dot ac-status-dot--healthy":"w-2 h-2 rounded-full bg-yellow-500 animate-pulse",m=o?.lifecycle==="crash_loop"?"crash_loop":o?.health,h=m==="healthy"?"ac-status-dot ac-status-dot--healthy ac-status-dot--healthy-offset":m==="degraded"?"bg-yellow-500":m==="unhealthy"||m==="crash_loop"?"bg-red-500":"bg-gray-500",b=m==="unknown"?"initializing":m||"unknown",x=a||!!o?.operationInProgress,v=m==="degraded"&&!!r,w=x||o?.health==="degraded"&&!r||o?.lifecycle==="crash_loop"||o?.health==="unhealthy"||o?.health==="crashed",$=F(()=>{let S=o?.uptimeStartedAt?Date.parse(o.uptimeStartedAt):null;return Number.isFinite(S)?Math.max(0,u-S):o?.uptimeMs||0},[o?.uptimeStartedAt,o?.uptimeMs,u]);return L(()=>{let S=setInterval(()=>{p(Date.now())},1e3);return()=>clearInterval(S)},[]),Qt`
+ `},$c=({status:t,openclawVersion:e,restarting:n=!1,onRestart:s,watchdogStatus:o=null,onOpenWatchdog:r,onRepair:i,repairing:a=!1,openclawUpdateInProgress:l=!1,onOpenclawVersionActionComplete:c=()=>{},onOpenclawUpdate:d=ya})=>{let[u,p]=y(()=>Date.now()),f=t==="running"&&!n,g=f?"ac-status-dot ac-status-dot--healthy":"w-2 h-2 rounded-full bg-yellow-500 animate-pulse",m=o?.lifecycle==="crash_loop"?"crash_loop":o?.health,h=m==="healthy"?"ac-status-dot ac-status-dot--healthy ac-status-dot--healthy-offset":m==="degraded"?"bg-yellow-500":m==="unhealthy"||m==="crash_loop"?"bg-red-500":"bg-gray-500",x=m==="unknown"?"initializing":m||"unknown",b=a||!!o?.operationInProgress,v=m==="degraded"&&!!r,$=b||o?.health==="degraded"&&!r||o?.lifecycle==="crash_loop"||o?.health==="unhealthy"||o?.health==="crashed",w=F(()=>{let S=o?.uptimeStartedAt?Date.parse(o.uptimeStartedAt):null;return Number.isFinite(S)?Math.max(0,u-S):o?.uptimeMs||0},[o?.uptimeStartedAt,o?.uptimeMs,u]);return L(()=>{let S=setInterval(()=>{p(Date.now())},1e3);return()=>clearInterval(S)},[]),en`
@@ -6283,9 +6366,9 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s >
- ${!n&&f?Qt` + ${!n&&f?en` Uptime: ${k3($)}Uptime: ${I3(w)} `:null} <${tn} @@ -6299,7 +6382,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- ${r?Qt` + ${r?en` - `:Qt` + `:en`
Watchdog: - ${b} + ${x}
`} - ${i?Qt` + ${i?en`
- ${v?Qt` + ${v?en` <${tn} onClick=${r} warning=${!1} @@ -6330,16 +6413,16 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s loadingLabel="Inspect" className="w-full justify-center" /> - `:w?Qt` + `:$?en` <${tn} onClick=${i} - loading=${x} + loading=${b} warning=${!0} idleLabel="Repair" loadingLabel="Repairing..." className="w-full justify-center" /> - `:Qt``} @@ -6348,16 +6431,16 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
- <${S3} + <${D3} label="OpenClaw" currentVersion=${e} - fetchVersion=${mm} + fetchVersion=${gm} applyUpdate=${d} updateInProgress=${l} onActionComplete=${c} />
-
`};var $r=P.bind(T),C3={webchat:"Browser",cli:"CLI"},_3=t=>C3[t.clientMode]||t.clientId||"Device",M3=t=>{let e=[];return t.platform&&e.push(t.platform),t.role&&e.push(t.role),e.join(" \xB7 ")},A3=({d:t,onApprove:e,onReject:n})=>{let[s,o]=y(null),r=async l=>{o(l);try{l==="approve"?await e(t.id):await n(t.id)}catch{o(null)}},i=_3(t),a=M3(t);return s==="approve"?$r` +
`};var $r=P.bind(T),N3={webchat:"Browser",cli:"CLI"},O3=t=>N3[t.clientMode]||t.clientId||"Device",B3=t=>{let e=[];return t.platform&&e.push(t.platform),t.role&&e.push(t.role),e.join(" \xB7 ")},F3=({d:t,onApprove:e,onReject:n})=>{let[s,o]=y(null),r=async l=>{o(l);try{l==="approve"?await e(t.id):await n(t.id)}catch{o(null)}},i=O3(t),a=B3(t);return s==="approve"?$r`
Approved ${i} @@ -6387,12 +6470,12 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s className="font-medium px-3 py-1.5" />
-
`},xc=({pending:t,onApprove:e,onReject:n})=>!t||t.length===0?null:$r` +
`},wc=({pending:t,onApprove:e,onReject:n})=>!t||t.length===0?null:$r`

Pending device pairings

- ${t.map(s=>$r`<${A3} key=${s.id} d=${s} onApprove=${e} onReject=${n} />`)} -
`;var fo=P.bind(T),Vi=[{key:"gmail",icon:"\u{1F4E7}",label:"Gmail",defaultRead:!0,defaultWrite:!1},{key:"calendar",icon:"\u{1F4C5}",label:"Calendar",defaultRead:!0,defaultWrite:!0},{key:"drive",icon:"\u{1F4C1}",label:"Drive",defaultRead:!0,defaultWrite:!1},{key:"sheets",icon:"\u{1F4CA}",label:"Sheets",defaultRead:!0,defaultWrite:!1},{key:"docs",icon:"\u{1F4DD}",label:"Docs",defaultRead:!0,defaultWrite:!1},{key:"tasks",icon:"\u2705",label:"Tasks",defaultRead:!1,defaultWrite:!1},{key:"contacts",icon:"\u{1F464}",label:"Contacts",defaultRead:!1,defaultWrite:!1},{key:"meet",icon:"\u{1F3A5}",label:"Meet",defaultRead:!1,defaultWrite:!1}],T3={gmail:"gmail.googleapis.com",calendar:"calendar-json.googleapis.com",tasks:"tasks.googleapis.com",drive:"drive.googleapis.com",contacts:"people.googleapis.com",sheets:"sheets.googleapis.com",docs:"docs.googleapis.com",meet:"meet.googleapis.com"};function Sw(t){return`https://console.developers.google.com/apis/api/${T3[t]||""}/overview`}function Cw({scopes:t,onToggle:e,apiStatus:n,loading:s}){let[o,r]=y(!1),i=n||{},a=5,l=Vi.length>a,c=o?Vi:Vi.slice(0,a);return fo`
- ${c.map(d=>{let u=t.includes(`${d.key}:read`),p=t.includes(`${d.key}:write`),f=i[d.key],g=null;return s&&!f&&(u||p)?g=fo``:f&&(f.status==="ok"?g=fo`API ✓`:f.status==="not_enabled"?g=fo`Enable API`:f.status==="error"&&(g=fo`Enable API`)),fo` + ${t.map(s=>$r`<${F3} key=${s.id} d=${s} onApprove=${e} onReject=${n} />`)} +
`;var ho=P.bind(T),Ui=[{key:"gmail",icon:"\u{1F4E7}",label:"Gmail",defaultRead:!0,defaultWrite:!1},{key:"calendar",icon:"\u{1F4C5}",label:"Calendar",defaultRead:!0,defaultWrite:!0},{key:"drive",icon:"\u{1F4C1}",label:"Drive",defaultRead:!0,defaultWrite:!1},{key:"sheets",icon:"\u{1F4CA}",label:"Sheets",defaultRead:!0,defaultWrite:!1},{key:"docs",icon:"\u{1F4DD}",label:"Docs",defaultRead:!0,defaultWrite:!1},{key:"tasks",icon:"\u2705",label:"Tasks",defaultRead:!1,defaultWrite:!1},{key:"contacts",icon:"\u{1F464}",label:"Contacts",defaultRead:!1,defaultWrite:!1},{key:"meet",icon:"\u{1F3A5}",label:"Meet",defaultRead:!1,defaultWrite:!1}],W3={gmail:"gmail.googleapis.com",calendar:"calendar-json.googleapis.com",tasks:"tasks.googleapis.com",drive:"drive.googleapis.com",contacts:"people.googleapis.com",sheets:"sheets.googleapis.com",docs:"docs.googleapis.com",meet:"meet.googleapis.com"};function L0(t){return`https://console.developers.google.com/apis/api/${W3[t]||""}/overview`}function E0({scopes:t,onToggle:e,apiStatus:n,loading:s}){let[o,r]=y(!1),i=n||{},a=5,l=Ui.length>a,c=o?Ui:Ui.slice(0,a);return ho`
+ ${c.map(d=>{let u=t.includes(`${d.key}:read`),p=t.includes(`${d.key}:write`),f=i[d.key],g=null;return s&&!f&&(u||p)?g=ho``:f&&(f.status==="ok"?g=ho`API ✓`:f.status==="not_enabled"?g=ho`Enable API`:f.status==="error"&&(g=ho`Enable API`)),ho`
${d.icon} ${d.label}
@@ -6401,16 +6484,16 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`})} - ${l?fo` + ${l?ho` `:null} -
`}function _w(t,e){let n=t.includes(e),s=n?t.filter(o=>o!==e):[...t,e];if(e.endsWith(":write")&&!n){let o=e.replace(":write",":read");s.includes(o)||s.push(o)}if(e.endsWith(":read")&&n){let o=e.replace(":read",":write");s=s.filter(r=>r!==o)}return s}function wr(){let t=[];for(let e of Vi)e.defaultRead&&t.push(`${e.key}:read`),e.defaultWrite&&t.push(`${e.key}:write`);return t}var kr=P.bind(T),Mw=({visible:t,onClose:e,onSaved:n,title:s="Connect Google Workspace",submitLabel:o="Connect Google",defaultInstrType:r="workspace",client:i="default",personal:a=!1,accountId:l="",initialValues:c={}})=>{let[d,u]=y(""),[p,f]=y(""),[g,m]=y(""),[h,b]=y(""),[x,v]=y(!1),[w,$]=y(r),[S,C]=y(!1),_=ee(null);if(L(()=>{t&&(u(String(c.clientId||"")),f(String(c.clientSecret||"")),m(String(c.email||"")),$(r),b(""),C(!1))},[t,c,r]),!t)return null;let k=`${window.location.origin}/auth/google/callback`,A=async()=>{try{await navigator.clipboard.writeText(k),C(!0),window.setTimeout(()=>C(!1),1500)}catch{b("Unable to copy redirect URI")}},O=async R=>{let B=R.target.files[0];if(B)try{let I=await B.text(),U=JSON.parse(I),W=U.installed||U.web||U;W.client_id&&u(W.client_id),W.client_secret&&f(W.client_secret)}catch{b("Invalid JSON file")}},D=async()=>{if(b(""),!d||!p||!g){b("Client ID, Client Secret, and Email are required");return}v(!0);try{let R=await zh({clientId:d,clientSecret:p,email:g,client:i,personal:a,accountId:l});R.ok?(e(),n?.(R.account)):b(R.error||"Failed to save credentials")}catch{b("Request failed")}finally{v(!1)}},z=R=>`flex-1 text-center border-0 cursor-pointer transition-colors ${w===R?"":"hover:text-white"}`,E=R=>"font-family: inherit; font-size: 11px; letter-spacing: 0.03em; padding: 5px 10px;"+(w===R?" color: var(--accent); background: var(--bg-active);":" color: var(--text-muted); background: transparent;"),M=()=>kr` +
`}function I0(t,e){let n=t.includes(e),s=n?t.filter(o=>o!==e):[...t,e];if(e.endsWith(":write")&&!n){let o=e.replace(":write",":read");s.includes(o)||s.push(o)}if(e.endsWith(":read")&&n){let o=e.replace(":read",":write");s=s.filter(r=>r!==o)}return s}function wr(){let t=[];for(let e of Ui)e.defaultRead&&t.push(`${e.key}:read`),e.defaultWrite&&t.push(`${e.key}:write`);return t}var kr=P.bind(T),D0=({visible:t,onClose:e,onSaved:n,title:s="Connect Google Workspace",submitLabel:o="Connect Google",defaultInstrType:r="workspace",client:i="default",personal:a=!1,accountId:l="",initialValues:c={}})=>{let[d,u]=y(""),[p,f]=y(""),[g,m]=y(""),[h,x]=y(""),[b,v]=y(!1),[$,w]=y(r),[S,C]=y(!1),_=te(null);if(L(()=>{t&&(u(String(c.clientId||"")),f(String(c.clientSecret||"")),m(String(c.email||"")),w(r),x(""),C(!1))},[t,c,r]),!t)return null;let k=`${window.location.origin}/auth/google/callback`,A=async()=>{try{await navigator.clipboard.writeText(k),C(!0),window.setTimeout(()=>C(!1),1500)}catch{x("Unable to copy redirect URI")}},D=async R=>{let B=R.target.files[0];if(B)try{let E=await B.text(),U=JSON.parse(E),H=U.installed||U.web||U;H.client_id&&u(H.client_id),H.client_secret&&f(H.client_secret)}catch{x("Invalid JSON file")}},N=async()=>{if(x(""),!d||!p||!g){x("Client ID, Client Secret, and Email are required");return}v(!0);try{let R=await Kh({clientId:d,clientSecret:p,email:g,client:i,personal:a,accountId:l});R.ok?(e(),n?.(R.account)):x(R.error||"Failed to save credentials")}catch{x("Request failed")}finally{v(!1)}},z=R=>`flex-1 text-center border-0 cursor-pointer transition-colors ${$===R?"":"hover:text-white"}`,O=R=>"font-family: inherit; font-size: 11px; letter-spacing: 0.03em; padding: 5px 10px;"+($===R?" color: var(--accent); background: var(--bg-active);":" color: var(--text-muted); background: transparent;"),M=()=>kr`
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s ${S?"Copied":"Copy"}
- `;return kr` <${De} + `;return kr` <${Ie} visible=${t} onClose=${e} closeOnOverlayClick=${!1} panelClassName="bg-modal border border-border rounded-xl p-6 max-w-lg w-full space-y-4" > - <${Ne} + <${De} title=${s} actions=${kr` `} /> @@ -6470,21 +6553,21 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s style="border: 1px solid var(--border); border-radius: 6px; background: rgba(255,255,255,0.02)" >
- ${w==="personal"?kr` + ${$==="personal"?kr`
  1. @@ -6610,7 +6693,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s type="file" ref=${_} accept=".json" - onchange=${O} + onchange=${D} class="hidden" />
- <${Rt} + <${Et} value=${d} onInput=${R=>u(R.target.value)} placeholder="xxxx.apps.googleusercontent.com" @@ -6639,7 +6722,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s - <${Rt} + <${Et} value=${p} onInput=${R=>f(R.target.value)} placeholder="GOCSPX-..." @@ -6662,9 +6745,9 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
<${Z} - onClick=${D} - disabled=${x} - loading=${x} + onClick=${N} + disabled=${b} + loading=${b} tone="primary" size="lg" idleLabel=${o} @@ -6673,14 +6756,14 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s />
${h?kr`
${h}
`:null} - `};var Aw=P.bind(T),P3=({watchStatus:t,busy:e=!1})=>e?{label:t?.enabled?"Stopping":"Starting",tone:"warning"}:t?.enabled?t.enabled&&!t.running?{label:"Error",tone:"danger"}:{label:"Watching",tone:"success"}:{label:"Stopped",tone:"neutral"},Tw=({account:t,watchStatus:e=null,busy:n=!1,onEnable:s=()=>{},onDisable:o=()=>{},onOpenWebhook:r=()=>{}})=>{if(!(Array.isArray(t?.activeScopes)?t.activeScopes.includes("gmail:read"):Array.isArray(t?.services)?t.services.includes("gmail:read"):!1))return Aw` + `};var N0=P.bind(T),H3=({watchStatus:t,busy:e=!1})=>e?{label:t?.enabled?"Stopping":"Starting",tone:"warning"}:t?.enabled?t.enabled&&!t.running?{label:"Error",tone:"danger"}:{label:"Watching",tone:"success"}:{label:"Stopped",tone:"neutral"},O0=({account:t,watchStatus:e=null,busy:n=!1,onEnable:s=()=>{},onDisable:o=()=>{},onOpenWebhook:r=()=>{}})=>{if(!(Array.isArray(t?.activeScopes)?t.activeScopes.includes("gmail:read"):Array.isArray(t?.services)?t.services.includes("gmail:read"):!1))return N0`
Gmail watch requires gmail:read. Add it in permissions above, then update permissions.
- `;let a=P3({watchStatus:e,busy:n}),l=!!e?.enabled;return Aw` + `;let a=H3({watchStatus:e,busy:n}),l=!!e?.enabled;return N0`
{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s >
🔔 Gmail - <${no} + <${so} text="Watches this inbox for new email events and routes them to your agent via the Gmail hook." widthClass="w-72" /> @@ -6700,7 +6783,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s onClick=${c=>c.stopPropagation()} onKeyDown=${c=>c.stopPropagation()} > - <${ae} tone=${a.tone}>${a.label} + <${de} tone=${a.tone}>${a.label} <${vn} checked=${l} disabled=${n} @@ -6709,7 +6792,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s />
- `};var ji=P.bind(T),R3=(t=[],e=[])=>t.length===e.length&&t.every(n=>e.includes(n)),Pw=({account:t,personal:e=!1,expanded:n,onToggleExpanded:s,scopes:o=[],savedScopes:r=[],apiStatus:i={},checkingApis:a=!1,onToggleScope:l,onCheckApis:c,onUpdatePermissions:d,onEditCredentials:u,onDisconnect:p,gmailWatchStatus:f=null,gmailWatchBusy:g=!1,onEnableGmailWatch:m,onDisableGmailWatch:h,onOpenGmailSetup:b,onOpenGmailWebhook:x})=>{let v=!R3(o,r);return ji` + `};var Ki=P.bind(T),V3=(t=[],e=[])=>t.length===e.length&&t.every(n=>e.includes(n)),B0=({account:t,personal:e=!1,expanded:n,onToggleExpanded:s,scopes:o=[],savedScopes:r=[],apiStatus:i={},checkingApis:a=!1,onToggleScope:l,onCheckApis:c,onUpdatePermissions:d,onEditCredentials:u,onDisconnect:p,gmailWatchStatus:f=null,gmailWatchBusy:g=!1,onEnableGmailWatch:m,onDisableGmailWatch:h,onOpenGmailSetup:x,onOpenGmailWebhook:b})=>{let v=!V3(o,r);return Ki`
- ${e?ji`<${ae} tone="neutral">Personal`:null} - <${ae} tone=${t.authenticated?"success":"warning"}> + ${e?Ki`<${de} tone="neutral">Personal`:null} + <${de} tone=${t.authenticated?"success":"warning"}> ${t.authenticated?"Connected":"Awaiting sign-in"} - + ${n?"\u25BE":"\u25B8"}
- ${n?ji` + ${n?Ki`
Select permissions - ${t.authenticated?ji``:null}
- <${Cw} + <${E0} scopes=${o} - onToggle=${w=>l?.(t.id,w)} + onToggle=${$=>l?.(t.id,$)} apiStatus=${t.authenticated?i:{}} loading=${t.authenticated&&a} /> - ${t.authenticated?ji` + ${t.authenticated?Ki`
Incoming events
- <${Tw} + <${O0} account=${t} watchStatus=${f} busy=${g} onEnable=${()=>m?.(t.id)} onDisable=${()=>h?.(t.id)} - onOpenWebhook=${()=>x?.()} + onOpenWebhook=${()=>b?.()} />
@@ -6799,22 +6882,22 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s
`:null}
- `};var pf=P.bind(T),Rw=({visible:t,onClose:e,onSubmit:n,loading:s=!1,defaultEmail:o="",title:r="Add Company Account"})=>{let[i,a]=y(""),[l,c]=y("");if(L(()=>{t&&(a(String(o||"")),c(""))},[t,o]),!t)return null;let d=async()=>{c("");let u=String(i||"").trim();if(!u){c("Email is required");return}await n?.({email:u,setError:c})};return pf`<${De} + `};var hf=P.bind(T),F0=({visible:t,onClose:e,onSubmit:n,loading:s=!1,defaultEmail:o="",title:r="Add Company Account"})=>{let[i,a]=y(""),[l,c]=y("");if(L(()=>{t&&(a(String(o||"")),c(""))},[t,o]),!t)return null;let d=async()=>{c("");let u=String(i||"").trim();if(!u){c("Email is required");return}await n?.({email:u,setError:c})};return hf`<${Ie} visible=${t} onClose=${e} closeOnOverlayClick=${!1} panelClassName="bg-modal border border-border rounded-xl p-6 max-w-md w-full space-y-4" > - <${Ne} + <${De} title=${r} - actions=${pf` + actions=${hf` `} /> @@ -6834,7 +6917,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s class="w-full bg-field border border-border rounded-lg px-3 py-2 text-sm focus:outline-none focus:border-fg-muted" />
- ${l?pf`
${l}
`:null} + ${l?hf`
${l}
`:null}
<${Z} @@ -6848,7 +6931,7 @@ cost: ${v}`}}}}}}),()=>{r.current&&(r.current.destroy(),r.current=null)}},[f,i,s className="w-full px-4 py-2 rounded-lg text-sm" />
- `};var Lw=({gatewayStatus:t})=>{let e=ee(!1),{data:n,loading:s,refresh:o}=ct("/api/google/accounts",Wh,{maxAgeMs:3e4}),r=F(()=>Array.isArray(n?.accounts)?n.accounts:[],[n?.accounts]),i=!!n?.hasCompanyCredentials,a=!!n?.hasPersonalCredentials,l=q(async()=>o({force:!0}),[o]);return L(()=>{if(t!=="running"){e.current=!1;return}e.current||(e.current=!0,l().catch(()=>{}))},[t,l]),{accounts:r,loading:s,hasCompanyCredentials:i,hasPersonalCredentials:a,refreshAccounts:l}};var Ew=({gatewayStatus:t,accounts:e=[]})=>{let[n,s]=y({}),[o,r]=y(!1),i=F(()=>e.map(x=>String(x?.id||"").trim()).filter(Boolean).sort().join("|"),[e]),{data:a,loading:l,refresh:c}=ct("/api/gmail/config",Gh,{enabled:t==="running",maxAgeMs:3e4}),d=q(async()=>c({force:!0}),[c]);L(()=>{t==="running"&&e.length&&d().catch(()=>{})},[i,e.length,t,d]);let u=F(()=>{let x=new Map;for(let v of a?.accounts||[])x.set(String(v.accountId||""),v);return x},[a]),p=F(()=>{let x=new Map;for(let v of a?.clients||[])x.set(String(v.client||"default"),v);return x},[a]),f=(x,v)=>{s(w=>{let $=String(x||"");if(!$)return w;if(v)return{...w,[$]:!0};if(!w[$])return w;let S={...w};return delete S[$],S})},g=q(async(x,{destination:v=null}={})=>{let w=String(x||"");f(w,!0);try{let $=await Jh(w,{destination:v});return await d(),$}finally{f(w,!1)}},[d]),m=q(async x=>{let v=String(x||"");f(v,!0);try{await Zh(v),await d()}finally{f(v,!1)}},[d]),h=q(async(x="")=>{let v=String(x||"");v&&f(v,!0);try{await Yh({accountId:v,force:!0}),await d()}finally{v&&f(v,!1)}},[d]),b=q(async({client:x="default",projectId:v="",regeneratePushToken:w=!1}={})=>{r(!0);try{let $=await qh({client:x,projectId:v,regeneratePushToken:w});return await d(),$}catch($){throw String($?.message||"").toLowerCase().includes("not found")?new Error("Gmail watch API route not found. Restart AlphaClaw so /api/gmail routes are loaded."):$}finally{r(!1)}},[d]);return{loading:l,config:a,watchByAccountId:u,clientConfigByClient:p,busyByAccountId:n,savingClient:o,refresh:d,saveClientSetup:b,startWatchForAccount:g,stopWatchForAccount:m,renewForAccount:h}};var mt=P.bind(T),L3=async t=>{let e=String(t||"");if(!e)return!1;try{if(navigator?.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{let n=document.createElement("textarea");return n.value=e,n.setAttribute("readonly",""),n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n),!0}catch{return!1}},Iw=["Install + Authenticate gcloud","Enable APIs","Create Topic + IAM","Create Push Subscription","Build with your Agent"],E3=Iw.slice(0,3),yc=Is,vc=(t="",e=()=>{})=>mt` + `};var W0=({gatewayStatus:t})=>{let e=te(!1),{data:n,loading:s,refresh:o}=pt("/api/google/accounts",jh,{maxAgeMs:3e4}),r=F(()=>Array.isArray(n?.accounts)?n.accounts:[],[n?.accounts]),i=!!n?.hasCompanyCredentials,a=!!n?.hasPersonalCredentials,l=G(async()=>o({force:!0}),[o]);return L(()=>{if(t!=="running"){e.current=!1;return}e.current||(e.current=!0,l().catch(()=>{}))},[t,l]),{accounts:r,loading:s,hasCompanyCredentials:i,hasPersonalCredentials:a,refreshAccounts:l}};var H0=({gatewayStatus:t,accounts:e=[]})=>{let[n,s]=y({}),[o,r]=y(!1),i=F(()=>e.map(b=>String(b?.id||"").trim()).filter(Boolean).sort().join("|"),[e]),{data:a,loading:l,refresh:c}=pt("/api/gmail/config",Jh,{enabled:t==="running",maxAgeMs:3e4}),d=G(async()=>c({force:!0}),[c]);L(()=>{t==="running"&&e.length&&d().catch(()=>{})},[i,e.length,t,d]);let u=F(()=>{let b=new Map;for(let v of a?.accounts||[])b.set(String(v.accountId||""),v);return b},[a]),p=F(()=>{let b=new Map;for(let v of a?.clients||[])b.set(String(v.client||"default"),v);return b},[a]),f=(b,v)=>{s($=>{let w=String(b||"");if(!w)return $;if(v)return{...$,[w]:!0};if(!$[w])return $;let S={...$};return delete S[w],S})},g=G(async(b,{destination:v=null}={})=>{let $=String(b||"");f($,!0);try{let w=await Yh($,{destination:v});return await d(),w}finally{f($,!1)}},[d]),m=G(async b=>{let v=String(b||"");f(v,!0);try{await Xh(v),await d()}finally{f(v,!1)}},[d]),h=G(async(b="")=>{let v=String(b||"");v&&f(v,!0);try{await Qh({accountId:v,force:!0}),await d()}finally{v&&f(v,!1)}},[d]),x=G(async({client:b="default",projectId:v="",regeneratePushToken:$=!1}={})=>{r(!0);try{let w=await Zh({client:b,projectId:v,regeneratePushToken:$});return await d(),w}catch(w){throw String(w?.message||"").toLowerCase().includes("not found")?new Error("Gmail watch API route not found. Restart AlphaClaw so /api/gmail routes are loaded."):w}finally{r(!1)}},[d]);return{loading:l,config:a,watchByAccountId:u,clientConfigByClient:p,busyByAccountId:n,savingClient:o,refresh:d,saveClientSetup:x,startWatchForAccount:g,stopWatchForAccount:m,renewForAccount:h}};var xt=P.bind(T),j3=async t=>{let e=String(t||"");if(!e)return!1;try{if(navigator?.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{let n=document.createElement("textarea");return n.value=e,n.setAttribute("readonly",""),n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n),!0}catch{return!1}},V0=["Install + Authenticate gcloud","Enable APIs","Create Topic + IAM","Create Push Subscription","Build with your Agent"],z3=V0.slice(0,3),kc=Bs,Sc=(t="",e=()=>{})=>xt`
     
-`,Dw=({visible:t=!1,account:e=null,clientConfig:n=null,saving:s=!1,onClose:o=()=>{},onSaveSetup:r=async()=>{},onFinish:i=async()=>{}})=>{let[a,l]=y(0),[c,d]=y(""),[u,p]=y(!1),[f,g]=y(""),[m,h]=y(!1),[b,x]=y(!1),[v,w]=y(!1),[$,S]=y(!1),[C,_]=y(!1),{selectedSessionKey:k,setSelectedSessionKey:A,loading:O,error:D}=yr({enabled:t,filter:pc}),{sessions:z,destinationSessionKey:E,setDestinationSessionKey:M,selectedDestination:R}=Ds({enabled:t,resetKey:String(e?.id||"")});L(()=>{t&&(l(0),g(""),d(""),p(!1),h(!1),x(!1),w(!1),S(!1),_(!!n?.webhookExists))},[t,e?.id]);let B=n?.commands||null,I=!!(String(n?.projectId||"").trim()||B),U=u||!I&&!m,W=String(c||"").trim()||String(n?.projectId||"").trim()||"",G=C,se=G?E3:Iw,K=se.length,j=String(e?.client||n?.client||"default").trim()||"default",X=F(()=>U?String(c||"").trim().length>0:!0,[U,c]),de=q(async he=>{if(await L3(he)){N("Copied to clipboard","success");return}N("Could not copy text","error")},[]),le=q(()=>{g(""),d(String(n?.projectId||"").trim()),h(!1),p(!0)},[n?.projectId]),ie=async()=>{try{g(""),await i({client:j,projectId:String(c||"").trim(),destination:R}),x(!0),l(he=>Math.min(he+1,K-1))}catch(he){g(he.message||"Could not finish setup")}},ne=async()=>{if(!s){if(U){if(!X)return;g("");try{await r({client:j,projectId:String(c||"").trim()}),p(!1),h(!0)}catch(he){g(he.message||"Could not save project id");return}return}l(he=>Math.min(he+1,K-1))}},xe=async()=>{if(!(v||$))try{w(!0);let ue=`I just enabled Gmail watch for "${String(e?.email||"this account").trim()||"this account"}", set up the webhook, and created the transform file. Help me set up what I want to do with incoming email.`;await fa({message:ue,sessionKey:k}),S(!0),N("Message sent to your agent","success")}catch(he){N(he.message||"Could not send message to agent","error")}finally{w(!1)}};return mt` - <${De} +`,j0=({visible:t=!1,account:e=null,clientConfig:n=null,saving:s=!1,onClose:o=()=>{},onSaveSetup:r=async()=>{},onFinish:i=async()=>{}})=>{let[a,l]=y(0),[c,d]=y(""),[u,p]=y(!1),[f,g]=y(""),[m,h]=y(!1),[x,b]=y(!1),[v,$]=y(!1),[w,S]=y(!1),[C,_]=y(!1),{selectedSessionKey:k,setSelectedSessionKey:A,loading:D,error:N}=yr({enabled:t,filter:gc}),{sessions:z,destinationSessionKey:O,setDestinationSessionKey:M,selectedDestination:R}=Fs({enabled:t,resetKey:String(e?.id||"")});L(()=>{t&&(l(0),g(""),d(""),p(!1),h(!1),b(!1),$(!1),S(!1),_(!!n?.webhookExists))},[t,e?.id]);let B=n?.commands||null,E=!!(String(n?.projectId||"").trim()||B),U=u||!E&&!m,H=String(c||"").trim()||String(n?.projectId||"").trim()||"",K=C,se=K?z3:V0,Y=se.length,j=String(e?.client||n?.client||"default").trim()||"default",J=F(()=>U?String(c||"").trim().length>0:!0,[U,c]),pe=G(async he=>{if(await j3(he)){I("Copied to clipboard","success");return}I("Could not copy text","error")},[]),le=G(()=>{g(""),d(String(n?.projectId||"").trim()),h(!1),p(!0)},[n?.projectId]),ie=async()=>{try{g(""),await i({client:j,projectId:String(c||"").trim(),destination:R}),b(!0),l(he=>Math.min(he+1,Y-1))}catch(he){g(he.message||"Could not finish setup")}},oe=async()=>{if(!s){if(U){if(!J)return;g("");try{await r({client:j,projectId:String(c||"").trim()}),p(!1),h(!0)}catch(he){g(he.message||"Could not save project id");return}return}l(he=>Math.min(he+1,Y-1))}},xe=async()=>{if(!(v||w))try{$(!0);let ue=`I just enabled Gmail watch for "${String(e?.email||"this account").trim()||"this account"}", set up the webhook, and created the transform file. Help me set up what I want to do with incoming email.`;await ga({message:ue,sessionKey:k}),S(!0),I("Message sent to your agent","success")}catch(he){I(he.message||"Could not send message to agent","error")}finally{$(!1)}};return xt` + <${Ie} visible=${t} onClose=${o} closeOnOverlayClick=${!1} @@ -6879,11 +6962,11 @@ ${t} - <${nt} className="w-3.5 h-3.5 text-body" /> + <${Qe} className="w-3.5 h-3.5 text-body" />
Gmail Pub / Sub Setup
- ${se.map((he,ue)=>mt` + ${se.map((he,ue)=>xt`
`)}
- <${Ne} - title=${`Step ${a+1} of ${K}: ${se[a]}`} + <${De} + title=${`Step ${a+1} of ${Y}: ${se[a]}`} actions=${null} /> - ${f?mt`
${f}
`:null} - ${U?mt` + ${f?xt`
${f}
`:null} + ${U?xt`
@@ -6923,10 +7006,10 @@ ${t}
`:null} - ${!U&&a===0?mt` + ${!U&&a===0?xt`
- Using project ${W}. + Using project ${H}.
If gcloud is not installed on your computer, @@ -6941,36 +7024,36 @@ ${t}
- ${vc(`gcloud auth login -gcloud config set project ${W}`,()=>de(`gcloud auth login -gcloud config set project ${W}`))} + ${Sc(`gcloud auth login +gcloud config set project ${H}`,()=>pe(`gcloud auth login +gcloud config set project ${H}`))} `:null} - ${!U&&a===1?vc(B?.enableApis||"",()=>de(B?.enableApis||"")):null} - ${!U&&a===2?mt` - ${vc(`${B?.createTopic||""} + ${!U&&a===1?Sc(B?.enableApis||"",()=>pe(B?.enableApis||"")):null} + ${!U&&a===2?xt` + ${Sc(`${B?.createTopic||""} -${B?.grantPublisher||""}`.trim(),()=>de(`${B?.createTopic||""} +${B?.grantPublisher||""}`.trim(),()=>pe(`${B?.createTopic||""} ${B?.grantPublisher||""}`.trim()))} `:null} - ${!G&&!U&&a===3?mt` - ${vc(B?.createSubscription||"",()=>de(B?.createSubscription||""))} + ${!K&&!U&&a===3?xt` + ${Sc(B?.createSubscription||"",()=>pe(B?.createSubscription||""))}
<${vr} label="Deliver to" sessions=${z} - selectedSessionKey=${E} + selectedSessionKey=${O} onChangeSessionKey=${M} - disabled=${G||O||s} - loading=${O} - error=${D} + disabled=${K||D||s} + loading=${D} + error=${N} allowNone=${!0} - noneValue=${yc} + noneValue=${kc} noneLabel="Default" loadingLabel="Loading sessions..." - helperText=${G?"This Gmail webhook has already been created. To edit delivery routing, ask your agent.":null} + helperText=${K?"This Gmail webhook has already been created. To edit delivery routing, ask your agent.":null} selectClassName="w-full bg-field border border-border rounded-lg px-2.5 py-2 text-xs font-mono focus:border-fg-muted focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed" helperClassName="text-xs text-fg-muted" statusClassName="text-[11px] text-fg-muted" @@ -6978,7 +7061,7 @@ ${B?.grantPublisher||""}`.trim()))} />
`:null} - ${!G&&a===4?mt` + ${!K&&a===4?xt`
@@ -6994,15 +7077,15 @@ ${B?.grantPublisher||""}`.trim()))}
<${Z} onClick=${xe} - disabled=${!k||$} + disabled=${!k||w} loading=${v} - idleLabel=${$?"Sent":"Send to Agent"} + idleLabel=${w?"Sent":"Send to Agent"} loadingLabel="Sending..." tone="primary" size="sm" className="h-[34px] px-3" />
- ${O?mt`
+ ${D?xt`
Loading sessions...
`:null} - ${D?mt`
- ${D} + ${N?xt`
+ ${N}
`:null}
`:null}
- ${a===0?mt`${U?mt`
`:mt`
`:xt``}`:mt`<${Z} + `}`:xt`<${Z} onClick=${()=>l(he=>Math.max(he-1,0))} disabled=${s} idleLabel="Back" @@ -7044,7 +7127,7 @@ ${B?.grantPublisher||""}`.trim()))} size="md" className="w-full justify-center" />`} - ${!G&&a===K-2?mt`<${Z} + ${!K&&a===Y-2?xt`<${Z} onClick=${ie} disabled=${!1} loading=${s} @@ -7053,14 +7136,14 @@ ${B?.grantPublisher||""}`.trim()))} tone="primary" size="md" className="w-full justify-center" - />`:a`:a`:mt`<${Z} + />`:xt`<${Z} onClick=${o} disabled=${s||v} idleLabel="Done" @@ -7069,13 +7152,13 @@ ${B?.grantPublisher||""}`.trim()))} className="w-full justify-center" />`}
- - `};var Ns=P.bind(T),I3=(t=[],e=[])=>t.length!==e.length||t.some(n=>!e.includes(n)),$c=(t={})=>!!t.personal,D3="/assets/icons/google_icon.svg",Nw=({gatewayStatus:t,onRestartRequired:e=()=>{},onOpenGmailWebhook:n=()=>{}})=>{let{accounts:s,loading:o,hasCompanyCredentials:r,refreshAccounts:i}=Lw({gatewayStatus:t}),[a,l]=y(""),[c,d]=y({}),[u,p]=y({}),[f,g]=y({}),[m,h]=y({}),[b,x]=y(!1),[v,w]=y({visible:!1,accountId:"",client:"default",personal:!1,title:"Connect Google Workspace",submitLabel:"Connect Google",defaultInstrType:"workspace",initialValues:{}}),[$,S]=y(!1),[C,_]=y(!1),[k,A]=y(""),[O,D]=y({visible:!1,accountId:""}),{loading:z,watchByAccountId:E,clientConfigByClient:M,busyByAccountId:R,savingClient:B,refresh:I,saveClientSetup:U,startWatchForAccount:W,stopWatchForAccount:G}=Ew({gatewayStatus:t,accounts:s}),se=F(()=>s.some(Q=>$c(Q)),[s]),K=F(()=>s.some(Q=>!$c(Q)),[s]),j=q(Q=>s.find(pe=>pe.id===Q)||null,[s]),X=q(Q=>{let pe=Array.isArray(Q.activeScopes)&&Q.activeScopes.length?Q.activeScopes:Array.isArray(Q.services)&&Q.services.length?Q.services:wr();p(te=>({...te,[Q.id]:[...pe]})),d(te=>{let Ee=te[Q.id];return!Ee||!I3(Ee,pe)?{...te,[Q.id]:[...pe]}:te})},[]);L(()=>{if(!s.length){l("");return}let Q=s.find(pe=>!pe.authenticated)?.id||"";l(pe=>pe&&s.some(te=>te.id===pe)?pe:Q),s.forEach(pe=>X(pe))},[s,X]);let de=q(Q=>{let pe=j(Q);if(!pe)return;let te=c[Q]||pe.activeScopes||wr();if(!te.length){window.alert("Select at least one service");return}let Ee=`/auth/google/start?accountId=${encodeURIComponent(Q)}&services=${encodeURIComponent(te.join(","))}&_ts=${Date.now()}`,ke=window.open(Ee,`google-auth-${Q}`,"popup=yes,width=500,height=700");(!ke||ke.closed)&&(window.location.href=Ee)},[j,c]),le=(Q,pe)=>{d(te=>({...te,[Q]:_w(te[Q]||[],pe)}))},ie=q(async Q=>{g(pe=>{let te={...pe};return delete te[Q],te}),h({[Q]:!0});try{let pe=await jh(Q);pe.results&&g(te=>({...te,[Q]:pe.results}))}finally{h(pe=>{if(!pe[Q])return pe;let te={...pe};return delete te[Q],te})}},[]);L(()=>{let Q=async pe=>{if(pe.data?.google==="success"){N("\u2713 Google account connected","success");let te=String(pe.data?.accountId||"").trim();g({}),await i(),await I(),te&&await ie(te)}else pe.data?.google==="error"&&N(`\u2717 Google auth failed: ${pe.data.message||"unknown"}`,"error")};return window.addEventListener("message",Q),()=>window.removeEventListener("message",Q)},[ie,i,I]),L(()=>{!a||!j(a)?.authenticated||m[a]||f[a]||ie(a)},[s,f,m,a,j,ie]);let ne=async Q=>{let pe=await Kh(Q);if(!pe.ok){N(`Failed to disconnect: ${pe.error||"unknown"}`,"error");return}N("Google account disconnected","success"),g(te=>{let Ee={...te};return delete Ee[Q],Ee}),await i(),await I()},xe=({accountId:Q="",client:pe="default",personal:te=!1,title:Ee="Connect Google Workspace",submitLabel:ke="Connect Google",defaultInstrType:H=te?"personal":"workspace",initialValues:re={}})=>{w({visible:!0,accountId:Q,client:pe,personal:te,title:Ee,submitLabel:ke,defaultInstrType:H,initialValues:re})},he=()=>{w(Q=>({...Q,visible:!1}))},ue=async Q=>{Q?.id&&l(Q.id),await i(),Q?.id&&de(Q.id)},me=async({email:Q,setError:pe})=>{_(!0);try{let te=await Uh({email:Q,client:"default",personal:!1,services:wr()});if(!te.ok){pe?.(te.error||"Could not add account");return}S(!1),te.accountId&&l(te.accountId),await i(),te.accountId&&de(te.accountId)}finally{_(!1)}},V=()=>{if(x(!1),K&&r){S(!0);return}xe({client:"default",personal:!1,title:"Add Company Account",submitLabel:"Save Credentials",defaultInstrType:"workspace"})},J=()=>{x(!1),xe({client:"personal",personal:!0,title:"Add Personal Account",submitLabel:"Save Credentials",defaultInstrType:"personal"})},oe=async Q=>{let pe=j(Q);if(!pe)return;let te=$c(pe),Ee=te?"personal":pe.client||"default",ke={};try{let H=await Vh({accountId:pe.id,client:Ee});H?.ok&&(ke={clientId:String(H.clientId||""),clientSecret:String(H.clientSecret||"")})}catch{N("Could not load saved client credentials","warning")}xe({accountId:pe.id,client:Ee,personal:te,title:`Edit Credentials (${pe.email})`,submitLabel:"Save Credentials",defaultInstrType:te?"personal":"workspace",initialValues:{email:pe.email,...ke}})},ce=Q=>{D({visible:!0,accountId:String(Q||"")})},be=()=>{D({visible:!1,accountId:""})},Ve=async Q=>{let pe=j(Q);if(!pe)return;let te=String(pe.client||"default").trim()||"default",Ee=M.get(te);if(!Ee?.configured||!Ee?.webhookExists){ce(Q);return}try{(await W(Q))?.restartRequired&&e(!0),N("Gmail watch enabled","success")}catch(ke){N(ke.message||"Could not enable Gmail watch","error")}},et=async Q=>{try{await G(Q),N("Gmail watch disabled","info")}catch(pe){N(pe.message||"Could not disable Gmail watch","error")}},kt=async({client:Q,projectId:pe,destination:te=null})=>{let Ee=String(O.accountId||"").trim();Ee&&(await U({client:Q,projectId:pe,regeneratePushToken:!1}),await W(Ee,{destination:te}),N("Gmail setup complete and watch enabled","success"))},Ot=()=>Ns` + + `};var Ws=P.bind(T),U3=(t=[],e=[])=>t.length!==e.length||t.some(n=>!e.includes(n)),Cc=(t={})=>!!t.personal,K3="/assets/icons/google_icon.svg",z0=({gatewayStatus:t,onRestartRequired:e=()=>{},onOpenGmailWebhook:n=()=>{}})=>{let{accounts:s,loading:o,hasCompanyCredentials:r,refreshAccounts:i}=W0({gatewayStatus:t}),[a,l]=y(""),[c,d]=y({}),[u,p]=y({}),[f,g]=y({}),[m,h]=y({}),[x,b]=y(!1),[v,$]=y({visible:!1,accountId:"",client:"default",personal:!1,title:"Connect Google Workspace",submitLabel:"Connect Google",defaultInstrType:"workspace",initialValues:{}}),[w,S]=y(!1),[C,_]=y(!1),[k,A]=y(""),[D,N]=y({visible:!1,accountId:""}),{loading:z,watchByAccountId:O,clientConfigByClient:M,busyByAccountId:R,savingClient:B,refresh:E,saveClientSetup:U,startWatchForAccount:H,stopWatchForAccount:K}=H0({gatewayStatus:t,accounts:s}),se=F(()=>s.some(Q=>Cc(Q)),[s]),Y=F(()=>s.some(Q=>!Cc(Q)),[s]),j=G(Q=>s.find(ce=>ce.id===Q)||null,[s]),J=G(Q=>{let ce=Array.isArray(Q.activeScopes)&&Q.activeScopes.length?Q.activeScopes:Array.isArray(Q.services)&&Q.services.length?Q.services:wr();p(ee=>({...ee,[Q.id]:[...ce]})),d(ee=>{let Ee=ee[Q.id];return!Ee||!U3(Ee,ce)?{...ee,[Q.id]:[...ce]}:ee})},[]);L(()=>{if(!s.length){l("");return}let Q=s.find(ce=>!ce.authenticated)?.id||"";l(ce=>ce&&s.some(ee=>ee.id===ce)?ce:Q),s.forEach(ce=>J(ce))},[s,J]);let pe=G(Q=>{let ce=j(Q);if(!ce)return;let ee=c[Q]||ce.activeScopes||wr();if(!ee.length){window.alert("Select at least one service");return}let Ee=`/auth/google/start?accountId=${encodeURIComponent(Q)}&services=${encodeURIComponent(ee.join(","))}&_ts=${Date.now()}`,ke=window.open(Ee,`google-auth-${Q}`,"popup=yes,width=500,height=700");(!ke||ke.closed)&&(window.location.href=Ee)},[j,c]),le=(Q,ce)=>{d(ee=>({...ee,[Q]:I0(ee[Q]||[],ce)}))},ie=G(async Q=>{g(ce=>{let ee={...ce};return delete ee[Q],ee}),h({[Q]:!0});try{let ce=await Uh(Q);ce.results&&g(ee=>({...ee,[Q]:ce.results}))}finally{h(ce=>{if(!ce[Q])return ce;let ee={...ce};return delete ee[Q],ee})}},[]);L(()=>{let Q=async ce=>{if(ce.data?.google==="success"){I("\u2713 Google account connected","success");let ee=String(ce.data?.accountId||"").trim();g({}),await i(),await E(),ee&&await ie(ee)}else ce.data?.google==="error"&&I(`\u2717 Google auth failed: ${ce.data.message||"unknown"}`,"error")};return window.addEventListener("message",Q),()=>window.removeEventListener("message",Q)},[ie,i,E]),L(()=>{!a||!j(a)?.authenticated||m[a]||f[a]||ie(a)},[s,f,m,a,j,ie]);let oe=async Q=>{let ce=await qh(Q);if(!ce.ok){I(`Failed to disconnect: ${ce.error||"unknown"}`,"error");return}I("Google account disconnected","success"),g(ee=>{let Ee={...ee};return delete Ee[Q],Ee}),await i(),await E()},xe=({accountId:Q="",client:ce="default",personal:ee=!1,title:Ee="Connect Google Workspace",submitLabel:ke="Connect Google",defaultInstrType:W=ee?"personal":"workspace",initialValues:re={}})=>{$({visible:!0,accountId:Q,client:ce,personal:ee,title:Ee,submitLabel:ke,defaultInstrType:W,initialValues:re})},he=()=>{$(Q=>({...Q,visible:!1}))},ue=async Q=>{Q?.id&&l(Q.id),await i(),Q?.id&&pe(Q.id)},be=async({email:Q,setError:ce})=>{_(!0);try{let ee=await Gh({email:Q,client:"default",personal:!1,services:wr()});if(!ee.ok){ce?.(ee.error||"Could not add account");return}S(!1),ee.accountId&&l(ee.accountId),await i(),ee.accountId&&pe(ee.accountId)}finally{_(!1)}},V=()=>{if(b(!1),Y&&r){S(!0);return}xe({client:"default",personal:!1,title:"Add Company Account",submitLabel:"Save Credentials",defaultInstrType:"workspace"})},q=()=>{b(!1),xe({client:"personal",personal:!0,title:"Add Personal Account",submitLabel:"Save Credentials",defaultInstrType:"personal"})},ae=async Q=>{let ce=j(Q);if(!ce)return;let ee=Cc(ce),Ee=ee?"personal":ce.client||"default",ke={};try{let W=await zh({accountId:ce.id,client:Ee});W?.ok&&(ke={clientId:String(W.clientId||""),clientSecret:String(W.clientSecret||"")})}catch{I("Could not load saved client credentials","warning")}xe({accountId:ce.id,client:Ee,personal:ee,title:`Edit Credentials (${ce.email})`,submitLabel:"Save Credentials",defaultInstrType:ee?"personal":"workspace",initialValues:{email:ce.email,...ke}})},fe=Q=>{N({visible:!0,accountId:String(Q||"")})},ne=()=>{N({visible:!1,accountId:""})},ve=async Q=>{let ce=j(Q);if(!ce)return;let ee=String(ce.client||"default").trim()||"default",Ee=M.get(ee);if(!Ee?.configured||!Ee?.webhookExists){fe(Q);return}try{(await H(Q))?.restartRequired&&e(!0),I("Gmail watch enabled","success")}catch(ke){I(ke.message||"Could not enable Gmail watch","error")}},ge=async Q=>{try{await K(Q),I("Gmail watch disabled","info")}catch(ce){I(ce.message||"Could not disable Gmail watch","error")}},Oe=async({client:Q,projectId:ce,destination:ee=null})=>{let Ee=String(D.accountId||"").trim();Ee&&(await U({client:Q,projectId:ce,regeneratePushToken:!1}),await H(Ee,{destination:ee}),I("Gmail setup complete and watch enabled","success"))},qe=()=>Ws`
Google logo <${Z} - onClick=${J} + onClick=${q} tone="secondary" size="sm" idleLabel="Add Personal Account" @@ -7104,72 +7187,72 @@ ${B?.grantPublisher||""}`.trim()))} />
- `;return Ns` + `;return Ws`

Google Accounts

- ${s.length?Ns` + ${s.length?Ws`
- <${pt} - open=${b} + <${mt} + open=${x} ariaLabel="Add Google account" title="Add Google account" - onClose=${()=>x(!1)} - onToggle=${()=>x(Q=>!Q)} - renderTrigger=${({onToggle:Q,ariaLabel:pe,title:te})=>Ns` + onClose=${()=>b(!1)} + onToggle=${()=>b(Q=>!Q)} + renderTrigger=${({onToggle:Q,ariaLabel:ce,title:ee})=>Ws` <${Z} onClick=${Q} tone="subtle" size="sm" idleLabel="+ Add Account" - ariaLabel=${pe} - title=${te} + ariaLabel=${ce} + title=${ee} /> `} > <${We} onClick=${V}> Company account - ${se?null:Ns` - <${We} onClick=${J}> + ${se?null:Ws` + <${We} onClick=${q}> Personal account `} - +
`:null}
- ${o?Ns`
+ ${o?Ws`
Loading... -
`:s.length?Ns` +
`:s.length?Ws`
- ${s.map(Q=>Ns`<${Pw} + ${s.map(Q=>Ws`<${B0} key=${Q.id} account=${Q} - personal=${$c(Q)} + personal=${Cc(Q)} expanded=${a===Q.id} - onToggleExpanded=${pe=>l(te=>te===pe?"":pe)} + onToggleExpanded=${ce=>l(ee=>ee===ce?"":ce)} scopes=${c[Q.id]||Q.activeScopes||wr()} savedScopes=${u[Q.id]||Q.activeScopes||wr()} apiStatus=${f[Q.id]||{}} checkingApis=${a===Q.id&&!!m[Q.id]} onToggleScope=${le} onCheckApis=${ie} - onUpdatePermissions=${pe=>de(pe)} - onEditCredentials=${oe} - onDisconnect=${pe=>A(pe)} - gmailWatchStatus=${E.get(Q.id)||null} + onUpdatePermissions=${ce=>pe(ce)} + onEditCredentials=${ae} + onDisconnect=${ce=>A(ce)} + gmailWatchStatus=${O.get(Q.id)||null} gmailWatchBusy=${!!R[Q.id]} - onEnableGmailWatch=${Ve} - onDisableGmailWatch=${et} - onOpenGmailSetup=${ce} + onEnableGmailWatch=${ve} + onDisableGmailWatch=${ge} + onOpenGmailSetup=${fe} onOpenGmailWebhook=${n} />`)}
- `:Ot()} + `:qe()}
- <${Mw} + <${D0} visible=${v.visible} onClose=${he} onSaved=${ue} @@ -7182,67 +7265,67 @@ ${B?.grantPublisher||""}`.trim()))} initialValues=${v.initialValues} /> - <${Rw} - visible=${$} + <${F0} + visible=${w} onClose=${()=>S(!1)} - onSubmit=${me} + onSubmit=${be} loading=${C} title="Add Company Account" /> - <${Dw} - visible=${O.visible} - account=${j(O.accountId)} - clientConfig=${M.get(String(j(O.accountId)?.client||"default").trim()||"default")||null} + <${j0} + visible=${D.visible} + account=${j(D.accountId)} + clientConfig=${M.get(String(j(D.accountId)?.client||"default").trim()||"default")||null} saving=${B||z} - onClose=${be} + onClose=${ne} onSaveSetup=${U} - onFinish=${kt} + onFinish=${Oe} /> - <${st} + <${rt} visible=${!!k} title="Disconnect Google account?" message="Your agent will lose access to Gmail, Calendar, and other Google Workspace services until you reconnect." confirmLabel="Disconnect" cancelLabel="Cancel" onCancel=${()=>A("")} - onConfirm=${async()=>{let Q=k;A(""),await ne(Q)}} + onConfirm=${async()=>{let Q=k;A(""),await oe(Q)}} /> - `};var wc=P.bind(T),N3=(t,e)=>t.find(n=>n.key===e)?.value||"",O3=(t,e)=>{for(let n of t.providers)if((Mn[n]||[]).some(r=>!!N3(e,r.key)))return{active:!0,provider:n};return{active:!1,provider:null}},Ow=({onSwitchTab:t})=>{let{data:e,loading:n}=ct("/api/env",Vr,{maxAgeMs:3e4}),s=Array.isArray(e?.vars)?e.vars:[];return n?null:wc` + `};var _c=P.bind(T),G3=(t,e)=>t.find(n=>n.key===e)?.value||"",q3=(t,e)=>{for(let n of t.providers)if((An[n]||[]).some(r=>!!G3(e,r.key)))return{active:!0,provider:n};return{active:!1,provider:null}},U0=({onSwitchTab:t})=>{let{data:e,loading:n}=pt("/api/env",Ur,{maxAgeMs:3e4}),s=Array.isArray(e?.vars)?e.vars:[];return n?null:_c`

Features

- ${gg.map(r=>{let i=O3(r,s);return wc` + ${yg.map(r=>{let i=q3(r,s);return _c`
${r.label} - ${i.active?wc` + ${i.active?_c` - ${zs[i.provider]||i.provider} + ${qs[i.provider]||i.provider} - <${ae} tone="success">Enabled + <${de} tone="success">Enabled - `:wc` + `:_c` {a.preventDefault(),t?.("envars")}} class="text-xs px-2 py-1 rounded-lg ac-btn-ghost" >Add provider - <${ae} tone=${r.hasDefault?"neutral":"danger"}>Disabled + <${de} tone=${r.hasDefault?"neutral":"danger"}>Disabled `}
`})}
- `};var B3=P.bind(T),Bw=({doctorStatus:t=null,dismissedUntilMs:e=0,onOpenDoctor:n=()=>{},onDismiss:s=()=>{}})=>fc(t,e)?B3` + `};var J3=P.bind(T),K0=({doctorStatus:t=null,dismissedUntilMs:e=0,onOpenDoctor:n=()=>{},onDismiss:s=()=>{}})=>bc(t,e)?J3`

Drift Doctor

-

${rw(t)}

+

${f0(t)}

<${Z} @@ -7258,55 +7341,78 @@ ${B?.grantPublisher||""}`.trim()))}
- `:null;var kc="0 * * * *",Fw=({statusData:t=null,watchdogData:e=null,doctorStatusData:n=null,onRefreshStatuses:s=()=>{},isActive:o=!1,restartSignal:r=0}={})=>{let[i,a]=y(!1),[l,c]=y(!1),[d,u]=y(!0),[p,f]=y(kc),[g,m]=y(!1),[h,b]=y(kc),[x,v]=y(!1),[w,$]=y(!1),[S,C]=y(!1),_=ee(null),k=t,A=e,O=n,D=k?.gateway??null,z=k?.channels??null,E=k?.repo||null,M=k?.syncCron||null,R=k?.openclawVersion||null,B=bs.some(ue=>{let me=z?.[ue];if(!me)return!1;let V=me.accounts&&typeof me.accounts=="object"?me.accounts:{};return Object.keys(V).length>0?Object.values(V).some(J=>J&&J.status!=="paired"):me.status!=="paired"}),I=Re(async()=>(await Co()).pending||[],3e3,{enabled:B&&D==="running",cacheKey:"/api/pairings"}),U=I.data||[],W=D==="running"&&(w||!S),G=Re(async()=>{let ue=await ga();return C(ue?.cliAutoApproveComplete===!0),ue.pending||[]},5e3,{enabled:W,cacheKey:"/api/devices"}),se=G.data||[];L(()=>{o&&(I.refresh(),W&&G.refresh())},[G.refresh,o,s,I.refresh,w,W]),L(()=>{if(!r||!o)return;s(),I.refresh(),W&&G.refresh();let ue=setTimeout(()=>{s(),I.refresh(),W&&G.refresh()},1200),me=setTimeout(()=>{s(),I.refresh(),W&&G.refresh()},3500);return()=>{clearTimeout(ue),clearTimeout(me)}},[G.refresh,o,s,I.refresh,r,w,W]),L(()=>{M&&(u(M.enabled!==!1),f(M.schedule||kc),b(M.enabled===!1?"disabled":M.schedule||kc))},[M?.enabled,M?.schedule]),L(()=>()=>{_.current&&clearTimeout(_.current)},[]);let K=()=>{v(!0),_.current&&clearTimeout(_.current),_.current=setTimeout(()=>{v(!1),_.current=null},2800),s(),I.refresh(),setTimeout(()=>{s(),I.refresh()},700),setTimeout(()=>{s(),I.refresh()},1800)},j=async({enabled:ue=d,schedule:me=p}={})=>{if(!g){m(!0);try{let V=await ym({enabled:ue,schedule:me});if(!V.ok)throw new Error(V.error||"Could not save sync settings");N("Sync schedule updated","success"),s()}catch(V){N(V.message||"Could not save sync settings","error")}finally{m(!1)}}};return{state:{channels:z,dashboardLoading:i,devicePending:se,doctorStatus:O,gatewayStatus:D,hasUnpaired:B,openclawVersion:R,pending:U,pairingStatusRefreshing:x,repairingWatchdog:l,repo:E,savingSyncCron:g,syncCron:M,syncCronChoice:h,syncCronEnabled:d,syncCronSchedule:p,syncCronStatusText:d?"Enabled":"Disabled",watchdogStatus:A},actions:{handleApprove:async(ue,me,V="")=>{await _o(ue,me,V),K()},handleDeviceApprove:async ue=>{await ba(ue),setTimeout(G.refresh,500),setTimeout(G.refresh,2e3)},handleDeviceReject:async ue=>{await xa(ue),setTimeout(G.refresh,500),setTimeout(G.refresh,2e3)},handleOpenDashboard:async()=>{if(!i){$(!0),a(!0);try{let ue=await hm();console.log("[dashboard] response:",JSON.stringify(ue)),window.open(ue.url||"/openclaw","_blank")}catch(ue){console.error("[dashboard] error:",ue),window.open("/openclaw","_blank")}finally{a(!1)}}},handleReject:async(ue,me,V="")=>{try{await Mo(ue,me,V),K()}catch(J){N(J.message||"Could not reject pairing","error")}},handleSyncCronChoiceChange:async ue=>{b(ue);let me=ue!=="disabled",V=me?ue:p;u(me),f(V),await j({enabled:me,schedule:V})},handleWatchdogRepair:async()=>{if(!l){c(!0);try{let ue=await ha();if(!ue.ok)throw new Error(ue.error||"Repair failed");N("Repair triggered","success"),setTimeout(()=>{s()},800)}catch(ue){N(ue.message||"Could not run repair","error")}finally{c(!1)}}}}}};var Sc=P.bind(T),Hw=({statusData:t=null,watchdogData:e=null,doctorStatusData:n=null,agents:s=[],doctorWarningDismissedUntilMs:o=0,onRefreshStatuses:r=()=>{},onSwitchTab:i=()=>{},onNavigate:a=()=>{},onOpenGmailWebhook:l=()=>{},isActive:c=!1,restartingGateway:d=!1,onRestartGateway:u=()=>{},restartSignal:p=0,openclawUpdateInProgress:f=!1,onOpenclawVersionActionComplete:g=()=>{},onOpenclawUpdate:m=()=>{},onRestartRequired:h=()=>{},onDismissDoctorWarning:b=()=>{}})=>{let{state:x,actions:v}=Fw({statusData:t,watchdogData:e,doctorStatusData:n,onRefreshStatuses:r,isActive:c,restartSignal:p});return Sc` + `:null;var Ac="0 * * * *",G0=({statusData:t=null,watchdogData:e=null,doctorStatusData:n=null,onRefreshStatuses:s=()=>{},isActive:o=!1,restartSignal:r=0}={})=>{let[i,a]=y(!1),[l,c]=y(!1),[d,u]=y(!0),[p,f]=y(Ac),[g,m]=y(!1),[h,x]=y(Ac),[b,v]=y(!1),[$,w]=y(!1),[S,C]=y(!1),_=te(null),k=t,A=e,D=n,N=k?.gateway??null,z=k?.channels??null,O=k?.repo||null,M=k?.syncCron||null,R=k?.openclawVersion||null,B=vs.some(ue=>{let be=z?.[ue];if(!be)return!1;let V=be.accounts&&typeof be.accounts=="object"?be.accounts:{};return Object.keys(V).length>0?Object.values(V).some(q=>q&&q.status!=="paired"):be.status!=="paired"}),E=Re(async()=>(await _o()).pending||[],3e3,{enabled:B&&N==="running",cacheKey:"/api/pairings"}),U=E.data||[],H=N==="running"&&($||!S),K=Re(async()=>{let ue=await va();return C(ue?.cliAutoApproveComplete===!0),ue.pending||[]},5e3,{enabled:H,cacheKey:"/api/devices"}),se=K.data||[];L(()=>{o&&(E.refresh(),H&&K.refresh())},[K.refresh,o,s,E.refresh,$,H]),L(()=>{if(!r||!o)return;s(),E.refresh(),H&&K.refresh();let ue=setTimeout(()=>{s(),E.refresh(),H&&K.refresh()},1200),be=setTimeout(()=>{s(),E.refresh(),H&&K.refresh()},3500);return()=>{clearTimeout(ue),clearTimeout(be)}},[K.refresh,o,s,E.refresh,r,$,H]),L(()=>{M&&(u(M.enabled!==!1),f(M.schedule||Ac),x(M.enabled===!1?"disabled":M.schedule||Ac))},[M?.enabled,M?.schedule]),L(()=>()=>{_.current&&clearTimeout(_.current)},[]);let Y=()=>{v(!0),_.current&&clearTimeout(_.current),_.current=setTimeout(()=>{v(!1),_.current=null},2800),s(),E.refresh(),setTimeout(()=>{s(),E.refresh()},700),setTimeout(()=>{s(),E.refresh()},1800)},j=async({enabled:ue=d,schedule:be=p}={})=>{if(!g){m(!0);try{let V=await vm({enabled:ue,schedule:be});if(!V.ok)throw new Error(V.error||"Could not save sync settings");I("Sync schedule updated","success"),s()}catch(V){I(V.message||"Could not save sync settings","error")}finally{m(!1)}}};return{state:{channels:z,dashboardLoading:i,devicePending:se,doctorStatus:D,gatewayStatus:N,hasUnpaired:B,openclawVersion:R,pending:U,pairingStatusRefreshing:b,repairingWatchdog:l,repo:O,savingSyncCron:g,syncCron:M,syncCronChoice:h,syncCronEnabled:d,syncCronSchedule:p,syncCronStatusText:d?"Enabled":"Disabled",watchdogStatus:A},actions:{handleApprove:async(ue,be,V="")=>{await Ao(ue,be,V),Y()},handleDeviceApprove:async ue=>{await $a(ue),setTimeout(K.refresh,500),setTimeout(K.refresh,2e3)},handleDeviceReject:async ue=>{await wa(ue),setTimeout(K.refresh,500),setTimeout(K.refresh,2e3)},handleOpenDashboard:async()=>{if(!i){w(!0),a(!0);try{let ue=await mm();console.log("[dashboard] response:",JSON.stringify(ue)),window.open(ue.url||"/openclaw","_blank")}catch(ue){console.error("[dashboard] error:",ue),window.open("/openclaw","_blank")}finally{a(!1)}}},handleReject:async(ue,be,V="")=>{try{await Mo(ue,be,V),Y()}catch(q){I(q.message||"Could not reject pairing","error")}},handleSyncCronChoiceChange:async ue=>{x(ue);let be=ue!=="disabled",V=be?ue:p;u(be),f(V),await j({enabled:be,schedule:V})},handleWatchdogRepair:async()=>{if(!l){c(!0);try{let ue=await xa();if(!ue.ok)throw new Error(ue.error||"Repair failed");I("Repair triggered","success"),setTimeout(()=>{s()},800)}catch(ue){I(ue.message||"Could not run repair","error")}finally{c(!1)}}}}}};var Sr=P.bind(T),Z3=()=>{typeof window>"u"||window.dispatchEvent(new CustomEvent("alphaclaw:open-whatsapp-qr"))},q0=({statusData:t=null,watchdogData:e=null,doctorStatusData:n=null,agents:s=[],doctorWarningDismissedUntilMs:o=0,onRefreshStatuses:r=()=>{},onSwitchTab:i=()=>{},onNavigate:a=()=>{},onOpenGmailWebhook:l=()=>{},isActive:c=!1,restartingGateway:d=!1,onRestartGateway:u=()=>{},restartSignal:p=0,openclawUpdateInProgress:f=!1,onOpenclawVersionActionComplete:g=()=>{},onOpenclawUpdate:m=()=>{},onRestartRequired:h=()=>{},onDismissDoctorWarning:x=()=>{}})=>{let{state:b,actions:v}=G0({statusData:t,watchdogData:e,doctorStatusData:n,onRefreshStatuses:r,isActive:c,restartSignal:p}),$=b.channels?.whatsapp||null,w=$?.accounts&&typeof $.accounts=="object"?$.accounts:{},S=Object.keys(w).length>0?Object.values(w).some(_=>_&&_.status!=="paired"):String($?.status||"").trim()==="configured",C=b.hasUnpaired&&!b.pairingStatusRefreshing&&Array.isArray(b.pending)&&b.pending.length===0&&S;return Sr`
- <${bc} - status=${x.gatewayStatus} - openclawVersion=${x.openclawVersion} + <${$c} + status=${b.gatewayStatus} + openclawVersion=${b.openclawVersion} restarting=${d} onRestart=${u} - watchdogStatus=${x.watchdogStatus} + watchdogStatus=${b.watchdogStatus} onOpenWatchdog=${()=>i("watchdog")} onRepair=${v.handleWatchdogRepair} - repairing=${x.repairingWatchdog} + repairing=${b.repairingWatchdog} openclawUpdateInProgress=${f} onOpenclawVersionActionComplete=${g} onOpenclawUpdate=${m} /> - <${Bw} - doctorStatus=${x.doctorStatus} + <${K0} + doctorStatus=${b.doctorStatus} dismissedUntilMs=${o} onOpenDoctor=${()=>i("doctor")} - onDismiss=${b} + onDismiss=${x} /> - <${nl} - channelsSection=${Sc` - <${Cb} - channels=${x.channels} + <${il} + channelsSection=${Sr` + <${Eb} + channels=${b.channels} agents=${s} onNavigate=${a} onRefreshStatuses=${r} + onRestartGateway=${u} /> `} - pairingsSection=${Sc` - <${tl} - pending=${x.pending} - channels=${x.channels} - visible=${x.hasUnpaired} - statusRefreshing=${x.pairingStatusRefreshing} - onApprove=${v.handleApprove} - onReject=${v.handleReject} - /> + pairingsSection=${Sr` + ${C?Sr` +
+

Pending Pairings

+
+ +

WhatsApp needs to be linked

+

Scan the QR code to finish pairing this channel.

+ <${Z} + onClick=${Z3} + tone="primary" + size="sm" + idleLabel="Open QR Code" + /> +
+
+ `:Sr` + <${rl} + pending=${b.pending} + channels=${b.channels} + visible=${b.hasUnpaired} + statusRefreshing=${b.pairingStatusRefreshing} + onApprove=${v.handleApprove} + onReject=${v.handleReject} + /> + `} `} /> - <${Ow} onSwitchTab=${i} /> - <${Nw} - gatewayStatus=${x.gatewayStatus} + <${U0} onSwitchTab=${i} /> + <${z0} + gatewayStatus=${b.gatewayStatus} onRestartRequired=${h} onOpenGmailWebhook=${l} /> - ${x.repo&&Sc` + ${b.repo&&Sr`
@@ -7320,28 +7426,28 @@ ${B?.grantPublisher||""}`.trim()))} /> ${x.repo}${b.repo}
Auto-sync
- <${Ca} + <${Ta} className="pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-fg-muted" />
@@ -7357,22 +7463,22 @@ ${B?.grantPublisher||""}`.trim()))}
<${tn} onClick=${v.handleOpenDashboard} - loading=${x.dashboardLoading} + loading=${b.dashboardLoading} warning=${!1} idleLabel="Open" loadingLabel="Opening..." />
- <${xc} - pending=${x.devicePending} + <${wc} + pending=${b.devicePending} onApprove=${v.handleDeviceApprove} onReject=${v.handleDeviceReject} />
- `};var F3=P.bind(T),ff=({statusData:t=null,watchdogData:e=null,doctorStatusData:n=null,agents:s=[],doctorWarningDismissedUntilMs:o=0,onRefreshStatuses:r=()=>{},onSetLocation:i=()=>{},onNavigate:a=()=>{},restartingGateway:l=!1,onRestartGateway:c=()=>{},restartSignal:d=0,openclawUpdateInProgress:u=!1,onOpenclawVersionActionComplete:p=()=>{},onOpenclawUpdate:f=()=>{},onRestartRequired:g=()=>{},onDismissDoctorWarning:m=()=>{}})=>F3` + `};var Y3=P.bind(T),mf=({statusData:t=null,watchdogData:e=null,doctorStatusData:n=null,agents:s=[],doctorWarningDismissedUntilMs:o=0,onRefreshStatuses:r=()=>{},onSetLocation:i=()=>{},onNavigate:a=()=>{},restartingGateway:l=!1,onRestartGateway:c=()=>{},restartSignal:d=0,openclawUpdateInProgress:u=!1,onOpenclawVersionActionComplete:p=()=>{},onOpenclawUpdate:f=()=>{},onRestartRequired:g=()=>{},onDismissDoctorWarning:m=()=>{}})=>Y3`
- <${Hw} + <${q0} statusData=${t} watchdogData=${e} doctorStatusData=${n} @@ -7393,13 +7499,13 @@ ${B?.grantPublisher||""}`.trim()))} onDismissDoctorWarning=${m} />
-`;var Nt=P.bind(T),H3={anthropic:{label:"Anthropic",modes:[{id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"sk-ant-api03-...",url:"https://console.anthropic.com",field:"key"},{id:"token",label:"Setup Token",profileSuffix:"manual",placeholder:"sk-ant-oat01-...",hint:"From claude setup-token (uses your Claude subscription)",field:"token"}]},openai:{label:"OpenAI",modes:[{id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"sk-...",url:"https://platform.openai.com",field:"key"}]},"openai-codex":{label:"OpenAI Codex",modes:[{id:"oauth",label:"Codex OAuth",isCodexOauth:!0}]},google:{label:"Gemini",modes:[{id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"AI...",url:"https://aistudio.google.com",field:"key"}]}},W3={id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"...",field:"key"},V3=t=>{let e=Mn[t]||[];return e.length===0?[W3]:e.map(n=>({id:"api_key",label:n.label||"API Key",profileSuffix:"default",placeholder:n.placeholder||"...",hint:n.hint,url:n.url,field:"key"}))},j3=t=>H3[t]||{label:zs[t]||t,modes:V3(t)},zi=(t,e)=>`${t.provider||e}:${t.profileSuffix||"default"}`,Cc=t=>String(t?.key||t?.token||t?.access||"").trim(),z3=({codexStatus:t,onRefreshCodex:e})=>{let[n,s]=y(!1),[o,r]=y(!1),[i,a]=y(""),[l,c]=y(!1),d=ee(null);L(()=>()=>{d.current&&clearInterval(d.current)},[]),L(()=>{let g=async m=>{m.data?.codex==="success"?(N("Codex connected","success"),s(!1),r(!1),await e()):m.data?.codex==="error"&&N(`Codex auth failed: ${m.data.message||"unknown error"}`,"error")};return window.addEventListener("message",g),()=>window.removeEventListener("message",g)},[e]);let u=()=>{s(!0),r(!0);let g=window.open("/auth/codex/start","codex-auth","popup=yes,width=640,height=780");if(!g||g.closed){r(!1),window.location.href="/auth/codex/start";return}d.current&&clearInterval(d.current),d.current=setInterval(()=>{g.closed&&(clearInterval(d.current),d.current=null,r(!1))},500)},p=async()=>{if(!(!i.trim()||l)){c(!0);try{let g=await Wr(i.trim());if(!g.ok)throw new Error(g.error||"Codex OAuth exchange failed");a(""),N("Codex connected","success"),s(!1),r(!1),await e()}catch(g){N(g.message||"Codex OAuth exchange failed","error")}finally{c(!1)}}},f=async()=>{let g=await Hr();if(!g.ok){N(g.error||"Failed to disconnect Codex","error");return}N("Codex disconnected","success"),s(!1),r(!1),a(""),await e()};return Nt` +`;var Ot=P.bind(T),X3={anthropic:{label:"Anthropic",modes:[{id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"sk-ant-api03-...",url:"https://console.anthropic.com",field:"key"},{id:"token",label:"Setup Token",profileSuffix:"manual",placeholder:"sk-ant-oat01-...",hint:"From claude setup-token (uses your Claude subscription)",field:"token"}]},openai:{label:"OpenAI",modes:[{id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"sk-...",url:"https://platform.openai.com",field:"key"}]},"openai-codex":{label:"OpenAI Codex",modes:[{id:"oauth",label:"Codex OAuth",isCodexOauth:!0}]},google:{label:"Gemini",modes:[{id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"AI...",url:"https://aistudio.google.com",field:"key"}]}},Q3={id:"api_key",label:"API Key",profileSuffix:"default",placeholder:"...",field:"key"},eR=t=>{let e=An[t]||[];return e.length===0?[Q3]:e.map(n=>({id:"api_key",label:n.label||"API Key",profileSuffix:"default",placeholder:n.placeholder||"...",hint:n.hint,url:n.url,field:"key"}))},tR=t=>X3[t]||{label:qs[t]||t,modes:eR(t)},Gi=(t,e)=>`${t.provider||e}:${t.profileSuffix||"default"}`,Mc=t=>String(t?.key||t?.token||t?.access||"").trim(),nR=({codexStatus:t,onRefreshCodex:e})=>{let[n,s]=y(!1),[o,r]=y(!1),[i,a]=y(""),[l,c]=y(!1),d=te(null);L(()=>()=>{d.current&&clearInterval(d.current)},[]),L(()=>{let g=async m=>{m.data?.codex==="success"?(I("Codex connected","success"),s(!1),r(!1),await e()):m.data?.codex==="error"&&I(`Codex auth failed: ${m.data.message||"unknown error"}`,"error")};return window.addEventListener("message",g),()=>window.removeEventListener("message",g)},[e]);let u=()=>{s(!0),r(!0);let g=window.open("/auth/codex/start","codex-auth","popup=yes,width=640,height=780");if(!g||g.closed){r(!1),window.location.href="/auth/codex/start";return}d.current&&clearInterval(d.current),d.current=setInterval(()=>{g.closed&&(clearInterval(d.current),d.current=null,r(!1))},500)},p=async()=>{if(!(!i.trim()||l)){c(!0);try{let g=await zr(i.trim());if(!g.ok)throw new Error(g.error||"Codex OAuth exchange failed");a(""),I("Codex connected","success"),s(!1),r(!1),await e()}catch(g){I(g.message||"Codex OAuth exchange failed","error")}finally{c(!1)}}},f=async()=>{let g=await jr();if(!g.ok){I(g.error||"Failed to disconnect Codex","error");return}I("Codex disconnected","success"),s(!1),r(!1),a(""),await e()};return Ot`
Codex OAuth - ${t.connected?Nt`<${ae} tone="success">Connected`:Nt`<${ae} tone="warning">Not connected`} + ${t.connected?Ot`<${de} tone="success">Connected`:Ot`<${de} tone="warning">Not connected`}
- ${t.connected?Nt` + ${t.connected?Ot`
- `:n?Nt` + `:n?Ot`

${o?"Complete login in the popup, then paste the redirect URL.":"Paste the redirect URL from your browser to finish connecting."} @@ -7426,7 +7532,7 @@ ${B?.grantPublisher||""}`.trim()))} Restart

- `:Nt` + `:Ot`
- `},Ww=({provider:t,authProfiles:e,authOrder:n,codexStatus:s,onEditProfile:o,onEditAuthOrder:r,getProfileValue:i,getEffectiveOrder:a,onRefreshCodex:l})=>{let c=j3(t),d=c.modes.filter($=>!$.isCodexOauth),u=d.length>1,p=c.modes.some($=>$.isCodexOauth),f=a(t),g=f?.[0]||null,m=n[t]||null,h=d.some($=>{let S=zi($,t),C=e.find(k=>k.id===S)||null,_=i(S);return Cc(_)!==Cc(C)}),b=JSON.stringify(f||null)!==JSON.stringify(m),x=h||b,v=d.some($=>{let S=zi($,t),C=i(S);return!!(C?.key||C?.token||C?.access)})||t==="openai-codex"&&!!s?.connected,w=$=>{let S=zi($,t),C=d.map(k=>zi(k,t)),_=[S,...C.filter(k=>k!==S)];r(t,_)};return Nt` + `},J0=({provider:t,authProfiles:e,authOrder:n,codexStatus:s,onEditProfile:o,onEditAuthOrder:r,getProfileValue:i,getEffectiveOrder:a,onRefreshCodex:l})=>{let c=tR(t),d=c.modes.filter(w=>!w.isCodexOauth),u=d.length>1,p=c.modes.some(w=>w.isCodexOauth),f=a(t),g=f?.[0]||null,m=n[t]||null,h=d.some(w=>{let S=Gi(w,t),C=e.find(k=>k.id===S)||null,_=i(S);return Mc(_)!==Mc(C)}),x=JSON.stringify(f||null)!==JSON.stringify(m),b=h||x,v=d.some(w=>{let S=Gi(w,t),C=i(S);return!!(C?.key||C?.token||C?.access)})||t==="openai-codex"&&!!s?.connected,$=w=>{let S=Gi(w,t),C=d.map(k=>Gi(k,t)),_=[S,...C.filter(k=>k!==S)];r(t,_)};return Ot`

${c.label}

- ${p&&d.length===0?null:x?Nt`<${ae} tone="warning">Unsaved`:v?Nt`<${ae} tone="success">Connected`:Nt`<${ae} tone="warning">Not configured`} + ${p&&d.length===0?null:b?Ot`<${de} tone="warning">Unsaved`:v?Ot`<${de} tone="success">Connected`:Ot`<${de} tone="warning">Not configured`}
- ${d.map($=>{let S=zi($,t),C=$.provider||t,_=i(S),k=_?.[$.field]||"",A=!u||g===S||!g&&$===d[0];return Nt` + ${d.map(w=>{let S=Gi(w,t),C=w.provider||t,_=i(S),k=_?.[w.field]||"",A=!u||g===S||!g&&w===d[0];return Ot`
${w.label} - ${u&&A?Nt`<${ae} tone="cyan">Primary`:null} - ${u&&!A&&k?Nt``:null} - ${$.url&&!k?Nt`Get`:null}
- <${Rt} + <${Et} value=${k} - onInput=${O=>{let D=O.target.value,z={type:$.id,provider:C,[$.field]:D};_?.expires&&(z.expires=_.expires),o(S,z);let E=e.find(R=>R.id===S)||null;Cc(z)===Cc(E)&&u?r(t,m):u&&D&&!A&&w($)}} - placeholder=${$.placeholder||""} + onInput=${D=>{let N=D.target.value,z={type:w.id,provider:C,[w.field]:N};_?.expires&&(z.expires=_.expires),o(S,z);let O=e.find(R=>R.id===S)||null;Mc(z)===Mc(O)&&u?r(t,m):u&&N&&!A&&$(w)}} + placeholder=${w.placeholder||""} isSecret=${!0} inputClass="flex-1 w-full bg-field border border-border rounded-lg px-3 py-2 text-sm text-body outline-none focus:border-fg-muted font-mono" /> - ${$.hint?Nt`

${$.hint}

`:null} + ${w.hint?Ot`

${w.hint}

`:null}
`})} - ${c.modes.some($=>$.isCodexOauth)?Nt` + ${c.modes.some(w=>w.isCodexOauth)?Ot`
- <${z3} + <${nR} codexStatus=${s} onRefreshCodex=${l} />
`:null}
- `};var Mt=P.bind(T),U3=t=>{let e=new Set;for(let n of Object.keys(t)){let s=ri(n);s&&e.add(s)}return[...e]},K3=["anthropic","openai","openai-codex",...jr.filter(t=>!["anthropic","openai"].includes(t))],Vw=({onRestartRequired:t=()=>{},agentId:e,embedded:n=!1})=>{let{catalog:s,primary:o,configuredModels:r,authProfiles:i,authOrder:a,codexStatus:l,loading:c,saving:d,ready:u,error:p,isDirty:f,addModel:g,removeModel:m,setPrimaryModel:h,editProfile:b,editAuthOrder:x,getProfileValue:v,getEffectiveOrder:w,cancelChanges:$,saveAll:S,refreshCodexStatus:C}=rl(e),_=F(()=>new Set(Object.keys(r)),[r]),k=F(()=>Lo(s),[s]),A=F(()=>k.filter(I=>!_.has(I.key)),[k,_]),O=F(()=>[...s].filter(I=>!_.has(I.key)).sort((I,U)=>{let W=jo(vs(I))-jo(vs(U));return W!==0?W:String(I.label||I.key).localeCompare(String(U.label||U.key))}),[s,_]),D=F(()=>U3(r),[r]),z=F(()=>{let I=[];for(let U of K3)D.includes(U)&&I.push(U);for(let U of D)I.includes(U)||I.push(U);return I},[D]),E=F(()=>sl({authProfiles:i,codexStatus:l}),[i,l]),M=F(()=>Object.keys(r).map(I=>{let U=s.find(se=>se.key===I),W=ri(I),G=!!E[W];return{key:I,label:U?.label||I,isPrimary:I===o,hasAuth:G}}),[r,s,o,E]),R=Mt` - <${Qn} visible=${f}> + `};var Tt=P.bind(T),sR=t=>{let e=new Set;for(let n of Object.keys(t)){let s=li(n);s&&e.add(s)}return[...e]},oR=["anthropic","openai","openai-codex",...Kr.filter(t=>!["anthropic","openai"].includes(t))],Z0=({onRestartRequired:t=()=>{},agentId:e,embedded:n=!1})=>{let{catalog:s,primary:o,configuredModels:r,authProfiles:i,authOrder:a,codexStatus:l,loading:c,saving:d,ready:u,error:p,isDirty:f,addModel:g,removeModel:m,setPrimaryModel:h,editProfile:x,editAuthOrder:b,getProfileValue:v,getEffectiveOrder:$,cancelChanges:w,saveAll:S,refreshCodexStatus:C}=cl(e),_=F(()=>new Set(Object.keys(r)),[r]),k=F(()=>Eo(s),[s]),A=F(()=>k.filter(E=>!_.has(E.key)),[k,_]),D=F(()=>[...s].filter(E=>!_.has(E.key)).sort((E,U)=>{let H=jo(Ss(E))-jo(Ss(U));return H!==0?H:String(E.label||E.key).localeCompare(String(U.label||U.key))}),[s,_]),N=F(()=>sR(r),[r]),z=F(()=>{let E=[];for(let U of oR)N.includes(U)&&E.push(U);for(let U of N)E.includes(U)||E.push(U);return E},[N]),O=F(()=>al({authProfiles:i,codexStatus:l}),[i,l]),M=F(()=>Object.keys(r).map(E=>{let U=s.find(se=>se.key===E),H=li(E),K=!!O[H];return{key:E,label:U?.label||E,isPrimary:E===o,hasAuth:K}}),[r,s,o,O]),R=Tt` + <${ns} visible=${f}> <${Z} - onClick=${$} + onClick=${w} disabled=${d} tone="secondary" size="sm" @@ -7527,48 +7633,48 @@ ${B?.grantPublisher||""}`.trim()))} loadingLabel="Saving…" className="text-xs" /> - - `;if(!u){let I=Mt` + + `;if(!u){let E=Tt`
- <${Ce} className="h-4 w-4" /> + <${Ae} className="h-4 w-4" /> Loading model settings...
- `;return n?I:Mt` - <${zn} - header=${Mt`<${Ne} title="Models" />`} + `;return n?E:Tt` + <${Un} + header=${Tt`<${De} title="Models" />`} > - ${I} - - `}let B=Mt` + ${E} + + `}let B=Tt`

Available Models

- ${M.length===0?Mt`

+ ${M.length===0?Tt`

No models configured. Add a model below. -

`:Mt` +

`:Tt`
- ${M.map(I=>Mt` + ${M.map(E=>Tt`
${I.label}${E.label} - ${I.isPrimary?Mt`<${ae} tone="cyan">Primary`:I.hasAuth?Mt` + ${E.isPrimary?Tt`<${de} tone="cyan">Primary`:E.hasAuth?Tt` - `:Mt`<${ae} tone="warning">Needs auth`} + `:Tt`<${de} tone="warning">Needs auth`}
- ${z.length>0?Mt` + ${z.length>0?Tt`

Provider Authentication

- ${z.map(I=>Mt` - <${Ww} - provider=${I} + ${z.map(E=>Tt` + <${J0} + provider=${E} authProfiles=${i} authOrder=${a} codexStatus=${l} - onEditProfile=${b} - onEditAuthOrder=${x} + onEditProfile=${x} + onEditAuthOrder=${b} getProfileValue=${v} - getEffectiveOrder=${w} + getEffectiveOrder=${$} onRefreshCodex=${C} /> `)}
`:null} - `;return n?Mt` + `;return n?Tt`
${R}
${B}
- `:Mt` - <${zn} - header=${Mt`<${Ne} title="Models" actions=${R} />`} + `:Tt` + <${Un} + header=${Tt`<${De} title="Models" actions=${R} />`} > ${B} - - `};var G3=P.bind(T),hf=({onRestartRequired:t=()=>{}})=>G3` - <${Vw} onRestartRequired=${t} /> -`;var q3=1e4,jw=({enabled:t=!0}={})=>{let e=Re(async()=>{let n=await Pm(),s=Array.isArray(n?.nodes)?n.nodes:[],o=Array.isArray(n?.pending)?n.pending:[];return{nodes:s,pending:o}},q3,{enabled:t,cacheKey:"/api/nodes"});return{nodes:Array.isArray(e.data?.nodes)?e.data.nodes:[],pending:Array.isArray(e.data?.pending)?e.data.pending:[],loading:e.data===null&&!e.error,error:e.error?String(e.error.message||"Could not load nodes"):"",refresh:e.refresh}};var zw=()=>{let t=jw({enabled:!0}),[e,n]=y(!1),[s,o]=y(!1),{data:r,error:i}=ct("/api/nodes/connect-info",ya,{maxAgeMs:6e4}),a=Array.isArray(t.nodes)?t.nodes.filter(c=>c?.paired!==!1):[];L(()=>{i&&N(i.message||"Could not load node connect command","error")},[i]);let l=q(async()=>{if(!s){o(!0);try{await t.refresh()}finally{o(!1)}}},[t.refresh,s]);return{state:{wizardVisible:e,nodes:a,pending:t.pending,loadingNodes:t.loading,refreshingNodes:s,nodesError:t.error,connectInfo:r},actions:{openWizard:()=>n(!0),closeWizard:()=>n(!1),refreshNodes:l}}};var J3=35e3,Z3=1e4,Kw="nodesBrowserAttachStateByNode",Y3=/selected page has been closed/i,X3=async(t,e=J3)=>{let n=null;try{return await Promise.race([t,new Promise((s,o)=>{n=setTimeout(()=>{o(new Error("Browser check timed out"))},e)})])}finally{n&&clearTimeout(n)}},Uw=t=>{let e=Array.isArray(t?.caps)?t.caps:[],n=Array.isArray(t?.commands)?t.commands:[];return e.includes("browser")||n.includes("browser.proxy")},Q3=t=>{let e=String(t?.message||"Could not check node browser status").trim();return Y3.test(e)?"Selected Chrome page was closed. Click Attach to reconnect.":e},eR=()=>{let e=Fe()?.[Kw];return!e||typeof e!="object"||Array.isArray(e)?{}:e},tR=(t={})=>{vx(e=>({...e&&typeof e=="object"?e:{},[Kw]:t&&typeof t=="object"?t:{}}))},Gw=({nodes:t=[],onRefreshNodes:e=async()=>{}}={})=>{let[n,s]=y({}),[o,r]=y({}),[i,a]=y(""),[l,c]=y(()=>eR()),[d,u]=y(""),[p,f]=y(null),[g,m]=y(""),h=ee(0),b=ee(""),x=async(k,{successMessage:A="Connection command copied",errorMessage:O="Could not copy connection command"}={})=>{if(await Ho(k)){N(A,"success");return}N(O,"error")},v=q(async(k,{silent:A=!1}={})=>{let O=String(k||"").trim();if(!(!O||b.current)){b.current=O,A||a(O),r(D=>({...D,[O]:""}));try{let D=await X3(Em(O,"user")),z=D?.status&&typeof D.status=="object"?D.status:null;s(E=>({...E,[O]:z}))}catch(D){let z=Q3(D);s(E=>({...E,[O]:null})),r(E=>({...E,[O]:z})),A||N(z,"error")}finally{b.current="",A||a("")}}},[]),w=q((k,A)=>{let O=String(k||"").trim();O&&c(D=>{let z={...D&&typeof D=="object"?D:{},[O]:A===!0};return tR(z),z})},[]),$=q(async k=>{let A=String(k||"").trim();A&&(w(A,!0),await v(A))},[v,w]),S=q(k=>{let A=String(k||"").trim();A&&(w(A,!1),s(O=>{let D={...O||{}};return delete D[A],D}),r(O=>{let D={...O||{}};return delete D[A],D}))},[w]),C=q(k=>{let A=String(k||"").trim();A&&u(O=>O===A?"":A)},[]),_=q(async()=>{let k=String(p?.nodeId||"").trim();if(!(!k||g)){m(k);try{await Rm(k),S(k),N("Device removed","success"),f(null),u(""),await e()}catch(A){N(A.message||"Could not remove node","error")}finally{m("")}}},[S,e,p,g]);return L(()=>{if(i)return;let k=t.map(A=>({nodeId:String(A?.nodeId||"").trim(),connected:A?.connected===!0,browserCapable:Uw(A)})).find(A=>!(!A.nodeId||!A.connected||!A.browserCapable||l?.[A.nodeId]!==!0||n?.[A.nodeId]||o?.[A.nodeId]))?.nodeId;k&&v(k,{silent:!0})},[l,o,n,i,v,t]),L(()=>{if(i)return;let k=t.map(z=>({nodeId:String(z?.nodeId||"").trim(),connected:z?.connected===!0,browserCapable:Uw(z),browserRunning:n?.[String(z?.nodeId||"").trim()]?.running===!0})).filter(z=>z.nodeId&&z.connected&&z.browserCapable&&l?.[z.nodeId]===!0&&z.browserRunning).map(z=>z.nodeId);if(!k.length)return;let A=!0,D=setInterval(async()=>{if(!A||b.current)return;let z=h.current%k.length;h.current+=1;let E=k[z];await v(E,{silent:!0})},Z3);return()=>{A=!1,clearInterval(D)}},[l,n,i,v,t]),{browserStatusByNodeId:n,browserErrorByNodeId:o,checkingBrowserNodeId:i,browserAttachStateByNodeId:l,menuOpenNodeId:d,removeDialogNode:p,removingNodeId:g,handleCopyText:x,handleCheckNodeBrowser:v,handleAttachNodeBrowser:$,handleDetachNodeBrowser:S,handleOpenNodeMenu:C,handleRemoveNode:_,setMenuOpenNodeId:u,setRemoveDialogNode:f}};var ot=P.bind(T),nR=t=>String(t||"").replace(/"/g,'\\"'),qw=({node:t,connectInfo:e,maskToken:n=!1})=>{let s=String(e?.gatewayHost||"").trim()||"localhost",o=Number(e?.gatewayPort)||3e3,r=String(e?.gatewayToken||"").trim(),i=e?.tls===!0?"--tls":"",a=String(t?.displayName||t?.nodeId||"My Node").trim(),l=n?"****":r;return[l?`OPENCLAW_GATEWAY_TOKEN=${l}`:"","openclaw node run",`--host ${s}`,`--port ${o}`,i,`--display-name "${nR(a)}"`].filter(Boolean).join(" ")},sR=t=>t?.connected?ot`<${ae} tone="success">Connected`:t?.paired?ot`<${ae} tone="warning">Disconnected`:ot`<${ae} tone="danger">Pending approval`,oR=t=>{let e=Array.isArray(t?.caps)?t.caps:[],n=Array.isArray(t?.commands)?t.commands:[];return e.includes("browser")||n.includes("browser.proxy")},rR=t=>t.running?"success":"warning",iR=t=>t.running?"Attached":"Not connected",Jw=({nodes:t=[],pending:e=[],loading:n=!1,error:s="",connectInfo:o=null,onRefreshNodes:r=async()=>{}})=>{let i=Gw({nodes:t,onRefreshNodes:r}),{browserStatusByNodeId:a,browserErrorByNodeId:l,checkingBrowserNodeId:c,browserAttachStateByNodeId:d,menuOpenNodeId:u,removeDialogNode:p,removingNodeId:f,handleCopyText:g,handleCheckNodeBrowser:m,handleAttachNodeBrowser:h,handleDetachNodeBrowser:b,handleOpenNodeMenu:x,handleRemoveNode:v,setMenuOpenNodeId:w,setRemoveDialogNode:$}=i;return ot` + + `};var rR=P.bind(T),gf=({onRestartRequired:t=()=>{}})=>rR` + <${Z0} onRestartRequired=${t} /> +`;var iR=1e4,Y0=({enabled:t=!0}={})=>{let e=Re(async()=>{let n=await Rm(),s=Array.isArray(n?.nodes)?n.nodes:[],o=Array.isArray(n?.pending)?n.pending:[];return{nodes:s,pending:o}},iR,{enabled:t,cacheKey:"/api/nodes"});return{nodes:Array.isArray(e.data?.nodes)?e.data.nodes:[],pending:Array.isArray(e.data?.pending)?e.data.pending:[],loading:e.data===null&&!e.error,error:e.error?String(e.error.message||"Could not load nodes"):"",refresh:e.refresh}};var X0=()=>{let t=Y0({enabled:!0}),[e,n]=y(!1),[s,o]=y(!1),{data:r,error:i}=pt("/api/nodes/connect-info",ka,{maxAgeMs:6e4}),a=Array.isArray(t.nodes)?t.nodes.filter(c=>c?.paired!==!1):[];L(()=>{i&&I(i.message||"Could not load node connect command","error")},[i]);let l=G(async()=>{if(!s){o(!0);try{await t.refresh()}finally{o(!1)}}},[t.refresh,s]);return{state:{wizardVisible:e,nodes:a,pending:t.pending,loadingNodes:t.loading,refreshingNodes:s,nodesError:t.error,connectInfo:r},actions:{openWizard:()=>n(!0),closeWizard:()=>n(!1),refreshNodes:l}}};var aR=35e3,lR=1e4,e1="nodesBrowserAttachStateByNode",cR=/selected page has been closed/i,dR=async(t,e=aR)=>{let n=null;try{return await Promise.race([t,new Promise((s,o)=>{n=setTimeout(()=>{o(new Error("Browser check timed out"))},e)})])}finally{n&&clearTimeout(n)}},Q0=t=>{let e=Array.isArray(t?.caps)?t.caps:[],n=Array.isArray(t?.commands)?t.commands:[];return e.includes("browser")||n.includes("browser.proxy")},uR=t=>{let e=String(t?.message||"Could not check node browser status").trim();return cR.test(e)?"Selected Chrome page was closed. Click Attach to reconnect.":e},pR=()=>{let e=je()?.[e1];return!e||typeof e!="object"||Array.isArray(e)?{}:e},fR=(t={})=>{Mx(e=>({...e&&typeof e=="object"?e:{},[e1]:t&&typeof t=="object"?t:{}}))},t1=({nodes:t=[],onRefreshNodes:e=async()=>{}}={})=>{let[n,s]=y({}),[o,r]=y({}),[i,a]=y(""),[l,c]=y(()=>pR()),[d,u]=y(""),[p,f]=y(null),[g,m]=y(""),h=te(0),x=te(""),b=async(k,{successMessage:A="Connection command copied",errorMessage:D="Could not copy connection command"}={})=>{if(await ws(k)){I(A,"success");return}I(D,"error")},v=G(async(k,{silent:A=!1}={})=>{let D=String(k||"").trim();if(!(!D||x.current)){x.current=D,A||a(D),r(N=>({...N,[D]:""}));try{let N=await dR(Im(D,"user")),z=N?.status&&typeof N.status=="object"?N.status:null;s(O=>({...O,[D]:z}))}catch(N){let z=uR(N);s(O=>({...O,[D]:null})),r(O=>({...O,[D]:z})),A||I(z,"error")}finally{x.current="",A||a("")}}},[]),$=G((k,A)=>{let D=String(k||"").trim();D&&c(N=>{let z={...N&&typeof N=="object"?N:{},[D]:A===!0};return fR(z),z})},[]),w=G(async k=>{let A=String(k||"").trim();A&&($(A,!0),await v(A))},[v,$]),S=G(k=>{let A=String(k||"").trim();A&&($(A,!1),s(D=>{let N={...D||{}};return delete N[A],N}),r(D=>{let N={...D||{}};return delete N[A],N}))},[$]),C=G(k=>{let A=String(k||"").trim();A&&u(D=>D===A?"":A)},[]),_=G(async()=>{let k=String(p?.nodeId||"").trim();if(!(!k||g)){m(k);try{await Lm(k),S(k),I("Device removed","success"),f(null),u(""),await e()}catch(A){I(A.message||"Could not remove node","error")}finally{m("")}}},[S,e,p,g]);return L(()=>{if(i)return;let k=t.map(A=>({nodeId:String(A?.nodeId||"").trim(),connected:A?.connected===!0,browserCapable:Q0(A)})).find(A=>!(!A.nodeId||!A.connected||!A.browserCapable||l?.[A.nodeId]!==!0||n?.[A.nodeId]||o?.[A.nodeId]))?.nodeId;k&&v(k,{silent:!0})},[l,o,n,i,v,t]),L(()=>{if(i)return;let k=t.map(z=>({nodeId:String(z?.nodeId||"").trim(),connected:z?.connected===!0,browserCapable:Q0(z),browserRunning:n?.[String(z?.nodeId||"").trim()]?.running===!0})).filter(z=>z.nodeId&&z.connected&&z.browserCapable&&l?.[z.nodeId]===!0&&z.browserRunning).map(z=>z.nodeId);if(!k.length)return;let A=!0,N=setInterval(async()=>{if(!A||x.current)return;let z=h.current%k.length;h.current+=1;let O=k[z];await v(O,{silent:!0})},lR);return()=>{A=!1,clearInterval(N)}},[l,n,i,v,t]),{browserStatusByNodeId:n,browserErrorByNodeId:o,checkingBrowserNodeId:i,browserAttachStateByNodeId:l,menuOpenNodeId:d,removeDialogNode:p,removingNodeId:g,handleCopyText:b,handleCheckNodeBrowser:v,handleAttachNodeBrowser:w,handleDetachNodeBrowser:S,handleOpenNodeMenu:C,handleRemoveNode:_,setMenuOpenNodeId:u,setRemoveDialogNode:f}};var it=P.bind(T),hR=t=>String(t||"").replace(/"/g,'\\"'),n1=({node:t,connectInfo:e,maskToken:n=!1})=>{let s=String(e?.gatewayHost||"").trim()||"localhost",o=Number(e?.gatewayPort)||3e3,r=String(e?.gatewayToken||"").trim(),i=e?.tls===!0?"--tls":"",a=String(t?.displayName||t?.nodeId||"My Node").trim(),l=n?"****":r;return[l?`OPENCLAW_GATEWAY_TOKEN=${l}`:"","openclaw node run",`--host ${s}`,`--port ${o}`,i,`--display-name "${hR(a)}"`].filter(Boolean).join(" ")},mR=t=>t?.connected?it`<${de} tone="success">Connected`:t?.paired?it`<${de} tone="warning">Disconnected`:it`<${de} tone="danger">Pending approval`,gR=t=>{let e=Array.isArray(t?.caps)?t.caps:[],n=Array.isArray(t?.commands)?t.commands:[];return e.includes("browser")||n.includes("browser.proxy")},bR=t=>t.running?"success":"warning",xR=t=>t.running?"Attached":"Not connected",s1=({nodes:t=[],pending:e=[],loading:n=!1,error:s="",connectInfo:o=null,onRefreshNodes:r=async()=>{}})=>{let i=t1({nodes:t,onRefreshNodes:r}),{browserStatusByNodeId:a,browserErrorByNodeId:l,checkingBrowserNodeId:c,browserAttachStateByNodeId:d,menuOpenNodeId:u,removeDialogNode:p,removingNodeId:f,handleCopyText:g,handleCheckNodeBrowser:m,handleAttachNodeBrowser:h,handleDetachNodeBrowser:x,handleOpenNodeMenu:b,handleRemoveNode:v,setMenuOpenNodeId:$,setRemoveDialogNode:w}=i;return it`
- ${e.length?ot` + ${e.length?it`
@@ -7638,22 +7744,22 @@ ${B?.grantPublisher||""}`.trim()))} waiting for approval.
`:null} - ${n?ot` + ${n?it`
- <${Ce} className="h-4 w-4" /> + <${Ae} className="h-4 w-4" /> Loading nodes...
- `:s?ot` + `:s?it`
${s}
- `:t.length?ot` + `:t.length?it`
- ${t.map(S=>{let C=String(S?.nodeId||"").trim(),_=a[C]||null,k=l[C]||"",A=c===C,O=S?.connected&&oR(S)&&C,D=d?.[C]===!0,z=!!_||!!k,E=_?.running===!0,M=D&&!z&&!A,R=O&&D&&!A&&z&&!E;return ot` + ${t.map(S=>{let C=String(S?.nodeId||"").trim(),_=a[C]||null,k=l[C]||"",A=c===C,D=S?.connected&&gR(S)&&C,N=d?.[C]===!0,z=!!_||!!k,O=_?.running===!0,M=N&&!z&&!A,R=D&&N&&!A&&z&&!O;return it`
@@ -7663,13 +7769,13 @@ ${B?.grantPublisher||""}`.trim()))}
${S?.displayName||S?.nodeId||"Unnamed node"}
- ${C?ot` + ${C?it`
- ${sR(S)} - ${S?.paired?ot` - <${pt} + ${mR(S)} + ${S?.paired?it` + <${mt} open=${u===C} ariaLabel="Open node actions" title="Open node actions" - onClose=${()=>w("")} - onToggle=${()=>x(C)} + onClose=${()=>$("")} + onToggle=${()=>b(C)} > <${We} className="text-status-error hover:text-status-error" - onClick=${()=>{w(""),$(S)}} + onClick=${()=>{$(""),w(S)}} > Remove device - + `:null}
@@ -7713,7 +7819,7 @@ ${B?.grantPublisher||""}`.trim()))} >
- ${O?ot` + ${D?it`
Browser
- ${D?ot` + ${N?it`
profile: user
- `:ot` + `:it`
@@ -7744,24 +7850,24 @@ ${B?.grantPublisher||""}`.trim()))} `}
- ${_?ot` + ${_?it` - <${ae} tone=${rR(_)} - >${iR(_)}${xR(_)} `:null} - ${M?ot` - <${Ce} + ${M?it` + <${Ae} className="h-3.5 w-3.5" /> `:null} - ${A?ot` - <${Ce} + ${A?it` + <${Ae} className="h-3.5 w-3.5" /> `:null} - ${O&&!D?ot` + ${D&&!N?it` <${Z} onClick=${()=>h(C)} idleLabel="Attach" @@ -7769,7 +7875,7 @@ ${B?.grantPublisher||""}`.trim()))} size="sm" /> `:null} - ${R?ot` + ${R?it` <${Z} onClick=${()=>m(C)} idleLabel="Check" @@ -7777,10 +7883,10 @@ ${B?.grantPublisher||""}`.trim()))} size="sm" /> `:null} - ${O&&D&&!A?ot` + ${D&&N&&!A?it`
- ${_?ot` + ${_?it`
@@ -7810,7 +7916,7 @@ ${B?.grantPublisher||""}`.trim()))}
`:null} - ${k?ot`
${k} @@ -7818,7 +7924,7 @@ ${B?.grantPublisher||""}`.trim()))}
`:null} - ${S?.paired&&!S?.connected&&o?ot` + ${S?.paired&&!S?.connected&&o?it`
@@ -7829,15 +7935,15 @@ ${B?.grantPublisher||""}`.trim()))} <${Z} - onClick=${()=>g(qw({node:S,connectInfo:o,maskToken:!1}),{successMessage:"Connection command copied",errorMessage:"Could not copy connection command"})} + onClick=${()=>g(n1({node:S,connectInfo:o,maskToken:!1}),{successMessage:"Connection command copied",errorMessage:"Could not copy connection command"})} tone="secondary" size="sm" iconOnly=${!0} - idleIcon=${Us} + idleIcon=${Zn} idleIconClassName="w-3.5 h-3.5" ariaLabel="Copy reconnect command" title="Copy reconnect command" @@ -7848,12 +7954,12 @@ ${B?.grantPublisher||""}`.trim()))}
`})}
- `:ot` + `:it`
- <${Pa} className="h-12 w-12 text-cyan-400" /> + <${Ia} className="h-12 w-12 text-cyan-400" />

No connected nodes yet @@ -7867,7 +7973,7 @@ ${B?.grantPublisher||""}`.trim()))}

`}
- <${st} + <${rt} visible=${!!p} title="Remove device?" message=${p?.connected?"This device is currently connected. Removing it will disconnect and remove the paired device from this gateway (equivalent to running openclaw devices remove for this device id). The device can reconnect and pair again later.":"This removes the paired device from this gateway (equivalent to running openclaw devices remove for this device id). The device can reconnect and pair again later."} @@ -7876,10 +7982,10 @@ ${B?.grantPublisher||""}`.trim()))} confirmTone="warning" confirmLoading=${!!f} confirmDisabled=${!!f} - onCancel=${()=>{f||$(null)}} + onCancel=${()=>{f||w(null)}} onConfirm=${v} /> - `};var aR=P.bind(T),lR="https://github.com/openclaw/openclaw/releases/tag/v2026.3.13",cR=`Release reference: [OpenClaw 2026.3.13](${lR}) + `};var yR=P.bind(T),vR="https://github.com/openclaw/openclaw/releases/tag/v2026.3.13",$R=`Release reference: [OpenClaw 2026.3.13](${vR}) ## Requirements @@ -7919,7 +8025,7 @@ On first connect, Chrome prompts for DevTools MCP access. Click **Allow**. | Config validation error on existing-session | Do not define a custom existing-session profile. Use \`defaultProfile: "user"\`. | | EADDRINUSE on port 9222 | Quit Chrome launched with \`--remote-debugging-port\` and relaunch normally. | | Consent dialog appears but attach hangs | Quit Chrome, relaunch, and approve the dialog again. | -| \`npx chrome-devtools-mcp\` not found | Install Node.js on the Mac node so \`npx\` exists in PATH. |`,Zw=()=>{let t=F(()=>Le.parse(cR,{gfm:!0,breaks:!0}),[]);return aR` +| \`npx chrome-devtools-mcp\` not found | Install Node.js on the Mac node so \`npx\` exists in PATH. |`,o1=()=>{let t=F(()=>Fe.parse($R,{gfm:!0,breaks:!0}),[]);return yR`
@@ -7931,7 +8037,7 @@ On first connect, Chrome prompts for DevTools MCP access. Click **Allow**. dangerouslySetInnerHTML=${{__html:t}} >
- `};var Yw=3e3,Xw=({visible:t=!1,nodes:e=[],refreshNodes:n=async()=>{},onRestartRequired:s=()=>{},onClose:o=()=>{}}={})=>{let[r,i]=y(0),[a,l]=y(null),[c,d]=y(!1),[u,p]=y("My Mac Node"),[f,g]=y(""),[m,h]=y(!1),[b,x]=y([]),[v,w]=y(!1),$=ee(!1);L(()=>{t&&(i(0),g(""),h(!1),w(!1))},[t]),L(()=>{t&&(d(!0),ya().then(E=>{l(E||null)}).catch(E=>{N(E.message||"Could not load node connect command","error")}).finally(()=>{d(!1)}))},[t]);let S=F(()=>{let E=new Set,M=[];for(let R of e){let B=String(R?.nodeId||"").trim();!B||E.has(B)||R?.paired!==!1&&(E.add(B),M.push({nodeId:B,displayName:String(R?.displayName||R?.name||B),connected:R?.connected===!0}))}return M},[e]),C=F(()=>S.find(E=>E.nodeId===String(f||"").trim())||null,[S,f]),_=F(()=>{if(!a)return"";let E=String(a.gatewayHost||"").trim()||"localhost",M=Number(a.gatewayPort)||3e3,R=String(a.gatewayToken||"").trim(),B=a.tls===!0?" --tls":"",I=String(u||"").trim().replace(/"/g,'\\"');return[R?`OPENCLAW_GATEWAY_TOKEN=${R}`:"","openclaw node run",`--host ${E}`,`--port ${M}`,B.trim(),I?`--display-name "${I}"`:""].filter(Boolean).join(" ")},[a,u]),k=q(async()=>{if(!$.current){$.current=!0;try{await n();let E=await ga(),M=Array.isArray(E?.pending)?E.pending:[];x(M)}finally{$.current=!1}}},[n]);L(()=>{if(!t||r!==1)return;let E=!0,M=async()=>{if(E)try{await k()}catch{}};M();let R=setInterval(M,Yw);return()=>{E=!1,clearInterval(R)}},[k,r,t]),L(()=>{if(!t||r!==1)return;let E=S.some(B=>B.nodeId===String(f||"").trim()),M=String(u||"").trim().toLowerCase(),R=S.find(B=>String(B?.displayName||"").trim().toLowerCase()===M)||S[0];R&&(E&&String(f||"").trim()===R.nodeId||g(R.nodeId))},[u,S,f,r,t]);let A=q(async E=>{try{await ba(E),N("Pairing approved","success"),w(!0),await k()}catch(M){N(M.message||"Could not approve pairing","error")}},[k]),O=q(async E=>{try{await xa(E),N("Pairing rejected","info"),await k()}catch(M){N(M.message||"Could not reject pairing","error")}},[k]),D=q(async()=>{let E=String(f||"").trim();if(!E||m)return!1;h(!0);try{return await Lm(E),s(!0),N("Gateway routing now points to the selected node","success"),!0}catch(M){return N(M.message||"Could not configure gateway node routing","error"),!1}finally{h(!1)}},[m,s,f]),z=q(()=>{o()},[o]);return{step:r,setStep:i,connectInfo:a,loadingConnectInfo:c,displayName:u,setDisplayName:p,selectedNodeId:f,setSelectedNodeId:g,pairedNodes:S,selectedPairedNode:C,devicePending:b,approvedInSession:v,configuring:m,canFinish:v&&!!C?.connected,connectCommand:_,refreshNodeList:k,nodeDiscoveryPollIntervalMs:Yw,handleDeviceApprove:A,handleDeviceReject:O,applyGatewayNodeRouting:D,completeWizard:z}};var an=P.bind(T),Ui=["Install OpenClaw CLI","Connect Node"],Qw=({command:t="",onCopy:e=()=>{}})=>an` + `};var r1=3e3,i1=({visible:t=!1,nodes:e=[],refreshNodes:n=async()=>{},onRestartRequired:s=()=>{},onClose:o=()=>{}}={})=>{let[r,i]=y(0),[a,l]=y(null),[c,d]=y(!1),[u,p]=y("My Mac Node"),[f,g]=y(""),[m,h]=y(!1),[x,b]=y([]),[v,$]=y(!1),w=te(!1);L(()=>{t&&(i(0),g(""),h(!1),$(!1))},[t]),L(()=>{t&&(d(!0),ka().then(O=>{l(O||null)}).catch(O=>{I(O.message||"Could not load node connect command","error")}).finally(()=>{d(!1)}))},[t]);let S=F(()=>{let O=new Set,M=[];for(let R of e){let B=String(R?.nodeId||"").trim();!B||O.has(B)||R?.paired!==!1&&(O.add(B),M.push({nodeId:B,displayName:String(R?.displayName||R?.name||B),connected:R?.connected===!0}))}return M},[e]),C=F(()=>S.find(O=>O.nodeId===String(f||"").trim())||null,[S,f]),_=F(()=>{if(!a)return"";let O=String(a.gatewayHost||"").trim()||"localhost",M=Number(a.gatewayPort)||3e3,R=String(a.gatewayToken||"").trim(),B=a.tls===!0?" --tls":"",E=String(u||"").trim().replace(/"/g,'\\"');return[R?`OPENCLAW_GATEWAY_TOKEN=${R}`:"","openclaw node run",`--host ${O}`,`--port ${M}`,B.trim(),E?`--display-name "${E}"`:""].filter(Boolean).join(" ")},[a,u]),k=G(async()=>{if(!w.current){w.current=!0;try{await n();let O=await va(),M=Array.isArray(O?.pending)?O.pending:[];b(M)}finally{w.current=!1}}},[n]);L(()=>{if(!t||r!==1)return;let O=!0,M=async()=>{if(O)try{await k()}catch{}};M();let R=setInterval(M,r1);return()=>{O=!1,clearInterval(R)}},[k,r,t]),L(()=>{if(!t||r!==1)return;let O=S.some(B=>B.nodeId===String(f||"").trim()),M=String(u||"").trim().toLowerCase(),R=S.find(B=>String(B?.displayName||"").trim().toLowerCase()===M)||S[0];R&&(O&&String(f||"").trim()===R.nodeId||g(R.nodeId))},[u,S,f,r,t]);let A=G(async O=>{try{await $a(O),I("Pairing approved","success"),$(!0),await k()}catch(M){I(M.message||"Could not approve pairing","error")}},[k]),D=G(async O=>{try{await wa(O),I("Pairing rejected","info"),await k()}catch(M){I(M.message||"Could not reject pairing","error")}},[k]),N=G(async()=>{let O=String(f||"").trim();if(!O||m)return!1;h(!0);try{return await Em(O),s(!0),I("Gateway routing now points to the selected node","success"),!0}catch(M){return I(M.message||"Could not configure gateway node routing","error"),!1}finally{h(!1)}},[m,s,f]),z=G(()=>{o()},[o]);return{step:r,setStep:i,connectInfo:a,loadingConnectInfo:c,displayName:u,setDisplayName:p,selectedNodeId:f,setSelectedNodeId:g,pairedNodes:S,selectedPairedNode:C,devicePending:x,approvedInSession:v,configuring:m,canFinish:v&&!!C?.connected,connectCommand:_,refreshNodeList:k,nodeDiscoveryPollIntervalMs:r1,handleDeviceApprove:A,handleDeviceReject:D,applyGatewayNodeRouting:N,completeWizard:z}};var an=P.bind(T),qi=["Install OpenClaw CLI","Connect Node"],a1=({command:t="",onCopy:e=()=>{}})=>an`
-        <${Us} className="w-3.5 h-3.5" />
+        <${Zn} className="w-3.5 h-3.5" />
         Copy
       
     
-`,e1=async(t,e="text")=>{if(await Ho(t)){N("Copied to clipboard","success");return}N(`Could not copy ${e}`,"error")},t1=({visible:t=!1,nodes:e=[],refreshNodes:n=async()=>{},onRestartRequired:s=()=>{},onClose:o=()=>{}})=>{let r=Xw({visible:t,nodes:e,refreshNodes:n,onRestartRequired:s,onClose:o}),i=r.step===Ui.length-1;return an` - <${De} +`,l1=async(t,e="text")=>{if(await ws(t)){I("Copied to clipboard","success");return}I(`Could not copy ${e}`,"error")},c1=({visible:t=!1,nodes:e=[],refreshNodes:n=async()=>{},onRestartRequired:s=()=>{},onClose:o=()=>{}})=>{let r=i1({visible:t,nodes:e,refreshNodes:n,onRestartRequired:s,onClose:o}),i=r.step===qi.length-1;return an` + <${Ie} visible=${t} onClose=${o} closeOnOverlayClick=${!1} @@ -7963,12 +8069,12 @@ ${t} - <${nt} className="w-3.5 h-3.5 text-body" /> + <${Qe} className="w-3.5 h-3.5 text-body" />
Node Setup Wizard
- ${Ui.map((a,l)=>an` + ${qi.map((a,l)=>an`

- Step ${r.step+1} of ${Ui.length}: ${Ui[r.step]} + Step ${r.step+1} of ${qi.length}: ${qi[r.step]}

${r.step===0?an`
Install OpenClaw on the machine you want to connect as a node.
- ${Qw({command:"npm install -g openclaw",onCopy:()=>e1("npm install -g openclaw","command")})} + ${a1({command:"npm install -g openclaw",onCopy:()=>l1("npm install -g openclaw","command")})}
Requires Node.js 22+.
`:null} @@ -8005,10 +8111,10 @@ ${t} ${r.loadingConnectInfo?an`
Loading command... -
`:Qw({command:r.connectCommand||"Could not build connect command.",onCopy:()=>e1(r.connectCommand||"","command")})} +
`:a1({command:r.connectCommand||"Could not build connect command.",onCopy:()=>l1(r.connectCommand||"","command")})}
${r.devicePending.length?an` - <${xc} + <${wc} pending=${r.devicePending} onApprove=${r.handleDeviceApprove} onReject=${r.handleDeviceReject} @@ -8054,7 +8160,7 @@ ${t} `:an` <${Z} - onClick=${()=>r.setStep(Math.min(Ui.length-1,r.step+1))} + onClick=${()=>r.setStep(Math.min(qi.length-1,r.step+1))} idleLabel="Next" tone="primary" size="md" @@ -8062,12 +8168,12 @@ ${t} `}
- - `};var n1=P.bind(T),s1=({onRestartRequired:t=()=>{}})=>{let{state:e,actions:n}=zw();return n1` + + `};var d1=P.bind(T),u1=({onRestartRequired:t=()=>{}})=>{let{state:e,actions:n}=X0();return d1`
- <${Ne} + <${De} title="Nodes" - actions=${n1` + actions=${d1` <${Z} onClick=${n.refreshNodes} loading=${e.refreshingNodes} @@ -8085,7 +8191,7 @@ ${t} - <${Jw} + <${s1} nodes=${e.nodes} pending=${e.pending} loading=${e.loadingNodes} @@ -8094,9 +8200,9 @@ ${t} - <${Zw} /> + <${o1} /> - <${t1} + <${c1} visible=${e.wizardVisible} nodes=${e.nodes} refreshNodes=${n.refreshNodes} @@ -8104,38 +8210,38 @@ ${t}
- `};var dR=P.bind(T),mf=({onRestartRequired:t=()=>{}})=>dR` + `};var wR=P.bind(T),bf=({onRestartRequired:t=()=>{}})=>wR`
- <${s1} onRestartRequired=${t} /> + <${u1} onRestartRequired=${t} />
-`;var NU=P.bind(T);var OU=Object.values(Mn).flat().map(t=>t.key).filter((t,e,n)=>n.indexOf(t)===e);var jU=P.bind(T);var Ki=({to:t})=>{let[,e]=ca();return L(()=>{e(t)},[t,e]),null};var Gi=(t,e)=>{let n=String(e||"").trim();n&&t.set("accountId",n)},o1=async({accountId:t=""}={})=>{let e=new URLSearchParams;Gi(e,t);let n=e.toString()?`?${e.toString()}`:"";return(await Y(`/api/telegram/bot${n}`)).json()},r1=async({accountId:t=""}={})=>{let e=new URLSearchParams;Gi(e,t);let n=e.toString()?`?${e.toString()}`:"";return(await Y(`/api/telegram/workspace${n}`)).json()},i1=async({accountId:t=""}={})=>{let e=new URLSearchParams;Gi(e,t);let n=e.toString()?`?${e.toString()}`:"";return(await Y(`/api/telegram/workspace/reset${n}`,{method:"POST"})).json()},a1=async(t,{accountId:e=""}={})=>(await Y("/api/telegram/groups/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({groupId:t,accountId:e})})).json(),_c=async(t,{accountId:e=""}={})=>{let n=new URLSearchParams;Gi(n,e);let s=n.toString()?`?${n.toString()}`:"";return(await Y(`/api/telegram/groups/${encodeURIComponent(t)}/topics${s}`)).json()},Mc=async(t,e,{accountId:n=""}={})=>(await Y(`/api/telegram/groups/${encodeURIComponent(t)}/topics/bulk`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({topics:e,accountId:n})})).json(),Ac=async(t,e,{accountId:n=""}={})=>{let s=new URLSearchParams;Gi(s,n);let o=s.toString()?`?${s.toString()}`:"";return(await Y(`/api/telegram/groups/${encodeURIComponent(t)}/topics/${e}${o}`,{method:"DELETE"})).json()},l1=async(t,e,n,{accountId:s=""}={})=>(await Y(`/api/telegram/groups/${encodeURIComponent(t)}/topics/${encodeURIComponent(e)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({...n,accountId:s})})).json(),c1=async(t,e,{accountId:n=""}={})=>(await Y(`/api/telegram/groups/${encodeURIComponent(t)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,accountId:n})})).json();var At=P.bind(T),d1=({currentStep:t,steps:e})=>At` +`;var oK=P.bind(T);var rK=Object.values(An).flat().map(t=>t.key).filter((t,e,n)=>n.indexOf(t)===e);var uK=P.bind(T);var Ji=({to:t})=>{let[,e]=pa();return L(()=>{e(t)},[t,e]),null};var Zi=(t,e)=>{let n=String(e||"").trim();n&&t.set("accountId",n)},p1=async({accountId:t=""}={})=>{let e=new URLSearchParams;Zi(e,t);let n=e.toString()?`?${e.toString()}`:"";return(await X(`/api/telegram/bot${n}`)).json()},f1=async({accountId:t=""}={})=>{let e=new URLSearchParams;Zi(e,t);let n=e.toString()?`?${e.toString()}`:"";return(await X(`/api/telegram/workspace${n}`)).json()},h1=async({accountId:t=""}={})=>{let e=new URLSearchParams;Zi(e,t);let n=e.toString()?`?${e.toString()}`:"";return(await X(`/api/telegram/workspace/reset${n}`,{method:"POST"})).json()},m1=async(t,{accountId:e=""}={})=>(await X("/api/telegram/groups/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({groupId:t,accountId:e})})).json(),Tc=async(t,{accountId:e=""}={})=>{let n=new URLSearchParams;Zi(n,e);let s=n.toString()?`?${n.toString()}`:"";return(await X(`/api/telegram/groups/${encodeURIComponent(t)}/topics${s}`)).json()},Pc=async(t,e,{accountId:n=""}={})=>(await X(`/api/telegram/groups/${encodeURIComponent(t)}/topics/bulk`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({topics:e,accountId:n})})).json(),Rc=async(t,e,{accountId:n=""}={})=>{let s=new URLSearchParams;Zi(s,n);let o=s.toString()?`?${s.toString()}`:"";return(await X(`/api/telegram/groups/${encodeURIComponent(t)}/topics/${e}${o}`,{method:"DELETE"})).json()},g1=async(t,e,n,{accountId:s=""}={})=>(await X(`/api/telegram/groups/${encodeURIComponent(t)}/topics/${encodeURIComponent(e)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({...n,accountId:s})})).json(),b1=async(t,e,{accountId:n=""}={})=>(await X(`/api/telegram/groups/${encodeURIComponent(t)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,accountId:n})})).json();var Pt=P.bind(T),x1=({currentStep:t,steps:e})=>Pt`
- ${e.map((n,s)=>At` + ${e.map((n,s)=>Pt`
`)}
-`,u1=({accountId:t,botInfo:e,setBotInfo:n,onNext:s})=>{let[o,r]=y(!1),[i,a]=y(null),l=async()=>{r(!0),a(null);try{let c=await o1({accountId:t});if(!c.ok)throw new Error(c.error);n(c.bot)}catch(c){a(c.message)}r(!1)};return L(()=>{e||l()},[]),At` +`,y1=({accountId:t,botInfo:e,setBotInfo:n,onNext:s})=>{let[o,r]=y(!1),[i,a]=y(null),l=async()=>{r(!0),a(null);try{let c=await p1({accountId:t});if(!c.ok)throw new Error(c.error);n(c.bot)}catch(c){a(c.message)}r(!1)};return L(()=>{e||l()},[]),Pt`

Verify Bot Setup

- ${e&&At` + ${e&&Pt`
@${e.username} - <${ae} tone="success">Connected + <${de} tone="success">Connected

${e.first_name}

`} - ${i&&At` + ${i&&Pt`

${i}

`} - ${!e&&!o&&!i&&At`

Checking bot token...

`} + ${!e&&!o&&!i&&Pt`

Checking bot token...

`}

@@ -8168,7 +8274,7 @@ ${t}

- `},p1=({onNext:t,onBack:e})=>At` + `},v1=({onNext:t,onBack:e})=>Pt`

Create a Telegram Group

@@ -8236,7 +8342,7 @@ ${t}
-`,f1=({accountId:t,groupId:e,setGroupId:n,groupInfo:s,setGroupInfo:o,userId:r,setUserId:i,verifyGroupError:a,setVerifyGroupError:l,onNext:c,onBack:d})=>{let[u,p]=y(e||""),[f,g]=y(!1),[m,h]=y(!1),b=s?[...s.chat?.isForum?[]:["Topics are OFF. Enable Topics in Telegram group settings."],...s.bot?.isAdmin?[]:["Bot is not an admin. Promote it to admin in group members."],...s.bot?.canManageTopics?[]:["Bot is missing Manage Topics permission. Enable it in admin permissions."]]:[],x=async()=>{let $=u.trim();if($){g(!0),l(null);try{let S=await a1($,{accountId:t});if(!S.ok)throw new Error(S.error);n($),o(S),!String(r||"").trim()&&S.suggestedUserId&&i(String(S.suggestedUserId))}catch(S){l(S.message),o(null)}g(!1)}},v=!!(s&&s.chat?.isForum&&s.bot?.isAdmin&&s.bot?.canManageTopics),w=async()=>{if(!(!v||m)){l(null),h(!0);try{let $=String(r||"").trim(),S=await c1(e,{...$?{userId:$}:{},groupName:s?.chat?.title||e,requireMention:!1},{accountId:t});if(!S?.ok)throw new Error(S?.error||"Failed to configure Telegram group");S.userId&&i(String(S.userId)),c()}catch($){l($.message)}h(!1)}};return At` +`,$1=({accountId:t,groupId:e,setGroupId:n,groupInfo:s,setGroupInfo:o,userId:r,setUserId:i,verifyGroupError:a,setVerifyGroupError:l,onNext:c,onBack:d})=>{let[u,p]=y(e||""),[f,g]=y(!1),[m,h]=y(!1),x=s?[...s.chat?.isForum?[]:["Topics are OFF. Enable Topics in Telegram group settings."],...s.bot?.isAdmin?[]:["Bot is not an admin. Promote it to admin in group members."],...s.bot?.canManageTopics?[]:["Bot is missing Manage Topics permission. Enable it in admin permissions."]]:[],b=async()=>{let w=u.trim();if(w){g(!0),l(null);try{let S=await m1(w,{accountId:t});if(!S.ok)throw new Error(S.error);n(w),o(S),!String(r||"").trim()&&S.suggestedUserId&&i(String(S.suggestedUserId))}catch(S){l(S.message),o(null)}g(!1)}},v=!!(s&&s.chat?.isForum&&s.bot?.isAdmin&&s.bot?.canManageTopics),$=async()=>{if(!(!v||m)){l(null),h(!0);try{let w=String(r||"").trim(),S=await b1(e,{...w?{userId:w}:{},groupName:s?.chat?.title||e,requireMention:!1},{accountId:t});if(!S?.ok)throw new Error(S?.error||"Failed to configure Telegram group");S.userId&&i(String(S.userId)),c()}catch(w){l(w.message)}h(!1)}};return Pt`

Verify Group

@@ -8260,12 +8366,12 @@ ${t}p($.target.value)} + onInput=${w=>p(w.target.value)} placeholder="-100XXXXXXXXXX" class="flex-1 bg-field border border-border rounded-lg px-3 py-2 text-sm text-body placeholder-fg-dim focus:outline-none focus:border-fg-muted" /> <${Z} - onClick=${x} + onClick=${b} disabled=${!u.trim()||f} loading=${f} tone="secondary" @@ -8276,16 +8382,16 @@ ${t}
- ${a&&At` + ${a&&Pt`

${a}

`} - ${s&&At` + ${s&&Pt`
${s.chat.title} - <${ae} tone="success">Verified + <${de} tone="success">Verified
Topics: ${s.chat.isForum?"ON":"OFF"} @@ -8293,13 +8399,13 @@ ${t}
`} - ${s&&b.length===0&&At` + ${s&&x.length===0&&Pt`

Your Telegram User ID

i($.target.value)} + onInput=${w=>i(w.target.value)} placeholder="e.g. 123456789" class="w-full bg-field border border-border rounded-lg px-3 py-2 text-sm text-body placeholder-fg-dim focus:outline-none focus:border-fg-muted" /> @@ -8308,7 +8414,7 @@ ${t}
`} - ${b.length>0&&At` + ${x.length>0&&Pt`
@@ -8316,7 +8422,7 @@ ${t}
    - ${b.map($=>At`
  • ${$}
  • `)} + ${x.map(w=>Pt`
  • ${w}
  • `)}

Once fixed, hit Verify again.

@@ -8330,7 +8436,7 @@ ${t}
- `},h1=({accountId:t,groupId:e,topics:n,setTopics:s,onNext:o,onBack:r})=>{let[i,a]=y(""),[l,c]=y(""),[d,u]=y(!1),[p,f]=y(null),[g,m]=y(null),[h,b]=y(null),x=async()=>{let S=await _c(e,{accountId:t});S.ok&&s(S.topics)};L(()=>{x()},[e]);let v=async()=>{let S=i.trim(),C=l.trim();if(S){u(!0),f(null);try{let _=await Mc(e,[{name:S,...C?{systemInstructions:C}:{}}],{accountId:t});if(!_.ok)throw new Error(_.results?.[0]?.error||"Failed to create topic");let k=_.results.filter(A=>!A.ok);if(k.length>0)throw new Error(k[0].error);a(""),c(""),await x(),N(`Created topic: ${S}`,"success")}catch(_){f(_.message)}u(!1)}},w=async(S,C)=>{m(S);try{let _=await Ac(e,S,{accountId:t});if(!_.ok)throw new Error(_.error);await x(),_.removedFromRegistryOnly?N(`Removed stale topic from registry: ${C}`,"success"):N(`Deleted topic: ${C}`,"success")}catch(_){N(`Failed to delete: ${_.message}`,"error")}m(null)},$=Object.entries(n||{});return At` + `},w1=({accountId:t,groupId:e,topics:n,setTopics:s,onNext:o,onBack:r})=>{let[i,a]=y(""),[l,c]=y(""),[d,u]=y(!1),[p,f]=y(null),[g,m]=y(null),[h,x]=y(null),b=async()=>{let S=await Tc(e,{accountId:t});S.ok&&s(S.topics)};L(()=>{b()},[e]);let v=async()=>{let S=i.trim(),C=l.trim();if(S){u(!0),f(null);try{let _=await Pc(e,[{name:S,...C?{systemInstructions:C}:{}}],{accountId:t});if(!_.ok)throw new Error(_.results?.[0]?.error||"Failed to create topic");let k=_.results.filter(A=>!A.ok);if(k.length>0)throw new Error(k[0].error);a(""),c(""),await b(),I(`Created topic: ${S}`,"success")}catch(_){f(_.message)}u(!1)}},$=async(S,C)=>{m(S);try{let _=await Rc(e,S,{accountId:t});if(!_.ok)throw new Error(_.error);await b(),_.removedFromRegistryOnly?I(`Removed stale topic from registry: ${C}`,"success"):I(`Deleted topic: ${C}`,"success")}catch(_){I(`Failed to delete: ${_.message}`,"error")}m(null)},w=Object.entries(n||{});return Pt`

Create Topics

- ${$.length>0&&At` + ${w.length>0&&Pt`
@@ -8359,13 +8465,13 @@ ${t} - ${$.map(([S,C])=>At` + ${w.map(([S,C])=>Pt` ${C.name} ${S}
- <${st} + <${rt} visible=${!!h} title="Delete topic?" message=${h?`This will delete "${h.name}" (thread ${h.id}) from your Telegram workspace.`:"This will delete this topic from your Telegram workspace."} @@ -8455,11 +8561,11 @@ ${t}{g||b(null)}} - onConfirm=${async()=>{if(!h)return;let S=h;b(null),await w(S.id,S.name)}} + onCancel=${()=>{g||x(null)}} + onConfirm=${async()=>{if(!h)return;let S=h;x(null),await $(S.id,S.name)}} />
- `},m1=({groupId:t,groupInfo:e,topics:n,onBack:s,onDone:o})=>At` + `},k1=({groupId:t,groupInfo:e,topics:n,onBack:s,onDone:o})=>Pt`

🎉 Setup complete

@@ -8492,18 +8598,18 @@ ${t}
- `;var Tt=P.bind(T),g1=({value:t,agents:e,onChange:n,className:s=""})=>Tt` + `;var Rt=P.bind(T),S1=({value:t,agents:e,onChange:n,className:s=""})=>Rt` -`,bf=({accountId:t,groupId:e,groupName:n,initialTopics:s,configAgentMaxConcurrent:o,configSubagentMaxConcurrent:r,debugEnabled:i,onResetOnboarding:a})=>{let[l,c]=y(s||{}),[d,u]=y(""),[p,f]=y(""),[g,m]=y(""),[h,b]=y(!1),[x,v]=y(!1),[w,$]=y(null),[S,C]=y(""),[_,k]=y(""),[A,O]=y(""),[D,z]=y(""),[E,M]=y(""),[R,B]=y(null),[I,U]=y(null),[W,G]=y([]),se=async()=>{let V=await _c(e,{accountId:t});V.ok&&c(V.topics||{})};L(()=>{se()},[e]),L(()=>{s&&Object.keys(s).length>0&&c(s)},[s]),L(()=>{Ao().then(V=>G(Array.isArray(V?.agents)?V.agents:[])).catch(()=>{})},[]);let K=async()=>{let V=d.trim(),J=p.trim(),oe=g.trim();if(V){v(!0),B(null);try{let ce=await Mc(e,[{name:V,...J?{systemInstructions:J}:{},...oe?{agentId:oe}:{}}],{accountId:t});if(!ce.ok)throw new Error(ce.results?.[0]?.error||"Failed to create topic");let be=ce.results.filter(Ve=>!Ve.ok);if(be.length>0)throw new Error(be[0].error);u(""),f(""),m(""),b(!1),await se(),N(`Created topic: ${V}`,"success")}catch(ce){B(ce.message)}v(!1)}},j=async(V,J)=>{$(V);try{let oe=await Ac(e,V,{accountId:t});if(!oe.ok)throw new Error(oe.error);await se(),oe.removedFromRegistryOnly?N(`Removed stale topic from registry: ${J}`,"success"):N(`Deleted topic: ${J}`,"success")}catch(oe){N(`Failed to delete: ${oe.message}`,"error")}$(null)},X=(V,J,oe="",ce="")=>{C(String(V)),k(String(J||"")),O(String(oe||"")),z(String(ce||""))},de=()=>{C(""),k(""),O(""),z("")},le=async V=>{let J=_.trim(),oe=A.trim(),ce=D.trim();if(!J){B("Topic name is required");return}M(String(V)),B(null);try{let be=await l1(e,V,{name:J,systemInstructions:oe,agentId:ce},{accountId:t});if(!be.ok)throw new Error(be.error||"Failed to update topic");await se(),N(`Updated topic: ${J}`,"success"),de()}catch(be){B(be.message)}M("")},ie=Object.entries(l||{}),ne=ie.length,xe=Math.max(ne*3,8),he=Math.max(xe-2,4),ue=Number.isFinite(o)?o:xe,me=Number.isFinite(r)?r:he;return Tt` +`,yf=({accountId:t,groupId:e,groupName:n,initialTopics:s,configAgentMaxConcurrent:o,configSubagentMaxConcurrent:r,debugEnabled:i,onResetOnboarding:a})=>{let[l,c]=y(s||{}),[d,u]=y(""),[p,f]=y(""),[g,m]=y(""),[h,x]=y(!1),[b,v]=y(!1),[$,w]=y(null),[S,C]=y(""),[_,k]=y(""),[A,D]=y(""),[N,z]=y(""),[O,M]=y(""),[R,B]=y(null),[E,U]=y(null),[H,K]=y([]),se=async()=>{let V=await Tc(e,{accountId:t});V.ok&&c(V.topics||{})};L(()=>{se()},[e]),L(()=>{s&&Object.keys(s).length>0&&c(s)},[s]),L(()=>{To().then(V=>K(Array.isArray(V?.agents)?V.agents:[])).catch(()=>{})},[]);let Y=async()=>{let V=d.trim(),q=p.trim(),ae=g.trim();if(V){v(!0),B(null);try{let fe=await Pc(e,[{name:V,...q?{systemInstructions:q}:{},...ae?{agentId:ae}:{}}],{accountId:t});if(!fe.ok)throw new Error(fe.results?.[0]?.error||"Failed to create topic");let ne=fe.results.filter(ve=>!ve.ok);if(ne.length>0)throw new Error(ne[0].error);u(""),f(""),m(""),x(!1),await se(),I(`Created topic: ${V}`,"success")}catch(fe){B(fe.message)}v(!1)}},j=async(V,q)=>{w(V);try{let ae=await Rc(e,V,{accountId:t});if(!ae.ok)throw new Error(ae.error);await se(),ae.removedFromRegistryOnly?I(`Removed stale topic from registry: ${q}`,"success"):I(`Deleted topic: ${q}`,"success")}catch(ae){I(`Failed to delete: ${ae.message}`,"error")}w(null)},J=(V,q,ae="",fe="")=>{C(String(V)),k(String(q||"")),D(String(ae||"")),z(String(fe||""))},pe=()=>{C(""),k(""),D(""),z("")},le=async V=>{let q=_.trim(),ae=A.trim(),fe=N.trim();if(!q){B("Topic name is required");return}M(String(V)),B(null);try{let ne=await g1(e,V,{name:q,systemInstructions:ae,agentId:fe},{accountId:t});if(!ne.ok)throw new Error(ne.error||"Failed to update topic");await se(),I(`Updated topic: ${q}`,"success"),pe()}catch(ne){B(ne.message)}M("")},ie=Object.entries(l||{}),oe=ie.length,xe=Math.max(oe*3,8),he=Math.max(xe-2,4),ue=Number.isFinite(o)?o:xe,be=Number.isFinite(r)?r:he;return Rt`
- ${i&&Tt` + ${i&&Rt`