@cardor/agent-harness-kit 1.9.0 → 1.10.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.
@@ -0,0 +1 @@
1
+ @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-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--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:"Inter", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono", "Fira Mono", ui-monospace, monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-950:oklch(25.8% .092 26.042);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-900:oklch(42.1% .095 57.708);--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-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-950:oklch(26.6% .065 152.934);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-950:oklch(29.3% .066 243.157);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--color-neutral-100:oklch(97% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-black:#000;--spacing:.25rem;--container-xs:20rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--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: 1.5 ;--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-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.inset-0{inset:0}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.mx-1{margin-inline:var(--spacing)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.table{display:table}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-5{height:calc(var(--spacing) * 5)}.h-20{height:calc(var(--spacing) * 20)}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[calc\(100vh-16rem\)\]{max-height:calc(100vh - 16rem)}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-8{width:calc(var(--spacing) * 8)}.w-16{width:calc(var(--spacing) * 16)}.w-48{width:calc(var(--spacing) * 48)}.w-72{width:calc(var(--spacing) * 72)}.w-full{width:100%}.w-px{width:1px}.max-w-\[120px\]{max-width:120px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[220px\]{max-width:220px}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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-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)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1{row-gap:var(--spacing)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[var\(--color-border\)\]>:not(:last-child)){border-color:var(--color-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)}.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-\[var\(--color-border\)\]{border-color:var(--color-border)}.border-transparent{border-color:#0000}.border-yellow-900\/50{border-color:#733e0a80}@supports (color:color-mix(in lab,red,red)){.border-yellow-900\/50{border-color:color-mix(in oklab,var(--color-yellow-900) 50%,transparent)}}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-bg-base\)\]{background-color:var(--color-bg-base)}.bg-\[var\(--color-bg-elevated\)\]{background-color:var(--color-bg-elevated)}.bg-\[var\(--color-bg-surface\)\]{background-color:var(--color-bg-surface)}.bg-\[var\(--color-border\)\]{background-color:var(--color-border)}.bg-\[var\(--color-text-primary\)\]{background-color:var(--color-text-primary)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-950{background-color:var(--color-amber-950)}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-green-100{background-color:var(--color-green-100)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-700{background-color:var(--color-green-700)}.bg-green-950{background-color:var(--color-green-950)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-red-100{background-color:var(--color-red-100)}.bg-sky-950{background-color:var(--color-sky-950)}.bg-violet-900{background-color:var(--color-violet-900)}.bg-violet-950{background-color:var(--color-violet-950)}.bg-yellow-500\/5{background-color:#edb2000d}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/5{background-color:color-mix(in oklab,var(--color-yellow-500) 5%,transparent)}}.p-1{padding:var(--spacing)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.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:var(--spacing)}.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)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-1{padding-right:var(--spacing)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.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-\[10px\]{font-size:10px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.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-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--color-accent\)\]{color:var(--color-accent)}.text-\[var\(--color-bg-base\)\]{color:var(--color-bg-base)}.text-\[var\(--color-text-faint\)\]{color:var(--color-text-faint)}.text-\[var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[var\(--color-text-primary\)\]{color:var(--color-text-primary)}.text-\[var\(--color-text-secondary\)\]{color:var(--color-text-secondary)}.text-amber-400{color:var(--color-amber-400)}.text-amber-700{color:var(--color-amber-700)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-700{color:var(--color-green-700)}.text-indigo-700{color:var(--color-indigo-700)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-700{color:var(--color-red-700)}.text-sky-300{color:var(--color-sky-300)}.text-violet-400{color:var(--color-violet-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600\/80{color:#cd8900cc}@supports (color:color-mix(in lab,red,red)){.text-yellow-600\/80{color:color-mix(in oklab,var(--color-yellow-600) 80%,transparent)}}.uppercase{text-transform:uppercase}.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))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:text-\[var\(--color-text-primary\)\]:is(:where(.group):hover *){color:var(--color-text-primary)}.hover\:border-\[var\(--color-border\)\]:hover{border-color:var(--color-border)}.hover\:bg-\[var\(--color-bg-elevated\)\]:hover{background-color:var(--color-bg-elevated)}.hover\:bg-\[var\(--color-bg-surface\)\]:hover{background-color:var(--color-bg-surface)}.hover\:text-\[var\(--color-accent\)\]:hover{color:var(--color-accent)}.hover\:text-\[var\(--color-text-primary\)\]:hover{color:var(--color-text-primary)}.hover\:text-\[var\(--color-text-secondary\)\]:hover{color:var(--color-text-secondary)}.hover\:text-green-400:hover{color:var(--color-green-400)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-yellow-400:hover{color:var(--color-yellow-400)}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-\[var\(--color-text-muted\)\]:focus{border-color:var(--color-text-muted)}@media not all and (min-width:48rem){.max-md\:inset-0{inset:0}.max-md\:m-0{margin:0}.max-md\:h-screen{height:100vh}.max-md\:max-h-full{max-height:100%}.max-md\:w-screen{width:100vw}.max-md\:max-w-full{max-width:100%}.max-md\:rounded-none{border-radius:0}}@media(min-width:48rem){.md\:max-w-2xl{max-width:var(--container-2xl)}}@media(min-width:64rem){.lg\:max-w-3xl{max-width:var(--container-3xl)}}@media(min-width:80rem){.xl\:max-w-4xl{max-width:var(--container-4xl)}}@media(min-width:96rem){.\32xl\:max-w-5xl{max-width:var(--container-5xl)}}.dark\:bg-amber-950:where(.dark,.dark *){background-color:var(--color-amber-950)}.dark\:bg-green-950:where(.dark,.dark *){background-color:var(--color-green-950)}.dark\:bg-indigo-950:where(.dark,.dark *){background-color:var(--color-indigo-950)}.dark\:bg-neutral-800:where(.dark,.dark *){background-color:var(--color-neutral-800)}.dark\:bg-neutral-900:where(.dark,.dark *){background-color:var(--color-neutral-900)}.dark\:bg-red-950:where(.dark,.dark *){background-color:var(--color-red-950)}.dark\:text-amber-400:where(.dark,.dark *){color:var(--color-amber-400)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-indigo-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-neutral-400:where(.dark,.dark *){color:var(--color-neutral-400)}.dark\:text-neutral-500:where(.dark,.dark *){color:var(--color-neutral-500)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}}:root{--color-bg-base:#fff;--color-bg-surface:#f4f4f5;--color-bg-elevated:#e4e4e7;--color-border:#d4d4d8;--color-text-primary:#09090b;--color-text-secondary:#3f3f46;--color-text-muted:#71717a;--color-text-faint:#a1a1aa;--color-accent:#16a34a}:root.dark{--color-bg-base:#000;--color-bg-surface:#0a0a0a;--color-bg-elevated:#1f1f1f;--color-border:#1f1f1f;--color-text-primary:#fafafa;--color-text-secondary:#d4d4d8;--color-text-muted:#71717a;--color-text-faint:#3f3f46;--color-accent:#4ade80}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background-color:var(--color-bg-base);color:var(--color-text-primary);font-family:var(--font-sans);margin:0}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--color-bg-surface)}::-webkit-scrollbar-thumb{background:var(--color-bg-elevated);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-border)}@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-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}
@@ -19,8 +19,8 @@
19
19
  href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500;600&display=swap"
20
20
  rel="stylesheet"
21
21
  />
22
- <script type="module" crossorigin src="/assets/index-CoqlHfTu.js"></script>
23
- <link rel="stylesheet" crossorigin href="/assets/index-6UCLKb-M.css">
22
+ <script type="module" crossorigin src="/assets/index-CyU-X1yO.js"></script>
23
+ <link rel="stylesheet" crossorigin href="/assets/index-CzEB2a6I.css">
24
24
  </head>
25
25
  <body>
26
26
  <div id="root"></div>
@@ -0,0 +1,23 @@
1
+ import {
2
+ HarnessDB,
3
+ getRowCounts,
4
+ importFullExport,
5
+ isEmptyDatabase,
6
+ openDB,
7
+ readStorageStateFile,
8
+ resolveGlobalStorageDir,
9
+ resolveSqlitePathForScope,
10
+ writeStorageStateFile
11
+ } from "./chunk-DNFFWQWR.js";
12
+ export {
13
+ HarnessDB,
14
+ getRowCounts,
15
+ importFullExport,
16
+ isEmptyDatabase,
17
+ openDB,
18
+ readStorageStateFile,
19
+ resolveGlobalStorageDir,
20
+ resolveSqlitePathForScope,
21
+ writeStorageStateFile
22
+ };
23
+ //# sourceMappingURL=db-QQ7BR5K7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.d.ts CHANGED
@@ -57,6 +57,14 @@ interface StorageConfig {
57
57
  enabled: boolean;
58
58
  path: string;
59
59
  };
60
+ /** Where the harness DB (and current.md fallback) physically lives.
61
+ * 'local' — project-relative, in .harness/ (default, backward compatible).
62
+ * 'global' — under ~/.harness/dbs/<projectId>/, outside the project tree. */
63
+ scope: 'local' | 'global';
64
+ /** Stable UUID identifying this project's storage. Generated once at init
65
+ * via randomUUID() and never regenerated. Used to namespace the global
66
+ * storage directory (~/.harness/dbs/<projectId>/). */
67
+ projectId: string;
60
68
  }
61
69
  interface HealthConfig {
62
70
  scriptPath: string;
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineHarness
3
- } from "./chunk-OEPZRC7J.js";
3
+ } from "./chunk-ADV7OPU2.js";
4
4
  export {
5
5
  defineHarness
6
6
  };
@@ -8,11 +8,11 @@ var _require = createRequire(import.meta.url);
8
8
  var isBun = "bun" in process.versions;
9
9
  function openSQLite(path) {
10
10
  if (isBun) {
11
- const { Database } = _require("bun:sqlite");
12
- return new Database(path);
11
+ const { Database: Database2 } = _require("bun:sqlite");
12
+ return new Database2(path);
13
13
  }
14
- const { DatabaseSync } = _require("node:sqlite");
15
- return new DatabaseSync(path);
14
+ const Database = _require("better-sqlite3");
15
+ return new Database(path);
16
16
  }
17
17
  function lastInsertId(db) {
18
18
  const row = db.prepare("SELECT last_insert_rowid() AS id").get();
@@ -159,4 +159,4 @@ var SQLiteDriver = class {
159
159
  export {
160
160
  SQLiteDriver
161
161
  };
162
- //# sourceMappingURL=sqlite-KWYK4IJW.js.map
162
+ //# sourceMappingURL=sqlite-TR4D324R.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/drivers/sqlite.ts","../src/core/sqlite-adapter.ts"],"sourcesContent":["import { existsSync, mkdirSync, rmSync, statSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\nimport { lastInsertId, openSQLite, type SQLiteDB } from '../sqlite-adapter'\n\nimport type { DBDriver } from './types'\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS tasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n slug TEXT NOT NULL UNIQUE,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'pending'\n CHECK(status IN ('pending','in_progress','done','blocked')),\n assigned_to TEXT,\n created_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT,\n archived_at TEXT,\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS task_acceptance (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n criterion TEXT NOT NULL,\n met INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS actions (\n id TEXT PRIMARY KEY,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n agent TEXT NOT NULL\n CHECK(agent IN ('lead','explorer','builder','reviewer') OR agent LIKE 'custom:%'),\n status TEXT NOT NULL DEFAULT 'in_progress'\n CHECK(status IN ('in_progress','completed','blocked')),\n created_at TEXT NOT NULL,\n completed_at TEXT,\n summary TEXT\n);\n\nCREATE TABLE IF NOT EXISTS action_sections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,\n section_type TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS action_files (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n operation TEXT NOT NULL\n CHECK(operation IN ('read','created','modified','deleted')),\n notes TEXT\n);\n\nCREATE TABLE IF NOT EXISTS action_tools (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,\n tool_name TEXT NOT NULL,\n args_json TEXT,\n result_summary TEXT,\n called_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\nCREATE INDEX IF NOT EXISTS idx_actions_task_id ON actions(task_id);\nCREATE INDEX IF NOT EXISTS idx_actions_agent ON actions(agent);\nCREATE INDEX IF NOT EXISTS idx_actions_status ON actions(status);\nCREATE INDEX IF NOT EXISTS idx_action_files_path ON action_files(file_path);\nCREATE INDEX IF NOT EXISTS idx_action_tools_name ON action_tools(tool_name);\n`\n\nexport class SQLiteDriver implements DBDriver {\n private db: SQLiteDB\n private dbPath: string\n\n constructor(dbPath: string) {\n this.dbPath = dbPath\n mkdirSync(dirname(dbPath), { recursive: true })\n // Remove stale WAL/SHM files left by a crashed session — they cause SQLITE_IOERR.\n // A 0-byte WAL alongside a non-empty SHM means the last checkpoint never completed.\n if (existsSync(dbPath)) {\n const shm = `${dbPath}-shm`\n const wal = `${dbPath}-wal`\n if (existsSync(shm) && existsSync(wal) && statSync(wal).size === 0) {\n rmSync(shm, { force: true })\n rmSync(wal, { force: true })\n }\n }\n this.db = openSQLite(dbPath)\n this.db.exec('PRAGMA journal_mode = WAL')\n this.db.exec('PRAGMA foreign_keys = ON')\n }\n\n async ensureSchema(): Promise<void> {\n this.db.exec(SCHEMA)\n // Migration: add archived_at column (safe to run multiple times)\n try {\n this.db.exec('ALTER TABLE tasks ADD COLUMN archived_at TEXT')\n } catch {\n // Column already exists — ignore\n }\n // Migration: add updated_at column (safe to run multiple times)\n try {\n this.db.exec(`ALTER TABLE tasks ADD COLUMN updated_at TEXT`)\n this.db.exec(`UPDATE tasks SET updated_at = COALESCE(completed_at, started_at, created_at) WHERE updated_at IS NULL OR updated_at = ''`)\n } catch {\n // Column already exists — ignore\n }\n }\n\n async query<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.db.prepare(sql).all(...params) as unknown as T[]\n }\n\n async queryOne<T>(sql: string, params: unknown[] = []): Promise<T | null> {\n return (this.db.prepare(sql).get(...params) as unknown as T) ?? null\n }\n\n async insert(sql: string, params: unknown[] = []): Promise<number> {\n this.db.prepare(sql).run(...params)\n return lastInsertId(this.db)\n }\n\n async exec(sql: string, params: unknown[] = []): Promise<number> {\n const result = this.db.prepare(sql).run(...params)\n return (result as { changes?: number }).changes ?? 0\n }\n\n async execRaw(sql: string): Promise<void> {\n this.db.exec(sql)\n }\n\n async reconnect(): Promise<void> {\n this.db.close()\n this.db = openSQLite(this.dbPath)\n this.db.exec('PRAGMA journal_mode = WAL')\n this.db.exec('PRAGMA foreign_keys = ON')\n }\n\n async transaction<T>(fn: (tx: DBDriver) => Promise<T>): Promise<T> {\n this.db.exec('BEGIN IMMEDIATE')\n try {\n const result = await fn(this)\n this.db.exec('COMMIT')\n return result\n } catch (err) {\n this.db.exec('ROLLBACK')\n throw err\n }\n }\n\n async close(): Promise<void> {\n this.db.close()\n }\n}\n","import { createRequire } from 'node:module'\n\nconst _require = createRequire(import.meta.url)\nconst isBun = 'bun' in process.versions\n\n// ─── Shared interface ─────────────────────────────────────────────────────────\n// Both node:sqlite (DatabaseSync) and bun:sqlite (Database) expose this surface.\n\nexport type SQLRow = Record<string, unknown>\n\nexport interface SQLStatement {\n run(...args: unknown[]): unknown\n get(...args: unknown[]): SQLRow | undefined\n all(...args: unknown[]): SQLRow[]\n}\n\nexport interface SQLiteDB {\n exec(sql: string): void\n prepare(sql: string): SQLStatement\n close(): void\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────────────\n\nexport function openSQLite(path: string): SQLiteDB {\n if (isBun) {\n const { Database } = _require('bun:sqlite') as {\n Database: new (path: string) => unknown\n }\n return new Database(path) as unknown as SQLiteDB\n }\n\n const { DatabaseSync } = _require('node:sqlite') as {\n DatabaseSync: new (path: string) => unknown\n }\n return new DatabaseSync(path) as unknown as SQLiteDB\n}\n\n// ─── last_insert_rowid() helper ───────────────────────────────────────────────\n// Both bun:sqlite and node:sqlite have different return types for stmt.run().\n// Reading last_insert_rowid() directly avoids the inconsistency.\n\nexport function lastInsertId(db: SQLiteDB): number {\n const row = db.prepare('SELECT last_insert_rowid() AS id').get() as { id: number }\n return row.id\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/core/drivers/sqlite.ts","../src/core/sqlite-adapter.ts"],"sourcesContent":["import { existsSync, mkdirSync, rmSync, statSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\nimport { lastInsertId, openSQLite, type SQLiteDB } from '../sqlite-adapter'\n\nimport type { DBDriver } from './types'\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS tasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n slug TEXT NOT NULL UNIQUE,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'pending'\n CHECK(status IN ('pending','in_progress','done','blocked')),\n assigned_to TEXT,\n created_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT,\n archived_at TEXT,\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS task_acceptance (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n criterion TEXT NOT NULL,\n met INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS actions (\n id TEXT PRIMARY KEY,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n agent TEXT NOT NULL\n CHECK(agent IN ('lead','explorer','builder','reviewer') OR agent LIKE 'custom:%'),\n status TEXT NOT NULL DEFAULT 'in_progress'\n CHECK(status IN ('in_progress','completed','blocked')),\n created_at TEXT NOT NULL,\n completed_at TEXT,\n summary TEXT\n);\n\nCREATE TABLE IF NOT EXISTS action_sections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,\n section_type TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS action_files (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n operation TEXT NOT NULL\n CHECK(operation IN ('read','created','modified','deleted')),\n notes TEXT\n);\n\nCREATE TABLE IF NOT EXISTS action_tools (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,\n tool_name TEXT NOT NULL,\n args_json TEXT,\n result_summary TEXT,\n called_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\nCREATE INDEX IF NOT EXISTS idx_actions_task_id ON actions(task_id);\nCREATE INDEX IF NOT EXISTS idx_actions_agent ON actions(agent);\nCREATE INDEX IF NOT EXISTS idx_actions_status ON actions(status);\nCREATE INDEX IF NOT EXISTS idx_action_files_path ON action_files(file_path);\nCREATE INDEX IF NOT EXISTS idx_action_tools_name ON action_tools(tool_name);\n`\n\nexport class SQLiteDriver implements DBDriver {\n private db: SQLiteDB\n private dbPath: string\n\n constructor(dbPath: string) {\n this.dbPath = dbPath\n mkdirSync(dirname(dbPath), { recursive: true })\n // Remove stale WAL/SHM files left by a crashed session — they cause SQLITE_IOERR.\n // A 0-byte WAL alongside a non-empty SHM means the last checkpoint never completed.\n if (existsSync(dbPath)) {\n const shm = `${dbPath}-shm`\n const wal = `${dbPath}-wal`\n if (existsSync(shm) && existsSync(wal) && statSync(wal).size === 0) {\n rmSync(shm, { force: true })\n rmSync(wal, { force: true })\n }\n }\n this.db = openSQLite(dbPath)\n this.db.exec('PRAGMA journal_mode = WAL')\n this.db.exec('PRAGMA foreign_keys = ON')\n }\n\n async ensureSchema(): Promise<void> {\n this.db.exec(SCHEMA)\n // Migration: add archived_at column (safe to run multiple times)\n try {\n this.db.exec('ALTER TABLE tasks ADD COLUMN archived_at TEXT')\n } catch {\n // Column already exists — ignore\n }\n // Migration: add updated_at column (safe to run multiple times)\n try {\n this.db.exec(`ALTER TABLE tasks ADD COLUMN updated_at TEXT`)\n this.db.exec(`UPDATE tasks SET updated_at = COALESCE(completed_at, started_at, created_at) WHERE updated_at IS NULL OR updated_at = ''`)\n } catch {\n // Column already exists — ignore\n }\n }\n\n async query<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.db.prepare(sql).all(...params) as unknown as T[]\n }\n\n async queryOne<T>(sql: string, params: unknown[] = []): Promise<T | null> {\n return (this.db.prepare(sql).get(...params) as unknown as T) ?? null\n }\n\n async insert(sql: string, params: unknown[] = []): Promise<number> {\n this.db.prepare(sql).run(...params)\n return lastInsertId(this.db)\n }\n\n async exec(sql: string, params: unknown[] = []): Promise<number> {\n const result = this.db.prepare(sql).run(...params)\n return (result as { changes?: number }).changes ?? 0\n }\n\n async execRaw(sql: string): Promise<void> {\n this.db.exec(sql)\n }\n\n async reconnect(): Promise<void> {\n this.db.close()\n this.db = openSQLite(this.dbPath)\n this.db.exec('PRAGMA journal_mode = WAL')\n this.db.exec('PRAGMA foreign_keys = ON')\n }\n\n async transaction<T>(fn: (tx: DBDriver) => Promise<T>): Promise<T> {\n this.db.exec('BEGIN IMMEDIATE')\n try {\n const result = await fn(this)\n this.db.exec('COMMIT')\n return result\n } catch (err) {\n this.db.exec('ROLLBACK')\n throw err\n }\n }\n\n async close(): Promise<void> {\n this.db.close()\n }\n}\n","import { createRequire } from 'node:module'\n\nconst _require = createRequire(import.meta.url)\nconst isBun = 'bun' in process.versions\n\n// ─── Shared interface ─────────────────────────────────────────────────────────\n// Both better-sqlite3 (Database) and bun:sqlite (Database) expose this surface.\n\nexport type SQLRow = Record<string, unknown>\n\nexport interface SQLStatement {\n run(...args: unknown[]): unknown\n get(...args: unknown[]): SQLRow | undefined\n all(...args: unknown[]): SQLRow[]\n}\n\nexport interface SQLiteDB {\n exec(sql: string): void\n prepare(sql: string): SQLStatement\n close(): void\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────────────\n\nexport function openSQLite(path: string): SQLiteDB {\n if (isBun) {\n const { Database } = _require('bun:sqlite') as {\n Database: new (path: string) => unknown\n }\n return new Database(path) as unknown as SQLiteDB\n }\n\n const Database = _require('better-sqlite3') as new (path: string) => unknown\n return new Database(path) as unknown as SQLiteDB\n}\n\n// ─── last_insert_rowid() helper ───────────────────────────────────────────────\n// Both bun:sqlite and better-sqlite3 have different return types for stmt.run().\n// Reading last_insert_rowid() directly avoids the inconsistency.\n\nexport function lastInsertId(db: SQLiteDB): number {\n const row = db.prepare('SELECT last_insert_rowid() AS id').get() as { id: number }\n return row.id\n}\n"],"mappings":"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","names":["Database"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cardor/agent-harness-kit",
3
- "version": "1.9.0",
3
+ "version": "1.10.1",
4
4
  "description": "CLI scaffolding for multi-agent harness systems",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -36,6 +36,7 @@
36
36
  "@clack/prompts": "^0.9.0",
37
37
  "@hono/node-server": "^1.13.0",
38
38
  "@modelcontextprotocol/sdk": "^1.10.2",
39
+ "better-sqlite3": "^12.11.1",
39
40
  "cli-table3": "^0.6.5",
40
41
  "commander": "^12.1.0",
41
42
  "drizzle-orm": "^0.45.2",
@@ -68,7 +69,7 @@
68
69
  "typescript-eslint": "^8.59.1"
69
70
  },
70
71
  "engines": {
71
- "node": ">=22.5.0"
72
+ "node": ">=14.0.0"
72
73
  },
73
74
  "scripts": {
74
75
  "typecheck": "tsc --noEmit",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/config.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { createJiti } from 'jiti'\n\nimport type { HarnessConfig } from '@/types'\n\nconst CONFIG_NAMES = [\n 'agent-harness-kit.config.ts',\n 'agent-harness-kit.config',\n 'agent-harness-kit.config.mjs',\n 'agent-harness-kit.config.cjs',\n]\n\nexport function findConfigFile(cwd: string): string | null {\n for (const name of CONFIG_NAMES) {\n const candidate = join(cwd, name)\n if (existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport async function loadConfig(cwd: string): Promise<HarnessConfig> {\n const configPath = findConfigFile(cwd)\n if (!configPath) {\n throw new Error('No agent-harness-kit.config found. Run: ahk init')\n }\n\n const jiti = createJiti(import.meta.url)\n const mod = await jiti.import(configPath) as { default?: HarnessConfig } | HarnessConfig\n const config = (mod as { default?: HarnessConfig }).default ?? (mod as HarnessConfig)\n\n if (!config || typeof config !== 'object') {\n throw new Error(`agent-harness-kit.config must export a default HarnessConfig object.`)\n }\n\n return applyDefaults(config as HarnessConfig)\n}\n\nexport function defineHarness(config: HarnessConfig): HarnessConfig {\n return config\n}\n\nfunction applyDefaults(config: HarnessConfig): HarnessConfig {\n const c = config as Partial<HarnessConfig>\n return {\n ...config,\n provider: c.provider ?? 'claude-code',\n project: {\n docsPath: './docs',\n agentsMd: './AGENTS.md',\n ...c.project,\n } as HarnessConfig['project'],\n agents: {\n lead: { instructionsPath: null },\n explorer: { instructionsPath: null },\n builder: { instructionsPath: null },\n reviewer: { instructionsPath: null },\n custom: [],\n ...c.agents,\n } as HarnessConfig['agents'],\n database: c.database ?? { type: 'sqlite' as const, path: '.harness/harness.db' },\n storage: {\n dir: '.harness',\n tasks: { adapter: 'local' as const },\n sections: {\n toolsUsed: true,\n filesModified: true,\n result: true,\n blockers: true,\n nextSteps: false,\n },\n markdownFallback: { enabled: true, path: '.harness/current.md' },\n ...c.storage,\n } as HarnessConfig['storage'],\n health: {\n scriptPath: './health.sh',\n required: true,\n ...c.health,\n },\n tools: {\n mcp: { enabled: true, port: 3742 },\n scripts: { enabled: true, outputDir: './.harness/scripts' },\n ...c.tools,\n } as HarnessConfig['tools'],\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAI3B,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,eAAe,KAA4B;AACzD,aAAW,QAAQ,cAAc;AAC/B,UAAM,YAAY,KAAK,KAAK,IAAI;AAChC,QAAI,WAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AACA,SAAO;AACT;AAEA,eAAsB,WAAW,KAAqC;AACpE,QAAM,aAAa,eAAe,GAAG;AACrC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,QAAM,OAAO,WAAW,YAAY,GAAG;AACvC,QAAM,MAAM,MAAM,KAAK,OAAO,UAAU;AACxC,QAAM,SAAU,IAAoC,WAAY;AAEhE,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,SAAO,cAAc,MAAuB;AAC9C;AAEO,SAAS,cAAc,QAAsC;AAClE,SAAO;AACT;AAEA,SAAS,cAAc,QAAsC;AAC3D,QAAM,IAAI;AACV,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,EAAE,YAAY;AAAA,IACxB,SAAS;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,GAAG,EAAE;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,MACN,MAAM,EAAE,kBAAkB,KAAK;AAAA,MAC/B,UAAU,EAAE,kBAAkB,KAAK;AAAA,MACnC,SAAS,EAAE,kBAAkB,KAAK;AAAA,MAClC,UAAU,EAAE,kBAAkB,KAAK;AAAA,MACnC,QAAQ,CAAC;AAAA,MACT,GAAG,EAAE;AAAA,IACP;AAAA,IACA,UAAU,EAAE,YAAY,EAAE,MAAM,UAAmB,MAAM,sBAAsB;AAAA,IAC/E,SAAS;AAAA,MACP,KAAK;AAAA,MACL,OAAO,EAAE,SAAS,QAAiB;AAAA,MACnC,UAAU;AAAA,QACR,WAAW;AAAA,QACX,eAAe;AAAA,QACf,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,MACb;AAAA,MACA,kBAAkB,EAAE,SAAS,MAAM,MAAM,sBAAsB;AAAA,MAC/D,GAAG,EAAE;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,GAAG,EAAE;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACL,KAAK,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,MACjC,SAAS,EAAE,SAAS,MAAM,WAAW,qBAAqB;AAAA,MAC1D,GAAG,EAAE;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
@@ -1 +0,0 @@
1
- @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-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--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:"Inter", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono", "Fira Mono", ui-monospace, monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-950:oklch(25.8% .092 26.042);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-900:oklch(42.1% .095 57.708);--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-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-950:oklch(26.6% .065 152.934);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-950:oklch(29.3% .066 243.157);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--color-neutral-100:oklch(97% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-black:#000;--spacing:.25rem;--container-xs:20rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--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: 1.5 ;--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-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.inset-0{inset:calc(var(--spacing) * 0)}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-5{height:calc(var(--spacing) * 5)}.h-20{height:calc(var(--spacing) * 20)}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[calc\(100vh-16rem\)\]{max-height:calc(100vh - 16rem)}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-8{width:calc(var(--spacing) * 8)}.w-16{width:calc(var(--spacing) * 16)}.w-48{width:calc(var(--spacing) * 48)}.w-72{width:calc(var(--spacing) * 72)}.w-full{width:100%}.w-px{width:1px}.max-w-\[120px\]{max-width:120px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[220px\]{max-width:220px}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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-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)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[var\(--color-border\)\]>:not(:last-child)){border-color:var(--color-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)}.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-\[var\(--color-border\)\]{border-color:var(--color-border)}.border-transparent{border-color:#0000}.border-yellow-900\/50{border-color:#733e0a80}@supports (color:color-mix(in lab,red,red)){.border-yellow-900\/50{border-color:color-mix(in oklab,var(--color-yellow-900) 50%,transparent)}}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-bg-base\)\]{background-color:var(--color-bg-base)}.bg-\[var\(--color-bg-elevated\)\]{background-color:var(--color-bg-elevated)}.bg-\[var\(--color-bg-surface\)\]{background-color:var(--color-bg-surface)}.bg-\[var\(--color-border\)\]{background-color:var(--color-border)}.bg-\[var\(--color-text-primary\)\]{background-color:var(--color-text-primary)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-950{background-color:var(--color-amber-950)}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-green-100{background-color:var(--color-green-100)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-700{background-color:var(--color-green-700)}.bg-green-950{background-color:var(--color-green-950)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-red-100{background-color:var(--color-red-100)}.bg-sky-950{background-color:var(--color-sky-950)}.bg-violet-900{background-color:var(--color-violet-900)}.bg-violet-950{background-color:var(--color-violet-950)}.bg-yellow-500\/5{background-color:#edb2000d}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/5{background-color:color-mix(in oklab,var(--color-yellow-500) 5%,transparent)}}.p-1{padding:calc(var(--spacing) * 1)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.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)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.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-\[10px\]{font-size:10px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.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-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--color-accent\)\]{color:var(--color-accent)}.text-\[var\(--color-bg-base\)\]{color:var(--color-bg-base)}.text-\[var\(--color-text-faint\)\]{color:var(--color-text-faint)}.text-\[var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[var\(--color-text-primary\)\]{color:var(--color-text-primary)}.text-\[var\(--color-text-secondary\)\]{color:var(--color-text-secondary)}.text-amber-400{color:var(--color-amber-400)}.text-amber-700{color:var(--color-amber-700)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-700{color:var(--color-green-700)}.text-indigo-700{color:var(--color-indigo-700)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-700{color:var(--color-red-700)}.text-sky-300{color:var(--color-sky-300)}.text-violet-400{color:var(--color-violet-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600\/80{color:#cd8900cc}@supports (color:color-mix(in lab,red,red)){.text-yellow-600\/80{color:color-mix(in oklab,var(--color-yellow-600) 80%,transparent)}}.uppercase{text-transform:uppercase}.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))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:text-\[var\(--color-text-primary\)\]:is(:where(.group):hover *){color:var(--color-text-primary)}.hover\:border-\[var\(--color-border\)\]:hover{border-color:var(--color-border)}.hover\:bg-\[var\(--color-bg-elevated\)\]:hover{background-color:var(--color-bg-elevated)}.hover\:bg-\[var\(--color-bg-surface\)\]:hover{background-color:var(--color-bg-surface)}.hover\:text-\[var\(--color-accent\)\]:hover{color:var(--color-accent)}.hover\:text-\[var\(--color-text-primary\)\]:hover{color:var(--color-text-primary)}.hover\:text-\[var\(--color-text-secondary\)\]:hover{color:var(--color-text-secondary)}.hover\:text-green-400:hover{color:var(--color-green-400)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-yellow-400:hover{color:var(--color-yellow-400)}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-\[var\(--color-text-muted\)\]:focus{border-color:var(--color-text-muted)}@media not all and (min-width:48rem){.max-md\:inset-0{inset:calc(var(--spacing) * 0)}.max-md\:m-0{margin:calc(var(--spacing) * 0)}.max-md\:h-screen{height:100vh}.max-md\:max-h-full{max-height:100%}.max-md\:w-screen{width:100vw}.max-md\:max-w-full{max-width:100%}.max-md\:rounded-none{border-radius:0}}@media(min-width:48rem){.md\:max-w-2xl{max-width:var(--container-2xl)}}@media(min-width:64rem){.lg\:max-w-3xl{max-width:var(--container-3xl)}}@media(min-width:80rem){.xl\:max-w-4xl{max-width:var(--container-4xl)}}@media(min-width:96rem){.\32xl\:max-w-5xl{max-width:var(--container-5xl)}}.dark\:bg-amber-950:where(.dark,.dark *){background-color:var(--color-amber-950)}.dark\:bg-green-950:where(.dark,.dark *){background-color:var(--color-green-950)}.dark\:bg-indigo-950:where(.dark,.dark *){background-color:var(--color-indigo-950)}.dark\:bg-neutral-800:where(.dark,.dark *){background-color:var(--color-neutral-800)}.dark\:bg-neutral-900:where(.dark,.dark *){background-color:var(--color-neutral-900)}.dark\:bg-red-950:where(.dark,.dark *){background-color:var(--color-red-950)}.dark\:text-amber-400:where(.dark,.dark *){color:var(--color-amber-400)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-indigo-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-neutral-400:where(.dark,.dark *){color:var(--color-neutral-400)}.dark\:text-neutral-500:where(.dark,.dark *){color:var(--color-neutral-500)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}}:root{--color-bg-base:#fff;--color-bg-surface:#f4f4f5;--color-bg-elevated:#e4e4e7;--color-border:#d4d4d8;--color-text-primary:#09090b;--color-text-secondary:#3f3f46;--color-text-muted:#71717a;--color-text-faint:#a1a1aa;--color-accent:#16a34a}:root.dark{--color-bg-base:#000;--color-bg-surface:#0a0a0a;--color-bg-elevated:#1f1f1f;--color-border:#1f1f1f;--color-text-primary:#fafafa;--color-text-secondary:#d4d4d8;--color-text-muted:#71717a;--color-text-faint:#3f3f46;--color-accent:#4ade80}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background-color:var(--color-bg-base);color:var(--color-text-primary);font-family:var(--font-sans);margin:0}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--color-bg-surface)}::-webkit-scrollbar-thumb{background:var(--color-bg-elevated);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-border)}@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-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}