ctxloom-pro 1.0.13 → 1.0.15
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/apps/dashboard/dist/dashboard/client/assets/{index-DpZFZ0hK.js → index-CaOXYzr6.js} +52 -51
- package/apps/dashboard/dist/dashboard/client/assets/index-CzVWHO8g.css +1 -0
- package/apps/dashboard/dist/dashboard/client/index.html +2 -2
- package/apps/dashboard/dist/server/index.js +176 -43
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/apps/dashboard/dist/dashboard/client/assets/index-BoOuiK6f.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://cdn.jsdelivr.net/npm/geist@1.3.0/dist/fonts/geist-sans/style.css";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-3{bottom:.75rem}.left-2{left:.5rem}.left-3{left:.75rem}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-6{height:1.5rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:12rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-36{width:9rem}.w-48{width:12rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-\[680px\]{width:680px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-full{min-width:100%}.max-w-3xl{max-width:48rem}.max-w-\[60\%\]{max-width:60%}.max-w-full{max-width:100%}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.scroll-mt-6{scroll-margin-top:1.5rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-between{justify-content:space-between}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.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-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-\[rgba\(255\,255\,255\,0\.05\)\]>:not([hidden])~:not([hidden]){border-color:#ffffff0d}.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-pre{white-space:pre}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-\[rgba\(255\,255\,255\,0\.05\)\]{border-color:#ffffff0d}.border-red-500\/30{border-color:#ef44444d}.border-white\/10{border-color:#ffffff1a}.border-yellow-500\/30{border-color:#eab3084d}.bg-\[\#131220\]{--tw-bg-opacity: 1;background-color:rgb(19 18 32 / var(--tw-bg-opacity, 1))}.bg-\[\#18181f\]{--tw-bg-opacity: 1;background-color:rgb(24 24 31 / var(--tw-bg-opacity, 1))}.bg-\[\#1e1d2a\]{--tw-bg-opacity: 1;background-color:rgb(30 29 42 / var(--tw-bg-opacity, 1))}.bg-\[\#1f1e2c\]{--tw-bg-opacity: 1;background-color:rgb(31 30 44 / var(--tw-bg-opacity, 1))}.bg-\[\#603dc6\]{--tw-bg-opacity: 1;background-color:rgb(96 61 198 / var(--tw-bg-opacity, 1))}.bg-\[\#603dc6\]\/10{background-color:#603dc61a}.bg-\[\#603dc6\]\/15{background-color:#603dc626}.bg-\[\#603dc6\]\/20{background-color:#603dc633}.bg-black\/40{background-color:#0006}.bg-green-900\/50{background-color:#14532d80}.bg-orange-900\/50{background-color:#7c2d1280}.bg-red-900\/30{background-color:#7f1d1d4d}.bg-red-900\/50{background-color:#7f1d1d80}.bg-white\/10{background-color:#ffffff1a}.bg-yellow-900\/10{background-color:#713f121a}.bg-yellow-900\/20{background-color:#713f1233}.bg-yellow-900\/50{background-color:#713f1280}.p-0\.5{padding:.125rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.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-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-16{padding-bottom:4rem}.pt-0\.5{padding-top:.125rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-\[\#603dc6\]{--tw-text-opacity: 1;color:rgb(96 61 198 / var(--tw-text-opacity, 1))}.text-\[\#a78bfa\]{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-orange-300{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400\/80{color:#f87171cc}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/20{color:#fff3}.text-white\/30{color:#ffffff4d}.text-white\/40{color:#fff6}.text-white\/50{color:#ffffff80}.text-white\/60{color:#fff9}.text-white\/70{color:#ffffffb3}.text-white\/80{color:#fffc}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-white\/30{text-decoration-color:#ffffff4d}.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)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--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(3px + 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)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--brand: #603dc6;--brand-light: #7c5fd6}body{font-family:Geist,system-ui,sans-serif;background:#18181f;color:#fafafa}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#2e2c44;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#603dc6}.placeholder\:text-white\/30::-moz-placeholder{color:#ffffff4d}.placeholder\:text-white\/30::placeholder{color:#ffffff4d}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-\[\#603dc6\]\/60:hover{border-color:#603dc699}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:bg-\[\#603dc6\]\/30:hover{background-color:#603dc64d}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-\[\#a78bfa\]:hover{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.hover\:text-white\/70:hover{color:#ffffffb3}.hover\:ring-1:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:ring-\[\#603dc6\]\/40:hover{--tw-ring-color: rgb(96 61 198 / .4)}.focus\:border-\[\#603dc6\]\/50:focus{border-color:#603dc680}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-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-\[\#603dc6\]\/50:focus{--tw-ring-color: rgb(96 61 198 / .5)}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width: 1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>ctxloom dashboard</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-CaOXYzr6.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CzVWHO8g.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -160,7 +160,7 @@ var init_VectorStore = __esm({
|
|
|
160
160
|
// server/index.ts
|
|
161
161
|
import express from "express";
|
|
162
162
|
import cors from "cors";
|
|
163
|
-
import
|
|
163
|
+
import path37 from "path";
|
|
164
164
|
import fs29 from "fs";
|
|
165
165
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
166
166
|
|
|
@@ -3058,8 +3058,8 @@ var CoChangeIndex = class _CoChangeIndex {
|
|
|
3058
3058
|
if (event.isBulk || event.isMerge) return;
|
|
3059
3059
|
const paths = event.files.map((f) => f.path);
|
|
3060
3060
|
if (paths.length === 0) return;
|
|
3061
|
-
for (const
|
|
3062
|
-
this.nodeCounts.set(
|
|
3061
|
+
for (const path38 of paths) {
|
|
3062
|
+
this.nodeCounts.set(path38, (this.nodeCounts.get(path38) ?? 0) + 1);
|
|
3063
3063
|
}
|
|
3064
3064
|
for (let i = 0; i < paths.length; i++) {
|
|
3065
3065
|
for (let j = i + 1; j < paths.length; j++) {
|
|
@@ -3206,8 +3206,8 @@ var ChurnIndex = class _ChurnIndex {
|
|
|
3206
3206
|
*/
|
|
3207
3207
|
snapshot() {
|
|
3208
3208
|
const nodes = {};
|
|
3209
|
-
for (const [
|
|
3210
|
-
nodes[
|
|
3209
|
+
for (const [path38, raw] of this.nodes) {
|
|
3210
|
+
nodes[path38] = {
|
|
3211
3211
|
commits: raw.commits,
|
|
3212
3212
|
churnLines: raw.churnLines,
|
|
3213
3213
|
bugCommits: raw.bugCommits,
|
|
@@ -3222,8 +3222,8 @@ var ChurnIndex = class _ChurnIndex {
|
|
|
3222
3222
|
*/
|
|
3223
3223
|
static load(s) {
|
|
3224
3224
|
const idx = new _ChurnIndex();
|
|
3225
|
-
for (const [
|
|
3226
|
-
idx.nodes.set(
|
|
3225
|
+
for (const [path38, raw] of Object.entries(s.nodes)) {
|
|
3226
|
+
idx.nodes.set(path38, {
|
|
3227
3227
|
commits: raw.commits,
|
|
3228
3228
|
churnLines: raw.churnLines,
|
|
3229
3229
|
bugCommits: raw.bugCommits,
|
|
@@ -3236,8 +3236,8 @@ var ChurnIndex = class _ChurnIndex {
|
|
|
3236
3236
|
// -------------------------------------------------------------------------
|
|
3237
3237
|
// Private helpers
|
|
3238
3238
|
// -------------------------------------------------------------------------
|
|
3239
|
-
getOrCreate(
|
|
3240
|
-
const existing = this.nodes.get(
|
|
3239
|
+
getOrCreate(path38) {
|
|
3240
|
+
const existing = this.nodes.get(path38);
|
|
3241
3241
|
if (existing !== void 0) return existing;
|
|
3242
3242
|
const fresh = {
|
|
3243
3243
|
commits: 0,
|
|
@@ -3246,7 +3246,7 @@ var ChurnIndex = class _ChurnIndex {
|
|
|
3246
3246
|
authorCounts: {},
|
|
3247
3247
|
lastTouch: 0
|
|
3248
3248
|
};
|
|
3249
|
-
this.nodes.set(
|
|
3249
|
+
this.nodes.set(path38, fresh);
|
|
3250
3250
|
return fresh;
|
|
3251
3251
|
}
|
|
3252
3252
|
};
|
|
@@ -3327,12 +3327,12 @@ var OwnershipIndex = class _OwnershipIndex {
|
|
|
3327
3327
|
*/
|
|
3328
3328
|
snapshot() {
|
|
3329
3329
|
const nodes = {};
|
|
3330
|
-
for (const [
|
|
3330
|
+
for (const [path38, raw] of this.nodes) {
|
|
3331
3331
|
const authorWeights = {};
|
|
3332
3332
|
for (const [email, entry] of Object.entries(raw.authorWeights)) {
|
|
3333
3333
|
authorWeights[email] = { ...entry };
|
|
3334
3334
|
}
|
|
3335
|
-
nodes[
|
|
3335
|
+
nodes[path38] = { authorWeights, lastTouch: raw.lastTouch };
|
|
3336
3336
|
}
|
|
3337
3337
|
return { version: 1, nodes };
|
|
3338
3338
|
}
|
|
@@ -3341,23 +3341,23 @@ var OwnershipIndex = class _OwnershipIndex {
|
|
|
3341
3341
|
*/
|
|
3342
3342
|
static load(s) {
|
|
3343
3343
|
const idx = new _OwnershipIndex();
|
|
3344
|
-
for (const [
|
|
3344
|
+
for (const [path38, raw] of Object.entries(s.nodes)) {
|
|
3345
3345
|
const authorWeights = {};
|
|
3346
3346
|
for (const [email, entry] of Object.entries(raw.authorWeights)) {
|
|
3347
3347
|
authorWeights[email] = { ...entry };
|
|
3348
3348
|
}
|
|
3349
|
-
idx.nodes.set(
|
|
3349
|
+
idx.nodes.set(path38, { authorWeights, lastTouch: raw.lastTouch });
|
|
3350
3350
|
}
|
|
3351
3351
|
return idx;
|
|
3352
3352
|
}
|
|
3353
3353
|
// -------------------------------------------------------------------------
|
|
3354
3354
|
// Private helpers
|
|
3355
3355
|
// -------------------------------------------------------------------------
|
|
3356
|
-
getOrCreate(
|
|
3357
|
-
const existing = this.nodes.get(
|
|
3356
|
+
getOrCreate(path38) {
|
|
3357
|
+
const existing = this.nodes.get(path38);
|
|
3358
3358
|
if (existing !== void 0) return existing;
|
|
3359
3359
|
const fresh = { authorWeights: {}, lastTouch: 0 };
|
|
3360
|
-
this.nodes.set(
|
|
3360
|
+
this.nodes.set(path38, fresh);
|
|
3361
3361
|
return fresh;
|
|
3362
3362
|
}
|
|
3363
3363
|
};
|
|
@@ -4350,8 +4350,8 @@ function getErrorMap() {
|
|
|
4350
4350
|
|
|
4351
4351
|
// ../../node_modules/zod/v3/helpers/parseUtil.js
|
|
4352
4352
|
var makeIssue = (params) => {
|
|
4353
|
-
const { data, path:
|
|
4354
|
-
const fullPath = [...
|
|
4353
|
+
const { data, path: path38, errorMaps, issueData } = params;
|
|
4354
|
+
const fullPath = [...path38, ...issueData.path || []];
|
|
4355
4355
|
const fullIssue = {
|
|
4356
4356
|
...issueData,
|
|
4357
4357
|
path: fullPath
|
|
@@ -4467,11 +4467,11 @@ var errorUtil;
|
|
|
4467
4467
|
|
|
4468
4468
|
// ../../node_modules/zod/v3/types.js
|
|
4469
4469
|
var ParseInputLazyPath = class {
|
|
4470
|
-
constructor(parent, value,
|
|
4470
|
+
constructor(parent, value, path38, key) {
|
|
4471
4471
|
this._cachedPath = [];
|
|
4472
4472
|
this.parent = parent;
|
|
4473
4473
|
this.data = value;
|
|
4474
|
-
this._path =
|
|
4474
|
+
this._path = path38;
|
|
4475
4475
|
this._key = key;
|
|
4476
4476
|
}
|
|
4477
4477
|
get path() {
|
|
@@ -10916,6 +10916,14 @@ async function reloadContext(ctx) {
|
|
|
10916
10916
|
ctx.gitEnabled = fresh.gitEnabled;
|
|
10917
10917
|
ctx.lastIndexed = fresh.lastIndexed;
|
|
10918
10918
|
}
|
|
10919
|
+
async function switchContext(ctx, newRoot) {
|
|
10920
|
+
const fresh = await loadContext(newRoot);
|
|
10921
|
+
ctx.root = fresh.root;
|
|
10922
|
+
ctx.graph = fresh.graph;
|
|
10923
|
+
ctx.overlay = fresh.overlay;
|
|
10924
|
+
ctx.gitEnabled = fresh.gitEnabled;
|
|
10925
|
+
ctx.lastIndexed = fresh.lastIndexed;
|
|
10926
|
+
}
|
|
10919
10927
|
|
|
10920
10928
|
// server/routes/overview.ts
|
|
10921
10929
|
import { Router } from "express";
|
|
@@ -11257,8 +11265,113 @@ function buildTrendsRouter(ctx) {
|
|
|
11257
11265
|
return router;
|
|
11258
11266
|
}
|
|
11259
11267
|
|
|
11268
|
+
// server/routes/projects.ts
|
|
11269
|
+
import { Router as Router11 } from "express";
|
|
11270
|
+
import path36 from "path";
|
|
11271
|
+
|
|
11272
|
+
// server/projects.ts
|
|
11273
|
+
import { existsSync as existsSync2, readFileSync as readFileSync3 } from "fs";
|
|
11274
|
+
import os4 from "os";
|
|
11275
|
+
import path35 from "path";
|
|
11276
|
+
import crypto5 from "crypto";
|
|
11277
|
+
var HOME = os4.homedir();
|
|
11278
|
+
var REGISTRY_PATH = path35.join(HOME, ".ctxloom", "repos.json");
|
|
11279
|
+
function slugFor(root) {
|
|
11280
|
+
const abs = path35.resolve(root);
|
|
11281
|
+
return crypto5.createHash("sha1").update(abs).digest("hex").slice(0, 12);
|
|
11282
|
+
}
|
|
11283
|
+
function readRegistry() {
|
|
11284
|
+
if (!existsSync2(REGISTRY_PATH)) return [];
|
|
11285
|
+
try {
|
|
11286
|
+
const raw = readFileSync3(REGISTRY_PATH, "utf-8");
|
|
11287
|
+
const parsed = JSON.parse(raw);
|
|
11288
|
+
if (!Array.isArray(parsed)) return [];
|
|
11289
|
+
return parsed.filter((r) => typeof r?.root === "string");
|
|
11290
|
+
} catch {
|
|
11291
|
+
return [];
|
|
11292
|
+
}
|
|
11293
|
+
}
|
|
11294
|
+
function listProjects(defaultRoot) {
|
|
11295
|
+
const absDefault = path35.resolve(defaultRoot);
|
|
11296
|
+
const out = [
|
|
11297
|
+
{
|
|
11298
|
+
slug: slugFor(absDefault),
|
|
11299
|
+
name: path35.basename(absDefault) || absDefault,
|
|
11300
|
+
root: absDefault,
|
|
11301
|
+
isDefault: true,
|
|
11302
|
+
hasSnapshot: existsSync2(path35.join(absDefault, ".ctxloom"))
|
|
11303
|
+
}
|
|
11304
|
+
];
|
|
11305
|
+
const seen = /* @__PURE__ */ new Set([absDefault]);
|
|
11306
|
+
for (const entry of readRegistry()) {
|
|
11307
|
+
const abs = path35.resolve(entry.root);
|
|
11308
|
+
if (seen.has(abs)) continue;
|
|
11309
|
+
seen.add(abs);
|
|
11310
|
+
out.push({
|
|
11311
|
+
slug: slugFor(abs),
|
|
11312
|
+
name: entry.name ?? (path35.basename(abs) || abs),
|
|
11313
|
+
root: abs,
|
|
11314
|
+
isDefault: false,
|
|
11315
|
+
hasSnapshot: existsSync2(path35.join(abs, ".ctxloom"))
|
|
11316
|
+
});
|
|
11317
|
+
}
|
|
11318
|
+
return out;
|
|
11319
|
+
}
|
|
11320
|
+
|
|
11321
|
+
// server/routes/projects.ts
|
|
11322
|
+
function buildProjectsRouter(deps) {
|
|
11323
|
+
const { ctx, defaultRoot, onActiveChanged } = deps;
|
|
11324
|
+
const router = Router11();
|
|
11325
|
+
function annotated() {
|
|
11326
|
+
const activeSlug = slugFor(ctx.root);
|
|
11327
|
+
return listProjects(defaultRoot).map((p) => ({
|
|
11328
|
+
...p,
|
|
11329
|
+
isActive: p.slug === activeSlug
|
|
11330
|
+
}));
|
|
11331
|
+
}
|
|
11332
|
+
router.get("/", (_req, res) => {
|
|
11333
|
+
res.json({ projects: annotated() });
|
|
11334
|
+
});
|
|
11335
|
+
router.get("/active", (_req, res) => {
|
|
11336
|
+
const activeSlug = slugFor(ctx.root);
|
|
11337
|
+
const active = annotated().find((p) => p.slug === activeSlug);
|
|
11338
|
+
if (!active) {
|
|
11339
|
+
res.status(500).json({ error: "active project not found in candidate list" });
|
|
11340
|
+
return;
|
|
11341
|
+
}
|
|
11342
|
+
res.json({ active });
|
|
11343
|
+
});
|
|
11344
|
+
router.post("/active", async (req, res) => {
|
|
11345
|
+
const slug = req.body?.slug;
|
|
11346
|
+
if (typeof slug !== "string" || slug.length === 0) {
|
|
11347
|
+
res.status(400).json({ error: 'body must include a "slug" string' });
|
|
11348
|
+
return;
|
|
11349
|
+
}
|
|
11350
|
+
const target = listProjects(defaultRoot).find((p) => p.slug === slug);
|
|
11351
|
+
if (!target) {
|
|
11352
|
+
res.status(404).json({ error: `unknown project slug: ${slug}` });
|
|
11353
|
+
return;
|
|
11354
|
+
}
|
|
11355
|
+
if (slugFor(ctx.root) === target.slug) {
|
|
11356
|
+
res.json({ active: { ...target, isActive: true } });
|
|
11357
|
+
return;
|
|
11358
|
+
}
|
|
11359
|
+
try {
|
|
11360
|
+
await switchContext(ctx, target.root);
|
|
11361
|
+
await onActiveChanged(target.root);
|
|
11362
|
+
res.json({ active: { ...target, isActive: true } });
|
|
11363
|
+
} catch (err) {
|
|
11364
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
11365
|
+
res.status(500).json({
|
|
11366
|
+
error: `failed to switch to ${path36.basename(target.root)}: ${detail}`
|
|
11367
|
+
});
|
|
11368
|
+
}
|
|
11369
|
+
});
|
|
11370
|
+
return router;
|
|
11371
|
+
}
|
|
11372
|
+
|
|
11260
11373
|
// server/index.ts
|
|
11261
|
-
var __dirname2 =
|
|
11374
|
+
var __dirname2 = path37.dirname(fileURLToPath2(import.meta.url));
|
|
11262
11375
|
async function startDashboard(options) {
|
|
11263
11376
|
const { root, port, open } = options;
|
|
11264
11377
|
console.log(`ctxloom dashboard \u2014 loading context from ${root}...`);
|
|
@@ -11306,30 +11419,50 @@ async function startDashboard(options) {
|
|
|
11306
11419
|
reloading = false;
|
|
11307
11420
|
}
|
|
11308
11421
|
});
|
|
11309
|
-
const snapshotDir = path35.join(root, ".ctxloom");
|
|
11310
11422
|
let debounce = null;
|
|
11311
|
-
|
|
11312
|
-
|
|
11313
|
-
|
|
11314
|
-
|
|
11315
|
-
|
|
11316
|
-
|
|
11317
|
-
|
|
11318
|
-
|
|
11319
|
-
|
|
11320
|
-
|
|
11321
|
-
|
|
11322
|
-
|
|
11323
|
-
|
|
11324
|
-
|
|
11325
|
-
|
|
11326
|
-
|
|
11327
|
-
|
|
11423
|
+
let activeWatcher = null;
|
|
11424
|
+
function attachSnapshotWatcher(targetRoot) {
|
|
11425
|
+
if (activeWatcher) {
|
|
11426
|
+
try {
|
|
11427
|
+
activeWatcher.close();
|
|
11428
|
+
} catch {
|
|
11429
|
+
}
|
|
11430
|
+
activeWatcher = null;
|
|
11431
|
+
}
|
|
11432
|
+
const snapshotDir = path37.join(targetRoot, ".ctxloom");
|
|
11433
|
+
try {
|
|
11434
|
+
activeWatcher = fs29.watch(snapshotDir, (_event, filename) => {
|
|
11435
|
+
if (!filename || !filename.includes("snapshot")) return;
|
|
11436
|
+
if (debounce) clearTimeout(debounce);
|
|
11437
|
+
debounce = setTimeout(async () => {
|
|
11438
|
+
if (reloading) return;
|
|
11439
|
+
reloading = true;
|
|
11440
|
+
try {
|
|
11441
|
+
console.log(`[dashboard] ${filename} changed, reloading\u2026`);
|
|
11442
|
+
await reloadContext(ctx);
|
|
11443
|
+
console.log(`[dashboard] auto-reload done \u2014 ${ctx.graph.allFiles().length} files`);
|
|
11444
|
+
} finally {
|
|
11445
|
+
reloading = false;
|
|
11446
|
+
}
|
|
11447
|
+
}, 500);
|
|
11448
|
+
});
|
|
11449
|
+
} catch {
|
|
11450
|
+
}
|
|
11328
11451
|
}
|
|
11329
|
-
|
|
11452
|
+
attachSnapshotWatcher(ctx.root);
|
|
11453
|
+
app.use("/api/projects", buildProjectsRouter({
|
|
11454
|
+
ctx,
|
|
11455
|
+
defaultRoot: root,
|
|
11456
|
+
onActiveChanged: async (newRoot) => {
|
|
11457
|
+
console.log(`[dashboard] switched active project \u2192 ${newRoot}`);
|
|
11458
|
+
console.log(` ${ctx.graph.allFiles().length} files, ${ctx.graph.edgeCount()} edges, git=${ctx.gitEnabled}`);
|
|
11459
|
+
attachSnapshotWatcher(newRoot);
|
|
11460
|
+
}
|
|
11461
|
+
}));
|
|
11462
|
+
const clientDist = path37.join(__dirname2, "../dashboard/client");
|
|
11330
11463
|
app.use(express.static(clientDist));
|
|
11331
|
-
app.get(
|
|
11332
|
-
res.sendFile(
|
|
11464
|
+
app.get(/.*/, (_req, res) => {
|
|
11465
|
+
res.sendFile(path37.join(clientDist, "index.html"));
|
|
11333
11466
|
});
|
|
11334
11467
|
app.listen(port, () => {
|
|
11335
11468
|
const url = `http://localhost:${port}`;
|
package/dist/index.js
CHANGED
|
@@ -512,7 +512,7 @@ try {
|
|
|
512
512
|
} catch {
|
|
513
513
|
}
|
|
514
514
|
var args = process.argv.slice(2);
|
|
515
|
-
var ctxloomVersion = "1.0.
|
|
515
|
+
var ctxloomVersion = "1.0.15".length > 0 ? "1.0.15" : "dev";
|
|
516
516
|
if (args.includes("--version") || args.includes("-v")) {
|
|
517
517
|
process.stdout.write(`ctxloom ${ctxloomVersion}
|
|
518
518
|
`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ctxloom-pro",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.15",
|
|
4
4
|
"description": "ctxloom — The Universal Code Context Engine. A local-first MCP server providing intelligent code context via hybrid Vector + AST + Graph search with Skeletonization (92% token reduction).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@import"https://cdn.jsdelivr.net/npm/geist@1.3.0/dist/fonts/geist-sans/style.css";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-3{bottom:.75rem}.left-3{left:.75rem}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-6{height:1.5rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:12rem}.w-2\.5{width:.625rem}.w-36{width:9rem}.w-48{width:12rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-\[680px\]{width:680px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-full{min-width:100%}.max-w-3xl{max-width:48rem}.max-w-\[60\%\]{max-width:60%}.max-w-full{max-width:100%}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.scroll-mt-6{scroll-margin-top:1.5rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-between{justify-content:space-between}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.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-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-\[rgba\(255\,255\,255\,0\.05\)\]>:not([hidden])~:not([hidden]){border-color:#ffffff0d}.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-pre{white-space:pre}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-\[rgba\(255\,255\,255\,0\.05\)\]{border-color:#ffffff0d}.border-red-500\/30{border-color:#ef44444d}.border-white\/10{border-color:#ffffff1a}.border-yellow-500\/30{border-color:#eab3084d}.bg-\[\#131220\]{--tw-bg-opacity: 1;background-color:rgb(19 18 32 / var(--tw-bg-opacity, 1))}.bg-\[\#18181f\]{--tw-bg-opacity: 1;background-color:rgb(24 24 31 / var(--tw-bg-opacity, 1))}.bg-\[\#1e1d2a\]{--tw-bg-opacity: 1;background-color:rgb(30 29 42 / var(--tw-bg-opacity, 1))}.bg-\[\#603dc6\]{--tw-bg-opacity: 1;background-color:rgb(96 61 198 / var(--tw-bg-opacity, 1))}.bg-\[\#603dc6\]\/15{background-color:#603dc626}.bg-\[\#603dc6\]\/20{background-color:#603dc633}.bg-black\/40{background-color:#0006}.bg-green-900\/50{background-color:#14532d80}.bg-orange-900\/50{background-color:#7c2d1280}.bg-red-900\/30{background-color:#7f1d1d4d}.bg-red-900\/50{background-color:#7f1d1d80}.bg-white\/10{background-color:#ffffff1a}.bg-yellow-900\/10{background-color:#713f121a}.bg-yellow-900\/20{background-color:#713f1233}.bg-yellow-900\/50{background-color:#713f1280}.p-0\.5{padding:.125rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.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-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-16{padding-bottom:4rem}.pt-0\.5{padding-top:.125rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-\[\#603dc6\]{--tw-text-opacity: 1;color:rgb(96 61 198 / var(--tw-text-opacity, 1))}.text-\[\#a78bfa\]{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-orange-300{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/20{color:#fff3}.text-white\/30{color:#ffffff4d}.text-white\/40{color:#fff6}.text-white\/50{color:#ffffff80}.text-white\/60{color:#fff9}.text-white\/70{color:#ffffffb3}.text-white\/80{color:#fffc}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-white\/30{text-decoration-color:#ffffff4d}.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)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--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(3px + 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)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--brand: #603dc6;--brand-light: #7c5fd6}body{font-family:Geist,system-ui,sans-serif;background:#18181f;color:#fafafa}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#2e2c44;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#603dc6}.placeholder\:text-white\/30::-moz-placeholder{color:#ffffff4d}.placeholder\:text-white\/30::placeholder{color:#ffffff4d}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-\[\#603dc6\]\/60:hover{border-color:#603dc699}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:bg-\[\#603dc6\]\/30:hover{background-color:#603dc64d}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-\[\#a78bfa\]:hover{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.hover\:text-white\/70:hover{color:#ffffffb3}.hover\:ring-1:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:ring-\[\#603dc6\]\/40:hover{--tw-ring-color: rgb(96 61 198 / .4)}.focus\:border-\[\#603dc6\]\/50:focus{border-color:#603dc680}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-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-\[\#603dc6\]\/50:focus{--tw-ring-color: rgb(96 61 198 / .5)}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width: 1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
|