loki-mode 6.40.0 → 6.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/loki +7 -0
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/prd-purple-lab-ide.md +152 -0
- package/docs/prd-purple-lab-platform-v2.md +223 -0
- package/docs/prd-purple-lab-platform.md +321 -0
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/web-app/dist/assets/Badge-Cv068X_w.js +6 -0
- package/web-app/dist/assets/Button-DjxnqObR.js +1 -0
- package/web-app/dist/assets/Card-Ct8CoaX9.js +1 -0
- package/web-app/dist/assets/HomePage-CwHuVFzN.js +33 -0
- package/web-app/dist/assets/ProjectPage-CCzfXsfH.js +116 -0
- package/web-app/dist/assets/ProjectsPage-uAcgLclp.js +11 -0
- package/web-app/dist/assets/SettingsPage-CD0Vmtdu.js +1 -0
- package/web-app/dist/assets/TemplatesPage-CuWAlBEX.js +1 -0
- package/web-app/dist/assets/TerminalOutput-jc4B3JYH.js +16 -0
- package/web-app/dist/assets/clock-BZGjjvpN.js +11 -0
- package/web-app/dist/assets/external-link-DMhX_uRl.js +6 -0
- package/web-app/dist/assets/index-ABzvlaPu.js +136 -0
- package/web-app/dist/assets/index-C-IWanPu.css +1 -0
- package/web-app/dist/index.html +4 -4
- package/web-app/server.py +252 -2
- package/web-app/dist/assets/ProjectPage-tMxpArTu.js +0 -11
- package/web-app/dist/assets/index-Bp-tGwIG.js +0 -77
- package/web-app/dist/assets/index-CsDkyc_d.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,Cascadia Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.terminal-scroll::-webkit-scrollbar{width:6px}.terminal-scroll::-webkit-scrollbar-track{background:transparent}.terminal-scroll::-webkit-scrollbar-thumb{background:#553de933;border-radius:3px}.terminal-scroll::-webkit-scrollbar-thumb:hover{background:#553de959}.card{background:#fff;border:1px solid #ECEAE3;border-radius:5px;box-shadow:0 1px 3px #0000000f}.card:hover,.card-hover:hover{box-shadow:0 5px 10px #00000014}.pattern-nodes{position:absolute;top:0;right:0;bottom:0;left:0;opacity:.04;pointer-events:none;background-image:radial-gradient(circle at 10% 20%,#553DE9 1px,transparent 1px),radial-gradient(circle at 30% 60%,#553DE9 1px,transparent 1px),radial-gradient(circle at 50% 40%,#553DE9 1px,transparent 1px),radial-gradient(circle at 70% 80%,#553DE9 1px,transparent 1px),radial-gradient(circle at 90% 30%,#553DE9 1px,transparent 1px);background-size:200px 200px}*:focus-visible{outline:2px solid #553DE9;outline-offset:2px}::-moz-selection{background:#e8e4fd;color:#201515}::selection{background:#e8e4fd;color:#201515}@media(prefers-reduced-motion:reduce){.phase-active{animation:none}}@keyframes phase-pulse{0%,to{opacity:1}50%{opacity:.5}}.phase-active{animation:phase-pulse 2s ease-in-out infinite}@keyframes cursor-blink{0%,to{opacity:1}50%{opacity:0}}.terminal-cursor:after{content:"";display:inline-block;width:8px;height:16px;background:#553de9;animation:cursor-blink 1s step-end infinite;margin-left:2px;vertical-align:text-bottom}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\!visible{visibility:visible!important}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-3{left:.75rem}.right-0{right:0}.top-1\/2{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-5{grid-column:span 5 / span 5}.col-span-6{grid-column:span 6 / span 6}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-28{height:7rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-64{max-height:16rem}.max-h-\[400px\]{max-height:400px}.min-h-0{min-height:0px}.min-h-\[280px\]{min-height:280px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-28{width:7rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[160px\]{min-width:160px}.max-w-3xl{max-width:48rem}.max-w-\[1400px\]{max-width:1400px}.max-w-\[1920px\]{max-width:1920px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[80\%\]{max-width:80%}.max-w-\[800px\]{max-width:800px}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.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-0{gap:0px}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[3px\]{border-radius:3px}.rounded-\[5px\]{border-radius:5px}.rounded-btn{border-radius:4px}.rounded-card{border-radius:5px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-t-card{border-top-left-radius:5px;border-top-right-radius:5px}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-\[\#553DE9\]{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.border-\[\#553DE9\]\/30{border-color:#553de94d}.border-\[\#C45B5B\]\/20{border-color:#c45b5b33}.border-\[\#ECEAE3\],.border-border{--tw-border-opacity: 1;border-color:rgb(236 234 227 / var(--tw-border-opacity, 1))}.border-border-light{--tw-border-opacity: 1;border-color:rgb(197 192 177 / var(--tw-border-opacity, 1))}.border-border\/50{border-color:#eceae380}.border-danger\/20{border-color:#c45b5b33}.border-muted\/20{border-color:#93908433}.border-primary{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.border-primary\/20{border-color:#553de933}.border-primary\/30{border-color:#553de94d}.border-primary\/40{border-color:#553de966}.border-success\/20{border-color:#1fc5a833}.border-transparent{border-color:transparent}.border-warning\/10{border-color:#d4a03c1a}.border-warning\/20{border-color:#d4a03c33}.border-warning\/30{border-color:#d4a03c4d}.border-warning\/40{border-color:#d4a03c66}.border-t-transparent{border-top-color:transparent}.bg-\[\#1FC5A8\]{--tw-bg-opacity: 1;background-color:rgb(31 197 168 / var(--tw-bg-opacity, 1))}.bg-\[\#1FC5A8\]\/10{background-color:#1fc5a81a}.bg-\[\#553DE9\]{--tw-bg-opacity: 1;background-color:rgb(85 61 233 / var(--tw-bg-opacity, 1))}.bg-\[\#553DE9\]\/10{background-color:#553de91a}.bg-\[\#C45B5B\]{--tw-bg-opacity: 1;background-color:rgb(196 91 91 / var(--tw-bg-opacity, 1))}.bg-\[\#C45B5B\]\/10{background-color:#c45b5b1a}.bg-\[\#D4A03C\]\/10{background-color:#d4a03c1a}.bg-\[\#F8F4F0\]{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.bg-\[\#FAF9F6\]{--tw-bg-opacity: 1;background-color:rgb(250 249 246 / var(--tw-bg-opacity, 1))}.bg-background{--tw-bg-opacity: 1;background-color:rgb(255 254 251 / var(--tw-bg-opacity, 1))}.bg-black\/30{background-color:#0000004d}.bg-black\/5{background-color:#0000000d}.bg-border{--tw-bg-opacity: 1;background-color:rgb(236 234 227 / var(--tw-bg-opacity, 1))}.bg-border\/30{background-color:#eceae34d}.bg-card{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-current{background-color:currentColor}.bg-danger{--tw-bg-opacity: 1;background-color:rgb(196 91 91 / var(--tw-bg-opacity, 1))}.bg-danger\/10{background-color:#c45b5b1a}.bg-hover{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.bg-info{--tw-bg-opacity: 1;background-color:rgb(47 113 227 / var(--tw-bg-opacity, 1))}.bg-ink\/\[0\.03\]{background-color:#20151508}.bg-muted{--tw-bg-opacity: 1;background-color:rgb(147 144 132 / var(--tw-bg-opacity, 1))}.bg-muted\/10{background-color:#9390841a}.bg-muted\/30{background-color:#9390844d}.bg-muted\/40{background-color:#93908466}.bg-primary{--tw-bg-opacity: 1;background-color:rgb(85 61 233 / var(--tw-bg-opacity, 1))}.bg-primary\/10{background-color:#553de91a}.bg-success{--tw-bg-opacity: 1;background-color:rgb(31 197 168 / var(--tw-bg-opacity, 1))}.bg-success\/10{background-color:#1fc5a81a}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:rgb(212 160 60 / var(--tw-bg-opacity, 1))}.bg-warning\/10{background-color:#d4a03c1a}.bg-warning\/5{background-color:#d4a03c0d}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.fill-ink{fill:#201515}.fill-primary{fill:#553de9}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.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-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2\.5{padding-bottom:.625rem}.pl-9{padding-left:2.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-\[20vh\]{padding-top:20vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-heading{font-family:DM Serif Display,Georgia,Times New Roman,serif}.font-mono{font-family:JetBrains Mono,Fira Code,Cascadia Code,monospace}.font-sans{font-family:Inter,system-ui,-apple-system,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-h1{font-size:2.5rem;line-height:1;letter-spacing:-.01em}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#1FC5A8\]{--tw-text-opacity: 1;color:rgb(31 197 168 / var(--tw-text-opacity, 1))}.text-\[\#36342E\]{--tw-text-opacity: 1;color:rgb(54 52 46 / var(--tw-text-opacity, 1))}.text-\[\#553DE9\]{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.text-\[\#6B6960\]{--tw-text-opacity: 1;color:rgb(107 105 96 / var(--tw-text-opacity, 1))}.text-\[\#939084\]{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.text-\[\#C45B5B\]{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.text-\[\#D4A03C\]{--tw-text-opacity: 1;color:rgb(212 160 60 / var(--tw-text-opacity, 1))}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-danger{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-info{--tw-text-opacity: 1;color:rgb(47 113 227 / var(--tw-text-opacity, 1))}.text-ink{--tw-text-opacity: 1;color:rgb(32 21 21 / var(--tw-text-opacity, 1))}.text-ink\/60{color:#20151599}.text-ink\/70{color:#201515b3}.text-ink\/80{color:#201515cc}.text-muted{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.text-muted-accessible{--tw-text-opacity: 1;color:rgb(107 105 96 / var(--tw-text-opacity, 1))}.text-muted\/30{color:#9390844d}.text-muted\/40{color:#93908466}.text-muted\/50{color:#93908480}.text-muted\/60{color:#93908499}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.text-primary\/60{color:#553de999}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:rgb(31 197 168 / var(--tw-text-opacity, 1))}.text-warning{--tw-text-opacity: 1;color:rgb(212 160 60 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(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-button{--tw-shadow: 0 1px 3px rgba(0,0,0,.08);--tw-shadow-colored: 0 1px 3px 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-card{--tw-shadow: 0 1px 3px rgba(0,0,0,.06);--tw-shadow-colored: 0 1px 3px 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-card-hover{--tw-shadow: 0 5px 10px rgba(0,0,0,.08);--tw-shadow-colored: 0 5px 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[\#553DE9\]\/20{--tw-shadow-color: rgb(85 61 233 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-card{--tw-shadow-color: #FFFFFF;--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-\[\#553DE9\]{--tw-ring-opacity: 1;--tw-ring-color: rgb(85 61 233 / var(--tw-ring-opacity, 1))}.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)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.placeholder\:text-\[\#939084\]::-moz-placeholder{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.placeholder\:text-\[\#939084\]::placeholder{--tw-text-opacity: 1;color:rgb(147 144 132 / var(--tw-text-opacity, 1))}.placeholder\:text-primary\/60::-moz-placeholder{color:#553de999}.placeholder\:text-primary\/60::placeholder{color:#553de999}.hover\:border-primary\/30:hover{border-color:#553de94d}.hover\:bg-\[\#4432c4\]:hover{--tw-bg-opacity: 1;background-color:rgb(68 50 196 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#553DE9\]\/5:hover{background-color:#553de90d}.hover\:bg-\[\#553DE9\]\/90:hover{background-color:#553de9e6}.hover\:bg-\[\#C45B5B\]\/20:hover{background-color:#c45b5b33}.hover\:bg-\[\#E8E4FD\]:hover{--tw-bg-opacity: 1;background-color:rgb(232 228 253 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#ECEAE3\]:hover{--tw-bg-opacity: 1;background-color:rgb(236 234 227 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#F8F4F0\]:hover{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.hover\:bg-card:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-danger\/10:hover{background-color:#c45b5b1a}.hover\:bg-danger\/20:hover{background-color:#c45b5b33}.hover\:bg-hover:hover{--tw-bg-opacity: 1;background-color:rgb(248 244 240 / var(--tw-bg-opacity, 1))}.hover\:bg-primary\/20:hover{background-color:#553de933}.hover\:bg-primary\/30:hover{background-color:#553de94d}.hover\:bg-primary\/5:hover{background-color:#553de90d}.hover\:bg-primary\/90:hover{background-color:#553de9e6}.hover\:bg-warning\/10:hover{background-color:#d4a03c1a}.hover\:text-\[\#36342E\]:hover{--tw-text-opacity: 1;color:rgb(54 52 46 / var(--tw-text-opacity, 1))}.hover\:text-danger:hover{--tw-text-opacity: 1;color:rgb(196 91 91 / var(--tw-text-opacity, 1))}.hover\:text-ink:hover{--tw-text-opacity: 1;color:rgb(32 21 21 / var(--tw-text-opacity, 1))}.hover\:text-primary:hover{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.hover\:text-primary\/80:hover{color:#553de9cc}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-card-hover:hover{--tw-shadow: 0 5px 10px rgba(0,0,0,.08);--tw-shadow-colored: 0 5px 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:absolute:focus{position:absolute}.focus\:left-2:focus{left:.5rem}.focus\:top-2:focus{top:.5rem}.focus\:z-50:focus{z-index:50}.focus\:rounded-\[3px\]:focus{border-radius:3px}.focus\:border-\[\#553DE9\]:focus{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.focus\:border-primary:focus{--tw-border-opacity: 1;border-color:rgb(85 61 233 / var(--tw-border-opacity, 1))}.focus\:border-primary\/30:focus{border-color:#553de94d}.focus\:bg-white:focus{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.focus\:px-4:focus{padding-left:1rem;padding-right:1rem}.focus\:py-2:focus{padding-top:.5rem;padding-bottom:.5rem}.focus\:text-\[\#553DE9\]:focus{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.focus\:shadow-card:focus{--tw-shadow: 0 1px 3px rgba(0,0,0,.06);--tw-shadow-colored: 0 1px 3px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);--tw-shadow-color: #FFFFFF;--tw-shadow: var(--tw-shadow-colored)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[\#553DE9\]\/20:focus{--tw-ring-color: rgb(85 61 233 / .2)}.focus\:ring-primary\/20:focus{--tw-ring-color: rgb(85 61 233 / .2)}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-primary{--tw-text-opacity: 1;color:rgb(85 61 233 / var(--tw-text-opacity, 1))}.group\/file:hover .group-hover\/file\:opacity-100{opacity:1}@media(prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
package/web-app/dist/index.html
CHANGED
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
<title>Purple Lab -- Powered by Loki Mode</title>
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
|
-
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
10
|
+
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-ABzvlaPu.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-C-IWanPu.css">
|
|
13
13
|
</head>
|
|
14
|
-
<body class="bg-background text-
|
|
14
|
+
<body class="bg-background text-ink font-sans antialiased">
|
|
15
15
|
<div id="root"></div>
|
|
16
16
|
</body>
|
|
17
17
|
</html>
|
package/web-app/server.py
CHANGED
|
@@ -109,6 +109,44 @@ class SessionState:
|
|
|
109
109
|
self.log_lines = []
|
|
110
110
|
|
|
111
111
|
|
|
112
|
+
def _kill_orphan_loki_processes(project_dir: str = "") -> None:
|
|
113
|
+
"""Kill any orphaned loki-run processes."""
|
|
114
|
+
import subprocess as _sp
|
|
115
|
+
patterns: list[str] = []
|
|
116
|
+
if project_dir:
|
|
117
|
+
patterns.append(f"loki-run.*{project_dir}")
|
|
118
|
+
patterns.append("loki-run-")
|
|
119
|
+
|
|
120
|
+
killed_pids: set[int] = set()
|
|
121
|
+
for pattern in patterns:
|
|
122
|
+
try:
|
|
123
|
+
result = _sp.run(
|
|
124
|
+
["pgrep", "-f", pattern],
|
|
125
|
+
capture_output=True, text=True, timeout=5,
|
|
126
|
+
)
|
|
127
|
+
if result.returncode == 0:
|
|
128
|
+
for pid_str in result.stdout.strip().splitlines():
|
|
129
|
+
try:
|
|
130
|
+
pid = int(pid_str.strip())
|
|
131
|
+
if pid not in killed_pids:
|
|
132
|
+
os.kill(pid, signal.SIGTERM)
|
|
133
|
+
killed_pids.add(pid)
|
|
134
|
+
except (ValueError, ProcessLookupError, PermissionError):
|
|
135
|
+
pass
|
|
136
|
+
except Exception:
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
# Wait briefly then SIGKILL any survivors
|
|
140
|
+
if killed_pids:
|
|
141
|
+
import time as _time
|
|
142
|
+
_time.sleep(2)
|
|
143
|
+
for pid in killed_pids:
|
|
144
|
+
try:
|
|
145
|
+
os.kill(pid, signal.SIGKILL)
|
|
146
|
+
except (ProcessLookupError, PermissionError, OSError):
|
|
147
|
+
pass
|
|
148
|
+
|
|
149
|
+
|
|
112
150
|
session = SessionState()
|
|
113
151
|
|
|
114
152
|
# ---------------------------------------------------------------------------
|
|
@@ -160,6 +198,11 @@ class DirectoryCreateRequest(BaseModel):
|
|
|
160
198
|
class FileDeleteRequest(BaseModel):
|
|
161
199
|
path: str
|
|
162
200
|
|
|
201
|
+
|
|
202
|
+
class ChatRequest(BaseModel):
|
|
203
|
+
message: str
|
|
204
|
+
mode: str = "quick" # "quick" or "standard"
|
|
205
|
+
|
|
163
206
|
# ---------------------------------------------------------------------------
|
|
164
207
|
# Helpers
|
|
165
208
|
# ---------------------------------------------------------------------------
|
|
@@ -197,6 +240,20 @@ def _safe_resolve(base: Path, requested: str) -> Optional[Path]:
|
|
|
197
240
|
return None
|
|
198
241
|
|
|
199
242
|
|
|
243
|
+
def _find_session_dir(session_id: str) -> Optional[Path]:
|
|
244
|
+
"""Find a session's project directory by ID."""
|
|
245
|
+
search_dirs = [
|
|
246
|
+
Path.home() / "purple-lab-projects",
|
|
247
|
+
Path.home() / ".loki-sessions",
|
|
248
|
+
Path.home() / ".loki" / "sessions",
|
|
249
|
+
]
|
|
250
|
+
for base_dir in search_dirs:
|
|
251
|
+
candidate = base_dir / session_id
|
|
252
|
+
if candidate.is_dir():
|
|
253
|
+
return candidate
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
|
|
200
257
|
async def _broadcast(msg: dict) -> None:
|
|
201
258
|
"""Send a JSON message to all connected WebSocket clients."""
|
|
202
259
|
data = json.dumps(msg)
|
|
@@ -425,11 +482,68 @@ async def stop_session() -> JSONResponse:
|
|
|
425
482
|
except Exception:
|
|
426
483
|
pass
|
|
427
484
|
|
|
485
|
+
# Kill any orphaned loki-run processes for this project
|
|
486
|
+
if session.project_dir:
|
|
487
|
+
_kill_orphan_loki_processes(session.project_dir)
|
|
488
|
+
|
|
428
489
|
await _broadcast({"type": "session_end", "data": {"message": "Session stopped by user"}})
|
|
429
490
|
|
|
430
491
|
return JSONResponse(content={"stopped": True, "message": "Session stopped"})
|
|
431
492
|
|
|
432
493
|
|
|
494
|
+
@app.on_event("shutdown")
|
|
495
|
+
async def shutdown_event():
|
|
496
|
+
"""Clean up any running session when Purple Lab shuts down."""
|
|
497
|
+
if not session.running or session.process is None:
|
|
498
|
+
return
|
|
499
|
+
|
|
500
|
+
project_dir = session.project_dir
|
|
501
|
+
session.running = False
|
|
502
|
+
await session.cleanup()
|
|
503
|
+
|
|
504
|
+
proc = session.process
|
|
505
|
+
if proc and proc.poll() is None:
|
|
506
|
+
if sys.platform != "win32":
|
|
507
|
+
try:
|
|
508
|
+
pgid = os.getpgid(proc.pid)
|
|
509
|
+
os.killpg(pgid, signal.SIGTERM)
|
|
510
|
+
except (ProcessLookupError, PermissionError, OSError):
|
|
511
|
+
try:
|
|
512
|
+
proc.terminate()
|
|
513
|
+
except Exception:
|
|
514
|
+
pass
|
|
515
|
+
else:
|
|
516
|
+
try:
|
|
517
|
+
proc.terminate()
|
|
518
|
+
except Exception:
|
|
519
|
+
pass
|
|
520
|
+
try:
|
|
521
|
+
proc.wait(timeout=5)
|
|
522
|
+
except subprocess.TimeoutExpired:
|
|
523
|
+
if sys.platform != "win32":
|
|
524
|
+
try:
|
|
525
|
+
pgid = os.getpgid(proc.pid)
|
|
526
|
+
os.killpg(pgid, signal.SIGKILL)
|
|
527
|
+
except (ProcessLookupError, PermissionError, OSError):
|
|
528
|
+
try:
|
|
529
|
+
proc.kill()
|
|
530
|
+
except Exception:
|
|
531
|
+
pass
|
|
532
|
+
else:
|
|
533
|
+
try:
|
|
534
|
+
proc.kill()
|
|
535
|
+
except Exception:
|
|
536
|
+
pass
|
|
537
|
+
try:
|
|
538
|
+
proc.wait(timeout=3)
|
|
539
|
+
except Exception:
|
|
540
|
+
pass
|
|
541
|
+
|
|
542
|
+
# Kill any orphaned loki-run processes for this project
|
|
543
|
+
if project_dir:
|
|
544
|
+
_kill_orphan_loki_processes(project_dir)
|
|
545
|
+
|
|
546
|
+
|
|
433
547
|
@app.get("/api/session/status")
|
|
434
548
|
async def get_status() -> JSONResponse:
|
|
435
549
|
"""Get current session status."""
|
|
@@ -649,15 +763,43 @@ async def resume_session() -> JSONResponse:
|
|
|
649
763
|
|
|
650
764
|
@app.get("/api/templates")
|
|
651
765
|
async def get_templates() -> JSONResponse:
|
|
652
|
-
"""List available PRD templates."""
|
|
766
|
+
"""List available PRD templates with description and category."""
|
|
653
767
|
templates_dir = PROJECT_ROOT / "templates"
|
|
654
768
|
if not templates_dir.is_dir():
|
|
655
769
|
return JSONResponse(content=[])
|
|
656
770
|
|
|
771
|
+
# Category mapping from filename
|
|
772
|
+
_category_map = {
|
|
773
|
+
'static-landing-page': 'Website', 'blog-platform': 'Website', 'e-commerce': 'Website',
|
|
774
|
+
'full-stack-demo': 'Website', 'dashboard': 'Website',
|
|
775
|
+
'rest-api': 'API', 'rest-api-auth': 'API', 'api-only': 'API', 'microservice': 'API',
|
|
776
|
+
'cli-tool': 'CLI', 'npm-library': 'CLI',
|
|
777
|
+
'discord-bot': 'Bot', 'slack-bot': 'Bot', 'ai-chatbot': 'Bot',
|
|
778
|
+
'data-pipeline': 'Data', 'web-scraper': 'Data',
|
|
779
|
+
}
|
|
780
|
+
|
|
657
781
|
templates = []
|
|
658
782
|
for f in sorted(templates_dir.glob("*.md")):
|
|
659
783
|
name = f.stem.replace("-", " ").replace("_", " ").title()
|
|
660
|
-
|
|
784
|
+
# Extract description: first non-heading, non-blank paragraph
|
|
785
|
+
description = ""
|
|
786
|
+
try:
|
|
787
|
+
text = f.read_text(errors="replace")
|
|
788
|
+
for line in text.splitlines():
|
|
789
|
+
stripped = line.strip()
|
|
790
|
+
if not stripped or stripped.startswith("#"):
|
|
791
|
+
continue
|
|
792
|
+
description = stripped[:200]
|
|
793
|
+
break
|
|
794
|
+
except OSError:
|
|
795
|
+
pass
|
|
796
|
+
category = _category_map.get(f.stem, "Other")
|
|
797
|
+
templates.append({
|
|
798
|
+
"name": name,
|
|
799
|
+
"filename": f.name,
|
|
800
|
+
"description": description,
|
|
801
|
+
"category": category,
|
|
802
|
+
})
|
|
661
803
|
return JSONResponse(content=templates)
|
|
662
804
|
|
|
663
805
|
|
|
@@ -1405,6 +1547,114 @@ async def onboard_session(req: OnboardRequest) -> JSONResponse:
|
|
|
1405
1547
|
})
|
|
1406
1548
|
|
|
1407
1549
|
|
|
1550
|
+
# ---------------------------------------------------------------------------
|
|
1551
|
+
# CLI feature endpoints (chat, review, test, explain, export)
|
|
1552
|
+
# ---------------------------------------------------------------------------
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
@app.post("/api/sessions/{session_id}/chat")
|
|
1556
|
+
async def chat_session(session_id: str, req: ChatRequest) -> JSONResponse:
|
|
1557
|
+
"""Run iterative chat command on a project."""
|
|
1558
|
+
import re
|
|
1559
|
+
if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
|
|
1560
|
+
return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
|
|
1561
|
+
|
|
1562
|
+
# Find project directory
|
|
1563
|
+
target = _find_session_dir(session_id)
|
|
1564
|
+
|
|
1565
|
+
if target is None:
|
|
1566
|
+
return JSONResponse(status_code=404, content={"error": "Session not found"})
|
|
1567
|
+
|
|
1568
|
+
# Build command based on mode
|
|
1569
|
+
if req.mode == "quick":
|
|
1570
|
+
cmd_args = ["quick", req.message]
|
|
1571
|
+
else:
|
|
1572
|
+
cmd_args = ["start", "--provider", "claude", str(target / "PRD.md")]
|
|
1573
|
+
|
|
1574
|
+
rc, output = await asyncio.get_running_loop().run_in_executor(
|
|
1575
|
+
None, lambda: _run_loki_cmd(cmd_args, cwd=str(target), timeout=300)
|
|
1576
|
+
)
|
|
1577
|
+
|
|
1578
|
+
# Detect changed files
|
|
1579
|
+
files_changed: list[str] = []
|
|
1580
|
+
try:
|
|
1581
|
+
import subprocess as _sp
|
|
1582
|
+
result = _sp.run(
|
|
1583
|
+
["git", "diff", "--name-only", "HEAD~1"],
|
|
1584
|
+
cwd=str(target), capture_output=True, text=True, timeout=10
|
|
1585
|
+
)
|
|
1586
|
+
if result.returncode == 0:
|
|
1587
|
+
files_changed = [f for f in result.stdout.strip().splitlines() if f]
|
|
1588
|
+
except Exception:
|
|
1589
|
+
pass
|
|
1590
|
+
|
|
1591
|
+
return JSONResponse(content={
|
|
1592
|
+
"output": output,
|
|
1593
|
+
"files_changed": files_changed,
|
|
1594
|
+
"returncode": rc,
|
|
1595
|
+
})
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
@app.post("/api/sessions/{session_id}/review")
|
|
1599
|
+
async def review_session(session_id: str) -> JSONResponse:
|
|
1600
|
+
"""Run loki review on a project."""
|
|
1601
|
+
import re
|
|
1602
|
+
if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
|
|
1603
|
+
return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
|
|
1604
|
+
target = _find_session_dir(session_id)
|
|
1605
|
+
if target is None:
|
|
1606
|
+
return JSONResponse(status_code=404, content={"error": "Session not found"})
|
|
1607
|
+
rc, output = await asyncio.get_running_loop().run_in_executor(
|
|
1608
|
+
None, lambda: _run_loki_cmd(["review", str(target)], cwd=str(target), timeout=120)
|
|
1609
|
+
)
|
|
1610
|
+
return JSONResponse(content={"output": output, "returncode": rc})
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
@app.post("/api/sessions/{session_id}/test")
|
|
1614
|
+
async def test_session(session_id: str) -> JSONResponse:
|
|
1615
|
+
"""Run loki test on a project."""
|
|
1616
|
+
import re
|
|
1617
|
+
if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
|
|
1618
|
+
return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
|
|
1619
|
+
target = _find_session_dir(session_id)
|
|
1620
|
+
if target is None:
|
|
1621
|
+
return JSONResponse(status_code=404, content={"error": "Session not found"})
|
|
1622
|
+
rc, output = await asyncio.get_running_loop().run_in_executor(
|
|
1623
|
+
None, lambda: _run_loki_cmd(["test", "--dir", str(target)], cwd=str(target), timeout=120)
|
|
1624
|
+
)
|
|
1625
|
+
return JSONResponse(content={"output": output, "returncode": rc})
|
|
1626
|
+
|
|
1627
|
+
|
|
1628
|
+
@app.post("/api/sessions/{session_id}/explain")
|
|
1629
|
+
async def explain_session(session_id: str) -> JSONResponse:
|
|
1630
|
+
"""Run loki explain on a project."""
|
|
1631
|
+
import re
|
|
1632
|
+
if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
|
|
1633
|
+
return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
|
|
1634
|
+
target = _find_session_dir(session_id)
|
|
1635
|
+
if target is None:
|
|
1636
|
+
return JSONResponse(status_code=404, content={"error": "Session not found"})
|
|
1637
|
+
rc, output = await asyncio.get_running_loop().run_in_executor(
|
|
1638
|
+
None, lambda: _run_loki_cmd(["explain", str(target)], cwd=str(target), timeout=120)
|
|
1639
|
+
)
|
|
1640
|
+
return JSONResponse(content={"output": output, "returncode": rc})
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
@app.post("/api/sessions/{session_id}/export")
|
|
1644
|
+
async def export_session(session_id: str) -> JSONResponse:
|
|
1645
|
+
"""Run loki export json on a project."""
|
|
1646
|
+
import re
|
|
1647
|
+
if not re.match(r"^[a-zA-Z0-9._-]+$", session_id):
|
|
1648
|
+
return JSONResponse(status_code=400, content={"error": "Invalid session ID"})
|
|
1649
|
+
target = _find_session_dir(session_id)
|
|
1650
|
+
if target is None:
|
|
1651
|
+
return JSONResponse(status_code=404, content={"error": "Session not found"})
|
|
1652
|
+
rc, output = await asyncio.get_running_loop().run_in_executor(
|
|
1653
|
+
None, lambda: _run_loki_cmd(["export", "json"], cwd=str(target), timeout=60)
|
|
1654
|
+
)
|
|
1655
|
+
return JSONResponse(content={"output": output, "returncode": rc})
|
|
1656
|
+
|
|
1657
|
+
|
|
1408
1658
|
# ---------------------------------------------------------------------------
|
|
1409
1659
|
# Health check
|
|
1410
1660
|
# ---------------------------------------------------------------------------
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
var Ye=e=>{throw TypeError(e)};var _e=(e,t,n)=>t.has(e)||Ye("Cannot "+n);var ge=(e,t,n)=>(_e(e,t,"read from private field"),n?n.call(e):t.get(e)),Je=(e,t,n)=>t.has(e)?Ye("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),Ke=(e,t,n,r)=>(_e(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n);import{r as f,W as de,j as m,a as K,u as Kt,b as Qt,H as Re,E as Zt}from"./index-Bp-tGwIG.js";function Qe(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function en(e){if(Array.isArray(e))return e}function tn(e,t,n){return(t=cn(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function nn(e,t){var n=e==null?null:typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(n!=null){var r,o,a,l,i=[],s=!0,c=!1;try{if(a=(n=n.call(e)).next,t!==0)for(;!(s=(r=a.call(n)).done)&&(i.push(r.value),i.length!==t);s=!0);}catch(u){c=!0,o=u}finally{try{if(!s&&n.return!=null&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw o}}return i}}function rn(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
2
|
-
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Ze(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function et(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?Ze(Object(n),!0).forEach(function(r){tn(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ze(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function on(e,t){if(e==null)return{};var n,r,o=an(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function an(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function sn(e,t){return en(e)||nn(e,t)||un(e,t)||rn()}function ln(e,t){if(typeof e!="object"||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function cn(e){var t=ln(e,"string");return typeof t=="symbol"?t:t+""}function un(e,t){if(e){if(typeof e=="string")return Qe(e,t);var n={}.toString.call(e).slice(8,-1);return n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set"?Array.from(e):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Qe(e,t):void 0}}function dn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function tt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function nt(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?tt(Object(n),!0).forEach(function(r){dn(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):tt(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function fn(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(r){return t.reduceRight(function(o,a){return a(o)},r)}}function me(e){return function t(){for(var n=this,r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];return o.length>=e.length?e.apply(this,o):function(){for(var l=arguments.length,i=new Array(l),s=0;s<l;s++)i[s]=arguments[s];return t.apply(n,[].concat(o,i))}}}function Le(e){return{}.toString.call(e).includes("Object")}function pn(e){return!Object.keys(e).length}function ye(e){return typeof e=="function"}function hn(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function gn(e,t){return Le(t)||Z("changeType"),Object.keys(t).some(function(n){return!hn(e,n)})&&Z("changeField"),t}function mn(e){ye(e)||Z("selectorType")}function vn(e){ye(e)||Le(e)||Z("handlerType"),Le(e)&&Object.values(e).some(function(t){return!ye(t)})&&Z("handlersType")}function xn(e){e||Z("initialIsRequired"),Le(e)||Z("initialType"),pn(e)&&Z("initialContent")}function bn(e,t){throw new Error(e[t]||e.default)}var yn={initialIsRequired:"initial state is required",initialType:"initial state should be an object",initialContent:"initial state shouldn't be an empty object",handlerType:"handler should be an object or a function",handlersType:"all handlers should be a functions",selectorType:"selector should be a function",changeType:"provided value of changes should be an object",changeField:'it seams you want to change a field in the state which is not specified in the "initial" state',default:"an unknown error accured in `state-local` package"},Z=me(bn)(yn),ze={changes:gn,selector:mn,handler:vn,initial:xn};function wn(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};ze.initial(e),ze.handler(t);var n={current:e},r=me(jn)(n,t),o=me(zn)(n),a=me(ze.changes)(e),l=me(Sn)(n);function i(){var c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(u){return u};return ze.selector(c),c(n.current)}function s(c){fn(r,o,a,l)(c)}return[i,s]}function Sn(e,t){return ye(t)?t(e.current):t}function zn(e,t){return e.current=nt(nt({},e.current),t),t}function jn(e,t,n){return ye(t)?t(e.current):Object.keys(n).forEach(function(r){var o;return(o=t[r])===null||o===void 0?void 0:o.call(t,e.current[r])}),n}var Cn={create:wn},Pn={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs"}};function En(e){return function t(){for(var n=this,r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];return o.length>=e.length?e.apply(this,o):function(){for(var l=arguments.length,i=new Array(l),s=0;s<l;s++)i[s]=arguments[s];return t.apply(n,[].concat(o,i))}}}function Mn(e){return{}.toString.call(e).includes("Object")}function Ln(e){return e||rt("configIsRequired"),Mn(e)||rt("configType"),e.urls?(kn(),{paths:{vs:e.urls.monacoBase}}):e}function kn(){console.warn(yt.deprecation)}function On(e,t){throw new Error(e[t]||e.default)}var yt={configIsRequired:"the configuration object is required",configType:"the configuration object should be an object",default:"an unknown error accured in `@monaco-editor/loader` package",deprecation:`Deprecation warning!
|
|
3
|
-
You are using deprecated way of configuration.
|
|
4
|
-
|
|
5
|
-
Instead of using
|
|
6
|
-
monaco.config({ urls: { monacoBase: '...' } })
|
|
7
|
-
use
|
|
8
|
-
monaco.config({ paths: { vs: '...' } })
|
|
9
|
-
|
|
10
|
-
For more please check the link https://github.com/suren-atoyan/monaco-loader#config
|
|
11
|
-
`},rt=En(On)(yt),Rn={config:Ln},Nn=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(o){return n.reduceRight(function(a,l){return l(a)},o)}};function wt(e,t){return Object.keys(t).forEach(function(n){t[n]instanceof Object&&e[n]&&Object.assign(t[n],wt(e[n],t[n]))}),et(et({},e),t)}var Dn={type:"cancelation",msg:"operation is manually canceled"};function Ne(e){var t=!1,n=new Promise(function(r,o){e.then(function(a){return t?o(Dn):r(a)}),e.catch(o)});return n.cancel=function(){return t=!0},n}var In=["monaco"],$n=Cn.create({config:Pn,isInitialized:!1,resolve:null,reject:null,monaco:null}),St=sn($n,2),Se=St[0],ke=St[1];function Tn(e){var t=Rn.config(e),n=t.monaco,r=on(t,In);ke(function(o){return{config:wt(o.config,r),monaco:n}})}function Fn(){var e=Se(function(t){var n=t.monaco,r=t.isInitialized,o=t.resolve;return{monaco:n,isInitialized:r,resolve:o}});if(!e.isInitialized){if(ke({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),Ne(De);if(window.monaco&&window.monaco.editor)return zt(window.monaco),e.resolve(window.monaco),Ne(De);Nn(An,Wn)(Hn)}return Ne(De)}function An(e){return document.body.appendChild(e)}function Bn(e){var t=document.createElement("script");return e&&(t.src=e),t}function Wn(e){var t=Se(function(r){var o=r.config,a=r.reject;return{config:o,reject:a}}),n=Bn("".concat(t.config.paths.vs,"/loader.js"));return n.onload=function(){return e()},n.onerror=t.reject,n}function Hn(){var e=Se(function(n){var r=n.config,o=n.resolve,a=n.reject;return{config:r,resolve:o,reject:a}}),t=window.require;t.config(e.config),t(["vs/editor/editor.main"],function(n){var r=n.m||n;zt(r),e.resolve(r)},function(n){e.reject(n)})}function zt(e){Se().monaco||ke({monaco:e})}function Vn(){return Se(function(e){var t=e.monaco;return t})}var De=new Promise(function(e,t){return ke({resolve:e,reject:t})}),jt={config:Tn,init:Fn,__getMonacoInstance:Vn},Gn={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}},Ie=Gn,Un={container:{display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"}},qn=Un;function Xn({children:e}){return de.createElement("div",{style:qn.container},e)}var Yn=Xn,_n=Yn;function Jn({width:e,height:t,isEditorReady:n,loading:r,_ref:o,className:a,wrapperProps:l}){return de.createElement("section",{style:{...Ie.wrapper,width:e,height:t},...l},!n&&de.createElement(_n,null,r),de.createElement("div",{ref:o,style:{...Ie.fullWidth,...!n&&Ie.hide},className:a}))}var Kn=Jn,Ct=f.memo(Kn);function Qn(e){f.useEffect(e,[])}var Pt=Qn;function Zn(e,t,n=!0){let r=f.useRef(!0);f.useEffect(r.current||!n?()=>{r.current=!1}:e,t)}var U=Zn;function xe(){}function ce(e,t,n,r){return er(e,r)||tr(e,t,n,r)}function er(e,t){return e.editor.getModel(Et(e,t))}function tr(e,t,n,r){return e.editor.createModel(t,n,r?Et(e,r):void 0)}function Et(e,t){return e.Uri.parse(t)}function nr({original:e,modified:t,language:n,originalLanguage:r,modifiedLanguage:o,originalModelPath:a,modifiedModelPath:l,keepCurrentOriginalModel:i=!1,keepCurrentModifiedModel:s=!1,theme:c="light",loading:u="Loading...",options:v={},height:p="100%",width:L="100%",className:y,wrapperProps:h={},beforeMount:b=xe,onMount:x=xe}){let[d,S]=f.useState(!1),[w,g]=f.useState(!0),C=f.useRef(null),j=f.useRef(null),N=f.useRef(null),F=f.useRef(x),k=f.useRef(b),P=f.useRef(!1);Pt(()=>{let z=jt.init();return z.then(R=>(j.current=R)&&g(!1)).catch(R=>(R==null?void 0:R.type)!=="cancelation"&&console.error("Monaco initialization: error:",R)),()=>C.current?A():z.cancel()}),U(()=>{if(C.current&&j.current){let z=C.current.getOriginalEditor(),R=ce(j.current,e||"",r||n||"text",a||"");R!==z.getModel()&&z.setModel(R)}},[a],d),U(()=>{if(C.current&&j.current){let z=C.current.getModifiedEditor(),R=ce(j.current,t||"",o||n||"text",l||"");R!==z.getModel()&&z.setModel(R)}},[l],d),U(()=>{let z=C.current.getModifiedEditor();z.getOption(j.current.editor.EditorOption.readOnly)?z.setValue(t||""):t!==z.getValue()&&(z.executeEdits("",[{range:z.getModel().getFullModelRange(),text:t||"",forceMoveMarkers:!0}]),z.pushUndoStop())},[t],d),U(()=>{var z,R;(R=(z=C.current)==null?void 0:z.getModel())==null||R.original.setValue(e||"")},[e],d),U(()=>{let{original:z,modified:R}=C.current.getModel();j.current.editor.setModelLanguage(z,r||n||"text"),j.current.editor.setModelLanguage(R,o||n||"text")},[n,r,o],d),U(()=>{var z;(z=j.current)==null||z.editor.setTheme(c)},[c],d),U(()=>{var z;(z=C.current)==null||z.updateOptions(v)},[v],d);let M=f.useCallback(()=>{var W;if(!j.current)return;k.current(j.current);let z=ce(j.current,e||"",r||n||"text",a||""),R=ce(j.current,t||"",o||n||"text",l||"");(W=C.current)==null||W.setModel({original:z,modified:R})},[n,t,o,e,r,a,l]),D=f.useCallback(()=>{var z;!P.current&&N.current&&(C.current=j.current.editor.createDiffEditor(N.current,{automaticLayout:!0,...v}),M(),(z=j.current)==null||z.editor.setTheme(c),S(!0),P.current=!0)},[v,c,M]);f.useEffect(()=>{d&&F.current(C.current,j.current)},[d]),f.useEffect(()=>{!w&&!d&&D()},[w,d,D]);function A(){var R,W,E,T;let z=(R=C.current)==null?void 0:R.getModel();i||((W=z==null?void 0:z.original)==null||W.dispose()),s||((E=z==null?void 0:z.modified)==null||E.dispose()),(T=C.current)==null||T.dispose()}return de.createElement(Ct,{width:L,height:p,isEditorReady:d,loading:u,_ref:N,className:y,wrapperProps:h})}var rr=nr;f.memo(rr);function or(e){let t=f.useRef();return f.useEffect(()=>{t.current=e},[e]),t.current}var ir=or,je=new Map;function ar({defaultValue:e,defaultLanguage:t,defaultPath:n,value:r,language:o,path:a,theme:l="light",line:i,loading:s="Loading...",options:c={},overrideServices:u={},saveViewState:v=!0,keepCurrentModel:p=!1,width:L="100%",height:y="100%",className:h,wrapperProps:b={},beforeMount:x=xe,onMount:d=xe,onChange:S,onValidate:w=xe}){let[g,C]=f.useState(!1),[j,N]=f.useState(!0),F=f.useRef(null),k=f.useRef(null),P=f.useRef(null),M=f.useRef(d),D=f.useRef(x),A=f.useRef(),z=f.useRef(r),R=ir(a),W=f.useRef(!1),E=f.useRef(!1);Pt(()=>{let O=jt.init();return O.then(I=>(F.current=I)&&N(!1)).catch(I=>(I==null?void 0:I.type)!=="cancelation"&&console.error("Monaco initialization: error:",I)),()=>k.current?H():O.cancel()}),U(()=>{var I,B,te,J;let O=ce(F.current,e||r||"",t||o||"",a||n||"");O!==((I=k.current)==null?void 0:I.getModel())&&(v&&je.set(R,(B=k.current)==null?void 0:B.saveViewState()),(te=k.current)==null||te.setModel(O),v&&((J=k.current)==null||J.restoreViewState(je.get(a))))},[a],g),U(()=>{var O;(O=k.current)==null||O.updateOptions(c)},[c],g),U(()=>{!k.current||r===void 0||(k.current.getOption(F.current.editor.EditorOption.readOnly)?k.current.setValue(r):r!==k.current.getValue()&&(E.current=!0,k.current.executeEdits("",[{range:k.current.getModel().getFullModelRange(),text:r,forceMoveMarkers:!0}]),k.current.pushUndoStop(),E.current=!1))},[r],g),U(()=>{var I,B;let O=(I=k.current)==null?void 0:I.getModel();O&&o&&((B=F.current)==null||B.editor.setModelLanguage(O,o))},[o],g),U(()=>{var O;i!==void 0&&((O=k.current)==null||O.revealLine(i))},[i],g),U(()=>{var O;(O=F.current)==null||O.editor.setTheme(l)},[l],g);let T=f.useCallback(()=>{var O;if(!(!P.current||!F.current)&&!W.current){D.current(F.current);let I=a||n,B=ce(F.current,r||e||"",t||o||"",I||"");k.current=(O=F.current)==null?void 0:O.editor.create(P.current,{model:B,automaticLayout:!0,...c},u),v&&k.current.restoreViewState(je.get(I)),F.current.editor.setTheme(l),i!==void 0&&k.current.revealLine(i),C(!0),W.current=!0}},[e,t,n,r,o,a,c,u,v,l,i]);f.useEffect(()=>{g&&M.current(k.current,F.current)},[g]),f.useEffect(()=>{!j&&!g&&T()},[j,g,T]),z.current=r,f.useEffect(()=>{var O,I;g&&S&&((O=A.current)==null||O.dispose(),A.current=(I=k.current)==null?void 0:I.onDidChangeModelContent(B=>{E.current||S(k.current.getValue(),B)}))},[g,S]),f.useEffect(()=>{if(g){let O=F.current.editor.onDidChangeMarkers(I=>{var te;let B=(te=k.current.getModel())==null?void 0:te.uri;if(B&&I.find(J=>J.path===B.path)){let J=F.current.editor.getModelMarkers({resource:B});w==null||w(J)}});return()=>{O==null||O.dispose()}}return()=>{}},[g,w]);function H(){var O,I;(O=A.current)==null||O.dispose(),p?v&&je.set(a,k.current.saveViewState()):(I=k.current.getModel())==null||I.dispose(),k.current.dispose()}return de.createElement(Ct,{width:L,height:y,isEditorReady:g,loading:s,_ref:P,className:h,wrapperProps:b})}var sr=ar,lr=f.memo(sr),cr=lr;function ur(e,t){const n=getComputedStyle(e),r=parseFloat(n.fontSize);return t*r}function dr(e,t){const n=getComputedStyle(e.ownerDocument.body),r=parseFloat(n.fontSize);return t*r}function fr(e){return e/100*window.innerHeight}function pr(e){return e/100*window.innerWidth}function hr(e){switch(typeof e){case"number":return[e,"px"];case"string":{const t=parseFloat(e);return e.endsWith("%")?[t,"%"]:e.endsWith("px")?[t,"px"]:e.endsWith("rem")?[t,"rem"]:e.endsWith("em")?[t,"em"]:e.endsWith("vh")?[t,"vh"]:e.endsWith("vw")?[t,"vw"]:[t,"%"]}}}function ve({groupSize:e,panelElement:t,styleProp:n}){let r;const[o,a]=hr(n);switch(a){case"%":{r=o/100*e;break}case"px":{r=o;break}case"rem":{r=dr(t,o);break}case"em":{r=ur(t,o);break}case"vh":{r=fr(o);break}case"vw":{r=pr(o);break}}return r}function G(e){return parseFloat(e.toFixed(3))}function he({group:e}){const{orientation:t,panels:n}=e;return n.reduce((r,o)=>(r+=t==="horizontal"?o.element.offsetWidth:o.element.offsetHeight,r),0)}function Te(e){const{panels:t}=e,n=he({group:e});return n===0?t.map(r=>({groupResizeBehavior:r.panelConstraints.groupResizeBehavior,collapsedSize:0,collapsible:r.panelConstraints.collapsible===!0,defaultSize:void 0,disabled:r.panelConstraints.disabled,minSize:0,maxSize:100,panelId:r.id})):t.map(r=>{const{element:o,panelConstraints:a}=r;let l=0;if(a.collapsedSize!==void 0){const u=ve({groupSize:n,panelElement:o,styleProp:a.collapsedSize});l=G(u/n*100)}let i;if(a.defaultSize!==void 0){const u=ve({groupSize:n,panelElement:o,styleProp:a.defaultSize});i=G(u/n*100)}let s=0;if(a.minSize!==void 0){const u=ve({groupSize:n,panelElement:o,styleProp:a.minSize});s=G(u/n*100)}let c=100;if(a.maxSize!==void 0){const u=ve({groupSize:n,panelElement:o,styleProp:a.maxSize});c=G(u/n*100)}return{groupResizeBehavior:a.groupResizeBehavior,collapsedSize:l,collapsible:a.collapsible===!0,defaultSize:i,disabled:a.disabled,minSize:s,maxSize:c,panelId:r.id}})}function $(e,t="Assertion error"){if(!e)throw Error(t)}function Fe(e,t){return Array.from(t).sort(e==="horizontal"?gr:mr)}function gr(e,t){const n=e.element.offsetLeft-t.element.offsetLeft;return n!==0?n:e.element.offsetWidth-t.element.offsetWidth}function mr(e,t){const n=e.element.offsetTop-t.element.offsetTop;return n!==0?n:e.element.offsetHeight-t.element.offsetHeight}function Mt(e){return e!==null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function Lt(e,t){return{x:e.x>=t.left&&e.x<=t.right?0:Math.min(Math.abs(e.x-t.left),Math.abs(e.x-t.right)),y:e.y>=t.top&&e.y<=t.bottom?0:Math.min(Math.abs(e.y-t.top),Math.abs(e.y-t.bottom))}}function vr({orientation:e,rects:t,targetRect:n}){const r={x:n.x+n.width/2,y:n.y+n.height/2};let o,a=Number.MAX_VALUE;for(const l of t){const{x:i,y:s}=Lt(r,l),c=e==="horizontal"?i:s;c<a&&(a=c,o=l)}return $(o,"No rect found"),o}let Ce;function xr(){return Ce===void 0&&(typeof matchMedia=="function"?Ce=!!matchMedia("(pointer:coarse)").matches:Ce=!1),Ce}function kt(e){const{element:t,orientation:n,panels:r,separators:o}=e,a=Fe(n,Array.from(t.children).filter(Mt).map(y=>({element:y}))).map(({element:y})=>y),l=[];let i=!1,s=!1,c=-1,u=-1,v=0,p,L=[];{let y=-1;for(const h of a)h.hasAttribute("data-panel")&&(y++,h.ariaDisabled===null&&(v++,c===-1&&(c=y),u=y))}if(v>1){let y=-1;for(const h of a)if(h.hasAttribute("data-panel")){y++;const b=r.find(x=>x.element===h);if(b){if(p){const x=p.element.getBoundingClientRect(),d=h.getBoundingClientRect();let S;if(s){const w=n==="horizontal"?new DOMRect(x.right,x.top,0,x.height):new DOMRect(x.left,x.bottom,x.width,0),g=n==="horizontal"?new DOMRect(d.left,d.top,0,d.height):new DOMRect(d.left,d.top,d.width,0);switch(L.length){case 0:{S=[w,g];break}case 1:{const C=L[0],j=vr({orientation:n,rects:[x,d],targetRect:C.element.getBoundingClientRect()});S=[C,j===x?g:w];break}default:{S=L;break}}}else L.length?S=L:S=[n==="horizontal"?new DOMRect(x.right,d.top,d.left-x.right,d.height):new DOMRect(d.left,x.bottom,d.width,d.top-x.bottom)];for(const w of S){let g="width"in w?w:w.element.getBoundingClientRect();const C=xr()?e.resizeTargetMinimumSize.coarse:e.resizeTargetMinimumSize.fine;if(g.width<C){const N=C-g.width;g=new DOMRect(g.x-N/2,g.y,g.width+N,g.height)}if(g.height<C){const N=C-g.height;g=new DOMRect(g.x,g.y-N/2,g.width,g.height+N)}const j=y<=c||y>u;!i&&!j&&l.push({group:e,groupSize:he({group:e}),panels:[p,b],separator:"width"in w?void 0:w,rect:g}),i=!1}}s=!1,p=b,L=[]}}else if(h.hasAttribute("data-separator")){h.ariaDisabled!==null&&(i=!0);const b=o.find(x=>x.element===h);b?L.push(b):(p=void 0,L=[])}else s=!0}return l}var Q;class Ot{constructor(){Je(this,Q,{})}addListener(t,n){const r=ge(this,Q)[t];return r===void 0?ge(this,Q)[t]=[n]:r.includes(n)||r.push(n),()=>{this.removeListener(t,n)}}emit(t,n){const r=ge(this,Q)[t];if(r!==void 0)if(r.length===1)r[0].call(null,n);else{let o=!1,a=null;const l=Array.from(r);for(let i=0;i<l.length;i++){const s=l[i];try{s.call(null,n)}catch(c){a===null&&(o=!0,a=c)}}if(o)throw a}}removeAllListeners(){Ke(this,Q,{})}removeListener(t,n){const r=ge(this,Q)[t];if(r!==void 0){const o=r.indexOf(n);o>=0&&r.splice(o,1)}}}Q=new WeakMap;let X=new Map;const Rt=new Ot;function br(e){X=new Map(X),X.delete(e)}function ot(e,t){for(const[n]of X)if(n.id===e)return n}function ee(e,t){for(const[n,r]of X)if(n.id===e)return r;if(t)throw Error(`Could not find data for Group with id ${e}`)}function ae(){return X}function Be(e,t){return Rt.addListener("groupChange",n=>{n.group.id===e&&t(n)})}function _(e,t){const n=X.get(e);X=new Map(X),X.set(e,t),Rt.emit("groupChange",{group:e,prev:n,next:t})}function yr(e,t,n){let r,o={x:1/0,y:1/0};for(const a of t){const l=Lt(n,a.rect);switch(e){case"horizontal":{l.x<=o.x&&(r=a,o=l);break}case"vertical":{l.y<=o.y&&(r=a,o=l);break}}}return r?{distance:o,hitRegion:r}:void 0}function wr(e){return e!==null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function Sr(e,t){if(e===t)throw new Error("Cannot compare node with itself");const n={a:st(e),b:st(t)};let r;for(;n.a.at(-1)===n.b.at(-1);)r=n.a.pop(),n.b.pop();$(r,"Stacking order can only be calculated for elements with a common ancestor");const o={a:at(it(n.a)),b:at(it(n.b))};if(o.a===o.b){const a=r.childNodes,l={a:n.a.at(-1),b:n.b.at(-1)};let i=a.length;for(;i--;){const s=a[i];if(s===l.a)return 1;if(s===l.b)return-1}}return Math.sign(o.a-o.b)}const zr=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function jr(e){const t=getComputedStyle(Nt(e)??e).display;return t==="flex"||t==="inline-flex"}function Cr(e){const t=getComputedStyle(e);return!!(t.position==="fixed"||t.zIndex!=="auto"&&(t.position!=="static"||jr(e))||+t.opacity<1||"transform"in t&&t.transform!=="none"||"webkitTransform"in t&&t.webkitTransform!=="none"||"mixBlendMode"in t&&t.mixBlendMode!=="normal"||"filter"in t&&t.filter!=="none"||"webkitFilter"in t&&t.webkitFilter!=="none"||"isolation"in t&&t.isolation==="isolate"||zr.test(t.willChange)||t.webkitOverflowScrolling==="touch")}function it(e){let t=e.length;for(;t--;){const n=e[t];if($(n,"Missing node"),Cr(n))return n}return null}function at(e){return e&&Number(getComputedStyle(e).zIndex)||0}function st(e){const t=[];for(;e;)t.push(e),e=Nt(e);return t}function Nt(e){const{parentNode:t}=e;return wr(t)?t.host:t}function Pr(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function Er({groupElement:e,hitRegion:t,pointerEventTarget:n}){if(!Mt(n)||n.contains(e)||e.contains(n))return!0;if(Sr(n,e)>0){let r=n;for(;r;){if(r.contains(e))return!0;if(Pr(r.getBoundingClientRect(),t))return!1;r=r.parentElement}}return!0}function We(e,t){const n=[];return t.forEach((r,o)=>{if(o.disabled)return;const a=kt(o),l=yr(o.orientation,a,{x:e.clientX,y:e.clientY});l&&l.distance.x<=0&&l.distance.y<=0&&Er({groupElement:o.element,hitRegion:l.hitRegion.rect,pointerEventTarget:e.target})&&n.push(l.hitRegion)}),n}function Mr(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0}function V(e,t,n=0){return Math.abs(G(e)-G(t))<=n}function q(e,t){return V(e,t)?0:e>t?1:-1}function ue({overrideDisabledPanels:e,panelConstraints:t,prevSize:n,size:r}){const{collapsedSize:o=0,collapsible:a,disabled:l,maxSize:i=100,minSize:s=0}=t;if(l&&!e)return n;if(q(r,s)<0)if(a){const c=(o+s)/2;q(r,c)<0?r=o:r=s}else r=s;return r=Math.min(i,r),r=G(r),r}function we({delta:e,initialLayout:t,panelConstraints:n,pivotIndices:r,prevLayout:o,trigger:a}){if(V(e,0))return t;const l=a==="imperative-api",i=Object.values(t),s=Object.values(o),c=[...i],[u,v]=r;$(u!=null,"Invalid first pivot index"),$(v!=null,"Invalid second pivot index");let p=0;switch(a){case"keyboard":{{const h=e<0?v:u,b=n[h];$(b,`Panel constraints not found for index ${h}`);const{collapsedSize:x=0,collapsible:d,minSize:S=0}=b;if(d){const w=i[h];if($(w!=null,`Previous layout not found for panel index ${h}`),V(w,x)){const g=S-w;q(g,Math.abs(e))>0&&(e=e<0?0-g:g)}}}{const h=e<0?u:v,b=n[h];$(b,`No panel constraints found for index ${h}`);const{collapsedSize:x=0,collapsible:d,minSize:S=0}=b;if(d){const w=i[h];if($(w!=null,`Previous layout not found for panel index ${h}`),V(w,S)){const g=w-x;q(g,Math.abs(e))>0&&(e=e<0?0-g:g)}}}break}default:{const h=e<0?v:u,b=n[h];$(b,`Panel constraints not found for index ${h}`);const x=i[h],{collapsible:d,collapsedSize:S,minSize:w}=b;if(d&&q(x,w)<0)if(e>0){const g=w-S,C=g/2,j=x+e;q(j,w)<0&&(e=q(e,C)<=0?0:g)}else{const g=w-S,C=100-g/2,j=x-e;q(j,w)<0&&(e=q(100+e,C)>0?0:-g)}break}}{const h=e<0?1:-1;let b=e<0?v:u,x=0;for(;;){const S=i[b];$(S!=null,`Previous layout not found for panel index ${b}`);const w=ue({overrideDisabledPanels:l,panelConstraints:n[b],prevSize:S,size:100})-S;if(x+=w,b+=h,b<0||b>=n.length)break}const d=Math.min(Math.abs(e),Math.abs(x));e=e<0?0-d:d}{let h=e<0?u:v;for(;h>=0&&h<n.length;){const b=Math.abs(e)-Math.abs(p),x=i[h];$(x!=null,`Previous layout not found for panel index ${h}`);const d=x-b,S=ue({overrideDisabledPanels:l,panelConstraints:n[h],prevSize:x,size:d});if(!V(x,S)&&(p+=x-S,c[h]=S,p.toFixed(3).localeCompare(Math.abs(e).toFixed(3),void 0,{numeric:!0})>=0))break;e<0?h--:h++}}if(Mr(s,c))return o;{const h=e<0?v:u,b=i[h];$(b!=null,`Previous layout not found for panel index ${h}`);const x=b+p,d=ue({overrideDisabledPanels:l,panelConstraints:n[h],prevSize:b,size:x});if(c[h]=d,!V(d,x)){let S=x-d,w=e<0?v:u;for(;w>=0&&w<n.length;){const g=c[w];$(g!=null,`Previous layout not found for panel index ${w}`);const C=g+S,j=ue({overrideDisabledPanels:l,panelConstraints:n[w],prevSize:g,size:C});if(V(g,j)||(S-=j-g,c[w]=j),V(S,0))break;e>0?w--:w++}}}const L=Object.values(c).reduce((h,b)=>b+h,0);if(!V(L,100,.1))return o;const y=Object.keys(o);return c.reduce((h,b,x)=>(h[y[x]]=b,h),{})}function re(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(t[n]===void 0||q(e[n],t[n])!==0)return!1;return!0}function oe({layout:e,panelConstraints:t}){const n=Object.values(e),r=[...n],o=r.reduce((i,s)=>i+s,0);if(r.length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${r.map(i=>`${i}%`).join(", ")}`);if(!V(o,100)&&r.length>0)for(let i=0;i<t.length;i++){const s=r[i];$(s!=null,`No layout data found for index ${i}`);const c=100/o*s;r[i]=c}let a=0;for(let i=0;i<t.length;i++){const s=n[i];$(s!=null,`No layout data found for index ${i}`);const c=r[i];$(c!=null,`No layout data found for index ${i}`);const u=ue({overrideDisabledPanels:!0,panelConstraints:t[i],prevSize:s,size:c});c!=u&&(a+=c-u,r[i]=u)}if(!V(a,0))for(let i=0;i<t.length;i++){const s=r[i];$(s!=null,`No layout data found for index ${i}`);const c=s+a,u=ue({overrideDisabledPanels:!0,panelConstraints:t[i],prevSize:s,size:c});if(s!==u&&(a-=u-s,r[i]=u,V(a,0)))break}const l=Object.keys(e);return r.reduce((i,s,c)=>(i[l[c]]=s,i),{})}function Dt({groupId:e,panelId:t}){const n=()=>{const i=ae();for(const[s,{defaultLayoutDeferred:c,derivedPanelConstraints:u,layout:v,groupSize:p,separatorToPanels:L}]of i)if(s.id===e)return{defaultLayoutDeferred:c,derivedPanelConstraints:u,group:s,groupSize:p,layout:v,separatorToPanels:L};throw Error(`Group ${e} not found`)},r=()=>{const i=n().derivedPanelConstraints.find(s=>s.panelId===t);if(i!==void 0)return i;throw Error(`Panel constraints not found for Panel ${t}`)},o=()=>{const i=n().group.panels.find(s=>s.id===t);if(i!==void 0)return i;throw Error(`Layout not found for Panel ${t}`)},a=()=>{const i=n().layout[t];if(i!==void 0)return i;throw Error(`Layout not found for Panel ${t}`)},l=i=>{const s=a();if(i===s)return;const{defaultLayoutDeferred:c,derivedPanelConstraints:u,group:v,groupSize:p,layout:L,separatorToPanels:y}=n(),h=v.panels.findIndex(S=>S.id===t),b=h===v.panels.length-1,x=we({delta:b?s-i:i-s,initialLayout:L,panelConstraints:u,pivotIndices:b?[h-1,h]:[h,h+1],prevLayout:L,trigger:"imperative-api"}),d=oe({layout:x,panelConstraints:u});re(L,d)||_(v,{defaultLayoutDeferred:c,derivedPanelConstraints:u,groupSize:p,layout:d,separatorToPanels:y})};return{collapse:()=>{const{collapsible:i,collapsedSize:s}=r(),{mutableValues:c}=o(),u=a();i&&u!==s&&(c.expandToSize=u,l(s))},expand:()=>{const{collapsible:i,collapsedSize:s,minSize:c}=r(),{mutableValues:u}=o(),v=a();if(i&&v===s){let p=u.expandToSize??c;p===0&&(p=1),l(p)}},getSize:()=>{const{group:i}=n(),s=a(),{element:c}=o(),u=i.orientation==="horizontal"?c.offsetWidth:c.offsetHeight;return{asPercentage:s,inPixels:u}},isCollapsed:()=>{const{collapsible:i,collapsedSize:s}=r(),c=a();return i&&V(s,c)},resize:i=>{const{group:s}=n(),{element:c}=o(),u=he({group:s}),v=ve({groupSize:u,panelElement:c,styleProp:i}),p=G(v/u*100);l(p)}}}function lt(e){if(e.defaultPrevented)return;const t=ae();We(e,t).forEach(n=>{if(n.separator){const r=n.panels.find(o=>o.panelConstraints.defaultSize!==void 0);if(r){const o=r.panelConstraints.defaultSize,a=Dt({groupId:n.group.id,panelId:r.id});a&&o!==void 0&&(a.resize(o),e.preventDefault())}}})}function Ee(e){const t=ae();for(const[n]of t)if(n.separators.some(r=>r.element===e))return n;throw Error("Could not find parent Group for separator element")}function It({groupId:e}){const t=()=>{const n=ae();for(const[r,o]of n)if(r.id===e)return{group:r,...o};throw Error(`Could not find Group with id "${e}"`)};return{getLayout(){const{defaultLayoutDeferred:n,layout:r}=t();return n?{}:r},setLayout(n){const{defaultLayoutDeferred:r,derivedPanelConstraints:o,group:a,groupSize:l,layout:i,separatorToPanels:s}=t(),c=oe({layout:n,panelConstraints:o});return r?i:(re(i,c)||_(a,{defaultLayoutDeferred:r,derivedPanelConstraints:o,groupSize:l,layout:c,separatorToPanels:s}),c)}}}function ne(e,t){const n=Ee(e),r=ee(n.id,!0),o=n.separators.find(u=>u.element===e);$(o,"Matching separator not found");const a=r.separatorToPanels.get(o);$(a,"Matching panels not found");const l=a.map(u=>n.panels.indexOf(u)),i=It({groupId:n.id}).getLayout(),s=we({delta:t,initialLayout:i,panelConstraints:r.derivedPanelConstraints,pivotIndices:l,prevLayout:i,trigger:"keyboard"}),c=oe({layout:s,panelConstraints:r.derivedPanelConstraints});re(i,c)||_(n,{defaultLayoutDeferred:r.defaultLayoutDeferred,derivedPanelConstraints:r.derivedPanelConstraints,groupSize:r.groupSize,layout:c,separatorToPanels:r.separatorToPanels})}function ct(e){if(e.defaultPrevented)return;const t=e.currentTarget,n=Ee(t);if(!n.disabled)switch(e.key){case"ArrowDown":{e.preventDefault(),n.orientation==="vertical"&&ne(t,5);break}case"ArrowLeft":{e.preventDefault(),n.orientation==="horizontal"&&ne(t,-5);break}case"ArrowRight":{e.preventDefault(),n.orientation==="horizontal"&&ne(t,5);break}case"ArrowUp":{e.preventDefault(),n.orientation==="vertical"&&ne(t,-5);break}case"End":{e.preventDefault(),ne(t,100);break}case"Enter":{e.preventDefault();const r=Ee(t),o=ee(r.id,!0),{derivedPanelConstraints:a,layout:l,separatorToPanels:i}=o,s=r.separators.find(p=>p.element===t);$(s,"Matching separator not found");const c=i.get(s);$(c,"Matching panels not found");const u=c[0],v=a.find(p=>p.panelId===u.id);if($(v,"Panel metadata not found"),v.collapsible){const p=l[u.id],L=v.collapsedSize===p?r.mutableState.expandedPanelSizes[u.id]??v.minSize:v.collapsedSize;ne(t,L-p)}break}case"F6":{e.preventDefault();const r=Ee(t).separators.map(l=>l.element),o=Array.from(r).findIndex(l=>l===e.currentTarget);$(o!==null,"Index not found");const a=e.shiftKey?o>0?o-1:r.length-1:o+1<r.length?o+1:0;r[a].focus({preventScroll:!0});break}case"Home":{e.preventDefault(),ne(t,-100);break}}}let fe={cursorFlags:0,state:"inactive"};const He=new Ot;function ie(){return fe}function Lr(e){return He.addListener("change",e)}function kr(e){const t=fe,n={...fe};n.cursorFlags=e,fe=n,He.emit("change",{prev:t,next:n})}function pe(e){const t=fe;fe=e,He.emit("change",{prev:t,next:e})}function ut(e){if(e.defaultPrevented||e.pointerType==="mouse"&&e.button>0)return;const t=ae(),n=We(e,t),r=new Map;let o=!1;n.forEach(a=>{a.separator&&(o||(o=!0,a.separator.element.focus({preventScroll:!0})));const l=t.get(a.group);l&&r.set(a.group,l.layout)}),pe({cursorFlags:0,hitRegions:n,initialLayoutMap:r,pointerDownAtPoint:{x:e.clientX,y:e.clientY},state:"active"}),n.length&&e.preventDefault()}const Or=e=>e,$e=()=>{},$t=1,Tt=2,Ft=4,At=8,dt=3,ft=12;let Pe;function pt(){return Pe===void 0&&(Pe=!1,typeof window<"u"&&(window.navigator.userAgent.includes("Chrome")||window.navigator.userAgent.includes("Firefox"))&&(Pe=!0)),Pe}function Rr({cursorFlags:e,groups:t,state:n}){let r=0,o=0;switch(n){case"active":case"hover":t.forEach(a=>{if(!a.mutableState.disableCursor)switch(a.orientation){case"horizontal":{r++;break}case"vertical":{o++;break}}})}if(!(r===0&&o===0)){switch(n){case"active":{if(e&&pt()){const a=(e&$t)!==0,l=(e&Tt)!==0,i=(e&Ft)!==0,s=(e&At)!==0;if(a)return i?"se-resize":s?"ne-resize":"e-resize";if(l)return i?"sw-resize":s?"nw-resize":"w-resize";if(i)return"s-resize";if(s)return"n-resize"}break}}return pt()?r>0&&o>0?"move":r>0?"ew-resize":"ns-resize":r>0&&o>0?"grab":r>0?"col-resize":"row-resize"}}const ht=new WeakMap;function Ve(e){if(e.defaultView===null||e.defaultView===void 0)return;let{prevStyle:t,styleSheet:n}=ht.get(e)??{};n===void 0&&(n=new e.defaultView.CSSStyleSheet,e.adoptedStyleSheets&&e.adoptedStyleSheets.push(n));const r=ie();switch(r.state){case"active":case"hover":{const o=Rr({cursorFlags:r.cursorFlags,groups:r.hitRegions.map(l=>l.group),state:r.state}),a=`*, *:hover {cursor: ${o} !important; }`;if(t===a)return;t=a,o?n.cssRules.length===0?n.insertRule(a):n.replaceSync(a):n.cssRules.length===1&&n.deleteRule(0);break}case"inactive":{t=void 0,n.cssRules.length===1&&n.deleteRule(0);break}}ht.set(e,{prevStyle:t,styleSheet:n})}function Bt({document:e,event:t,hitRegions:n,initialLayoutMap:r,mountedGroups:o,pointerDownAtPoint:a,prevCursorFlags:l}){let i=0;n.forEach(c=>{const{group:u,groupSize:v}=c,{orientation:p,panels:L}=u,{disableCursor:y}=u.mutableState;let h=0;a?p==="horizontal"?h=(t.clientX-a.x)/v*100:h=(t.clientY-a.y)/v*100:p==="horizontal"?h=t.clientX<0?-100:100:h=t.clientY<0?-100:100;const b=r.get(u),x=o.get(u);if(!b||!x)return;const{defaultLayoutDeferred:d,derivedPanelConstraints:S,groupSize:w,layout:g,separatorToPanels:C}=x;if(S&&g&&C){const j=we({delta:h,initialLayout:b,panelConstraints:S,pivotIndices:c.panels.map(N=>L.indexOf(N)),prevLayout:g,trigger:"mouse-or-touch"});if(re(j,g)){if(h!==0&&!y)switch(p){case"horizontal":{i|=h<0?$t:Tt;break}case"vertical":{i|=h<0?Ft:At;break}}}else _(c.group,{defaultLayoutDeferred:d,derivedPanelConstraints:S,groupSize:w,layout:j,separatorToPanels:C})}});let s=0;t.movementX===0?s|=l&dt:s|=i&dt,t.movementY===0?s|=l&ft:s|=i&ft,kr(s),Ve(e)}function gt(e){const t=ae(),n=ie();switch(n.state){case"active":Bt({document:e.currentTarget,event:e,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedGroups:t,prevCursorFlags:n.cursorFlags})}}function mt(e){if(e.defaultPrevented)return;const t=ie(),n=ae();switch(t.state){case"active":{if(e.buttons===0){pe({cursorFlags:0,state:"inactive"}),t.hitRegions.forEach(r=>{const o=ee(r.group.id,!0);_(r.group,o)});return}Bt({document:e.currentTarget,event:e,hitRegions:t.hitRegions,initialLayoutMap:t.initialLayoutMap,mountedGroups:n,pointerDownAtPoint:t.pointerDownAtPoint,prevCursorFlags:t.cursorFlags});break}default:{const r=We(e,n);r.length===0?t.state!=="inactive"&&pe({cursorFlags:0,state:"inactive"}):pe({cursorFlags:0,hitRegions:r,state:"hover"}),Ve(e.currentTarget);break}}}function vt(e){if(e.relatedTarget instanceof HTMLIFrameElement)switch(ie().state){case"hover":pe({cursorFlags:0,state:"inactive"})}}function xt(e){if(e.defaultPrevented||e.pointerType==="mouse"&&e.button>0)return;const t=ie();switch(t.state){case"active":pe({cursorFlags:0,state:"inactive"}),t.hitRegions.length>0&&(Ve(e.currentTarget),t.hitRegions.forEach(n=>{const r=ee(n.group.id,!0);_(n.group,r)}),e.preventDefault())}}function bt(e){let t=0,n=0;const r={};for(const a of e)if(a.defaultSize!==void 0){t++;const l=G(a.defaultSize);n+=l,r[a.panelId]=l}else r[a.panelId]=void 0;const o=e.length-t;if(o!==0){const a=G((100-n)/o);for(const l of e)l.defaultSize===void 0&&(r[l.panelId]=a)}return r}function Nr(e,t,n){if(!n[0])return;const r=e.panels.find(s=>s.element===t);if(!r||!r.onResize)return;const o=he({group:e}),a=e.orientation==="horizontal"?r.element.offsetWidth:r.element.offsetHeight,l=r.mutableValues.prevSize,i={asPercentage:G(a/o*100),inPixels:a};r.mutableValues.prevSize=i,r.onResize(i,r.id,l)}function Dr(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(e[n]!==t[n])return!1;return!0}function Ir({group:e,nextGroupSize:t,prevGroupSize:n,prevLayout:r}){if(n<=0||t<=0||n===t)return r;let o=0,a=0,l=!1;const i=new Map,s=[];for(const v of e.panels){const p=r[v.id]??0;switch(v.panelConstraints.groupResizeBehavior){case"preserve-pixel-size":{l=!0;const L=p/100*n,y=G(L/t*100);i.set(v.id,y),o+=y;break}case"preserve-relative-size":default:{s.push(v.id),a+=p;break}}}if(!l||s.length===0)return r;const c=100-o,u={...r};if(i.forEach((v,p)=>{u[p]=v}),a>0)for(const v of s){const p=r[v]??0;u[v]=G(p/a*c)}else{const v=G(c/s.length);for(const p of s)u[p]=v}return u}function $r(e,t){const n=e.map(o=>o.id),r=Object.keys(t);if(n.length!==r.length)return!1;for(const o of n)if(!r.includes(o))return!1;return!0}const le=new Map;function Tr(e){let t=!0;$(e.element.ownerDocument.defaultView,"Cannot register an unmounted Group");const n=e.element.ownerDocument.defaultView.ResizeObserver,r=new Set,o=new Set,a=new n(y=>{for(const h of y){const{borderBoxSize:b,target:x}=h;if(x===e.element){if(t){const d=he({group:e});if(d===0)return;const S=ee(e.id);if(!S)return;const w=Te(e),g=S.defaultLayoutDeferred?bt(w):S.layout,C=Ir({group:e,nextGroupSize:d,prevGroupSize:S.groupSize,prevLayout:g}),j=oe({layout:C,panelConstraints:w});if(!S.defaultLayoutDeferred&&re(S.layout,j)&&Dr(S.derivedPanelConstraints,w)&&S.groupSize===d)return;_(e,{defaultLayoutDeferred:!1,derivedPanelConstraints:w,groupSize:d,layout:j,separatorToPanels:S.separatorToPanels})}}else Nr(e,x,b)}});a.observe(e.element),e.panels.forEach(y=>{$(!r.has(y.id),`Panel ids must be unique; id "${y.id}" was used more than once`),r.add(y.id),y.onResize&&a.observe(y.element)});const l=he({group:e}),i=Te(e),s=e.panels.map(({id:y})=>y).join(",");let c=e.mutableState.defaultLayout;c&&($r(e.panels,c)||(c=void 0));const u=e.mutableState.layouts[s]??c??bt(i),v=oe({layout:u,panelConstraints:i}),p=e.element.ownerDocument;le.set(p,(le.get(p)??0)+1);const L=new Map;return kt(e).forEach(y=>{y.separator&&L.set(y.separator,y.panels)}),_(e,{defaultLayoutDeferred:l===0,derivedPanelConstraints:i,groupSize:l,layout:v,separatorToPanels:L}),e.separators.forEach(y=>{$(!o.has(y.id),`Separator ids must be unique; id "${y.id}" was used more than once`),o.add(y.id),y.element.addEventListener("keydown",ct)}),le.get(p)===1&&(p.addEventListener("dblclick",lt,!0),p.addEventListener("pointerdown",ut,!0),p.addEventListener("pointerleave",gt),p.addEventListener("pointermove",mt),p.addEventListener("pointerout",vt),p.addEventListener("pointerup",xt,!0)),function(){t=!1,le.set(p,Math.max(0,(le.get(p)??0)-1)),br(e),e.separators.forEach(y=>{y.element.removeEventListener("keydown",ct)}),le.get(p)||(p.removeEventListener("dblclick",lt,!0),p.removeEventListener("pointerdown",ut,!0),p.removeEventListener("pointerleave",gt),p.removeEventListener("pointermove",mt),p.removeEventListener("pointerout",vt),p.removeEventListener("pointerup",xt,!0)),a.disconnect()}}function Fr(){const[e,t]=f.useState({}),n=f.useCallback(()=>t({}),[]);return[e,n]}function Ge(e){const t=f.useId();return`${e??t}`}const se=typeof window<"u"?f.useLayoutEffect:f.useEffect;function be(e){const t=f.useRef(e);return se(()=>{t.current=e},[e]),f.useCallback((...n)=>{var r;return(r=t.current)==null?void 0:r.call(t,...n)},[t])}function Ue(...e){return be(t=>{e.forEach(n=>{if(n)switch(typeof n){case"function":{n(t);break}case"object":{n.current=t;break}}})})}function qe(e){const t=f.useRef({...e});return se(()=>{for(const n in e)t.current[n]=e[n]},[e]),t.current}const Wt=f.createContext(null);function Ar(e,t){const n=f.useRef({getLayout:()=>({}),setLayout:Or});f.useImperativeHandle(t,()=>n.current,[]),se(()=>{Object.assign(n.current,It({groupId:e}))})}function Ht({children:e,className:t,defaultLayout:n,disableCursor:r,disabled:o,elementRef:a,groupRef:l,id:i,onLayoutChange:s,onLayoutChanged:c,orientation:u="horizontal",resizeTargetMinimumSize:v={coarse:20,fine:10},style:p,...L}){const y=f.useRef({onLayoutChange:{},onLayoutChanged:{}}),h=be(P=>{re(y.current.onLayoutChange,P)||(y.current.onLayoutChange=P,s==null||s(P))}),b=be(P=>{re(y.current.onLayoutChanged,P)||(y.current.onLayoutChanged=P,c==null||c(P))}),x=Ge(i),d=f.useRef(null),[S,w]=Fr(),g=f.useRef({lastExpandedPanelSizes:{},layouts:{},panels:[],resizeTargetMinimumSize:v,separators:[]}),C=Ue(d,a);Ar(x,l);const j=be((P,M)=>{const D=ie(),A=ot(P),z=ee(P);if(z){let R=!1;switch(D.state){case"active":{R=D.hitRegions.some(W=>W.group===A);break}}return{flexGrow:z.layout[M]??1,pointerEvents:R?"none":void 0}}return{flexGrow:(n==null?void 0:n[M])??1}}),N=qe({defaultLayout:n,disableCursor:r}),F=f.useMemo(()=>({get disableCursor(){return!!N.disableCursor},getPanelStyles:j,id:x,orientation:u,registerPanel:P=>{const M=g.current;return M.panels=Fe(u,[...M.panels,P]),w(),()=>{M.panels=M.panels.filter(D=>D!==P),w()}},registerSeparator:P=>{const M=g.current;return M.separators=Fe(u,[...M.separators,P]),w(),()=>{M.separators=M.separators.filter(D=>D!==P),w()}},togglePanelDisabled:(P,M)=>{const D=g.current.panels.find(R=>R.id===P);D&&(D.panelConstraints.disabled=M);const A=ot(x),z=ee(x);A&&z&&_(A,{...z,derivedPanelConstraints:Te(A)})},toggleSeparatorDisabled:(P,M)=>{const D=g.current.separators.find(A=>A.id===P);D&&(D.disabled=M)}}),[j,x,w,u,N]),k=f.useRef(null);return se(()=>{const P=d.current;if(P===null)return;const M=g.current;let D;if(N.defaultLayout!==void 0&&Object.keys(N.defaultLayout).length===M.panels.length){D={};for(const H of M.panels){const O=N.defaultLayout[H.id];O!==void 0&&(D[H.id]=O)}}const A={disabled:!!o,element:P,id:x,mutableState:{defaultLayout:D,disableCursor:!!N.disableCursor,expandedPanelSizes:g.current.lastExpandedPanelSizes,layouts:g.current.layouts},orientation:u,panels:M.panels,resizeTargetMinimumSize:M.resizeTargetMinimumSize,separators:M.separators};k.current=A;const z=Tr(A),{defaultLayoutDeferred:R,derivedPanelConstraints:W,layout:E}=ee(A.id,!0);!R&&W.length>0&&(h(E),b(E));const T=Be(x,H=>{const{defaultLayoutDeferred:O,derivedPanelConstraints:I,layout:B}=H.next;if(O||I.length===0)return;const te=A.panels.map(({id:Y})=>Y).join(",");A.mutableState.layouts[te]=B,I.forEach(Y=>{if(Y.collapsible){const{layout:Oe}=H.prev??{};if(Oe){const _t=V(Y.collapsedSize,B[Y.panelId]),Jt=V(Y.collapsedSize,Oe[Y.panelId]);_t&&!Jt&&(A.mutableState.expandedPanelSizes[Y.panelId]=Oe[Y.panelId])}}});const J=ie().state!=="active";h(B),J&&b(B)});return()=>{k.current=null,z(),T()}},[o,x,b,h,u,S,N]),f.useEffect(()=>{const P=k.current;P&&(P.mutableState.defaultLayout=n,P.mutableState.disableCursor=!!r)}),m.jsx(Wt.Provider,{value:F,children:m.jsx("div",{...L,className:t,"data-group":!0,"data-testid":x,id:x,ref:C,style:{height:"100%",width:"100%",overflow:"hidden",...p,display:"flex",flexDirection:u==="horizontal"?"row":"column",flexWrap:"nowrap",touchAction:u==="horizontal"?"pan-y":"pan-x"},children:e})})}Ht.displayName="Group";function Xe(){const e=f.useContext(Wt);return $(e,"Group Context not found; did you render a Panel or Separator outside of a Group?"),e}function Br(e,t){const{id:n}=Xe(),r=f.useRef({collapse:$e,expand:$e,getSize:()=>({asPercentage:0,inPixels:0}),isCollapsed:()=>!1,resize:$e});f.useImperativeHandle(t,()=>r.current,[]),se(()=>{Object.assign(r.current,Dt({groupId:n,panelId:e}))})}function Me({children:e,className:t,collapsedSize:n="0%",collapsible:r=!1,defaultSize:o,disabled:a,elementRef:l,groupResizeBehavior:i="preserve-relative-size",id:s,maxSize:c="100%",minSize:u="0%",onResize:v,panelRef:p,style:L,...y}){const h=!!s,b=Ge(s),x=qe({disabled:a}),d=f.useRef(null),S=Ue(d,l),{getPanelStyles:w,id:g,orientation:C,registerPanel:j,togglePanelDisabled:N}=Xe(),F=v!==null,k=be((M,D,A)=>{v==null||v(M,s,A)});se(()=>{const M=d.current;if(M!==null){const D={element:M,id:b,idIsStable:h,mutableValues:{expandToSize:void 0,prevSize:void 0},onResize:F?k:void 0,panelConstraints:{groupResizeBehavior:i,collapsedSize:n,collapsible:r,defaultSize:o,disabled:x.disabled,maxSize:c,minSize:u}};return j(D)}},[i,n,r,o,F,b,h,c,u,k,j,x]),f.useEffect(()=>{N(b,!!a)},[a,b,N]),Br(b,p);const P=f.useSyncExternalStore(M=>Be(g,M),()=>JSON.stringify(w(g,b)),()=>JSON.stringify(w(g,b)));return m.jsx("div",{...y,"aria-disabled":a||void 0,"data-panel":!0,"data-testid":b,id:b,ref:S,style:{...Wr,display:"flex",flexBasis:0,flexShrink:1,overflow:"visible",...JSON.parse(P)},children:m.jsx("div",{className:t,style:{maxHeight:"100%",maxWidth:"100%",flexGrow:1,overflow:"auto",...L,touchAction:C==="horizontal"?"pan-y":"pan-x"},children:e})})}Me.displayName="Panel";const Wr={minHeight:0,maxHeight:"100%",height:"auto",minWidth:0,maxWidth:"100%",width:"auto",border:"none",borderWidth:0,padding:0,margin:0};function Hr({layout:e,panelConstraints:t,panelId:n,panelIndex:r}){let o,a;const l=e[n],i=t.find(s=>s.panelId===n);if(i){const s=i.maxSize,c=i.collapsible?i.collapsedSize:i.minSize,u=[r,r+1];a=oe({layout:we({delta:c-l,initialLayout:e,panelConstraints:t,pivotIndices:u,prevLayout:e}),panelConstraints:t})[n],o=oe({layout:we({delta:s-l,initialLayout:e,panelConstraints:t,pivotIndices:u,prevLayout:e}),panelConstraints:t})[n]}return{valueControls:n,valueMax:o,valueMin:a,valueNow:l}}function Ae({children:e,className:t,disabled:n,elementRef:r,id:o,style:a,...l}){const i=Ge(o),s=qe({disabled:n}),[c,u]=f.useState({}),[v,p]=f.useState("inactive"),L=f.useRef(null),y=Ue(L,r),{disableCursor:h,id:b,orientation:x,registerSeparator:d,toggleSeparatorDisabled:S}=Xe(),w=x==="horizontal"?"vertical":"horizontal";se(()=>{const C=L.current;if(C!==null){const j={disabled:s.disabled,element:C,id:i},N=d(j),F=Lr(P=>{p(P.next.state!=="inactive"&&P.next.hitRegions.some(M=>M.separator===j)?P.next.state:"inactive")}),k=Be(b,P=>{const{derivedPanelConstraints:M,layout:D,separatorToPanels:A}=P.next,z=A.get(j);if(z){const R=z[0],W=z.indexOf(R);u(Hr({layout:D,panelConstraints:M,panelId:R.id,panelIndex:W}))}});return()=>{F(),k(),N()}}},[b,i,d,s]),f.useEffect(()=>{S(i,!!n)},[n,i,S]);let g;return n&&!h&&(g="not-allowed"),m.jsx("div",{...l,"aria-controls":c.valueControls,"aria-disabled":n||void 0,"aria-orientation":w,"aria-valuemax":c.valueMax,"aria-valuemin":c.valueMin,"aria-valuenow":c.valueNow,children:e,className:t,"data-separator":n?"disabled":v,"data-testid":i,id:i,ref:y,role:"separator",style:{flexBasis:"auto",cursor:g,...a,flexGrow:0,flexShrink:0,touchAction:"none"},tabIndex:n?void 0:0})}Ae.displayName="Separator";function Vt(e){var r;const t=((r=e.split(".").pop())==null?void 0:r.toLowerCase())||"";return{js:"text-yellow-600",ts:"text-blue-500",tsx:"text-blue-400",jsx:"text-yellow-500",py:"text-green-600",rb:"text-red-500",go:"text-cyan-600",html:"text-orange-500",css:"text-purple-500",json:"text-green-500",md:"text-slate",yaml:"text-green-400",yml:"text-green-400",sh:"text-green-600",bash:"text-green-600",rs:"text-orange-600",java:"text-red-600",kt:"text-purple-600",sql:"text-blue-600",svg:"text-orange-400"}[t]||"text-charcoal/80"}function Gt(e,t){var o;if(t==="directory")return"[ ]";const n=((o=e.split(".").pop())==null?void 0:o.toLowerCase())||"";return{js:"JS",ts:"TS",tsx:"TX",jsx:"JX",py:"PY",html:"<>",css:"##",json:"{}",md:"MD",yml:"YL",yaml:"YL",sh:"SH",go:"GO",rs:"RS",rb:"RB",java:"JV",kt:"KT",sql:"SQ",svg:"SV",png:"IM",jpg:"IM",gif:"IM",ico:"IC"}[n]||".."}function Vr(e){var o;const t=((o=e.split(".").pop())==null?void 0:o.toLowerCase())||"",n={js:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",py:"python",html:"html",htm:"html",css:"css",scss:"scss",less:"less",json:"json",md:"markdown",go:"go",rs:"rust",sh:"shell",bash:"shell",yml:"yaml",yaml:"yaml",xml:"xml",svg:"xml",sql:"sql",java:"java",kt:"kotlin",rb:"ruby",dockerfile:"dockerfile"},r=e.toLowerCase();return r==="dockerfile"?"dockerfile":r==="makefile"?"makefile":n[t]||"plaintext"}function Ut(e){for(const t of e)if(t.type==="file"&&t.name.endsWith(".html")||t.children&&Ut(t.children))return!0;return!1}function qt(e,t){for(const n of e){if(n.path===t)return n.size;if(n.children){const r=qt(n.children,t);if(r!==void 0)return r}}}function Xt(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Yt({nodes:e,selectedPath:t,onSelect:n,onDelete:r,depth:o=0}){const[a,l]=f.useState(()=>{const i=new Set;return o<2&&e.filter(s=>s.type==="directory").forEach(s=>i.add(s.path)),i});return m.jsx("div",{children:e.map(i=>{const s=i.type==="directory",c=a.has(i.path),u=i.path===t;return m.jsxs("div",{className:"group/file",children:[m.jsxs("button",{onClick:()=>{s?l(v=>{const p=new Set(v);return p.has(i.path)?p.delete(i.path):p.add(i.path),p}):n(i.path,i.name)},className:`w-full text-left flex items-center gap-1.5 px-2 py-1 text-xs font-mono rounded transition-colors ${u?"bg-accent-product/10 text-accent-product":"text-charcoal/70 hover:bg-white/40"}`,style:{paddingLeft:`${o*14+8}px`},children:[s?m.jsx("span",{className:"text-[10px] text-slate w-3 text-center flex-shrink-0",children:c?"v":">"}):m.jsx("span",{className:"w-3 flex-shrink-0"}),m.jsx("span",{className:`text-[10px] font-bold w-5 text-center flex-shrink-0 ${s?"text-accent-product":Vt(i.name)}`,children:Gt(i.name,i.type)}),m.jsxs("span",{className:"truncate",children:[i.name,s?"/":""]}),!s&&i.size!=null&&i.size>0&&m.jsx("span",{className:"text-[10px] text-slate/40 ml-auto flex-shrink-0",children:Xt(i.size)}),!s&&r&&m.jsx("span",{role:"button",tabIndex:-1,onClick:v=>{v.stopPropagation(),r(i.path,i.name)},onKeyDown:v=>{v.key==="Enter"&&(v.stopPropagation(),r(i.path,i.name))},className:"text-[10px] text-slate/30 hover:text-red-500 ml-1 flex-shrink-0 opacity-0 group-hover/file:opacity-100 transition-opacity cursor-pointer",title:"Delete file",children:"x"})]}),s&&c&&i.children&&m.jsx(Yt,{nodes:i.children,selectedPath:t,onSelect:n,onDelete:r,depth:o+1})]},i.path)})})}function Gr({session:e,onClose:t}){var W;const[n,r]=f.useState(null),[o,a]=f.useState(""),[l,i]=f.useState(null),[s,c]=f.useState(null),[u,v]=f.useState(!1),[p,L]=f.useState(!1),[y,h]=f.useState(!1),[b,x]=f.useState(!1),[d,S]=f.useState(e),w=f.useRef(null),g=Ut(d.files),C=`/api/sessions/${encodeURIComponent(d.id)}/preview/index.html`,j=f.useCallback(async()=>{try{const E=await K.getSessionDetail(d.id);S(E)}catch{}},[d.id]),N=f.useCallback(async(E,T)=>{if(!(y&&!window.confirm("Unsaved changes. Discard?"))){r(E),a(T),v(!0),h(!1);try{const H=d.id?await K.getSessionFileContent(d.id,E):await K.getFileContent(E);i(H.content),c(H.content)}catch{i("[Error loading file]"),c("[Error loading file]")}finally{v(!1)}}},[d.id,y]),F=f.useCallback(async()=>{if(!(!n||s===null||!d.id)){x(!0);try{await K.saveSessionFile(d.id,n,s),i(s),h(!1)}catch(E){const T=E instanceof Error?E.message:"Unknown error";window.alert(`Save failed: ${T}`)}finally{x(!1)}}},[n,s,d.id]);f.useEffect(()=>{const E=T=>{(T.metaKey||T.ctrlKey)&&T.key==="s"&&(T.preventDefault(),y&&n&&F())};return window.addEventListener("keydown",E),()=>window.removeEventListener("keydown",E)},[y,n,F]),f.useEffect(()=>{const E=d.files.find(T=>T.name==="index.html"&&T.type==="file");E&&(N(E.path,E.name),L(!0))},[]);const k=f.useCallback(E=>{E!==void 0&&(c(E),h(E!==l))},[l]),P=f.useCallback(E=>{w.current=E},[]),M=f.useCallback(async()=>{const E=window.prompt("New file name (e.g. src/utils.ts):");if(!(!E||!E.trim()))try{await K.createSessionFile(d.id,E.trim()),await j()}catch(T){const H=T instanceof Error?T.message:"Unknown error";window.alert(`Create file failed: ${H}`)}},[d.id,j]),D=f.useCallback(async()=>{const E=window.prompt("New folder name (e.g. src/components):");if(!(!E||!E.trim()))try{await K.createSessionDirectory(d.id,E.trim()),await j()}catch(T){const H=T instanceof Error?T.message:"Unknown error";window.alert(`Create folder failed: ${H}`)}},[d.id,j]),A=f.useCallback(async(E,T)=>{if(window.confirm(`Delete "${T}"?`))try{await K.deleteSessionFile(d.id,E),n===E&&(r(null),a(""),i(null),c(null),h(!1)),await j()}catch(O){const I=O instanceof Error?O.message:"Unknown error";window.alert(`Delete failed: ${I}`)}},[d.id,n,j]),z=n?qt(d.files,n):void 0,R=((W=o.split(".").pop())==null?void 0:W.toUpperCase())||"";return m.jsxs("div",{className:"flex flex-col h-full",children:[m.jsxs("div",{className:"glass px-5 py-3 flex items-center gap-4 flex-shrink-0 border-b border-white/10",children:[m.jsx("button",{onClick:()=>{y&&!window.confirm("Unsaved changes. Discard?")||t()},className:"text-xs font-medium px-3 py-1.5 rounded-lg border border-white/20 text-slate hover:text-charcoal hover:bg-white/30 transition-colors",children:"Back"}),m.jsxs("div",{className:"flex-1 min-w-0",children:[m.jsx("h2",{className:"text-sm font-bold text-charcoal truncate",children:d.id}),m.jsx("p",{className:"text-[10px] font-mono text-slate truncate",children:d.path})]}),m.jsx("span",{className:`text-[10px] font-semibold px-2 py-0.5 rounded-full ${d.status==="completed"||d.status==="completion_promise_fulfilled"?"bg-success/10 text-success":"bg-slate/10 text-slate"}`,children:d.status}),g&&m.jsx("button",{onClick:()=>L(!p),className:`text-xs font-medium px-3 py-1.5 rounded-lg border transition-colors ${p?"border-accent-product/40 bg-accent-product/10 text-accent-product":"border-white/20 text-slate hover:text-charcoal hover:bg-white/30"}`,children:p?"Hide Preview":"Preview"})]}),m.jsx("div",{className:"flex-1 min-h-0",children:m.jsxs(Ht,{orientation:"horizontal",className:"h-full",children:[m.jsx(Me,{defaultSize:20,minSize:15,children:m.jsxs("div",{className:"h-full flex flex-col border-r border-white/10 bg-white/30",children:[m.jsxs("div",{className:"px-3 py-2 border-b border-white/10 flex items-center gap-2",children:[m.jsx("span",{className:"text-[10px] text-slate uppercase tracking-wider font-semibold flex-1",children:"Files"}),m.jsx("button",{onClick:M,title:"New File",className:"text-[10px] text-slate hover:text-accent-product px-1.5 py-0.5 rounded border border-white/20 hover:border-accent-product/30 transition-colors",children:"+ File"}),m.jsx("button",{onClick:D,title:"New Folder",className:"text-[10px] text-slate hover:text-accent-product px-1.5 py-0.5 rounded border border-white/20 hover:border-accent-product/30 transition-colors",children:"+ Dir"})]}),m.jsx("div",{className:"flex-1 overflow-y-auto terminal-scroll",children:d.files.length>0?m.jsx(Yt,{nodes:d.files,selectedPath:n,onSelect:N,onDelete:A}):m.jsx("div",{className:"p-4 text-xs text-slate",children:"No files"})})]})}),m.jsx(Ae,{className:"w-1 bg-white/10 hover:bg-accent-product/30 transition-colors cursor-col-resize"}),m.jsx(Me,{defaultSize:p?50:80,minSize:25,children:m.jsx("div",{className:"h-full flex flex-col min-w-0",children:n?m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"px-4 py-2 border-b border-white/10 flex items-center gap-2 flex-shrink-0 bg-white/20",children:[m.jsx("span",{className:`text-[10px] font-bold ${Vt(o)}`,children:Gt(o,"file")}),m.jsx("span",{className:"text-xs font-mono text-charcoal truncate",children:n}),y&&m.jsx("span",{className:"w-2 h-2 rounded-full bg-accent-product flex-shrink-0",title:"Unsaved changes"}),b&&m.jsx("span",{className:"text-[10px] text-accent-product animate-pulse flex-shrink-0",children:"Saving..."}),m.jsx("span",{className:"ml-auto text-[10px] text-slate/50 font-mono",children:z!=null?Xt(z):""}),m.jsx("span",{className:"text-[10px] text-slate/40 font-mono uppercase",children:R}),y&&m.jsx("button",{onClick:F,className:"text-[10px] font-medium px-2 py-0.5 rounded border border-accent-product/40 bg-accent-product/10 text-accent-product hover:bg-accent-product/20 transition-colors",children:"Save"})]}),m.jsx("div",{className:"flex-1 min-h-0",children:u?m.jsx("div",{className:"text-slate text-xs animate-pulse p-4",children:"Loading..."}):m.jsx(cr,{value:s??"",language:Vr(o),theme:"vs",onChange:k,onMount:P,options:{minimap:{enabled:!1},fontSize:13,lineNumbers:"on",wordWrap:"on",scrollBeyondLastLine:!1,automaticLayout:!0,padding:{top:8},renderLineHighlight:"line",smoothScrolling:!0,cursorBlinking:"smooth",folding:!0,bracketPairColorization:{enabled:!0}}})})]}):m.jsx("div",{className:"flex-1 flex items-center justify-center text-slate text-sm",children:"Select a file to view its contents"})})}),p&&m.jsxs(m.Fragment,{children:[m.jsx(Ae,{className:"w-1 bg-white/10 hover:bg-accent-product/30 transition-colors cursor-col-resize"}),m.jsx(Me,{defaultSize:30,minSize:20,collapsible:!0,children:m.jsxs("div",{className:"h-full flex flex-col border-l border-white/10",children:[m.jsxs("div",{className:"px-4 py-2 border-b border-white/10 flex items-center gap-2 flex-shrink-0 bg-white/20",children:[m.jsx("span",{className:"text-xs font-semibold text-charcoal",children:"Live Preview"}),m.jsx("span",{className:"text-[10px] font-mono text-slate/50 truncate ml-auto",children:C})]}),m.jsx("div",{className:"flex-1 bg-white",children:m.jsx("iframe",{src:C,title:"Project Preview",className:"w-full h-full border-0",sandbox:"allow-scripts allow-same-origin allow-forms allow-popups"})})]})})]})]})})]})}function Xr(){const{sessionId:e}=Kt(),t=Qt(),[n,r]=f.useState(null),[o,a]=f.useState(!0),[l,i]=f.useState(null);return f.useEffect(()=>{e&&(a(!0),i(null),K.getSessionDetail(e).then(s=>{r(s),a(!1)}).catch(s=>{i(s instanceof Error?s.message:"Failed to load session"),a(!1)}))},[e]),o?m.jsxs("div",{className:"h-screen bg-background flex flex-col",children:[m.jsx(Re,{status:null,wsConnected:!1}),m.jsx("div",{className:"flex-1 flex items-center justify-center",children:m.jsxs("div",{className:"text-center",children:[m.jsx("div",{className:"text-slate animate-pulse text-sm",children:"Loading project..."}),m.jsx("div",{className:"text-[10px] font-mono text-slate/50 mt-2",children:e})]})})]}):l||!n?m.jsxs("div",{className:"h-screen bg-background flex flex-col",children:[m.jsx(Re,{status:null,wsConnected:!1}),m.jsx("div",{className:"flex-1 flex items-center justify-center",children:m.jsxs("div",{className:"text-center",children:[m.jsx("p",{className:"text-danger text-sm font-medium",children:"Project not found"}),m.jsx("p",{className:"text-xs text-slate mt-1",children:l||`Session ${e} does not exist`}),m.jsx("button",{onClick:()=>t("/"),className:"mt-4 px-4 py-2 rounded-xl text-sm font-semibold border border-accent-product/30 text-accent-product hover:bg-accent-product/5 transition-all",children:"Back to Home"})]})})]}):m.jsxs("div",{className:"h-screen bg-background flex flex-col",children:[m.jsx(Re,{status:null,wsConnected:!1}),m.jsx("div",{className:"flex-1 min-h-0",children:m.jsx(Zt,{name:"ProjectWorkspace",children:m.jsx(Gr,{session:n,onClose:()=>t("/")})})})]})}export{Xr as default};
|