@axlsdk/studio 0.13.5 → 0.13.7
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 +6 -4
- package/dist/{chunk-NU6255VY.js → chunk-YWRYXT7U.js} +171 -36
- package/dist/chunk-YWRYXT7U.js.map +1 -0
- package/dist/cli.cjs +170 -35
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/client/assets/index-C_uwupnn.js +221 -0
- package/dist/client/assets/index-DVcH6P9w.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/{connection-manager-DbOgO_gK.d.cts → connection-manager-B7AWpsCD.d.cts} +9 -3
- package/dist/{connection-manager-DbOgO_gK.d.ts → connection-manager-B7AWpsCD.d.ts} +9 -3
- package/dist/middleware.cjs +170 -35
- package/dist/middleware.cjs.map +1 -1
- package/dist/middleware.d.cts +1 -1
- package/dist/middleware.d.ts +1 -1
- package/dist/middleware.js +1 -1
- package/dist/server/index.cjs +180 -35
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +3 -2
- package/dist/server/index.d.ts +3 -2
- package/dist/server/index.js +1 -1
- package/package.json +5 -5
- package/dist/chunk-NU6255VY.js.map +0 -1
- package/dist/client/assets/index-DG2zy3iH.js +0 -150
- package/dist/client/assets/index-WUBHc-Rd.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.2.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-green-100:oklch(96.2% .044 156.743);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-cyan-500:oklch(71.5% .143 215.221);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-900:oklch(38% .189 293.745);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-gray-500:oklch(55.1% .027 264.364);--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--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-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--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;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.-top-0\.5{top:calc(var(--spacing) * -.5)}.top-0{top:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.top-\[3px\]{top:3px}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-\[3px\]{bottom:3px}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-m-0\.5{margin:calc(var(--spacing) * -.5)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-8{margin-right:calc(var(--spacing) * 8)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-\[1px\]{margin-bottom:1px}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-8{margin-left:calc(var(--spacing) * 8)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-40{height:calc(var(--spacing) * 40)}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-96{max-height:calc(var(--spacing) * 96)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[44px\]{min-height:44px}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-\[340px\]{width:340px}.w-\[400px\]{width:400px}.w-full{width:100%}.w-px{width:1px}.max-w-3xl{max-width:var(--container-3xl)}.max-w-24{max-width:calc(var(--spacing) * 24)}.max-w-\[80\%\]{max-width:80%}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.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-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[hsl\(var\(--border\)\)\]>:not(:last-child)){border-color:hsl(var(--border))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-\[hsl\(var\(--border\)\)\],.border-\[hsl\(var\(--border\)\)\]\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-\[hsl\(var\(--border\)\)\]\/40{border-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.border-\[hsl\(var\(--border\)\)\]\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-\[hsl\(var\(--border\)\)\]\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-\[hsl\(var\(--foreground\)\)\]{border-color:hsl(var(--foreground))}.border-\[hsl\(var\(--input\)\)\]{border-color:hsl(var(--input))}.border-\[hsl\(var\(--primary\)\)\]{border-color:hsl(var(--primary))}.border-amber-200{border-color:var(--color-amber-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-transparent{border-color:#0000}.border-l-\[hsl\(var\(--foreground\)\)\]{border-left-color:hsl(var(--foreground))}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-emerald-500{border-left-color:var(--color-emerald-500)}.border-l-green-500{border-left-color:var(--color-green-500)}.border-l-red-500{border-left-color:var(--color-red-500)}.border-l-slate-400{border-left-color:var(--color-slate-400)}.border-l-transparent{border-left-color:#0000}.bg-\[hsl\(var\(--accent\)\)\],.bg-\[hsl\(var\(--accent\)\)\]\/30{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.bg-\[hsl\(var\(--accent\)\)\]\/30{background-color:color-mix(in oklab,hsl(var(--accent)) 30%,transparent)}}.bg-\[hsl\(var\(--accent\)\)\]\/40{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.bg-\[hsl\(var\(--accent\)\)\]\/40{background-color:color-mix(in oklab,hsl(var(--accent)) 40%,transparent)}}.bg-\[hsl\(var\(--background\)\)\]{background-color:hsl(var(--background))}.bg-\[hsl\(var\(--border\)\)\]{background-color:hsl(var(--border))}.bg-\[hsl\(var\(--card\)\)\]{background-color:hsl(var(--card))}.bg-\[hsl\(var\(--destructive\)\)\]{background-color:hsl(var(--destructive))}.bg-\[hsl\(var\(--foreground\)\)\]{background-color:hsl(var(--foreground))}.bg-\[hsl\(var\(--muted\)\)\],.bg-\[hsl\(var\(--muted\)\)\]\/30{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-\[hsl\(var\(--muted\)\)\]\/30{background-color:color-mix(in oklab,hsl(var(--muted)) 30%,transparent)}}.bg-\[hsl\(var\(--muted\)\)\]\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-\[hsl\(var\(--muted\)\)\]\/50{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.bg-\[hsl\(var\(--muted-foreground\)\)\]{background-color:hsl(var(--muted-foreground))}.bg-\[hsl\(var\(--primary\)\)\]{background-color:hsl(var(--primary))}.bg-\[hsl\(var\(--primary\)\/0\.08\)\]{background-color:hsl(var(--primary)/.08)}.bg-\[hsl\(var\(--secondary\)\)\]{background-color:hsl(var(--secondary))}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/60{background-color:#fffbeb99}@supports (color:color-mix(in lab,red,red)){.bg-amber-50\/60{background-color:color-mix(in oklab,var(--color-amber-50) 60%,transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/30{background-color:#ecfdf54d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-50\/30{background-color:color-mix(in oklab,var(--color-emerald-50) 30%,transparent)}}.bg-emerald-50\/60{background-color:#ecfdf599}@supports (color:color-mix(in lab,red,red)){.bg-emerald-50\/60{background-color:color-mix(in oklab,var(--color-emerald-50) 60%,transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-400{background-color:var(--color-purple-400)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-50\/30{background-color:#fef2f24d}@supports (color:color-mix(in lab,red,red)){.bg-red-50\/30{background-color:color-mix(in oklab,var(--color-red-50) 30%,transparent)}}.bg-red-50\/60{background-color:#fef2f299}@supports (color:color-mix(in lab,red,red)){.bg-red-50\/60{background-color:color-mix(in oklab,var(--color-red-50) 60%,transparent)}}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-violet-100{background-color:var(--color-violet-100)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.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-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.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-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-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[hsl\(var\(--accent-foreground\)\)\]{color:hsl(var(--accent-foreground))}.text-\[hsl\(var\(--background\)\)\]{color:hsl(var(--background))}.text-\[hsl\(var\(--border\)\)\]{color:hsl(var(--border))}.text-\[hsl\(var\(--destructive-foreground\)\)\]{color:hsl(var(--destructive-foreground))}.text-\[hsl\(var\(--foreground\)\)\]{color:hsl(var(--foreground))}.text-\[hsl\(var\(--muted-foreground\)\)\]{color:hsl(var(--muted-foreground))}.text-\[hsl\(var\(--primary\)\)\]{color:hsl(var(--primary))}.text-\[hsl\(var\(--primary-foreground\)\)\]{color:hsl(var(--primary-foreground))}.text-\[hsl\(var\(--secondary-foreground\)\)\]{color:hsl(var(--secondary-foreground))}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-500{color:var(--color-gray-500)}.text-green-500{color:var(--color-green-500)}.text-green-700{color:var(--color-green-700)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-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-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-\[hsl\(var\(--foreground\)\)\]{--tw-ring-color:hsl(var(--foreground))}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:text-\[hsl\(var\(--foreground\)\)\]:is(:where(.group):hover *){color:hsl(var(--foreground))}.group-hover\:opacity-60:is(:where(.group):hover *){opacity:.6}.group-hover\/json\:opacity-100:is(:where(.group\/json):hover *){opacity:1}.group-hover\/tip\:visible:is(:where(.group\/tip):hover *){visibility:visible}}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.hover\:border-\[hsl\(var\(--foreground\)\)\/30\]:hover{border-color:hsl(var(--foreground))/30}.hover\:bg-\[hsl\(var\(--accent\)\)\]:hover,.hover\:bg-\[hsl\(var\(--accent\)\)\]\/40:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[hsl\(var\(--accent\)\)\]\/40:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 40%,transparent)}}.hover\:bg-\[hsl\(var\(--accent\)\)\]\/50:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[hsl\(var\(--accent\)\)\]\/50:hover{background-color:color-mix(in oklab,hsl(var(--accent)) 50%,transparent)}}.hover\:bg-\[hsl\(var\(--destructive\)\)\]:hover{background-color:hsl(var(--destructive))}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-\[hsl\(var\(--accent-foreground\)\)\]:hover{color:hsl(var(--accent-foreground))}.hover\:text-\[hsl\(var\(--destructive-foreground\)\)\]:hover{color:hsl(var(--destructive-foreground))}.hover\:text-\[hsl\(var\(--foreground\)\)\]:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-\[hsl\(var\(--ring\)\)\]:focus{--tw-ring-color:hsl(var(--ring))}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:64rem){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media(min-width:80rem){.xl\:w-\[380px\]{width:380px}.xl\:w-\[480px\]{width:480px}}@media(prefers-color-scheme:dark){.dark\:border-amber-900{border-color:var(--color-amber-900)}.dark\:border-emerald-900{border-color:var(--color-emerald-900)}.dark\:border-red-800{border-color:var(--color-red-800)}.dark\:border-red-900{border-color:var(--color-red-900)}.dark\:bg-amber-400{background-color:var(--color-amber-400)}.dark\:bg-amber-900{background-color:var(--color-amber-900)}.dark\:bg-amber-900\/30{background-color:#7b33064d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/30{background-color:color-mix(in oklab,var(--color-amber-900) 30%,transparent)}}.dark\:bg-amber-900\/40{background-color:#7b330666}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/40{background-color:color-mix(in oklab,var(--color-amber-900) 40%,transparent)}}.dark\:bg-amber-900\/50{background-color:#7b330680}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/50{background-color:color-mix(in oklab,var(--color-amber-900) 50%,transparent)}}.dark\:bg-amber-950\/20{background-color:#46190133}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/20{background-color:color-mix(in oklab,var(--color-amber-950) 20%,transparent)}}.dark\:bg-amber-950\/30{background-color:#4619014d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/30{background-color:color-mix(in oklab,var(--color-amber-950) 30%,transparent)}}.dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900) 30%,transparent)}}.dark\:bg-emerald-400{background-color:var(--color-emerald-400)}.dark\:bg-emerald-900\/40{background-color:#004e3b66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-900\/40{background-color:color-mix(in oklab,var(--color-emerald-900) 40%,transparent)}}.dark\:bg-emerald-900\/50{background-color:#004e3b80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-900\/50{background-color:color-mix(in oklab,var(--color-emerald-900) 50%,transparent)}}.dark\:bg-emerald-950\/5{background-color:#002c220d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-950\/5{background-color:color-mix(in oklab,var(--color-emerald-950) 5%,transparent)}}.dark\:bg-emerald-950\/20{background-color:#002c2233}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-950\/20{background-color:color-mix(in oklab,var(--color-emerald-950) 20%,transparent)}}.dark\:bg-emerald-950\/30{background-color:#002c224d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-950\/30{background-color:color-mix(in oklab,var(--color-emerald-950) 30%,transparent)}}.dark\:bg-green-900{background-color:var(--color-green-900)}.dark\:bg-purple-900{background-color:var(--color-purple-900)}.dark\:bg-purple-900\/30{background-color:#59168b4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-900\/30{background-color:color-mix(in oklab,var(--color-purple-900) 30%,transparent)}}.dark\:bg-red-400{background-color:var(--color-red-400)}.dark\:bg-red-700{background-color:var(--color-red-700)}.dark\:bg-red-900\/40{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/40{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.dark\:bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.dark\:bg-red-950{background-color:var(--color-red-950)}.dark\:bg-red-950\/5{background-color:#4608090d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-950\/5{background-color:color-mix(in oklab,var(--color-red-950) 5%,transparent)}}.dark\:bg-red-950\/20{background-color:#46080933}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-950\/20{background-color:color-mix(in oklab,var(--color-red-950) 20%,transparent)}}.dark\:bg-red-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-950\/30{background-color:color-mix(in oklab,var(--color-red-950) 30%,transparent)}}.dark\:bg-violet-900\/40{background-color:#4d179a66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-violet-900\/40{background-color:color-mix(in oklab,var(--color-violet-900) 40%,transparent)}}.dark\:text-amber-200{color:var(--color-amber-200)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-blue-300{color:var(--color-blue-300)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-emerald-200{color:var(--color-emerald-200)}.dark\:text-emerald-300{color:var(--color-emerald-300)}.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-green-300{color:var(--color-green-300)}.dark\:text-purple-300{color:var(--color-purple-300)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-red-200{color:var(--color-red-200)}.dark\:text-red-300{color:var(--color-red-300)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-violet-300{color:var(--color-violet-300)}@media(hover:hover){.dark\:hover\:bg-red-800:hover{background-color:var(--color-red-800)}.dark\:hover\:bg-red-950:hover{background-color:var(--color-red-950)}}}.\[\&\:\:-moz-range-thumb\]\:h-3\.5::-moz-range-thumb{height:calc(var(--spacing) * 3.5)}.\[\&\:\:-moz-range-thumb\]\:w-3\.5::-moz-range-thumb{width:calc(var(--spacing) * 3.5)}.\[\&\:\:-moz-range-thumb\]\:rounded-full::-moz-range-thumb{border-radius:3.40282e38px}.\[\&\:\:-moz-range-thumb\]\:border-0::-moz-range-thumb{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-moz-range-thumb\]\:bg-\[hsl\(var\(--primary\)\)\]::-moz-range-thumb{background-color:hsl(var(--primary))}.\[\&\:\:-webkit-slider-thumb\]\:h-3\.5::-webkit-slider-thumb{height:calc(var(--spacing) * 3.5)}.\[\&\:\:-webkit-slider-thumb\]\:w-3\.5::-webkit-slider-thumb{width:calc(var(--spacing) * 3.5)}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-\[hsl\(var\(--primary\)\)\]::-webkit-slider-thumb{background-color:hsl(var(--primary))}.\[\&\:\:-webkit-slider-thumb\]\:shadow-sm::-webkit-slider-thumb{--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)}}:root{--background:0 0% 100%;--foreground:240 10% 3.9%;--card:0 0% 100%;--card-foreground:240 10% 3.9%;--popover:0 0% 100%;--popover-foreground:240 10% 3.9%;--primary:240 5.9% 10%;--primary-foreground:0 0% 98%;--secondary:240 4.8% 95.9%;--secondary-foreground:240 5.9% 10%;--muted:240 4.8% 95.9%;--muted-foreground:240 3.8% 46.1%;--accent:240 4.8% 95.9%;--accent-foreground:240 5.9% 10%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:240 5.9% 90%;--input:240 5.9% 90%;--ring:240 5.9% 10%;--radius:.5rem;--studio-green:142 71% 45%;--studio-blue:217 91% 60%;--studio-amber:38 92% 50%;--studio-red:0 84% 60%}.dark{--background:240 10% 3.9%;--foreground:0 0% 98%;--card:240 10% 3.9%;--card-foreground:0 0% 98%;--popover:240 10% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:240 5.9% 10%;--secondary:240 3.7% 15.9%;--secondary-foreground:0 0% 98%;--muted:240 3.7% 15.9%;--muted-foreground:240 5% 64.9%;--accent:240 3.7% 15.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:240 3.7% 15.9%;--input:240 3.7% 15.9%;--ring:240 4.9% 83.9%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:system-ui,-apple-system,sans-serif}@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-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
|
package/dist/client/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Axl Studio</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-C_uwupnn.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DVcH6P9w.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -45,26 +45,32 @@ interface BroadcastTarget {
|
|
|
45
45
|
* Manages WebSocket connections and channel subscriptions.
|
|
46
46
|
* Supports channel multiplexing: clients subscribe/unsubscribe to channels
|
|
47
47
|
* and receive events only for channels they're subscribed to.
|
|
48
|
+
*
|
|
49
|
+
* Execution channels (`execution:*`) are replay-buffered: events are stored
|
|
50
|
+
* so that late subscribers receive the full event history. Buffers are cleaned
|
|
51
|
+
* up shortly after the stream completes.
|
|
48
52
|
*/
|
|
49
53
|
declare class ConnectionManager {
|
|
50
54
|
/** channel -> set of WS connections */
|
|
51
55
|
private channels;
|
|
52
56
|
/** ws -> set of subscribed channels (for cleanup) */
|
|
53
57
|
private connections;
|
|
58
|
+
/** channel -> replay buffer for execution streams */
|
|
59
|
+
private buffers;
|
|
54
60
|
private maxConnections;
|
|
55
61
|
/** Register a new WS connection. */
|
|
56
62
|
add(ws: BroadcastTarget): void;
|
|
57
63
|
/** Remove a WS connection and all its subscriptions. */
|
|
58
64
|
remove(ws: BroadcastTarget): void;
|
|
59
|
-
/** Subscribe a connection to a channel.
|
|
65
|
+
/** Subscribe a connection to a channel. Replays buffered events for execution channels. */
|
|
60
66
|
subscribe(ws: BroadcastTarget, channel: string): void;
|
|
61
67
|
/** Unsubscribe a connection from a channel. */
|
|
62
68
|
unsubscribe(ws: BroadcastTarget, channel: string): void;
|
|
63
|
-
/** Broadcast data to all subscribers of a channel. */
|
|
69
|
+
/** Broadcast data to all subscribers of a channel. Buffers events for execution channels. */
|
|
64
70
|
broadcast(channel: string, data: unknown): void;
|
|
65
71
|
/** Broadcast to channel and all wildcard subscribers (e.g., trace:* matches trace:abc). */
|
|
66
72
|
broadcastWithWildcard(channel: string, data: unknown): void;
|
|
67
|
-
/** Close all connections
|
|
73
|
+
/** Close all connections, clear all state and buffers. Used during shutdown. */
|
|
68
74
|
closeAll(): void;
|
|
69
75
|
/** Get the number of active connections. */
|
|
70
76
|
get connectionCount(): number;
|
|
@@ -45,26 +45,32 @@ interface BroadcastTarget {
|
|
|
45
45
|
* Manages WebSocket connections and channel subscriptions.
|
|
46
46
|
* Supports channel multiplexing: clients subscribe/unsubscribe to channels
|
|
47
47
|
* and receive events only for channels they're subscribed to.
|
|
48
|
+
*
|
|
49
|
+
* Execution channels (`execution:*`) are replay-buffered: events are stored
|
|
50
|
+
* so that late subscribers receive the full event history. Buffers are cleaned
|
|
51
|
+
* up shortly after the stream completes.
|
|
48
52
|
*/
|
|
49
53
|
declare class ConnectionManager {
|
|
50
54
|
/** channel -> set of WS connections */
|
|
51
55
|
private channels;
|
|
52
56
|
/** ws -> set of subscribed channels (for cleanup) */
|
|
53
57
|
private connections;
|
|
58
|
+
/** channel -> replay buffer for execution streams */
|
|
59
|
+
private buffers;
|
|
54
60
|
private maxConnections;
|
|
55
61
|
/** Register a new WS connection. */
|
|
56
62
|
add(ws: BroadcastTarget): void;
|
|
57
63
|
/** Remove a WS connection and all its subscriptions. */
|
|
58
64
|
remove(ws: BroadcastTarget): void;
|
|
59
|
-
/** Subscribe a connection to a channel.
|
|
65
|
+
/** Subscribe a connection to a channel. Replays buffered events for execution channels. */
|
|
60
66
|
subscribe(ws: BroadcastTarget, channel: string): void;
|
|
61
67
|
/** Unsubscribe a connection from a channel. */
|
|
62
68
|
unsubscribe(ws: BroadcastTarget, channel: string): void;
|
|
63
|
-
/** Broadcast data to all subscribers of a channel. */
|
|
69
|
+
/** Broadcast data to all subscribers of a channel. Buffers events for execution channels. */
|
|
64
70
|
broadcast(channel: string, data: unknown): void;
|
|
65
71
|
/** Broadcast to channel and all wildcard subscribers (e.g., trace:* matches trace:abc). */
|
|
66
72
|
broadcastWithWildcard(channel: string, data: unknown): void;
|
|
67
|
-
/** Close all connections
|
|
73
|
+
/** Close all connections, clear all state and buffers. Used during shutdown. */
|
|
68
74
|
closeAll(): void;
|
|
69
75
|
/** Get the number of active connections. */
|
|
70
76
|
get connectionCount(): number;
|
package/dist/middleware.cjs
CHANGED
|
@@ -74,11 +74,18 @@ async function errorHandler(c, next) {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
// src/server/ws/connection-manager.ts
|
|
77
|
+
function isBufferedChannel(channel) {
|
|
78
|
+
return channel.startsWith("execution:");
|
|
79
|
+
}
|
|
80
|
+
var BUFFER_TTL_MS = 3e4;
|
|
81
|
+
var MAX_BUFFER_EVENTS = 500;
|
|
77
82
|
var ConnectionManager = class {
|
|
78
83
|
/** channel -> set of WS connections */
|
|
79
84
|
channels = /* @__PURE__ */ new Map();
|
|
80
85
|
/** ws -> set of subscribed channels (for cleanup) */
|
|
81
86
|
connections = /* @__PURE__ */ new Map();
|
|
87
|
+
/** channel -> replay buffer for execution streams */
|
|
88
|
+
buffers = /* @__PURE__ */ new Map();
|
|
82
89
|
maxConnections = 100;
|
|
83
90
|
/** Register a new WS connection. */
|
|
84
91
|
add(ws) {
|
|
@@ -101,7 +108,7 @@ var ConnectionManager = class {
|
|
|
101
108
|
}
|
|
102
109
|
this.connections.delete(ws);
|
|
103
110
|
}
|
|
104
|
-
/** Subscribe a connection to a channel.
|
|
111
|
+
/** Subscribe a connection to a channel. Replays buffered events for execution channels. */
|
|
105
112
|
subscribe(ws, channel) {
|
|
106
113
|
if (!this.connections.has(ws)) return;
|
|
107
114
|
let subs = this.channels.get(channel);
|
|
@@ -111,6 +118,17 @@ var ConnectionManager = class {
|
|
|
111
118
|
}
|
|
112
119
|
subs.add(ws);
|
|
113
120
|
this.connections.get(ws).add(channel);
|
|
121
|
+
const buffer = this.buffers.get(channel);
|
|
122
|
+
if (buffer) {
|
|
123
|
+
for (const msg of buffer.events) {
|
|
124
|
+
try {
|
|
125
|
+
ws.send(msg);
|
|
126
|
+
} catch {
|
|
127
|
+
this.remove(ws);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
114
132
|
}
|
|
115
133
|
/** Unsubscribe a connection from a channel. */
|
|
116
134
|
unsubscribe(ws, channel) {
|
|
@@ -120,11 +138,30 @@ var ConnectionManager = class {
|
|
|
120
138
|
}
|
|
121
139
|
this.connections.get(ws)?.delete(channel);
|
|
122
140
|
}
|
|
123
|
-
/** Broadcast data to all subscribers of a channel. */
|
|
141
|
+
/** Broadcast data to all subscribers of a channel. Buffers events for execution channels. */
|
|
124
142
|
broadcast(channel, data) {
|
|
143
|
+
const msg = JSON.stringify({ type: "event", channel, data });
|
|
144
|
+
if (isBufferedChannel(channel)) {
|
|
145
|
+
let buffer = this.buffers.get(channel);
|
|
146
|
+
if (!buffer) {
|
|
147
|
+
buffer = { events: [], complete: false };
|
|
148
|
+
this.buffers.set(channel, buffer);
|
|
149
|
+
}
|
|
150
|
+
const event = data;
|
|
151
|
+
const isTerminal = event.type === "done" || event.type === "error";
|
|
152
|
+
if (buffer.events.length < MAX_BUFFER_EVENTS || isTerminal) {
|
|
153
|
+
buffer.events.push(msg);
|
|
154
|
+
}
|
|
155
|
+
if (isTerminal) {
|
|
156
|
+
buffer.complete = true;
|
|
157
|
+
if (buffer.timer) clearTimeout(buffer.timer);
|
|
158
|
+
buffer.timer = setTimeout(() => {
|
|
159
|
+
this.buffers.delete(channel);
|
|
160
|
+
}, BUFFER_TTL_MS);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
125
163
|
const subs = this.channels.get(channel);
|
|
126
164
|
if (!subs || subs.size === 0) return;
|
|
127
|
-
const msg = JSON.stringify({ type: "event", channel, data });
|
|
128
165
|
for (const ws of [...subs]) {
|
|
129
166
|
try {
|
|
130
167
|
ws.send(msg);
|
|
@@ -151,13 +188,17 @@ var ConnectionManager = class {
|
|
|
151
188
|
}
|
|
152
189
|
}
|
|
153
190
|
}
|
|
154
|
-
/** Close all connections
|
|
191
|
+
/** Close all connections, clear all state and buffers. Used during shutdown. */
|
|
155
192
|
closeAll() {
|
|
156
193
|
for (const ws of this.connections.keys()) {
|
|
157
194
|
ws.close?.();
|
|
158
195
|
}
|
|
196
|
+
for (const buffer of this.buffers.values()) {
|
|
197
|
+
if (buffer.timer) clearTimeout(buffer.timer);
|
|
198
|
+
}
|
|
159
199
|
this.connections.clear();
|
|
160
200
|
this.channels.clear();
|
|
201
|
+
this.buffers.clear();
|
|
161
202
|
}
|
|
162
203
|
/** Get the number of active connections. */
|
|
163
204
|
get connectionCount() {
|
|
@@ -362,15 +403,8 @@ function createWorkflowRoutes(connMgr) {
|
|
|
362
403
|
const stream = runtime.stream(name, body.input ?? {}, { metadata: body.metadata });
|
|
363
404
|
const executionId = `stream-${Date.now()}`;
|
|
364
405
|
(async () => {
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
connMgr.broadcastWithWildcard(`execution:${executionId}`, event);
|
|
368
|
-
}
|
|
369
|
-
} catch (err) {
|
|
370
|
-
connMgr.broadcastWithWildcard(`execution:${executionId}`, {
|
|
371
|
-
type: "error",
|
|
372
|
-
message: err instanceof Error ? err.message : "Stream error"
|
|
373
|
-
});
|
|
406
|
+
for await (const event of stream) {
|
|
407
|
+
connMgr.broadcastWithWildcard(`execution:${executionId}`, event);
|
|
374
408
|
}
|
|
375
409
|
})();
|
|
376
410
|
return c.json({ ok: true, data: { executionId, streaming: true } });
|
|
@@ -451,15 +485,8 @@ function createSessionRoutes(connMgr) {
|
|
|
451
485
|
const stream = await session.stream(body.workflow, body.message);
|
|
452
486
|
const executionId = `session-${id}-${Date.now()}`;
|
|
453
487
|
(async () => {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
connMgr.broadcastWithWildcard(`execution:${executionId}`, event);
|
|
457
|
-
}
|
|
458
|
-
} catch (err) {
|
|
459
|
-
connMgr.broadcastWithWildcard(`execution:${executionId}`, {
|
|
460
|
-
type: "error",
|
|
461
|
-
message: err instanceof Error ? err.message : "Stream error"
|
|
462
|
-
});
|
|
488
|
+
for await (const event of stream) {
|
|
489
|
+
connMgr.broadcastWithWildcard(`execution:${executionId}`, event);
|
|
463
490
|
}
|
|
464
491
|
})();
|
|
465
492
|
return c.json({ ok: true, data: { executionId, streaming: true } });
|
|
@@ -741,8 +768,80 @@ function createEvalRoutes(evalLoader) {
|
|
|
741
768
|
404
|
|
742
769
|
);
|
|
743
770
|
}
|
|
771
|
+
let runs = 1;
|
|
772
|
+
try {
|
|
773
|
+
const body = await c.req.json().catch(() => ({}));
|
|
774
|
+
if (typeof body.runs === "number" && Number.isFinite(body.runs) && body.runs > 1) {
|
|
775
|
+
runs = Math.min(Math.floor(body.runs), 25);
|
|
776
|
+
}
|
|
777
|
+
} catch {
|
|
778
|
+
}
|
|
779
|
+
try {
|
|
780
|
+
if (runs > 1) {
|
|
781
|
+
const { randomUUID } = await import("crypto");
|
|
782
|
+
const { aggregateRuns } = await import("@axlsdk/eval");
|
|
783
|
+
const runGroupId = randomUUID();
|
|
784
|
+
const results = [];
|
|
785
|
+
for (let r = 0; r < runs; r++) {
|
|
786
|
+
const result2 = await runtime.runRegisteredEval(name, {
|
|
787
|
+
metadata: { runGroupId, runIndex: r }
|
|
788
|
+
});
|
|
789
|
+
results.push(result2);
|
|
790
|
+
}
|
|
791
|
+
const typedResults = results;
|
|
792
|
+
const aggregate = aggregateRuns(typedResults);
|
|
793
|
+
const first = typedResults[0];
|
|
794
|
+
const result = { ...first, _multiRun: { aggregate, allRuns: typedResults } };
|
|
795
|
+
return c.json({ ok: true, data: result });
|
|
796
|
+
} else {
|
|
797
|
+
const result = await runtime.runRegisteredEval(name);
|
|
798
|
+
return c.json({ ok: true, data: result });
|
|
799
|
+
}
|
|
800
|
+
} catch (err) {
|
|
801
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
802
|
+
return c.json({ ok: false, error: { code: "EVAL_ERROR", message } }, 400);
|
|
803
|
+
}
|
|
804
|
+
});
|
|
805
|
+
app7.post("/evals/:name/rescore", async (c) => {
|
|
806
|
+
if (evalLoader) await evalLoader();
|
|
807
|
+
const runtime = c.get("runtime");
|
|
808
|
+
const name = c.req.param("name");
|
|
809
|
+
const body = await c.req.json();
|
|
810
|
+
if (!body.resultId || typeof body.resultId !== "string") {
|
|
811
|
+
return c.json(
|
|
812
|
+
{ ok: false, error: { code: "BAD_REQUEST", message: "resultId is required" } },
|
|
813
|
+
400
|
|
814
|
+
);
|
|
815
|
+
}
|
|
816
|
+
const entry = runtime.getRegisteredEval(name);
|
|
817
|
+
if (!entry) {
|
|
818
|
+
return c.json(
|
|
819
|
+
{ ok: false, error: { code: "NOT_FOUND", message: `Eval "${name}" not found` } },
|
|
820
|
+
404
|
|
821
|
+
);
|
|
822
|
+
}
|
|
823
|
+
const history = await runtime.getEvalHistory();
|
|
824
|
+
const historyEntry = history.find((h) => h.id === body.resultId);
|
|
825
|
+
if (!historyEntry) {
|
|
826
|
+
return c.json(
|
|
827
|
+
{ ok: false, error: { code: "NOT_FOUND", message: `Result "${body.resultId}" not found` } },
|
|
828
|
+
404
|
|
829
|
+
);
|
|
830
|
+
}
|
|
744
831
|
try {
|
|
745
|
-
const
|
|
832
|
+
const { rescore } = await import("@axlsdk/eval");
|
|
833
|
+
const config = entry.config;
|
|
834
|
+
const result = await rescore(
|
|
835
|
+
historyEntry.data,
|
|
836
|
+
config.scorers,
|
|
837
|
+
runtime
|
|
838
|
+
);
|
|
839
|
+
await runtime.saveEvalResult({
|
|
840
|
+
id: result.id,
|
|
841
|
+
eval: name,
|
|
842
|
+
timestamp: Date.now(),
|
|
843
|
+
data: result
|
|
844
|
+
});
|
|
746
845
|
return c.json({ ok: true, data: result });
|
|
747
846
|
} catch (err) {
|
|
748
847
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -753,7 +852,7 @@ function createEvalRoutes(evalLoader) {
|
|
|
753
852
|
const runtime = c.get("runtime");
|
|
754
853
|
const body = await c.req.json();
|
|
755
854
|
try {
|
|
756
|
-
const result = await runtime.evalCompare(body.baseline, body.candidate);
|
|
855
|
+
const result = await runtime.evalCompare(body.baseline, body.candidate, body.options);
|
|
757
856
|
return c.json({ ok: true, data: result });
|
|
758
857
|
} catch (err) {
|
|
759
858
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -770,26 +869,57 @@ function createPlaygroundRoutes(connMgr) {
|
|
|
770
869
|
app7.post("/playground/chat", async (c) => {
|
|
771
870
|
const runtime = c.get("runtime");
|
|
772
871
|
const body = await c.req.json();
|
|
773
|
-
|
|
774
|
-
if (!workflowName) {
|
|
872
|
+
if (!body.message || typeof body.message !== "string" || !body.message.trim()) {
|
|
775
873
|
return c.json(
|
|
776
|
-
{
|
|
874
|
+
{
|
|
875
|
+
ok: false,
|
|
876
|
+
error: {
|
|
877
|
+
code: "INVALID_INPUT",
|
|
878
|
+
message: "message is required and must be a non-empty string"
|
|
879
|
+
}
|
|
880
|
+
},
|
|
881
|
+
400
|
|
882
|
+
);
|
|
883
|
+
}
|
|
884
|
+
const agents = runtime.getAgents();
|
|
885
|
+
const agent = body.agent ? agents.find((a) => a._name === body.agent) : agents[0];
|
|
886
|
+
if (!agent) {
|
|
887
|
+
return c.json(
|
|
888
|
+
{
|
|
889
|
+
ok: false,
|
|
890
|
+
error: { code: "NO_AGENT", message: `Agent "${body.agent ?? ""}" not found` }
|
|
891
|
+
},
|
|
777
892
|
400
|
|
778
893
|
);
|
|
779
894
|
}
|
|
780
895
|
const sessionId = body.sessionId ?? `playground-${Date.now()}`;
|
|
781
|
-
const session = runtime.session(sessionId);
|
|
782
|
-
const stream = await session.stream(workflowName, body.message);
|
|
783
896
|
const executionId = `playground-${sessionId}-${Date.now()}`;
|
|
897
|
+
const store = runtime.getStateStore();
|
|
898
|
+
const history = await store.getSession(sessionId);
|
|
899
|
+
history.push({ role: "user", content: body.message });
|
|
900
|
+
const ctx = runtime.createContext({
|
|
901
|
+
sessionHistory: history,
|
|
902
|
+
onToken: (token) => {
|
|
903
|
+
connMgr.broadcastWithWildcard(`execution:${executionId}`, {
|
|
904
|
+
type: "token",
|
|
905
|
+
data: token
|
|
906
|
+
});
|
|
907
|
+
}
|
|
908
|
+
});
|
|
784
909
|
(async () => {
|
|
785
910
|
try {
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
}
|
|
911
|
+
const result = await ctx.ask(agent, body.message);
|
|
912
|
+
const resultText = typeof result === "string" ? result : JSON.stringify(result);
|
|
913
|
+
history.push({ role: "assistant", content: resultText });
|
|
914
|
+
await store.saveSession(sessionId, history);
|
|
915
|
+
connMgr.broadcastWithWildcard(`execution:${executionId}`, {
|
|
916
|
+
type: "done",
|
|
917
|
+
data: resultText
|
|
918
|
+
});
|
|
789
919
|
} catch (err) {
|
|
790
920
|
connMgr.broadcastWithWildcard(`execution:${executionId}`, {
|
|
791
921
|
type: "error",
|
|
792
|
-
message: err instanceof Error ? err.message :
|
|
922
|
+
message: err instanceof Error ? err.message : String(err)
|
|
793
923
|
});
|
|
794
924
|
}
|
|
795
925
|
})();
|
|
@@ -901,19 +1031,24 @@ function createServer(options) {
|
|
|
901
1031
|
app7.use("/*", async (c, next) => {
|
|
902
1032
|
const reqPath = c.req.path;
|
|
903
1033
|
const resolved = basePath && reqPath.startsWith(basePath) ? reqPath.slice(basePath.length) || "/" : reqPath;
|
|
904
|
-
if (resolved === "/" || resolved === "/index.html") {
|
|
1034
|
+
if (resolved === "/" || resolved === "/index.html" || resolved === "/ws") {
|
|
905
1035
|
return next();
|
|
906
1036
|
}
|
|
907
1037
|
return staticHandler(c, next);
|
|
908
1038
|
});
|
|
909
1039
|
if (spaHtml) {
|
|
910
|
-
app7.get("*", (c) =>
|
|
1040
|
+
app7.get("*", async (c, next) => {
|
|
1041
|
+
const resolved = basePath && c.req.path.startsWith(basePath) ? c.req.path.slice(basePath.length) || "/" : c.req.path;
|
|
1042
|
+
if (resolved === "/ws") return next();
|
|
1043
|
+
return c.html(spaHtml);
|
|
1044
|
+
});
|
|
911
1045
|
}
|
|
912
1046
|
}
|
|
913
1047
|
return {
|
|
914
1048
|
app: app7,
|
|
915
1049
|
connMgr,
|
|
916
1050
|
costAggregator,
|
|
1051
|
+
/** Create WS handlers. Call before registering static/SPA routes are reached. */
|
|
917
1052
|
createWsHandlers: () => createWsHandlers(connMgr),
|
|
918
1053
|
traceListener
|
|
919
1054
|
};
|