ctxloom-pro 1.0.14 → 1.0.16
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-B89fKXqI.js +139 -0
- package/apps/dashboard/dist/dashboard/client/assets/index-BOcw_HPT.css +1 -0
- package/apps/dashboard/dist/dashboard/client/index.html +2 -2
- package/apps/dashboard/dist/server/index.js +175 -42
- package/dist/index.js +13 -7
- package/package.json +1 -1
- package/apps/dashboard/dist/dashboard/client/assets/index-BoOuiK6f.css +0 -1
- package/apps/dashboard/dist/dashboard/client/assets/index-DpZFZ0hK.js +0 -139
|
@@ -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-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.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-4{width:1rem}.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}.grow{flex-grow:1}.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}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.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-white\/5{background-color:#ffffff0d}.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-\[11px\]{font-size:11px}.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}.leading-snug{line-height:1.375}.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\/10:hover{background-color:#ffffff1a}.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\: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-B89fKXqI.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BOcw_HPT.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
11464
|
app.get(/.*/, (_req, res) => {
|
|
11332
|
-
res.sendFile(
|
|
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.16".length > 0 ? "1.0.16" : "dev";
|
|
516
516
|
if (args.includes("--version") || args.includes("-v")) {
|
|
517
517
|
process.stdout.write(`ctxloom ${ctxloomVersion}
|
|
518
518
|
`);
|
|
@@ -879,12 +879,18 @@ async function main() {
|
|
|
879
879
|
break;
|
|
880
880
|
}
|
|
881
881
|
case "register": {
|
|
882
|
-
const repoPath = process.argv[3];
|
|
883
|
-
|
|
884
|
-
|
|
882
|
+
const repoPath = process.argv[3] ?? ".";
|
|
883
|
+
const absPath = path2.resolve(repoPath);
|
|
884
|
+
try {
|
|
885
|
+
const stat = await import("fs").then((m) => m.statSync(absPath));
|
|
886
|
+
if (!stat.isDirectory()) {
|
|
887
|
+
console.error(`[ctxloom] ${absPath} is not a directory`);
|
|
888
|
+
process.exit(1);
|
|
889
|
+
}
|
|
890
|
+
} catch {
|
|
891
|
+
console.error(`[ctxloom] Path does not exist: ${absPath}`);
|
|
885
892
|
process.exit(1);
|
|
886
893
|
}
|
|
887
|
-
const absPath = path2.resolve(repoPath);
|
|
888
894
|
const dbPath = path2.join(absPath, ".ctxloom", "vectors.lancedb");
|
|
889
895
|
const registryPath = path2.join(os.homedir(), ".ctxloom", "repos.json");
|
|
890
896
|
const reg = new RepoRegistry(registryPath);
|
|
@@ -899,7 +905,7 @@ async function main() {
|
|
|
899
905
|
const reg = new RepoRegistry(registryPath);
|
|
900
906
|
const repos = reg.list();
|
|
901
907
|
if (repos.length === 0) {
|
|
902
|
-
console.log("[ctxloom] No repos registered. Run
|
|
908
|
+
console.log("[ctxloom] No repos registered. Run `ctxloom register` from any project directory.");
|
|
903
909
|
} else {
|
|
904
910
|
console.log(`
|
|
905
911
|
[ctxloom] Registered repos (${repos.length}):`);
|
|
@@ -1183,7 +1189,7 @@ Usage:
|
|
|
1183
1189
|
ctxloom setup Detect and configure MCP-compatible AI tools
|
|
1184
1190
|
ctxloom grammars Show grammar cache status
|
|
1185
1191
|
ctxloom grammars --download Pre-download all language grammars
|
|
1186
|
-
ctxloom register
|
|
1192
|
+
ctxloom register [path] Register a repo for cross-repo search (defaults to cwd)
|
|
1187
1193
|
ctxloom repos List all registered repos
|
|
1188
1194
|
ctxloom dashboard Start the web dashboard (port 7842)
|
|
1189
1195
|
ctxloom dashboard --port=N Start on custom port
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ctxloom-pro",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
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))}}
|