jetic-cli 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ .react-flow{direction:ltr}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;cursor:-webkit-grab;cursor:grab}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{pointer-events:none;overflow:visible}.react-flow__edge-path,.react-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{pointer-events:visibleStroke;cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:-webkit-grab;cursor:grab}.react-flow__node.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:-webkit-grab;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background:#1a192b;border:1px solid white;border-radius:100%}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:-4px;transform:translate(-50%)}.react-flow__handle-top{left:50%;top:-4px;transform:translate(-50%)}.react-flow__handle-left{top:50%;left:-4px;transform:translateY(-50%)}.react-flow__handle-right{right:-4px;top:50%;transform:translateY(-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:#ffffff80;padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-input,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:3px;width:150px;font-size:12px;color:#222;text-align:center;border-width:1px;border-style:solid;border-color:#1a192b;background-color:#fff}.react-flow__node-default.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:#f0f0f040}.react-flow__nodesselection-rect,.react-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px #00000014}.react-flow__controls-button{border:none;background:#fefefe;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:5px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__minimap{background-color:#fff}.react-flow__minimap svg{display:block}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:#3367d9;transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:#3367d9;border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}/*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:"Inter",ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-cyan-400:oklch(78.9% .154 211.53);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-xl:24px;--blur-2xl:40px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-2{top:calc(var(--spacing)*-2)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-\[38px\]{top:38px}.-right-2{right:calc(var(--spacing)*-2)}.right-0{right:calc(var(--spacing)*0)}.right-2\.5{right:calc(var(--spacing)*2.5)}.right-3{right:calc(var(--spacing)*3)}.bottom-0{bottom:calc(var(--spacing)*0)}.-left-3{left:calc(var(--spacing)*-3)}.left-0{left:calc(var(--spacing)*0)}.left-2\.5{left:calc(var(--spacing)*2.5)}.left-3{left:calc(var(--spacing)*3)}.left-\[19px\]{left:19px}.z-0{z-index:0}.z-10{z-index:10}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.m-6{margin:calc(var(--spacing)*6)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-6{margin-inline:calc(var(--spacing)*6)}.my-3{margin-block:calc(var(--spacing)*3)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-0{margin-bottom:calc(var(--spacing)*0)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-12{margin-left:calc(var(--spacing)*12)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-full{height:100%}.h-screen{height:100vh}.max-h-24{max-height:calc(var(--spacing)*24)}.max-h-72{max-height:calc(var(--spacing)*72)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-\[85vh\]{max-height:85vh}.max-h-\[340px\]{max-height:340px}.max-h-\[calc\(100vh-170px\)\]{max-height:calc(100vh - 170px)}.max-h-\[calc\(100vh-280px\)\]{max-height:calc(100vh - 280px)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-full{min-height:100%}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-44{width:calc(var(--spacing)*44)}.w-48{width:calc(var(--spacing)*48)}.w-52{width:calc(var(--spacing)*52)}.w-56{width:calc(var(--spacing)*56)}.w-60{width:calc(var(--spacing)*60)}.w-80{width:calc(var(--spacing)*80)}.w-\[3px\]{width:3px}.w-\[14px\]{width:14px}.w-\[15px\]{width:15px}.w-\[400px\]{width:400px}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[100px\]{max-width:100px}.max-w-\[140px\]{max-width:140px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[300px\]{max-width:300px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-4{--tw-translate-y:calc(var(--spacing)*-4);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[140px_1fr\]{grid-template-columns:140px 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-y-2{row-gap:calc(var(--spacing)*2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[var\(--border\)\]>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--border\)\]{border-color:var(--border)}.border-\[var\(--border-md\)\]{border-color:var(--border-md)}.border-amber-500\/15{border-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/15{border-color:color-mix(in oklab,var(--color-amber-500)15%,transparent)}}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500)25%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500)40%,transparent)}}.border-blue-400{border-color:var(--color-blue-400)}.border-blue-500\/15{border-color:#3080ff26}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/15{border-color:color-mix(in oklab,var(--color-blue-500)15%,transparent)}}.border-blue-500\/20{border-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/20{border-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.border-blue-500\/40{border-color:#3080ff66}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/40{border-color:color-mix(in oklab,var(--color-blue-500)40%,transparent)}}.border-blue-500\/60{border-color:#3080ff99}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/60{border-color:color-mix(in oklab,var(--color-blue-500)60%,transparent)}}.border-emerald-500\/15{border-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/15{border-color:color-mix(in oklab,var(--color-emerald-500)15%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500)25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500)30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500)40%,transparent)}}.border-emerald-600\/60{border-color:#00976799}@supports (color:color-mix(in lab,red,red)){.border-emerald-600\/60{border-color:color-mix(in oklab,var(--color-emerald-600)60%,transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500)30%,transparent)}}.border-purple-500\/10{border-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/10{border-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.border-purple-500\/20{border-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/20{border-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500)30%,transparent)}}.border-purple-500\/40{border-color:#ac4bff66}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/40{border-color:color-mix(in oklab,var(--color-purple-500)40%,transparent)}}.border-red-500\/10{border-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.border-red-500\/10{border-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.border-red-500\/15{border-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.border-red-500\/15{border-color:color-mix(in oklab,var(--color-red-500)15%,transparent)}}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab,red,red)){.border-red-500\/25{border-color:color-mix(in oklab,var(--color-red-500)25%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500)40%,transparent)}}.border-red-500\/60{border-color:#fb2c3699}@supports (color:color-mix(in lab,red,red)){.border-red-500\/60{border-color:color-mix(in oklab,var(--color-red-500)60%,transparent)}}.border-rose-500\/25{border-color:#ff235740}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/25{border-color:color-mix(in oklab,var(--color-rose-500)25%,transparent)}}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.border-white\/\[0\.06\]{border-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.06\]{border-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.bg-\[\#0a0a0a\]{background-color:#0a0a0a}.bg-\[\#1e1e2e\]{background-color:#1e1e2e}.bg-\[var\(--bg-overlay\)\]{background-color:var(--bg-overlay)}.bg-\[var\(--bg-overlay-md\)\]{background-color:var(--bg-overlay-md)}.bg-\[var\(--border\)\]{background-color:var(--border)}.bg-\[var\(--sidebar-bg\)\]{background-color:var(--sidebar-bg)}.bg-\[var\(--text-faint\)\]{background-color:var(--text-faint)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500)15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-amber-500\/\[0\.04\]{background-color:#f99c000a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-amber-500)4%,transparent)}}.bg-amber-500\/\[0\.05\]{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.05\]{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\/\[0\.07\]{background-color:#f99c0012}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.07\]{background-color:color-mix(in oklab,var(--color-amber-500)7%,transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/5{background-color:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\/15{background-color:#3080ff26}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/15{background-color:color-mix(in oklab,var(--color-blue-500)15%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-500\/40{background-color:#3080ff66}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/40{background-color:color-mix(in oklab,var(--color-blue-500)40%,transparent)}}.bg-blue-500\/\[0\.05\]{background-color:#3080ff0d}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/\[0\.05\]{background-color:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.bg-blue-500\/\[0\.08\]{background-color:#3080ff14}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-blue-500)8%,transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500)5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500)10%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500)15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.bg-emerald-500\/40{background-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/40{background-color:color-mix(in oklab,var(--color-emerald-500)40%,transparent)}}.bg-emerald-500\/50{background-color:#00bb7f80}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/50{background-color:color-mix(in oklab,var(--color-emerald-500)50%,transparent)}}.bg-emerald-500\/\[0\.05\]{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/\[0\.05\]{background-color:color-mix(in oklab,var(--color-emerald-500)5%,transparent)}}.bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.bg-purple-500\/5{background-color:#ac4bff0d}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/5{background-color:color-mix(in oklab,var(--color-purple-500)5%,transparent)}}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500)15%,transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/20{background-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.bg-purple-500\/40{background-color:#ac4bff66}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/40{background-color:color-mix(in oklab,var(--color-purple-500)40%,transparent)}}.bg-purple-500\/\[0\.04\]{background-color:#ac4bff0a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-purple-500)4%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-red-500\/\[0\.03\]{background-color:#fb2c3608}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-red-500)3%,transparent)}}.bg-red-500\/\[0\.04\]{background-color:#fb2c360a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-red-500)4%,transparent)}}.bg-red-500\/\[0\.05\]{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/\[0\.05\]{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\/\[0\.06\]{background-color:#fb2c360f}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-red-500)6%,transparent)}}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/10{background-color:color-mix(in oklab,var(--color-rose-500)10%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/\[0\.01\]{background-color:#ffffff03}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.01\]{background-color:color-mix(in oklab,var(--color-white)1%,transparent)}}.bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-white)2%,transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white)3%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.bg-white\/\[0\.05\]{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.05\]{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.bg-white\/\[0\.07\]{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.07\]{background-color:color-mix(in oklab,var(--color-white)7%,transparent)}}.bg-white\/\[0\.015\]{background-color:#ffffff04}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.015\]{background-color:color-mix(in oklab,var(--color-white)1.5%,transparent)}}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-900{background-color:var(--color-zinc-900)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-3\.5{padding:calc(var(--spacing)*3.5)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.p-12{padding:calc(var(--spacing)*12)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-7{padding-inline:calc(var(--spacing)*7)}.px-10{padding-inline:calc(var(--spacing)*10)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-20{padding-block:calc(var(--spacing)*20)}.py-\[18px\]{padding-block:18px}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-3\.5{padding-top:calc(var(--spacing)*3.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-8{padding-top:calc(var(--spacing)*8)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-9{padding-right:calc(var(--spacing)*9)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pl-0\.5{padding-left:calc(var(--spacing)*.5)}.pl-5{padding-left:calc(var(--spacing)*5)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-9{padding-left:calc(var(--spacing)*9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--text-faint\)\]{color:var(--text-faint)}.text-\[var\(--text-muted\)\]{color:var(--text-muted)}.text-\[var\(--text-primary\)\]{color:var(--text-primary)}.text-\[var\(--text-secondary\)\]{color:var(--text-secondary)}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400)80%,transparent)}}.text-amber-400\/90{color:#fcbb00e6}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/90{color:color-mix(in oklab,var(--color-amber-400)90%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-amber-500\/60{color:#f99c0099}@supports (color:color-mix(in lab,red,red)){.text-amber-500\/60{color:color-mix(in oklab,var(--color-amber-500)60%,transparent)}}.text-amber-500\/80{color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-500\/80{color:color-mix(in oklab,var(--color-amber-500)80%,transparent)}}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-400\/70{color:#54a2ffb3}@supports (color:color-mix(in lab,red,red)){.text-blue-400\/70{color:color-mix(in oklab,var(--color-blue-400)70%,transparent)}}.text-blue-400\/80{color:#54a2ffcc}@supports (color:color-mix(in lab,red,red)){.text-blue-400\/80{color:color-mix(in oklab,var(--color-blue-400)80%,transparent)}}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-orange-300\/70{color:#ffb96db3}@supports (color:color-mix(in lab,red,red)){.text-orange-300\/70{color:color-mix(in oklab,var(--color-orange-300)70%,transparent)}}.text-orange-400{color:var(--color-orange-400)}.text-purple-400{color:var(--color-purple-400)}.text-purple-400\/70{color:#c07effb3}@supports (color:color-mix(in lab,red,red)){.text-purple-400\/70{color:color-mix(in oklab,var(--color-purple-400)70%,transparent)}}.text-purple-500{color:var(--color-purple-500)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/60{color:#ff656899}@supports (color:color-mix(in lab,red,red)){.text-red-400\/60{color:color-mix(in oklab,var(--color-red-400)60%,transparent)}}.text-red-400\/70{color:#ff6568b3}@supports (color:color-mix(in lab,red,red)){.text-red-400\/70{color:color-mix(in oklab,var(--color-red-400)70%,transparent)}}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400)80%,transparent)}}.text-red-500\/70{color:#fb2c36b3}@supports (color:color-mix(in lab,red,red)){.text-red-500\/70{color:color-mix(in oklab,var(--color-red-500)70%,transparent)}}.text-rose-400{color:var(--color-rose-400)}.text-white{color:var(--color-white)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-\[var\(--text-faint\)\]::placeholder{color:var(--text-faint)}.placeholder-zinc-600::placeholder{color:var(--color-zinc-600)}.accent-amber-500{accent-color:var(--color-amber-500)}.accent-blue-500{accent-color:var(--color-blue-500)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(52\,211\,153\,0\.15\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#34d39926);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(248\,113\,113\,0\.15\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#f8717126);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(96\,165\,250\,0\.28\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#60a5fa47);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-black\/60{--tw-shadow-color:#0009}@supports (color:color-mix(in lab,red,red)){.shadow-black\/60{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)60%,transparent)var(--tw-shadow-alpha),transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-2xl{--tw-blur:blur(var(--blur-2xl));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,)}.blur-xl{--tw-blur:blur(var(--blur-xl));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,)}.\!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,)!important}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[font-feature-settings\:\'ss01\'\]{font-feature-settings:"ss01"}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/ie\:opacity-100:is(:where(.group\/ie):hover *){opacity:1}}.placeholder\:text-zinc-500::placeholder{color:var(--color-zinc-500)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.focus-within\:border-emerald-500:focus-within{border-color:var(--color-emerald-500)}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-blue-400\/60:hover{border-color:#54a2ff99}@supports (color:color-mix(in lab,red,red)){.hover\:border-blue-400\/60:hover{border-color:color-mix(in oklab,var(--color-blue-400)60%,transparent)}}.hover\:border-blue-500\/20:hover{border-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.hover\:border-blue-500\/20:hover{border-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.hover\:border-blue-500\/30:hover{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.hover\:border-blue-500\/30:hover{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.hover\:border-red-500\/30:hover{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.hover\:border-red-500\/30:hover{border-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.hover\:bg-\[var\(--bg-overlay\)\]:hover{background-color:var(--bg-overlay)}.hover\:bg-\[var\(--bg-overlay-md\)\]:hover{background-color:var(--bg-overlay-md)}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-amber-500\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.hover\:bg-amber-500\/30:hover{background-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/30:hover{background-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.hover\:bg-blue-400:hover{background-color:var(--color-blue-400)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-blue-500\/10:hover{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-blue-500\/10:hover{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.hover\:bg-blue-500\/20:hover{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-blue-500\/20:hover{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.hover\:bg-blue-500\/30:hover{background-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-blue-500\/30:hover{background-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.hover\:bg-emerald-400:hover{background-color:var(--color-emerald-400)}.hover\:bg-purple-500\/30:hover{background-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-purple-500\/30:hover{background-color:color-mix(in oklab,var(--color-purple-500)30%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.hover\:bg-red-500\/15:hover{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/15:hover{background-color:color-mix(in oklab,var(--color-red-500)15%,transparent)}}.hover\:bg-red-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab,var(--color-white)3%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.hover\:bg-white\/\[0\.05\]:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.05\]:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.hover\:bg-zinc-800\/20:hover{background-color:#27272a33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/20:hover{background-color:color-mix(in oklab,var(--color-zinc-800)20%,transparent)}}.hover\:text-\[var\(--text-muted\)\]:hover{color:var(--text-muted)}.hover\:text-\[var\(--text-primary\)\]:hover{color:var(--text-primary)}.hover\:text-\[var\(--text-secondary\)\]:hover{color:var(--text-secondary)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-blue-400:hover{color:var(--color-blue-400)}.hover\:text-emerald-300:hover{color:var(--color-emerald-300)}.hover\:text-purple-400:hover{color:var(--color-purple-400)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-200:hover{color:var(--color-zinc-200)}.hover\:text-zinc-300:hover{color:var(--color-zinc-300)}}.focus\:border-amber-400\/50:focus{border-color:#fcbb0080}@supports (color:color-mix(in lab,red,red)){.focus\:border-amber-400\/50:focus{border-color:color-mix(in oklab,var(--color-amber-400)50%,transparent)}}.focus\:border-amber-500\/70:focus{border-color:#f99c00b3}@supports (color:color-mix(in lab,red,red)){.focus\:border-amber-500\/70:focus{border-color:color-mix(in oklab,var(--color-amber-500)70%,transparent)}}.focus\:border-blue-500\/50:focus{border-color:#3080ff80}@supports (color:color-mix(in lab,red,red)){.focus\:border-blue-500\/50:focus{border-color:color-mix(in oklab,var(--color-blue-500)50%,transparent)}}.focus\:border-blue-500\/60:focus{border-color:#3080ff99}@supports (color:color-mix(in lab,red,red)){.focus\:border-blue-500\/60:focus{border-color:color-mix(in oklab,var(--color-blue-500)60%,transparent)}}.focus\:border-purple-500\/60:focus{border-color:#ac4bff99}@supports (color:color-mix(in lab,red,red)){.focus\:border-purple-500\/60:focus{border-color:color-mix(in oklab,var(--color-purple-500)60%,transparent)}}.focus\:border-red-500\/80:focus{border-color:#fb2c36cc}@supports (color:color-mix(in lab,red,red)){.focus\:border-red-500\/80:focus{border-color:color-mix(in oklab,var(--color-red-500)80%,transparent)}}.focus\:bg-\[var\(--bg-overlay-md\)\]:focus{background-color:var(--bg-overlay-md)}.focus\:bg-amber-500\/\[0\.07\]:focus{background-color:#f99c0012}@supports (color:color-mix(in lab,red,red)){.focus\:bg-amber-500\/\[0\.07\]:focus{background-color:color-mix(in oklab,var(--color-amber-500)7%,transparent)}}.focus\:bg-white\/\[0\.05\]:focus{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.focus\:bg-white\/\[0\.05\]:focus{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500\/50:focus{--tw-ring-color:#3080ff80}@supports (color:color-mix(in lab,red,red)){.focus\:ring-blue-500\/50:focus{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)50%,transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-25:disabled{opacity:.25}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:col-span-3{grid-column:span 3/span 3}.sm\:block{display:block}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:bg-\[\#0a0a0a\]{background-color:#0a0a0a}}}:root{--bg-base:#0a0a0a;--bg-surface:#111;--bg-elevated:#161616;--bg-overlay:#ffffff08;--bg-overlay-md:#ffffff0f;--border:#ffffff14;--border-md:#ffffff1f;--text-primary:#fff;--text-secondary:#d4d4d8;--text-muted:#71717a;--text-faint:#3f3f46;--sidebar-bg:#0000004d}html.light{--bg-base:#f4f4f5;--bg-surface:#fff;--bg-elevated:#fafafa;--bg-overlay:#00000008;--bg-overlay-md:#0000000f;--border:#0000001a;--border-md:#00000029;--text-primary:#09090b;--text-secondary:#27272a;--text-muted:#71717a;--text-faint:#a1a1aa;--sidebar-bg:#fff}body{background-color:var(--bg-base);color:var(--text-secondary);transition:background-color .25s,color .25s}.theme-bg-base{background-color:var(--bg-base)}.theme-bg-surface{background-color:var(--bg-surface)}.theme-bg-elevated{background-color:var(--bg-elevated)}.theme-border{border-color:var(--border)}.theme-text{color:var(--text-secondary)}.theme-text-muted{color:var(--text-muted)}.theme-text-primary{color:var(--text-primary)}.theme-sidebar{background-color:var(--sidebar-bg)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
@@ -9,8 +9,8 @@
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
11
11
  <title>Jetic Studio</title>
12
- <script type="module" crossorigin src="/assets/index-8Xh271uc.js"></script>
13
- <link rel="stylesheet" crossorigin href="/assets/index-ANQK1AeT.css">
12
+ <script type="module" crossorigin src="/assets/index-B7pzujvn.js"></script>
13
+ <link rel="stylesheet" crossorigin href="/assets/index-CAj2uFAP.css">
14
14
  </head>
15
15
 
16
16
  <body>
package/dist/index.js CHANGED
@@ -270286,9 +270286,11 @@ var require_project_tools = __commonJS({
270286
270286
  };
270287
270287
  })();
270288
270288
  Object.defineProperty(exports2, "__esModule", { value: true });
270289
- exports2.scanProjectSchema = exports2.initProjectSchema = void 0;
270289
+ exports2.clearChangesSchema = exports2.getChangesSchema = exports2.scanProjectSchema = exports2.initProjectSchema = void 0;
270290
270290
  exports2.handleInitProject = handleInitProject;
270291
270291
  exports2.handleScanProject = handleScanProject;
270292
+ exports2.handleGetChanges = handleGetChanges;
270293
+ exports2.handleClearChanges = handleClearChanges;
270292
270294
  var zod_1 = require("zod");
270293
270295
  var fs4 = __importStar(require("fs"));
270294
270296
  var path7 = __importStar(require("path"));
@@ -270450,6 +270452,16 @@ var require_project_tools = __commonJS({
270450
270452
  existing.project = { ...scanned.project, ...existing.project };
270451
270453
  }
270452
270454
  (0, types_1.saveModel)(filePath, existing);
270455
+ const changesPath = path7.join(path7.dirname(filePath), "changes.json");
270456
+ if (fs4.existsSync(changesPath)) {
270457
+ try {
270458
+ const changesData = JSON.parse(fs4.readFileSync(changesPath, "utf-8"));
270459
+ changesData.changes = [];
270460
+ changesData.watchedSince = (/* @__PURE__ */ new Date()).toISOString();
270461
+ fs4.writeFileSync(changesPath, JSON.stringify(changesData, null, 2), "utf-8");
270462
+ } catch {
270463
+ }
270464
+ }
270453
270465
  const total = existing.endpoints.length;
270454
270466
  return {
270455
270467
  success: true,
@@ -270463,6 +270475,64 @@ var require_project_tools = __commonJS({
270463
270475
  next: total === 0 ? "No endpoints yet \u2014 model them manually with jetic_add_endpoint, then jetic_verify_model." : `Next: refine with jetic_add_endpoint / jetic_update_endpoint (AI enrichment is skipped in scans \u2014 add constraints, examples, ownership by hand), then jetic_verify_model until clean. Step 3 (only on request): workflows via jetic_validate_workflow \u2192 jetic_create_workflow \u2192 jetic_simulate_workflow.`
270464
270476
  };
270465
270477
  }
270478
+ exports2.getChangesSchema = zod_1.z.object({
270479
+ projectPath: zod_1.z.string().optional().describe("Path to project root (defaults to JETIC_PROJECT_PATH / cwd)")
270480
+ });
270481
+ function handleGetChanges(args) {
270482
+ const filePath = (0, types_1.resolveModelPath)(args.projectPath);
270483
+ const jeticDir = path7.dirname(filePath);
270484
+ const changesPath = path7.join(jeticDir, "changes.json");
270485
+ if (!fs4.existsSync(changesPath)) {
270486
+ return {
270487
+ hasChanges: false,
270488
+ changes: [],
270489
+ watchedSince: null,
270490
+ message: "No changes.json found. Start `jetic dev` to enable automatic file change tracking."
270491
+ };
270492
+ }
270493
+ let data;
270494
+ try {
270495
+ data = JSON.parse(fs4.readFileSync(changesPath, "utf-8"));
270496
+ } catch {
270497
+ return { hasChanges: false, changes: [], watchedSince: null, message: "changes.json is unreadable or corrupted." };
270498
+ }
270499
+ const changes = Array.isArray(data.changes) ? data.changes : [];
270500
+ return {
270501
+ hasChanges: changes.length > 0,
270502
+ totalChanged: changes.length,
270503
+ watchedSince: data.watchedSince ?? null,
270504
+ projectRoot: data.projectRoot ?? jeticDir,
270505
+ changes,
270506
+ filePaths: changes.map((c3) => c3.filePath),
270507
+ hint: changes.length > 0 ? `Read ONLY these ${changes.length} file(s) to update model.json \u2014 no need to scan the entire codebase. After updating, call jetic_clear_changes.` : "No file changes recorded since last scan. Model is up-to-date."
270508
+ };
270509
+ }
270510
+ exports2.clearChangesSchema = zod_1.z.object({
270511
+ projectPath: zod_1.z.string().optional().describe("Path to project root (defaults to JETIC_PROJECT_PATH / cwd)")
270512
+ });
270513
+ function handleClearChanges(args) {
270514
+ const filePath = (0, types_1.resolveModelPath)(args.projectPath);
270515
+ const jeticDir = path7.dirname(filePath);
270516
+ const changesPath = path7.join(jeticDir, "changes.json");
270517
+ if (!fs4.existsSync(changesPath)) {
270518
+ return { success: true, message: "changes.json did not exist \u2014 nothing to clear." };
270519
+ }
270520
+ try {
270521
+ const data = JSON.parse(fs4.readFileSync(changesPath, "utf-8"));
270522
+ const cleared = Array.isArray(data.changes) ? data.changes.length : 0;
270523
+ data.changes = [];
270524
+ data.watchedSince = (/* @__PURE__ */ new Date()).toISOString();
270525
+ fs4.writeFileSync(changesPath, JSON.stringify(data, null, 2), "utf-8");
270526
+ return {
270527
+ success: true,
270528
+ cleared,
270529
+ watchedSince: data.watchedSince,
270530
+ message: `Cleared ${cleared} change record(s). ChangeScanner will now track future edits from scratch.`
270531
+ };
270532
+ } catch (err) {
270533
+ throw new Error(`Failed to clear changes.json: ${err.message}`);
270534
+ }
270535
+ }
270466
270536
  }
270467
270537
  });
270468
270538
 
@@ -285005,7 +285075,12 @@ var require_server3 = __commonJS({
285005
285075
  "\u2501\u2501 GENERAL RULES \u2501\u2501",
285006
285076
  "No AI-provider setup is needed: never ask for OpenRouter/OpenAI keys and never use `jetic config ai`.",
285007
285077
  "Mutating tools write to disk \u2014 confirm intent with the user before destructive operations (delete/overwrite).",
285008
- "Project resolution: every tool accepts an optional `projectPath`. If omitted, falls back to JETIC_PROJECT_PATH env var, then cwd."
285078
+ "Project resolution: every tool accepts an optional `projectPath`. If omitted, falls back to JETIC_PROJECT_PATH env var, then cwd.",
285079
+ "\u2501\u2501 CHANGE TRACKING (jetic dev) \u2501\u2501",
285080
+ "When `jetic dev` is running it watches source files and logs edits to `.jetic/changes.json`.",
285081
+ "Before rescanning: call `jetic_get_changes` \u2014 if hasChanges is true, read ONLY the listed filePaths.",
285082
+ "Update model.json for those files, then call `jetic_clear_changes` (or jetic_scan, which clears automatically).",
285083
+ ""
285009
285084
  ].join("\n");
285010
285085
  var READ_ONLY = {
285011
285086
  readOnlyHint: true,
@@ -285055,7 +285130,9 @@ var require_server3 = __commonJS({
285055
285130
  };
285056
285131
  register("jetic_get_session_phase", "Get session phase", "ALWAYS CALL THIS FIRST. Returns the current workflow phase (1=init, 2=scan, 3=verify, 4=simulate), gate conditions (modelExists, endpointsCount, modelIsValid, allFieldsFilled), and the exact nextAction the AI must take. Never skip phase gates.", session_tools_1.getSessionPhaseSchema.shape, READ_ONLY, session_tools_1.handleGetSessionPhase);
285057
285132
  register("jetic_init", "Initialize Jetic project", "PHASE 1: Scaffolds .jetic/model.json (+ workflows/, config.json) for repos that have none. Refuses to clobber an existing model (pass overwrite:true to replace). Reports whether auto-scan applies (Express+TypeScript) and what to do next.", project_tools_1.initProjectSchema.shape, WRITES_MODEL, project_tools_1.handleInitProject);
285058
- register("jetic_scan", "Scan Express project", "PHASE 2 (Express+TypeScript only \u2014 requires tsconfig.json): Static AST scan that fills model.json with routes, middleware, and auth heuristics. Keyless \u2014 no AI provider involved. Default merge upserts scanned routes and keeps hand-added endpoints; overwrite replaces all endpoints. Fails with guidance for non-Express stacks (model those manually with jetic_add_endpoint).", project_tools_1.scanProjectSchema.shape, WRITES_MODEL, project_tools_1.handleScanProject);
285133
+ register("jetic_scan", "Scan Express project", "PHASE 2 (Express+TypeScript only \u2014 requires tsconfig.json): Static AST scan that fills model.json with routes, middleware, and auth heuristics. Keyless \u2014 no AI provider involved. Default merge upserts scanned routes and keeps hand-added endpoints; overwrite replaces all endpoints. Fails with guidance for non-Express stacks (model those manually with jetic_add_endpoint). Auto-clears .jetic/changes.json after success.", project_tools_1.scanProjectSchema.shape, WRITES_MODEL, project_tools_1.handleScanProject);
285134
+ register("jetic_get_changes", "Get file change log", "Reads .jetic/changes.json \u2014 the lightweight change log populated by the ChangeScanner running inside `jetic dev`. Returns the list of source files edited since the last scan or jetic_clear_changes. Use this BEFORE rescanning to read only changed files instead of the full codebase.", project_tools_1.getChangesSchema.shape, READ_ONLY, project_tools_1.handleGetChanges);
285135
+ register("jetic_clear_changes", "Clear file change log", "Clears .jetic/changes.json after the AI has finished updating model.json from the changed files. Also called automatically by jetic_scan. Call this when you have finished processing all changes returned by jetic_get_changes.", project_tools_1.clearChangesSchema.shape, WRITES_MODEL, project_tools_1.handleClearChanges);
285059
285136
  register("jetic_read_model", "Read Jetic model", "Reads .jetic/model.json from the workspace and returns the full behavioral model or a metadata summary.", model_tools_1.readModelSchema.shape, READ_ONLY, model_tools_1.handleReadModel);
285060
285137
  register("jetic_list_endpoints", "List endpoints", "Lists API endpoints discovered in .jetic/model.json with optional filters by method, tag, resource, or path substring.", model_tools_1.listEndpointsSchema.shape, READ_ONLY, model_tools_1.handleListEndpoints);
285061
285138
  register("jetic_get_endpoint", "Get endpoint details", "Returns full structural details (parameters, request body, schemas, security, responses) of one endpoint, looked up by ID or by method + path.", model_tools_1.getEndpointSchema.shape, READ_ONLY, model_tools_1.handleGetEndpoint);
@@ -286826,9 +286903,170 @@ var import_path = __toESM(require("path"));
286826
286903
  var import_fs = __toESM(require("fs"));
286827
286904
  var import_core7 = __toESM(require_dist());
286828
286905
  var import_memory3 = __toESM(require_dist4());
286906
+ var IGNORED_DIRS = /* @__PURE__ */ new Set(["node_modules", ".git", "dist", "build", ".cache", "__pycache__", ".next", ".nuxt", ".venv"]);
286907
+ var IGNORED_EXTS = /* @__PURE__ */ new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".ico", ".mp4", ".webm", ".woff", ".woff2", ".ttf", ".eot", ".map"]);
286908
+ var SOURCE_EXTS = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".go", ".rs", ".java", ".kt", ".cs", ".rb", ".php", ".json", ".yaml", ".yml", ".toml", ".env", ".graphql", ".gql", ".sql", ".prisma", ".proto"]);
286909
+ var ChangeScanner = class {
286910
+ changesPath;
286911
+ projectRoot;
286912
+ watchers = [];
286913
+ debounceTimers = /* @__PURE__ */ new Map();
286914
+ DEBOUNCE_MS = 300;
286915
+ listeners = /* @__PURE__ */ new Set();
286916
+ constructor(projectRoot, jeticDir) {
286917
+ this.projectRoot = projectRoot;
286918
+ this.changesPath = import_path.default.join(jeticDir, "changes.json");
286919
+ }
286920
+ onChange(cb) {
286921
+ this.listeners.add(cb);
286922
+ return () => this.listeners.delete(cb);
286923
+ }
286924
+ notifyListeners(data) {
286925
+ for (const listener of this.listeners) {
286926
+ try {
286927
+ listener(data);
286928
+ } catch {
286929
+ }
286930
+ }
286931
+ }
286932
+ readChanges() {
286933
+ try {
286934
+ if (import_fs.default.existsSync(this.changesPath)) {
286935
+ return JSON.parse(import_fs.default.readFileSync(this.changesPath, "utf8"));
286936
+ }
286937
+ } catch {
286938
+ }
286939
+ return {
286940
+ version: 1,
286941
+ watchedSince: (/* @__PURE__ */ new Date()).toISOString(),
286942
+ projectRoot: this.projectRoot,
286943
+ changes: []
286944
+ };
286945
+ }
286946
+ saveChanges(data) {
286947
+ import_fs.default.writeFileSync(this.changesPath, JSON.stringify(data, null, 2), "utf8");
286948
+ this.notifyListeners(data);
286949
+ }
286950
+ recordChange(absolutePath, eventType) {
286951
+ const jeticDir = import_path.default.dirname(this.changesPath);
286952
+ if (absolutePath.startsWith(jeticDir)) return;
286953
+ const ext = import_path.default.extname(absolutePath).toLowerCase();
286954
+ if (IGNORED_EXTS.has(ext)) return;
286955
+ if (ext && !SOURCE_EXTS.has(ext)) return;
286956
+ if (!import_fs.default.existsSync(absolutePath)) return;
286957
+ try {
286958
+ if (import_fs.default.statSync(absolutePath).isDirectory()) return;
286959
+ } catch {
286960
+ return;
286961
+ }
286962
+ const relPath = import_path.default.relative(this.projectRoot, absolutePath).replace(/\\/g, "/");
286963
+ const existing = this.debounceTimers.get(absolutePath);
286964
+ if (existing) clearTimeout(existing);
286965
+ this.debounceTimers.set(
286966
+ absolutePath,
286967
+ setTimeout(() => {
286968
+ this.debounceTimers.delete(absolutePath);
286969
+ const data = this.readChanges();
286970
+ const now = (/* @__PURE__ */ new Date()).toISOString();
286971
+ const idx = data.changes.findIndex((c3) => c3.filePath === relPath);
286972
+ const entry = { filePath: relPath, absolutePath, changedAt: now, eventType };
286973
+ if (idx >= 0) data.changes[idx] = entry;
286974
+ else data.changes.push(entry);
286975
+ this.saveChanges(data);
286976
+ }, this.DEBOUNCE_MS)
286977
+ );
286978
+ }
286979
+ watchDir(dir) {
286980
+ try {
286981
+ const watcher = import_fs.default.watch(dir, { recursive: false }, (eventType, filename) => {
286982
+ if (!filename) return;
286983
+ const absPath = import_path.default.join(dir, filename);
286984
+ try {
286985
+ if (import_fs.default.existsSync(absPath) && import_fs.default.statSync(absPath).isDirectory()) {
286986
+ const basename = import_path.default.basename(absPath);
286987
+ if (!IGNORED_DIRS.has(basename)) this.watchDir(absPath);
286988
+ return;
286989
+ }
286990
+ } catch {
286991
+ return;
286992
+ }
286993
+ this.recordChange(absPath, eventType);
286994
+ });
286995
+ this.watchers.push(watcher);
286996
+ } catch {
286997
+ }
286998
+ }
286999
+ /** Recursively enumerate all subdirectories to watch, respecting ignores. */
287000
+ collectDirs(root) {
287001
+ const dirs = [root];
287002
+ try {
287003
+ for (const entry of import_fs.default.readdirSync(root, { withFileTypes: true })) {
287004
+ if (!entry.isDirectory()) continue;
287005
+ if (IGNORED_DIRS.has(entry.name)) continue;
287006
+ if (entry.name.startsWith(".") && entry.name !== ".") continue;
287007
+ dirs.push(...this.collectDirs(import_path.default.join(root, entry.name)));
287008
+ }
287009
+ } catch {
287010
+ }
287011
+ return dirs;
287012
+ }
287013
+ start() {
287014
+ process.stderr.write(`[jetic] ChangeScanner watching ${this.projectRoot}
287015
+ `);
287016
+ if (!import_fs.default.existsSync(this.changesPath)) {
287017
+ this.saveChanges({
287018
+ version: 1,
287019
+ watchedSince: (/* @__PURE__ */ new Date()).toISOString(),
287020
+ projectRoot: this.projectRoot,
287021
+ changes: []
287022
+ });
287023
+ }
287024
+ const dirs = this.collectDirs(this.projectRoot);
287025
+ for (const dir of dirs) this.watchDir(dir);
287026
+ try {
287027
+ if (import_fs.default.existsSync(this.changesPath)) {
287028
+ const fileWatcher = import_fs.default.watch(this.changesPath, () => {
287029
+ const data = this.readChanges();
287030
+ this.notifyListeners(data);
287031
+ });
287032
+ this.watchers.push(fileWatcher);
287033
+ }
287034
+ } catch {
287035
+ }
287036
+ }
287037
+ stop() {
287038
+ for (const w of this.watchers) try {
287039
+ w.close();
287040
+ } catch {
287041
+ }
287042
+ this.watchers = [];
287043
+ }
287044
+ getChanges() {
287045
+ return this.readChanges();
287046
+ }
287047
+ clearChanges() {
287048
+ const data = this.readChanges();
287049
+ data.changes = [];
287050
+ data.watchedSince = (/* @__PURE__ */ new Date()).toISOString();
287051
+ this.saveChanges(data);
287052
+ }
287053
+ };
286829
287054
  var devCommand = new import_commander8.Command("dev").description("Start the Jetic local dashboard").option("-p, --port <number>", "Port to run the dashboard on", "8787").action(async (options) => {
286830
287055
  const port = parseInt(options.port, 10);
286831
287056
  const app = (0, import_express.default)();
287057
+ const projectRoot = process.cwd();
287058
+ const jeticDir = import_path.default.join(projectRoot, ".jetic");
287059
+ if (!import_fs.default.existsSync(jeticDir)) import_fs.default.mkdirSync(jeticDir, { recursive: true });
287060
+ const changeScanner = new ChangeScanner(projectRoot, jeticDir);
287061
+ changeScanner.start();
287062
+ process.on("SIGINT", () => {
287063
+ changeScanner.stop();
287064
+ process.exit(0);
287065
+ });
287066
+ process.on("SIGTERM", () => {
287067
+ changeScanner.stop();
287068
+ process.exit(0);
287069
+ });
286832
287070
  app.use(import_express.default.json());
286833
287071
  app.use((_req, res, next) => {
286834
287072
  res.setHeader("Access-Control-Allow-Origin", "*");
@@ -286861,14 +287099,14 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
286861
287099
  }
286862
287100
  });
286863
287101
  app.post("/api/model/endpoint", (req, res) => {
286864
- const jeticDir = import_path.default.join(process.cwd(), ".jetic");
286865
- const modelPath = import_path.default.join(jeticDir, "model.json");
287102
+ const jeticDir2 = import_path.default.join(process.cwd(), ".jetic");
287103
+ const modelPath = import_path.default.join(jeticDir2, "model.json");
286866
287104
  try {
286867
287105
  const ep = req.body;
286868
287106
  if (!ep.method || !ep.path) {
286869
287107
  return res.status(400).json({ error: "method and path are required" });
286870
287108
  }
286871
- if (!import_fs.default.existsSync(jeticDir)) import_fs.default.mkdirSync(jeticDir, { recursive: true });
287109
+ if (!import_fs.default.existsSync(jeticDir2)) import_fs.default.mkdirSync(jeticDir2, { recursive: true });
286872
287110
  let model;
286873
287111
  if (import_fs.default.existsSync(modelPath)) {
286874
287112
  model = JSON.parse(import_fs.default.readFileSync(modelPath, "utf8"));
@@ -286907,11 +287145,49 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
286907
287145
  const model = await scanner.scan();
286908
287146
  const modelPath = import_path.default.join(config.jeticDir, "model.json");
286909
287147
  writeJsonSync2(modelPath, model);
287148
+ changeScanner.clearChanges();
286910
287149
  res.json({ ok: true, endpointCount: model.endpoints.length, model });
286911
287150
  } catch (err) {
286912
287151
  res.status(500).json({ error: err.message });
286913
287152
  }
286914
287153
  });
287154
+ app.get("/api/changes", (_req, res) => {
287155
+ try {
287156
+ res.json(changeScanner.getChanges());
287157
+ } catch (err) {
287158
+ res.status(500).json({ error: err.message });
287159
+ }
287160
+ });
287161
+ app.get("/api/changes/stream", (req, res) => {
287162
+ res.setHeader("Content-Type", "text/event-stream");
287163
+ res.setHeader("Cache-Control", "no-cache");
287164
+ res.setHeader("Connection", "keep-alive");
287165
+ if (res.flushHeaders) res.flushHeaders();
287166
+ const initial = changeScanner.getChanges();
287167
+ res.write(`data: ${JSON.stringify(initial)}
287168
+
287169
+ `);
287170
+ const unsubscribe = changeScanner.onChange((updatedData) => {
287171
+ res.write(`data: ${JSON.stringify(updatedData)}
287172
+
287173
+ `);
287174
+ });
287175
+ const heartbeat = setInterval(() => {
287176
+ res.write(": heartbeat\n\n");
287177
+ }, 15e3);
287178
+ req.on("close", () => {
287179
+ unsubscribe();
287180
+ clearInterval(heartbeat);
287181
+ });
287182
+ });
287183
+ app.delete("/api/changes", (_req, res) => {
287184
+ try {
287185
+ changeScanner.clearChanges();
287186
+ res.json({ ok: true, cleared: true });
287187
+ } catch (err) {
287188
+ res.status(500).json({ error: err.message });
287189
+ }
287190
+ });
286915
287191
  function readModel(modelPath) {
286916
287192
  if (!import_fs.default.existsSync(modelPath)) return null;
286917
287193
  return JSON.parse(import_fs.default.readFileSync(modelPath, "utf8"));
@@ -287035,8 +287311,8 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
287035
287311
  }
287036
287312
  });
287037
287313
  app.get("/api/workflows", (_req, res) => {
287038
- const jeticDir = import_path.default.join(process.cwd(), ".jetic");
287039
- const workflowsDir = import_path.default.join(jeticDir, "workflows");
287314
+ const jeticDir2 = import_path.default.join(process.cwd(), ".jetic");
287315
+ const workflowsDir = import_path.default.join(jeticDir2, "workflows");
287040
287316
  try {
287041
287317
  const workflows = [];
287042
287318
  if (import_fs.default.existsSync(workflowsDir)) {
@@ -287051,7 +287327,7 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
287051
287327
  }
287052
287328
  }
287053
287329
  }
287054
- const legacyPath = import_path.default.join(jeticDir, "workflow.json");
287330
+ const legacyPath = import_path.default.join(jeticDir2, "workflow.json");
287055
287331
  if (import_fs.default.existsSync(legacyPath)) {
287056
287332
  try {
287057
287333
  const data = JSON.parse(import_fs.default.readFileSync(legacyPath, "utf8"));
@@ -287069,8 +287345,8 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
287069
287345
  app.post("/api/workflows", (req, res) => {
287070
287346
  const { name } = req.body;
287071
287347
  if (!name || !name.trim()) return res.status(400).json({ error: "name is required" });
287072
- const jeticDir = import_path.default.join(process.cwd(), ".jetic");
287073
- const workflowsDir = import_path.default.join(jeticDir, "workflows");
287348
+ const jeticDir2 = import_path.default.join(process.cwd(), ".jetic");
287349
+ const workflowsDir = import_path.default.join(jeticDir2, "workflows");
287074
287350
  const slug = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
287075
287351
  const filePath = import_path.default.join(workflowsDir, `${slug}.json`);
287076
287352
  if (import_fs.default.existsSync(filePath)) {
@@ -287091,11 +287367,11 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
287091
287367
  });
287092
287368
  app.put("/api/workflows/:name", (req, res) => {
287093
287369
  const slug = req.params.name;
287094
- const jeticDir = import_path.default.join(process.cwd(), ".jetic");
287095
- const workflowsDir = import_path.default.join(jeticDir, "workflows");
287370
+ const jeticDir2 = import_path.default.join(process.cwd(), ".jetic");
287371
+ const workflowsDir = import_path.default.join(jeticDir2, "workflows");
287096
287372
  let filePath = import_path.default.join(workflowsDir, `${slug}.json`);
287097
287373
  if (!import_fs.default.existsSync(filePath)) {
287098
- const legacyPath = import_path.default.join(jeticDir, "workflow.json");
287374
+ const legacyPath = import_path.default.join(jeticDir2, "workflow.json");
287099
287375
  if (slug === "workflow" && import_fs.default.existsSync(legacyPath)) {
287100
287376
  filePath = legacyPath;
287101
287377
  } else {
@@ -287114,8 +287390,8 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
287114
287390
  });
287115
287391
  app.delete("/api/workflows/:name", (req, res) => {
287116
287392
  const slug = req.params.name;
287117
- const jeticDir = import_path.default.join(process.cwd(), ".jetic");
287118
- const workflowsDir = import_path.default.join(jeticDir, "workflows");
287393
+ const jeticDir2 = import_path.default.join(process.cwd(), ".jetic");
287394
+ const workflowsDir = import_path.default.join(jeticDir2, "workflows");
287119
287395
  const filePath = import_path.default.join(workflowsDir, `${slug}.json`);
287120
287396
  if (!import_fs.default.existsSync(filePath)) {
287121
287397
  return res.status(404).json({ error: `Workflow "${slug}" not found` });
@@ -287130,12 +287406,12 @@ var devCommand = new import_commander8.Command("dev").description("Start the Jet
287130
287406
  app.post("/api/workflows/generate", async (req, res) => {
287131
287407
  const { goal, name } = req.body;
287132
287408
  const workflowGoal = goal || name || "Full user journey";
287133
- const jeticDir = import_path.default.join(process.cwd(), ".jetic");
287409
+ const jeticDir2 = import_path.default.join(process.cwd(), ".jetic");
287134
287410
  const config = (0, import_core7.loadConfig)();
287135
287411
  if (!config.ai) {
287136
287412
  return res.status(400).json({ error: "AI is not configured. Run `jetic config ai` first." });
287137
287413
  }
287138
- const modelPath = import_path.default.join(jeticDir, "model.json");
287414
+ const modelPath = import_path.default.join(jeticDir2, "model.json");
287139
287415
  if (!import_fs.default.existsSync(modelPath)) {
287140
287416
  return res.status(400).json({ error: "No model.json found. Run `jetic scan` first." });
287141
287417
  }
@@ -287257,7 +287533,7 @@ Output valid JSON only.
287257
287533
  generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
287258
287534
  steps: object.steps
287259
287535
  };
287260
- const workflowsDir = import_path.default.join(jeticDir, "workflows");
287536
+ const workflowsDir = import_path.default.join(jeticDir2, "workflows");
287261
287537
  const slug = object.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "workflow";
287262
287538
  const filePath = import_path.default.join(workflowsDir, `${slug}.json`);
287263
287539
  import_fs.default.mkdirSync(workflowsDir, { recursive: true });
@@ -287293,8 +287569,8 @@ Output valid JSON only.
287293
287569
  if (!file) {
287294
287570
  return res.status(400).json({ error: "file is required" });
287295
287571
  }
287296
- const jeticDir = import_path.default.join(process.cwd(), ".jetic");
287297
- const wfPath = import_path.default.isAbsolute(file) ? file : import_path.default.join(jeticDir, file);
287572
+ const jeticDir2 = import_path.default.join(process.cwd(), ".jetic");
287573
+ const wfPath = import_path.default.isAbsolute(file) ? file : import_path.default.join(jeticDir2, file);
287298
287574
  if (!import_fs.default.existsSync(wfPath)) {
287299
287575
  return res.status(404).json({ error: "workflow file not found" });
287300
287576
  }
@@ -287317,7 +287593,7 @@ Output valid JSON only.
287317
287593
  };
287318
287594
  let baseUrl = req.body?.baseUrl;
287319
287595
  if (!baseUrl) {
287320
- const modelPath = import_path.default.join(jeticDir, "model.json");
287596
+ const modelPath = import_path.default.join(jeticDir2, "model.json");
287321
287597
  if (import_fs.default.existsSync(modelPath)) {
287322
287598
  try {
287323
287599
  const model = JSON.parse(import_fs.default.readFileSync(modelPath, "utf8"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jetic-cli",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "AI-Native API Behavior Testing & Discovery Tool — CLI and Local Studio Dashboard",
5
5
  "main": "dist/index.js",
6
6
  "bin": {