skills-eval 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -0
- package/dist/client/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/dist/client/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/dist/client/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/dist/client/assets/index-2gXzIx5u.js +62 -0
- package/dist/client/assets/index-B2aEHgRo.css +2 -0
- package/dist/client/favicon.svg +1 -0
- package/dist/client/icons.svg +24 -0
- package/dist/client/index.html +14 -0
- package/dist/server/skill-eval.js +282 -0
- package/package.json +82 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@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-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-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight: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-duration:initial;--tw-content:"";--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-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-amber-400:oklch(82.8% .189 84.429);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-600:oklch(59.6% .145 163.225);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-900:oklch(37.9% .146 265.522);--color-purple-400:oklch(71.4% .203 305.504);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-950:oklch(13% .028 261.692);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-snug:1.375;--radius-md:calc(var(--radius) * .8);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Geist Variable", sans-serif;--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;-webkit-text-decoration:inherit;-webkit-text-decoration: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}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);color:var(--foreground)}html{font-family:Geist Variable,sans-serif}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.left-1\/2{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.z-\[999\]{z-index:999}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-1{height:calc(var(--spacing) * 1)}.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-40{height:calc(var(--spacing) * 40)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[70vh\]{max-height:70vh}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[40px\]{min-height:40px}.min-h-\[60px\]{min-height:60px}.min-h-svh{min-height:100svh}.w-2\/5{width:40%}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-4{width:calc(var(--spacing) * 4)}.w-10{width:calc(var(--spacing) * 10)}.w-72{width:calc(var(--spacing) * 72)}.w-\[140px\]{width:140px}.w-\[400px\]{width:400px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-36{min-width:calc(var(--spacing) * 36)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-\(--radix-popover-content-transform-origin\){transform-origin:var(--radix-popover-content-transform-origin)}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.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)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-my-1{scroll-margin-block:calc(var(--spacing) * 1)}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.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{gap:calc(var(--spacing) * 0)}.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-6{gap:calc(var(--spacing) * 6)}: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-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-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-4xl{border-radius:calc(var(--radius) * 2.6)}.rounded-\[2px\]{border-radius:2px}.rounded-\[4px\]{border-radius:4px}.rounded-\[inherit\]{border-radius:inherit}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md), 10px)}.rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md), 12px)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) * .8)}.rounded-xl{border-radius:calc(var(--radius) * 1.4)}.rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.border{border-style:var(--tw-border-style);border-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-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-border{border-color:var(--border)}.border-foreground{border-color:var(--foreground)}.border-input{border-color:var(--input)}.border-transparent{border-color:#0000}.bg-background{background-color:var(--background)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-foreground{background-color:var(--foreground)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-muted,.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-clip-padding{background-clip:padding-box}.fill-foreground{fill:var(--foreground)}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[3px\]{padding:3px}.p-px{padding:1px}.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-6{padding-inline:calc(var(--spacing) * 6)}.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-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--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-\[0\.8rem\]{font-size:.8rem}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-balance{text-wrap:balance}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-background{color:var(--background)}.text-blue-400{color:var(--color-blue-400)}.text-blue-900{color:var(--color-blue-900)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-gray-600{color:var(--color-gray-600)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-red-400{color:var(--color-red-400)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.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)}.ring{--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)}.ring-0{--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)}.ring-1{--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)}.ring-foreground\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,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,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-\[color\,box-shadow\]{transition-property:color,box-shadow;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-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))}.transition-none{transition-property:none}.duration-100{--tw-duration:.1s;transition-duration:.1s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.running{animation-play-state:running}@media (hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}}.group-has-disabled\/field\:opacity-50:is(:where(.group\/field):has(:disabled) *){opacity:.5}.group-has-\[\>svg\]\/alert\:col-start-2:is(:where(.group\/alert):has(>svg) *){grid-column-start:2}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/card\:p-3:is(:where(.group\/card)[data-size=sm] *){padding:calc(var(--spacing) * 3)}.group-data-\[size\=sm\]\/card\:px-3:is(:where(.group\/card)[data-size=sm] *){padding-inline:calc(var(--spacing) * 3)}.group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-data-horizontal\/tabs\:h-8:is(:where(.group\/tabs):where([data-orientation=horizontal]) *){height:calc(var(--spacing) * 8)}.group-data-vertical\/tabs\:h-fit:is(:where(.group\/tabs):where([data-orientation=vertical]) *){height:fit-content}.group-data-vertical\/tabs\:w-full:is(:where(.group\/tabs):where([data-orientation=vertical]) *){width:100%}.group-data-vertical\/tabs\:flex-col:is(:where(.group\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.group-data-vertical\/tabs\:justify-start:is(:where(.group\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * -3)}.after\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(var(--spacing) * -2)}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-horizontal\/tabs\:after\:inset-x-0:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:calc(var(--spacing) * 0)}.group-data-horizontal\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.group-data-horizontal\/tabs\:after\:h-0\.5:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-vertical\/tabs\:after\:inset-y-0:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:calc(var(--spacing) * 0)}.group-data-vertical\/tabs\:after\:-right-1:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-vertical\/tabs\:after\:w-0\.5:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-background\/50:hover{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background\/50:hover{background-color:color-mix(in oklab, var(--background) 50%, transparent)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus,:is(.not-data-\[variant\=destructive\]\:focus\:\*\*\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-3:focus-visible,.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + 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-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.active\:translate-y-px:active{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-input\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.disabled\:bg-input\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-lg{border-radius:var(--radius)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-end\]\:pr-3:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 3)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-3:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 3)}.has-data-\[slot\=alert-action\]\:relative:has([data-slot=alert-action]){position:relative}.has-data-\[slot\=alert-action\]\:pr-18:has([data-slot=alert-action]){padding-right:calc(var(--spacing) * 18)}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-data-\[slot\=card-footer\]\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(var(--spacing) * 0)}.has-data-\[slot\=kbd\]\:pr-1\.5:has([data-slot=kbd]){padding-right:calc(var(--spacing) * 1.5)}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:calc(var(--spacing) * 0)}.has-\[\>svg\]\:grid-cols-\[auto_1fr\]:has(>svg){grid-template-columns:auto 1fr}.has-\[\>svg\]\:gap-x-2:has(>svg){column-gap:calc(var(--spacing) * 2)}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + 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)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.aria-invalid\:aria-checked\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--primary)}.data-placeholder\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[align-trigger\=true\]\:animate-none[data-align-trigger=true]{animation:none}.data-\[position\=popper\]\:h-\(--radix-select-trigger-height\)[data-position=popper]{height:var(--radix-select-trigger-height)}.data-\[position\=popper\]\:w-full[data-position=popper]{width:100%}.data-\[position\=popper\]\:min-w-\(--radix-select-trigger-width\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-8[data-size=default]{height:calc(var(--spacing) * 8)}.data-\[size\=default\]\:h-\[18\.4px\][data-size=default]{height:18.4px}.data-\[size\=default\]\:w-\[32px\][data-size=default]{width:32px}.data-\[size\=sm\]\:h-7[data-size=sm]{height:calc(var(--spacing) * 7)}.data-\[size\=sm\]\:h-\[14px\][data-size=sm]{height:14px}.data-\[size\=sm\]\:w-\[24px\][data-size=sm]{width:24px}.data-\[size\=sm\]\:gap-3[data-size=sm]{gap:calc(var(--spacing) * 3)}.data-\[size\=sm\]\:rounded-\[min\(var\(--radius-md\)\,10px\)\][data-size=sm]{border-radius:min(var(--radius-md), 10px)}.data-\[size\=sm\]\:py-3[data-size=sm]{padding-block:calc(var(--spacing) * 3)}.data-\[size\=sm\]\:has-data-\[slot\=card-footer\]\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(var(--spacing) * 0)}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}:is(.\*\*\:data-\[slot\=kbd\]\:relative *)[data-slot=kbd]{position:relative}:is(.\*\*\:data-\[slot\=kbd\]\:isolate *)[data-slot=kbd]{isolation:isolate}:is(.\*\*\:data-\[slot\=kbd\]\:z-50 *)[data-slot=kbd]{z-index:50}:is(.\*\*\:data-\[slot\=kbd\]\:rounded-sm *)[data-slot=kbd]{border-radius:calc(var(--radius) * .6)}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-1\.5>*)[data-slot=select-value]{gap:calc(var(--spacing) * 1.5)}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open]{--tw-enter-opacity:0}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-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,)}}@media (width>=40rem){.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}}@media (width>=48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-pretty{text-wrap:pretty}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.dark\:bg-gray-950:is(.dark *){background-color:var(--color-gray-950)}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.data-open\:animate-in:where([data-state=open]),.data-open\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:fade-in-0:where([data-state=open]),.data-open\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.data-open\:zoom-in-95:where([data-state=open]),.data-open\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}.data-closed\:animate-out:where([data-state=closed]),.data-closed\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:fade-out-0:where([data-state=closed]),.data-closed\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.data-closed\:zoom-out-95:where([data-state=closed]),.data-closed\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.data-checked\:border-primary:where([data-state=checked]),.data-checked\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--primary)}.data-checked\:bg-primary:where([data-state=checked]),.data-checked\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.data-checked\:text-primary-foreground:where([data-state=checked]),.data-checked\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--primary-foreground)}.group-data-\[size\=default\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=default] *):where([data-state=checked]),.group-data-\[size\=default\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=default] *):where([data-checked]:not([data-checked=false])),.group-data-\[size\=sm\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=sm] *):where([data-state=checked]),.group-data-\[size\=sm\]\/switch\:data-checked\:translate-x-\[calc\(100\%-2px\)\]:is(:where(.group\/switch)[data-size=sm] *):where([data-checked]:not([data-checked=false])){--tw-translate-x:calc(100% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:data-checked\:bg-primary:is(.dark *):where([data-state=checked]),.dark\:data-checked\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary)}.dark\:data-checked\:bg-primary-foreground:is(.dark *):where([data-state=checked]),.dark\:data-checked\:bg-primary-foreground:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--primary-foreground)}.data-unchecked\:bg-input:where([data-state=unchecked]),.data-unchecked\:bg-input:where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}.group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=default] *):where([data-state=unchecked]),.group-data-\[size\=default\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=default] *):where([data-unchecked]:not([data-unchecked=false])),.group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=sm] *):where([data-state=unchecked]),.group-data-\[size\=sm\]\/switch\:data-unchecked\:translate-x-0:is(:where(.group\/switch)[data-size=sm] *):where([data-unchecked]:not([data-unchecked=false])){--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:data-unchecked\:bg-foreground:is(.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-foreground:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--foreground)}.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-state=unchecked]),.dark\:data-unchecked\:bg-input\/80:is(.dark *):where([data-unchecked]:not([data-unchecked=false])){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.data-disabled\:pointer-events-none:where([data-disabled=true]),.data-disabled\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.data-disabled\:cursor-not-allowed:where([data-disabled=true]),.data-disabled\:cursor-not-allowed:where([data-disabled]:not([data-disabled=false])){cursor:not-allowed}.data-disabled\:opacity-50:where([data-disabled=true]),.data-disabled\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.data-active\:bg-background:where([data-state=active]),.data-active\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.data-active\:text-foreground:where([data-state=active]),.data-active\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-active\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *):where([data-state=active]),.group-data-\[variant\=default\]\/tabs-list\:data-active\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--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)}.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-active\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.dark\:data-active\:border-input:is(.dark *):where([data-state=active]),.dark\:data-active\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.dark\:data-active\:bg-input\/30:is(.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-active\:bg-input\/30:is(.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-active\:text-foreground:is(.dark *):where([data-state=active]),.dark\:data-active\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.data-horizontal\:h-2\.5:where([data-orientation=horizontal]){height:calc(var(--spacing) * 2.5)}.data-horizontal\:h-px:where([data-orientation=horizontal]){height:1px}.data-horizontal\:w-full:where([data-orientation=horizontal]){width:100%}.data-horizontal\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.data-horizontal\:border-t:where([data-orientation=horizontal]){border-top-style:var(--tw-border-style);border-top-width:1px}.data-horizontal\:border-t-transparent:where([data-orientation=horizontal]){border-top-color:#0000}.data-vertical\:h-full:where([data-orientation=vertical]){height:100%}.data-vertical\:w-2\.5:where([data-orientation=vertical]){width:calc(var(--spacing) * 2.5)}.data-vertical\:w-px:where([data-orientation=vertical]){width:1px}.data-vertical\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.data-vertical\:border-l:where([data-orientation=vertical]){border-left-style:var(--tw-border-style);border-left-width:1px}.data-vertical\:border-l-transparent:where([data-orientation=vertical]){border-left-color:#0000}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.\[\&_a\]\:hover\:text-foreground a:hover{color:var(--foreground)}}.\[\&_p\:not\(\:last-child\)\]\:mb-4 p:not(:last-child){margin-bottom:calc(var(--spacing) * 4)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\.border-b\]\:pb-4.border-b{padding-bottom:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/card\:\[\.border-b\]\:pb-3:is(:where(.group\/card)[data-size=sm] *).border-b{padding-bottom:calc(var(--spacing) * 3)}:is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}:is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:var(--muted)}.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.\*\:\[img\:first-child\]\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}:is(.\*\:\[img\:last-child\]\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.\*\:\[svg\]\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.\*\:\[svg\]\:translate-y-0\.5>*):is(svg){--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\:\[svg\]\:text-current>*):is(svg){color:currentColor}:is(.\*\:\[svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4>*):is(svg:not([class*=size-])){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-wght-normal-Dm3htQBi.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--background:oklch(100% 0 0);--foreground:oklch(14.7% .004 49.25);--card:oklch(100% 0 0);--card-foreground:oklch(14.7% .004 49.25);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.7% .004 49.25);--primary:oklch(55.5% .163 48.998);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(96.7% .001 286.375);--secondary-foreground:oklch(21% .006 285.885);--muted:oklch(97% .001 106.424);--muted-foreground:oklch(55.3% .013 58.071);--accent:oklch(97% .001 106.424);--accent-foreground:oklch(21.6% .006 56.043);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.3% .003 48.717);--input:oklch(92.3% .003 48.717);--ring:oklch(70.9% .01 56.259);--chart-1:oklch(87.9% .169 91.605);--chart-2:oklch(76.9% .188 70.08);--chart-3:oklch(66.6% .179 58.318);--chart-4:oklch(55.5% .163 48.998);--chart-5:oklch(47.3% .137 46.201);--radius:.625rem;--sidebar:oklch(98.5% .001 106.423);--sidebar-foreground:oklch(14.7% .004 49.25);--sidebar-primary:oklch(66.6% .179 58.318);--sidebar-primary-foreground:oklch(98.7% .022 95.277);--sidebar-accent:oklch(97% .001 106.424);--sidebar-accent-foreground:oklch(21.6% .006 56.043);--sidebar-border:oklch(92.3% .003 48.717);--sidebar-ring:oklch(70.9% .01 56.259)}.dark{--background:oklch(14.7% .004 49.25);--foreground:oklch(98.5% .001 106.423);--card:oklch(21.6% .006 56.043);--card-foreground:oklch(98.5% .001 106.423);--popover:oklch(21.6% .006 56.043);--popover-foreground:oklch(98.5% .001 106.423);--primary:oklch(47.3% .137 46.201);--primary-foreground:oklch(98.7% .022 95.277);--secondary:oklch(27.4% .006 286.033);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.8% .007 34.298);--muted-foreground:oklch(70.9% .01 56.259);--accent:oklch(26.8% .007 34.298);--accent-foreground:oklch(98.5% .001 106.423);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.3% .013 58.071);--chart-1:oklch(87.9% .169 91.605);--chart-2:oklch(76.9% .188 70.08);--chart-3:oklch(66.6% .179 58.318);--chart-4:oklch(55.5% .163 48.998);--chart-5:oklch(47.3% .137 46.201);--sidebar:oklch(21.6% .006 56.043);--sidebar-foreground:oklch(98.5% .001 106.423);--sidebar-primary:oklch(76.9% .188 70.08);--sidebar-primary-foreground:oklch(27.9% .077 45.635);--sidebar-accent:oklch(26.8% .007 34.298);--sidebar-accent-foreground:oklch(98.5% .001 106.423);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.3% .013 58.071)}@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-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-space-x-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-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-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@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}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="46" fill="none" viewBox="0 0 48 46"><path fill="#863bff" d="M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z" style="fill:#863bff;fill:color(display-p3 .5252 .23 1);fill-opacity:1"/><mask id="a" width="48" height="46" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z" style="fill:#000;fill-opacity:1"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#ede6ff" rx="5.508" ry="14.704" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -4.47 31.516)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#ede6ff" rx="10.399" ry="29.851" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -39.328 7.883)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#7e14ff" rx="5.508" ry="30.487" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -25.913 -14.639)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -32.644 -3.334)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -34.34 30.47)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#ede6ff" rx="14.072" ry="22.078" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="rotate(93.35 24.506 48.493)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx=".387" cy="8.972" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(39.51 .387 8.972)"/></g><g filter="url(#k)"><ellipse cx="47.523" cy="-6.092" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 47.523 -6.092)"/></g><g filter="url(#l)"><ellipse cx="41.412" cy="6.333" fill="#47bfff" rx="5.971" ry="9.665" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 41.412 6.333)"/></g><g filter="url(#m)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#n)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#o)"><ellipse cx="35.651" cy="29.907" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 35.651 29.907)"/></g><g filter="url(#p)"><ellipse cx="38.418" cy="32.4" fill="#47bfff" rx="5.971" ry="15.297" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 38.418 32.4)"/></g></g><defs><filter id="b" width="60.045" height="41.654" x="-19.77" y="16.149" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-54.613" y="-7.533" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-49.64" y="2.03" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-45.045" y="20.029" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-43.513" y="21.178" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="15.756" y="-17.901" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-27.636" y="-22.853" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="20.116" y="-38.415" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="24.641" y="-11.323" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="8.244" y="-2.416" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="18.713" y="10.588" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter></defs></svg>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<symbol id="bluesky-icon" viewBox="0 0 16 17">
|
|
3
|
+
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
|
|
4
|
+
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
|
|
5
|
+
</symbol>
|
|
6
|
+
<symbol id="discord-icon" viewBox="0 0 20 19">
|
|
7
|
+
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
|
|
8
|
+
</symbol>
|
|
9
|
+
<symbol id="documentation-icon" viewBox="0 0 21 20">
|
|
10
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
|
|
11
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
|
|
12
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
|
|
13
|
+
</symbol>
|
|
14
|
+
<symbol id="github-icon" viewBox="0 0 19 19">
|
|
15
|
+
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
|
|
16
|
+
</symbol>
|
|
17
|
+
<symbol id="social-icon" viewBox="0 0 20 20">
|
|
18
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
|
|
19
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
|
|
20
|
+
</symbol>
|
|
21
|
+
<symbol id="x-icon" viewBox="0 0 19 19">
|
|
22
|
+
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
|
|
23
|
+
</symbol>
|
|
24
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>skills-eval</title>
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-2gXzIx5u.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B2aEHgRo.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="root"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{accessSync as Oe,existsSync as ws}from"node:fs";import Le from"node:path";import{existsSync as Vr}from"node:fs";import ue from"node:path";import Zr from"@fastify/static";import ts from"@fastify/websocket";import es from"fastify";import{spawn as qe}from"node:child_process";import{EventEmitter as Je}from"node:events";var Z=class{processes=new Map;spawn(e,r,s,n,o){let i=new Je,c=Date.now(),d=[],l=qe(r,s,{cwd:n,stdio:["pipe","pipe","pipe"],detached:!0});this.processes.set(e,{child:l,emitter:i,eventBuffer:d,finished:!1,startedAt:c});let a=u=>{d.push(u),i.emit("event",u)},p="";return l.stdout?.on("data",u=>{p+=u.toString("utf-8");let m=p.split(`
|
|
3
|
+
`);p=m.pop()??"";for(let f of m)a({type:"stdout",data:f,timestamp:Date.now()})}),l.stderr?.on("data",u=>{let m=u.toString("utf-8");m.length>0&&a({type:"stderr",data:m,timestamp:Date.now()})}),l.on("error",u=>{a({type:"error",data:u.message,timestamp:Date.now()}),this.markFinished(e)}),l.on("close",(u,m)=>{let f=p;f.length>0&&a({type:"stdout",data:f,timestamp:Date.now()});let y=m?`signal:${m}`:String(u??0);a({type:"exit",data:y,timestamp:Date.now()}),this.markFinished(e)}),l.stdin?.write(o),l.stdin?.end(),i}stop(e){let r=this.processes.get(e);if(!r)return!1;let s=r.child.pid;try{s?process.kill(-s,"SIGTERM"):r.child.kill("SIGTERM")}catch{r.child.kill("SIGTERM")}return!0}subscribe(e,r){let s=this.processes.get(e);if(!s)return!1;for(let n of s.eventBuffer)r(n);return s.finished||s.emitter.on("event",r),!0}unsubscribe(e,r){let s=this.processes.get(e);s&&s.emitter.off("event",r)}has(e){return this.processes.has(e)}markFinished(e){let r=this.processes.get(e);r&&(r.finished=!0,setTimeout(()=>this.processes.delete(e),3e4))}killAll(){for(let[e,r]of this.processes){if(!r.finished){let s=r.child.pid;try{s?process.kill(-s,"SIGTERM"):r.child.kill("SIGTERM")}catch{r.child.kill("SIGTERM")}}this.processes.delete(e)}}},R=new Z;import{eq as tt}from"drizzle-orm";import{integer as I,sqliteTable as D,text as h}from"drizzle-orm/sqlite-core";var b=D("skills",{id:I("id").primaryKey({autoIncrement:!0}),createdAt:h("created_at").notNull().$defaultFn(()=>new Date().toISOString()),projectDir:h("project_dir").notNull(),skillDir:h("skill_dir").notNull(),skillPath:h("skill_path").notNull()}),v=D("iterations",{id:I("id").primaryKey({autoIncrement:!0}),createdAt:h("created_at").notNull().$defaultFn(()=>new Date().toISOString()),number:I("number").notNull(),skillId:I("skill_id").notNull()}),C=D("feedback",{id:I("id").primaryKey({autoIncrement:!0}),comment:h("comment").notNull(),createdAt:h("created_at").notNull().$defaultFn(()=>new Date().toISOString()),iterationId:I("iteration_id").notNull(),kind:h("kind").notNull(),scope:h("scope"),testCaseId:h("test_case_id")}),k=D("assertions",{id:I("id").primaryKey({autoIncrement:!0}),assertion:h("assertion").notNull(),createdAt:h("created_at").notNull().$defaultFn(()=>new Date().toISOString()),description:h("description").notNull(),scope:h("scope").notNull(),script:h("script"),skillId:I("skill_id").notNull(),type:h("type").notNull()}),w=D("grades",{id:I("id").primaryKey({autoIncrement:!0}),assertionId:I("assertion_id").notNull(),config:h("config").notNull(),createdAt:h("created_at").notNull().$defaultFn(()=>new Date().toISOString()),evidence:h("evidence"),iterationId:I("iteration_id").notNull(),pass:I("pass").notNull(),reason:h("reason"),testCaseId:h("test_case_id").notNull()}),g=D("test_cases",{id:h("id").primaryKey(),comment:h("comment"),prompt:h("prompt").notNull(),skillId:I("skill_id").notNull(),sortOrder:I("sort_order").notNull()}),A=D("completed_runs",{id:I("id").primaryKey({autoIncrement:!0}),config:h("config").notNull(),costUsd:h("cost_usd"),createdAt:h("created_at").notNull().$defaultFn(()=>new Date().toISOString()),durationMs:I("duration_ms"),isError:I("is_error").notNull(),iterationId:I("iteration_id").notNull(),outputDir:h("output_dir").notNull(),testCaseId:h("test_case_id").notNull()});import{eq as gt}from"drizzle-orm";import We from"gray-matter";var dt=new Map([["grading-llm-judge",`---
|
|
4
|
+
description: Grade one assertion against one run's artifacts using LLM judgment
|
|
5
|
+
required_vars:
|
|
6
|
+
- assertion
|
|
7
|
+
- description
|
|
8
|
+
- artifact_content
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are grading a single assertion against the output of an eval run.
|
|
12
|
+
|
|
13
|
+
## Assertion
|
|
14
|
+
|
|
15
|
+
**{{assertion}}**
|
|
16
|
+
|
|
17
|
+
## Evaluation Instructions
|
|
18
|
+
|
|
19
|
+
{{description}}
|
|
20
|
+
|
|
21
|
+
## Artifact Content
|
|
22
|
+
|
|
23
|
+
{{artifact_content}}
|
|
24
|
+
|
|
25
|
+
## Instructions
|
|
26
|
+
|
|
27
|
+
Evaluate the artifact against the assertion using the evaluation instructions above. Return a JSON object with:
|
|
28
|
+
- \`pass\`: boolean \u2014 true if the assertion is satisfied, false otherwise
|
|
29
|
+
- \`reason\`: string \u2014 brief explanation of your judgment
|
|
30
|
+
- \`evidence\`: string \u2014 specific quote or reference from the artifact that supports your judgment
|
|
31
|
+
`],["test-cases-generate",`---
|
|
32
|
+
description: Generate additional test cases for a skill evaluation
|
|
33
|
+
required_vars:
|
|
34
|
+
- skill_content
|
|
35
|
+
- context
|
|
36
|
+
- existing_cases
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
You are helping evaluate a Claude skill by generating diverse test cases.
|
|
40
|
+
|
|
41
|
+
## Skill Being Evaluated
|
|
42
|
+
|
|
43
|
+
{{skill_content}}
|
|
44
|
+
|
|
45
|
+
## Creation Context
|
|
46
|
+
|
|
47
|
+
{{context}}
|
|
48
|
+
|
|
49
|
+
## Existing Test Cases
|
|
50
|
+
|
|
51
|
+
{{existing_cases}}
|
|
52
|
+
|
|
53
|
+
## Instructions
|
|
54
|
+
|
|
55
|
+
Generate 3 additional test cases that complement the existing set. Include:
|
|
56
|
+
- At least one edge case or adversarial scenario (malformed input, out-of-scope request, missing context)
|
|
57
|
+
- At least one realistic happy-path scenario different from existing cases
|
|
58
|
+
- Prompts that a real user would actually type
|
|
59
|
+
|
|
60
|
+
Return a JSON object with a \`testCases\` array. Each element must have a \`prompt\` string field containing the test case prompt text.
|
|
61
|
+
`],["improve-skill",`---
|
|
62
|
+
required:
|
|
63
|
+
- skill_path
|
|
64
|
+
- skill_content
|
|
65
|
+
- context
|
|
66
|
+
- grades_summary
|
|
67
|
+
- feedback_text
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
You are improving a skill based on evaluation results and user feedback.
|
|
71
|
+
|
|
72
|
+
## Skill Location
|
|
73
|
+
|
|
74
|
+
The skill is at: \`{{skill_path}}\`
|
|
75
|
+
|
|
76
|
+
## Current Skill Content
|
|
77
|
+
|
|
78
|
+
{{skill_content}}
|
|
79
|
+
|
|
80
|
+
## Creation Context
|
|
81
|
+
|
|
82
|
+
{{context}}
|
|
83
|
+
|
|
84
|
+
## Evaluation Results (Current Iteration)
|
|
85
|
+
|
|
86
|
+
{{grades_summary}}
|
|
87
|
+
|
|
88
|
+
## User Feedback
|
|
89
|
+
|
|
90
|
+
{{feedback_text}}
|
|
91
|
+
|
|
92
|
+
## Instructions
|
|
93
|
+
|
|
94
|
+
Read the evaluation results and user feedback carefully. Improve the skill files at \`{{skill_path}}\` to address the feedback while keeping the improvements general \u2014 this skill will be used across many different prompts, not just the test cases shown here.
|
|
95
|
+
|
|
96
|
+
Key principles:
|
|
97
|
+
- Generalize from feedback, don't overfit to specific test cases
|
|
98
|
+
- Explain the "why" rather than adding rigid ALWAYS/NEVER rules
|
|
99
|
+
- Keep the prompt lean \u2014 remove what isn't pulling its weight
|
|
100
|
+
- If multiple test cases show the same problem, address the root cause once
|
|
101
|
+
- Draft your revision, then look at it with fresh eyes before committing
|
|
102
|
+
|
|
103
|
+
Write your changes directly to the skill files. Do not create new files outside the skill directory.
|
|
104
|
+
`],["assertions-draft",`---
|
|
105
|
+
description: Draft assertions for first iteration based on user feedback
|
|
106
|
+
required_vars:
|
|
107
|
+
- context
|
|
108
|
+
- feedback_text
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
You are drafting quality assertions for a skill evaluation based on user feedback.
|
|
112
|
+
|
|
113
|
+
## Creation Context
|
|
114
|
+
|
|
115
|
+
{{context}}
|
|
116
|
+
|
|
117
|
+
## User Feedback
|
|
118
|
+
|
|
119
|
+
{{feedback_text}}
|
|
120
|
+
|
|
121
|
+
## Instructions
|
|
122
|
+
|
|
123
|
+
Based on the user's feedback, draft a set of assertions that capture what the user cares about. Each assertion should be:
|
|
124
|
+
- **Binary** (PASS or FAIL, no partial credit)
|
|
125
|
+
- **Specific** enough that a grading agent can evaluate independently
|
|
126
|
+
- **Derived from the feedback**, not from assumptions about what "good" means
|
|
127
|
+
|
|
128
|
+
Include both global assertions (apply to the run as a whole) and per-artifact assertions (scoped to specific output types) as appropriate.
|
|
129
|
+
|
|
130
|
+
For each assertion, choose the type:
|
|
131
|
+
- \`llm_judge\` \u2014 requires LLM interpretation (tone, quality, relevance)
|
|
132
|
+
- \`deterministic_script\` \u2014 can be checked with a script (word count, format, presence of elements)
|
|
133
|
+
|
|
134
|
+
Return a JSON object with an \`assertions\` array. Each element must have:
|
|
135
|
+
- \`assertion\`: short label
|
|
136
|
+
- \`description\`: detailed evaluation instructions for the grading agent
|
|
137
|
+
- \`scope\`: "global" or the artifact name
|
|
138
|
+
- \`type\`: "llm_judge" or "deterministic_script"
|
|
139
|
+
- \`script\`: null for llm_judge, or the script code for deterministic
|
|
140
|
+
`],["test-cases-update",`---
|
|
141
|
+
description: Update test cases that have comments from the user
|
|
142
|
+
required_vars:
|
|
143
|
+
- skill_content
|
|
144
|
+
- context
|
|
145
|
+
- commented_cases
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
You are helping evaluate a Claude skill by revising test cases based on user feedback.
|
|
149
|
+
|
|
150
|
+
## Skill Being Evaluated
|
|
151
|
+
|
|
152
|
+
{{skill_content}}
|
|
153
|
+
|
|
154
|
+
## Creation Context
|
|
155
|
+
|
|
156
|
+
{{context}}
|
|
157
|
+
|
|
158
|
+
## Test Cases With Comments
|
|
159
|
+
|
|
160
|
+
{{commented_cases}}
|
|
161
|
+
|
|
162
|
+
## Instructions
|
|
163
|
+
|
|
164
|
+
For each test case above, read the user's comment and revise the prompt accordingly. Apply the feedback directly \u2014 do not ask clarifying questions.
|
|
165
|
+
|
|
166
|
+
Return a JSON object with an \`updatedCases\` array. Each element must have:
|
|
167
|
+
- \`id\`: the original test case ID (preserved exactly)
|
|
168
|
+
- \`prompt\`: the revised prompt text incorporating the user's feedback
|
|
169
|
+
`],["eval-with-skill",`---
|
|
170
|
+
description: Eval execution prompt for with_skill configuration
|
|
171
|
+
required_vars:
|
|
172
|
+
- skill_path
|
|
173
|
+
- test_prompt
|
|
174
|
+
- output_dir
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
Read the skill at {{skill_path}} first, then follow its instructions to complete the task below.
|
|
178
|
+
|
|
179
|
+
## Task
|
|
180
|
+
|
|
181
|
+
{{test_prompt}}
|
|
182
|
+
|
|
183
|
+
## Output Requirements
|
|
184
|
+
|
|
185
|
+
Save any outputs (documents, files, artifacts) to: {{output_dir}}/
|
|
186
|
+
|
|
187
|
+
Write all artifacts only to the directory above. Do not write files elsewhere.
|
|
188
|
+
`],["eval-without-skill",`---
|
|
189
|
+
description: Eval execution prompt for without_skill baseline configuration
|
|
190
|
+
required_vars:
|
|
191
|
+
- test_prompt
|
|
192
|
+
- output_dir
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
Complete the task below.
|
|
196
|
+
|
|
197
|
+
## Task
|
|
198
|
+
|
|
199
|
+
{{test_prompt}}
|
|
200
|
+
|
|
201
|
+
## Output Requirements
|
|
202
|
+
|
|
203
|
+
Save any outputs (documents, files, artifacts) to: {{output_dir}}/
|
|
204
|
+
|
|
205
|
+
Write all artifacts only to the directory above. Do not write files elsewhere.
|
|
206
|
+
`]]);async function pt(t,e){let r=dt.get(t);if(!r)throw new Error("Unknown prompt template: "+t+". Available: "+[...dt.keys()].join(", "));let{data:s,content:n}=We(r);return{frontmatter:s,body:n.trim()}}var ut=/\{\{(\w+)\}\}/g;async function T(t,e,r){let n=(await pt(t,r)).body,o=new Set;for(let c of n.matchAll(ut))o.add(c[1]);let i=[...o].filter(c=>!Object.hasOwn(e,c));if(i.length>0)throw new Error(`Missing required prompt variables: ${i.join(", ")}`);return n.replace(ut,(c,d)=>e[d])}import{spawn as Ye}from"node:child_process";function M(){return{claudeBin:process.env.CLAUDE_BIN??"claude",isTest:process.env.NODE_ENV==="test"}}var Xe=["-p","--no-session-persistence","--dangerously-skip-permissions","--tools",""];function mt(t,e){let r=[...Xe,"--output-format","json","--json-schema",JSON.stringify(t)];return e&&r.push("--model",e),r}var ft=["-p","--no-session-persistence","--dangerously-skip-permissions","--output-format","stream-json","--verbose"];async function x(t){let e=t.claudeBin??M().claudeBin,r=mt(t.schema,t.model),s=await Ke(e,r,t.prompt),n=JSON.parse(s.trim());if(n.is_error)throw new Error(`Claude task failed: ${n.result??"unknown error"}`);if(n.structured_output==null)throw new Error("Claude response missing structured_output. Got keys: "+Object.keys(n).join(", "));return n.structured_output}function Ke(t,e,r){return new Promise((s,n)=>{let o=Ye(t,e,{stdio:["pipe","pipe","pipe"],timeout:12e4,detached:!0}),i=[],c=[];o.stdout.on("data",d=>i.push(d)),o.stderr.on("data",d=>c.push(d)),o.on("error",n),o.on("close",d=>{let l=Buffer.concat(i).toString("utf-8");if(d!==0){let a=Buffer.concat(c).toString("utf-8");n(new Error(`Claude process exited with code ${d}: ${a||l}`));return}s(l)}),o.stdin.write(r),o.stdin.end()})}var He={type:"object",properties:{assertions:{type:"array",items:{type:"object",properties:{assertion:{type:"string"},description:{type:"string"},scope:{type:"string"},type:{type:"string"},script:{type:["string","null"]}},required:["assertion","description","scope","type"]}}},required:["assertions"]};async function ht(t){let{db:e,iterationId:r,skillId:s}=t,n=await e.select().from(k).where(gt(k.skillId,s));if(n.length>0)return n.map(a=>({id:a.id,assertion:a.assertion,createdAt:a.createdAt,description:a.description,scope:a.scope,script:a.script,skillId:a.skillId,type:a.type}));let o=await e.select().from(C).where(gt(C.iterationId,r));if(o.length===0)throw new Error("Cannot draft assertions: no feedback has been submitted for this iteration. Review the outputs and submit feedback first.");let i=o.map(a=>`${a.kind==="artifact"?`[${a.scope}] `:"[Overall] "}${a.comment}`).join(`
|
|
207
|
+
`),c=await T("assertions-draft",{context:t.contextMarkdown,feedback_text:i}),d=await x({prompt:c,schema:He,claudeBin:t.claudeBin}),l=[];for(let a of d.assertions){let[p]=await e.insert(k).values({assertion:a.assertion,description:a.description,scope:a.scope,script:a.script??null,skillId:s,type:a.type}).returning();l.push({id:p.id,assertion:p.assertion,createdAt:p.createdAt,description:p.description,scope:p.scope,script:p.script,skillId:p.skillId,type:p.type})}return l}function wt(t,e){t.get("/api/assertions",r=>{let{skillId:s}=r.query;return e.db.select().from(k).where(tt(k.skillId,Number(s)))}),t.post("/api/assertions/draft",async r=>{let{iterationId:s,skillId:n}=r.body,o="";try{let{readFile:i}=await import("node:fs/promises");o=await i(e.workspace.contextPath,"utf-8")}catch{}return ht({db:e.db,iterationId:s,skillId:n,contextMarkdown:o,claudeBin:e.claudeBin})}),t.delete("/api/assertions/:id",async(r,s)=>{let{id:n}=r.params;return await e.db.delete(k).where(tt(k.id,Number(n))),s.code(204).send()}),t.patch("/api/assertions/:id",async r=>{let{id:s}=r.params,n=r.body,[o]=await e.db.update(k).set(n).where(tt(k.id,Number(s))).returning();return o})}import{readFile as ze}from"node:fs/promises";function yt(t,e){t.get("/api/bootstrap",async()=>{let r=null;try{r=await ze(e.workspace.contextPath,"utf-8")}catch{}return{mode:e.args.mode,skillId:e.skillId,skillPath:e.args.skillPath,projectDir:e.args.projectDir,contextMarkdown:r}})}import Et from"node:path";import{readFile as Qe}from"node:fs/promises";import Ve from"node:path";import{eq as kt}from"drizzle-orm";async function bt(t){let{db:e,skillId:r}=t,s=await e.select().from(v).where(kt(v.skillId,r)).orderBy(v.number);if(s.length===0)return{iterations:[],testCases:[]};let n=await Promise.all(s.map(l=>Ze(t,l))),o=[];for(let l of s){let a=await e.select({assertionId:w.assertionId,config:w.config,iterationId:w.iterationId,pass:w.pass,testCaseId:w.testCaseId}).from(w).where(kt(w.iterationId,l.id));o.push(a.filter(p=>p.config==="with_skill"))}let i=s.map((l,a)=>{let p=o[a],u=n[a],m=u?p.filter(f=>u.has(f.testCaseId)):p;return{iterationId:l.id,iterationNumber:l.number,totalAssertions:m.length,totalPass:m.filter(f=>f.pass===1).length}}),c=new Set;for(let l of o)for(let a of l)c.add(a.testCaseId);for(let l of n)if(l)for(let a of l)c.add(a);let d=[...c].map(l=>{let a=o.map((p,u)=>{let m=n[u];if(m&&!m.has(l))return null;let f=p.filter(y=>y.testCaseId===l);return f.length===0?m?{pass:0,total:0}:null:{pass:f.filter(y=>y.pass===1).length,total:f.length}});return{testCaseId:l,iterationResults:a}});return{iterations:i,testCases:d}}async function Ze(t,e){if(!t.runsDir)return null;let r=Ve.join(t.runsDir,`skill-${t.skillId}`,`iteration-${e.number}`,"test-cases.json");try{let s=await Qe(r,"utf-8"),n=JSON.parse(s);return new Set(n.map(o=>o.id))}catch{return null}}import{execFile as tr}from"node:child_process";import{promisify as er}from"node:util";var rr=er(tr);async function It(t,e){try{let{stdout:r}=await rr("diff",["-ruN",t,e],{maxBuffer:10485760});return r}catch(r){if(r&&typeof r=="object"&&"code"in r&&r.code===1&&"stdout"in r&&typeof r.stdout=="string")return r.stdout;throw r}}function vt(t,e){t.get("/api/comparison",r=>{let{skillId:s}=r.query;return bt({db:e.db,runsDir:e.runsDir,skillId:Number(s)})}),t.get("/api/comparison/skill-diff",async(r,s)=>{let{iterNumA:n,iterNumB:o,skillId:i}=r.query,c=Number(n),d=Number(o),l=Number(i);if(!Number.isInteger(c)||c<1||!Number.isInteger(d)||d<1||!Number.isInteger(l)||l<1)return s.code(400).send({error:"Invalid numeric parameters"});let a=Et.join(e.runsDir,`skill-${l}`,`iteration-${c}`,"skill-snapshot"),p=Et.join(e.runsDir,`skill-${l}`,`iteration-${d}`,"skill-snapshot");return{diff:await It(a,p)}})}import{lstat as _r,readdir as Ar,readFile as Fr,rm as Br}from"node:fs/promises";import nt from"node:path";import{eq as jr}from"drizzle-orm";import{mkdir as xr}from"node:fs/promises";import N from"node:path";import{eq as rt}from"drizzle-orm";import{spawn as sr}from"node:child_process";import{createWriteStream as nr}from"node:fs";import{mkdir as or,writeFile as ir}from"node:fs/promises";import Tt from"node:path";function Ct(t){let e;try{e=JSON.parse(t)}catch{return{type:"error",text:`Malformed stream line: ${t}`}}let r=e.type;if(r==="system"&&e.subtype==="init")return{type:"init",sessionId:e.session_id};if(r==="result")return{type:"result",isError:e.is_error??!1,costUsd:e.total_cost_usd??0,text:e.result??void 0};if(r==="stream_event"){let s=e.event;if(!s)return null;let n=s.type;if(n==="content_block_delta"){let i=s.delta?.text;if(i!=null)return{type:"text_delta",text:i}}if(n==="content_block_start"){let o=s.content_block;if(o?.type==="tool_use")return{type:"tool_use",toolName:o.name}}return null}return null}function St(t,e,r,s){e.write(`${t}
|
|
208
|
+
`);let n=Ct(t);n&&(r(n),n.type==="result"&&(s.costUsd=n.costUsd??0,s.isError=n.isError??!1))}async function U(t,e){let r=t.claudeBin??M().claudeBin,s=[...ft];await or(t.outputDir,{recursive:!0});let n=Tt.join(t.outputDir,"stream.log"),o=nr(n,{flags:"w"}),i=Date.now();return new Promise((c,d)=>{let l=sr(r,s,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],detached:!0}),a={costUsd:0,isError:!1},p="",u=[];l.stdout.on("data",m=>{p+=m.toString("utf-8");let f=p.split(`
|
|
209
|
+
`);p=f.pop()??"";for(let y of f){let G=y.trim();G&&St(G,o,e,a)}}),l.stderr.on("data",m=>{u.push(m)}),l.on("error",m=>{o.end(),d(m)}),l.on("close",m=>{let f=p.trim();f&&St(f,o,e,a),m!==0&&m!==null&&!a.isError&&(a.isError=!0),o.end(async()=>{if(u.length>0){let y=Buffer.concat(u).toString("utf-8");await ir(Tt.join(t.outputDir,"stderr.log"),y,"utf-8")}c({config:t.config??"with_skill",testCaseId:t.testCaseId??"",outputDir:t.outputDir,costUsd:a.costUsd,durationMs:Date.now()-i,isError:a.isError})})}),l.stdin.write(t.prompt),l.stdin.end()})}import{execFile as ar}from"node:child_process";import{promisify as cr}from"node:util";var lr=cr(ar);async function xt(t){try{let{stdout:e}=await lr("sh",["-c",t.script],{cwd:t.outputDir,timeout:3e4});return{assertionId:t.assertionId,config:t.config,evidence:e.trim()||null,iterationId:t.iterationId,pass:!0,reason:"Script exited successfully",testCaseId:t.testCaseId}}catch(e){let r=e instanceof Error?e.message:String(e);return{assertionId:t.assertionId,config:t.config,evidence:null,iterationId:t.iterationId,pass:!1,reason:`Script failed: ${r}`,testCaseId:t.testCaseId}}}import{lstat as Pt,readdir as dr,readFile as Rt}from"node:fs/promises";import et from"node:path";var pr={type:"object",properties:{pass:{type:"boolean"},reason:{type:"string"},evidence:{type:"string"}},required:["pass","reason"]};async function Dt(t){let e=await ur(t.outputDir,t.scope);if(e===null)return{assertionId:t.assertionId,config:t.config,evidence:null,iterationId:t.iterationId,pass:!1,reason:`Expected artifact not found: ${t.scope}`,testCaseId:t.testCaseId};let r=await T("grading-llm-judge",{assertion:t.assertion,description:t.description,artifact_content:e}),s=await x({prompt:r,schema:pr,claudeBin:t.claudeBin});return{assertionId:t.assertionId,config:t.config,evidence:s.evidence??null,iterationId:t.iterationId,pass:s.pass,reason:s.reason,testCaseId:t.testCaseId}}async function ur(t,e){if(e==="global"){let s=new Set(["stream.log","stderr.log","changes.diff","changes-summary.txt"]);try{let n=await dr(t),o=[];for(let i of n){if(s.has(i))continue;let c=et.join(t,i);try{if(!(await Pt(c)).isFile())continue;let l=await Rt(c,"utf-8");o.push(`--- ${i} ---
|
|
210
|
+
${l}`)}catch{}}return o.length>0?o.join(`
|
|
211
|
+
|
|
212
|
+
`):null}catch{return null}}let r=et.resolve(t,e);if(!r.startsWith(t+et.sep)&&r!==t)return null;try{return(await Pt(r)).isFile()?await Rt(r,"utf-8"):null}catch{return null}}async function B(t,e,r=5){let s=[],n=0;async function o(){for(;n<e.length;){let c=e[n++],d;try{d=c.type==="llm_judge"?await Dt(c):await xt(c)}catch(l){d={assertionId:c.assertionId,config:c.config,evidence:null,iterationId:c.iterationId,pass:!1,reason:`Grading error: ${l instanceof Error?l.message:String(l)}`,testCaseId:c.testCaseId}}await t.insert(w).values({assertionId:d.assertionId,config:d.config,evidence:d.evidence,iterationId:d.iterationId,pass:d.pass?1:0,reason:d.reason,testCaseId:d.testCaseId}),s.push(d)}}let i=Array.from({length:Math.min(r,e.length)},()=>o());return await Promise.all(i),s}import{execFile as mr}from"node:child_process";import{writeFile as Nt}from"node:fs/promises";import _t from"node:path";import{promisify as fr}from"node:util";var q=fr(mr);async function At(t,e){let{stdout:r}=await q("git",["log","--all","--grep=baseline","--format=%H","-1"],{cwd:t}),s=r.trim()||"HEAD";await q("git",["add","-A","--force"],{cwd:t});let{stdout:n}=await q("git",["diff","--cached",s],{cwd:t,maxBuffer:50*1024*1024});await Nt(_t.join(e,"changes.diff"),n,"utf-8");let{stdout:o}=await q("git",["diff","--stat","--cached",s],{cwd:t,maxBuffer:10*1024*1024});await Nt(_t.join(e,"changes-summary.txt"),o,"utf-8")}import{rm as gr}from"node:fs/promises";async function Ft(t){await gr(t,{recursive:!0,force:!0})}import{lstat as hr,readdir as wr}from"node:fs/promises";import yr from"node:path";var kr=new Set(["stream.log","stderr.log","changes.diff","changes-summary.txt"]);async function Bt(t){let e;try{e=await wr(t)}catch{return[]}let r=[];for(let s of e){if(kr.has(s))continue;let n=yr.join(t,s),o=await hr(n);o.isFile()&&r.push({filename:s,path:n,sizeBytes:o.size})}return r}import{cp as br,mkdir as jt,readFile as Ir,writeFile as Ot}from"node:fs/promises";import j from"node:path";import{eq as Lt,sql as Er}from"drizzle-orm";async function $t(t){let{db:e,skillId:r,workspace:s}=t,[n]=await e.select().from(b).where(Lt(b.id,r));if(!n)throw new Error(`Skill not found: ${r}`);let i=((await e.all(Er`SELECT MAX(number) as max_num FROM iterations WHERE skill_id = ${r}`))[0]?.max_num??0)+1,c=j.join(s.runsDir,`skill-${r}`,`iteration-${i}`);await jt(c,{recursive:!0});let d=j.join(c,"skill-snapshot");if(n.skillDir===n.projectDir){await jt(d,{recursive:!0});let p=j.basename(n.skillPath),u=await Ir(n.skillPath,"utf-8");await Ot(j.join(d,p),u,"utf-8")}else await br(n.skillDir,d,{recursive:!0});let l=await e.select().from(g).where(Lt(g.skillId,r)).orderBy(g.sortOrder);await Ot(j.join(c,"test-cases.json"),JSON.stringify(l,null,2),"utf-8");let[a]=await e.insert(v).values({number:i,skillId:r}).returning();return{id:a.id,number:a.number,skillId:a.skillId,createdAt:a.createdAt}}import{execFile as vr}from"node:child_process";import{mkdir as Cr,rm as Tr}from"node:fs/promises";import J from"node:path";import{promisify as Sr}from"node:util";var W=Sr(vr);async function Gt(t){let{projectDir:e,destDir:r,excludeSkillDir:s}=t;await Cr(r,{recursive:!0});let n=["-a","--exclude",".skill-eval",`${e}/`,`${r}/`];if(await W("rsync",n),s){let o=J.isAbsolute(s)?J.relative(e,s):s;if(o&&o!=="."&&!o.startsWith("..")){let i=J.resolve(r,o);i.startsWith(r+J.sep)&&await Tr(i,{recursive:!0,force:!0})}}try{await W("git",["remote","remove","origin"],{cwd:r})}catch{}await W("git",["add","-A"],{cwd:r}),await W("git",["commit","-m","baseline","--allow-empty","--no-verify"],{cwd:r})}var Pr=["with_skill","without_skill"];async function Mt(t){let{db:e,skillId:r,workspace:s,claudeBin:n,onProgress:o}=t,[i]=await e.select().from(b).where(rt(b.id,r));if(!i)throw new Error(`Skill not found: ${r}`);let c=await e.select().from(g).where(rt(g.skillId,r)).orderBy(g.sortOrder);if(c.length===0)throw new Error("No test cases to evaluate");let d=await $t({db:e,skillId:r,workspace:s}),l=N.join(s.runsDir,`skill-${r}`,`iteration-${d.number}`),a=[];for(let u of c)for(let m of Pr){let f=await Rr({claudeBin:n,config:m,iterDir:l,iteration:d,onProgress:o,skill:i,tc:u});a.push(f),await e.insert(A).values({config:f.config,costUsd:String(f.costUsd),durationMs:f.durationMs,isError:f.isError?1:0,iterationId:d.id,outputDir:f.outputDir,testCaseId:f.testCaseId})}let p=await e.select().from(k).where(rt(k.skillId,r));if(p.length>0){let u=Dr({assertionRows:p,claudeBin:n,iterDir:l,iteration:d,testCases:c});await B(e,u)}return{iterationId:d.id,runs:a}}async function Rr(t){let{claudeBin:e,config:r,iterDir:s,onProgress:n,skill:o,tc:i}=t,c=N.join(s,r,i.id),d=N.join(c,"outputs"),l=N.join(c,"codebase-copy");await xr(d,{recursive:!0}),await Gt({destDir:l,excludeSkillDir:r==="without_skill"?o.skillDir:void 0,projectDir:o.projectDir});let a={test_prompt:i.prompt,output_dir:d};if(r==="with_skill"){let f=N.relative(o.projectDir,o.skillPath);a.skill_path=N.join(l,f)}let u=await T(r==="with_skill"?"eval-with-skill":"eval-without-skill",a),m=await U({claudeBin:e,config:r,cwd:l,outputDir:d,prompt:u,testCaseId:i.id},f=>{n&&n({...f,testCaseId:i.id,config:r})});try{await At(l,d)}catch{}return await Bt(d),await Ft(l),m}function Dr(t){let{assertionRows:e,claudeBin:r,iterDir:s,iteration:n,testCases:o}=t,i=["with_skill","without_skill"],c=[];for(let d of o)for(let l of i){let a=N.join(s,l,d.id,"outputs");for(let p of e)if(p.type==="deterministic_script"){if(!p.script)continue;c.push({type:"deterministic_script",assertionId:p.id,assertion:p.assertion,script:p.script,outputDir:a,iterationId:n.id,testCaseId:d.id,config:l})}else c.push({type:"llm_judge",assertionId:p.id,assertion:p.assertion,description:p.description,scope:p.scope,outputDir:a,iterationId:n.id,testCaseId:d.id,config:l,claudeBin:r})}return c}import{EventEmitter as Nr}from"node:events";var st=class extends Nr{emit(e,r){return super.emit(e,r)}onProgress(e,r){this.on(`iteration:${e}`,r)}offProgress(e,r){this.off(`iteration:${e}`,r)}publish(e,r){this.emit(`iteration:${e}`,r)}},O=new st;function Ut(t,e){t.post("/api/eval/run",async r=>{let{skillId:s}=r.body,n=await Mt({claudeBin:e.claudeBin,db:e.db,onProgress:o=>{O.publish(s,o)},skillId:s,workspace:e.workspace});return{iterationId:n.iterationId,runs:n.runs}}),t.get("/api/iterations/:id/runs",async r=>{let{id:s}=r.params,n=Number(s);return(await e.db.select().from(A).where(jr(A.iterationId,n))).map(i=>({id:i.id,config:i.config,costUsd:i.costUsd?Number(i.costUsd):0,createdAt:i.createdAt,durationMs:i.durationMs,isError:i.isError===1,iterationId:i.iterationId,outputDir:i.outputDir,testCaseId:i.testCaseId}))}),t.get("/api/artifacts/content",async(r,s)=>{let{outputDir:n}=r.query;if(!n)return s.code(400).send({error:"outputDir required"});let o=nt.resolve(n),i=e.workspace.runsDir+nt.sep;if(o!==e.workspace.runsDir&&!o.startsWith(i))return s.code(403).send({error:"Access denied"});try{let c=await Ar(o),d=new Set(["stream.log","stderr.log","changes.diff","changes-summary.txt"]),l=[];for(let a of c.sort())if(!d.has(a))try{let p=nt.join(o,a);if(!(await _r(p)).isFile())continue;let m=await Fr(p,"utf-8");l.push(`--- ${a} ---
|
|
213
|
+
${m}`)}catch{}return{content:l.join(`
|
|
214
|
+
|
|
215
|
+
`)||null}}catch{return{content:null}}}),t.post("/api/reset",async()=>{await e.db.delete(w),await e.db.delete(A),await e.db.delete(C),await e.db.delete(k),await e.db.delete(v),await e.db.delete(g);try{await Br(e.workspace.runsDir,{recursive:!0,force:!0})}catch{}return{ok:!0}})}import{eq as Or}from"drizzle-orm";async function qt(t,e){let[r]=await t.insert(C).values({comment:e.comment,iterationId:e.iterationId,kind:"artifact",scope:e.scope,testCaseId:e.testCaseId}).returning();return{id:r.id,comment:r.comment,createdAt:r.createdAt,iterationId:r.iterationId,kind:r.kind,scope:r.scope,testCaseId:r.testCaseId}}async function Jt(t,e){let[r]=await t.insert(C).values({comment:e.comment,iterationId:e.iterationId,kind:"iteration",scope:null,testCaseId:null}).returning();return{id:r.id,comment:r.comment,createdAt:r.createdAt,iterationId:r.iterationId,kind:r.kind,scope:r.scope,testCaseId:r.testCaseId}}function Wt(t,e){t.get("/api/feedback",r=>{let{iterationId:s}=r.query;return e.db.select().from(C).where(Or(C.iterationId,Number(s)))}),t.post("/api/feedback/artifact",async(r,s)=>{let n=r.body,o=await qt(e.db,n);return s.code(201).send(o)}),t.post("/api/feedback/iteration",async(r,s)=>{let n=r.body,o=await Jt(e.db,n);return s.code(201).send(o)})}import{eq as F}from"drizzle-orm";import{readFile as Lr}from"node:fs/promises";import Xt from"node:path";import{eq as Yt}from"drizzle-orm";async function ot(t){let{claudeBin:e,db:r,iterationId:s,skillId:n,workspace:o}=t,[i]=await r.select().from(v).where(Yt(v.id,s));if(!i)throw new Error(`Iteration not found: ${s}`);let c=await r.select().from(k).where(Yt(k.skillId,n)),d=Xt.join(o.runsDir,`skill-${n}`,`iteration-${i.number}`,"test-cases.json"),l;try{let u=await Lr(d,"utf-8");l=JSON.parse(u)}catch{throw new Error(`Cannot read test-cases.json snapshot for iteration ${i.number}`)}let a=["with_skill","without_skill"],p=[];for(let u of l)for(let m of a){let f=Xt.join(o.runsDir,`skill-${n}`,`iteration-${i.number}`,m,u.id,"outputs");for(let y of c)if(y.type==="deterministic_script"){if(!y.script)throw new Error(`Assertion ${y.id} is deterministic_script but has no script`);p.push({type:"deterministic_script",assertionId:y.id,assertion:y.assertion,script:y.script,outputDir:f,iterationId:s,testCaseId:u.id,config:m})}else p.push({type:"llm_judge",assertionId:y.id,assertion:y.assertion,description:y.description,scope:y.scope,outputDir:f,iterationId:s,testCaseId:u.id,config:m,claudeBin:e})}return p}function Kt(t,e){t.get("/api/grades",async r=>{let{iterationId:s}=r.query;return(await e.db.select().from(w).where(F(w.iterationId,Number(s)))).map(o=>({assertionId:o.assertionId,config:o.config,evidence:o.evidence,iterationId:o.iterationId,pass:o.pass===1,reason:o.reason,testCaseId:o.testCaseId}))}),t.post("/api/grade",async r=>{let{iterationId:s,skillId:n}=r.body,i=(await e.db.select({id:w.id}).from(w).where(F(w.iterationId,s))).map(l=>l.id),c=await ot({claudeBin:e.claudeBin,db:e.db,iterationId:s,skillId:n,workspace:e.workspace}),d=await B(e.db,c);for(let l of i)await e.db.delete(w).where(F(w.id,l));return{gradeCount:d.length,results:d}}),t.post("/api/regrade",async r=>{let{skillId:s}=r.body,n=await e.db.select().from(v).where(F(v.skillId,s)),o=[];for(let i of n){let c;try{c=await ot({claudeBin:e.claudeBin,db:e.db,iterationId:i.id,skillId:s,workspace:e.workspace})}catch(p){if((p instanceof Error?p.message:"").includes("Cannot read test-cases.json snapshot"))continue;throw p}let l=(await e.db.select({id:w.id}).from(w).where(F(w.iterationId,i.id))).map(p=>p.id),a=await B(e.db,c);o.push(...a);for(let p of l)await e.db.delete(w).where(F(w.id,p))}return{gradeCount:o.length,results:o}})}function Ht(t){t.get("/health",()=>({status:"ok"}))}import $r from"node:path";import{readFile as zt}from"node:fs/promises";import{eq as L}from"drizzle-orm";async function Qt(t,e){let{db:r,iterationId:s,skillId:n}=t,[o]=await r.select().from(b).where(L(b.id,n));if(!o)throw new Error(`Skill not found: ${n}`);let i=await zt(o.skillPath,"utf-8"),c="";if(t.contextPath)try{c=await zt(t.contextPath,"utf-8")}catch{}let l=(await r.select().from(w).where(L(w.iterationId,s))).filter(E=>E.config==="with_skill"),a=await r.select().from(k).where(L(k.skillId,n)),p=new Map(a.map(E=>[E.id,E])),u=l.map(E=>{let V=p.get(E.assertionId),Ge=V?V.assertion:`assertion-${E.assertionId}`,Me=E.pass?"PASS":"FAIL",Ue=E.evidence?` | Evidence: ${E.evidence}`:"";return`- [${Me}] ${Ge} (${E.testCaseId}): ${E.reason??"no reason"}${Ue}`}).join(`
|
|
216
|
+
`),f=(await r.select().from(C).where(L(C.iterationId,s))).map(E=>`${E.kind==="artifact"?`[${E.scope??"unknown"} / ${E.testCaseId??""}]`:"[Overall]"} ${E.comment}`).join(`
|
|
217
|
+
`),[y]=await r.select().from(v).where(L(v.id,s));if(!y)throw new Error(`Iteration not found: ${s}`);if(y.skillId!==n)throw new Error(`Iteration ${s} belongs to skill ${y.skillId}, not ${n}`);let G=await T("improve-skill",{skill_path:o.skillPath,skill_content:i,context:c||"(No context provided)",grades_summary:u||"(No grades yet)",feedback_text:f||"(No feedback yet)"});await U({claudeBin:t.claudeBin,cwd:o.skillDir,outputDir:t.logsDir,prompt:G},e)}function Vt(t,e){t.post("/api/improve",async r=>{let{iterationId:s,skillId:n}=r.body,o=[],i=$r.join(e.workspace.runsDir,`skill-${n}`,`improve-${s}`);await Qt({claudeBin:e.claudeBin,contextPath:e.workspace.contextPath,db:e.db,iterationId:s,logsDir:i,skillId:n},a=>o.push(a));let c=o.find(a=>a.type==="result"),d=!!c;return{ok:!(!d||c&&"isError"in c&&c.isError),eventCount:o.length,hasResult:d}})}import{readdir as Ur,realpath as te}from"node:fs/promises";import ee from"node:path";function Gr(t){let e=t.replace(/\s+/g," ").trim();try{return JSON.stringify(JSON.parse(e))}catch{return e}}function Mr(t){let e=[];if(t.outputFormat==="stream-json"&&e.push("--verbose"),t.includePartialMessages&&t.outputFormat==="stream-json"&&e.push("--include-partial-messages"),t.systemPrompt.trim()){let r=t.systemPromptMode==="replace"?"--system-prompt":"--append-system-prompt";e.push(r,t.systemPrompt)}if(t.noTools?e.push("--tools",""):t.tools.length>0&&e.push("--tools",t.tools.join(",")),t.jsonSchema.trim()&&e.push("--json-schema",Gr(t.jsonSchema)),t.debugEnabled){let r=t.debugCategories.map(({category:s,exclude:n})=>n?`!${s}`:s);e.push("--debug",...r.length>0?[r.join(",")]:[])}return t.disableMcp&&e.push("--strict-mcp-config","--mcp-config",'{"mcpServers":{}}'),t.settingSources.length>0&&e.push("--setting-sources",t.settingSources.join(",")),e}function Zt(t){let e=t.effort==="max"&&t.model!=="opus"?"high":t.effort;return["-p","--dangerously-skip-permissions","--no-session-persistence","--model",t.model,"--effort",e,"--output-format",t.outputFormat,...Mr(t),"--max-turns",String(t.maxTurns??88)]}function re(t,e){let r=e.claudeBin??"claude",s=ee.join(e.projectDir,"claude-cli");t.get("/api/playground/folders",async()=>{try{return{folders:(await Ur(s,{withFileTypes:!0})).filter(i=>i.isDirectory()).map(i=>i.name).sort()}}catch{return{folders:[]}}}),t.post("/api/playground/run",async(n,o)=>{let{config:i}=n.body,c=i.subfolder?ee.resolve(s,i.subfolder):s;try{let a=await te(c),p=await te(s);if(!a.startsWith(`${p}/`)&&a!==p)return o.code(400).send({error:"Subfolder must be within claude-cli/"})}catch{return o.code(400).send({error:"Subfolder does not exist"})}let d=crypto.randomUUID(),l=Zt(i);return R.spawn(d,r,l,c,i.prompt),o.send({runId:d})}),t.post("/api/playground/stop/:runId",(n,o)=>{let{runId:i}=n.params;return R.stop(i)?o.send({ok:!0}):o.code(404).send({error:"Run not found"})}),t.get("/ws/playground/:runId",{websocket:!0},(n,o)=>{let{runId:i}=o.params,c=l=>{try{n.send(JSON.stringify(l))}catch{}};R.subscribe(i,c)||n.send(JSON.stringify({type:"error",data:"Run not found or already completed",timestamp:Date.now()})),n.on("close",()=>{R.unsubscribe(i,c)})})}import{readFile as ae}from"node:fs/promises";import{eq as le}from"drizzle-orm";import{randomUUID as qr}from"node:crypto";import{sql as Jr}from"drizzle-orm";async function X(t,e){let r=qr(),o=((await t.all(Jr`SELECT MAX(sort_order) as max_order FROM test_cases WHERE skill_id = ${e.skillId}`))[0]?.max_order??0)+1;return await t.insert(g).values({id:r,prompt:e.prompt,skillId:e.skillId,sortOrder:o}),{id:r,prompt:e.prompt,skillId:e.skillId,sortOrder:o,comment:null}}import{eq as Wr}from"drizzle-orm";async function se(t,e){return(await t.delete(g).where(Wr(g.id,e))).rowsAffected>0}import{eq as Xr}from"drizzle-orm";var Yr={type:"object",properties:{testCases:{type:"array",items:{type:"object",properties:{prompt:{type:"string"}},required:["prompt"]}}},required:["testCases"]};async function ne(t){let e=await t.db.select().from(g).where(Xr(g.skillId,t.skillId)).orderBy(g.sortOrder),r=e.length>0?e.map((i,c)=>`${c+1}. ${i.prompt}`).join(`
|
|
218
|
+
`):"(none yet)",s=await T("test-cases-generate",{skill_content:t.skillContent,context:t.contextMarkdown,existing_cases:r}),n=await x({prompt:s,schema:Yr,claudeBin:t.claudeBin,model:"haiku"}),o=[];for(let i of n.testCases){let c=await X(t.db,{skillId:t.skillId,prompt:i.prompt});o.push(c)}return o}import{and as Kr,eq as Hr,isNotNull as zr}from"drizzle-orm";import{eq as oe}from"drizzle-orm";async function Y(t,e,r){let s={};r.prompt!==void 0&&(s.prompt=r.prompt),r.comment!==void 0&&(s.comment=r.comment),Object.keys(s).length>0&&await t.update(g).set(s).where(oe(g.id,e));let n=await t.select().from(g).where(oe(g.id,e));return n.length===0?null:n[0]}var Qr={type:"object",properties:{updatedCases:{type:"array",items:{type:"object",properties:{id:{type:"string"},prompt:{type:"string"}},required:["id","prompt"]}}},required:["updatedCases"]};async function ie(t){let r=(await t.db.select().from(g).where(Kr(Hr(g.skillId,t.skillId),zr(g.comment))).orderBy(g.sortOrder)).filter(a=>a.comment!=null&&a.comment.trim().length>0);if(r.length===0)return[];let s=r.map(a=>`- ID: ${a.id}
|
|
219
|
+
Prompt: ${a.prompt}
|
|
220
|
+
Comment: ${a.comment}`).join(`
|
|
221
|
+
|
|
222
|
+
`),n=await T("test-cases-update",{skill_content:t.skillContent,context:t.contextMarkdown,commented_cases:s}),o=await x({prompt:n,schema:Qr,claudeBin:t.claudeBin,model:"haiku"}),i=new Set(r.map(a=>a.id)),c=new Set(o.updatedCases.map(a=>a.id)),d=[...i].filter(a=>!c.has(a));if(d.length>0)throw new Error(`Claude returned partial update: missing IDs ${d.join(", ")}. Expected ${i.size}, got ${c.size}.`);let l=[];for(let a of o.updatedCases){if(!i.has(a.id))continue;let p=await Y(t.db,a.id,{prompt:a.prompt,comment:null});p&&l.push(p)}return l}function de(t,e){t.get("/api/test-cases",async r=>{let{skillId:s}=r.query;return await e.db.select().from(g).where(le(g.skillId,Number(s))).orderBy(g.sortOrder)}),t.post("/api/test-cases",async(r,s)=>{let n=r.body,o=await X(e.db,n);return s.code(201).send(o)}),t.patch("/api/test-cases/:id",async(r,s)=>{let{id:n}=r.params,o=r.body,i=await Y(e.db,n,o);return i||s.code(404).send({error:"Test case not found"})}),t.delete("/api/test-cases/:id",async(r,s)=>{let{id:n}=r.params;return await se(e.db,n)?s.code(204).send():s.code(404).send({error:"Test case not found"})}),t.post("/api/test-cases/generate",async(r,s)=>{let{skillId:n}=r.body,o=await ce(e,n);return o?await ne({db:e.db,skillId:n,contextMarkdown:o.contextMarkdown,skillContent:o.skillContent,claudeBin:e.claudeBin}):s.code(404).send({error:`Skill not found: ${n}`})}),t.post("/api/test-cases/update-commented",async(r,s)=>{let{skillId:n}=r.body,o=await ce(e,n);return o?await ie({db:e.db,skillId:n,contextMarkdown:o.contextMarkdown,skillContent:o.skillContent,claudeBin:e.claudeBin}):s.code(404).send({error:`Skill not found: ${n}`})})}async function ce(t,e){let[r]=await t.db.select().from(b).where(le(b.id,e));if(!r)return null;let s="";try{s=await ae(t.workspace.contextPath,"utf-8")}catch{}let n=await ae(r.skillPath,"utf-8");return{contextMarkdown:s,skillContent:n}}function pe(t){t.get("/ws/progress/:skillId",{websocket:!0},(e,r)=>{let{skillId:s}=r.params,n=Number(s),o=i=>{try{e.send(JSON.stringify(i))}catch{}};O.onProgress(n,o),e.on("close",()=>{O.offProgress(n,o)})})}var rs=ue.resolve(import.meta.dirname,"../client");async function me(t){let e=es({logger:!1});await e.register(ts),await e.register(pe),await e.register(Ht),await e.register(yt,t),await e.register(de,{db:t.db,workspace:t.workspace}),await e.register(Wt,{db:t.db}),await e.register(wt,{db:t.db,workspace:t.workspace}),await e.register(Vt,{db:t.db,workspace:t.workspace}),await e.register(vt,{db:t.db,runsDir:t.workspace.runsDir}),await e.register(Ut,{claudeBin:t.claudeBin,db:t.db,skillId:t.skillId,workspace:t.workspace}),await e.register(Kt,{claudeBin:t.claudeBin,db:t.db,workspace:t.workspace}),await e.register(re,{claudeBin:t.claudeBin,projectDir:t.args.projectDir}),e.addHook("onClose",()=>{R.killAll()});let r=t.clientDir??rs;return Vr(ue.join(r,"index.html"))?(await e.register(Zr,{root:r,wildcard:!1}),e.setNotFoundHandler((n,o)=>{let i=n.method,c=n.url.split("?")[0],l=(c.split("/").pop()??"").includes(".");return(i==="GET"||i==="HEAD")&&!c.startsWith("/api/")&&!l?o.sendFile("index.html"):o.code(404).send({error:"Not found",path:c})})):e.setNotFoundHandler((n,o)=>o.code(503).header("content-type","text/html").send("<html><body><h1>Client not built</h1><p>Run <code>bun run build</code> first, or use <code>bun run dev</code> with <code>bun run dev:cli</code> for development.</p></body></html>")),e}function fe(t){let e={};for(let d=0;d<t.length;d++){let l=t[d];if(l.startsWith("--")&&d+1<t.length){let a=l.slice(2);e[a]=t[++d]}}let r=e.mode??"improve-output";if(r!=="improve-output")throw new Error(`Invalid mode: "${r}". Only "improve-output" is supported.`);let s=e["skill-path"];if(!s)throw new Error("Missing required argument: --skill-path");let n=e["project-dir"]??process.cwd(),o=null;if(e.port&&(o=Number.parseInt(e.port,10),!Number.isFinite(o)||String(o)!==e.port))throw new Error(`Invalid --port value: "${e.port}". Must be an integer.`);let i=e.open??"/";i.startsWith("/")||(i=`/${i}`);let c=e.context;if(!c)throw new Error("Missing required argument: --context");return{mode:r,skillPath:s,projectDir:n,port:o,openPath:i,context:c}}async function K(t,e){let r=`http://127.0.0.1:${String(t)}${e}`;await(await import("open")).default(r)}import ps from"node:path";import{existsSync as ge,mkdirSync as he,readFileSync as ss,rmdirSync as ke,unlinkSync as ns,writeFileSync as os}from"node:fs";import{mkdir as we,readFile as be,rmdir as Ie,unlink as it,writeFile as H}from"node:fs/promises";import at from"node:path";function is(t){return at.join(t,".skill-eval","server.json")}function P(t){return at.join(t,".skill-eval","servers.json")}function z(t){return at.join(t,".skill-eval","servers.lock")}var Ee=50,ve=5e3,as=3e3;async function ct(t){let e=z(t),r=Date.now()+ve;for(;;)try{await we(e);return}catch{if(Date.now()>=r){try{await Ie(e)}catch{}try{await we(e);return}catch{throw new Error("Failed to acquire servers.json lock")}}await new Promise(s=>setTimeout(s,Ee))}}async function lt(t){try{await Ie(z(t))}catch{}}function cs(t){let e=z(t),r=Date.now()+ve;for(;;)try{he(e);return}catch{if(Date.now()>=r){try{ke(e)}catch{}try{he(e);return}catch{return}}let s=Date.now()+Ee;for(;Date.now()<s;);}}function ls(t){try{ke(z(t))}catch{}}var ye=new Set;async function ds(t){if(ye.has(t))return;ye.add(t);let e=P(t);if(ge(e))return;let r=is(t);if(ge(r))try{let s=await be(r,"utf-8"),n=JSON.parse(s);await H(e,JSON.stringify([n],null,2),"utf-8"),await it(r)}catch{}}async function $(t){await ds(t);try{let e=await be(P(t),"utf-8"),r=JSON.parse(e);return Array.isArray(r)?r:[]}catch{return[]}}async function Ce(t,e){return(await $(t)).find(s=>s.skillPath===e)??null}async function Te(t,e){await ct(e);try{let r=await $(e),s=r.findIndex(n=>n.skillPath===t.skillPath);s>=0?r[s]=t:r.push(t),await H(P(e),JSON.stringify(r,null,2),"utf-8")}finally{await lt(e)}}async function Se(t,e){await ct(t);try{let s=(await $(t)).filter(n=>n.skillPath!==e);if(s.length===0)try{await it(P(t))}catch{}else await H(P(t),JSON.stringify(s,null,2),"utf-8")}finally{await lt(t)}}function xe(t,e,r){cs(t);try{let s=P(t),n;try{let i=ss(s,"utf-8"),c=JSON.parse(i);n=Array.isArray(c)?c:[]}catch{return}let o=n.filter(i=>i.skillPath!==e||r!==void 0&&i.pid!==r);if(o.length===0)try{ns(s)}catch{}else os(s,JSON.stringify(o,null,2),"utf-8")}finally{ls(t)}}async function Pe(t){let e=await $(t);if(e.length===0)return;let r=await Promise.allSettled(e.map(async n=>{if(!(await fetch(`http://127.0.0.1:${String(n.port)}/health`,{signal:AbortSignal.timeout(as)})).ok)throw new Error("unhealthy");return n})),s=new Set;for(let n=0;n<e.length;n++)r[n].status==="rejected"&&s.add(e[n].skillPath);if(s.size!==0){await ct(t);try{let o=(await $(t)).filter(i=>!s.has(i.skillPath));if(o.length===0)try{await it(P(t))}catch{}else await H(P(t),JSON.stringify(o,null,2),"utf-8")}finally{await lt(t)}}}async function Re(t,e){let r=ps.resolve(t.projectDir,t.skillPath),s=await Ce(t.projectDir,r);if(!s)return!1;try{if(!(await fetch(`http://127.0.0.1:${String(s.port)}/health`)).ok)throw new Error("unhealthy")}catch{return await Se(t.projectDir,r),!1}if(!e?.skipBrowserOpen)try{await K(s.port,t.openPath)}catch{console.log(`Open http://127.0.0.1:${String(s.port)}${t.openPath} in your browser.`)}return!0}import{access as Ae,mkdir as Q,readFile as fs,writeFile as Fe}from"node:fs/promises";import Be from"node:path";import{eq as gs}from"drizzle-orm";import{sql as S}from"drizzle-orm";import{createClient as us}from"@libsql/client";import{drizzle as ms}from"drizzle-orm/libsql";function De(t){let e=t.split("/").map(s=>encodeURIComponent(s)).join("/"),r=us({url:`file:${e}`});return ms(r,{schema:{skills:b,testCases:g}})}async function Ne(t){let e=De(t);return await e.run(S`PRAGMA journal_mode=WAL`),await e.run(S`CREATE TABLE IF NOT EXISTS skills (
|
|
223
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
224
|
+
created_at TEXT NOT NULL,
|
|
225
|
+
project_dir TEXT NOT NULL,
|
|
226
|
+
skill_dir TEXT NOT NULL,
|
|
227
|
+
skill_path TEXT NOT NULL
|
|
228
|
+
)`),await e.run(S`CREATE UNIQUE INDEX IF NOT EXISTS idx_skills_skill_path ON skills(skill_path)`),await e.run(S`CREATE TABLE IF NOT EXISTS iterations (
|
|
229
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
230
|
+
created_at TEXT NOT NULL,
|
|
231
|
+
number INTEGER NOT NULL,
|
|
232
|
+
skill_id INTEGER NOT NULL
|
|
233
|
+
)`),await e.run(S`CREATE TABLE IF NOT EXISTS feedback (
|
|
234
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
235
|
+
comment TEXT NOT NULL,
|
|
236
|
+
created_at TEXT NOT NULL,
|
|
237
|
+
iteration_id INTEGER NOT NULL,
|
|
238
|
+
kind TEXT NOT NULL,
|
|
239
|
+
scope TEXT,
|
|
240
|
+
test_case_id TEXT
|
|
241
|
+
)`),await e.run(S`CREATE TABLE IF NOT EXISTS assertions (
|
|
242
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
243
|
+
assertion TEXT NOT NULL,
|
|
244
|
+
created_at TEXT NOT NULL,
|
|
245
|
+
description TEXT NOT NULL,
|
|
246
|
+
scope TEXT NOT NULL,
|
|
247
|
+
script TEXT,
|
|
248
|
+
skill_id INTEGER NOT NULL,
|
|
249
|
+
type TEXT NOT NULL
|
|
250
|
+
)`),await e.run(S`CREATE TABLE IF NOT EXISTS grades (
|
|
251
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
252
|
+
assertion_id INTEGER NOT NULL,
|
|
253
|
+
config TEXT NOT NULL,
|
|
254
|
+
created_at TEXT NOT NULL,
|
|
255
|
+
evidence TEXT,
|
|
256
|
+
iteration_id INTEGER NOT NULL,
|
|
257
|
+
pass INTEGER NOT NULL,
|
|
258
|
+
reason TEXT,
|
|
259
|
+
test_case_id TEXT NOT NULL
|
|
260
|
+
)`),await e.run(S`CREATE TABLE IF NOT EXISTS test_cases (
|
|
261
|
+
id TEXT PRIMARY KEY,
|
|
262
|
+
comment TEXT,
|
|
263
|
+
prompt TEXT NOT NULL,
|
|
264
|
+
skill_id INTEGER NOT NULL,
|
|
265
|
+
sort_order INTEGER NOT NULL
|
|
266
|
+
)`),await e.run(S`CREATE TABLE IF NOT EXISTS completed_runs (
|
|
267
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
268
|
+
config TEXT NOT NULL,
|
|
269
|
+
cost_usd TEXT,
|
|
270
|
+
created_at TEXT NOT NULL,
|
|
271
|
+
duration_ms INTEGER,
|
|
272
|
+
is_error INTEGER NOT NULL,
|
|
273
|
+
iteration_id INTEGER NOT NULL,
|
|
274
|
+
output_dir TEXT NOT NULL,
|
|
275
|
+
test_case_id TEXT NOT NULL
|
|
276
|
+
)`),e}import _ from"node:path";function _e(t,e){let r=_.join(t,".skill-eval");return{skillEvalDir:r,dbPath:_.join(r,"eval.db"),contextPath:_.join(r,"context.md"),runsDir:_.join(r,"runs"),evalsDir:_.join(r,"evals"),feedbackDir:_.join(r,"feedback"),skillPath:_.resolve(t,e)}}async function je(t){let e=_e(t.projectDir,t.skillPath);try{await Ae(t.projectDir)}catch{throw new Error(`Project directory not found: ${t.projectDir}`)}try{await Ae(e.skillPath)}catch{throw new Error(`Skill file not found: ${e.skillPath}`)}await Q(e.skillEvalDir,{recursive:!0}),await Q(e.runsDir,{recursive:!0}),await Q(e.evalsDir,{recursive:!0}),await Q(e.feedbackDir,{recursive:!0}),await Fe(e.contextPath,t.context,"utf-8"),await hs(t.projectDir);let r=await Ne(e.dbPath),s=Be.dirname(e.skillPath);await r.insert(b).values({skillPath:e.skillPath,skillDir:s,projectDir:t.projectDir}).onConflictDoNothing();let[n]=await r.select({id:b.id}).from(b).where(gs(b.skillPath,e.skillPath)),o=n.id;return{workspace:e,db:r,skillId:o}}async function hs(t){let e=Be.join(t,".gitignore"),r=".skill-eval/",s="";try{s=await fs(e,"utf-8")}catch{}if(s.split(`
|
|
277
|
+
`).some(i=>i.trim()===r))return;let o=s.length>0&&!s.endsWith(`
|
|
278
|
+
`)?`
|
|
279
|
+
`:"";await Fe(e,`${s}${o}
|
|
280
|
+
# Skill eval workspace
|
|
281
|
+
${r}
|
|
282
|
+
`,"utf-8")}var $e=3e3;async function ys(){let t=fe(process.argv.slice(2));try{Oe(t.projectDir)}catch{throw new Error(`Project directory not found: ${t.projectDir}`)}let e=Le.resolve(t.projectDir,t.skillPath);try{Oe(e)}catch{throw new Error(`Skill file not found: ${e}`)}if(await Re(t)){console.log("Reused existing server.");return}await Pe(t.projectDir);let{workspace:s,db:n,skillId:o}=await je(t),i=await me({args:t,workspace:s,db:n,skillId:o}),c;if(t.port===null)try{await i.listen({port:$e,host:"127.0.0.1"}),c=$e}catch(l){if(l instanceof Error&&"code"in l&&l.code==="EADDRINUSE")await i.listen({port:0,host:"127.0.0.1"}),c=i.addresses()[0].port;else throw l}else await i.listen({port:t.port,host:"127.0.0.1"}),c=t.port;console.log(`Server listening on http://127.0.0.1:${String(c)}`),await Te({pid:process.pid,port:c,projectDir:t.projectDir,skillPath:e},t.projectDir),process.on("exit",()=>{xe(t.projectDir,e,process.pid)}),process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0));let d=ws(Le.resolve(import.meta.dirname,"../client/index.html"));if(d&&!process.env.SKILL_EVAL_NO_OPEN)try{await K(c,t.openPath)}catch{console.log(`Open http://127.0.0.1:${String(c)}${t.openPath} in your browser.`)}else d||console.log("No client build found. Run 'bun run dev' in another terminal for the UI.")}ys().catch(t=>{console.error(t),process.exit(1)});
|