@oonacode/win32-x64 0.3.156 → 0.3.157
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/oona.exe
CHANGED
package/oonacode-release.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oonacode",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.157",
|
|
4
4
|
"channel": "stable",
|
|
5
5
|
"platform": "win32",
|
|
6
6
|
"arch": "x64",
|
|
7
7
|
"mode": "bun",
|
|
8
8
|
"launcherRuntime": "bun 1.4.1",
|
|
9
|
-
"commit": "
|
|
10
|
-
"builtAt": "2026-09-
|
|
9
|
+
"commit": "91eda926",
|
|
10
|
+
"builtAt": "2026-09-26T23:42:02.6364368Z",
|
|
11
11
|
"engine": "engine-store",
|
|
12
12
|
"engineVersion": "0.3.280",
|
|
13
13
|
"siteOrigin": "https://oonacode.oonak.ai",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oonacode/win32-x64",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.157",
|
|
4
4
|
"description": "OonaCode native binaries for Windows x64: oona.exe (CLI + headless host service), the pinned oonaclaude.exe engine sidecar, local web UI assets. Installed automatically as an optional dependency of `oonacode`.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"homepage": "https://oonacode.oonak.ai",
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}::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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-mono:ui-monospace, "Cascadia Code", "Cascadia Mono", Consolas, "JetBrains Mono", Menlo, monospace;--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear 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:ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--default-mono-font-family:ui-monospace, "Cascadia Code", "Cascadia Mono", Consolas, "JetBrains Mono", Menlo, monospace}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){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}button,input,select,textarea{font:inherit;color:inherit}select option{background-color:var(--surface);color:var(--fg)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-1{inset:var(--spacing)}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.-top-0\.5{top:calc(var(--spacing) * -.5)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-2{top:calc(var(--spacing) * 2)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.-right-1{right:calc(var(--spacing) * -1)}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.right-full{right:100%}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-full{bottom:100%}.left-0{left:0}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-\[1\.15rem\]{left:1.15rem}.left-full{left:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.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{margin:0}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-px{margin-top:1px}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.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)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!hidden{display:none!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.h-1{height:var(--spacing)}.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-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-28{height:calc(var(--spacing) * 28)}.h-40{height:calc(var(--spacing) * 40)}.h-full{height:100%}.h-px{height:1px}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[19rem\]{max-height:19rem}.max-h-\[20rem\]{max-height:20rem}.max-h-\[22rem\]{max-height:22rem}.max-h-\[24rem\]{max-height:24rem}.max-h-\[26rem\]{max-height:26rem}.max-h-\[45vh\]{max-height:45vh}.max-h-\[65vh\]{max-height:65vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[95vh\]{max-height:95vh}.max-h-\[200px\]{max-height:200px}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-\[2\.25rem\]{min-height:2.25rem}.min-h-\[20rem\]{min-height:20rem}.min-h-\[22rem\]{min-height:22rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.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-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[19rem\]{width:19rem}.w-\[22rem\]{width:22rem}.w-\[24rem\]{width:24rem}.w-\[26rem\]{width:26rem}.w-\[30rem\]{width:30rem}.w-\[460px\]{width:460px}.w-auto{width:auto}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\[12rem\]{max-width:12rem}.max-w-\[14rem\]{max-width:14rem}.max-w-\[15rem\]{max-width:15rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[22rem\]{max-width:22rem}.max-w-\[85\%\]{max-width:85%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[90vw\]{max-width:90vw}.max-w-\[220px\]{max-width:220px}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-\[calc\(100vw-16px\)\]{max-width:calc(100vw - 16px)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-\[6rem\]{min-width:6rem}.min-w-\[7rem\]{min-width:7rem}.min-w-\[9rem\]{min-width:9rem}.min-w-\[15rem\]{min-width:15rem}.min-w-\[190px\]{min-width:190px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.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-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.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}.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-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.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-border>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.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)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-br-md{border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.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-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent,.border-accent\/20{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/20{border-color:color-mix(in oklab, var(--accent) 20%, transparent)}}.border-accent\/40{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/40{border-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.border-accent\/50{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/50{border-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.border-border{border-color:var(--border)}.border-danger-soft{border-color:var(--danger-soft)}.border-danger\/40{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/40{border-color:color-mix(in oklab, var(--danger) 40%, transparent)}}.border-danger\/50{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/50{border-color:color-mix(in oklab, var(--danger) 50%, transparent)}}.border-fg-faint{border-color:var(--fg-faint)}.border-ok\/40{border-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.border-ok\/40{border-color:color-mix(in oklab, var(--ok) 40%, transparent)}}.border-ok\/50{border-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.border-ok\/50{border-color:color-mix(in oklab, var(--ok) 50%, transparent)}}.border-project\/70{border-color:var(--project)}@supports (color:color-mix(in lab, red, red)){.border-project\/70{border-color:color-mix(in oklab, var(--project) 70%, transparent)}}.border-think\/20{border-color:var(--think)}@supports (color:color-mix(in lab, red, red)){.border-think\/20{border-color:color-mix(in oklab, var(--think) 20%, transparent)}}.border-think\/30{border-color:var(--think)}@supports (color:color-mix(in lab, red, red)){.border-think\/30{border-color:color-mix(in oklab, var(--think) 30%, transparent)}}.border-think\/40{border-color:var(--think)}@supports (color:color-mix(in lab, red, red)){.border-think\/40{border-color:color-mix(in oklab, var(--think) 40%, transparent)}}.border-transparent{border-color:#0000}.border-warn,.border-warn\/40{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/40{border-color:color-mix(in oklab, var(--warn) 40%, transparent)}}.border-warn\/50{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/50{border-color:color-mix(in oklab, var(--warn) 50%, transparent)}}.border-warn\/60{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/60{border-color:color-mix(in oklab, var(--warn) 60%, transparent)}}.bg-accent{background-color:var(--accent)}.bg-accent-soft,.bg-accent-soft\/20{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/20{background-color:color-mix(in oklab, var(--accent-soft) 20%, transparent)}}.bg-accent-soft\/40{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/40{background-color:color-mix(in oklab, var(--accent-soft) 40%, transparent)}}.bg-accent-soft\/60{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/60{background-color:color-mix(in oklab, var(--accent-soft) 60%, transparent)}}.bg-accent-soft\/70{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/70{background-color:color-mix(in oklab, var(--accent-soft) 70%, transparent)}}.bg-accent\/10{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/10{background-color:color-mix(in oklab, var(--accent) 10%, transparent)}}.bg-accent\/15{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/15{background-color:color-mix(in oklab, var(--accent) 15%, transparent)}}.bg-bg{background-color:var(--bg)}.bg-black{background-color:var(--color-black)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.bg-black\/70{background-color:color-mix(in oklab, var(--color-black) 70%, transparent)}}.bg-border{background-color:var(--border)}.bg-code-bg{background-color:var(--code-bg)}.bg-danger{background-color:var(--danger)}.bg-danger-soft{background-color:var(--danger-soft)}.bg-danger\/10{background-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.bg-danger\/10{background-color:color-mix(in oklab, var(--danger) 10%, transparent)}}.bg-fg-faint{background-color:var(--fg-faint)}.bg-fg\/5{background-color:var(--fg)}@supports (color:color-mix(in lab, red, red)){.bg-fg\/5{background-color:color-mix(in oklab, var(--fg) 5%, transparent)}}.bg-fg\/10{background-color:var(--fg)}@supports (color:color-mix(in lab, red, red)){.bg-fg\/10{background-color:color-mix(in oklab, var(--fg) 10%, transparent)}}.bg-inverse-bg{background-color:var(--inverse-bg)}.bg-ok{background-color:var(--ok)}.bg-ok-soft{background-color:var(--ok-soft)}.bg-ok\/15{background-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.bg-ok\/15{background-color:color-mix(in oklab, var(--ok) 15%, transparent)}}.bg-surface{background-color:var(--surface)}.bg-surface-2,.bg-surface-2\/40{background-color:var(--surface-2)}@supports (color:color-mix(in lab, red, red)){.bg-surface-2\/40{background-color:color-mix(in oklab, var(--surface-2) 40%, transparent)}}.bg-surface-3{background-color:var(--surface-3)}.bg-surface\/90{background-color:var(--surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/90{background-color:color-mix(in oklab, var(--surface) 90%, transparent)}}.bg-think-soft,.bg-think-soft\/40{background-color:var(--think-soft)}@supports (color:color-mix(in lab, red, red)){.bg-think-soft\/40{background-color:color-mix(in oklab, var(--think-soft) 40%, transparent)}}.bg-transparent{background-color:#0000}.bg-user-bubble{background-color:var(--user-bubble)}.bg-warn{background-color:var(--warn)}.bg-warn-soft,.bg-warn-soft\/40{background-color:var(--warn-soft)}@supports (color:color-mix(in lab, red, red)){.bg-warn-soft\/40{background-color:color-mix(in oklab, var(--warn-soft) 40%, transparent)}}.\[mask-image\:linear-gradient\(to_bottom\,black_60\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 60%,#0000);mask-image:linear-gradient(#000 60%,#0000)}.stroke-accent{stroke:var(--accent)}.stroke-border{stroke:var(--border)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0{padding-block:0}.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-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-1{padding-left:var(--spacing)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-7{padding-left:calc(var(--spacing) * 7)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-baseline{vertical-align:baseline}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,Cascadia Code,Cascadia Mono,Consolas,JetBrains Mono,Menlo,monospace}.font-sans{font-family:ui-sans-serif,system-ui,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif}.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-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-\[0\.92em\]{font-size:.92em}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13px\]{font-size:13px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent{color:var(--accent)}.text-accent-fg{color:var(--accent-fg)}.text-danger{color:var(--danger)}.text-fg{color:var(--fg)}.text-fg-faint{color:var(--fg-faint)}.text-fg-muted{color:var(--fg-muted)}.text-inverse-fg{color:var(--inverse-fg)}.text-ok{color:var(--ok)}.text-project{color:var(--project)}.text-think{color:var(--think)}.text-warn{color:var(--warn)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.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,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.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)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.group-focus-within\:flex:is(:where(.group):focus-within *){display:flex}@media (hover:hover){.group-hover\:flex:is(:where(.group):hover *){display:flex}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-fg-faint::placeholder{color:var(--fg-faint)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first\:pt-0:first-child{padding-top:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-accent\/60:hover{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent\/60:hover{border-color:color-mix(in oklab, var(--accent) 60%, transparent)}}.hover\:bg-accent-soft:hover{background-color:var(--accent-soft)}.hover\:bg-accent\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.hover\:bg-danger-soft:hover{background-color:var(--danger-soft)}.hover\:bg-fg\/5:hover{background-color:var(--fg)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-fg\/5:hover{background-color:color-mix(in oklab, var(--fg) 5%, transparent)}}.hover\:bg-surface-2:hover{background-color:var(--surface-2)}.hover\:bg-surface-3:hover{background-color:var(--surface-3)}.hover\:bg-warn\/10:hover{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warn\/10:hover{background-color:color-mix(in oklab, var(--warn) 10%, transparent)}}.hover\:text-danger:hover{color:var(--danger)}.hover\:text-fg:hover{color:var(--fg)}.hover\:text-fg-muted:hover{color:var(--fg-muted)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-solid:hover{text-decoration-style:solid}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}}.focus\:border-accent:focus{border-color:var(--accent)}.focus\:text-fg:focus{color:var(--fg)}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:text-fg:focus-visible{color:var(--fg)}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-accent:focus-visible{outline-color:var(--accent)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:inline{display:inline}.sm\:max-w-3xl{max-width:var(--container-3xl)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[180px_1fr\]{grid-template-columns:180px 1fr}.sm\:grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:rounded-xl{border-radius:var(--radius-xl)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pr-14{padding-right:calc(var(--spacing) * 14)}}@media (min-width:48rem){.md\:relative{position:relative}.md\:static{position:static}.md\:z-40{z-index:40}.md\:z-auto{z-index:auto}.md\:block{display:block}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:w-\[var\(--sidebar-w\)\]{width:var(--sidebar-w)}.md\:max-w-\[70vw\]{max-width:70vw}.md\:max-w-none{max-width:none}.md\:-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}@media (min-width:64rem){.lg\:static{position:static}.lg\:z-auto{z-index:auto}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:max-w-none{max-width:none}}}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--surface:#fff;--surface-2:#eef0f4;--surface-3:#e2e5eb;--border:#d6dae2;--fg:#171a21;--fg-muted:#5b6270;--fg-faint:#8a92a1;--accent:#2f6fed;--accent-fg:#000;--accent-soft:#e6eefd;--project:#2f6fed;--ok:#1f9d55;--ok-soft:#e4f6ec;--warn:#b7791f;--warn-soft:#fdf3dc;--danger:#d0453c;--danger-soft:#fce8e6;--think:#7c5cbf;--think-soft:#f0ebfa;--code-bg:#f0f2f6;--user-bubble:#e6eefd;--inverse-bg:#171a21;--inverse-fg:#f6f7f9;--shadow:0 1px 2px #1018280f, 0 1px 3px #1018281a}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0f1116;--surface:#161922;--surface-2:#1d212c;--surface-3:#262b38;--border:#2c3240;--fg:#e8eaf0;--inverse-bg:#e8eaf0;--inverse-fg:#0f1116;--fg-muted:#a0a7b6;--fg-faint:#6b7285;--accent:#6f9cff;--accent-fg:#000;--accent-soft:#1b2740;--project:#8ab4ff;--ok:#3ccc7a;--ok-soft:#14301f;--warn:#e0a83a;--warn-soft:#3a2c10;--danger:#f06a61;--danger-soft:#3d1a17;--think:#b39ae8;--think-soft:#2a2340;--code-bg:#0c0e13;--user-bubble:#1b2740;--shadow:0 1px 2px #0006}}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0f1116;--surface:#161922;--surface-2:#1d212c;--surface-3:#262b38;--border:#2c3240;--fg:#e8eaf0;--inverse-bg:#e8eaf0;--inverse-fg:#0f1116;--fg-muted:#a0a7b6;--fg-faint:#6b7285;--accent:#6f9cff;--accent-fg:#000;--accent-soft:#1b2740;--project:#8ab4ff;--ok:#3ccc7a;--ok-soft:#14301f;--warn:#e0a83a;--warn-soft:#3a2c10;--danger:#f06a61;--danger-soft:#3d1a17;--think:#b39ae8;--think-soft:#2a2340;--code-bg:#0c0e13;--user-bubble:#1b2740;--shadow:0 1px 2px #0006}html,body,#root{height:100%}#root{overflow:hidden}body{background:var(--bg);color:var(--fg);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;overscroll-behavior:none;margin:0;font-size:14px;line-height:1.5}:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md p,.md ul,.md ol,.md blockquote,.md table{margin:.5rem 0}.md ul{padding-left:1.4rem;list-style:outside}.md ol{padding-left:1.4rem;list-style:decimal}.md h1,.md h2,.md h3,.md h4{margin:.9rem 0 .4rem;font-weight:600;line-height:1.3}.md h1{font-size:1.25rem}.md h2{font-size:1.125rem}.md h3{font-size:1rem}.md.md-compact h1,.md.md-compact h2,.md.md-compact h3,.md.md-compact h4{margin:.75rem 0 .25rem;font-size:1.0833em}.md.md-compact p,.md.md-compact ul,.md.md-compact ol{margin:.35rem 0}.md.md-compact>:first-child{margin-top:0}.md.md-compact>:last-child{margin-bottom:0}.md a{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.md code{font-family:var(--font-mono);background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:.05em .3em;font-size:.875em}.md pre{margin:0}.md pre code{background:0 0;border:0;border-radius:0;padding:.75rem;line-height:1.45;display:block;overflow-x:auto}.md blockquote{border-left:3px solid var(--border);color:var(--fg-muted);padding-left:.75rem}.md table{border-collapse:collapse;font-size:.9em;display:block;overflow-x:auto}.md th,.md td{border:1px solid var(--border);text-align:left;padding:.25rem .5rem}.md hr{border:0;border-top:1px solid var(--border);margin:.75rem 0}.md input[type=checkbox]{margin-right:.35rem}.caret:after{content:"";vertical-align:-.15em;background:var(--fg-muted);width:.55em;height:1em;margin-left:2px;animation:1s steps(2,start) infinite caret-blink;display:inline-block}@keyframes caret-blink{to{visibility:hidden}}.blink{animation:1.2s ease-in-out infinite blink}@keyframes blink{0%,to{opacity:1}50%{opacity:.35}}.thinking-dots>span{animation:1.2s ease-in-out infinite blink}.thinking-dots>span:nth-child(2){animation-delay:.2s}.thinking-dots>span:nth-child(3){animation-delay:.4s}@media (prefers-reduced-motion:reduce){.blink,.thinking-dots>span,.caret:after{animation:none}}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}:root{--search-hit:#ffc56e;--search-hit-current:#ff8a00}::highlight(oona-search){background-color:var(--search-hit);color:#000}::highlight(oona-search-current){background-color:var(--search-hit-current);color:#000}.chat-search-current{outline:2px solid var(--search-hit-current);outline-offset:2px;border-radius:10px}.chat-jump-flash{border-radius:10px;animation:1.6s ease-out chat-jump-flash}@keyframes chat-jump-flash{0%,40%{outline:2px solid var(--accent);outline-offset:2px}to{outline-offset:2px;outline:2px solid #0000}}.pre-wrap{white-space:pre-wrap;word-break:break-word}[data-item-id]{content-visibility:auto;contain-intrinsic-size:auto 120px}.lazy-block{content-visibility:auto;contain-intrinsic-size:auto 300px}*{scrollbar-width:thin;scrollbar-color:var(--surface-3) transparent}@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-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}
|
|
@@ -74,7 +74,7 @@ Error generating stack: `+e.message+`
|
|
|
74
74
|
|
|
75
75
|
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function na(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e!==`$ref`&&e!==`allOf`&&(e in a||delete i[e]);if(s.$ref&&n.def)for(let e in i)e!==`$ref`&&e!==`allOf`&&e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e!==`$ref`&&e!==`allOf`&&e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.metadataRegistry.get(t)?.id;a!==void 0&&i.id===a&&delete i.id;let o=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(e.def.id===e.defId&&delete e.def.id,o[e.defId]=e.def)}e.external||Object.keys(o).length>0&&(e.target===`draft-2020-12`?i.$defs=o:i.definitions=o);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,"~standard",{value:{...t[`~standard`],jsonSchema:{input:aa(t,`input`,e.processors),output:aa(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function ra(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return ra(r.element,n);if(r.type===`set`)return ra(r.valueType,n);if(r.type===`lazy`)return ra(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type==="default"||r.type===`prefault`)return ra(r.innerType,n);if(r.type===`intersection`)return ra(r.left,n)||ra(r.right,n);if(r.type===`record`||r.type===`map`)return ra(r.keyType,n)||ra(r.valueType,n);if(r.type===`pipe`)return e._zod.traits.has(`$ZodCodec`)?!0:ra(r.in,n)||ra(r.out,n);if(r.type===`object`){for(let e in r.shape)if(ra(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(ra(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(ra(e,n))return!0;return!!(r.rest&&ra(r.rest,n))}return!1}var ia=(e,t={})=>n=>{let r=$i({...n,processors:t});return ea(e,r),ta(r,e),na(r,e)},aa=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=$i({...i??{},target:a,io:t,processors:n});return ea(e,o),ta(o,e),na(o,e)},oa={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},sa=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l}=e._zod.bag;if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=oa[s]??s,i.format===``&&delete i.format,s===`time`&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c];e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},ca=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,format:s,multipleOf:c,exclusiveMaximum:l,exclusiveMinimum:u}=e._zod.bag;i.type=typeof s==`string`&&s.includes(`int`)?`integer`:`number`;let d=typeof u==`number`&&u>=(a??-1/0),f=typeof l==`number`&&l<=(o??1/0),p=t.target===`draft-04`||t.target===`openapi-3.0`;d?p?(i.minimum=u,i.exclusiveMinimum=!0):i.exclusiveMinimum=u:typeof a==`number`&&(i.minimum=a),f?p?(i.maximum=l,i.exclusiveMaximum=!0):i.exclusiveMaximum=l:typeof o==`number`&&(i.maximum=o),typeof c==`number`&&(i.multipleOf=c)},la=(e,t,n,r)=>{n.type=`boolean`},ua=(e,t,n,r)=>{n.not={}},da=(e,t,n,r)=>{let i=e._zod.def,a=Ie(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},fa=(e,t,n,r)=>{let i=e._zod.def,a=[];for(let e of i.values)if(e===void 0){if(t.unrepresentable===`throw`)throw Error("Literal `undefined` cannot be represented in JSON Schema")}else if(typeof e==`bigint`){if(t.unrepresentable===`throw`)throw Error(`BigInt literals cannot be represented in JSON Schema`);a.push(Number(e))}else a.push(e);if(a.length!==0){if(a.length===1){let e=a[0];n.type=e===null?`null`:typeof e,t.target===`draft-04`||t.target===`openapi-3.0`?n.enum=[e]:n.const=e}else a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),a.every(e=>typeof e==`boolean`)&&(n.type=`boolean`),a.every(e=>e===null)&&(n.type=`null`),n.enum=a}},pa=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},ma=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},ha=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=ea(a.element,t,{...r,path:[...r.path,`items`]})},ga=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=ea(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=ea(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},_a=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>ea(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},va=(e,t,n,r)=>{let i=e._zod.def,a=ea(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=ea(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},ya=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`;let o=a.keyType,s=o._zod.bag?.patterns;if(a.mode===`loose`&&s&&s.size>0){let e=ea(a.valueType,t,{...r,path:[...r.path,`patternProperties`,`*`]});i.patternProperties={};for(let t of s)i.patternProperties[t.source]=e}else(t.target===`draft-07`||t.target===`draft-2020-12`)&&(i.propertyNames=ea(a.keyType,t,{...r,path:[...r.path,`propertyNames`]})),i.additionalProperties=ea(a.valueType,t,{...r,path:[...r.path,`additionalProperties`]});let c=o._zod.values;if(c){let e=[...c].filter(e=>typeof e==`string`||typeof e==`number`);e.length>0&&(i.required=e)}},ba=(e,t,n,r)=>{let i=e._zod.def,a=ea(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},xa=(e,t,n,r)=>{let i=e._zod.def;ea(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Sa=(e,t,n,r)=>{let i=e._zod.def;ea(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},Ca=(e,t,n,r)=>{let i=e._zod.def;ea(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},wa=(e,t,n,r)=>{let i=e._zod.def;ea(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},Ta=(e,t,n,r)=>{let i=e._zod.def,a=i.in._zod.traits.has(`$ZodTransform`),o=t.io===`input`?a?i.out:i.in:i.out;ea(o,t,r);let s=t.seen.get(e);s.ref=o},Ea=(e,t,n,r)=>{let i=e._zod.def;ea(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},Da=(e,t,n,r)=>{let i=e._zod.def;ea(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Oa=L(`ZodISODateTime`,(e,t)=>{Jn.init(e,t),eo.init(e,t)});function ka(e){return bi(Oa,e)}var Aa=L(`ZodISODate`,(e,t)=>{Yn.init(e,t),eo.init(e,t)});function ja(e){return xi(Aa,e)}var Ma=L(`ZodISOTime`,(e,t)=>{Xn.init(e,t),eo.init(e,t)});function Na(e){return Si(Ma,e)}var Pa=L(`ZodISODuration`,(e,t)=>{Zn.init(e,t),eo.init(e,t)});function Fa(e){return Ci(Pa,e)}var Ia=L(`ZodError`,(e,t)=>{yt.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>St(e,t)},flatten:{value:t=>xt(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Le,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Le,2)}},isEmpty:{get(){return e.issues.length===0}}})},{Parent:Error}),La=Ct(Ia),Ra=wt(Ia),za=Tt(Ia),Ba=Dt(Ia),Va=kt(Ia),Ha=At(Ia),Ua=jt(Ia),Wa=Mt(Ia),Ga=Nt(Ia),Ka=Pt(Ia),qa=Ft(Ia),Ja=It(Ia),Ya=new WeakMap;function Xa(e,t,n){let r=Object.getPrototypeOf(e),i=Ya.get(r);if(i||(i=new Set,Ya.set(r,i)),!i.has(t)){i.add(t);for(let e in n){let t=n[e];Object.defineProperty(r,e,{configurable:!0,enumerable:!1,get(){let n=t.bind(this);return Object.defineProperty(this,e,{configurable:!0,writable:!0,enumerable:!0,value:n}),n},set(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,enumerable:!0,value:t})}})}}}var Za=L(`ZodType`,(e,t)=>(Pn.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:aa(e,`input`),output:aa(e,`output`)}}),e.toJSONSchema=ia(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,"_def",{value:t}),e.parse=(t,n)=>La(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>za(e,t,n),e.parseAsync=async(t,n)=>Ra(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>Ba(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>Va(e,t,n),e.decode=(t,n)=>Ha(e,t,n),e.encodeAsync=async(t,n)=>Ua(e,t,n),e.decodeAsync=async(t,n)=>Wa(e,t,n),e.safeEncode=(t,n)=>Ga(e,t,n),e.safeDecode=(t,n)=>Ka(e,t,n),e.safeEncodeAsync=async(t,n)=>qa(e,t,n),e.safeDecodeAsync=async(t,n)=>Ja(e,t,n),Xa(e,`ZodType`,{check(...e){let t=this.def;return this.clone(Ge(t,{checks:[...t.checks??[],...e.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0})},with(...e){return this.check(...e)},clone(e,t){return tt(this,e,t)},brand(){return this},register(e,t){return e.add(this,t),this},refine(e,t){return this.check(fs(e,t))},superRefine(e,t){return this.check(ps(e,t))},overwrite(e){return this.check(Ui(e))},optional(){return Jo(this)},exactOptional(){return Xo(this)},nullable(){return Qo(this)},nullish(){return Jo(Qo(this))},nonoptional(e){return is(this,e)},array(){return jo(this)},or(e){return Po([this,e])},and(e){return Ro(this,e)},transform(e){return cs(this,Ko(e))},default(e){return es(this,e)},prefault(e){return ns(this,e)},catch(e){return os(this,e)},pipe(e){return cs(this,e)},readonly(){return us(this)},describe(e){let t=this.clone();return Xr.add(t,{description:e}),t},meta(...e){if(e.length===0)return Xr.get(this);let t=this.clone();return Xr.add(t,e[0]),t},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(e){return e(this)}}),Object.defineProperty(e,"description",{get(){return Xr.get(e)?.description},configurable:!0}),e)),Qa=L(`_ZodString`,(e,t)=>{Fn.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>sa(e,t,n,r);let n=e._zod.bag;e.format=n.format??null,e.minLength=n.minimum??null,e.maxLength=n.maximum??null,Xa(e,`_ZodString`,{regex(...e){return this.check(Li(...e))},includes(...e){return this.check(Bi(...e))},startsWith(...e){return this.check(Vi(...e))},endsWith(...e){return this.check(Hi(...e))},min(...e){return this.check(Fi(...e))},max(...e){return this.check(Pi(...e))},length(...e){return this.check(Ii(...e))},nonempty(...e){return this.check(Fi(1,...e))},lowercase(e){return this.check(Ri(e))},uppercase(e){return this.check(zi(e))},trim(){return this.check(Gi())},normalize(...e){return this.check(Wi(...e))},toLowerCase(){return this.check(Ki())},toUpperCase(){return this.check(qi())},slugify(){return this.check(Ji())}})}),$a=L(`ZodString`,(e,t)=>{Fn.init(e,t),Qa.init(e,t),e.email=t=>e.check(Qr(to,t)),e.url=t=>e.check(ii(io,t)),e.jwt=t=>e.check(yi(yo,t)),e.emoji=t=>e.check(ai(ao,t)),e.guid=t=>e.check($r(no,t)),e.uuid=t=>e.check(ei(ro,t)),e.uuidv4=t=>e.check(ti(ro,t)),e.uuidv6=t=>e.check(ni(ro,t)),e.uuidv7=t=>e.check(ri(ro,t)),e.nanoid=t=>e.check(oi(oo,t)),e.guid=t=>e.check($r(no,t)),e.cuid=t=>e.check(si(so,t)),e.cuid2=t=>e.check(ci(co,t)),e.ulid=t=>e.check(li(lo,t)),e.base64=t=>e.check(gi(go,t)),e.base64url=t=>e.check(_i(_o,t)),e.xid=t=>e.check(ui(uo,t)),e.ksuid=t=>e.check(di(fo,t)),e.ipv4=t=>e.check(fi(po,t)),e.ipv6=t=>e.check(pi(B,t)),e.cidrv4=t=>e.check(mi(mo,t)),e.cidrv6=t=>e.check(hi(ho,t)),e.e164=t=>e.check(vi(vo,t)),e.datetime=t=>e.check(ka(t)),e.date=t=>e.check(ja(t)),e.time=t=>e.check(Na(t)),e.duration=t=>e.check(Fa(t))});function z(e){return Zr($a,e)}var eo=L(`ZodStringFormat`,(e,t)=>{In.init(e,t),Qa.init(e,t)}),to=L(`ZodEmail`,(e,t)=>{zn.init(e,t),eo.init(e,t)}),no=L(`ZodGUID`,(e,t)=>{Ln.init(e,t),eo.init(e,t)}),ro=L(`ZodUUID`,(e,t)=>{Rn.init(e,t),eo.init(e,t)}),io=L(`ZodURL`,(e,t)=>{Bn.init(e,t),eo.init(e,t)}),ao=L(`ZodEmoji`,(e,t)=>{Vn.init(e,t),eo.init(e,t)}),oo=L(`ZodNanoID`,(e,t)=>{Hn.init(e,t),eo.init(e,t)}),so=L(`ZodCUID`,(e,t)=>{Un.init(e,t),eo.init(e,t)}),co=L(`ZodCUID2`,(e,t)=>{Wn.init(e,t),eo.init(e,t)}),lo=L(`ZodULID`,(e,t)=>{Gn.init(e,t),eo.init(e,t)}),uo=L(`ZodXID`,(e,t)=>{Kn.init(e,t),eo.init(e,t)}),fo=L(`ZodKSUID`,(e,t)=>{qn.init(e,t),eo.init(e,t)}),po=L(`ZodIPv4`,(e,t)=>{Qn.init(e,t),eo.init(e,t)}),B=L(`ZodIPv6`,(e,t)=>{$n.init(e,t),eo.init(e,t)}),mo=L(`ZodCIDRv4`,(e,t)=>{er.init(e,t),eo.init(e,t)}),ho=L(`ZodCIDRv6`,(e,t)=>{tr.init(e,t),eo.init(e,t)}),go=L(`ZodBase64`,(e,t)=>{rr.init(e,t),eo.init(e,t)}),_o=L(`ZodBase64URL`,(e,t)=>{ar.init(e,t),eo.init(e,t)}),vo=L(`ZodE164`,(e,t)=>{or.init(e,t),eo.init(e,t)}),yo=L(`ZodJWT`,(e,t)=>{cr.init(e,t),eo.init(e,t)}),bo=L(`ZodNumber`,(e,t)=>{lr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ca(e,t,n,r),Xa(e,`ZodNumber`,{gt(e,t){return this.check(ji(e,t))},gte(e,t){return this.check(Mi(e,t))},min(e,t){return this.check(Mi(e,t))},lt(e,t){return this.check(ki(e,t))},lte(e,t){return this.check(Ai(e,t))},max(e,t){return this.check(Ai(e,t))},int(e){return this.check(Co(e))},safe(e){return this.check(Co(e))},positive(e){return this.check(ji(0,e))},nonnegative(e){return this.check(Mi(0,e))},negative(e){return this.check(ki(0,e))},nonpositive(e){return this.check(Ai(0,e))},multipleOf(e,t){return this.check(Ni(e,t))},step(e,t){return this.check(Ni(e,t))},finite(){return this}});let n=e._zod.bag;e.minValue=Math.max(n.minimum??-1/0,n.exclusiveMinimum??-1/0)??null,e.maxValue=Math.min(n.maximum??1/0,n.exclusiveMaximum??1/0)??null,e.isInt=(n.format??``).includes(`int`)||Number.isSafeInteger(n.multipleOf??.5),e.isFinite=!0,e.format=n.format??null});function xo(e){return wi(bo,e)}var So=L(`ZodNumberFormat`,(e,t)=>{ur.init(e,t),bo.init(e,t)});function Co(e){return Ti(So,e)}var wo=L(`ZodBoolean`,(e,t)=>{dr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>la(e,t,n,r)});function To(e){return Ei(wo,e)}var Eo=L(`ZodUnknown`,(e,t)=>{fr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Do(){return Di(Eo)}var Oo=L(`ZodNever`,(e,t)=>{pr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ua(e,t,n,r)});function ko(e){return Oi(Oo,e)}var Ao=L(`ZodArray`,(e,t)=>{hr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ha(e,t,n,r),e.element=t.element,Xa(e,`ZodArray`,{min(e,t){return this.check(Fi(e,t))},nonempty(e){return this.check(Fi(1,e))},max(e,t){return this.check(Pi(e,t))},length(e,t){return this.check(Ii(e,t))},unwrap(){return this.element}})});function jo(e,t){return Yi(Ao,e,t)}var Mo=L(`ZodObject`,(e,t)=>{br.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ga(e,t,n,r),Ue(e,`shape`,()=>t.shape),Xa(e,`ZodObject`,{keyof(){return Ho(Object.keys(this._zod.def.shape))},catchall(e){return this.clone({...this._zod.def,catchall:e})},passthrough(){return this.clone({...this._zod.def,catchall:Do()})},loose(){return this.clone({...this._zod.def,catchall:Do()})},strict(){return this.clone({...this._zod.def,catchall:ko()})},strip(){return this.clone({...this._zod.def,catchall:void 0})},extend(e){return ot(this,e)},safeExtend(e){return st(this,e)},merge(e){return ct(this,e)},pick(e){return it(this,e)},omit(e){return at(this,e)},partial(...e){return lt(qo,this,e[0])},required(...e){return ut(rs,this,e[0])}})});function V(e,t){return new Mo({type:`object`,shape:e??{},...R(t)})}var No=L(`ZodUnion`,(e,t)=>{Sr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_a(e,t,n,r),e.options=t.options});function Po(e,t){return new No({type:`union`,options:e,...R(t)})}var Fo=L(`ZodDiscriminatedUnion`,(e,t)=>{No.init(e,t),Cr.init(e,t)});function Io(e,t,n){return new Fo({type:`union`,options:t,discriminator:e,...R(n)})}var Lo=L(`ZodIntersection`,(e,t)=>{wr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>va(e,t,n,r)});function Ro(e,t){return new Lo({type:`intersection`,left:e,right:t})}var zo=L(`ZodRecord`,(e,t)=>{Dr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ya(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function Bo(e,t,n){return!t||!t._zod?new zo({type:`record`,keyType:z(),valueType:e,...R(t)}):new zo({type:`record`,keyType:e,valueType:t,...R(n)})}var Vo=L(`ZodEnum`,(e,t)=>{Or.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>da(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new Vo({...t,checks:[],...R(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new Vo({...t,checks:[],...R(r),entries:i})}});function Ho(e,t){return new Vo({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...R(t)})}var Uo=L(`ZodLiteral`,(e,t)=>{kr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fa(e,t,n,r),e.values=new Set(t.values),Object.defineProperty(e,"value",{get(){if(t.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return t.values[0]}})});function Wo(e,t){return new Uo({type:`literal`,values:Array.isArray(e)?e:[e],...R(t)})}var Go=L(`ZodTransform`,(e,t)=>{Ar.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ma(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Ne(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(_t(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(_t(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n.fallback=!0,n)):(n.value=i,n.fallback=!0,n)}});function Ko(e){return new Go({type:`transform`,transform:e})}var qo=L(`ZodOptional`,(e,t)=>{Mr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Da(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Jo(e){return new qo({type:`optional`,innerType:e})}var Yo=L(`ZodExactOptional`,(e,t)=>{Nr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Da(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Xo(e){return new Yo({type:`optional`,innerType:e})}var Zo=L(`ZodNullable`,(e,t)=>{Pr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ba(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Qo(e){return new Zo({type:`nullable`,innerType:e})}var $o=L(`ZodDefault`,(e,t)=>{Fr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Sa(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function es(e,t){return new $o({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Qe(t)}})}var ts=L(`ZodPrefault`,(e,t)=>{Lr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ca(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ns(e,t){return new ts({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():Qe(t)}})}var rs=L(`ZodNonOptional`,(e,t)=>{Rr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>xa(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function is(e,t){return new rs({type:`nonoptional`,innerType:e,...R(t)})}var as=L(`ZodCatch`,(e,t)=>{Br.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>wa(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function os(e,t){return new as({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}var ss=L(`ZodPipe`,(e,t)=>{Vr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ta(e,t,n,r),e.in=t.in,e.out=t.out});function cs(e,t){return new ss({type:`pipe`,in:e,out:t})}var ls=L(`ZodReadonly`,(e,t)=>{Ur.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ea(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function us(e){return new ls({type:`readonly`,innerType:e})}var ds=L(`ZodCustom`,(e,t)=>{Gr.init(e,t),Za.init(e,t),e._zod.processJSONSchema=(t,n,r)=>pa(e,t,n,r)});function fs(e,t={}){return Xi(ds,e,t)}function ps(e,t){return Zi(e,t)}var ms={artificial_analysis_intelligence_index:{label:`Intelligence index`,scale:`index`},artificial_analysis_coding_index:{label:`Coding index`,scale:`index`},artificial_analysis_math_index:{label:`Math index`,scale:`index`},gpqa:{label:`GPQA Diamond`,scale:`fraction`},hle:{label:`Humanity's Last Exam`,scale:`fraction`},lcr:{label:`Long-context reasoning`,scale:`fraction`},livecodebench:{label:`LiveCodeBench`,scale:`fraction`},scicode:{label:`SciCode`,scale:`fraction`},math_500:{label:`MATH-500`,scale:`fraction`},aime:{label:`AIME`,scale:`fraction`},aime_25:{label:`AIME 2025`,scale:`fraction`},ifbench:{label:`IFBench`,scale:`fraction`},mmlu_pro:{label:`MMLU Pro`,scale:`fraction`},tau2:{label:`τ²-bench (agentic)`,scale:`fraction`},tau_banking:{label:`τ-bench banking`,scale:`fraction`},terminalbench_hard:{label:`Terminal-Bench Hard`,scale:`fraction`},terminalbench_v2_1:{label:`Terminal-Bench 2.1`,scale:`fraction`}};function hs(e){return(e.credentialVariants??[]).filter(e=>!e.operatorOnly)}function gs(e){let t=new Set(e.map(e=>e.definition.id));return e.filter(e=>!e.definition.clientGroup||e.definition.clientGroup===e.definition.id||!t.has(e.definition.clientGroup))}function _s(e,t){return e.filter(e=>e.definition.id===t||e.definition.clientGroup===t&&e.definition.id!==t)}function vs(e){return gs(e).filter(e=>e.definition.enabled&&e.definition.credentialClass!==`none`&&T(e.definition.id)&&!D(e.definition.id))}function ys(e){if(!e)return!1;try{let t=new URL(e).hostname.toLowerCase();return t===`127.0.0.1`||t===`localhost`||t===`::1`||t===`[::1]`}catch{return!1}}function bs(e,t={}){let n=e.displayName,r=t.credentialClass??e.credentialClass,i=t.baseUrl??e.baseUrl;return e.id===`oonacode`?{kind:`pool`,badge:`via OonaCode`,detail:`Runs on OonaCode's own provider accounts, through the OonaCode gateway. Priced models are billed to your account in credits; free models cost nothing on any plan.`,viaGateway:!0}:e.route===`direct`?{kind:`subscription-direct`,badge:`direct to provider`,detail:`Your ${n} subscription runs straight from this PC to the provider — it never passes through the OonaCode gateway.`,viaGateway:!1}:r===`api_key`&&e.kind!==`anthropic-passthrough`?{kind:`own-key-translated`,badge:`direct to provider`,detail:`Your ${n} key stays on this PC: OonaCode translates the request here and calls ${n} from this machine. The gateway sees neither the key nor the traffic.`,viaGateway:!1}:ys(i)?{kind:`local-server`,badge:`on this machine`,detail:`Runs against ${n} on this machine (${i}) — the request never leaves the PC.`,viaGateway:!1}:r===`api_key`&&e.kind===`anthropic-passthrough`&&e.directCapable===!0?{kind:`own-key-direct`,badge:`direct to provider`,detail:`Your ${n} key runs straight from this PC to ${n} — the OonaCode gateway is not in the path.`,viaGateway:!1}:{kind:`gateway`,badge:`via OonaCode`,detail:`Routed to ${n} through the OonaCode gateway.`,viaGateway:!0}}var xs=Io(`type`,[V({type:Wo(`oauth-device`),deviceAuthorizationUrl:z().url(),tokenUrl:z().url(),clientId:z().min(1),scopes:jo(z().min(1)).min(1),signInLabel:z().min(1).optional(),referrer:z().min(1).optional()}),V({type:Wo(`openai-device`),deviceAuthorizationUrl:z().url(),pollUrl:z().url(),tokenUrl:z().url(),verificationUri:z().url(),redirectUri:z().url(),clientId:z().min(1),signInLabel:z().min(1).optional()})]),Ss=V({id:z().min(1),displayName:z().min(1),upstreamId:z().min(1).optional(),servedBy:jo(z().min(1)).optional(),subscriptionServedBy:jo(z().min(1)).optional(),contextWindow:xo().int().positive().optional(),maxOutputTokens:xo().int().positive().optional(),supportsTools:To().optional(),supportsThinking:To().optional(),effortLevels:jo(Ho(me)).optional(),helperModel:z().min(1).optional(),supportsVision:To().optional(),inputPricePerM:xo().nonnegative().optional(),outputPricePerM:xo().nonnegative().optional(),notes:z().optional(),free:To().optional(),aaIntelligence:xo().optional(),aaCoding:xo().optional(),aaOutputTps:xo().optional(),aaTtft:xo().optional(),aa:V({fetchedAt:z(),creator:z().optional(),releaseDate:z().optional(),benchmarks:Bo(z(),xo()).optional()}).loose().optional()}).loose(),Cs=V({id:z().regex(/^[a-z0-9][a-z0-9-]{1,40}$/,`provider id must be lowercase kebab-case`),displayName:z().min(1),kind:Ho([`anthropic-passthrough`,`openai-compatible`,`gemini`]),route:Ho([`gateway`,`direct`]),credentialClass:Ho([`api_key`,`subscription`,`none`]),baseUrl:z().url(),messagesPath:z().startsWith(`/`).optional(),modelsPath:z().startsWith(`/`).optional(),auth:V({header:Ho([`x-api-key`,`authorization-bearer`,`api-key`,`none`]),extraHeaders:Bo(z(),z()).optional()}),models:jo(Ss),defaultModel:z().min(1),modelAliases:Bo(z(),z()).optional(),helperModel:z().min(1).optional(),capabilities:V({streaming:To(),tools:To(),thinking:To(),vision:To(),countTokens:To(),promptCaching:To(),promptCacheTtlSec:xo().int().positive().optional()}),translate:V({maxTokensParam:Ho([`max_tokens`,`max_completion_tokens`]).optional(),reasoningEffortFromBudget:To().optional(),reasoningContentField:z().nullable().optional(),supportsParallelToolCalls:To().optional(),systemRole:Ho([`system`,`developer`]).optional(),streamIncludeUsage:To().optional(),wire:Ho([`chat`,`responses`]).optional()}).optional(),passthrough:V({stripCacheControl:To().optional(),cacheChain:To().optional(),toolSchemaRequiredArray:To().optional(),toolDescriptionRequired:To().optional(),allowedBetas:jo(z()).optional(),anthropicVersion:z().optional()}).optional(),userBaseUrl:To().optional(),engineEnv:Bo(z(),z()).optional(),directCapable:To().optional(),subscriptionLogin:xs.optional(),phase:Po([Wo(1),Wo(2)]),enabled:To(),docsUrl:z().url().optional(),notes:z().optional(),references:jo(V({label:z().min(1),url:z().url(),kind:Ho([`docs`,`pricing`,`models`,`console`,`status`,`keys`,`signup`,`other`]).optional()})).optional(),keyFormat:z().optional(),credentialVariants:jo(V({id:z().min(1),label:z().min(1),header:Ho([`x-api-key`,`authorization-bearer`,`api-key`,`none`]).optional(),extraHeaders:Bo(z(),z()).optional(),operatorOnly:To().optional(),requiresClaudeCodeIdentity:To().optional(),subscriptionLogin:xs.optional(),claudeCodeShape:V({betas:z().min(1),userAgent:z().min(1),billingHeader:z().min(1),headers:Bo(z(),z()).optional()}).optional(),baseUrl:z().url().optional(),keyFormat:z().optional(),notes:z().optional()})).optional(),adminGroup:z().optional(),clientGroup:z().optional(),recordLabel:z().optional(),effortLevels:jo(Ho(me)).optional()});V({version:xo().int().positive(),updatedAt:z(),providers:jo(Cs)});function ws(e,t){return Ts(e,As(e,t))}function Ts(e,t){return e.models.find(e=>e.id===t)?.upstreamId??t}function Es(e){return/^claude-/i.test(e)}function Ds(e){return e.replace(/\[1m\]$/i,``)}function Os(e,t){return{images:e.models.find(e=>e.id===t)?.supportsVision??e.capabilities.vision,documents:Es(t)}}function ks(e,t,n){let r=Os(e,t),i=new Set;for(let e of n){let t=e?.type;(t===`image`||t===`document`)&&i.add(t)}let a=e.models.find(e=>e.id===t)?.displayName??t;return i.has(`image`)&&!r.images?`${a} cannot read images. Remove the image, or pick a model that can — the model details say which.`:i.has(`document`)&&!r.documents?`${a} cannot read PDF documents — only Anthropic's Claude models take a PDF. Attach it as text, or pick a Claude model.`:null}function As(e,t){if(!t)return e.defaultModel;if(e.models.some(e=>e.id===t))return t;let n=e.modelAliases?.[t];if(n)return n;let r=t.toLowerCase(),i=r.includes(`haiku`)?`haiku`:r.includes(`opus`)?`opus`:r.includes(`sonnet`)?`sonnet`:r.includes(`fable`)?`fable`:null;if(i){if(e.modelAliases?.[i])return e.modelAliases[i];let t=e.models.find(e=>e.id.toLowerCase().includes(i));if(t)return t.id}return e.defaultModel}var js={messages:`/v1/messages`,countTokens:`/v1/messages/count_tokens`,models:`/v1/models`,providerMessages:e=>`/p/${e}/v1/messages`,providerCountTokens:e=>`/p/${e}/v1/messages/count_tokens`,providerModels:e=>`/p/${e}/v1/models`,health:`/api/health`,streamCheck:`/api/stream-check`,register:`/api/auth/register`,login:`/api/auth/login`,refresh:`/api/auth/refresh`,logout:`/api/auth/logout`,me:`/api/auth/me`,prelogin:`/api/auth/prelogin`,tokens:`/api/me/tokens`,token:e=>`/api/me/tokens/${e}`,tokenPurge:e=>`/api/me/tokens/${e}/purge`,tokenUsage:e=>`/api/me/tokens/${e}/usage`,providers:`/api/me/providers`,provider:e=>`/api/me/providers/${e}`,providerTest:e=>`/api/me/providers/${e}/test`,routing:`/api/me/routing`,usage:`/api/me/usage`,usageSession:e=>`/api/me/usage/sessions/${e}`,devices:`/api/me/devices`,pushToken:`/api/me/push-token`,hostNotify:`/api/me/hosts/notify`,device:e=>`/api/me/devices/${e}`,hosts:`/api/me/hosts`,hostHeartbeat:`/api/me/hosts/heartbeat`,hostVaultUnlock:e=>`/api/me/hosts/${encodeURIComponent(e)}/vault-unlock`,host:e=>`/api/me/hosts/${encodeURIComponent(e)}`,vault:`/api/me/vault`,vaultEvents:`/api/me/vault/events`,historySessions:`/api/me/history/sessions`,historySession:e=>`/api/me/history/sessions/${e}`,historyEntries:e=>`/api/me/history/sessions/${e}/entries`,registry:`/api/registry`,agentTools:`/api/agent-tools`,agentToolCalls:`/api/me/agent-tools/calls`,releasesLatest:`/api/releases/latest`,releasesHistory:`/api/releases`,team:`/api/me/team`,teamInvites:`/api/me/team/invites`,teamInvite:e=>`/api/me/team/invites/${e}`,teamInviteLookup:`/api/team/invites/lookup`,teamInviteDecline:`/api/team/invites/decline`,teamJoin:`/api/me/team/join`,teamInvitations:`/api/me/team/invitations`,teamInvitationAccept:e=>`/api/me/team/invitations/${e}/accept`,teamInvitationDecline:e=>`/api/me/team/invitations/${e}/decline`,teamMember:e=>`/api/me/team/members/${e}`,teamLeave:`/api/me/team/leave`,teamTransfer:`/api/me/team/transfer`,teamAudit:`/api/me/team/audit`,teamCheckout:`/api/me/team/checkout`,teamTopup:`/api/me/team/topup`,teamSeats:`/api/me/team/seats`,googleConfig:`/api/auth/google/config`,googleStart:`/api/auth/google/start`,googleCallback:`/api/auth/google/callback`,githubConfig:`/api/auth/github/config`,githubStart:`/api/auth/github/start`,githubCallback:`/api/auth/github/callback`,googleUnlink:`/api/me/google`,telegramConfig:`/api/auth/telegram/config`,telegramAuth:`/api/auth/telegram`,telegram:`/api/me/telegram`,telegramWebhook:`/api/webhooks/telegram`,passphraseSetup:`/api/auth/passphrase/setup`,passphraseRekey:`/api/me/passphrase/rekey`,recovery:`/api/me/recovery`,recoveryChallenge:`/api/auth/recovery/challenge`,recoveryConsume:`/api/auth/recovery/consume`,deviceApprovals:`/api/me/device-approvals`,deviceApproval:e=>`/api/me/device-approvals/${e}`,deviceApprovalApprove:e=>`/api/me/device-approvals/${e}/approve`,deviceApprovalDeny:e=>`/api/me/device-approvals/${e}/deny`,passwordResetRequest:`/api/auth/password-reset/request`,passwordResetConfirm:`/api/auth/password-reset/confirm`,vaultRekeyComplete:`/api/me/vault/rekey-complete`,vaultRekeyPending:`/api/me/vault/rekey-pending`,emailVerifySend:`/api/auth/email/verify/send`,emailVerifyConfirm:`/api/auth/email/verify/confirm`,emailVerifyWatch:`/api/auth/email/verify/watch`,twoFactor:`/api/me/2fa`,twoFactorEnroll:`/api/me/2fa/enroll`,twoFactorConfirm:`/api/me/2fa/confirm`,twoFactorDisable:`/api/me/2fa/disable`,twoFactorDisableRequest:`/api/me/2fa/disable/request`,twoFactorRecoveryCodes:`/api/me/2fa/recovery-codes`,twoFactorVerify:`/api/auth/2fa/verify`,deviceLinkStart:`/api/auth/device/start`,deviceLinkPoll:`/api/auth/device/poll`,deviceLinks:`/api/me/device-links`,deviceLink:e=>`/api/me/device-links/${e}`,deviceLinkApprove:e=>`/api/me/device-links/${e}/approve`,deviceLinkDeny:e=>`/api/me/device-links/${e}/deny`,hostLogs:`/api/me/hosts/logs`,errorReport:`/api/me/errors`,bugReports:`/api/me/bug-reports`,plans:`/api/plans`,myPlan:`/api/me/plan`,checkout:`/api/me/plan/checkout`,creditsTopup:`/api/me/credits/topup`,billing:`/api/me/billing`},Ms=2048,Ns=16384,Ps=8e3,Fs=5242880,Is=12582912;new Set(`BCDFGHJKLMNPQRSTVWXZ`.split(``));var Ls=`discard-my-vault-and-history`,Rs=`Anyone who can use this device can use your saved provider keys without your passphrase. Turn this off on shared or public computers. You can revoke it any time from Devices.`,zs={name:120,instructions:2e4,goal:2e3,repositories:50,repositoryUrl:500,memory:2e4,minIntervalFloor:1,minIntervalCeiling:10080},Bs=`⏰ Scheduled task "`;function Vs(e){if(!e.startsWith(Bs))return null;let t=e.indexOf(`"
|
|
76
76
|
|
|
77
|
-
`,18);return t<0?null:{title:e.slice(18,t),prompt:e.slice(t+3)}}Object.freeze({tengu_amber_sentinel:!0,tengu_groovy_eclipse:!0,tengu_humble_hammock:!0});var Hs=[`mon`,`tue`,`wed`,`thu`,`fri`,`sat`,`sun`],Us=/^([01]\d|2[0-3]):[0-5]\d$/;V({tz:z().min(1),windows:jo(V({from:z().regex(Us,`HH:MM`),to:z().regex(Us,`HH:MM`),days:jo(Ho(Hs)).optional(),kind:Ho([`peak`,`offpeak`])})),offpeakDiscount:xo().nonnegative().max(1).optional()});var Ws=[`priceInputCacheMissPeak`,`priceInputCacheMissOffpeak`,`priceInputCacheHitPeak`,`priceInputCacheHitOffpeak`,`priceCacheWritePeak`,`priceCacheWriteOffpeak`,`priceOutputPeak`,`priceOutputOffpeak`],Gs=V({inputCacheMiss:xo().nonnegative(),inputCacheHit:xo().nonnegative().optional(),cacheWrite:xo().nonnegative().optional(),output:xo().nonnegative()});V({by:Wo(`prompt_tokens`),tiers:jo(V({upToPromptTokens:xo().int().positive().optional(),price:Gs,cost:Gs.optional()})).min(1),note:z().optional()}).superRefine((e,t)=>{let n=0;e.tiers.forEach((r,i)=>{let a=r.upToPromptTokens;if(a===void 0){i!==e.tiers.length-1&&t.addIssue({code:`custom`,message:`only the LAST tier may omit upToPromptTokens`,path:[`tiers`,i]});return}a<=n&&t.addIssue({code:`custom`,message:`tiers must ascend: ${a} does not exceed ${n}`,path:[`tiers`,i,`upToPromptTokens`]}),n=a})}),[...Ws];var Ks={oonacode:{hex:`#000000`,owner:`OonaCode`,d:`M0.72 12a11.28 11.28 0 1 0 22.56 0a11.28 11.28 0 1 0 -22.56 0ZM4.8 12a7.2 7.2 0 1 0 14.4 0a7.2 7.2 0 1 0 -14.4 0ZM7.44 12a4.56 4.56 0 1 0 9.12 0a4.56 4.56 0 1 0 -9.12 0Z`,fillRule:`evenodd`},anthropic:{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},"anthropic-subscription":{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},openai:{hex:`#000000`,owner:`OpenAI`,d:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`},xai:{hex:`#000000`,owner:`xAI`,d:`M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z`},deepseek:{hex:`#5786FE`,owner:`DeepSeek`,d:`M23.748 4.651c-.254-.124-.364.113-.512.233-.051.04-.094.09-.137.137-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.155-.708-.311-.955-.65-.172-.24-.219-.509-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.094.172.187.129.323-.082.28-.18.553-.266.833-.055.179-.137.218-.328.14a5.5 5.5 0 0 1-1.737-1.179c-.857-.828-1.631-1.743-2.597-2.46a12 12 0 0 0-.689-.47c-.985-.957.13-1.743.387-1.836.27-.098.094-.433-.778-.428-.872.003-1.67.295-2.687.685a3 3 0 0 1-.465.136 9.6 9.6 0 0 0-2.883-.101c-1.885.21-3.39 1.1-4.497 2.622C.082 8.776-.231 10.854.152 13.02c.403 2.284 1.568 4.175 3.36 5.653 1.857 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.132-.284 4.994-1.86.47.234.962.328 1.78.398.629.058 1.235-.031 1.705-.129.735-.155.684-.836.418-.961-2.155-1.004-1.682-.595-2.112-.926 1.095-1.295 2.768-3.598 3.284-6.733.05-.346.115-.834.108-1.114-.004-.171.035-.238.23-.257a4.2 4.2 0 0 0 1.545-.475c1.397-.763 1.96-2.016 2.093-3.517.02-.23-.004-.467-.247-.588M11.58 18.168c-2.088-1.642-3.101-2.183-3.52-2.16-.39.024-.32.472-.234.763.09.288.207.487.371.74.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.168-1.361-.801-2.5-1.86-3.301-3.306-.775-1.393-1.225-2.888-1.299-4.482-.02-.385.094-.522.477-.592a4.7 4.7 0 0 1 1.53-.038c2.131.311 3.946 1.264 5.467 2.774.868.86 1.525 1.887 2.202 2.89.72 1.066 1.494 2.082 2.48 2.915.348.291.626.513.892.677-.802.09-2.14.109-3.055-.615zm1.001-6.44a.306.306 0 0 1 .415-.287.3.3 0 0 1 .113.074.3.3 0 0 1 .086.214c0 .17-.136.307-.308.307a.303.303 0 0 1-.306-.307m3.11 1.596c-.2.081-.4.151-.591.16a1.25 1.25 0 0 1-.798-.254c-.274-.23-.47-.358-.551-.758a1.7 1.7 0 0 1 .015-.588c.07-.327-.007-.537-.238-.727-.188-.156-.426-.199-.689-.199a.6.6 0 0 1-.254-.078.253.253 0 0 1-.114-.358 1 1 0 0 1 .192-.21c.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.392.451.462.576.685.915.176.264.336.536.446.848.066.194-.02.353-.25.45`},kimi:{hex:`#000000`,owner:`Moonshot`,d:`M21.765.351C22.998.351 24 1.353 24 2.586S22.998 4.82 21.765 4.82h-1.974c-.15 0-.26-.12-.26-.26V2.586A2.237 2.237 0 0 1 21.765.35M9.41 13.388l8.447-8.377c.16-.16.07-.471-.14-.471h-4.55s-.1.02-.14.06l-9.099 9.029c-.14.14-.35.02-.35-.21V4.81c0-.15-.1-.27-.221-.27H.22c-.12 0-.22.12-.22.27v18.57c0 .15.1.27.22.27h3.137c.12 0 .22-.12.22-.27v-3.79c0-.08.03-.16.08-.21l2.826-2.796c.07-.07.16-.08.241-.03l7.546 5.551a8.9 8.9 0 0 0 4.018 1.493c.12.01.23-.11.23-.27V19.76c0-.14-.08-.25-.19-.26a5.8 5.8 0 0 1-2.355-.942l-6.533-4.73c-.14-.09-.15-.32-.03-.441`},qwen:{hex:`#6950EF`,owner:`Alibaba`,d:`M23.919 14.545 20.817 9.17l1.47-2.544a.56.56 0 0 0 0-.566l-1.633-2.83a.57.57 0 0 0-.49-.283h-6.207L12.487.402a.57.57 0 0 0-.49-.284H8.732a.56.56 0 0 0-.49.284L5.139 5.775h-2.94a.56.56 0 0 0-.49.284L.077 8.887a.56.56 0 0 0 0 .567L3.18 14.83l-1.47 2.545a.56.56 0 0 0 0 .566l1.634 2.83a.57.57 0 0 0 .49.283h6.205l1.47 2.545a.57.57 0 0 0 .49.284h3.266a.57.57 0 0 0 .49-.284l3.104-5.375h2.94a.57.57 0 0 0 .49-.283l1.634-2.828a.55.55 0 0 0-.004-.568M8.733.686l1.634 2.828-1.634 2.828H21.8L20.164 9.17H7.425L5.63 6.06Zm1.306 19.801-6.205-.002 1.634-2.83h3.265L2.201 6.344h3.267q3.182 5.517 6.367 11.032zm10.124-5.66L18.53 12l-6.532 11.315-1.634-2.83c2.129-3.673 4.25-7.351 6.373-11.028h3.592l3.102 5.374z`},mimo:{hex:`#FF6900`,owner:`Xiaomi`,d:`M12 0C8.016 0 4.756.255 2.493 2.516.23 4.776 0 8.033 0 12.012c0 3.98.23 7.235 2.494 9.497C4.757 23.77 8.017 24 12 24c3.983 0 7.243-.23 9.506-2.491C23.77 19.247 24 15.99 24 12.012c0-3.984-.233-7.243-2.502-9.504C19.234.252 15.978 0 12 0zM4.906 7.405h5.624c1.47 0 3.007.068 3.764.827.746.746.827 2.233.83 3.676v4.54a.15.15 0 0 1-.152.147h-1.947a.15.15 0 0 1-.152-.148V11.83c-.002-.806-.048-1.634-.464-2.051-.358-.36-1.026-.441-1.72-.458H7.158a.15.15 0 0 0-.151.147v6.98a.15.15 0 0 1-.152.148H4.906a.15.15 0 0 1-.15-.148V7.554a.15.15 0 0 1 .15-.149zm12.131 0h1.949a.15.15 0 0 1 .15.15v8.892a.15.15 0 0 1-.15.148h-1.949a.15.15 0 0 1-.151-.148V7.554a.15.15 0 0 1 .151-.149zM8.92 10.948h2.046c.083 0 .15.066.15.147v5.352a.15.15 0 0 1-.15.148H8.92a.15.15 0 0 1-.152-.148v-5.352a.15.15 0 0 1 .152-.147Z`}};function qs(e){return Ks[e]??null}function Js(e){let t=e.replace(/\(.*?\)/g,` `).split(/[\s/_-]+/).filter(Boolean);return t.length===0?`?`:t.length===1?t[0].slice(0,2).toUpperCase():`${t[0][0]}${t[1][0]}`.toUpperCase()}var Ys=[`stable`,`dev`];function Xs(e){return typeof e==`string`&&Ys.includes(e)}function Zs(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();return Xs(t)?t:null}var Qs=[`win32`,`linux`,`darwin`],$s=[`x64`,`arm64`];function ec(e,t){let n=Zs(e)??`stable`,r=[];return n!==`stable`&&r.push(`channel=${encodeURIComponent(n)}`),t&&Qs.includes(t.platform)&&(r.push(`platform=${t.platform}`),t.arch&&$s.includes(t.arch)&&r.push(`arch=${t.arch}`)),r.length>0?`${js.releasesLatest}?${r.join(`&`)}`:js.releasesLatest}function tc(e,t){let n=Zs(t)??`stable`;return n===`stable`?e:`${e} (${n})`}var nc=5e4,rc=[`bg`,`surface`,`surface-2`,`surface-3`,`border`,`fg`,`fg-muted`,`fg-faint`,`accent`,`accent-fg`,`accent-soft`,`project`,`ok`,`ok-soft`,`warn`,`warn-soft`,`danger`,`danger-soft`,`think`,`think-soft`,`code-bg`,`user-bubble`],ic={agentFinished:!1,permissionRequired:!0,errorOccurred:!0},ac={autoAcceptPermissions:!1,showReasoningSummaries:!0,notifications:ic,showAgentPicker:!0,transcriptWindowSize:500,openTabs:[],draftTabs:[],draftTitles:{},activeTab:null,remoteTabs:{},sessionPanelOpen:!1,explorerOpen:!1,sidebarWidth:288,sidebarPinned:!0,dismissedUpdateVersion:null,lastSeenReleaseNotes:null,claudeImportOffered:!1,claudeImportOffers:0,collapsedProjects:[],themeColors:{light:{},dark:{}}};function oc(e){return Math.min(Math.max(typeof e==`number`&&Number.isFinite(e)?Math.floor(e):0,0),3)}function sc(e){return Math.min(640,Math.max(200,typeof e==`number`&&Number.isFinite(e)?Math.round(e):288))}function cc(e){return Math.min(nc,Math.max(100,typeof e==`number`&&Number.isFinite(e)?Math.round(e):500))}function lc(e,t){return typeof e==`boolean`?e:t}function uc(e){return typeof e==`string`&&e.length>0&&e.length<=64?e:null}function dc(e,t=50){if(!Array.isArray(e))return[];let n=[];for(let r of e)if(!(typeof r!=`string`||r.length===0||r.length>200)&&!n.includes(r)&&(n.push(r),n.length>=t))break;return n}function fc(e,t=50){if(typeof e!=`object`||!e||Array.isArray(e))return{};let n={};for(let[r,i]of Object.entries(e))if(!(r.length===0||r.length>200)&&!(typeof i!=`string`||i.length===0||i.length>200)&&(n[r]=i,Object.keys(n).length>=t))break;return n}function pc(e){if(typeof e!=`string`)return null;let t=e.trim();return/^#[0-9a-fA-F]{6}$/.test(t)?t.toLowerCase():null}function mc(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e)){if(!rc.includes(n))continue;let e=pc(r);e!==null&&(t[n]=e)}return t}function hc(e){let t=typeof e==`object`&&e?e:{};return{light:mc(t.light),dark:mc(t.dark)}}function gc(e){let t=typeof e==`object`&&e?e:{},n=typeof t.notifications==`object`&&t.notifications!==null?t.notifications:{},r=dc(t.openTabs),i=dc(t.draftTabs).filter(e=>!r.includes(e)),a={};for(let[e,n]of Object.entries(fc(t.draftTitles)))i.includes(e)&&(a[e]=n);let o=[...r,...i],s=t.activeTab,c=typeof s==`string`&&o.includes(s)?s:o[o.length-1]??null;return{autoAcceptPermissions:lc(t.autoAcceptPermissions,ac.autoAcceptPermissions),showReasoningSummaries:lc(t.showReasoningSummaries,ac.showReasoningSummaries),notifications:{agentFinished:lc(n.agentFinished,ic.agentFinished),permissionRequired:lc(n.permissionRequired,ic.permissionRequired),errorOccurred:lc(n.errorOccurred,ic.errorOccurred)},showAgentPicker:lc(t.showAgentPicker,ac.showAgentPicker),transcriptWindowSize:cc(t.transcriptWindowSize),openTabs:r,draftTabs:i,draftTitles:a,activeTab:c,remoteTabs:fc(t.remoteTabs),sessionPanelOpen:lc(t.sessionPanelOpen,ac.sessionPanelOpen),explorerOpen:lc(t.explorerOpen,ac.explorerOpen),sidebarWidth:sc(t.sidebarWidth),sidebarPinned:lc(t.sidebarPinned,ac.sidebarPinned),dismissedUpdateVersion:uc(t.dismissedUpdateVersion),lastSeenReleaseNotes:uc(t.lastSeenReleaseNotes),claudeImportOffered:lc(t.claudeImportOffered,ac.claudeImportOffered),claudeImportOffers:oc(t.claudeImportOffers),collapsedProjects:dc(t.collapsedProjects),themeColors:hc(t.themeColors)}}new Set(Object.keys(ac));var _c=[{version:`0.3.156`,date:`2026-09-27`,added:[`Chats can talk to each other. Turn on “Talk to other chats” in a chat’s Tools menu, and its agent can find your other chats that have it on, read them, and ask them for help — one chat or a whole group. A chat that is closed wakes up to answer; a busy one answers when it finishes. The reply comes back to the chat that asked.`,`The Conversations window (in the sidebar) shows every conversation between your chats: who said what to whom, what each answer cost, and buttons to pause, resume, close or stop them all. Each conversation has a budget — 20 messages and 1,000,000 new tokens by default — and pauses itself when it is used up, so chats can never talk forever.`,`Hover over any tool in a chat’s Tools menu to read what it does, how it works, what it costs and how to turn it off.`],fixed:[`A chat woken in the background — by a scheduled task or another chat — shows as working in the sidebar even when it is not open in a tab.`,`A scheduled task no longer slips into a chat at the same moment you send it a message; yours always goes first.`,`A message sent from the terminal no longer waits forever when a chat’s history cannot be resumed and the restart fails. It now says why.`,`Notes OonaCode writes into a chat — a model change, a conversation paused — are still there when you reopen it.`,`When every Claude seat in the OonaCode pool is taken, a new chat now says the model is busy and to try again in a few minutes or pick another model, instead of “Something went wrong on our side”.`,`On Linux, the app tells you it is updating while it swaps itself, so there is no need to start it again.`,`On Linux, removing the .deb or .rpm leaves nothing running and nothing failing at the next login, and the one-line installer checks for free disk space before it changes anything.`]},{version:`0.3.155`,date:`2026-09-27`,added:[`OonaCode runs on Linux. One command installs the command line, the background service and the desktop app: curl -fsSL https://oonacode.oonak.ai/install.sh | bash. The AppImage, .deb and .rpm are on the download page too.`,`On Linux the app lives in the system tray as it does on Windows, follows your desktop’s light or dark theme, and gets its own entry in the applications menu.`,`Uninstalling on Linux removes the desktop app along with the rest, and asks whether to keep your chats for a future install.`],fixed:[`A window no longer stays on “Unauthorized” after the background service restarts with a new key. It reconnects by itself.`]},{version:`0.3.154`,date:`2026-09-26`,added:[],fixed:[`A chat waiting on a long job no longer loses its watcher. OonaCode used to close a chat’s engine ten minutes after the model last spoke, which stopped any Monitor or background command it had left running. The engine now stays up while such work runs, up to 12 hours.`,`A chat moved into a project, or whose project you edit, now follows the project’s instructions from its next message. It used to keep the ones it started with.`]},{version:`0.3.153`,date:`2026-09-25`,added:[],fixed:[`A very long chat no longer answers “Prompt is too long” after OonaCode restarts or updates. The engine was judging the chat’s size by a figure left over from before the restart, and now gets an accurate one.`,`If a message is ever refused as too long before the model has started on it, OonaCode sends it again by itself with a shorter history. You see your message once and then the answer, not an error.`]},{version:`0.3.152`,date:`2026-09-25`,added:[],fixed:[`Uninstalling the app from Windows’ Apps list no longer stops the command-line OonaCode on the same PC from starting after a restart.`]},{version:`0.3.151`,date:`2026-09-25`,added:[`Files the agent names in a chat are clickable. Audio and video play right in the chat with a small player, pictures open as a preview, and in the app every file can be opened in its own program or shown in its folder.`,`Uninstalling the app asks whether to keep your chats on this PC. Keeping them means a new install signs in and continues every chat.`],fixed:[`Installing and updating no longer fail with “The operation has timed out” on PCs whose network drops the newer internet addresses, nor while our server restarts for an update.`]},{version:`0.3.150`,date:`2026-09-25`,added:[],fixed:[`The fix in 0.3.149 for long, sleeping turns now really reaches the agent: the Monitor tool and the block on long waits are on for every chat.`,`A chat compacted after a long pause no longer pays to cache a conversation it is about to replace, and the agent keeps each tool call in its history exactly as it wrote it — both as Claude Code does.`]},{version:`0.3.149`,date:`2026-09-25`,added:[`The agent can watch a long job with the Monitor tool, as Claude Code does, and is woken the moment the job finishes.`],fixed:[`Long chats no longer spend their time asleep. With no way to watch a background job, the agent had been polling it with waits of four to eight minutes. One chat spent more than three and a half hours of a day sleeping, and turns ran for hours while the model worked for a fraction of that. The agent now gets the same working rules as Claude Code, and long waits are blocked.`]},{version:`0.3.148`,date:`2026-09-25`,added:[],fixed:[`A scheduled task that could not be sent — the PC had just restarted, the vault was still locked, the server was not reachable yet — waits and tries again instead of switching itself off. Pausing, editing or deleting a task while its prompt is being sent is no longer undone, and a scheduled prompt no longer lands in a chat whose engine is still starting.`,`A chat on your own DeepSeek key, or one switched with a typed “/model opus”, is no longer shown as withdrawn and locked. “/model fable” picks Claude Fable instead of the default model.`,`Moving a chat to another model no longer lowers its saved effort level to what the old model offered, and a one-off “oona --effort” is no longer saved as the chat’s level.`,`After you pick another model for a locked chat and send, the chat no longer flashes the lock again while the engine starts; if the start fails, your pick is kept.`,`Coming back from a file tab no longer jumps the chat to an old reply or reopens the search bar.`,`The hidden sidebar slides away again when the pointer leaves the window past its edge, and the keyboard no longer tabs through it while it is hidden. Clicking ⓘ in Settings opens its note instead of closing it.`,`Subagents write their prompt cache for five minutes, as Claude Code does for its subscribers; the chat itself keeps the hour. Their cache writes cost less.`]},{version:`0.3.147`,date:`2026-09-25`,added:[`A chat’s scheduled tasks sit beside its subagents: a clock badge says how many are live and when the next one runs, and opens the list — each task’s schedule, its next and last run, Pause and Delete. The tasks run on this PC.`],fixed:[`A prompt the scheduler sends into a chat reads as a “Scheduled task” line, not as your own message waiting in the queue.`,`A chat whose model is no longer offered shows that model in red and waits for you to pick another; its history stays, and the old model is not in the list any more.`,`The effort list follows the server within minutes, without restarting the app. A chat set to a level that has been switched off moves to the nearest one — ultracode becomes xhigh. Chats on your own Claude subscription have an effort picker again.`]},{version:`0.3.146`,date:`2026-09-25`,added:[`A Tools menu beside the model picker: switch OonaCode’s own tools on or off for each chat — browser, desktop and window control, clipboard, screen capture, Office documents and run-as-administrator. Each tool costs the model only a short line until it is used, and the menu shows how much. The first tools are marked Demo while they are tested with every model: a demo tool answers what it would have done, and does nothing on your PC yet.`],fixed:[]},{version:`0.3.145`,date:`2026-09-25`,added:[],fixed:[`Every request of every chat, on every model, is about 3,200 tokens smaller: the engine’s own “auto memory” instructions are gone. OonaCode starts each engine in a fresh private folder and deletes it afterwards, so the notes the model was told to keep there were thrown away when the chat went idle — the model spent tool calls writing memories it would never read. A project’s memory is OonaCode’s own and stays.`,`The engine’s claude.ai Artifact tools are switched off everywhere OonaCode runs it — the app, the terminal, VS Code, the phone, Telegram and the agent API.`]},{version:`0.3.144`,date:`2026-09-25`,added:[],fixed:[`Long chats on Claude models in the OonaCode pool keep their cache for an hour, as Claude Code does for its subscribers. A pause of more than five minutes no longer re-sends the whole conversation at the full cache-write price, which in a large chat was the most expensive part of coming back to it.`,`The session panel’s Context shows how big the conversation is now, not the total of every request the chat ever made — a long chat read “10.7M / 1.0M tokens”.`,`The message box keeps the cursor after you send, so you can go straight on typing the next message.`,`A paid chat’s background work (titles, reading web pages) no longer goes to a free model of the same vendor.`]},{version:`0.3.143`,date:`2026-09-24`,added:[`Search inside your chats: open the search in the chat list, press the sliders button and choose Whole chats. It looks through every message of every chat on this PC, and you choose whose words — yours, the model’s, or both — plus, if you like, the tools’ commands and output and the subagents’ conversations. Results show each message with the words lit; a click opens the chat with its search on them.`,`More search options, for both kinds of search: one project only, a time window (today, 7 or 30 days), match case and whole words.`],fixed:[`While you search the chat list, projects with no matching chat are hidden too.`]},{version:`0.3.142`,date:`2026-09-24`,added:[],fixed:[`A reply you sent shows as the same small chip it had in the message box — “Reply to” and the first few words — instead of the whole quoted text; the full quote appears when you rest the pointer on it, and a click jumps to the message it answers.`,`The model now knows a reply points back into the conversation: it is told the quoted lines are from the chat history, not new input, and whose words they were — its own earlier reply, your earlier message, a file, or a tool’s output.`,`When the chat list is narrow, its buttons wrap onto a second line instead of spilling out of it.`]},{version:`0.3.141`,date:`2026-09-24`,added:[`The chat list on the left can be made wider or narrower: drag its right edge (double-click it for the usual width).`,`The chat list can hide: press the pin in its header, the button at the top left, or View → Sidebar (Ctrl+B). While hidden it slides in when the pointer reaches the left edge of the window, and slides away when you leave it.`,`Search in the chat list is a single magnifier now; click it and the search box opens across the top. Escape or × clears it.`],fixed:[`Opening OonaCode right after a restart no longer leaves the OonaCode pool models out of the model list: if they cannot be read yet, OonaCode asks again by itself a few seconds later and the list fills in.`,`The Artificial Analysis scores (intelligence, coding, speed and benchmarks) show on every model in the model list again — including the models of your own Claude and SuperGrok subscriptions, which never had them.`,`A chat’s details card no longer appears on top of its right-click menu.`]},{version:`0.3.140`,date:`2026-09-24`,added:[`Reply is tidier: the message you reply to shows as a small chip above the message box with its first few words, instead of filling the box. Click the chip — or the quote in a sent reply — to jump to that message; the × removes it.`,`Right-click a project in the sidebar for its settings: Project settings… opens Projects with that project already selected. The gear beside a project’s “+” does the same, and a chat filed in a project offers it in its own menu too.`,`Link GitHub. Under a project’s Repositories (and in Settings → Providers), link your GitHub account once: the agent’s git and gh then clone, pull and push your private repositories on every PC of yours. You type a short code on github.com; the token stays in your encrypted vault and never reaches the OonaCode server. Public repositories need nothing.`],fixed:[]},{version:`0.3.139`,date:`2026-09-24`,added:[`Every setting now says what it does, and resting the pointer on the ⓘ beside it tells you where in OonaCode it applies and what it does not do.`,`Export chats… is in the File menu (and on the sidebar in a browser window) instead of in Settings.`,`With Remote access turned off on a PC, your phone, Telegram, the website and your other PCs still show it — online or not — marked “remote access off”, and opening it tells you to turn Remote access back on in OonaCode on that PC.`],fixed:[`Turning Remote access off now tells your other devices at once. Before, the PC was already unreachable from them, but they could not say why.`,`The settings of This PC save the moment you change them — nothing is lost by closing the dialog.`,`Settings that did nothing, or repeated another one, are gone: the default permission mode (each chat’s Build / Plan / Ask first picker decides), the agent-picker switch, the Git Bash path, the engine path and the extra allowed origins. The server address is shown, not edited — signing in sets it.`]},{version:`0.3.138`,date:`2026-09-24`,added:[`Projects have settings now, like the Claude app’s: a goal, the repositories the project works on, what a new chat in it starts on (model, effort and folder), a project memory the agent keeps up to date, and whether its chats may schedule work — and how often at most. All of it is in Projects, and a Claude app project you import brings its own.`,`OonaCode has a scheduler. Ask the agent to do something later or on a repeat — “check the build every morning at nine” — and it schedules it on this PC; when it is due, the prompt arrives in the chat, even if the chat had gone quiet. The Projects dialog and the chat’s info panel list what is scheduled, where you can pause, resume or delete it.`],fixed:[`Saving a project’s instructions now reaches its chats at their next message, instead of waiting until the chat happened to restart.`]},{version:`0.3.137`,date:`2026-09-24`,added:[],fixed:[`After a PC restart the app could ask for a "host token" and sign you out: two copies of the OonaCode background service started at once and fought over your session. Only one ever runs now, and the app never shows the token page — if its service is replaced it reconnects by itself.`,`The unlock screen stays put until you unlock, and says what went wrong in place — a wrong password, or a connection it is re-establishing — instead of jumping to another page.`,`A message with a picture sent while the agent was working stayed “queued”, and removing it said it was already sent. It now shows as read the moment the agent takes it, and a reopened chat shows it with its picture.`,`In the model’s questions, typing your own answer now clears the options you had picked, and picking an option clears what you typed — the answer sent is exactly the one you chose. The same on the phone, in the terminal and in Telegram.`]},{version:`0.3.136`,date:`2026-09-24`,added:[`Every model now has its own housekeeper — the small, fast model of the same maker that writes a chat’s titles and reads the web pages it fetches. On the OonaCode pool a MiMo v2.6 Pro chat uses MiMo v2.6 Flash, a Qwen chat Qwen3.8 Flash, a GLM chat GLM-5.3 Flash and a GPT-5 chat GPT-5 mini, instead of doing that work on the big model itself. A free model keeps its own, so it stays free.`],fixed:[]},{version:`0.3.135`,date:`2026-09-24`,added:[],fixed:[`Claude models on the OonaCode pool — Opus 5.5, Opus 5, Sonnet 5 and Fable 5.1 — now use their whole 1M context. A long chat no longer stops to summarise itself every ~170k tokens, and its subagents get the same window.`,`Reading a web page is quick again in a Claude chat: pages are read by Claude Haiku, as in Claude Code, instead of a helper that took about a minute a page.`,`Changing a chat’s model now moves its subagents and background helpers to the new model too; before, they stayed on the old one until the app restarted.`,`MiMo v2.5 and v2.5 Pro chats now use their full 1M context too.`]},{version:`0.3.134`,date:`2026-09-23`,added:[],fixed:[`On the Android app, the model’s questions can be answered again. They come one at a time — “Question 2 of 3” — with Back, Next and Skip, and Answer sends them to your PC. The card used to show only the first question, hide the rest below it and wait for all of them, so it could not be sent.`]},{version:`0.3.133`,date:`2026-09-23`,added:[`Bring your Claude desktop app projects across: File → Import chats from other coding agents now lists every project the Claude app has opened on this PC. Each one arrives as an OonaCode project of the same name — its goal, instructions and what Claude noted about it become the project’s instructions — with its project chat and one chat per thread filed under it, ready to carry on.`,`A Claude Code chat you moved into a Claude app project is filed under that project here too.`,`A thread you never opened in the Claude app still comes across, with its task and every reply the project chat saw; open it once in the Claude app and import again for its whole conversation.`],fixed:[`Cursor chats appear in the import list again — they had been left out since September 10.`]},{version:`0.3.132`,date:`2026-09-23`,added:[`Reply to any part of a chat: select some text (or just right-click a block), choose Reply, and it is quoted in your message box — type your answer under it. A quote from a file the agent read names the file.`,`Right-click in a chat: copy what you selected, copy a whole reply or tool output, copy a code block or a link, find the selected words in the chat, or select a block.`,`Search in a chat opens the block its match is in — a folded tool card, a thought, a finished agent’s work — and scrolls to the words themselves.`,`Search matches are now bright orange, the current one strongest, so they stand out on code too.`,`The file viewer shows pictures (PNG, JPEG, GIF, WebP, SVG and more), plays audio and video, and shows Markdown formatted, with a switch to the source.`,`Right-click a file or folder in the explorer to copy its path or delete it.`],fixed:[`Moving a chat to another folder or project while it was working could delete the folder it was working in, start two agents at once, or send your next message to the old folder.`,`The working line no longer says a chat may be stuck while it waits for your approval or answer, or right after you send a message, and it counts time correctly (no more "4m 60s").`,`A date line no longer says "Today" for yesterday’s messages when the app stays open past midnight.`,"Installing with npm (`npm i -g oonacode`) installs this version again; earlier npm releases carried an old program.",`The What’s new window could open again on the next start, showing the same update a second time.`,`An older OonaCode window or VS Code extension no longer resets settings it does not know about, such as your theme colours or which project groups you folded.`,`A new install no longer opens with a list of changes; this window now appears only after an update.`,`The notification switch for permissions now says it also covers the agent’s questions.`]},{version:`0.3.131`,date:`2026-09-23`,added:[`Claude Opus 5.5 is here — the newest Opus, and cheaper to run than Opus 5. Choose it in the model picker, from the OonaCode pool or on your own Claude subscription. It runs on the newer Claude Code engine (2.1.280) that this update brings.`,`Every block in a chat shows its time at the bottom right, in your local time — hover it for the full date — and a date line marks where each day starts.`,`A running chat tells you how long the agent has been quiet, and after five minutes that it may be stuck and what to do.`,`After every update, OonaCode now opens this window to show you what changed.`],fixed:[`A reply that streamed in live had no time on it until the chat was opened again.`,`Chats open in tabs could fail to come back after a restart if a setting changed while they were being restored.`]}];function vc(e,t){let n=e=>{let[t,...n]=e.trim().replace(/^v/,``).split(`-`);return{nums:(t??``).split(`.`).map(e=>Number.parseInt(e,10)||0),pre:n.length>0?n.join(`-`):null}},r=n(e),i=n(t);for(let e=0;e<Math.max(r.nums.length,i.nums.length);e++){let t=(r.nums[e]??0)-(i.nums[e]??0);if(t!==0)return t}return r.pre===i.pre?0:r.pre===null?1:i.pre===null?-1:yc(r.pre,i.pre)}function yc(e,t){let n=e.split(`.`),r=t.split(`.`);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e],i=r[e];if(t===i)continue;if(t===void 0)return-1;if(i===void 0)return 1;let a=/^\d+$/.test(t),o=/^\d+$/.test(i);if(a&&o){let e=Number(t)-Number(i);if(e!==0)return e;continue}return a===o?t<i?-1:1:a?-1:1}return 0}function bc(e,t,n=_c){if(!e||e===`0.0.0`)return[];let r=n.filter(t=>vc(t.version,e)<=0);return[...t===null?r.filter(t=>vc(t.version,e)===0):r.filter(e=>vc(e.version,t)>0)].sort((e,t)=>vc(t.version,e.version))}function xc(e,t,n,r=_c){if(!e||e===`0.0.0`)return{record:null,show:[]};let i=null;for(let e of r)(i===null||vc(e.version,i)>0)&&(i=e.version);let a=i!==null&&vc(e,i)>0?i:e;return{record:t===null||vc(a,t)>0?a:null,show:t===null&&!n?[]:bc(e,t,r)}}function Sc(e,t){if(t==null)return[...e];if(t.length===0)return[];let n=new Set(t),r=e.filter(e=>n.has(e.id));return r.length>0?r:[...e]}var Cc=`the user skipped the question`,wc=`(the user skipped this question)`;function Tc(e){let t=e?.questions;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=e;if(typeof t.question!=`string`)continue;let r=Array.isArray(t.options)?t.options.map(e=>e&&typeof e==`object`?e:null).filter(e=>e!==null&&typeof e.label==`string`).map(e=>({label:e.label,...typeof e.description==`string`?{description:e.description}:{}})):[];n.push({question:t.question,header:typeof t.header==`string`?t.header:``,options:r,multiSelect:t.multiSelect===!0})}return n}function Ec(e,t,n={},r=new Set){let i={};return e.forEach((e,a)=>{if(r.has(a)){i[e.question]=wc;return}let o=(n[a]??``).trim();i[e.question]=o||(t[a]??[]).join(`, `)}),i}var Dc=[`win32`,`linux`,`darwin`],Oc=[`demo`,`live`],kc=[`allow`,`ask`],Ac=[`string`,`number`,`integer`,`boolean`,`array`,`object`];function jc(e,t){let n=t?.[e.slug];return typeof n==`boolean`?n:e.defaultOn}function Mc(e,t){return e.filter(e=>jc(e,t))}var Nc={slug:48,name:80,entryTool:40,description:2e3,promptLine:1e3,details:8e3,actionDescription:1e3,params:30,paramName:48,paramDescription:400,enumValues:40,callArgKeys:20,callError:500,callBatch:100},Pc=/^[A-Za-z0-9_-]+$/;function Fc(e){return typeof e==`string`&&e.length>0&&e.length<=Nc.entryTool&&Pc.test(e)}function Ic(e){return Math.ceil(e.length/4)}function Lc(e){return Ic(`${e.entryTool} ${e.description}`)+55}var Rc=V({type:Ho(Ac),required:To().optional(),enum:jo(Po([z(),xo()])).optional(),description:z().optional()}),zc=V({slug:z().min(1),description:z(),params:Bo(z(),Rc),permission:Ho(kc),sort:xo()}),Bc=V({version:z(),url:z(),sha256:z(),sizeBytes:xo(),exe:z(),format:Wo(`zip`)}),Vc=V({slug:z().min(1),name:z(),entryTool:z().refine(Fc,`not a valid tool name`),description:z(),promptLine:z().nullable(),details:z().nullable().optional(),status:Ho(Oc),defaultOn:To(),sort:xo(),install:Bc.nullable(),actions:jo(zc)}).loose();V({platform:Ho(Dc),version:z(),packs:jo(Vc),refreshMinutes:xo()}),[`**Let this chat work together with your other chats.**`,``,`### What it does`,`- Finds your other chats on this PC and reads their recent messages.`,`- Sends one chat, or a group of chats, a message or a task.`,`- Brings their answers back to this chat, by itself.`,``,`### How it works`,`- A chat that is asleep is woken from its saved history. A busy one gets the message when its current turn ends, never in the middle of it.`,`- The other chat does the work with its own model, folder and tools. When it finishes, its answer comes back here as a new message.`,`- Several chats can share one conversation (a group). An answer goes only to the chat that asked, so a group cannot multiply its own messages.`,``,`### What it costs`,`- About 600 tokens on every request while it is on, read from the prompt cache.`,`- Every message makes the chat that receives it do a turn, which spends its own tokens.`,`- Switching it on or off in a chat that already has a conversation re-writes its prompt cache once.`,``,`### Safety limits`,`- Each conversation has a budget: 20 delivered messages and 1,000,000 new tokens by default (context read back from the prompt cache is not counted). Reaching either pauses the conversation, and the chats say so.`,`- A chain stops after 3 hops (a message caused by a message caused by a message).`,`- At most 5 messages between two chats and 20 from one chat in 10 minutes, and 10 waiting for any one chat. A chat cannot message itself.`,`- A conversation with no activity for 24 hours closes by itself.`,``,`### How to stop it`,`- Turn this switch off: the chat loses these tools, and its part in every conversation pauses.`,`- Or open the Conversations window and use Pause, Close or Stop all.`,``,`### Privacy`,`- Everything stays on your PC: the messages are kept in this PC's database, never on OonaCode's server.`,`- A message never grants anything. The other chat runs with its own permissions and asks you as usual.`,``,`Only chats that have this switch on can reach each other.`].join(`
|
|
77
|
+
`,18);return t<0?null:{title:e.slice(18,t),prompt:e.slice(t+3)}}Object.freeze({tengu_amber_sentinel:!0,tengu_groovy_eclipse:!0,tengu_humble_hammock:!0});var Hs=[`mon`,`tue`,`wed`,`thu`,`fri`,`sat`,`sun`],Us=/^([01]\d|2[0-3]):[0-5]\d$/;V({tz:z().min(1),windows:jo(V({from:z().regex(Us,`HH:MM`),to:z().regex(Us,`HH:MM`),days:jo(Ho(Hs)).optional(),kind:Ho([`peak`,`offpeak`])})),offpeakDiscount:xo().nonnegative().max(1).optional()});var Ws=[`priceInputCacheMissPeak`,`priceInputCacheMissOffpeak`,`priceInputCacheHitPeak`,`priceInputCacheHitOffpeak`,`priceCacheWritePeak`,`priceCacheWriteOffpeak`,`priceOutputPeak`,`priceOutputOffpeak`],Gs=V({inputCacheMiss:xo().nonnegative(),inputCacheHit:xo().nonnegative().optional(),cacheWrite:xo().nonnegative().optional(),output:xo().nonnegative()});V({by:Wo(`prompt_tokens`),tiers:jo(V({upToPromptTokens:xo().int().positive().optional(),price:Gs,cost:Gs.optional()})).min(1),note:z().optional()}).superRefine((e,t)=>{let n=0;e.tiers.forEach((r,i)=>{let a=r.upToPromptTokens;if(a===void 0){i!==e.tiers.length-1&&t.addIssue({code:`custom`,message:`only the LAST tier may omit upToPromptTokens`,path:[`tiers`,i]});return}a<=n&&t.addIssue({code:`custom`,message:`tiers must ascend: ${a} does not exceed ${n}`,path:[`tiers`,i,`upToPromptTokens`]}),n=a})}),[...Ws];var Ks={oonacode:{hex:`#000000`,owner:`OonaCode`,d:`M0.72 12a11.28 11.28 0 1 0 22.56 0a11.28 11.28 0 1 0 -22.56 0ZM4.8 12a7.2 7.2 0 1 0 14.4 0a7.2 7.2 0 1 0 -14.4 0ZM7.44 12a4.56 4.56 0 1 0 9.12 0a4.56 4.56 0 1 0 -9.12 0Z`,fillRule:`evenodd`},anthropic:{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},"anthropic-subscription":{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},openai:{hex:`#000000`,owner:`OpenAI`,d:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`},xai:{hex:`#000000`,owner:`xAI`,d:`M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z`},deepseek:{hex:`#5786FE`,owner:`DeepSeek`,d:`M23.748 4.651c-.254-.124-.364.113-.512.233-.051.04-.094.09-.137.137-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.155-.708-.311-.955-.65-.172-.24-.219-.509-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.094.172.187.129.323-.082.28-.18.553-.266.833-.055.179-.137.218-.328.14a5.5 5.5 0 0 1-1.737-1.179c-.857-.828-1.631-1.743-2.597-2.46a12 12 0 0 0-.689-.47c-.985-.957.13-1.743.387-1.836.27-.098.094-.433-.778-.428-.872.003-1.67.295-2.687.685a3 3 0 0 1-.465.136 9.6 9.6 0 0 0-2.883-.101c-1.885.21-3.39 1.1-4.497 2.622C.082 8.776-.231 10.854.152 13.02c.403 2.284 1.568 4.175 3.36 5.653 1.857 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.132-.284 4.994-1.86.47.234.962.328 1.78.398.629.058 1.235-.031 1.705-.129.735-.155.684-.836.418-.961-2.155-1.004-1.682-.595-2.112-.926 1.095-1.295 2.768-3.598 3.284-6.733.05-.346.115-.834.108-1.114-.004-.171.035-.238.23-.257a4.2 4.2 0 0 0 1.545-.475c1.397-.763 1.96-2.016 2.093-3.517.02-.23-.004-.467-.247-.588M11.58 18.168c-2.088-1.642-3.101-2.183-3.52-2.16-.39.024-.32.472-.234.763.09.288.207.487.371.74.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.168-1.361-.801-2.5-1.86-3.301-3.306-.775-1.393-1.225-2.888-1.299-4.482-.02-.385.094-.522.477-.592a4.7 4.7 0 0 1 1.53-.038c2.131.311 3.946 1.264 5.467 2.774.868.86 1.525 1.887 2.202 2.89.72 1.066 1.494 2.082 2.48 2.915.348.291.626.513.892.677-.802.09-2.14.109-3.055-.615zm1.001-6.44a.306.306 0 0 1 .415-.287.3.3 0 0 1 .113.074.3.3 0 0 1 .086.214c0 .17-.136.307-.308.307a.303.303 0 0 1-.306-.307m3.11 1.596c-.2.081-.4.151-.591.16a1.25 1.25 0 0 1-.798-.254c-.274-.23-.47-.358-.551-.758a1.7 1.7 0 0 1 .015-.588c.07-.327-.007-.537-.238-.727-.188-.156-.426-.199-.689-.199a.6.6 0 0 1-.254-.078.253.253 0 0 1-.114-.358 1 1 0 0 1 .192-.21c.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.392.451.462.576.685.915.176.264.336.536.446.848.066.194-.02.353-.25.45`},kimi:{hex:`#000000`,owner:`Moonshot`,d:`M21.765.351C22.998.351 24 1.353 24 2.586S22.998 4.82 21.765 4.82h-1.974c-.15 0-.26-.12-.26-.26V2.586A2.237 2.237 0 0 1 21.765.35M9.41 13.388l8.447-8.377c.16-.16.07-.471-.14-.471h-4.55s-.1.02-.14.06l-9.099 9.029c-.14.14-.35.02-.35-.21V4.81c0-.15-.1-.27-.221-.27H.22c-.12 0-.22.12-.22.27v18.57c0 .15.1.27.22.27h3.137c.12 0 .22-.12.22-.27v-3.79c0-.08.03-.16.08-.21l2.826-2.796c.07-.07.16-.08.241-.03l7.546 5.551a8.9 8.9 0 0 0 4.018 1.493c.12.01.23-.11.23-.27V19.76c0-.14-.08-.25-.19-.26a5.8 5.8 0 0 1-2.355-.942l-6.533-4.73c-.14-.09-.15-.32-.03-.441`},qwen:{hex:`#6950EF`,owner:`Alibaba`,d:`M23.919 14.545 20.817 9.17l1.47-2.544a.56.56 0 0 0 0-.566l-1.633-2.83a.57.57 0 0 0-.49-.283h-6.207L12.487.402a.57.57 0 0 0-.49-.284H8.732a.56.56 0 0 0-.49.284L5.139 5.775h-2.94a.56.56 0 0 0-.49.284L.077 8.887a.56.56 0 0 0 0 .567L3.18 14.83l-1.47 2.545a.56.56 0 0 0 0 .566l1.634 2.83a.57.57 0 0 0 .49.283h6.205l1.47 2.545a.57.57 0 0 0 .49.284h3.266a.57.57 0 0 0 .49-.284l3.104-5.375h2.94a.57.57 0 0 0 .49-.283l1.634-2.828a.55.55 0 0 0-.004-.568M8.733.686l1.634 2.828-1.634 2.828H21.8L20.164 9.17H7.425L5.63 6.06Zm1.306 19.801-6.205-.002 1.634-2.83h3.265L2.201 6.344h3.267q3.182 5.517 6.367 11.032zm10.124-5.66L18.53 12l-6.532 11.315-1.634-2.83c2.129-3.673 4.25-7.351 6.373-11.028h3.592l3.102 5.374z`},mimo:{hex:`#FF6900`,owner:`Xiaomi`,d:`M12 0C8.016 0 4.756.255 2.493 2.516.23 4.776 0 8.033 0 12.012c0 3.98.23 7.235 2.494 9.497C4.757 23.77 8.017 24 12 24c3.983 0 7.243-.23 9.506-2.491C23.77 19.247 24 15.99 24 12.012c0-3.984-.233-7.243-2.502-9.504C19.234.252 15.978 0 12 0zM4.906 7.405h5.624c1.47 0 3.007.068 3.764.827.746.746.827 2.233.83 3.676v4.54a.15.15 0 0 1-.152.147h-1.947a.15.15 0 0 1-.152-.148V11.83c-.002-.806-.048-1.634-.464-2.051-.358-.36-1.026-.441-1.72-.458H7.158a.15.15 0 0 0-.151.147v6.98a.15.15 0 0 1-.152.148H4.906a.15.15 0 0 1-.15-.148V7.554a.15.15 0 0 1 .15-.149zm12.131 0h1.949a.15.15 0 0 1 .15.15v8.892a.15.15 0 0 1-.15.148h-1.949a.15.15 0 0 1-.151-.148V7.554a.15.15 0 0 1 .151-.149zM8.92 10.948h2.046c.083 0 .15.066.15.147v5.352a.15.15 0 0 1-.15.148H8.92a.15.15 0 0 1-.152-.148v-5.352a.15.15 0 0 1 .152-.147Z`}};function qs(e){return Ks[e]??null}function Js(e){let t=e.replace(/\(.*?\)/g,` `).split(/[\s/_-]+/).filter(Boolean);return t.length===0?`?`:t.length===1?t[0].slice(0,2).toUpperCase():`${t[0][0]}${t[1][0]}`.toUpperCase()}var Ys=[`stable`,`dev`];function Xs(e){return typeof e==`string`&&Ys.includes(e)}function Zs(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();return Xs(t)?t:null}var Qs=[`win32`,`linux`,`darwin`],$s=[`x64`,`arm64`];function ec(e,t){let n=Zs(e)??`stable`,r=[];return n!==`stable`&&r.push(`channel=${encodeURIComponent(n)}`),t&&Qs.includes(t.platform)&&(r.push(`platform=${t.platform}`),t.arch&&$s.includes(t.arch)&&r.push(`arch=${t.arch}`)),r.length>0?`${js.releasesLatest}?${r.join(`&`)}`:js.releasesLatest}function tc(e,t){let n=Zs(t)??`stable`;return n===`stable`?e:`${e} (${n})`}var nc=5e4,rc=[`bg`,`surface`,`surface-2`,`surface-3`,`border`,`fg`,`fg-muted`,`fg-faint`,`accent`,`accent-fg`,`accent-soft`,`project`,`ok`,`ok-soft`,`warn`,`warn-soft`,`danger`,`danger-soft`,`think`,`think-soft`,`code-bg`,`user-bubble`],ic={agentFinished:!1,permissionRequired:!0,errorOccurred:!0},ac={autoAcceptPermissions:!1,showReasoningSummaries:!0,notifications:ic,showAgentPicker:!0,transcriptWindowSize:500,openTabs:[],draftTabs:[],draftTitles:{},activeTab:null,remoteTabs:{},sessionPanelOpen:!1,explorerOpen:!1,sidebarWidth:288,sidebarPinned:!0,dismissedUpdateVersion:null,lastSeenReleaseNotes:null,claudeImportOffered:!1,claudeImportOffers:0,collapsedProjects:[],themeColors:{light:{},dark:{}}};function oc(e){return Math.min(Math.max(typeof e==`number`&&Number.isFinite(e)?Math.floor(e):0,0),3)}function sc(e){return Math.min(640,Math.max(200,typeof e==`number`&&Number.isFinite(e)?Math.round(e):288))}function cc(e){return Math.min(nc,Math.max(100,typeof e==`number`&&Number.isFinite(e)?Math.round(e):500))}function lc(e,t){return typeof e==`boolean`?e:t}function uc(e){return typeof e==`string`&&e.length>0&&e.length<=64?e:null}function dc(e,t=50){if(!Array.isArray(e))return[];let n=[];for(let r of e)if(!(typeof r!=`string`||r.length===0||r.length>200)&&!n.includes(r)&&(n.push(r),n.length>=t))break;return n}function fc(e,t=50){if(typeof e!=`object`||!e||Array.isArray(e))return{};let n={};for(let[r,i]of Object.entries(e))if(!(r.length===0||r.length>200)&&!(typeof i!=`string`||i.length===0||i.length>200)&&(n[r]=i,Object.keys(n).length>=t))break;return n}function pc(e){if(typeof e!=`string`)return null;let t=e.trim();return/^#[0-9a-fA-F]{6}$/.test(t)?t.toLowerCase():null}function mc(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e)){if(!rc.includes(n))continue;let e=pc(r);e!==null&&(t[n]=e)}return t}function hc(e){let t=typeof e==`object`&&e?e:{};return{light:mc(t.light),dark:mc(t.dark)}}function gc(e){let t=typeof e==`object`&&e?e:{},n=typeof t.notifications==`object`&&t.notifications!==null?t.notifications:{},r=dc(t.openTabs),i=dc(t.draftTabs).filter(e=>!r.includes(e)),a={};for(let[e,n]of Object.entries(fc(t.draftTitles)))i.includes(e)&&(a[e]=n);let o=[...r,...i],s=t.activeTab,c=typeof s==`string`&&o.includes(s)?s:o[o.length-1]??null;return{autoAcceptPermissions:lc(t.autoAcceptPermissions,ac.autoAcceptPermissions),showReasoningSummaries:lc(t.showReasoningSummaries,ac.showReasoningSummaries),notifications:{agentFinished:lc(n.agentFinished,ic.agentFinished),permissionRequired:lc(n.permissionRequired,ic.permissionRequired),errorOccurred:lc(n.errorOccurred,ic.errorOccurred)},showAgentPicker:lc(t.showAgentPicker,ac.showAgentPicker),transcriptWindowSize:cc(t.transcriptWindowSize),openTabs:r,draftTabs:i,draftTitles:a,activeTab:c,remoteTabs:fc(t.remoteTabs),sessionPanelOpen:lc(t.sessionPanelOpen,ac.sessionPanelOpen),explorerOpen:lc(t.explorerOpen,ac.explorerOpen),sidebarWidth:sc(t.sidebarWidth),sidebarPinned:lc(t.sidebarPinned,ac.sidebarPinned),dismissedUpdateVersion:uc(t.dismissedUpdateVersion),lastSeenReleaseNotes:uc(t.lastSeenReleaseNotes),claudeImportOffered:lc(t.claudeImportOffered,ac.claudeImportOffered),claudeImportOffers:oc(t.claudeImportOffers),collapsedProjects:dc(t.collapsedProjects),themeColors:hc(t.themeColors)}}new Set(Object.keys(ac));var _c=[{version:`0.3.157`,date:`2026-09-27`,added:[`On Linux, OonaCode has its own signed apt and dnf repositories. Install the app with apt (Debian, Ubuntu, Mint) or dnf (Fedora, RHEL, Rocky, Alma) — the commands are on the download page — and your package manager keeps it up to date with the rest of the system.`,`Every Linux release is signed with the OonaCode release key, and the one-line installer checks that signature before it installs anything.`],fixed:[`On Linux, the menu bar is drawn in the window in the app’s own colours, and it switches between light and dark with the app instead of keeping the desktop’s theme until a restart.`,`Upgrading the .rpm no longer removes the oonacode command, and removing it no longer leaves empty folders behind.`]},{version:`0.3.156`,date:`2026-09-27`,added:[`Chats can talk to each other. Turn on “Talk to other chats” in a chat’s Tools menu, and its agent can find your other chats that have it on, read them, and ask them for help — one chat or a whole group. A chat that is closed wakes up to answer; a busy one answers when it finishes. The reply comes back to the chat that asked.`,`The Conversations window (in the sidebar) shows every conversation between your chats: who said what to whom, what each answer cost, and buttons to pause, resume, close or stop them all. Each conversation has a budget — 20 messages and 1,000,000 new tokens by default — and pauses itself when it is used up, so chats can never talk forever.`,`Hover over any tool in a chat’s Tools menu to read what it does, how it works, what it costs and how to turn it off.`],fixed:[`A chat woken in the background — by a scheduled task or another chat — shows as working in the sidebar even when it is not open in a tab.`,`A scheduled task no longer slips into a chat at the same moment you send it a message; yours always goes first.`,`A message sent from the terminal no longer waits forever when a chat’s history cannot be resumed and the restart fails. It now says why.`,`Notes OonaCode writes into a chat — a model change, a conversation paused — are still there when you reopen it.`,`When every Claude seat in the OonaCode pool is taken, a new chat now says the model is busy and to try again in a few minutes or pick another model, instead of “Something went wrong on our side”.`,`On Linux, the app tells you it is updating while it swaps itself, so there is no need to start it again.`,`On Linux, removing the .deb or .rpm leaves nothing running and nothing failing at the next login, and the one-line installer checks for free disk space before it changes anything.`]},{version:`0.3.155`,date:`2026-09-27`,added:[`OonaCode runs on Linux. One command installs the command line, the background service and the desktop app: curl -fsSL https://oonacode.oonak.ai/install.sh | bash. The AppImage, .deb and .rpm are on the download page too.`,`On Linux the app lives in the system tray as it does on Windows, follows your desktop’s light or dark theme, and gets its own entry in the applications menu.`,`Uninstalling on Linux removes the desktop app along with the rest, and asks whether to keep your chats for a future install.`],fixed:[`A window no longer stays on “Unauthorized” after the background service restarts with a new key. It reconnects by itself.`]},{version:`0.3.154`,date:`2026-09-26`,added:[],fixed:[`A chat waiting on a long job no longer loses its watcher. OonaCode used to close a chat’s engine ten minutes after the model last spoke, which stopped any Monitor or background command it had left running. The engine now stays up while such work runs, up to 12 hours.`,`A chat moved into a project, or whose project you edit, now follows the project’s instructions from its next message. It used to keep the ones it started with.`]},{version:`0.3.153`,date:`2026-09-25`,added:[],fixed:[`A very long chat no longer answers “Prompt is too long” after OonaCode restarts or updates. The engine was judging the chat’s size by a figure left over from before the restart, and now gets an accurate one.`,`If a message is ever refused as too long before the model has started on it, OonaCode sends it again by itself with a shorter history. You see your message once and then the answer, not an error.`]},{version:`0.3.152`,date:`2026-09-25`,added:[],fixed:[`Uninstalling the app from Windows’ Apps list no longer stops the command-line OonaCode on the same PC from starting after a restart.`]},{version:`0.3.151`,date:`2026-09-25`,added:[`Files the agent names in a chat are clickable. Audio and video play right in the chat with a small player, pictures open as a preview, and in the app every file can be opened in its own program or shown in its folder.`,`Uninstalling the app asks whether to keep your chats on this PC. Keeping them means a new install signs in and continues every chat.`],fixed:[`Installing and updating no longer fail with “The operation has timed out” on PCs whose network drops the newer internet addresses, nor while our server restarts for an update.`]},{version:`0.3.150`,date:`2026-09-25`,added:[],fixed:[`The fix in 0.3.149 for long, sleeping turns now really reaches the agent: the Monitor tool and the block on long waits are on for every chat.`,`A chat compacted after a long pause no longer pays to cache a conversation it is about to replace, and the agent keeps each tool call in its history exactly as it wrote it — both as Claude Code does.`]},{version:`0.3.149`,date:`2026-09-25`,added:[`The agent can watch a long job with the Monitor tool, as Claude Code does, and is woken the moment the job finishes.`],fixed:[`Long chats no longer spend their time asleep. With no way to watch a background job, the agent had been polling it with waits of four to eight minutes. One chat spent more than three and a half hours of a day sleeping, and turns ran for hours while the model worked for a fraction of that. The agent now gets the same working rules as Claude Code, and long waits are blocked.`]},{version:`0.3.148`,date:`2026-09-25`,added:[],fixed:[`A scheduled task that could not be sent — the PC had just restarted, the vault was still locked, the server was not reachable yet — waits and tries again instead of switching itself off. Pausing, editing or deleting a task while its prompt is being sent is no longer undone, and a scheduled prompt no longer lands in a chat whose engine is still starting.`,`A chat on your own DeepSeek key, or one switched with a typed “/model opus”, is no longer shown as withdrawn and locked. “/model fable” picks Claude Fable instead of the default model.`,`Moving a chat to another model no longer lowers its saved effort level to what the old model offered, and a one-off “oona --effort” is no longer saved as the chat’s level.`,`After you pick another model for a locked chat and send, the chat no longer flashes the lock again while the engine starts; if the start fails, your pick is kept.`,`Coming back from a file tab no longer jumps the chat to an old reply or reopens the search bar.`,`The hidden sidebar slides away again when the pointer leaves the window past its edge, and the keyboard no longer tabs through it while it is hidden. Clicking ⓘ in Settings opens its note instead of closing it.`,`Subagents write their prompt cache for five minutes, as Claude Code does for its subscribers; the chat itself keeps the hour. Their cache writes cost less.`]},{version:`0.3.147`,date:`2026-09-25`,added:[`A chat’s scheduled tasks sit beside its subagents: a clock badge says how many are live and when the next one runs, and opens the list — each task’s schedule, its next and last run, Pause and Delete. The tasks run on this PC.`],fixed:[`A prompt the scheduler sends into a chat reads as a “Scheduled task” line, not as your own message waiting in the queue.`,`A chat whose model is no longer offered shows that model in red and waits for you to pick another; its history stays, and the old model is not in the list any more.`,`The effort list follows the server within minutes, without restarting the app. A chat set to a level that has been switched off moves to the nearest one — ultracode becomes xhigh. Chats on your own Claude subscription have an effort picker again.`]},{version:`0.3.146`,date:`2026-09-25`,added:[`A Tools menu beside the model picker: switch OonaCode’s own tools on or off for each chat — browser, desktop and window control, clipboard, screen capture, Office documents and run-as-administrator. Each tool costs the model only a short line until it is used, and the menu shows how much. The first tools are marked Demo while they are tested with every model: a demo tool answers what it would have done, and does nothing on your PC yet.`],fixed:[]},{version:`0.3.145`,date:`2026-09-25`,added:[],fixed:[`Every request of every chat, on every model, is about 3,200 tokens smaller: the engine’s own “auto memory” instructions are gone. OonaCode starts each engine in a fresh private folder and deletes it afterwards, so the notes the model was told to keep there were thrown away when the chat went idle — the model spent tool calls writing memories it would never read. A project’s memory is OonaCode’s own and stays.`,`The engine’s claude.ai Artifact tools are switched off everywhere OonaCode runs it — the app, the terminal, VS Code, the phone, Telegram and the agent API.`]},{version:`0.3.144`,date:`2026-09-25`,added:[],fixed:[`Long chats on Claude models in the OonaCode pool keep their cache for an hour, as Claude Code does for its subscribers. A pause of more than five minutes no longer re-sends the whole conversation at the full cache-write price, which in a large chat was the most expensive part of coming back to it.`,`The session panel’s Context shows how big the conversation is now, not the total of every request the chat ever made — a long chat read “10.7M / 1.0M tokens”.`,`The message box keeps the cursor after you send, so you can go straight on typing the next message.`,`A paid chat’s background work (titles, reading web pages) no longer goes to a free model of the same vendor.`]},{version:`0.3.143`,date:`2026-09-24`,added:[`Search inside your chats: open the search in the chat list, press the sliders button and choose Whole chats. It looks through every message of every chat on this PC, and you choose whose words — yours, the model’s, or both — plus, if you like, the tools’ commands and output and the subagents’ conversations. Results show each message with the words lit; a click opens the chat with its search on them.`,`More search options, for both kinds of search: one project only, a time window (today, 7 or 30 days), match case and whole words.`],fixed:[`While you search the chat list, projects with no matching chat are hidden too.`]},{version:`0.3.142`,date:`2026-09-24`,added:[],fixed:[`A reply you sent shows as the same small chip it had in the message box — “Reply to” and the first few words — instead of the whole quoted text; the full quote appears when you rest the pointer on it, and a click jumps to the message it answers.`,`The model now knows a reply points back into the conversation: it is told the quoted lines are from the chat history, not new input, and whose words they were — its own earlier reply, your earlier message, a file, or a tool’s output.`,`When the chat list is narrow, its buttons wrap onto a second line instead of spilling out of it.`]},{version:`0.3.141`,date:`2026-09-24`,added:[`The chat list on the left can be made wider or narrower: drag its right edge (double-click it for the usual width).`,`The chat list can hide: press the pin in its header, the button at the top left, or View → Sidebar (Ctrl+B). While hidden it slides in when the pointer reaches the left edge of the window, and slides away when you leave it.`,`Search in the chat list is a single magnifier now; click it and the search box opens across the top. Escape or × clears it.`],fixed:[`Opening OonaCode right after a restart no longer leaves the OonaCode pool models out of the model list: if they cannot be read yet, OonaCode asks again by itself a few seconds later and the list fills in.`,`The Artificial Analysis scores (intelligence, coding, speed and benchmarks) show on every model in the model list again — including the models of your own Claude and SuperGrok subscriptions, which never had them.`,`A chat’s details card no longer appears on top of its right-click menu.`]},{version:`0.3.140`,date:`2026-09-24`,added:[`Reply is tidier: the message you reply to shows as a small chip above the message box with its first few words, instead of filling the box. Click the chip — or the quote in a sent reply — to jump to that message; the × removes it.`,`Right-click a project in the sidebar for its settings: Project settings… opens Projects with that project already selected. The gear beside a project’s “+” does the same, and a chat filed in a project offers it in its own menu too.`,`Link GitHub. Under a project’s Repositories (and in Settings → Providers), link your GitHub account once: the agent’s git and gh then clone, pull and push your private repositories on every PC of yours. You type a short code on github.com; the token stays in your encrypted vault and never reaches the OonaCode server. Public repositories need nothing.`],fixed:[]},{version:`0.3.139`,date:`2026-09-24`,added:[`Every setting now says what it does, and resting the pointer on the ⓘ beside it tells you where in OonaCode it applies and what it does not do.`,`Export chats… is in the File menu (and on the sidebar in a browser window) instead of in Settings.`,`With Remote access turned off on a PC, your phone, Telegram, the website and your other PCs still show it — online or not — marked “remote access off”, and opening it tells you to turn Remote access back on in OonaCode on that PC.`],fixed:[`Turning Remote access off now tells your other devices at once. Before, the PC was already unreachable from them, but they could not say why.`,`The settings of This PC save the moment you change them — nothing is lost by closing the dialog.`,`Settings that did nothing, or repeated another one, are gone: the default permission mode (each chat’s Build / Plan / Ask first picker decides), the agent-picker switch, the Git Bash path, the engine path and the extra allowed origins. The server address is shown, not edited — signing in sets it.`]},{version:`0.3.138`,date:`2026-09-24`,added:[`Projects have settings now, like the Claude app’s: a goal, the repositories the project works on, what a new chat in it starts on (model, effort and folder), a project memory the agent keeps up to date, and whether its chats may schedule work — and how often at most. All of it is in Projects, and a Claude app project you import brings its own.`,`OonaCode has a scheduler. Ask the agent to do something later or on a repeat — “check the build every morning at nine” — and it schedules it on this PC; when it is due, the prompt arrives in the chat, even if the chat had gone quiet. The Projects dialog and the chat’s info panel list what is scheduled, where you can pause, resume or delete it.`],fixed:[`Saving a project’s instructions now reaches its chats at their next message, instead of waiting until the chat happened to restart.`]},{version:`0.3.137`,date:`2026-09-24`,added:[],fixed:[`After a PC restart the app could ask for a "host token" and sign you out: two copies of the OonaCode background service started at once and fought over your session. Only one ever runs now, and the app never shows the token page — if its service is replaced it reconnects by itself.`,`The unlock screen stays put until you unlock, and says what went wrong in place — a wrong password, or a connection it is re-establishing — instead of jumping to another page.`,`A message with a picture sent while the agent was working stayed “queued”, and removing it said it was already sent. It now shows as read the moment the agent takes it, and a reopened chat shows it with its picture.`,`In the model’s questions, typing your own answer now clears the options you had picked, and picking an option clears what you typed — the answer sent is exactly the one you chose. The same on the phone, in the terminal and in Telegram.`]},{version:`0.3.136`,date:`2026-09-24`,added:[`Every model now has its own housekeeper — the small, fast model of the same maker that writes a chat’s titles and reads the web pages it fetches. On the OonaCode pool a MiMo v2.6 Pro chat uses MiMo v2.6 Flash, a Qwen chat Qwen3.8 Flash, a GLM chat GLM-5.3 Flash and a GPT-5 chat GPT-5 mini, instead of doing that work on the big model itself. A free model keeps its own, so it stays free.`],fixed:[]},{version:`0.3.135`,date:`2026-09-24`,added:[],fixed:[`Claude models on the OonaCode pool — Opus 5.5, Opus 5, Sonnet 5 and Fable 5.1 — now use their whole 1M context. A long chat no longer stops to summarise itself every ~170k tokens, and its subagents get the same window.`,`Reading a web page is quick again in a Claude chat: pages are read by Claude Haiku, as in Claude Code, instead of a helper that took about a minute a page.`,`Changing a chat’s model now moves its subagents and background helpers to the new model too; before, they stayed on the old one until the app restarted.`,`MiMo v2.5 and v2.5 Pro chats now use their full 1M context too.`]},{version:`0.3.134`,date:`2026-09-23`,added:[],fixed:[`On the Android app, the model’s questions can be answered again. They come one at a time — “Question 2 of 3” — with Back, Next and Skip, and Answer sends them to your PC. The card used to show only the first question, hide the rest below it and wait for all of them, so it could not be sent.`]},{version:`0.3.133`,date:`2026-09-23`,added:[`Bring your Claude desktop app projects across: File → Import chats from other coding agents now lists every project the Claude app has opened on this PC. Each one arrives as an OonaCode project of the same name — its goal, instructions and what Claude noted about it become the project’s instructions — with its project chat and one chat per thread filed under it, ready to carry on.`,`A Claude Code chat you moved into a Claude app project is filed under that project here too.`,`A thread you never opened in the Claude app still comes across, with its task and every reply the project chat saw; open it once in the Claude app and import again for its whole conversation.`],fixed:[`Cursor chats appear in the import list again — they had been left out since September 10.`]},{version:`0.3.132`,date:`2026-09-23`,added:[`Reply to any part of a chat: select some text (or just right-click a block), choose Reply, and it is quoted in your message box — type your answer under it. A quote from a file the agent read names the file.`,`Right-click in a chat: copy what you selected, copy a whole reply or tool output, copy a code block or a link, find the selected words in the chat, or select a block.`,`Search in a chat opens the block its match is in — a folded tool card, a thought, a finished agent’s work — and scrolls to the words themselves.`,`Search matches are now bright orange, the current one strongest, so they stand out on code too.`,`The file viewer shows pictures (PNG, JPEG, GIF, WebP, SVG and more), plays audio and video, and shows Markdown formatted, with a switch to the source.`,`Right-click a file or folder in the explorer to copy its path or delete it.`],fixed:[`Moving a chat to another folder or project while it was working could delete the folder it was working in, start two agents at once, or send your next message to the old folder.`,`The working line no longer says a chat may be stuck while it waits for your approval or answer, or right after you send a message, and it counts time correctly (no more "4m 60s").`,`A date line no longer says "Today" for yesterday’s messages when the app stays open past midnight.`,"Installing with npm (`npm i -g oonacode`) installs this version again; earlier npm releases carried an old program.",`The What’s new window could open again on the next start, showing the same update a second time.`,`An older OonaCode window or VS Code extension no longer resets settings it does not know about, such as your theme colours or which project groups you folded.`,`A new install no longer opens with a list of changes; this window now appears only after an update.`,`The notification switch for permissions now says it also covers the agent’s questions.`]},{version:`0.3.131`,date:`2026-09-23`,added:[`Claude Opus 5.5 is here — the newest Opus, and cheaper to run than Opus 5. Choose it in the model picker, from the OonaCode pool or on your own Claude subscription. It runs on the newer Claude Code engine (2.1.280) that this update brings.`,`Every block in a chat shows its time at the bottom right, in your local time — hover it for the full date — and a date line marks where each day starts.`,`A running chat tells you how long the agent has been quiet, and after five minutes that it may be stuck and what to do.`,`After every update, OonaCode now opens this window to show you what changed.`],fixed:[`A reply that streamed in live had no time on it until the chat was opened again.`,`Chats open in tabs could fail to come back after a restart if a setting changed while they were being restored.`]}];function vc(e,t){let n=e=>{let[t,...n]=e.trim().replace(/^v/,``).split(`-`);return{nums:(t??``).split(`.`).map(e=>Number.parseInt(e,10)||0),pre:n.length>0?n.join(`-`):null}},r=n(e),i=n(t);for(let e=0;e<Math.max(r.nums.length,i.nums.length);e++){let t=(r.nums[e]??0)-(i.nums[e]??0);if(t!==0)return t}return r.pre===i.pre?0:r.pre===null?1:i.pre===null?-1:yc(r.pre,i.pre)}function yc(e,t){let n=e.split(`.`),r=t.split(`.`);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e],i=r[e];if(t===i)continue;if(t===void 0)return-1;if(i===void 0)return 1;let a=/^\d+$/.test(t),o=/^\d+$/.test(i);if(a&&o){let e=Number(t)-Number(i);if(e!==0)return e;continue}return a===o?t<i?-1:1:a?-1:1}return 0}function bc(e,t,n=_c){if(!e||e===`0.0.0`)return[];let r=n.filter(t=>vc(t.version,e)<=0);return[...t===null?r.filter(t=>vc(t.version,e)===0):r.filter(e=>vc(e.version,t)>0)].sort((e,t)=>vc(t.version,e.version))}function xc(e,t,n,r=_c){if(!e||e===`0.0.0`)return{record:null,show:[]};let i=null;for(let e of r)(i===null||vc(e.version,i)>0)&&(i=e.version);let a=i!==null&&vc(e,i)>0?i:e;return{record:t===null||vc(a,t)>0?a:null,show:t===null&&!n?[]:bc(e,t,r)}}function Sc(e,t){if(t==null)return[...e];if(t.length===0)return[];let n=new Set(t),r=e.filter(e=>n.has(e.id));return r.length>0?r:[...e]}var Cc=`the user skipped the question`,wc=`(the user skipped this question)`;function Tc(e){let t=e?.questions;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=e;if(typeof t.question!=`string`)continue;let r=Array.isArray(t.options)?t.options.map(e=>e&&typeof e==`object`?e:null).filter(e=>e!==null&&typeof e.label==`string`).map(e=>({label:e.label,...typeof e.description==`string`?{description:e.description}:{}})):[];n.push({question:t.question,header:typeof t.header==`string`?t.header:``,options:r,multiSelect:t.multiSelect===!0})}return n}function Ec(e,t,n={},r=new Set){let i={};return e.forEach((e,a)=>{if(r.has(a)){i[e.question]=wc;return}let o=(n[a]??``).trim();i[e.question]=o||(t[a]??[]).join(`, `)}),i}var Dc=[`win32`,`linux`,`darwin`],Oc=[`demo`,`live`],kc=[`allow`,`ask`],Ac=[`string`,`number`,`integer`,`boolean`,`array`,`object`];function jc(e,t){let n=t?.[e.slug];return typeof n==`boolean`?n:e.defaultOn}function Mc(e,t){return e.filter(e=>jc(e,t))}var Nc={slug:48,name:80,entryTool:40,description:2e3,promptLine:1e3,details:8e3,actionDescription:1e3,params:30,paramName:48,paramDescription:400,enumValues:40,callArgKeys:20,callError:500,callBatch:100},Pc=/^[A-Za-z0-9_-]+$/;function Fc(e){return typeof e==`string`&&e.length>0&&e.length<=Nc.entryTool&&Pc.test(e)}function Ic(e){return Math.ceil(e.length/4)}function Lc(e){return Ic(`${e.entryTool} ${e.description}`)+55}var Rc=V({type:Ho(Ac),required:To().optional(),enum:jo(Po([z(),xo()])).optional(),description:z().optional()}),zc=V({slug:z().min(1),description:z(),params:Bo(z(),Rc),permission:Ho(kc),sort:xo()}),Bc=V({version:z(),url:z(),sha256:z(),sizeBytes:xo(),exe:z(),format:Wo(`zip`)}),Vc=V({slug:z().min(1),name:z(),entryTool:z().refine(Fc,`not a valid tool name`),description:z(),promptLine:z().nullable(),details:z().nullable().optional(),status:Ho(Oc),defaultOn:To(),sort:xo(),install:Bc.nullable(),actions:jo(zc)}).loose();V({platform:Ho(Dc),version:z(),packs:jo(Vc),refreshMinutes:xo()}),[`**Let this chat work together with your other chats.**`,``,`### What it does`,`- Finds your other chats on this PC and reads their recent messages.`,`- Sends one chat, or a group of chats, a message or a task.`,`- Brings their answers back to this chat, by itself.`,``,`### How it works`,`- A chat that is asleep is woken from its saved history. A busy one gets the message when its current turn ends, never in the middle of it.`,`- The other chat does the work with its own model, folder and tools. When it finishes, its answer comes back here as a new message.`,`- Several chats can share one conversation (a group). An answer goes only to the chat that asked, so a group cannot multiply its own messages.`,``,`### What it costs`,`- About 600 tokens on every request while it is on, read from the prompt cache.`,`- Every message makes the chat that receives it do a turn, which spends its own tokens.`,`- Switching it on or off in a chat that already has a conversation re-writes its prompt cache once.`,``,`### Safety limits`,`- Each conversation has a budget: 20 delivered messages and 1,000,000 new tokens by default (context read back from the prompt cache is not counted). Reaching either pauses the conversation, and the chats say so.`,`- A chain stops after 3 hops (a message caused by a message caused by a message).`,`- At most 5 messages between two chats and 20 from one chat in 10 minutes, and 10 waiting for any one chat. A chat cannot message itself.`,`- A conversation with no activity for 24 hours closes by itself.`,``,`### How to stop it`,`- Turn this switch off: the chat loses these tools, and its part in every conversation pauses.`,`- Or open the Conversations window and use Pause, Close or Stop all.`,``,`### Privacy`,`- Everything stays on your PC: the messages are kept in this PC's database, never on OonaCode's server.`,`- A message never grants anything. The other chat runs with its own permissions and asks you as usual.`,``,`Only chats that have this switch on can reach each other.`].join(`
|
|
78
78
|
`);var Hc={hops:3,rateWindowMs:6e5,perPair:5,perSender:20,pendingPerTarget:10,idleCloseMs:864e5,messageChars:2e4,titleChars:80,conversationTitleChars:120,recipients:10,listChats:50,readMessages:50,budgetMessagesMax:1e4,budgetTokensMax:1e9},Uc={message:`✉️ Message from chat "`,reply:`↩️ Reply from chat "`,continue:`↻ Continue the message from chat "`},Wc=`⚠ `,Gc=`<local-command-stdout>`,Kc=`</local-command-stdout>`,qc=/^[A-Za-z0-9._:-]{1,128}$/,Jc=/^\[conv:(\S+) chat:(\S+) host:(\S+) msg:(\S+?)(?: reply-to:(\S+?))?( reply expected)?\]$/;function Yc(e){if(typeof e!=`string`)return null;let t=e;t.startsWith(Gc)&&t.endsWith(Kc)&&(t=t.slice(22,t.length-23)),t=t.replace(/\r\n/g,`
|
|
79
79
|
`);let n=t.indexOf(`
|
|
80
80
|
`);if(n<0)return null;let r=t.slice(0,n),i=t.slice(n+1),a=i.indexOf(`
|
|
@@ -141,4 +141,4 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
141
141
|
- push to the feature branch, never to main
|
|
142
142
|
- run the tests before saying a change is done
|
|
143
143
|
- use the browser on port 9170 for anything on the web`,maxLength:zs.instructions,"data-testid":`project-instructions`})})]}),(0,U.jsxs)(wk,{title:`Repositories`,children:[(0,U.jsx)(cm,{label:`One per line (optional)`,hint:`Every chat in the project is told about them.`,children:(0,U.jsx)(`textarea`,{className:H(Y,`h-16 font-mono text-xs`),value:u.repositories,onChange:e=>g(`repositories`,e.target.value),placeholder:`https://github.com/you/app`,"data-testid":`project-repositories`})}),(0,U.jsx)(Sk,{compact:!0})]}),(0,U.jsxs)(wk,{title:`New chats`,children:[(0,U.jsx)(cm,{label:`Model`,hint:`What a new chat in this project starts on.`,children:(0,U.jsxs)(`select`,{className:Y,value:u.model,onChange:e=>{g(`model`,e.target.value),g(`effort`,``)},"data-testid":`project-model`,children:[(0,U.jsx)(`option`,{value:``,children:`Whatever a new chat would start on`}),x?(0,U.jsxs)(`option`,{value:u.model,children:[x.model,` (not on this PC)`]}):null,y.map(e=>(0,U.jsx)(`option`,{value:e.key,children:e.label},e.key))]})}),S.length>0?(0,U.jsx)(cm,{label:`Effort`,children:(0,U.jsxs)(`select`,{className:Y,value:u.effort,onChange:e=>g(`effort`,e.target.value),"data-testid":`project-effort`,children:[(0,U.jsx)(`option`,{value:``,children:`Default`}),S.map(e=>(0,U.jsx)(`option`,{value:e,children:e},e))]})}):null,(0,U.jsx)(cm,{label:`Folder`,hint:`Where a new chat runs; left empty, each chat gets its own.`,children:(0,U.jsxs)(`div`,{className:`flex gap-2`,children:[(0,U.jsx)(`input`,{className:H(Y,`flex-1 font-mono text-xs`),value:u.cwd,onChange:e=>g(`cwd`,e.target.value),placeholder:s,"data-testid":`project-cwd`}),window.oonacode?.pickDirectory?(0,U.jsx)(q,{size:`sm`,variant:`ghost`,onClick:()=>void D(),children:`Choose…`}):null]})})]}),(0,U.jsxs)(wk,{title:`Memory`,children:[(0,U.jsxs)(`label`,{className:`flex items-start gap-2 text-sm`,children:[(0,U.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:u.memoryEnabled,onChange:e=>g(`memoryEnabled`,e.target.checked),"data-testid":`project-memory-enabled`}),(0,U.jsx)(`span`,{children:`Keep a project memory — notes every chat of the project reads at its start, and the agent keeps up to date.`})]}),u.memoryEnabled?(0,U.jsx)(`textarea`,{className:H(Y,`h-28 font-mono text-xs`),value:u.memory,onChange:e=>g(`memory`,e.target.value),placeholder:`Nothing noted yet.`,maxLength:zs.memory,"data-testid":`project-memory`}):null]}),(0,U.jsxs)(wk,{title:`Scheduled tasks`,children:[(0,U.jsxs)(`label`,{className:`flex items-start gap-2 text-sm`,children:[(0,U.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:u.tasksEnabled,onChange:e=>g(`tasksEnabled`,e.target.checked),"data-testid":`project-tasks-enabled`}),(0,U.jsx)(`span`,{children:`The agent may schedule work in this project's chats — once, or on a repeat — with OonaCode's scheduler on this PC.`})]}),u.tasksEnabled?(0,U.jsx)(cm,{label:`Shortest repeat, in minutes`,children:(0,U.jsx)(`input`,{className:H(Y,`w-28`),inputMode:`numeric`,value:u.minInterval,onChange:e=>g(`minInterval`,e.target.value),"data-testid":`project-min-interval`})}):null,_?(0,U.jsx)(jO,{projectId:_.id,showChat:!0}):null]}),(0,U.jsx)(`p`,{className:`text-xs text-fg-muted`,children:`Saved settings reach the project's chats at their next message. Projects live in your vault: only your own devices can read them.`})]})]})})}var Ek=`(min-width: 768px)`;function Dk(){return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(Ek).matches}function Ok(){let[e,t]=(0,v.useState)(Dk);return(0,v.useEffect)(()=>{if(typeof window>`u`||typeof window.matchMedia!=`function`)return;let e=window.matchMedia(Ek),n=()=>t(e.matches);return n(),e.addEventListener?.(`change`,n),()=>e.removeEventListener?.(`change`,n)},[]),e}function kk(e){try{return!!e?.matches(`:hover`)}catch{return!1}}function Ak(e){if(typeof document>`u`)return!1;if(document.querySelector(`[role="menu"], [role="dialog"]`))return!0;let t=document.activeElement;return!!(e&&t&&e.contains(t)&&t.tagName===`INPUT`)}function jk({hidden:e,children:t}){let{state:n,actions:r}=W(),i=n.prefs.sidebarPinned,a=n.ui.sidebarOpen,[o,s]=(0,v.useState)(null),c=o??n.prefs.sidebarWidth,[l,u]=(0,v.useState)(!1),d=Ok(),f=(0,v.useRef)(null),p=(0,v.useRef)(null),m=(0,v.useCallback)(()=>{p.current!==null&&(clearTimeout(p.current),p.current=null)},[]),h=(0,v.useCallback)(()=>{m(),p.current=setTimeout(function e(){if(Ak(f.current)){p.current=setTimeout(e,350);return}p.current=null,!kk(f.current)&&u(!1)},350)},[m]);(0,v.useEffect)(()=>m,[m]),(0,v.useEffect)(()=>{u(!1),m()},[i,m]);let g=e=>{e.preventDefault();let t=e.clientX,i=c,a=i,o=e=>{a=sc(i+(e.clientX-t)),s(a)},l=()=>{window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,l),document.body.style.cursor=``,document.body.style.userSelect=``,s(null),a!==n.prefs.sidebarWidth&&r.savePrefs({sidebarWidth:a})};document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,l)},_=i||l;return(0,U.jsxs)(U.Fragment,{children:[!i&&!l&&!e?(0,U.jsx)(`div`,{className:`absolute inset-y-0 left-0 z-40 hidden w-2 md:block`,onMouseEnter:()=>{u(!0),h()},"aria-hidden":!0,"data-testid":`sidebar-hover-edge`}):null,(0,U.jsxs)(`aside`,{ref:f,"data-chrome":`sidebar`,hidden:e,inert:!e&&(d?!_:!a),"data-testid":`sidebar-frame`,"data-state":i?`docked`:l?`peek`:`hidden`,style:{"--sidebar-w":`${c}px`},onMouseEnter:i?void 0:m,onMouseLeave:i?void 0:h,className:H(`absolute inset-y-0 left-0 z-30 w-72 max-w-[85vw] border-r border-border bg-surface transition-transform md:w-[var(--sidebar-w)] md:max-w-[70vw]`,a?`translate-x-0`:`-translate-x-full`,i?`md:relative md:z-auto md:translate-x-0`:H(`md:z-40 md:shadow-2xl`,_?`md:translate-x-0`:`md:-translate-x-full`)),children:[t,(0,U.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the session list`,title:`Drag to resize · double-click for the default width`,className:`absolute inset-y-0 -right-1 z-10 hidden w-2 cursor-col-resize hover:bg-accent/30 md:block`,onPointerDown:g,onDoubleClick:()=>void r.savePrefs({sidebarWidth:288}),"data-testid":`sidebar-resize`})]})]})}function Mk({open:e,onClose:t}){return(0,U.jsx)(um,{open:e,title:`Export my chats`,onClose:t,children:(0,U.jsx)(Nk,{onDone:t})})}function Nk({onDone:e}){let{api:t,state:n}=W(),[r,i]=(0,v.useState)(``),[a,o]=(0,v.useState)(!1),[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(0),p=n.sessionsTotal||n.sessions.length;(0,v.useEffect)(()=>{if(!a){f(0);return}let e=Date.now(),t=setInterval(()=>f(Math.floor((Date.now()-e)/1e3)),1e3);return()=>clearInterval(t)},[a]);let m=async()=>{if(!t.exportSessionsArchive){c(`this PC is running an older OonaCode that cannot export chats`);return}o(!0),c(null);try{let n=await t.exportSessionsArchive(r),a=URL.createObjectURL(n),o=document.createElement(`a`);o.href=a,o.download=`oonacode-chats-${new Date().toISOString().slice(0,10)}.zip`,o.click(),URL.revokeObjectURL(a),i(``),u(!1),e()}catch(e){c(e instanceof Error?e.message:`the export failed`)}finally{o(!1)}};return(0,U.jsxs)(`div`,{children:[(0,U.jsx)(um,{open:a,title:`Exporting your chats`,onClose:()=>void 0,children:(0,U.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,U.jsx)(K.Spinner,{className:`mt-0.5 w-5 h-5 shrink-0 text-accent`}),(0,U.jsxs)(`div`,{className:`min-w-0 text-sm`,children:[(0,U.jsxs)(`div`,{className:`font-medium`,children:[`Packing`,` `,p>0?`${p} chat${p===1?``:`s`}`:`your chats`,`…`]}),(0,U.jsxs)(`div`,{className:`mt-1 tabular text-fg-muted`,children:[Math.floor(d/60),`:`,String(d%60).padStart(2,`0`),` elapsed`]}),(0,U.jsx)(`p`,{className:`mt-2 text-xs text-fg-faint`,children:`Your PC writes the whole archive before the download starts, so nothing appears in your downloads until it is finished. A long history can take a minute or two — this is normal, and you do not need to press anything again.`})]})]})}),(0,U.jsxs)(`p`,{className:`text-sm text-fg-muted`,children:[`One zip with a plain `,(0,U.jsx)(`code`,{children:`.txt`}),` of every conversation on this PC, plus an index. It is for reading and copying from — there is no way to load it back in.`]}),(0,U.jsx)(`p`,{className:`mt-1 text-xs text-warn`,children:`The zip is not encrypted: anyone who opens it can read every conversation in it.`}),l?(0,U.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,U.jsx)(`input`,{type:`password`,autoFocus:!0,className:Y+` max-w-[16rem]`,placeholder:`Account password`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&r&&m()},"data-testid":`export-chats-password`}),(0,U.jsx)(q,{onClick:()=>void m(),disabled:a||!r,children:a?`Exporting…`:`Export`}),(0,U.jsx)(q,{variant:`ghost`,onClick:()=>{u(!1),i(``),c(null)},children:`Cancel`})]}):(0,U.jsx)(q,{className:`mt-2`,onClick:()=>u(!0),"data-testid":`export-chats`,children:`Export chats…`}),s?(0,U.jsx)(`div`,{className:`mt-2 text-xs text-danger`,children:s}):null]})}function Pk({open:e,selectId:t=null,onClose:n}){let{state:r,actions:i}=W(),a=r.conversationsChange,[o,s]=(0,v.useState)(null),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(!1),[f,p]=(0,v.useState)(null),[m,h]=(0,v.useState)(null),[g,_]=(0,v.useState)(!1),[y,b]=(0,v.useState)(!1),x=(0,v.useRef)(null);x.current=f;let S=(0,v.useRef)(-1),C=(0,v.useCallback)(async()=>{let e=await i.listConversations();if(e===`unsupported`){l(!0);return}if(e===null){d(!0);return}l(!1),d(!1),s(e)},[i]),w=(0,v.useCallback)(async e=>{let t=await i.conversationHistory(e);t&&x.current===e&&h(t)},[i]);(0,v.useEffect)(()=>{e&&(S.current=a.seq,_(!1),p(t??null),C())},[e]),(0,v.useEffect)(()=>{!e||f!==null||!o||o.length===0||p(o[0].id)},[e,o,f]),(0,v.useEffect)(()=>{if(!e||!f){h(null);return}h(e=>e?.conversation.id===f?e:null),w(f)},[e,f,w]),(0,v.useEffect)(()=>{if(!e||a.seq===S.current)return;S.current=a.seq,C();let t=x.current;t&&(a.conversationIds===null||a.conversationIds.includes(t))&&w(t)},[e,a,C,w]);let T=e=>{s(t=>t?.map(t=>t.id===e.id?e:t)??t),h(t=>t&&t.conversation.id===e.id?{...t,conversation:e}:t)},E=async(e,t,n)=>{let r=await i.conversationAction(e,t,n);return r&&T(r),r!==null},D=async()=>{b(!0);try{await i.stopAllConversations()}finally{b(!1),_(!1)}C(),x.current&&w(x.current)},O=async e=>{await i.cancelChatMessage(e.id),x.current&&w(x.current)},ee=(0,v.useCallback)((e,t,n=[])=>{if(!e)return t??`OonaCode`;let i=n.find(t=>t.sessionId===e);if(i?.title)return i.title;if(t)return t;let a=r.sessions.find(t=>t.id===e);return a?bd(a):`a chat`},[r.sessions]),k=m&&m.conversation.id===f?m.conversation:o?.find(e=>e.id===f)??null;return(0,U.jsxs)(um,{open:e,title:`Conversations`,onClose:n,wide:!0,footer:(0,U.jsx)(q,{variant:`ghost`,onClick:n,children:`Close`}),children:[(0,U.jsxs)(`div`,{className:`mb-3 flex flex-wrap items-center gap-2`,children:[(0,U.jsxs)(`p`,{className:`min-w-0 flex-1 text-xs text-fg-muted`,children:[`Messages and tasks your chats send each other, on this PC.`,` `,(0,U.jsx)(om,{label:`Conversations`,details:sf.window})]}),c?null:(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,U.jsxs)(q,{variant:`danger`,size:`sm`,onClick:()=>_(!0),disabled:g||y,title:sf.stopAll,"data-testid":`conversations-stop-all`,children:[(0,U.jsx)(K.Stop,{className:`h-3 w-3`}),` Stop all conversations`]}),(0,U.jsx)(om,{label:`Stop all conversations`,details:sf.stopAll})]})]}),g?(0,U.jsxs)(`div`,{className:`mb-3 flex flex-wrap items-center gap-2 rounded-md border border-danger/40 bg-danger-soft px-3 py-2 text-xs text-danger`,role:`alertdialog`,"aria-label":`Stop all conversations?`,"data-testid":`conversations-stop-confirm`,children:[(0,U.jsx)(`span`,{className:`min-w-0 flex-1`,children:`Pause every conversation and stop the turns they are running now? Nothing is deleted; you can resume each one.`}),(0,U.jsx)(q,{size:`sm`,variant:`ghost`,onClick:()=>_(!1),children:`Cancel`}),(0,U.jsx)(q,{size:`sm`,variant:`danger`,busy:y,onClick:()=>void D(),"data-testid":`conversations-stop-confirm-yes`,children:`Stop all`})]}):null,c?(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,"data-testid":`conversations-unsupported`,children:`OonaCode on this PC is too old for conversations between chats. Update it, then open this window again.`}):o===null?(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,"data-testid":`conversations-loading`,children:u?`Could not read the conversations from this PC right now. They show here as soon as it answers.`:`Loading…`}):o.length===0?(0,U.jsxs)(`div`,{className:`space-y-1 text-sm text-fg-muted`,"data-testid":`conversations-empty`,children:[(0,U.jsx)(`p`,{children:`No conversations yet.`}),(0,U.jsx)(`p`,{className:`text-xs`,children:`To start one, turn on "Talk to other chats" in the Tools menu of two chats, then ask one of them to send the other a message or a task.`})]}):(0,U.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-[260px_1fr]`,children:[(0,U.jsx)(`ul`,{className:`flex max-h-[65vh] flex-col gap-1 overflow-y-auto pr-1`,"data-testid":`conversations-list`,children:o.map(e=>(0,U.jsx)(`li`,{children:(0,U.jsx)(Lk,{c:e,selected:e.id===f,onSelect:()=>p(e.id)})},e.id))}),(0,U.jsx)(`div`,{className:`max-h-[65vh] min-w-0 overflow-y-auto pr-1`,children:k?(0,U.jsx)(Vk,{c:k,messages:m&&m.conversation.id===k.id?m.messages:null,titleOf:ee,onAction:(e,t)=>E(k.id,e,t),onWithdraw:e=>void O(e),onOpenChat:e=>{n(),i.selectSession(e)},isLocalChat:e=>r.sessions.some(t=>t.id===e)},k.id):(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`Choose a conversation.`})})]})]})}function Fk({c:e}){return(0,U.jsx)(`span`,{title:sf.status,"data-testid":`conversation-status`,children:(0,U.jsx)(X,{tone:Zd(e.status),children:Xd[e.status]})})}function Ik({label:e,used:t,budget:n,format:r=e=>e.toLocaleString()}){let i=rf(t,n),a=i>=1?`bg-danger`:i>=.8?`bg-warn`:`bg-accent`;return(0,U.jsxs)(`div`,{className:`mt-1`,"data-testid":`usage-${e.toLowerCase()}`,children:[(0,U.jsxs)(`div`,{className:`flex justify-between gap-2 text-[11px] text-fg-muted`,children:[(0,U.jsx)(`span`,{children:e}),(0,U.jsxs)(`span`,{"data-testid":`usage-numbers`,children:[r(t),` of `,r(n)]})]}),(0,U.jsx)(`div`,{className:`h-1.5 overflow-hidden rounded-full bg-surface-3`,role:`progressbar`,"aria-label":`${e} used`,"aria-valuemin":0,"aria-valuemax":n,"aria-valuenow":t,children:(0,U.jsx)(`div`,{className:H(`h-full rounded-full`,a),style:{width:`${Math.round(i*100)}%`}})})]})}function Lk({c:e,selected:t,onSelect:n}){let r=e.members.filter(e=>e.leftAt===null);return(0,U.jsxs)(`button`,{type:`button`,onClick:n,"aria-pressed":t,className:H(`w-full rounded-md border px-2.5 py-2 text-left text-xs`,t?`border-accent bg-accent-soft`:`border-border hover:bg-surface-2`),"data-testid":`conversation-row-${e.id}`,children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm font-medium text-fg`,children:Kd(e)}),(0,U.jsx)(Fk,{c:e})]}),(0,U.jsxs)(`div`,{className:`mt-0.5 truncate text-fg-muted`,"data-testid":`conversation-members`,children:[r.length,` chat`,r.length===1?``:`s`,e.title?`: ${r.map(e=>e.title).join(`, `)}`:``]}),e.status!==`active`&&e.pausedReason?(0,U.jsx)(`div`,{className:`mt-0.5 text-warn`,"data-testid":`conversation-paused-reason`,children:e.pausedReason}):null,(0,U.jsx)(Ik,{label:`Messages`,used:e.used.messages,budget:e.budget.messages}),(0,U.jsx)(Ik,{label:`Tokens`,used:e.used.tokens,budget:e.budget.tokens,format:fd}),(0,U.jsxs)(`div`,{className:`mt-1 flex justify-between gap-2 text-[11px] text-fg-faint`,children:[(0,U.jsx)(`span`,{"data-testid":`conversation-cost`,children:ud(e.used.costUsd)}),(0,U.jsx)(`span`,{title:md(e.lastActivityAt),children:pd(e.lastActivityAt)})]})]})}function Rk({title:e,help:t,children:n}){return(0,U.jsxs)(`section`,{className:`space-y-2 border-t border-border pt-3 first:border-t-0 first:pt-0`,children:[(0,U.jsxs)(`h3`,{className:`flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-fg-faint`,children:[e,t?(0,U.jsx)(om,{label:e,details:t}):null]}),n]})}var zk={working:`working`,idle:`idle`,asleep:`asleep`,missing:`gone`},Bk={working:`This chat is working on a turn right now.`,idle:`This chat is open and waiting.`,asleep:`This chat is not running; a message wakes it from its saved history.`,missing:`This chat is not on this PC any more (deleted).`};function Vk({c:e,messages:t,titleOf:n,onAction:r,onWithdraw:i,onOpenChat:a,isLocalChat:o}){let[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(null),[p,m]=(0,v.useState)(String(e.budget.messages)),[h,g]=(0,v.useState)(String(e.budget.tokens));(0,v.useEffect)(()=>{m(String(e.budget.messages)),g(String(e.budget.tokens))},[e.budget.messages,e.budget.tokens]);let _=async(e,t,n)=>{c(e);try{return await r(t,n)}finally{c(null)}},y=p.trim()!==String(e.budget.messages)||h.trim()!==String(e.budget.tokens),b=y?of(p,h):null,x=()=>{if(!y||of(p,h))return;let t={},n=Number(p.trim()),r=Number(h.trim());n!==e.budget.messages&&(t.messages=n),r!==e.budget.tokens&&(t.tokens=r),_(`budget`,`budget`,t)},S=e.status===`closed`,C=(0,v.useMemo)(()=>[...e.members].sort((e,t)=>(e.leftAt===null?0:1)-(t.leftAt===null?0:1)),[e.members]);return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`conversation-detail`,"data-id":e.id,children:[(0,U.jsxs)(Rk,{title:`Conversation`,help:sf.status,children:[(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,U.jsx)(`span`,{className:`min-w-0 text-base font-semibold text-fg`,children:Kd(e)}),(0,U.jsx)(Fk,{c:e})]}),e.pausedReason&&!S?(0,U.jsxs)(`p`,{className:`text-xs text-warn`,"data-testid":`conversation-detail-reason`,children:[`Paused: `,e.pausedReason]}):e.pausedReason&&S?(0,U.jsxs)(`p`,{className:`text-xs text-fg-muted`,children:[`Closed: `,e.pausedReason]}):null,(0,U.jsxs)(`p`,{className:`text-xs text-fg-muted`,children:[`Started `,md(e.createdAt),` · last activity`,` `,(0,U.jsx)(`span`,{title:md(e.lastActivityAt),children:pd(e.lastActivityAt)}),e.waiting>0?` · ${e.waiting} waiting to be delivered`:``]}),S?null:(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[e.status===`active`?(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,U.jsx)(q,{size:`sm`,onClick:()=>void _(`pause`,`pause`),busy:s===`pause`,title:sf.pause,"data-testid":`conversation-pause`,children:`Pause`}),(0,U.jsx)(om,{label:`Pause`,details:sf.pause})]}):(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,U.jsx)(q,{size:`sm`,variant:`primary`,onClick:()=>void _(`resume`,`resume`),busy:s===`resume`,title:sf.resume,"data-testid":`conversation-resume`,children:`Resume`}),(0,U.jsx)(om,{label:`Resume`,details:sf.resume})]}),(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,U.jsx)(q,{size:`sm`,variant:l?`danger`:`ghost`,busy:s===`close`,title:sf.close,onClick:()=>{if(!l){u(!0);return}u(!1),_(`close`,`close`)},"data-testid":`conversation-close`,children:l?`Close it for good?`:`Close`}),(0,U.jsx)(om,{label:`Close`,details:sf.close})]})]})]}),(0,U.jsxs)(Rk,{title:`Budget`,help:sf.budget,children:[(0,U.jsx)(Ik,{label:`Messages`,used:e.used.messages,budget:e.budget.messages}),(0,U.jsx)(Ik,{label:`Tokens`,used:e.used.tokens,budget:e.budget.tokens,format:fd}),(0,U.jsxs)(`p`,{className:`flex items-center gap-1.5 text-xs text-fg-muted`,children:[(0,U.jsxs)(`span`,{"data-testid":`conversation-detail-cost`,children:[`Cost so far `,ud(e.used.costUsd),` · `,fd(e.used.tokens),` new tokens`]}),(0,U.jsx)(om,{label:`Cost`,details:sf.cost})]}),S?null:(0,U.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2`,children:[(0,U.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-fg-muted`,children:[`Messages`,(0,U.jsx)(`input`,{className:H(Y,`w-24`),inputMode:`numeric`,value:p,onChange:e=>m(e.target.value),"data-testid":`conversation-budget-messages`})]}),(0,U.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-fg-muted`,children:[`Tokens`,(0,U.jsx)(`input`,{className:H(Y,`w-32`),inputMode:`numeric`,value:h,onChange:e=>g(e.target.value),"data-testid":`conversation-budget-tokens`})]}),(0,U.jsx)(q,{size:`sm`,variant:`primary`,onClick:x,disabled:!y||b!==null,busy:s===`budget`,title:sf.budget,"data-testid":`conversation-budget-save`,children:`Save budget`}),b?(0,U.jsx)(`span`,{className:`text-xs text-danger`,"data-testid":`conversation-budget-problem`,children:b}):null]})]}),(0,U.jsx)(Rk,{title:`Chats`,help:sf.removeMember,children:(0,U.jsx)(`ul`,{className:`space-y-1`,"data-testid":`conversation-members-list`,children:C.map(e=>{let t=`${e.hostId}:${e.sessionId}`,n=e.leftAt!==null;return(0,U.jsxs)(`li`,{className:H(`flex flex-wrap items-center gap-2 rounded-md border border-border px-2.5 py-1.5 text-xs`,n&&`opacity-60`),"data-testid":`conversation-member-${e.sessionId}`,children:[(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-medium text-fg`,children:e.title}),(0,U.jsx)(`span`,{title:Bk[e.state],children:(0,U.jsx)(X,{tone:e.state===`working`?`accent`:`neutral`,children:zk[e.state]})}),e.talkOn===!1?(0,U.jsx)(`span`,{className:`text-warn`,title:`Its "Talk to other chats" switch is off, so its part of this conversation is on hold.`,children:`switch off`}):null,n?(0,U.jsx)(`span`,{className:`text-fg-faint`,title:md(e.leftAt),children:`left`}):null,e.state!==`missing`&&o(e.sessionId)?(0,U.jsx)(q,{size:`sm`,variant:`ghost`,onClick:()=>a(e.sessionId),title:sf.openChat,"data-testid":`conversation-member-open`,children:`Open chat`}):null,!n&&!S?(0,U.jsx)(q,{size:`sm`,variant:d===t?`danger`:`ghost`,busy:s===`remove:${t}`,title:sf.removeMember,onClick:()=>{if(d!==t){f(t);return}f(null),_(`remove:${t}`,`remove-member`,{sessionId:e.sessionId,hostId:e.hostId})},"data-testid":`conversation-member-remove`,children:d===t?`Remove?`:`Remove`}):null]},t)})})}),(0,U.jsx)(Rk,{title:`History`,help:sf.history,children:t===null?(0,U.jsx)(`p`,{className:`text-xs text-fg-muted`,children:`Loading…`}):t.length===0?(0,U.jsx)(`p`,{className:`text-xs text-fg-muted`,children:`Nothing has been sent yet.`}):(0,U.jsx)(`ol`,{className:`space-y-2`,"data-testid":`conversation-history`,children:t.map(t=>(0,U.jsx)(Hk,{m:t,from:t.kind===`notice`?`OonaCode`:n(t.fromSession,t.fromTitle,e.members),to:n(t.toSession,t.toTitle,e.members),onWithdraw:()=>i(t)},t.id))})})]})}function Hk({m:e,from:t,to:n,onWithdraw:r}){let i=tf(e),a=af(i),[o,s]=(0,v.useState)(!1),c=e.kind===`reply`?K.Reply:e.kind===`notice`?K.Alert:e.kind===`continue`?K.Refresh:K.Mail;return(0,U.jsxs)(`li`,{className:H(`rounded-md border px-2.5 py-2 text-xs`,e.kind===`notice`?`border-warn/40 bg-warn-soft/40`:`border-border`),"data-testid":`conversation-message-${e.id}`,"data-kind":e.kind,"data-status":e.status,children:[(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1`,children:[(0,U.jsx)(c,{className:H(`h-3.5 w-3.5`,e.kind===`notice`?`text-warn`:`text-accent`)}),(0,U.jsx)(`span`,{className:`font-medium text-fg`,children:Qd[e.kind]}),(0,U.jsxs)(`span`,{className:`min-w-0 truncate text-fg-muted`,"data-testid":`conversation-message-route`,children:[t,` → `,n]}),(0,U.jsx)(`span`,{className:`text-fg-faint`,title:md(e.createdAt),children:hd(e.createdAt)}),(0,U.jsx)(`span`,{className:`flex-1`}),e.kind===`notice`?null:(0,U.jsx)(`span`,{title:$d[e.status],children:(0,U.jsx)(X,{tone:ef(e.status),children:(0,U.jsx)(`span`,{"data-testid":`conversation-message-status`,children:e.status})})})]}),e.expectsReply||e.continued||e.stalled?(0,U.jsxs)(`div`,{className:`mt-0.5 flex flex-wrap gap-x-2 text-fg-muted`,children:[e.expectsReply?(0,U.jsx)(`span`,{children:`reply expected`}):null,e.continued?(0,U.jsx)(`span`,{children:`continued after an OonaCode restart`}):null,e.stalled?(0,U.jsxs)(`span`,{className:`text-warn`,children:[`waiting for your permission to use `,e.stalled]}):null]}):null,e.error?(0,U.jsx)(`div`,{className:H(`mt-0.5`,e.status===`failed`?`text-danger`:`text-fg-muted`),"data-testid":`conversation-message-error`,children:e.error}):null,e.tokens>0||e.costUsd>0?(0,U.jsxs)(`div`,{className:`mt-0.5 text-fg-faint`,"data-testid":`conversation-message-usage`,children:[`The turn it caused: `,fd(e.tokens),` tokens · `,ud(e.costUsd)]}):null,(0,U.jsx)(`div`,{className:H(`mt-1.5 text-fg`,a&&!o&&`max-h-24 overflow-hidden [mask-image:linear-gradient(to_bottom,black_60%,transparent)]`),"data-testid":`conversation-message-body`,"data-collapsed":a&&!o?`true`:void 0,children:(0,U.jsx)(FT,{text:i})}),(0,U.jsxs)(`div`,{className:`mt-1 flex items-center gap-2`,children:[a?(0,U.jsx)(`button`,{type:`button`,className:`text-accent hover:underline`,onClick:()=>s(e=>!e),"aria-expanded":o,"data-testid":`conversation-message-expand`,children:o?`Show less`:`Show all`}):null,(0,U.jsx)(`span`,{className:`flex-1`}),nf(e)?(0,U.jsx)(q,{size:`sm`,variant:`ghost`,onClick:r,title:sf.withdraw,"data-testid":`conversation-message-withdraw`,children:`Withdraw`}):null]})]})}function Uk({open:e,onClose:t}){let{state:n,actions:r}=W(),i=n.assignProjectSessionId,a=i?n.sessions.find(e=>e.id===i)??null:null,o=i?n.drafts[i]??null:null,s=a?.projectId??o?.projectId??null,[c,l]=(0,v.useState)(s),[u,d]=(0,v.useState)(!1);(0,v.useEffect)(()=>{e&&l(s)},[e,s]);let f=a?.status===`running`||a?.status===`waiting_permission`,p=yd(a?bd(a):o?.title??`New chat`);async function m(){if(i){d(!0);try{await r.setSessionProject(i,c)&&t()}finally{d(!1)}}}return(0,U.jsxs)(um,{open:e,title:`Move “${p}” to a project`,onClose:t,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(q,{variant:`ghost`,onClick:()=>{t(),r.openDialog(`projects`)},children:`Manage projects…`}),(0,U.jsx)(`span`,{className:`flex-1`}),(0,U.jsx)(q,{variant:`ghost`,onClick:t,children:`Cancel`}),(0,U.jsx)(q,{variant:`primary`,onClick:m,disabled:u||c===s,"data-testid":`assign-project-apply`,children:`Apply`})]}),children:[(0,U.jsxs)(`div`,{className:`flex flex-col gap-0.5`,role:`radiogroup`,"aria-label":`Project`,children:[(0,U.jsx)(Wk,{selected:c===null,onSelect:()=>l(null),label:`No project`,testId:`assign-project-none`}),n.vaultProjects.map(e=>(0,U.jsx)(Wk,{selected:c===e.id,onSelect:()=>l(e.id),label:e.name,hint:e.instructions.trim()?`has instructions`:void 0,testId:`assign-project-${e.id}`},e.id)),n.vaultProjects.length===0?(0,U.jsxs)(`p`,{className:`px-2 py-2 text-xs text-fg-muted`,children:[`No projects yet — create one under `,(0,U.jsx)(`em`,{children:`Manage projects…`}),`.`]}):null]}),f?(0,U.jsx)(`p`,{className:`mt-2 text-xs text-fg-muted`,"data-testid":`assign-project-busy`,children:`This chat is mid-turn — it moves now and the turn is left alone. The project's instructions reach the agent at your next message.`}):(0,U.jsx)(`p`,{className:`mt-2 text-xs text-fg-muted`,children:`The project's instructions reach the agent on the chat's next start — nothing in the conversation is lost.`})]})}function Wk({selected:e,onSelect:t,label:n,hint:r,disabled:i=!1,testId:a}){return(0,U.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":e,onClick:t,disabled:i,className:H(`flex items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm`,e?`bg-accent-soft text-fg`:`hover:bg-surface-2 text-fg`,i&&`cursor-not-allowed opacity-50`),"data-testid":a,children:[(0,U.jsx)(`span`,{className:H(`inline-block h-3 w-3 rounded-full border`,e?`border-accent bg-accent`:`border-border`)}),(0,U.jsx)(K.Project,{className:`w-3.5 h-3.5 shrink-0`}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:n}),r?(0,U.jsx)(`span`,{className:`text-[11px] text-fg-faint`,children:r}):null]})}function Gk(e,t){let n=e.definition.displayName;return!t||t.id===`payg`||t.id===`api-key`?[`Sign in to the ${n} console.`,`Create an API key (or copy an existing one).`,`Paste it below — OonaCode encrypts it into your vault before it leaves this PC.`]:[`Open the ${n} console and pick the ${t.label} plan.`,t.notes??`Complete the provider’s subscription/token flow in the browser.`,`Copy the token it issues${t.keyFormat?` (looks like ${t.keyFormat})`:``} and paste it below.`]}function Kk(e,t){let n=e.find(e=>e.definition.id===t);if(!n)return[];let r=n.definition.clientGroup??n.definition.id,i=e.find(e=>e.definition.id===r);return i?[i,...e.filter(e=>e.definition.clientGroup===r)]:[n]}function qk(e){let t=[];for(let n of e){let e=n.definition,r=hs(e),i=e.credentialClass===`subscription`;if(r.length>1)for(let i of r)t.push({key:`${e.id}:${i.id}`,label:i.id===`token-plan`?`Subscription`:i.id===`payg`?`API`:i.label,provider:n,variantId:i.id,variant:i,isSubscription:!1,hasLoginFlow:!1,loginKind:null,keyFormat:i.keyFormat??e.keyFormat});else t.push({key:e.id,label:e.recordLabel??(i?`Subscription`:`API`),provider:n,variantId:r[0]?.id??null,variant:r[0]??null,isSubscription:i,hasLoginFlow:i&&e.route===`direct`,loginKind:i&&e.route===`direct`?e.subscriptionLogin?`oauth`:`claude`:null,keyFormat:r[0]?.keyFormat??e.keyFormat})}return t}function Jk(e){let t=(e.provider.credentials??[]).filter(e=>e.class!==`none`);return(e.variantId?t.filter(t=>(t.variantId??`payg`)===e.variantId):t).slice(0,1)}function Yk({open:e,providerId:t,onClose:n}){let{state:r,actions:i}=W(),a=(0,v.useMemo)(()=>t?Kk(r.providers,t):[],[r.providers,t]),o=(0,v.useMemo)(()=>qk(a),[a]),[s,c]=(0,v.useState)(``),[l,u]=(0,v.useState)(``),[d,f]=(0,v.useState)(``),[p,m]=(0,v.useState)(``),[h,g]=(0,v.useState)(!1),[_,y]=(0,v.useState)(null),b=o.find(e=>e.key===s)??o[0]??null;if((0,v.useEffect)(()=>{if(!e)return;let n=o.find(e=>e.provider.definition.id===t);c((n??o[0])?.key??``),u(``),m(``),y(null)},[e,t,o]),(0,v.useEffect)(()=>{if(!e||!b)return;let t=b.provider.definition;f(t.userBaseUrl?b.variant?.baseUrl??t.baseUrl:``)},[e,b,b?.key]),!b)return null;let x=b.provider.definition,S=a[0]?.definition?.displayName??x.displayName,C=Jk(b),w=a.some(e=>(e.credentials??[]).some(e=>e.class!==`none`)),T=x.credentialClass!==`none`,E=bs(x,{credentialClass:b.isSubscription?`subscription`:x.credentialClass,...x.userBaseUrl&&d.trim()?{baseUrl:d.trim()}:{}}),D=!h&&(!T||l.trim().length>0),O=async()=>{g(!0),y(null);try{if(!T){await i.setActiveProvider(x.id),n();return}let e=await i.probeCredential(x.id,{secret:l.trim(),variantId:b.variantId,...x.userBaseUrl&&d.trim()?{baseUrl:d.trim()}:{}});if(!e.ok){y(e.error??`${S} rejected this key — check it and try again.`);return}let t={};b.variantId&&(t.variant=b.variantId),x.userBaseUrl&&d.trim()&&(t.baseUrl=d.trim()),await i.addCredential({class:b.isSubscription?`subscription`:`api_key`,providerId:x.id,secret:l.trim(),...p.trim()?{label:p.trim()}:{},...Object.keys(t).length>0?{meta:t}:{}})&&(u(``),n())}finally{g(!1)}};return(0,U.jsx)(um,{open:e,title:`${w?`Manage`:`Connect`} ${S}`,onClose:n,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(q,{onClick:n,children:`Cancel`}),b.loginKind===`oauth`?(0,U.jsxs)(q,{onClick:()=>i.openOauthLogin(b.provider.definition.id),"data-testid":`connect-oauth-signin`,children:[(0,U.jsx)(K.LogIn,{className:`w-4 h-4`}),` `,b.provider.definition.subscriptionLogin?.signInLabel??`Sign in instead`]}):b.loginKind===`claude`?(0,U.jsxs)(q,{onClick:()=>i.openClaudeLogin(null),"data-testid":`connect-claude-signin`,children:[(0,U.jsx)(K.LogIn,{className:`w-4 h-4`}),` Sign in instead`]}):null,(0,U.jsx)(q,{variant:`primary`,busy:h,disabled:!D,onClick:()=>void O(),children:h?`Checking…`:T?`Save key`:`Use this provider`})]}),children:(0,U.jsxs)(`div`,{className:`space-y-3`,children:[o.length>1?(0,U.jsx)(`div`,{className:`flex gap-1 border-b border-border`,role:`tablist`,children:o.map(e=>{let t=Jk(e)[0];return(0,U.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":e.key===b.key,"data-testid":`record-tab-${e.key}`,onClick:()=>c(e.key),className:e.key===b.key?`rounded-t-md border border-b-0 border-border bg-surface-2 px-3 py-1.5 text-sm font-medium`:`px-3 py-1.5 text-sm text-fg-muted hover:text-fg`,children:[e.label,t?(0,U.jsx)(`span`,{className:`ml-1.5 font-mono text-[11px] text-ok`,children:t.masked}):null]},e.key)})}):null,C.length>0?(0,U.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,U.jsx)(`div`,{className:`text-xs font-medium text-fg-muted`,children:`Connected`}),C.map(e=>(0,U.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-border px-2.5 py-1.5`,"data-testid":`stored-credential-${e.id}`,children:[(0,U.jsx)(X,{tone:e.class===`subscription`?`accent`:`ok`,children:b.label}),(0,U.jsx)(`span`,{className:`font-mono text-xs`,children:e.masked}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-[11px] text-fg-faint`,children:e.label}),(0,U.jsx)(q,{size:`sm`,onClick:()=>void i.testCredential(e.id),children:`Test`}),(0,U.jsx)(q,{size:`sm`,variant:`danger`,onClick:()=>void i.deleteCredential(e.id),children:`Remove`})]},e.id))]}):null,(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-xs`,children:[(0,U.jsx)(X,{tone:E.viaGateway?`accent`:`ok`,children:E.badge}),(0,U.jsx)(X,{children:x.kind}),b.keyFormat?(0,U.jsxs)(`span`,{className:`text-fg-faint`,children:[`key format `,b.keyFormat]}):null]}),(0,U.jsxs)(`div`,{className:E.viaGateway?`rounded-md border border-border bg-surface-2 px-3 py-2 text-xs text-fg-muted`:`rounded-md border border-ok/40 bg-ok-soft px-3 py-2 text-xs text-ok`,"data-testid":`connect-route`,children:[E.detail,T&&!E.viaGateway?` The key is stored in your zero-knowledge vault.`:null]}),T?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`ol`,{className:`ml-4 list-decimal space-y-1 text-xs text-fg-muted`,children:b.loginKind===`oauth`?[`Press “${b.provider.definition.subscriptionLogin?.signInLabel??`Sign in`}”: a short code opens in your browser, you approve it, and the subscription is stored by itself — nothing to paste.`,`The token refreshes on its own; sign in again only if the provider says it expired.`,`Or paste an access token below, if you have one from elsewhere.`].map((e,t)=>(0,U.jsx)(`li`,{children:e},t)):b.hasLoginFlow?[`Press “Sign in instead” to get a token through the genuine engine — the fastest way.`,"Or run `claude setup-token` yourself and complete the sign-in in your browser.",`Paste the token it prints below (it looks like sk-ant-oat01-…).`].map((e,t)=>(0,U.jsx)(`li`,{children:e},t)):Gk(b.provider,b.variant).map((e,t)=>(0,U.jsx)(`li`,{children:e},t))}),(0,U.jsx)(cm,{label:b.isSubscription?`Subscription token`:`API key`,hint:`Tried against the provider before it is saved, then encrypted on this PC with your vault key.`,children:(0,U.jsx)(`input`,{className:Y,type:`password`,autoComplete:`off`,spellCheck:!1,value:l,placeholder:b.keyFormat??`sk-…`,onChange:e=>{u(e.target.value),y(null)}})}),_?(0,U.jsx)(`div`,{className:`rounded-md border border-danger/40 bg-danger-soft px-3 py-2 text-xs text-danger`,"data-testid":`connect-probe-error`,children:_}):null,x.userBaseUrl?(0,U.jsx)(cm,{label:`Base URL`,hint:`Point this at your own server if it is not the default. Each record has its own endpoint.`,children:(0,U.jsx)(`input`,{className:Y,value:d,spellCheck:!1,onChange:e=>f(e.target.value),placeholder:b.variant?.baseUrl??x.baseUrl})}):null,(0,U.jsx)(cm,{label:`Label (optional)`,children:(0,U.jsx)(`input`,{className:Y,value:p,onChange:e=>m(e.target.value),placeholder:`${S} ${b.label.toLowerCase()} key`})})]}):(0,U.jsxs)(`div`,{className:`rounded-md bg-surface-2 px-3 py-2 text-xs text-fg-muted`,children:[x.displayName,` needs no credential.`]})]})})}function Xk({open:e,onClose:t}){let{state:n,actions:r}=W(),i=n.ui.oauthLoginProviderId,a=i?n.providers.find(e=>e.definition.id===i)??null:null,o=n.oauthLogin&&n.oauthLogin.providerId===i?n.oauthLogin:null,[s,c]=(0,v.useState)(0),[l,u]=(0,v.useState)(!1),d=(0,v.useRef)(null),f=a?.definition.displayName??i??`the provider`,p=a?.definition.subscriptionLogin?.signInLabel??`Sign in to ${f}`,m=o?.phase===`awaiting_approval`,h=m?o?.verificationUriComplete??o?.verificationUri??null:null;(0,v.useEffect)(()=>{if(!e||!i)return;d.current=null,r.startOauthLogin(i);let t=setInterval(()=>void r.refreshOauthLogin(i),2e3);return()=>clearInterval(t)},[e,i,s,r]),(0,v.useEffect)(()=>{!e||!h||!o?.id||d.current===o.id||(d.current=o.id,bk(h))},[e,h,o?.id]),(0,v.useEffect)(()=>{e&&o?.phase===`connected`&&r.refreshCredentials()},[e,o?.phase,r]);let g=e=>{if(!navigator.clipboard){r.toast(`error`,`Could not copy — select it and copy by hand`);return}navigator.clipboard.writeText(e).then(()=>{u(!0),setTimeout(()=>u(!1),2e3)}).catch(()=>r.toast(`error`,`Could not copy`))},_=o?.phase===`connected`||o?.phase===`failed`||o?.phase===`expired`||o?.phase===`cancelled`;return(0,U.jsx)(um,{open:e,title:p,onClose:t,footer:(0,U.jsxs)(U.Fragment,{children:[m?(0,U.jsx)(q,{onClick:()=>i&&void r.cancelOauthLogin(i),"data-testid":`oauth-login-cancel`,children:`Cancel sign-in`}):null,_&&o?.phase!==`connected`?(0,U.jsx)(q,{onClick:()=>c(e=>e+1),"data-testid":`oauth-login-retry`,children:`Try again`}):null,(0,U.jsx)(q,{variant:`primary`,onClick:t,children:o?.phase===`connected`?`Done`:`Close`})]}),children:(0,U.jsx)(`div`,{className:`space-y-3 text-sm`,"data-testid":`oauth-login-dialog`,children:m&&o?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`p`,{children:[`A sign-in page for `,f,` opened in your browser. If it did not, open the link below on any device and enter this code:`]}),(0,U.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(`code`,{className:`text-lg font-mono px-2 py-1 rounded border border-border`,"data-testid":`oauth-user-code`,children:o.userCode}),(0,U.jsxs)(q,{onClick:()=>o.userCode&&g(o.userCode),children:[(0,U.jsx)(K.Copy,{className:`w-4 h-4`}),` `,l?`Copied`:`Copy code`]})]}),h?(0,U.jsxs)(`div`,{className:`flex items-center gap-2 break-all`,children:[(0,U.jsx)(`a`,{className:`underline`,href:h,onClick:e=>{e.preventDefault(),bk(h)},children:h}),(0,U.jsxs)(q,{onClick:()=>g(h),children:[(0,U.jsx)(K.Copy,{className:`w-4 h-4`}),` Copy link`]})]}):null,(0,U.jsxs)(`p`,{className:`text-fg-muted`,children:[`Waiting for your approval… the code expires`,o.expiresAt?` at ${new Date(o.expiresAt).toLocaleTimeString()}`:` soon`,`. The subscription is stored in your vault the moment `,f,` confirms it.`]})]}):o?.phase===`connected`?(0,U.jsxs)(`p`,{"data-testid":`oauth-login-connected`,children:[`Signed in. Your `,f,` subscription is stored in your vault and synced to your other machines; chats on it run from this PC straight to the provider.`]}):_?(0,U.jsx)(`p`,{className:`text-danger`,"data-testid":`oauth-login-ended`,children:o?.message??`The sign-in did not complete.`}):(0,U.jsx)(`p`,{children:`Starting the sign-in…`})})})}function Zk({open:e,onClose:t}){let{state:n,actions:r}=W(),i=(0,v.useMemo)(()=>Qc(n.providers),[n.providers]),[a,o]=(0,v.useState)({}),[s,c]=(0,v.useState)(``),[l,u]=(0,v.useState)(!1);(0,v.useEffect)(()=>{e&&(o({...n.settings?.modelVisibility??{}}),c(``))},[e]);let d=(e,t)=>a[e]??t,f=(e,t,n)=>d(e,n).includes(t),p=(e,t,n)=>{o(r=>{let i=r[e]??n,a=i.includes(t)?i.filter(e=>e!==t):n.filter(e=>e===t||i.includes(e));return{...r,[e]:a}})},m=(e,t,n)=>{o(r=>({...r,[e]:t?[...n]:[]}))},h=async()=>{u(!0);try{let e={};for(let t of i){let n=t.definition.models.map(e=>e.id),r=a[t.definition.id];r&&r.length!==n.length&&(e[t.definition.id]=r)}await r.saveSettings({modelVisibility:e}),t()}finally{u(!1)}},g=s.trim().toLowerCase();return(0,U.jsx)(um,{open:e,title:`Manage models`,onClose:t,wide:!0,footer:(0,U.jsxs)(`div`,{className:`flex w-full items-center justify-between gap-2`,children:[(0,U.jsxs)(q,{onClick:()=>{t(),r.openSettings(`providers`)},"data-testid":`manage-models-add-provider`,children:[(0,U.jsx)(K.Plus,{className:`w-3.5 h-3.5`}),` Add provider`]}),(0,U.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(q,{onClick:t,children:`Cancel`}),(0,U.jsx)(q,{variant:`primary`,busy:l,onClick:()=>void h(),"data-testid":`manage-models-save`,children:`Save`})]})]}),children:(0,U.jsxs)(`div`,{className:`space-y-4`,children:[(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`Choose which models the chat's picker offers. A provider with every model checked shows all of them — including ones it adds later.`}),(0,U.jsx)(`input`,{className:Y,value:s,onChange:e=>c(e.target.value),placeholder:`Filter models…`,"data-testid":`manage-models-filter`}),i.length===0?(0,U.jsxs)(`div`,{className:`text-sm text-fg-faint`,children:[`No provider is connected yet — use `,(0,U.jsx)(`strong`,{children:`Add provider`}),` below to connect one.`]}):null,i.map(e=>{let t=e.definition.models.map(e=>e.id),n=e.definition.models.filter(e=>!g||e.id.toLowerCase().includes(g)||(e.displayName??``).toLowerCase().includes(g)),r=d(e.definition.id,t).length;return(0,U.jsxs)(`div`,{className:`rounded-md border border-border p-3`,"data-testid":`manage-models-${e.definition.id}`,children:[(0,U.jsxs)(`div`,{className:`mb-2 flex flex-wrap items-center gap-2`,children:[(0,U.jsx)(`span`,{className:`font-medium`,children:e.definition.displayName}),(0,U.jsxs)(`span`,{className:`text-xs text-fg-faint`,children:[r===t.length?`all`:r,` of `,t.length,` shown`]}),(0,U.jsxs)(`span`,{className:`ml-auto flex gap-1`,children:[(0,U.jsx)(q,{size:`sm`,onClick:()=>m(e.definition.id,!0,t),children:`All`}),(0,U.jsx)(q,{size:`sm`,onClick:()=>m(e.definition.id,!1,t),children:`None`})]})]}),(0,U.jsxs)(`div`,{className:`grid gap-1 sm:grid-cols-2`,children:[n.map(n=>(0,U.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,U.jsx)(`input`,{type:`checkbox`,checked:f(e.definition.id,n.id,t),onChange:()=>p(e.definition.id,n.id,t),"data-testid":`manage-model-${n.id}`}),(0,U.jsxs)(`span`,{className:`truncate`,title:n.id,children:[n.displayName??n.id,n.displayName&&n.displayName!==n.id?(0,U.jsxs)(`span`,{className:`text-fg-faint`,children:[` · `,n.id]}):null]})]},n.id)),n.length===0?(0,U.jsxs)(`div`,{className:`text-xs text-fg-faint`,children:[(0,U.jsx)(K.Info,{className:`mr-1 inline w-3 h-3`}),` No model matches the filter.`]}):null]})]},e.definition.id)})]})})}function Qk(e){return e?e.replace(/[\\/]+$/,``).split(/[\\/]/).length<=2?e:`…${e.slice(-40)}`:`no folder recorded`}function $k(e){return e<1024?`${e} B`:e<1048576?`${Math.round(e/1024)} KB`:`${(e/1048576).toFixed(1)} MB`}function eA(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):``}function tA(e){return e.alreadyImported&&e.upToDate===!0}function nA(e){return!e.alreadyImported&&e.deletedHere===!0}function rA(e){return typeof e.unavailable==`string`&&e.unavailable.length>0}function iA(e){if(!e.some(e=>e.projectName))return e;let t=[],n=new Map;for(let r of e){let e=r.projectName??``;n.has(e)||(n.set(e,[]),t.push(e)),n.get(e).push(r)}return t.flatMap(e=>n.get(e))}function aA({open:e,onClose:t}){let{state:n,actions:r}=W(),i=n.importProgress,[a,o]=(0,v.useState)(!1),[s,c]=(0,v.useState)(!1),[l,u]=(0,v.useState)(null),[d,f]=(0,v.useState)(null),[p,m]=(0,v.useState)(new Set),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(null),b=(0,v.useMemo)(()=>d??[],[d]),x=(0,v.useMemo)(()=>b.filter(e=>!e.alreadyImported&&!nA(e)&&!rA(e)),[b]),S=(0,v.useMemo)(()=>b.filter(e=>e.alreadyImported),[b]),[C,w]=(0,v.useState)(!1),[T,E]=(0,v.useState)(!1),D=(0,v.useMemo)(()=>b.filter(tA),[b]),O=(0,v.useMemo)(()=>b.filter(nA),[b]),ee=(0,v.useMemo)(()=>b.filter(e=>(C||!tA(e))&&(T||!nA(e))),[b,C,T]),k=(0,v.useMemo)(()=>b.filter(e=>e.alreadyImported&&p.has(e.id)),[b,p]),A=(0,v.useMemo)(()=>{let e=[...new Set(b.map(e=>e.agentName??`Claude Code`))];return e.length===1?e[0]:`coding-agent`},[b]),j=(0,v.useMemo)(()=>{let e=new Map;for(let t of b){let n=t.agentName??`Claude Code`,r=t.agentId??`claude-code`,i=e.get(r)??{name:n,chats:[]};i.chats.push(t),e.set(r,i)}return[...e.entries()].map(([e,t])=>({key:e,...t,chats:iA(t.chats)}))},[b]);(0,v.useEffect)(()=>{h===null&&j.length>0&&g(new Set([j[0].key]))},[j,h]),(0,v.useEffect)(()=>{e&&(u(null),y(null),g(null),o(!0),r.scanClaudeSessions().then(e=>{f(e.sessions),m(new Set(e.sessions.filter(e=>!e.alreadyImported&&!nA(e)&&!rA(e)).map(e=>e.id)))}).catch(e=>u(e instanceof Error?e.message:String(e))).finally(()=>o(!1)))},[e]);let M=e=>m(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),N=()=>{n.prefs.claudeImportOffered||r.savePrefs({claudeImportOffered:!0}),t()},te=async()=>{c(!0),u(null);try{let e=await r.importClaudeSessions([...p],k.length>0);y({imported:e.imported.length,replaced:e.replaced?.length??0,entries:e.imported.reduce((e,t)=>e+t.entries,0)+(e.replaced??[]).reduce((e,t)=>e+t.entries,0),failed:e.failed.length,filed:e.filed?.length??0,projectsMade:(e.projects??[]).filter(e=>e.created).map(e=>e.name),warnings:e.warnings??[]}),n.prefs.claudeImportOffered||r.savePrefs({claudeImportOffered:!0}),await r.refreshSessions()}catch(e){u(e instanceof Error?e.message:String(e))}finally{c(!1)}};return(0,U.jsx)(um,{open:e,title:`Import your ${A} chats`,onClose:N,wide:!0,footer:(0,U.jsxs)(`div`,{className:`flex w-full items-center justify-between gap-2`,children:[(0,U.jsx)(`span`,{className:`text-[11px] text-fg-faint`,children:k.length>0?(0,U.jsxs)(`span`,{className:`text-warn`,children:[k.length,` already-imported `,k.length===1?`chat`:`chats`,` `,`will be REPLACED — the OonaCode copy is rebuilt from the original, and anything added here is lost.`]}):`Your other apps stay exactly as they are — this copies, it never moves or deletes.`}),(0,U.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(q,{onClick:N,"data-testid":`import-claude-close`,children:_?`Done`:`Not now`}),_?null:(0,U.jsxs)(q,{variant:`primary`,busy:s,disabled:p.size===0,onClick:()=>void te(),"data-testid":`import-claude-run`,children:[`Import `,p.size>0?p.size:``]})]})]}),children:(0,U.jsxs)(`div`,{className:`space-y-3`,"data-testid":`import-claude-body`,children:[a?(0,U.jsx)(`div`,{className:`text-sm text-fg-muted`,children:`Looking for chats on this PC…`}):null,i&&!_?(0,U.jsxs)(`div`,{className:`space-y-2`,"data-testid":`import-claude-progress`,children:[(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3 text-sm`,children:[(0,U.jsxs)(`span`,{children:[`Importing `,(0,U.jsx)(`strong`,{children:i.done}),` of `,(0,U.jsx)(`strong`,{children:i.total}),`…`]}),(0,U.jsxs)(`span`,{className:`text-[11px] text-fg-faint`,children:[Math.round(i.done/Math.max(i.total,1)*100),`%`]})]}),(0,U.jsx)(`div`,{className:`h-1.5 w-full overflow-hidden rounded bg-surface-2`,children:(0,U.jsx)(`div`,{className:`h-full bg-accent transition-[width] duration-200`,style:{width:`${Math.round(i.done/Math.max(i.total,1)*100)}%`}})}),i.current?(0,U.jsxs)(`div`,{className:`truncate text-[11px] text-fg-faint`,title:i.current,children:[`reading: `,i.current]}):null,(0,U.jsxs)(`div`,{className:`flex gap-3 text-[11px] text-fg-faint`,children:[(0,U.jsxs)(`span`,{children:[i.imported,` imported`]}),i.skipped>0?(0,U.jsxs)(`span`,{children:[i.skipped,` already in`]}):null,i.failed>0?(0,U.jsxs)(`span`,{className:`text-warn`,children:[i.failed,` could not be read`]}):null]}),(0,U.jsx)(`p`,{className:`text-[11px] text-fg-faint`,children:`A big chat takes a moment — the largest here are over 100 MB. Your Claude Code is only being read.`})]}):null,l?(0,U.jsx)(`div`,{className:`rounded border border-danger/40 bg-danger/10 p-2 text-sm text-danger`,children:l}):null,_?(0,U.jsxs)(`div`,{className:`text-sm`,"data-testid":`import-claude-done`,children:[(0,U.jsxs)(`p`,{children:[`Imported `,(0,U.jsx)(`strong`,{children:_.imported}),` `,_.imported===1?`chat`:`chats`,_.replaced>0?(0,U.jsxs)(U.Fragment,{children:[` and rebuilt `,(0,U.jsx)(`strong`,{children:_.replaced}),` that `,_.replaced===1?`was`:`were`,` already here`]}):null,` `,`(`,_.entries.toLocaleString(),` entries). They are in your sessions list now, and you can carry on typing in them.`]}),_.projectsMade.length>0?(0,U.jsxs)(`p`,{className:`mt-1`,"data-testid":`import-claude-projects-made`,children:[_.projectsMade.length===1?`Created the project `:`Created the projects `,_.projectsMade.map((e,t)=>(0,U.jsxs)(`span`,{children:[t>0?`, `:``,(0,U.jsx)(`strong`,{children:e})]},e)),` `,`and filed `,_.projectsMade.length===1?`its`:`their`,` chats under`,` `,_.projectsMade.length===1?`it`:`them`,`.`]}):null,_.filed>0?(0,U.jsxs)(`p`,{className:`mt-1 text-fg-muted`,"data-testid":`import-claude-filed`,children:[_.filed,` `,_.filed===1?`chat that was`:`chats that were`,` already here`,` `,_.filed===1?`is`:`are`,` now filed under`,` `,_.filed===1?`its`:`their`,` project.`]}):null,_.failed>0?(0,U.jsxs)(`p`,{className:`mt-1 text-warn`,children:[_.failed,` could not be read and were left alone.`]}):null,_.warnings.map(e=>(0,U.jsx)(`p`,{className:`mt-1 text-warn`,children:e},e))]}):null,!a&&!_&&!i&&d!==null&&d.length>0?(0,U.jsxs)(`div`,{className:`space-y-0.5 text-sm`,"data-testid":`import-claude-tally`,children:[(0,U.jsxs)(`p`,{children:[(0,U.jsx)(`strong`,{children:d.length}),` `,d.length===1?`chat`:`chats`,` on this PC`,j.length>0?` — `:``,j.map((e,t)=>(0,U.jsxs)(`span`,{children:[t>0?`, `:``,(0,U.jsx)(`strong`,{children:e.chats.length}),` `,e.name]},e.key))]}),(0,U.jsxs)(`p`,{className:`text-fg-muted`,children:[S.length>0?`${S.length} already imported · `:``,(0,U.jsx)(`strong`,{className:`text-fg`,children:x.length}),` new`]}),D.length>0?(0,U.jsxs)(`p`,{className:`text-[11px] text-fg-faint`,children:[D.length,` imported and up to date `,C?`shown`:`hidden`,` —`,` `,(0,U.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>w(e=>!e),"data-testid":`import-claude-toggle-uptodate`,children:C?`hide`:`show`})]}):null,O.length>0?(0,U.jsxs)(`p`,{className:`text-[11px] text-fg-faint`,"data-testid":`import-claude-deleted-line`,children:[O.length,` you deleted here `,T?`shown`:`hidden`,` —`,` `,(0,U.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>E(e=>!e),"data-testid":`import-claude-toggle-deleted`,children:T?`hide`:`show`})]}):null]}):null,!a&&!_&&!i&&d!==null&&x.length===0?(0,U.jsx)(`div`,{className:`text-sm text-fg-muted`,"data-testid":`import-claude-empty`,children:d.length===0?`No Claude Code chats were found on this PC.`:`All ${d.length} of them are already imported — they are in your sessions list.`}):null,!_&&!i&&b.length>0?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`These are the chats the coding agents on this PC have, newest first. Importing copies them into OonaCode so you can read them here — and continue them, in the folder each one ran in.`}),(0,U.jsx)(`div`,{className:`max-h-96 space-y-3 overflow-y-auto`,children:j.map(e=>{let t=e.chats.filter(e=>ee.includes(e)),n=t.filter(e=>!rA(e)).map(e=>e.id),r=n.filter(e=>p.has(e)).length,i=h?.has(e.key)??!1,a=e.chats.filter(e=>!e.alreadyImported&&!nA(e)&&!rA(e)).length,o=e.chats.length-t.length;return t.length===0?null:(0,U.jsxs)(`div`,{className:`rounded border border-border`,"data-testid":`import-group-${e.key}`,children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border bg-surface-2 px-2 py-1.5`,children:[(0,U.jsxs)(`button`,{type:`button`,className:`flex min-w-0 flex-1 items-center gap-1.5 text-left text-xs font-medium`,onClick:()=>g(t=>{let n=new Set(t??[]);return n.has(e.key)?n.delete(e.key):n.add(e.key),n}),"aria-expanded":i,"data-testid":`import-group-header-${e.key}`,children:[(0,U.jsx)(K.Chevron,{open:i,className:`w-3 h-3 shrink-0`}),e.name,(0,U.jsxs)(`span`,{className:`font-normal text-fg-faint`,children:[e.chats.length,` `,e.chats.length===1?`chat`:`chats`,a>0?` · ${a} new`:` · all imported`,o>0?` · ${o} up to date hidden`:``,r>0?` · ${r} selected`:``]})]}),(0,U.jsx)(`button`,{type:`button`,className:`shrink-0 text-[11px] underline text-fg-faint`,onClick:()=>m(e=>{let t=new Set(e),r=n.every(e=>t.has(e));for(let e of n)r?t.delete(e):t.add(e);return t}),"data-testid":`import-group-toggle-${e.key}`,children:n.every(e=>p.has(e))?`none`:`all`})]}),i?t.map(e=>(0,U.jsxs)(`label`,{className:`flex items-start gap-2 border-b border-border p-2 last:border-b-0 ${rA(e)?`cursor-default opacity-60`:`cursor-pointer hover:bg-surface-2`}`,"data-testid":`import-row-${e.id}`,children:[(0,U.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:p.has(e.id),disabled:rA(e),onChange:()=>M(e.id),"aria-label":e.title??e.firstPrompt??e.id}),(0,U.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`span`,{className:`block truncate text-sm`,children:e.title??e.firstPrompt??(0,U.jsx)(`span`,{className:`text-fg-faint`,children:`(no prompt)`})}),(0,U.jsxs)(`span`,{className:`mt-0.5 block truncate text-[11px] text-fg-faint`,children:[e.projectName?(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-0.5`,children:[(0,U.jsx)(K.Project,{className:`w-3 h-3`}),e.projectName]}):(0,U.jsxs)(U.Fragment,{children:[Qk(e.cwd),e.cwd&&!e.cwdExists?` · folder is gone`:``]}),` `,`· `,e.entryCount,` entries`,e.bytes>0?` · ${$k(e.bytes)}`:``,` ·`,` `,eA(e.lastEntryAt??e.updatedAt),e.model?` · ${e.model}`:``]}),e.unavailable||e.note?(0,U.jsx)(`span`,{className:`mt-0.5 block text-[11px] ${e.unavailable?`text-warn`:`text-fg-faint`}`,"data-testid":`import-row-note-${e.id}`,children:e.unavailable??e.note}):null]}),e.supersedes&&e.supersedes.length>0?(0,U.jsx)(`span`,{className:`mt-0.5 shrink-0 rounded bg-surface-2 px-1 text-[11px] text-fg-faint`,title:`Rewound — replaces ${e.supersedes.length} earlier ${e.supersedes.length===1?`branch`:`branches`} of this chat`,children:`rewound`}):null,e.alreadyImported?(0,U.jsxs)(`span`,{className:`mt-0.5 flex shrink-0 items-center gap-1 text-[11px] text-fg-faint`,children:[(0,U.jsx)(K.Check,{className:`w-3 h-3 text-ok`}),`imported`,e.upToDate===!1?(0,U.jsxs)(`span`,{className:`ml-1 inline-flex shrink-0 items-center gap-0.5 rounded bg-warn-soft px-1 text-[10px] font-medium leading-4 text-warn`,title:`The original has newer messages than the OonaCode copy — importing again brings them in`,"data-testid":`import-behind-${e.id}`,"aria-label":`behind its original`,children:[(0,U.jsx)(K.ArrowDown,{className:`w-2.5 h-2.5`}),`behind`]}):null]}):null]},e.id)):null]},e.key)})}),(0,U.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px] text-fg-faint`,children:[(0,U.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>m(new Set(ee.filter(e=>!rA(e)).map(e=>e.id))),"data-testid":`import-claude-select-all`,children:`Select all`}),(0,U.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>m(new Set),"data-testid":`import-claude-select-none`,children:`Select none`})]})]}):null]})})}var oA={model:null,previousModel:null,costUsd:0,inputTokens:0,outputTokens:0,turns:0,durationMs:0,contextTokens:null,contextWindow:null,contextUsed:null,costSource:`engine`,credits:null,resetAtIndex:null,didReset:!1,countedResults:0};function sA(e,t){let n=t?Ds(t):null,r=null,i=null;for(let t=0;t<e.length;t++){let a=e[t];if(!a||a.kind!==`assistant`||!M(a.model))continue;let o=Ds(a.model);n!==null&&o!==n&&(r=t,i=n),n=o}return{index:r,from:i,to:n}}function cA(e){let{items:t,session:n=null,initModel:r=null,boundary:i=null,models:a}=e,o=e.contextTokens!=null&&e.contextTokens>0?e.contextTokens:null;if(t.length===0&&!n)return oA;let s=sA(t,r),c=i&&i.index>=0?Math.min(i.index,t.length):null,l=null,u=null;s.index!==null&&(c===null||s.index>=c)?(l=s.index,u=s.from):c!==null&&(l=c,u=i?.from??s.from);let d=l??0,f=0,p=0,m=0,h=0,g=0,_=0;for(let e=d;e<t.length;e++){let n=t[e];!n||n.kind!==`result`||(_+=1,f+=n.costUsd,p+=n.inputTokens,m+=n.outputTokens,h+=n.numTurns,g+=n.durationMs)}_===0&&l===null&&n&&(f=n.totalCostUsd,p=n.inputTokens,m=n.outputTokens);let v=`engine`,y=null;n&&n.providerId===`oonacode`&&(f=n.totalCostUsd,y=n.poolCredits??null,v=`gateway`);let b=r?Ds(r):null,x=i&&c!==null&&l===c?i.to:s.to??n?.model??b??null,S=[x,n?.model??null,b].filter(e=>typeof e==`string`&&e.length>0),C=(a?S.map(e=>a.find(t=>t.id===e)).find(e=>e?.contextWindow!=null):void 0)?.contextWindow??null;return{model:x,previousModel:u,costUsd:f,inputTokens:p,outputTokens:m,turns:h,durationMs:g,contextTokens:o,contextWindow:C,contextUsed:C&&C>0&&o!==null?Math.min(1,o/C):null,resetAtIndex:l,didReset:l!==null,countedResults:_,costSource:v,credits:y}}function lA({label:e,icon:t,children:n}){return(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-3 py-1`,children:[(0,U.jsxs)(`span`,{className:`flex shrink-0 items-center gap-1.5 text-xs text-fg-faint`,children:[t?(0,U.jsx)(`span`,{className:`shrink-0 text-fg-faint`,"aria-hidden":`true`,children:t}):null,e]}),(0,U.jsx)(`span`,{className:`min-w-0 truncate text-right text-xs font-medium text-fg`,children:n})]})}function uA({label:e,icon:t}){return(0,U.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-fg-faint`,children:[(0,U.jsx)(`span`,{"aria-hidden":`true`,children:t}),e]})}var dA={provider:(0,U.jsx)(K.Plug,{className:`w-3.5 h-3.5`}),route:(0,U.jsx)(K.Globe,{className:`w-3.5 h-3.5`}),model:(0,U.jsx)(K.Bot,{className:`w-3.5 h-3.5`}),permission:(0,U.jsx)(K.Shield,{className:`w-3.5 h-3.5`}),context:(0,U.jsx)(K.Brain,{className:`w-3.5 h-3.5`}),window:(0,U.jsx)(K.Panel,{className:`w-3.5 h-3.5`}),compactions:(0,U.jsx)(K.CollapseAll,{className:`w-3.5 h-3.5`}),usage:(0,U.jsx)(K.Coins,{className:`w-3.5 h-3.5`}),tokensIn:(0,U.jsx)(K.Download,{className:`w-3.5 h-3.5`}),tokensOut:(0,U.jsx)(K.Upload,{className:`w-3.5 h-3.5`}),duration:(0,U.jsx)(K.Clock,{className:`w-3.5 h-3.5`}),turns:(0,U.jsx)(K.Send,{className:`w-3.5 h-3.5`}),session:(0,U.jsx)(K.Info,{className:`w-3.5 h-3.5`}),status:(0,U.jsx)(K.Monitor,{className:`w-3.5 h-3.5`}),updated:(0,U.jsx)(K.Refresh,{className:`w-3.5 h-3.5`}),entries:(0,U.jsx)(K.Menu,{className:`w-3.5 h-3.5`}),mirror:(0,U.jsx)(K.Copy,{className:`w-3.5 h-3.5`}),project:(0,U.jsx)(K.Project,{className:`w-3.5 h-3.5`}),folder:(0,U.jsx)(K.Folder,{className:`w-3.5 h-3.5`})};function fA({used:e}){let t=Math.round(e*100);return(0,U.jsx)(`div`,{className:`h-1.5 w-full overflow-hidden rounded-full bg-surface-3`,role:`progressbar`,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":100,"aria-label":`Context used`,children:(0,U.jsx)(`div`,{className:H(`h-full rounded-full`,t>=90?`bg-danger`:t>=70?`bg-warn`:`bg-accent`),style:{width:`${t}%`}})})}function pA(){let{state:e,actions:t}=W(),n=Jp(),r=n?e.remote.tabs[n.id]!==void 0:!1,i=qp(),a=e.currentSessionId,o=n?.projectId?e.vaultProjects.find(e=>e.id===n.projectId):void 0,s=o?.instructions.trim()??``,c=n?.providerId??e.activeProviderId,l=e.providers.find(e=>e.definition.id===c),u=l?.definition.models??(c?e.models[c]?.models:void 0),d=(0,v.useMemo)(()=>{let e=l?.definition;return e?bs(e,{credentialClass:(l.credentials.find(e=>e.variantId===n?.variantId)??l.credentials[0])?.class??null}):null},[l,n?.variantId]),f=(0,v.useMemo)(()=>cA({items:i?.items??[],session:n,initModel:i?.init?.model??null,boundary:a?e.modelBoundaries[a]??null:null,models:u,contextTokens:i?.contextTokens??null}),[i?.items,i?.init?.model,i?.contextTokens,n,a,e.modelBoundaries,u]),p=(0,v.useMemo)(()=>(i?.items??[]).filter(e=>e.kind===`user`&&e.compactSummary).length,[i?.items]);return(0,U.jsxs)(`aside`,{className:`flex w-72 shrink-0 flex-col border-l border-border bg-surface`,"aria-label":`Session info`,"data-testid":`session-panel`,children:[(0,U.jsxs)(`div`,{className:`flex h-9 shrink-0 items-center gap-2 border-b border-border px-3`,children:[(0,U.jsx)(K.Info,{className:`w-3.5 h-3.5 text-fg-faint`}),(0,U.jsx)(`span`,{className:`flex-1 text-xs font-semibold uppercase tracking-wide text-fg-muted`,children:`Session info`}),(0,U.jsx)(J,{label:`Hide session info`,className:`p-1`,onClick:()=>void t.savePrefs({sessionPanelOpen:!1}),children:(0,U.jsx)(K.X,{className:`w-3.5 h-3.5`})})]}),n?(0,U.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 py-2`,children:[f.didReset?(0,U.jsxs)(`div`,{className:`mb-2 rounded-md bg-accent-soft px-2 py-1.5 text-[11px] text-accent`,"data-testid":`stats-reset`,children:[`Statistics restarted at the model change`,f.previousModel?` (was ${f.previousModel})`:``,`.`]}):null,(0,U.jsxs)(`div`,{className:`mb-2`,children:[(0,U.jsx)(uA,{label:`Model`,icon:dA.model}),(0,U.jsx)(lA,{label:`Provider`,icon:dA.provider,children:l?.definition.displayName??c??`—`}),(0,U.jsx)(lA,{label:`Route`,icon:dA.route,children:d?(0,U.jsx)(X,{tone:d.viaGateway?`accent`:`ok`,children:d.badge}):`—`}),d?(0,U.jsx)(`div`,{className:`pb-1 text-[11px] leading-snug text-fg-faint`,children:d.detail}):null,(0,U.jsx)(lA,{label:`Model`,icon:dA.model,children:f.model??n.model??`—`}),(0,U.jsx)(lA,{label:`Permission mode`,icon:dA.permission,children:(0,U.jsx)(X,{children:n.permissionMode})})]}),(0,U.jsxs)(`div`,{className:`mb-2`,children:[(0,U.jsx)(uA,{label:`Context`,icon:dA.context}),f.contextUsed!==null&&f.contextTokens!==null?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(fA,{used:f.contextUsed}),(0,U.jsxs)(`div`,{className:`mt-1 text-[11px] text-fg-muted`,"data-testid":`context-used`,children:[fd(f.contextTokens),` / `,fd(f.contextWindow??0),` `,`tokens (`,Math.round(f.contextUsed*100),`%)`]})]}):(0,U.jsx)(`div`,{className:`text-[11px] text-fg-muted`,"data-testid":`context-used`,children:f.contextTokens===null?`Measured at the next reply`:`${fd(f.contextTokens)} tokens (window unknown)`}),(0,U.jsx)(lA,{label:`Context window`,icon:dA.window,children:(0,U.jsx)(`span`,{"data-testid":`context-window`,children:f.contextWindow?`${fd(f.contextWindow)} tokens`:`unknown`})}),(0,U.jsx)(lA,{label:`Compactions`,icon:dA.compactions,children:(0,U.jsx)(`span`,{"data-testid":`compaction-count`,children:p})})]}),(0,U.jsxs)(`div`,{className:`mb-2`,children:[(0,U.jsx)(uA,{label:`Usage`,icon:dA.usage}),(0,U.jsx)(lA,{label:`Tokens in`,icon:dA.tokensIn,children:fd(f.inputTokens)}),(0,U.jsx)(lA,{label:`Tokens out`,icon:dA.tokensOut,children:fd(f.outputTokens)}),f.credits===null?null:(0,U.jsx)(lA,{label:`Credits used`,icon:dA.usage,children:f.credits.toLocaleString(`en-US`,{maximumFractionDigits:2})}),(0,U.jsx)(lA,{label:`Duration`,icon:dA.duration,children:f.countedResults>0&&dd(f.durationMs)||`—`}),(0,U.jsx)(lA,{label:`Turns`,icon:dA.turns,children:f.countedResults>0?f.turns:`—`})]}),(0,U.jsxs)(`div`,{className:`mb-2`,children:[(0,U.jsx)(uA,{label:`Session`,icon:dA.session}),(0,U.jsx)(lA,{label:`Status`,icon:dA.status,children:(0,U.jsx)(X,{tone:i?.status===`error`?`danger`:i?.status===`running`?`accent`:i?.status===`waiting_permission`?`warn`:`neutral`,children:i?.status??n.status})}),(0,U.jsx)(lA,{label:`Updated`,icon:dA.updated,children:pd(n.updatedAt)}),(0,U.jsx)(lA,{label:`Entries`,icon:dA.entries,children:n.entryCount}),(0,U.jsx)(lA,{label:`History mirror`,icon:dA.mirror,children:n.mirrored?`on`:`off`}),(0,U.jsx)(lA,{label:`Project`,icon:dA.project,children:(0,U.jsx)(`span`,{"data-testid":`session-project`,children:o?o.name:`—`})}),s?(0,U.jsx)(`div`,{className:`whitespace-pre-wrap break-words pb-1 text-[11px] leading-snug text-fg-faint`,"data-testid":`session-project-instructions`,children:s.length>300?`${s.slice(0,300)}\u2026`:s}):null,r?null:(0,U.jsx)(`button`,{type:`button`,className:`text-[11px] text-accent hover:underline`,onClick:()=>t.openAssignProject(n.id),"data-testid":`session-change-project`,children:o?`Move to another project…`:`Move to a project…`}),(0,U.jsx)(lA,{label:`Folder`,icon:dA.folder,children:n.projectDir?`project`:`own workspace`}),(0,U.jsx)(`div`,{className:`mt-1 break-all font-mono text-[10px] text-fg-faint`,"data-testid":`session-folder`,children:n.cwd}),r?null:(0,U.jsx)(`button`,{type:`button`,className:`mt-1 text-[11px] text-accent hover:underline`,onClick:()=>t.openDialog(`project`),"data-testid":`session-change-folder`,children:`Change folder…`})]}),r?null:(0,U.jsxs)(`div`,{className:`space-y-1.5`,"data-testid":`session-scheduled-tasks`,children:[(0,U.jsx)(uA,{label:`Scheduled tasks`,icon:dA.session}),(0,U.jsx)(jO,{sessionId:n.id})]}),i?.init?(0,U.jsxs)(`div`,{className:`text-[11px] text-fg-faint`,children:[`engine `,i.init.claudeCodeVersion,` · `,i.init.tools.length,` tools`]}):null]}):(0,U.jsx)(`div`,{className:`p-4 text-xs text-fg-faint`,children:`Open a chat to see its statistics.`})]})}function mA(e){let t=e=>e.type===`dir`?0:1;return[...e].sort((e,n)=>t(e)-t(n)||e.name.localeCompare(n.name))}function hA(e){let t=[];return e.target.type===`file`&&t.push({key:`open`,label:`Open`,icon:(0,U.jsx)(K.File,{className:`w-3.5 h-3.5`}),onSelect:e.onOpen,testId:`files-menu-open`}),t.push({key:`copy-path`,label:`Copy path`,icon:(0,U.jsx)(K.Copy,{className:`w-3.5 h-3.5`}),disabled:!e.canCopyPath,onSelect:e.onCopyPath,testId:`files-menu-copy-path`},{key:`copy-relative-path`,label:`Copy relative path`,icon:(0,U.jsx)(K.Copy,{className:`w-3.5 h-3.5`}),onSelect:e.onCopyRelativePath,testId:`files-menu-copy-relative-path`}),!e.remote&&e.canDelete&&t.push({key:`delete`,label:`Delete…`,icon:(0,U.jsx)(K.Trash,{className:`w-3.5 h-3.5`}),danger:!0,separated:!0,onSelect:e.onDelete,testId:`files-menu-delete`}),t}function gA(e,t){return t instanceof jl&&t.status===404&&/^no route for /.test(t.message)?`This host is too old to delete files — update it from the title bar.`:`Could not delete ${uw(e.path)}: ${t instanceof Error?t.message:String(t)}`}function _A(){let{state:e,dispatch:t,actions:n,api:r}=W(),i=Jp(),a=qp(),o=i?.id??null,s=o?e.remote.tabs[o]!==void 0:!1,c=a?.status===`running`||a?.status===`waiting_permission`,l=o?e.files[o]?.active??null:null,u=e.info?.platform??null,d=i?.cwd??``,[f,p]=(0,v.useState)({}),[m,h]=(0,v.useState)(()=>new Set),[g,_]=(0,v.useState)(!1),y=(0,v.useRef)(f);y.current=f;let b=(0,v.useRef)(m);b.current=m;let x=(0,v.useRef)(o);x.current=o;let S=(0,v.useRef)(e.files);S.current=e.files;let[C,w]=(0,v.useState)(null),T=(0,v.useCallback)(()=>w(null),[]),E=(0,v.useCallback)((e,t,n)=>w({target:e,at:t,el:n}),[]),[D,O]=(0,v.useState)(null),[ee,k]=(0,v.useState)(!1),A=(0,v.useCallback)(()=>O(null),[]),j=(0,v.useCallback)(async e=>{if(!o||!r.listSessionFiles)return;let t=o;p(t=>({...t,[e]:{...t[e]??{entries:null},loading:!0,error:null}}));try{let n=await r.listSessionFiles(t,e);if(x.current!==t)return;_(!1),p(t=>({...t,[e]:{entries:mA(n.entries),loading:!1,error:null}}))}catch(n){if(x.current!==t)return;Fl(n)&&_(!0);let r=n instanceof Error?n.message:String(n);p(t=>({...t,[e]:{entries:t[e]?.entries??null,loading:!1,error:r}}))}},[r,o]);(0,v.useEffect)(()=>{p({}),h(new Set),_(!1),w(null),O(null),o&&!s&&j(``)},[o,s,j]);let M=(0,v.useRef)(c);(0,v.useEffect)(()=>{if(M.current&&!c&&o&&!s)for(let e of Object.keys(y.current))(e===``||b.current.has(e))&&j(e);M.current=c},[c,o,s,j]);let N=e=>{h(t=>{let n=new Set(t);return n.has(e)?n.delete(e):(n.add(e),y.current[e]?.entries||j(e)),n})},te=()=>{if(o){j(``);for(let e of m)j(e)}},P=(e,t)=>{ET(e).then(e=>n.toast(e?`success`:`error`,e?t:`Could not copy to the clipboard`))},F=async()=>{let e=D,i=o;if(!(!e||!i||!r.deleteSessionFile)){k(!0);try{await r.deleteSessionFile(i,e.path);for(let n of S.current[i]?.open??[])pw(n,e.path)&&t({type:`file_close`,sessionId:i,path:n});x.current===i&&(h(t=>new Set([...t].filter(t=>!pw(t,e.path)))),p(t=>Object.fromEntries(Object.entries(t).filter(([t])=>!pw(t,e.path)))),j(fw(e.path))),n.toast(`success`,`Deleted ${uw(e.path)}`)}catch(t){n.toast(`error`,gA(e,t)),x.current===i&&j(fw(e.path))}finally{k(!1),O(null)}}},ne=C?hA({target:C.target,remote:s,canDelete:typeof r.deleteSessionFile==`function`,canCopyPath:d!==``,onOpen:()=>n.openFile(C.target.path),onCopyPath:()=>P(gw(d,C.target.path,u),`Path copied`),onCopyRelativePath:()=>P(hw(C.target.path,mw(d,u)),`Relative path copied`),onDelete:()=>O(C.target)}):[],re=()=>void n.savePrefs({explorerOpen:!1}),ie=i?.cwd?uw(i.cwd)||i.cwd:`Files`,ae=f[``],oe=C?.target.path??null,se=(0,v.useMemo)(()=>o?s?(0,U.jsx)(yA,{children:`This chat runs on another PC; its files can be browsed there.`}):g?(0,U.jsx)(yA,{children:`This host is too old to list files — update it from the title bar.`}):ae?.error&&!ae.entries?(0,U.jsx)(yA,{tone:`danger`,children:ae.error}):ae?.entries?ae.entries.length===0?(0,U.jsx)(yA,{children:`The folder is empty.`}):(0,U.jsx)(`ul`,{role:`tree`,"aria-label":`Workspace files`,className:`py-1`,children:(0,U.jsx)(SA,{rel:``,depth:0,tree:f,expanded:m,activeFile:l,menuPath:oe,onToggle:N,onOpen:e=>n.openFile(e),onMenu:E})}):(0,U.jsx)(yA,{children:`Listing…`}):(0,U.jsx)(yA,{children:`Open a chat to browse the folder it works in.`}),[o,s,g,ae,f,m,l,oe,n]);return(0,U.jsxs)(`aside`,{className:`flex w-64 shrink-0 flex-col border-r border-border bg-surface`,"aria-label":`Files`,"data-testid":`file-explorer`,children:[(0,U.jsxs)(`div`,{className:`flex h-9 shrink-0 items-center gap-2 border-b border-border px-3`,children:[(0,U.jsx)(K.Folder,{className:`w-3.5 h-3.5 text-fg-faint`}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs font-semibold uppercase tracking-wide text-fg-muted`,title:i?.cwd??void 0,children:ie}),(0,U.jsx)(J,{label:`Refresh files`,className:`p-1`,onClick:te,disabled:!o||s,"data-testid":`file-explorer-refresh`,children:(0,U.jsx)(K.Refresh,{className:`w-3.5 h-3.5`})}),(0,U.jsx)(J,{label:`Hide files`,className:`p-1`,onClick:re,children:(0,U.jsx)(K.X,{className:`w-3.5 h-3.5`})})]}),(0,U.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:se}),(0,U.jsx)(ZE,{open:C!==null,at:C?.at??{x:0,y:0},anchorEl:C?.el??null,label:`File actions`,testId:`files-context-menu`,onClose:T,items:ne}),(0,U.jsx)(vA,{target:D,absolute:D?d?gw(d,D.path,u):D.path:``,platform:u,busy:ee,onConfirm:()=>void F(),onClose:A})]})}function vA({target:e,absolute:t,platform:n,busy:r,onConfirm:i,onClose:a}){let o=e?.type===`dir`;return(0,U.jsx)(um,{open:e!==null,title:o?`Delete this folder?`:`Delete this file?`,onClose:a,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(q,{onClick:a,disabled:r,"data-testid":`files-delete-cancel`,children:`Cancel`}),(0,U.jsx)(q,{variant:`danger`,busy:r,onClick:i,"data-testid":`files-delete-confirm`,children:`Delete permanently`})]}),children:(0,U.jsxs)(`div`,{className:`space-y-2 text-sm text-fg-muted`,"data-testid":`files-delete-dialog`,children:[(0,U.jsx)(`p`,{className:`break-all rounded bg-surface-2 px-2 py-1 font-mono text-xs text-fg`,children:t}),(0,U.jsxs)(`p`,{children:[o?`This folder and everything inside it will be deleted from the disk permanently.`:`This file will be deleted from the disk permanently.`,` `,`It does not go to the `,n===`win32`?`Recycle Bin`:`Trash`,`, and it cannot be undone.`]})]})})}function yA({children:e,tone:t}){return(0,U.jsx)(`div`,{className:H(`p-4 text-xs`,t===`danger`?`text-danger`:`text-fg-faint`),children:e})}function bA(e){let t=e.getBoundingClientRect();return{x:t.left+24,y:t.bottom}}function xA(e,t){return{onContextMenu:n=>{n.preventDefault();let r=n.currentTarget;t(e,n.clientX===0&&n.clientY===0?bA(r):{x:n.clientX,y:n.clientY},r)},onKeyDown:n=>{(n.key===`ContextMenu`||n.shiftKey&&n.key===`F10`)&&(n.preventDefault(),t(e,bA(n.currentTarget),n.currentTarget))}}}function SA({rel:e,depth:t,tree:n,expanded:r,activeFile:i,menuPath:a,onToggle:o,onOpen:s,onMenu:c}){let l=n[e];return l?l.error&&!l.entries?(0,U.jsx)(`li`,{className:`px-2 py-1 text-[11px] text-danger`,style:{paddingLeft:`${.5+t*.75}rem`},children:l.error}):l.entries?(0,U.jsx)(U.Fragment,{children:l.entries.map(l=>{let u=dw(e,l.name),d=a===u;if(l.type===`dir`){let e=r.has(u);return(0,U.jsxs)(`li`,{role:`treeitem`,"aria-expanded":e,children:[(0,U.jsxs)(`button`,{type:`button`,onClick:()=>o(u),...xA({path:u,type:`dir`},c),"data-testid":`explorer-dir-${u}`,className:H(`flex w-full items-center gap-1 py-0.5 pr-2 text-left text-xs text-fg hover:bg-surface-2`,d&&`bg-surface-2`),style:{paddingLeft:`${.5+t*.75}rem`},children:[(0,U.jsx)(K.ChevronRight,{className:H(`w-3 h-3 shrink-0 text-fg-faint transition-transform`,e&&`rotate-90`)}),(0,U.jsx)(K.Folder,{className:`w-3.5 h-3.5 shrink-0 text-fg-faint`}),(0,U.jsx)(`span`,{className:`truncate`,children:l.name})]}),e?(0,U.jsx)(`ul`,{role:`group`,children:(0,U.jsx)(SA,{rel:u,depth:t+1,tree:n,expanded:r,activeFile:i,menuPath:a,onToggle:o,onOpen:s,onMenu:c})}):null]},u)}let f=i===u;return(0,U.jsx)(`li`,{role:`treeitem`,"aria-selected":f,children:(0,U.jsxs)(`button`,{type:`button`,onClick:()=>s(u),...xA({path:u,type:l.type},c),disabled:l.type!==`file`,"data-testid":`explorer-file-${u}`,title:`${u} · ${Fw(l.size)}`,className:H(`flex w-full items-center gap-1 py-0.5 pr-2 text-left text-xs hover:bg-surface-2 disabled:opacity-50`,f?`bg-accent-soft text-accent`:d?`bg-surface-2 text-fg`:`text-fg`),style:{paddingLeft:`${.5+t*.75+.9}rem`},children:[(0,U.jsx)(K.File,{className:`w-3.5 h-3.5 shrink-0 text-fg-faint`}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:l.name}),(0,U.jsx)(`span`,{className:`shrink-0 text-[10px] text-fg-faint`,children:Fw(l.size)})]})},u)})}):(0,U.jsx)(`li`,{className:`px-2 py-1 text-[11px] text-fg-faint`,style:{paddingLeft:`${.5+t*.75}rem`},children:`Listing…`}):null}var CA=524288,wA={shown:null,bytes:0,pixels:null,error:null,loading:!1},TA=[{value:`source`,label:`Source`},{value:`preview`,label:`Preview`}],EA=`preview`;function DA(){let{state:e,actions:t,api:n}=W(),r=qp(),i=e.currentSessionId,a=i?e.files[i]:void 0,o=a?.active??null,s=r?.status===`running`||r?.status===`waiting_permission`,[c,l]=(0,v.useState)({sessionId:i,files:{}}),u=c.sessionId===i?c.files:{},[d,f]=(0,v.useState)(EA),p=e=>{EA=e,f(e)},m=(0,v.useRef)(i);m.current=i;let h=(e,t,n)=>l(r=>{let i=r.sessionId===e?r.files:{};return{sessionId:e,files:{...i,[t]:n(i[t]??wA)}}}),g=async e=>{if(!i)return;let t=i;h(t,e,e=>({...e,loading:!0,error:null}));try{let r=await OA(n,t,e);if(m.current!==t)return;h(t,e,e=>{let t=e.shown!==null&&jA(e.shown,r.shown);return{shown:t?e.shown:r.shown,bytes:r.bytes,pixels:t?e.pixels:null,error:null,loading:!1}})}catch(n){if(m.current!==t)return;let r=n instanceof Error?n.message:String(n);h(t,e,e=>({...e,error:r,loading:!1}))}},_=(e,t,n)=>{if(!i||t<=0||n<=0)return;let r=i;l(i=>{let a=i.sessionId===r?i.files[e]:void 0;return!a||a.pixels?.w===t&&a.pixels.h===n?i:{...i,files:{...i.files,[e]:{...a,pixels:{w:t,h:n}}}}})},y=JSON.stringify(a?.open??[]);(0,v.useEffect)(()=>{let e=new Set(JSON.parse(y));l(t=>{let n=Object.keys(t.files).filter(t=>e.has(t));return n.length===Object.keys(t.files).length?t:{...t,files:Object.fromEntries(n.map(e=>[e,t.files[e]]))}})},[y]);let b=(0,v.useRef)(s);if((0,v.useEffect)(()=>{let e=b.current&&!s;b.current=s,o&&(e||!u[o])&&g(o)},[o,s,i]),!i||!a||!o)return null;let x=u[o],S=x?.shown??null,C=S?.kind===`text`&&S.markdown;return(0,U.jsxs)(`section`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-bg`,"aria-label":`File viewer`,"data-testid":`file-viewer`,children:[(0,U.jsxs)(`div`,{className:`flex h-8 shrink-0 items-center gap-2 border-b border-border px-3 font-mono text-[11px] text-fg-faint`,children:[(0,U.jsx)(K.File,{className:`w-3.5 h-3.5 shrink-0`}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,title:o,children:o}),x?.pixels?(0,U.jsxs)(`span`,{className:`shrink-0`,"data-testid":`file-viewer-pixels`,children:[x.pixels.w,` × `,x.pixels.h]}):null,S?(0,U.jsx)(`span`,{className:`shrink-0`,children:Fw(x.bytes)}):null,C?(0,U.jsx)(`span`,{className:`shrink-0 font-sans`,children:(0,U.jsx)(fm,{label:`Markdown view`,value:d,options:TA,onChange:p})}):null,(0,U.jsx)(`span`,{className:`shrink-0 rounded bg-surface-2 px-1 text-[10px] uppercase tracking-wide`,children:`read-only`}),(0,U.jsx)(J,{label:`Re-read this file`,className:`p-1`,onClick:()=>void g(o),"data-testid":`file-viewer-refresh`,children:(0,U.jsx)(K.Refresh,{className:`w-3.5 h-3.5`})}),(0,U.jsx)(J,{label:`Back to the chat`,className:`p-1`,onClick:()=>t.showChat(),"data-testid":`file-viewer-back`,children:(0,U.jsx)(K.X,{className:`w-3.5 h-3.5`})})]}),(0,U.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto px-3 py-2`,"data-testid":`file-viewer-body`,children:(0,U.jsx)(MA,{path:o,loaded:x,markdownMode:d,onPixels:(e,t)=>_(o,e,t)},`${i}\n${o}`)})]})}async function OA(e,t,n){let r=Cw(n),i=e.readSessionFileBytes?async()=>new Uint8Array(await e.readSessionFileBytes(t,n)):null;if(i&&r.mime!==null){let e=await i();return{shown:kA(r.kind,r.mime,e),bytes:e.byteLength}}if(i&&r.kind===`unknown`)return AA(await i(),!1);if(!e.readSessionFile)throw Error(`This host cannot read files — update it.`);let a=await e.readSessionFile(t,n),o=r.kind===`markdown`;return Mw(a)?i?AA(await i(),o):{shown:{kind:`binary`},bytes:a.length}:{shown:{kind:`text`,text:a,markdown:o},bytes:a.length}}function kA(e,t,n){return e===`pdf`?{kind:`pdf`}:{kind:e,blob:new Blob([n],{type:t}),digest:Pw(n)}}function AA(e,t){let n=kw(e);if(n)return{shown:kA(n.kind,n.mime,e),bytes:e.length};let r=Nw(e);return{shown:r===null?{kind:`binary`}:{kind:`text`,text:r,markdown:t},bytes:e.length}}function jA(e,t){return`digest`in e&&`digest`in t&&e.kind===t.kind&&e.digest===t.digest}function MA({path:e,loaded:t,markdownMode:n,onPixels:r}){if(!t||t.loading&&t.shown===null)return(0,U.jsx)(NA,{children:`Reading…`});if(t.error&&t.shown===null)return(0,U.jsx)(NA,{tone:`danger`,testId:`file-viewer-error`,children:t.error});let i=t.shown;if(!i)return null;let a=uw(e),o=Fw(t.bytes);switch(i.kind){case`image`:return(0,U.jsx)(LA,{blob:i.blob,name:a,onPixels:r},i.digest);case`audio`:case`video`:return(0,U.jsx)(RA,{kind:i.kind,blob:i.blob,name:a,size:o},i.digest);case`pdf`:return(0,U.jsxs)(NA,{testId:`file-viewer-pdf`,children:[a,` is a PDF document (`,o,`). The viewer cannot show PDF files — copy its path from the file list to open it in a PDF reader.`]});case`binary`:return(0,U.jsxs)(NA,{testId:`file-viewer-binary`,children:[a,` is not a text file (`,o,`), and not a picture or a clip the viewer can show.`]});case`text`:return(0,U.jsx)(PA,{path:e,text:i.text,markdown:i.markdown,mode:n})}}function NA({children:e,tone:t,testId:n}){return(0,U.jsx)(`div`,{className:t===`danger`?`py-4 text-xs text-danger`:`py-4 text-xs text-fg-faint`,"data-testid":n,children:e})}function PA({path:e,text:t,markdown:n,mode:r}){let i=t.length>CA,a=i?t.slice(0,CA):t;return(0,U.jsxs)(U.Fragment,{children:[n&&r===`preview`?(0,U.jsx)(`div`,{className:`max-w-3xl py-2 text-sm`,"data-testid":`file-viewer-markdown`,children:(0,U.jsx)(FT,{text:a})}):(0,U.jsx)(OT,{code:a,language:xw(e)}),i?(0,U.jsxs)(`div`,{className:`pb-2 text-[11px] text-fg-faint`,children:[`Showing the first `,Fw(CA),` of `,Fw(t.length),`.`]}):null]})}function FA(e){let[t,n]=(0,v.useState)(null);return(0,v.useEffect)(()=>{let t=URL.createObjectURL(e);return n(t),()=>URL.revokeObjectURL(t)},[e]),t}var IA={backgroundImage:`repeating-conic-gradient(rgb(128 128 128 / 0.22) 0% 25%, transparent 0% 50%)`,backgroundSize:`16px 16px`};function LA({blob:e,name:t,onPixels:n}){let r=FA(e),[i,a]=(0,v.useState)(!1);return i?(0,U.jsxs)(NA,{testId:`file-viewer-image-error`,children:[t,` could not be drawn — it may be damaged, or not the kind of picture its name says.`]}):r?(0,U.jsx)(`div`,{className:`flex h-full min-h-0 items-center justify-center`,children:(0,U.jsx)(`img`,{src:r,alt:t,draggable:!1,"data-testid":`file-viewer-image`,className:`block max-h-full max-w-full object-contain`,style:IA,onLoad:e=>n(e.currentTarget.naturalWidth,e.currentTarget.naturalHeight),onError:()=>a(!0)})}):null}function RA({kind:e,blob:t,name:n,size:r}){let i=FA(t),[a,o]=(0,v.useState)(null);if((0,v.useEffect)(()=>{let e=e=>{e.effectiveDirective===`media-src`&&e.blockedURI.startsWith(`blob`)&&o(`policy`)};return document.addEventListener(`securitypolicyviolation`,e),()=>document.removeEventListener(`securitypolicyviolation`,e)},[]),a)return(0,U.jsx)(NA,{testId:`file-viewer-media-error`,children:a===`policy`?`${n} (${r}) cannot be played in this window: its security policy does not allow audio or video yet.`:`${n} (${r}) cannot be played here: its format or codec is not one Chromium plays.`});if(!i)return null;let s=()=>o(e=>e??`format`);return e===`audio`?(0,U.jsx)(`div`,{className:`flex h-full min-h-0 items-center justify-center`,children:(0,U.jsx)(`audio`,{src:i,controls:!0,preload:`metadata`,onError:s,"data-testid":`file-viewer-audio`,className:`w-full max-w-xl`})}):(0,U.jsx)(`div`,{className:`flex h-full min-h-0 items-center justify-center`,children:(0,U.jsx)(`video`,{src:i,controls:!0,preload:`metadata`,onError:s,"data-testid":`file-viewer-video`,className:`block max-h-full max-w-full bg-black`})})}var zA={autoAccept:{hint:`Allow every tool the agent wants to use, without asking you. Off by default.`,details:[`Answered by this PC itself, so it covers EVERY chat running here — started in this app, the oona terminal, your phone, Telegram, the website or another PC.`,`The agent’s questions to you (its multiple-choice cards) still wait for your answer.`,`Subagents never ask: their tool requests are always allowed.`,`Takes effect at the next tool request, even in a chat that is already working.`,`What a chat may attempt at all is still its own Build / Plan / Ask first / Autonomous choice in the composer; this only answers the prompts it would have shown you.`]},reasoning:{hint:`Show the model’s thinking between its messages.`,details:[`Display only — the model thinks the same either way.`,`Hidden thinking is also left out of chat search (Ctrl+F).`,`For the windows this PC serves (this app, the local web UI). The phone has its own switch.`]},colourScheme:{hint:`System follows your desktop’s light or dark setting.`,details:[`Also colours this window’s title bar and menu.`,`Your own colours per element are under Theme.`]},notifications:{hint:`Desktop notifications from this app while its window is not in front.`,details:[`Nothing pops up while you are looking at the window.`,`Your phone’s push notifications are separate: the phone buzzes only while no window on this PC is open.`]},notifyFinished:{hint:`When a chat’s turn ends — finished, or failed.`,details:[`Named after the chat; clicking the notification opens it.`]},notifyWaiting:{hint:`When a chat waits for you: a permission, or one of the agent’s questions.`,details:[`With auto-accept on, only the agent’s questions still wait for you, so only they notify.`]},notifyError:{hint:`When a chat stops on an error.`,details:[`The error itself is also written into the chat.`]},transcriptWindow:{hint:`How many messages and tool cards of a chat stay drawn; older ones leave the top like a stack and come back when you scroll up.`,details:[`Only what is DRAWN: the whole chat is still kept, and still searched.`,`Smaller is faster on long agentic chats; larger keeps more on screen.`]},defaultCwd:{hint:`The folder a new chat runs in when it is not given one. Empty: each chat gets its own private folder.`,details:[`A folder here becomes each new chat’s project: its CLAUDE.md, .claude settings, hooks and skills load. Your home folder and drive roots never load as a project.`,`Empty is the safe default: the agent then works only inside that chat’s own folder under OonaCode’s data directory.`,`Used by chats started in this app. A project’s own folder (Projects → New chats) wins over it; the oona terminal always uses the folder you run it in.`]},mirrorHistory:{hint:`Keep an encrypted copy of this PC’s chats on your account.`,details:[`Encrypted on this PC with your vault key before it is uploaded: the server stores only ciphertext it cannot read.`,`It is how your phone, the website and your other PCs list and read this PC’s chats — also while this PC is off.`,`Turning it off stops uploading; what is already on your account stays until you delete those chats.`]},remoteAccess:{hint:`Let your phone, Telegram, the website and your other PCs reach this PC.`,details:[`This PC keeps one outbound, end-to-end encrypted channel to your OonaCode server; every other device reaches it through that channel alone.`,`Off: they still see this PC online, marked “remote access off”, and cannot open its chats, send prompts, unlock it remotely or delete its chats. This PC also cannot open chats on your other PCs.`,`Chat history already mirrored to your account stays readable everywhere.`,`Takes effect immediately.`]},keepUnlocked:{hint:`Leave your vault unlocked when you close or quit the app.`,details:[`Off (default): closing the window — to the tray too — or quitting stops the chats that are running and locks this PC until you unlock it. Your phone and other devices cannot use it meanwhile.`,`On: chats keep running and your other devices keep working after the window is closed. Choose it on a PC only you use.`]},server:{hint:`Your account’s OonaCode server.`,details:[`Where your account lives: sign-in, OonaCode-pool models and credits, your encrypted vault and chat history, remote access, and app updates.`,`Your own API keys and subscriptions never go through it — this PC calls those providers directly.`,`Set by signing in. (Developers point a build at another server with OONACODE_GATEWAY_URL.)`]},diagnostics:{hint:`While you are signed in, this PC sends OonaCode its warnings and errors, and a short report of any turn that fails.`,details:[`A report names the error, the model and the provider — never the content of your chats.`,`It is how bugs you never reported get fixed. There is no usage tracking.`]}},BA=[{id:`general`,label:`General`,icon:K.Settings},{id:`theme`,label:`Theme`,icon:K.Palette},{id:`advanced`,label:`Advanced`,icon:K.Sliders},{id:`providers`,label:`Providers`,icon:K.Plug},{id:`devices`,label:`Devices`,icon:K.Monitor},{id:`host`,label:`This PC`,icon:K.Stethoscope}];function VA(){let{state:e,actions:t}=W(),n=e.prefs,r=e.settings?.theme??`system`;return(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(dm,{label:`Auto-accept permissions`,hint:zA.autoAccept.hint,details:zA.autoAccept.details,checked:n.autoAcceptPermissions,onChange:e=>void t.savePrefs({autoAcceptPermissions:e}),testId:`settings-auto-accept`}),(0,U.jsx)(dm,{label:`Show reasoning in the timeline`,hint:zA.reasoning.hint,details:zA.reasoning.details,checked:n.showReasoningSummaries,onChange:e=>void t.savePrefs({showReasoningSummaries:e})}),(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border py-3`,children:[(0,U.jsxs)(`span`,{children:[(0,U.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm font-medium text-fg`,children:[`Colour scheme`,(0,U.jsx)(om,{label:`Colour scheme`,details:(0,U.jsx)(sm,{items:zA.colourScheme.details})})]}),(0,U.jsx)(`span`,{className:`mt-0.5 block text-xs text-fg-faint`,children:zA.colourScheme.hint})]}),(0,U.jsx)(fm,{label:`Colour scheme`,value:r,options:[{value:`system`,label:`System`},{value:`dark`,label:`Dark`},{value:`light`,label:`Light`}],onChange:e=>void t.saveSettings({theme:e})})]}),(0,U.jsxs)(`div`,{className:`border-t border-border pt-2`,children:[(0,U.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-fg-faint`,children:[(0,U.jsx)(K.Bell,{className:`w-3 h-3`}),` Notifications`,(0,U.jsx)(om,{label:`Notifications`,details:(0,U.jsx)(sm,{items:zA.notifications.details})})]}),(0,U.jsx)(`p`,{className:`text-xs text-fg-faint`,children:zA.notifications.hint}),(0,U.jsx)(dm,{label:`Agent finished or needs attention`,hint:zA.notifyFinished.hint,details:zA.notifyFinished.details,checked:n.notifications.agentFinished,onChange:e=>void t.savePrefs({notifications:{...n.notifications,agentFinished:e}})}),(0,U.jsx)(dm,{label:`Permission or question waiting for you`,hint:zA.notifyWaiting.hint,details:zA.notifyWaiting.details,checked:n.notifications.permissionRequired,onChange:e=>void t.savePrefs({notifications:{...n.notifications,permissionRequired:e}})}),(0,U.jsx)(dm,{label:`Error occurred`,hint:zA.notifyError.hint,details:zA.notifyError.details,checked:n.notifications.errorOccurred,onChange:e=>void t.savePrefs({notifications:{...n.notifications,errorOccurred:e}})})]}),e.prefsBackend===`local`?(0,U.jsx)(`div`,{className:`mt-2 rounded-md bg-warn-soft px-3 py-2 text-xs text-warn`,children:`This host does not store UI preferences yet, so they are kept on this device only.`}):null]})}function HA(e){let t=e.replace(/-/g,` `);return t.charAt(0).toUpperCase()+t.slice(1)}function UA(e){let t={};if(typeof document>`u`||typeof getComputedStyle!=`function`)return t;let n=document.documentElement,r=n.getAttribute(`data-theme`),i=[];for(let e of rc){let t=n.style.getPropertyValue(`--${e}`);t&&i.push([e,t]),n.style.removeProperty(`--${e}`)}n.setAttribute(`data-theme`,e);let a=getComputedStyle(n);for(let e of rc){let n=a.getPropertyValue(`--${e}`).trim();t[e]=/^#[0-9a-fA-F]{6}$/.test(n)?n.toLowerCase():`#808080`}r===null?n.removeAttribute(`data-theme`):n.setAttribute(`data-theme`,r);for(let[e,t]of i)n.style.setProperty(`--${e}`,t);return t}function WA(){let{state:e,actions:t}=W(),n=e.prefs,[r,i]=(0,v.useState)(`dark`),a=(0,v.useMemo)(()=>UA(r),[r]),[o,s]=(0,v.useState)({}),c=(0,v.useRef)(o);c.current=o;let l=(0,v.useRef)(n.themeColors);l.current=n.themeColors;let u=(0,v.useRef)(null),d=()=>{u.current!==null&&(window.clearTimeout(u.current),u.current=null)};(0,v.useEffect)(()=>d,[]);let f=e=>{d();let n=c.current;Object.keys(n).length!==0&&(s({}),t.savePrefs({themeColors:{...l.current,[e]:{...l.current[e],...n}}}))},p=(e,t)=>{s(n=>({...n,[e]:t})),c.current={...c.current,[e]:t},d(),u.current=window.setTimeout(()=>f(r),300)},m={...l.current[r],...o},h=Object.keys(m).length,g=e=>{d(),s({});let n={...m};delete n[e],t.savePrefs({themeColors:{...l.current,[r]:n}})};return(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,U.jsxs)(`div`,{className:`min-w-0`,children:[(0,U.jsx)(`div`,{className:`text-sm font-medium text-fg`,children:`Theme colours`}),(0,U.jsx)(`div`,{className:`mt-0.5 text-xs text-fg-faint`,children:`Choose any colour for any element. A colour you do not choose keeps the theme's own value. Your colours follow your account to every PC.`})]}),(0,U.jsx)(fm,{label:`Edit colour scheme`,value:r,options:[{value:`light`,label:`Light`},{value:`dark`,label:`Dark`}],onChange:e=>{f(r),i(e)}})]}),(0,U.jsx)(`div`,{className:`grid grid-cols-1 gap-x-4 sm:grid-cols-2`,children:rc.map(e=>{let t=m[e]!==void 0,n=m[e]??a[e]??`#808080`;return(0,U.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border py-1.5`,"data-testid":`theme-color-row-${r}-${e}`,children:[(0,U.jsx)(`input`,{type:`color`,className:`h-6 w-9 shrink-0 cursor-pointer rounded border border-border bg-transparent p-0.5`,value:n,onChange:t=>p(e,t.target.value),"aria-label":`${HA(e)} colour (${r} scheme)`,"data-testid":`theme-color-${r}-${e}`}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs text-fg-muted`,children:HA(e)}),(0,U.jsx)(`span`,{className:`w-16 shrink-0 text-right font-mono text-[10px] text-fg-faint`,children:t?m[e]:`default`}),t?(0,U.jsx)(J,{label:`Reset ${HA(e)} to the theme colour`,className:`p-0.5`,"data-testid":`theme-color-clear-${r}-${e}`,onClick:()=>g(e),children:(0,U.jsx)(K.Refresh,{className:`w-3 h-3`})}):null]},e)})}),(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border pt-2`,children:[(0,U.jsx)(`span`,{className:`text-xs text-fg-faint`,"data-testid":`theme-colors-count`,children:h===0?`No custom colours in the ${r} scheme.`:`${h} custom colour${h===1?``:`s`} in the ${r} scheme.`}),(0,U.jsx)(q,{size:`sm`,variant:`ghost`,onClick:()=>{d(),s({}),t.savePrefs({themeColors:{...l.current,[r]:{}}})},disabled:h===0,"data-testid":`theme-reset-${r}`,children:`Reset all`})]})]})}function GA(){let{state:e,actions:t}=W(),n=e.prefs,[r,i]=(0,v.useState)(String(n.transcriptWindowSize));return(0,v.useEffect)(()=>i(String(n.transcriptWindowSize)),[n.transcriptWindowSize]),(0,U.jsx)(`div`,{className:`space-y-1`,children:(0,U.jsx)(cm,{label:`Transcript window size`,hint:`${zA.transcriptWindow.hint} Scrolling to the top brings back 100 more. 100–${nc}, default 500.`,details:zA.transcriptWindow.details,children:(0,U.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(`input`,{className:H(Y,`w-32`),type:`number`,min:100,max:nc,step:100,value:r,onChange:e=>i(e.target.value),onBlur:()=>{let e=Number.parseInt(r,10);Number.isFinite(e)&&t.savePrefs({transcriptWindowSize:e})},"aria-label":`Transcript window size`}),(0,U.jsx)(`span`,{className:`text-xs text-fg-faint`,children:`messages and tool cards`})]})})})}function KA(){let{state:e,actions:t}=W(),n=(0,v.useMemo)(()=>vs(e.providers),[e.providers]);return(0,U.jsxs)(`div`,{className:`space-y-1.5`,children:[n.length===0?(0,U.jsx)(`div`,{className:`py-6 text-center text-sm text-fg-muted`,children:`No providers in the registry.`}):null,n.map(n=>{let r=n.definition,i=e.activeProviderId===r.id,a=_s(e.providers,r.id),o=a.some(e=>e.configured),s=[...new Set(a.flatMap(e=>(e.credentials??[]).map(e=>e.class)))].filter(e=>e!==`none`);return(0,U.jsxs)(`div`,{className:`flex items-center gap-3 rounded-md border border-border px-3 py-2`,"data-testid":`provider-${r.id}`,children:[(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[(0,U.jsx)(`span`,{className:`text-sm font-medium`,children:r.displayName}),i?(0,U.jsx)(X,{tone:`accent`,children:`active`}):null,r.route===`direct`?(0,U.jsx)(X,{tone:`ok`,children:`direct`}):null,s.length>0?s.map(e=>(0,U.jsxs)(X,{tone:`ok`,children:[e===`subscription`?`subscription`:`API key`,` connected`]},e)):o?(0,U.jsx)(X,{tone:`ok`,children:`connected`}):(0,U.jsx)(X,{tone:`warn`,children:`not connected`})]}),(0,U.jsxs)(`div`,{className:`truncate text-[11px] text-fg-faint`,children:[r.models.length,` model`,r.models.length===1?``:`s`,r.credentialVariants?.length?` · ${r.credentialVariants.map(e=>e.label).join(` / `)}`:``]})]}),(0,U.jsxs)(q,{size:`sm`,variant:o?`secondary`:`primary`,onClick:()=>t.openProviderConnect(r.id),children:[(0,U.jsx)(K.Plus,{className:`w-3 h-3`}),` `,o?`Manage…`:`Connect`]})]},r.id)}),(0,U.jsx)(`div`,{className:`pt-3`,children:(0,U.jsx)(Sk,{})})]})}function qA(){let{state:e,actions:t}=W(),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(``);return(0,v.useEffect)(()=>{t.refreshHosts()},[t]),e.account?.loggedIn?e.remote.supported?(0,U.jsxs)(`div`,{className:`space-y-1.5`,children:[e.remote.loading?(0,U.jsxs)(`div`,{className:`flex items-center gap-2 py-4 text-sm text-fg-muted`,children:[(0,U.jsx)(K.Spinner,{}),` Loading devices…`]}):null,e.remote.hosts.map(e=>(0,U.jsxs)(`div`,{className:`flex items-center gap-3 rounded-md border border-border px-3 py-2`,children:[(0,U.jsx)(K.Monitor,{className:`w-4 h-4 shrink-0 text-fg-faint`}),(0,U.jsx)(`div`,{className:`min-w-0 flex-1`,children:n===e.hostId?(0,U.jsx)(`input`,{className:Y,value:i,autoFocus:!0,"aria-label":`Label for ${e.hostName}`,onChange:e=>a(e.target.value),onKeyDown:n=>{n.key===`Enter`&&i.trim()?(t.renameHost(e.hostId,i.trim()),r(null)):n.key===`Escape`&&r(null)}}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-1.5 text-sm font-medium`,children:[e.label||e.hostName,e.isSelf?(0,U.jsx)(X,{tone:`accent`,children:`this PC`}):null,(0,U.jsx)(X,{tone:e.online?`ok`:`neutral`,children:e.online?`online`:`offline`}),e.remoteAccessOff?(0,U.jsx)(X,{tone:`warn`,children:`remote access off`}):null]}),(0,U.jsxs)(`div`,{className:`truncate text-[11px] text-fg-faint`,children:[e.platform,e.appVersion?` · v${e.appVersion}`:``,e.lastSeenAt?` · seen ${pd(e.lastSeenAt)}`:``]})]})}),n===e.hostId?(0,U.jsx)(q,{size:`sm`,variant:`primary`,onClick:()=>{i.trim()&&t.renameHost(e.hostId,i.trim()),r(null)},children:`Save`}):(0,U.jsxs)(q,{size:`sm`,onClick:()=>{r(e.hostId),a(e.label||e.hostName)},children:[(0,U.jsx)(K.Edit,{className:`w-3 h-3`}),` Rename`]})]},e.hostId)),!e.remote.loading&&e.remote.hosts.length===0?(0,U.jsx)(`div`,{className:`py-6 text-center text-sm text-fg-muted`,children:`No devices reported yet.`}):null]}):(0,U.jsxs)(`div`,{className:`rounded-md border border-border px-3 py-3 text-sm text-fg-muted`,children:[`This host build cannot list your account's devices yet (the relay lands with the server phase). This PC is `,(0,U.jsx)(`strong`,{children:e.connection.hostName??`unknown`}),`.`]}):(0,U.jsx)(`div`,{className:`py-6 text-center text-sm text-fg-muted`,children:`Sign in to see the devices on your account.`})}function JA(){let{state:e,actions:t}=W(),n=e.settings,[r,i]=(0,v.useState)(n?.defaultCwd??``);if((0,v.useEffect)(()=>i(n?.defaultCwd??``),[n?.defaultCwd]),!n)return(0,U.jsx)(`div`,{className:`py-6 text-sm text-fg-muted`,children:`Loading settings…`});let a=e.account?.gatewayUrl??n.gatewayUrl??x,o=e=>{let r=e.trim()?e.trim():null;r!==(n.defaultCwd??null)&&t.saveSettings({defaultCwd:r})},s=async()=>{let e=await window.oonacode?.pickDirectory?.({title:`The folder new chats run in`,...r?{defaultPath:r}:{}});e&&(i(e),o(e))};return(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)(cm,{label:`Default working directory`,hint:zA.defaultCwd.hint,details:zA.defaultCwd.details,children:(0,U.jsxs)(`div`,{className:`flex gap-2`,children:[(0,U.jsx)(`input`,{className:H(Y,`flex-1 font-mono text-xs`),value:r,onChange:e=>i(e.target.value),onBlur:()=>o(r),placeholder:`Empty — each chat gets its own folder`,spellCheck:!1,"data-testid":`settings-default-cwd`}),window.oonacode?.pickDirectory?(0,U.jsx)(q,{size:`sm`,variant:`ghost`,onClick:()=>void s(),children:`Choose…`}):null,r?(0,U.jsx)(q,{size:`sm`,variant:`ghost`,onClick:()=>{i(``),o(``)},children:`Clear`}):null]})}),(0,U.jsxs)(`div`,{className:`border-t border-border pt-1`,children:[(0,U.jsx)(dm,{label:`Mirror chat history to my account`,hint:zA.mirrorHistory.hint,details:zA.mirrorHistory.details,checked:n.mirrorHistory,onChange:e=>void t.saveSettings({mirrorHistory:e}),testId:`settings-mirror`}),(0,U.jsx)(dm,{label:`Remote access`,hint:zA.remoteAccess.hint,details:zA.remoteAccess.details,checked:n.relayEnabled??!0,onChange:e=>void t.saveSettings({relayEnabled:e}),testId:`settings-relay`}),(0,U.jsx)(dm,{label:`Keep the vault unlocked when the app closes`,hint:zA.keepUnlocked.hint,details:zA.keepUnlocked.details,checked:n.keepUnlockedOnExit??!1,onChange:e=>void t.saveSettings({keepUnlockedOnExit:e}),testId:`settings-keep-unlocked-exit`})]}),(0,U.jsxs)(`div`,{className:`space-y-2 border-t border-border pt-3 text-xs`,children:[(0,U.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,U.jsxs)(`span`,{children:[(0,U.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm font-medium text-fg`,children:[`Server`,(0,U.jsx)(om,{label:`Server`,details:(0,U.jsx)(sm,{items:zA.server.details})})]}),(0,U.jsx)(`span`,{className:`block text-fg-faint`,children:zA.server.hint})]}),(0,U.jsx)(`span`,{className:`break-all font-mono text-fg-muted`,"data-testid":`settings-server`,children:a})]}),(0,U.jsxs)(`div`,{children:[(0,U.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm font-medium text-fg`,children:[`Diagnostics`,(0,U.jsx)(om,{label:`Diagnostics`,details:(0,U.jsx)(sm,{items:zA.diagnostics.details})})]}),(0,U.jsx)(`span`,{className:`block text-fg-faint`,children:zA.diagnostics.hint})]})]})]})}function YA({open:e,onClose:t}){let{state:n,actions:r}=W(),[i,a]=(0,v.useState)(`general`),o=n.ui.settingsSection;return(0,v.useEffect)(()=>{e&&o&&a(o)},[e,o]),(0,v.useEffect)(()=>{e&&!n.settings&&r.refreshSettings()},[e,n.settings,r]),(0,U.jsx)(um,{open:e,title:`Settings`,onClose:t,wide:!0,footer:(0,U.jsx)(q,{onClick:t,children:`Done`}),children:(0,U.jsxs)(`div`,{className:`flex min-h-[22rem] gap-4`,children:[(0,U.jsxs)(`nav`,{className:`w-36 shrink-0 space-y-0.5`,"aria-label":`Settings sections`,children:[BA.map(e=>{let t=e.icon;return(0,U.jsxs)(`button`,{type:`button`,onClick:()=>a(e.id),"aria-current":i===e.id?`true`:void 0,className:H(`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm`,i===e.id?`bg-accent-soft font-medium text-accent`:`text-fg-muted hover:bg-surface-2`),children:[(0,U.jsx)(t,{className:`w-3.5 h-3.5`}),e.label]},e.id)}),(0,U.jsxs)(`div`,{className:`pt-3 text-[11px] text-fg-faint`,children:[`OonaCode Desktop v`,mp(typeof window<`u`&&window.oonacode?.appVersion||n.connection.appVersion||`0.0.0`,pp({bridge:typeof window<`u`?window.oonacode:void 0,info:n.info}))]})]}),(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[i===`general`?(0,U.jsx)(VA,{}):null,i===`theme`?(0,U.jsx)(WA,{}):null,i===`advanced`?(0,U.jsx)(GA,{}):null,i===`providers`?(0,U.jsx)(KA,{}):null,i===`devices`?(0,U.jsx)(qA,{}):null,i===`host`?(0,U.jsx)(JA,{}):null]})]})})}function XA({toast:e}){let{actions:t}=W();(0,v.useEffect)(()=>{let n=setTimeout(()=>t.dismissToast(e.id),e.kind===`error`?9e3:5e3);return()=>clearTimeout(n)},[e.id,e.kind,t]);let n=e.kind===`error`?`border-danger/50 bg-danger-soft text-danger`:e.kind===`success`?`border-ok/50 bg-ok-soft text-ok`:`border-border bg-surface text-fg`;return(0,U.jsxs)(`div`,{role:e.kind===`error`?`alert`:`status`,className:H(`pointer-events-auto flex max-w-sm items-start gap-2 rounded-md border px-3 py-2 text-sm shadow-md`,n),children:[e.kind===`error`?(0,U.jsx)(K.Alert,{className:`mt-0.5 w-4 h-4`}):e.kind===`success`?(0,U.jsx)(K.Check,{className:`mt-0.5 w-4 h-4`}):null,(0,U.jsx)(`div`,{className:`pre-wrap min-w-0 flex-1`,children:e.text}),(0,U.jsx)(`button`,{type:`button`,"aria-label":`Dismiss`,className:`opacity-60 hover:opacity-100`,onClick:()=>t.dismissToast(e.id),children:(0,U.jsx)(K.X,{className:`w-3.5 h-3.5`})})]})}function ZA(){let{state:e}=W();return e.toasts.length===0?null:(0,U.jsx)(`div`,{className:`pointer-events-none fixed bottom-4 right-4 z-50 flex flex-col gap-2`,children:e.toasts.map(e=>(0,U.jsx)(XA,{toast:e},e.id))})}var QA=2e3;function $A(e){if(!ej(e))return;let t=typeof window<`u`?window.oonacode:void 0;if(t?.openExternal){t.openExternal(e).catch(()=>void 0);return}typeof window<`u`&&window.open(e,`_blank`,`noopener,noreferrer`)}function ej(e){if(typeof e!=`string`||e===``)return!1;try{let{protocol:t}=new URL(e);return t===`http:`||t===`https:`}catch{return!1}}function tj(e){if(e.message)return e.message;switch(e.status){case`denied`:return`That request was denied in the browser. Start again if it was you.`;case`expired`:return`The code expired before it was approved. Start again for a fresh one.`;default:return`The sign-in could not be started. Check that this PC can reach the gateway.`}}function nj({children:e,testId:t}){let{state:n}=W(),r=n.connection.hostName??n.info?.hostName??null;return(0,U.jsxs)(`div`,{className:`flex h-full flex-col bg-bg text-fg`,"data-testid":t,children:[(0,U.jsxs)(`header`,{className:`flex h-12 shrink-0 items-center gap-2 border-b border-border bg-surface px-3`,children:[(0,U.jsx)(`span`,{className:`font-semibold tracking-tight`,children:`OonaCode`}),r?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`text-fg-faint`,children:`/`}),(0,U.jsx)(`span`,{className:`truncate text-sm text-fg-muted`,"data-testid":`frame-host-name`,children:r})]}):null]}),(0,U.jsx)(`main`,{className:`flex min-h-0 flex-1 items-start justify-center overflow-y-auto p-6`,children:(0,U.jsx)(`div`,{className:`w-full max-w-md py-6`,children:e})}),(0,U.jsx)(ZA,{})]})}function rj(){return(0,U.jsx)(nj,{testId:`account-loading`,children:(0,U.jsxs)(`div`,{role:`status`,className:`flex items-center gap-2 text-sm text-fg-muted`,children:[(0,U.jsx)(K.Spinner,{className:`w-4 h-4`}),(0,U.jsx)(`span`,{children:`Checking your account…`})]})})}function ij({link:e}){let{actions:t}=W(),[n,r]=(0,v.useState)(!1),i=e.verificationUrl??``,a=e.verificationUrlComplete??i,o=ej(a),s=t.refreshAccountLink;return(0,v.useEffect)(()=>{let e=setInterval(()=>void s(),QA);return()=>clearInterval(e)},[s]),(0,U.jsxs)(`div`,{className:`space-y-3`,"data-testid":`link-waiting`,children:[(0,U.jsxs)(`ol`,{className:`space-y-2 text-sm`,children:[(0,U.jsxs)(`li`,{className:`flex flex-wrap items-baseline gap-2`,children:[(0,U.jsx)(`span`,{className:`text-fg-muted`,children:`1. Open`}),o?(0,U.jsx)(`a`,{className:`break-all font-medium text-accent underline`,href:a,target:`_blank`,rel:`noopener noreferrer`,"data-testid":`link-url`,onClick:e=>{window.oonacode?.openExternal&&(e.preventDefault(),$A(a))},children:i}):(0,U.jsx)(`span`,{className:`break-all font-medium`,"data-testid":`link-url`,children:i})]}),(0,U.jsxs)(`li`,{className:`flex flex-wrap items-baseline gap-2`,children:[(0,U.jsx)(`span`,{className:`text-fg-muted`,children:`2. Enter`}),(0,U.jsx)(`span`,{className:`select-all rounded-md border border-border bg-surface-2 px-2.5 py-1 font-mono text-base tracking-widest`,"data-testid":`link-user-code`,children:e.userCode})]})]}),(0,U.jsxs)(`p`,{className:`flex items-center gap-2 text-xs text-fg-muted`,role:`status`,children:[(0,U.jsx)(K.Spinner,{className:`w-3.5 h-3.5`}),(0,U.jsx)(`span`,{children:`Waiting for approval in your browser…`})]}),(0,U.jsx)(`p`,{className:`text-xs text-fg-faint`,children:`Approve this code only if you are looking at it on your own screen right now. It is good for a few minutes and can be used once.`}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[o?(0,U.jsxs)(q,{size:`sm`,onClick:()=>$A(a),"data-testid":`link-reopen`,children:[(0,U.jsx)(K.LogIn,{className:`w-3.5 h-3.5`}),` Open the browser again`]}):null,(0,U.jsx)(q,{size:`sm`,variant:`ghost`,busy:n,"data-testid":`link-cancel`,onClick:()=>{r(!0),t.cancelAccountLink().finally(()=>r(!1))},children:`Cancel`})]})]})}function aj(e){if(typeof e!=`string`||e===``)return null;try{let t=new URL(e).hostname;if(!t)return null;let n=/^api(?:-([a-z0-9-]+))?.(.+)$/i.exec(t),r=n?.[2];return n&&r?n[1]?n[1]+`.`+r:r:t}catch{return null}}function oj(){let{state:e,actions:t}=W(),n=e.accountLink,r=aj(n?.verificationUrl??e.settings?.gatewayUrl??e.account?.gatewayUrl??null),[i,a]=(0,v.useState)(!1),o=(0,v.useCallback)(async()=>{a(!0);try{let e=await t.startAccountLink();e?.status===`waiting`&&$A(e.verificationUrlComplete??e.verificationUrl??``)}finally{a(!1)}},[t]);if(n?.status===`waiting`)return(0,U.jsx)(ij,{link:n});let s=n&&(n.status===`denied`||n.status===`expired`);return(0,U.jsxs)(`div`,{className:`space-y-2`,children:[s?(0,U.jsx)(`p`,{role:`status`,"data-testid":`link-refused`,className:`rounded-md border border-warn/50 bg-warn-soft px-3 py-2 text-xs text-fg`,children:tj(n)}):null,(0,U.jsxs)(q,{variant:`primary`,busy:i,onClick:()=>void o(),"data-testid":`link-start`,className:`w-full justify-center`,children:[(0,U.jsx)(K.LogIn,{className:`w-3.5 h-3.5`}),s?`Try again in your browser`:`Sign in with your browser`]}),(0,U.jsxs)(`p`,{className:`text-xs text-fg-faint`,"data-testid":`link-site-note`,children:[`Opens `,r??`your account page`,` and shows a short code to confirm. Your password is never typed on this machine, and this PC never sees anyone else's.`]})]})}function sj(){let{state:e}=W(),[t,n]=(0,v.useState)(!1),r=t||e.emailVerification!==null;return(0,U.jsx)(nj,{testId:`sign-in-view`,children:(0,U.jsxs)(`div`,{className:`space-y-5`,children:[(0,U.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,U.jsx)(`h1`,{className:`text-xl font-semibold tracking-tight`,children:`Sign in to use OonaCode`}),(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`OonaCode runs the agent on this PC, with your own providers — but it needs an OonaCode account. There is no guest mode.`})]}),(0,U.jsx)(oj,{}),(0,U.jsx)(`div`,{className:H(`space-y-3 border-t border-border pt-4`,r?``:`text-center`),children:r?(0,U.jsx)(xm,{}):(0,U.jsx)(q,{size:`sm`,variant:`ghost`,"data-testid":`use-password`,onClick:()=>n(!0),children:`Use an email and password instead`})})]})})}function cj(){let{state:e,actions:t}=W(),[n,r]=(0,v.useState)(``),[i,a]=(0,v.useState)(!0),[o,s]=(0,v.useState)(!1),[c,l]=(0,v.useState)(null),u=(0,v.useRef)(null);return(0,v.useEffect)(()=>{let e=()=>u.current?.focus();e();let t=setTimeout(e,60);return()=>clearTimeout(t)},[]),(0,U.jsxs)(`div`,{className:`flex min-h-screen items-center justify-center bg-surface-1 p-6`,"data-testid":`locked-view`,onMouseDown:()=>u.current?.focus(),children:[(0,U.jsxs)(`form`,{onSubmit:e=>{if(e.preventDefault(),!n||o)return;s(!0),l(null);let a=null;t.unlock(n,{keepUnlocked:i,onError:e=>{a=e}}).then(e=>{s(!1),e?r(``):l(a??`Wrong password — the vault stays locked.`)})},className:`w-full max-w-sm space-y-4 text-center`,children:[(0,U.jsx)(K.Lock,{className:`mx-auto h-10 w-10 text-fg-faint`}),(0,U.jsx)(`h1`,{className:`text-lg font-semibold`,children:`This device is locked`}),(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,children:`The vault, your keys and every session on this PC stay unreadable until you unlock — with your account password here, or remotely from another of your devices.`}),(0,U.jsx)(`input`,{ref:u,type:`password`,className:Y,value:n,onChange:e=>r(e.target.value),onMouseDown:e=>e.stopPropagation(),placeholder:`Account password`,autoFocus:!0,"data-testid":`locked-password`}),(0,U.jsxs)(`label`,{className:`flex items-start justify-center gap-2 text-sm text-fg-muted`,children:[(0,U.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:i,onChange:e=>a(e.target.checked),"data-testid":`locked-keep-unlocked`}),(0,U.jsx)(`span`,{children:`Keep me unlocked on this PC`})]}),c?(0,U.jsx)(`div`,{className:`text-sm text-danger`,"data-testid":`locked-error`,children:c}):null,(0,U.jsx)(q,{type:`submit`,variant:`primary`,busy:o,disabled:!n,children:`Unlock`}),(0,U.jsxs)(`div`,{className:`text-xs text-fg-faint`,children:[`Signed in as `,e.account?.email??`this account`,` ·`,` `,(0,U.jsx)(`button`,{type:`button`,className:`underline hover:text-fg`,onClick:()=>void t.logout(),children:`Sign out`})]})]}),(0,U.jsx)(ZA,{})]})}var lj={mode:`names`,mine:!0,model:!0,tools:!1,subagents:!1,projectId:null,when:`any`,caseSensitive:!1,wholeWord:!1};function uj(e){return Object.keys(lj).some(t=>e[t]!==lj[t])}function dj(e,t=Date.now()){if(e===`any`)return null;if(e===`today`){let e=new Date(t);return e.setHours(0,0,0,0),e}return new Date(t-(e===`week`?7:30)*24*60*60*1e3)}function fj(e,t,n,r=Date.now()){if(n.projectId!==null&&e.projectId!==n.projectId)return!1;let i=dj(n.when,r);if(i&&e.mtime<i.getTime())return!1;if((n.caseSensitive||n.wholeWord)&&t.trim()!==``){let r=[e.title,e.firstPrompt,e.lastPrompt,e.projectDir],i={caseSensitive:n.caseSensitive,wholeWord:n.wholeWord};if(!r.some(e=>typeof e==`string`&&Ce(e,t,i)))return!1}return!0}function pj(e,t,n=Date.now()){let r=e.trim();if(r.length<2||!t.mine&&!t.model&&!t.tools)return null;let i=dj(t.when,n);return{q:r,limit:200,from:t.mine&&t.model?`both`:t.mine?`user`:t.model?`assistant`:`none`,tools:t.tools,subagents:t.subagents,...i?{since:i.toISOString()}:{},...t.projectId?{projectId:t.projectId}:{},caseSensitive:t.caseSensitive,wholeWord:t.wholeWord}}function mj({label:e,hint:t,checked:n,onChange:r,testId:i}){return(0,U.jsxs)(`label`,{className:`flex cursor-pointer items-start gap-2 py-0.5 text-xs`,children:[(0,U.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:n,onChange:e=>r(e.target.checked),"data-testid":i}),(0,U.jsxs)(`span`,{children:[(0,U.jsx)(`span`,{className:`text-fg`,children:e}),t?(0,U.jsx)(`span`,{className:`block text-[11px] text-fg-faint`,children:t}):null]})]})}var hj=`w-full rounded-md border border-border bg-surface px-2 py-1 text-xs text-fg focus:outline-none`;function gj({options:e,onChange:t,projects:n,onClose:r}){let i=(n,r)=>t({...e,[n]:r}),a=e.mode===`conversations`,o=a&&!e.mine&&!e.model&&!e.tools;return(0,U.jsxs)(`div`,{className:`absolute left-2 right-2 top-full z-30 mt-1 space-y-3 rounded-lg border border-border bg-surface p-3 shadow-xl`,onMouseDown:e=>{!(e.target instanceof HTMLSelectElement)&&!(e.target instanceof HTMLInputElement)&&e.preventDefault()},onKeyDown:e=>{e.key===`Escape`&&(e.stopPropagation(),r())},"data-testid":`search-options`,children:[(0,U.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,U.jsx)(`div`,{className:`text-[11px] font-semibold uppercase tracking-wide text-fg-faint`,children:`Search in`}),(0,U.jsx)(fm,{label:`Search in`,value:e.mode,options:[{value:`names`,label:`Names & prompts`},{value:`conversations`,label:`Whole chats`}],onChange:e=>i(`mode`,e)}),(0,U.jsx)(`p`,{className:`text-[11px] text-fg-faint`,"data-testid":`search-mode-hint`,children:a?`Every message of every chat on this PC. Pick whose words to look in.`:`A chat’s name, its first and last message, and its folder.`})]}),a?(0,U.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,U.jsx)(mj,{label:`My messages`,checked:e.mine,onChange:e=>i(`mine`,e),testId:`search-opt-mine`}),(0,U.jsx)(mj,{label:`Model replies`,checked:e.model,onChange:e=>i(`model`,e),testId:`search-opt-model`}),(0,U.jsx)(mj,{label:`Tool calls & output`,hint:`Commands, file paths and what the tools answered.`,checked:e.tools,onChange:e=>i(`tools`,e),testId:`search-opt-tools`}),(0,U.jsx)(mj,{label:`Subagents’ conversations`,checked:e.subagents,onChange:e=>i(`subagents`,e),testId:`search-opt-subagents`}),o?(0,U.jsx)(`p`,{className:`text-[11px] text-warn`,children:`Tick at least one to search.`}):null]}):null,(0,U.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,U.jsxs)(`label`,{className:`space-y-1 text-[11px] text-fg-faint`,children:[(0,U.jsx)(`span`,{children:`Project`}),(0,U.jsxs)(`select`,{className:hj,value:e.projectId??``,onChange:e=>i(`projectId`,e.target.value||null),"data-testid":`search-opt-project`,children:[(0,U.jsx)(`option`,{value:``,children:`All projects`}),n.map(e=>(0,U.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]}),(0,U.jsxs)(`label`,{className:`space-y-1 text-[11px] text-fg-faint`,children:[(0,U.jsx)(`span`,{children:`When`}),(0,U.jsxs)(`select`,{className:hj,value:e.when,onChange:e=>i(`when`,e.target.value),"data-testid":`search-opt-when`,children:[(0,U.jsx)(`option`,{value:`any`,children:`Any time`}),(0,U.jsx)(`option`,{value:`today`,children:`Today`}),(0,U.jsx)(`option`,{value:`week`,children:`Last 7 days`}),(0,U.jsx)(`option`,{value:`month`,children:`Last 30 days`})]})]})]}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-x-4`,children:[(0,U.jsx)(mj,{label:`Match case`,checked:e.caseSensitive,onChange:e=>i(`caseSensitive`,e),testId:`search-opt-case`}),(0,U.jsx)(mj,{label:`Whole words`,checked:e.wholeWord,onChange:e=>i(`wholeWord`,e),testId:`search-opt-word`})]}),(0,U.jsxs)(`div`,{className:`flex items-center justify-between border-t border-border pt-2`,children:[(0,U.jsx)(`button`,{type:`button`,className:H(`text-xs`,uj(e)?`text-accent hover:underline`:`text-fg-faint`),disabled:!uj(e),onClick:()=>t(lj),"data-testid":`search-opt-reset`,children:`Reset`}),(0,U.jsx)(`button`,{type:`button`,className:`rounded-md bg-surface-2 px-2 py-1 text-xs text-fg hover:bg-surface-3`,onClick:r,"data-testid":`search-opt-done`,children:`Done`})]})]})}function _j(e,t,n){let r=Se(t,{caseSensitive:n.caseSensitive,wholeWord:n.wholeWord});if(!r)return[{text:e,hit:!1}];let i=[],a=0;for(let t of e.matchAll(r)){let n=t.index??0;t[0].length!==0&&(n>a&&i.push({text:e.slice(a,n),hit:!1}),i.push({text:t[0],hit:!0}),a=n+t[0].length)}return a<e.length&&i.push({text:e.slice(a),hit:!1}),i}function vj(e){return e.kind===`tool`?e.tool??`Tool`:e.role===`assistant`?`Model`:`You`}function yj({query:e,options:t}){let{state:n,actions:r}=W(),i=(0,v.useMemo)(()=>pj(e,t),[e,t]),[a,o]=(0,v.useState)(null),s=i?JSON.stringify(i):``;(0,v.useEffect)(()=>{if(!i)return;let e=!0,t=setTimeout(()=>{r.searchTranscripts(i).then(t=>{e&&o({key:s,res:t})})},350);return()=>{e=!1,clearTimeout(t)}},[s,r]);let c=a&&a.key===s?a:null,l=(0,v.useMemo)(()=>{let e=new Map;for(let t of c?.res?.hits??[]){let r=n.sessions.find(e=>e.id===t.sessionId)?.title||t.title||`Untitled chat`,i=e.get(t.sessionId)??{title:r,hits:[]};i.hits.push(t),e.set(t.sessionId,i)}return[...e.entries()]},[c,n.sessions]);if(!i)return(0,U.jsx)(`div`,{className:`px-3 py-4 text-center text-xs text-fg-faint`,"data-testid":`transcript-search-idle`,children:e.trim().length<2?`Type at least two characters to search every chat.`:`Tick what to look in — your messages, the model’s replies or the tools’ side.`});if(!c)return(0,U.jsx)(`div`,{className:`px-3 py-4 text-center text-xs text-fg-faint`,"data-testid":`transcript-search-busy`,children:`Searching every chat…`});if(c.res===null)return(0,U.jsx)(`div`,{className:`px-3 py-4 text-center text-xs text-danger`,"data-testid":`transcript-search-failed`,children:`This PC could not search its chats. Try again, or update OonaCode.`});let u=c.res.hits.length;return(0,U.jsxs)(`div`,{className:`pb-2`,"data-testid":`transcript-search-results`,children:[(0,U.jsx)(`div`,{className:`px-3 py-1.5 text-[11px] text-fg-faint`,children:u===0?`No message on this PC says that.`:`${u}${c.res.truncated?`+`:``} ${u===1?`message`:`messages`} in ${l.length} ${l.length===1?`chat`:`chats`}`}),l.map(([n,i])=>(0,U.jsxs)(`div`,{className:`mb-1.5`,"data-testid":`transcript-search-chat-${n}`,children:[(0,U.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-1.5 rounded px-2 py-1 text-left text-[13px] font-semibold text-fg hover:bg-surface-2`,onClick:()=>r.openChatWithSearch(n,e.trim()),children:[(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:i.title}),(0,U.jsx)(`span`,{className:`shrink-0 rounded-full bg-surface-3 px-1.5 text-[10px] font-semibold text-fg-muted`,children:i.hits.length})]}),i.hits.map(i=>(0,U.jsxs)(`button`,{type:`button`,className:`block w-full rounded px-2 py-1 pl-4 text-left text-xs hover:bg-surface-2`,onClick:()=>r.openChatWithSearch(n,e.trim()),"data-testid":`transcript-search-hit`,children:[(0,U.jsxs)(`span`,{className:`mb-0.5 flex items-center gap-1.5 text-[10px] text-fg-faint`,children:[i.kind===`tool`?(0,U.jsx)(K.Tool,{className:`h-3 w-3`}):i.role===`assistant`?(0,U.jsx)(K.Bot,{className:`h-3 w-3`}):(0,U.jsx)(K.User,{className:`h-3 w-3`}),(0,U.jsx)(`span`,{className:`font-medium text-fg-muted`,children:vj(i)}),i.subpath?(0,U.jsx)(`span`,{children:`· subagent`}):null,i.timestamp?(0,U.jsx)(`span`,{className:`ml-auto`,children:pd(i.timestamp)}):null]}),(0,U.jsx)(`span`,{className:`line-clamp-3 text-fg-muted`,children:_j(i.snippet,e,t).map((e,t)=>e.hit?(0,U.jsx)(`mark`,{className:`rounded bg-warn-soft px-0.5 text-fg`,children:e.text},t):(0,U.jsx)(`span`,{children:e.text},t))})]},`${i.seq}`))]},n))]})}function bj({name:e,state:t,behind:n,detail:r}){return(0,U.jsxs)(`div`,{"data-testid":`sync-side`,className:`min-w-0 flex-1 rounded-md border p-3 ${n?`border-warn bg-warn-soft/40`:`border-border bg-surface-2`}`,children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2 text-sm font-medium`,children:[(0,U.jsx)(`span`,{className:`min-w-0 truncate`,children:e}),n?(0,U.jsx)(`span`,{className:`shrink-0 text-[11px] font-normal text-warn`,children:`behind`}):null]}),(0,U.jsx)(`div`,{className:`mt-1 text-[11px] text-fg-faint`,children:t.entryCount===null?`size not read`:`${t.entryCount} ${t.entryCount===1?`entry`:`entries`}`}),(0,U.jsx)(`div`,{className:`text-[11px] text-fg-faint`,title:md(t.lastEntryAt),children:t.lastEntryAt?`last message ${pd(t.lastEntryAt)}`:`no timestamps`}),r?(0,U.jsx)(`div`,{className:`mt-1 break-all text-[11px] text-fg-faint`,children:r}):null]})}function xj({sessionId:e,sessionTitle:t,onClose:n}){let{actions:r}=W(),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(!1),[c,l]=(0,v.useState)(!1),[u,d]=(0,v.useState)(null),f=(0,v.useCallback)(async()=>{if(e){s(!0);try{a(await r.refreshSessionLink(e))}finally{s(!1)}}},[e,r]);(0,v.useEffect)(()=>{d(null),a(null),f()},[f]);let p=async()=>{if(e){l(!0);try{let t=await r.syncSessionDown(e);d(t),t&&a(t.link)}finally{l(!1)}}},m=i?.status===`ours-behind`,h=i?.status===`theirs-behind`;return(0,U.jsx)(um,{open:e!==null,title:`Sync with the original chat`,onClose:n,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(q,{variant:`ghost`,onClick:n,children:`Close`}),(0,U.jsx)(q,{variant:`primary`,busy:c,onClick:()=>void p(),disabled:!i?.canDownstream||o,"data-testid":`sync-down-confirm`,children:c?`Syncing…`:m?`Bring the new messages in`:`Check again`})]}),children:o&&!i?(0,U.jsxs)(`div`,{className:`flex items-center gap-2 py-6 text-sm text-fg-muted`,children:[(0,U.jsx)(K.Spinner,{className:`w-4 h-4 spin`}),` Reading the original…`]}):i?(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,U.jsx)(bj,{name:`OonaCode · ${t}`,state:i.ours,behind:m}),(0,U.jsx)(bj,{name:i.agentName,state:i.theirs,behind:h,detail:i.file})]}),(0,U.jsx)(`p`,{className:`text-sm text-fg-muted`,"data-testid":`sync-explanation`,children:m?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`strong`,{children:[i.agentName,` has newer messages.`]}),` Bringing them in adds them to this chat — nothing here is replaced or removed, and `,i.agentName,` is not written to.`]}):h?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`strong`,{children:`This chat is the newer one.`}),` Nothing is sent back: OonaCode never writes into your `,i.agentName,` install, so the copy over there stays as it is.`]}):(0,U.jsx)(U.Fragment,{children:`Both copies are at the same point. There is nothing to bring in.`})}),u?(0,U.jsx)(`div`,{className:`rounded-md border border-border bg-surface-2 p-3 text-sm`,"data-testid":`sync-result`,children:u.added>0?`${u.added} new ${u.added===1?`message`:`messages`} added to this chat.`:`Already up to date — nothing to bring in.`}):null]}):(0,U.jsx)(`p`,{className:`py-4 text-sm text-fg-muted`,children:`This PC no longer has the chat this one was imported from, so there is nothing to compare it with. Nothing is wrong with the chat itself — it stays exactly as it is.`})})}function Sj({status:e}){return(0,U.jsx)(`span`,{className:H(`inline-block h-2 w-2 shrink-0 rounded-full`,e===`running`?`bg-accent animate-pulse`:e===`waiting_permission`?`bg-warn animate-pulse`:e===`error`?`bg-danger`:`bg-transparent`),"aria-hidden":!0})}function Cj(e){return e.some(e=>e.status===`running`)?`running`:e.some(e=>e.status===`waiting_permission`)?`waiting_permission`:`idle`}function wj({sessions:e,testId:t}){let n=Cj(e);if(n===`idle`)return null;let r=e.filter(e=>e.status===`running`||e.status===`waiting_permission`).length;return(0,U.jsx)(`span`,{className:`inline-flex shrink-0 items-center`,title:n===`running`?`${r} chat${r===1?``:`s`} working`:`${r} chat${r===1?``:`s`} waiting for permission`,"aria-label":`${r} active chat${r===1?``:`s`}`,"data-testid":t,children:(0,U.jsx)(Sj,{status:n})})}var Tj=`flex w-full items-center gap-1 rounded px-2 py-1 text-left text-[11px] font-semibold uppercase tracking-wide text-fg-faint hover:bg-surface-2`,Ej=`flex w-full items-center gap-1.5 rounded border-l-2 border-project/70 bg-surface-2/40 px-2 py-1.5 text-left text-[13px] font-semibold tracking-normal text-fg hover:bg-surface-2`;function Dj(){let{state:e,actions:t}=W(),[n,r]=(0,v.useState)(lj),[i,a]=(0,v.useState)({}),[o,s]=(0,v.useState)(null),[c,l]=(0,v.useState)(null),[u,d]=(0,v.useState)(!1),[f,p]=(0,v.useState)(null),[m,h]=(0,v.useState)(null),g=(0,v.useCallback)(()=>p(null),[]),[_,y]=(0,v.useState)(null),b=(0,v.useCallback)(()=>y(null),[]),x=Aj(),S=e=>a(t=>({...t,[e]:t[e]!==!0})),C=e=>i[e]===!0,w=e.prefs.collapsedProjects,T=e=>w.includes(e),E=e=>{let n=T(e)?w.filter(t=>t!==e):[...w,e];t.savePrefs({collapsedProjects:n})},D=e=>{t.savePrefs({collapsedProjects:e?O.map(e=>e.key):[]})},O=(0,v.useMemo)(()=>{let t=new Map;for(let n of e.vaultProjects)t.set(n.id,{name:n.name,sessions:[]});let r=[];for(let n of e.sessions){if(e.remote.tabs[n.id])continue;let i=n.projectId?t.get(n.projectId):void 0;i?i.sessions.push(n):r.push(n)}let i=[...t.entries()].map(([e,t])=>({key:e,name:t.name,projectId:e,sessions:t.sessions.slice().sort((e,t)=>t.mtime-e.mtime)}));if(i.sort((e,t)=>e.name.localeCompare(t.name,void 0,{sensitivity:`base`})),(r.length>0||i.length===0)&&i.push({key:`none`,name:`No project`,projectId:null,sessions:r.slice().sort((e,t)=>t.mtime-e.mtime)}),e.search.trim()!==``){let t=Date.now();return i.map(r=>({...r,sessions:r.sessions.filter(r=>fj(r,e.search,n,t))})).filter(e=>e.sessions.length>0)}return i},[e.sessions,e.vaultProjects,e.remote.tabs,e.search,n]),ee=(0,v.useMemo)(()=>e.remote.hosts.filter(e=>!e.isSelf),[e.remote.hosts]),k=()=>{let e=C(`remote`);S(`remote`),e&&t.refreshHosts()},A=e=>{t.setSearch(e),t.refreshSessions(e)},[j,M]=(0,v.useState)(!1),N=(0,v.useRef)(null),[te,P]=(0,v.useState)(!1),[F,ne]=(0,v.useState)(``),re=n.mode===`conversations`,ie=re?F:e.search,ae=j||ie!==``||te;(0,v.useEffect)(()=>{j&&N.current?.focus()},[j]);let oe=()=>{e.search!==``&&A(``),ne(``),P(!1),M(!1)},se=t=>{t.mode!==n.mode&&(t.mode===`conversations`?(ne(e.search),e.search!==``&&A(``)):(F!==``&&A(F),ne(``))),r(t)},ce=e.sessions.length,le=e.connection.hostName??`This PC`;return(0,U.jsxs)(`nav`,{className:`flex h-full w-full flex-col bg-surface`,"aria-label":`Sessions`,children:[(0,U.jsxs)(`div`,{className:`relative flex flex-wrap items-center justify-end gap-x-2 gap-y-1 border-b border-border p-2`,children:[(0,U.jsx)(J,{label:`Search chats`,onClick:()=>M(!0),"data-testid":`open-search`,children:(0,U.jsx)(K.Search,{})}),(0,U.jsx)(`span`,{className:`flex-1`}),ae?(0,U.jsxs)(`div`,{className:`absolute inset-0 z-10 flex items-center gap-1 bg-surface px-2`,"data-testid":`sidebar-search`,children:[(0,U.jsxs)(`div`,{className:`relative flex-1`,children:[(0,U.jsx)(K.Search,{className:`pointer-events-none absolute left-2 top-2 w-3.5 h-3.5 text-fg-faint`}),(0,U.jsx)(`input`,{ref:N,"aria-label":`Search sessions`,className:H(Y,`pl-7`),placeholder:re?`Search every chat`:`Search chats`,value:ie,onChange:e=>re?ne(e.target.value):A(e.target.value),onBlur:()=>{ie===``&&!te&&M(!1)},onKeyDown:e=>{e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),oe())}})]}),(0,U.jsxs)(J,{label:te?`Hide search options`:`Search options`,className:H(`relative`,te&&`text-accent`),"aria-pressed":te,onMouseDown:e=>e.preventDefault(),onClick:()=>P(e=>!e),"data-testid":`search-options-toggle`,children:[(0,U.jsx)(K.Sliders,{}),uj(n)?(0,U.jsx)(`span`,{className:`absolute right-0.5 top-0.5 h-1.5 w-1.5 rounded-full bg-accent`,"data-testid":`search-options-dot`}):null]}),(0,U.jsx)(J,{label:`Close search`,onMouseDown:e=>e.preventDefault(),onClick:oe,"data-testid":`close-search`,children:(0,U.jsx)(K.X,{})})]}):null,ae&&te?(0,U.jsx)(gj,{options:n,onChange:se,projects:e.vaultProjects,onClose:()=>{P(!1),N.current?.focus()}}):null,(0,U.jsx)(J,{label:`Refresh sessions`,onClick:()=>{t.refreshSessions(),t.refreshHosts()},children:(0,U.jsx)(K.Refresh,{className:e.sessionsLoading?`spin`:``})}),e.account?.loggedIn?(0,U.jsx)(J,{label:`Import chats from your other coding agents`,onClick:()=>t.openDialog(`import-claude`),"data-testid":`open-import-claude`,children:(0,U.jsx)(K.Download,{})}):null,e.account?.loggedIn?(0,U.jsx)(J,{label:`Export my chats`,onClick:()=>t.openDialog(`export-chats`),"data-testid":`open-export-chats`,children:(0,U.jsx)(K.Upload,{})}):null,(0,U.jsx)(J,{label:`Collapse all projects`,onClick:()=>D(!0),"data-testid":`projects-collapse-all`,children:(0,U.jsx)(K.CollapseAll,{})}),(0,U.jsx)(J,{label:`Expand all projects`,onClick:()=>D(!1),"data-testid":`projects-expand-all`,children:(0,U.jsx)(K.ExpandAll,{})}),(0,U.jsx)(J,{label:`Projects`,onClick:()=>t.openDialog(`projects`),"data-testid":`open-projects`,children:(0,U.jsx)(K.Project,{})}),(0,U.jsx)(J,{label:`Conversations — what your chats send each other`,onClick:()=>t.openConversations(),"data-testid":`open-conversations`,children:(0,U.jsx)(K.Chats,{})}),(0,U.jsx)(J,{label:e.prefs.sidebarPinned?`Hide the session list — it slides in when the pointer reaches the left edge`:`Pin the session list beside the chat`,className:H(`hidden md:inline-flex`,e.prefs.sidebarPinned?`text-accent`:`text-fg-muted`),"aria-pressed":e.prefs.sidebarPinned,onClick:()=>void t.savePrefs({sidebarPinned:!e.prefs.sidebarPinned}),"data-testid":`sidebar-pin`,children:(0,U.jsx)(K.Pin,{})})]}),(0,U.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-1 pb-2`,children:re&&F.trim()!==``?(0,U.jsx)(yj,{query:F,options:n}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`mb-1`,"data-testid":`sessions-local`,children:[(0,U.jsxs)(`button`,{type:`button`,className:Tj,onClick:()=>S(`local`),"aria-expanded":!C(`local`),title:le,children:[(0,U.jsx)(K.Chevron,{open:!C(`local`),className:`w-3 h-3`}),(0,U.jsx)(K.Monitor,{className:`w-3 h-3`}),(0,U.jsxs)(`span`,{className:`truncate`,children:[`Local · `,le]}),(0,U.jsx)(`span`,{className:`ml-auto font-normal`,children:ce})]}),C(`local`)?null:(0,U.jsxs)(U.Fragment,{children:[e.sessionsError?(0,U.jsx)(`div`,{className:`px-2 py-2 text-xs text-danger`,children:e.sessionsError}):null,!e.sessionsLoading&&ce===0&&!e.sessionsError?(0,U.jsx)(`div`,{className:`px-3 py-4 text-center text-xs text-fg-faint`,children:e.search?`No sessions match.`:`No sessions yet — press + to start one.`}):null,O.map(n=>{let r=`local:${n.key}`;return(0,U.jsxs)(`div`,{className:`mb-1 pl-2`,"data-testid":`project-group-${n.key}`,children:[(0,U.jsxs)(`div`,{className:`group relative flex items-center`,children:[(0,U.jsx)(Fj,{group:n,collapsed:T(n.key),onToggle:()=>E(n.key),onMenu:(e,t)=>y({group:n,at:e,el:t}),menuOpen:_?.group.key===n.key}),n.projectId?(0,U.jsxs)(`div`,{className:`absolute right-1 hidden items-center rounded bg-surface/90 group-hover:flex group-focus-within:flex`,children:[(0,U.jsx)(J,{label:`Settings of ${n.name}`,className:`p-1`,"data-testid":`project-settings-${n.key}`,onClick:e=>{e.stopPropagation(),t.openProjectSettings(n.projectId)},children:(0,U.jsx)(K.Settings,{className:`w-3.5 h-3.5`})}),(0,U.jsx)(J,{label:`New chat in ${n.name}`,className:`p-1`,"data-testid":`project-new-chat-${n.key}`,onClick:e=>{e.stopPropagation(),t.newTab({projectId:n.projectId})},children:(0,U.jsx)(K.Plus,{className:`w-3.5 h-3.5`})})]}):null]}),T(n.key)?null:n.sessions.map(t=>(0,U.jsx)(zj,{session:t,active:t.id===e.currentSessionId,link:e.sessionLinks[t.id]??null,onMenu:(e,n)=>p({session:t,at:e,el:n}),menuOpen:f?.session.id===t.id},t.id))]},r)})]})]}),(0,U.jsxs)(`div`,{className:`mb-1`,"data-testid":`sessions-remote`,children:[(0,U.jsxs)(`button`,{type:`button`,className:Tj,onClick:k,"aria-expanded":!C(`remote`),children:[(0,U.jsx)(K.Chevron,{open:!C(`remote`),className:`w-3 h-3`}),(0,U.jsx)(K.Globe,{className:`w-3 h-3`}),(0,U.jsx)(`span`,{className:`truncate`,children:`Remote`}),(0,U.jsx)(`span`,{className:`ml-auto font-normal`,children:ee.length})]}),C(`remote`)?null:(0,U.jsxs)(U.Fragment,{children:[!e.remote.supported||e.remote.reason===`logged_out`?(0,U.jsx)(`div`,{className:`px-3 py-3 text-xs text-fg-faint`,children:`Sign in to see the sessions of your other devices.`}):ee.length===0?(0,U.jsx)(`div`,{className:`px-3 py-3 text-xs text-fg-faint`,children:e.remote.loading?`Looking for your other devices…`:`No other devices yet.`}):null,ee.map(e=>(0,U.jsx)(Oj,{host:e,collapsed:C(`host:${e.hostId}`)||i[`host:${e.hostId}`]===void 0,onToggle:()=>{let n=`host:${e.hostId}`,r=i[n]===void 0||i[n]===!0;a(e=>({...e,[n]:!r})),r&&t.refreshHostSessions(e.hostId)}},e.hostId))]})]})]})}),(0,U.jsx)(`div`,{className:`shrink-0 border-t border-border px-3 py-2 text-[11px] text-fg-faint`,children:(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,U.jsxs)(`button`,{type:`button`,"data-testid":`app-version`,title:`What's new in this version`,className:`truncate hover:text-fg hover:underline`,onClick:()=>t.openDialog(`whats-new`),children:[`OonaCode Desktop v`,x]}),(0,U.jsx)(J,{label:`Lock this device — vault and sessions`,className:`p-1`,"data-testid":`lock-device`,onClick:()=>d(!0),children:(0,U.jsx)(K.Lock,{className:`h-3.5 w-3.5`})})]})}),(0,U.jsx)(ZE,{open:_!==null,at:_?.at??{x:0,y:0},anchorEl:_?.el??null,label:`Project actions`,testId:`project-context-menu`,onClose:b,items:_?jj({group:_.group,collapsed:T(_.group.key),actions:t,onToggle:()=>E(_.group.key)}):[]}),(0,U.jsx)(ZE,{open:f!==null,at:f?.at??{x:0,y:0},anchorEl:f?.el??null,label:`Chat actions`,onClose:g,items:f?Mj({session:f.session,link:e.sessionLinks[f.session.id]??null,actions:t,onSync:()=>h(f.session),onRename:()=>l(f.session),onDelete:()=>s(f.session)}):[]}),(0,U.jsx)(xj,{sessionId:m?.id??null,sessionTitle:m?bd(m):``,onClose:()=>h(null)}),(0,U.jsx)(mm,{open:o!==null,title:`Delete this chat?`,message:`Its conversation is removed from this PC and from your account, so it stops showing on your other devices and on the website. Your files, folder and code are not touched — only the chat is deleted.`,onConfirm:()=>{o&&t.deleteSession(o.id)},onClose:()=>s(null)}),(0,U.jsx)(hm,{open:c!==null,title:`Rename chat`,label:`Session title`,initialValue:c?bd(c):``,onSubmit:e=>{c&&e!==bd(c)&&t.renameSession(c.id,e)},onClose:()=>l(null)}),(0,U.jsx)(mm,{open:u,title:`Lock this device?`,confirmLabel:`Lock`,message:`Every chat closes and nothing on this PC can be read or run until you unlock — here with your password, or remotely from another device.`,onConfirm:()=>void t.lockDevice(),onClose:()=>d(!1)})]})}function Oj({host:e,collapsed:t,onToggle:n}){let{state:r,actions:i}=W(),a=e.label||e.hostName,o=r.remote.sessions[e.hostId],[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)(null),d=e.remoteAccessOff===!0;return(0,U.jsxs)(`div`,{className:`mb-1 pl-2`,"data-testid":`remote-host-${e.hostId}`,children:[(0,U.jsxs)(`div`,{className:`group relative flex items-center`,children:[(0,U.jsxs)(`button`,{type:`button`,className:Tj,onClick:n,"aria-expanded":!t,title:e.online?`${a} — online`:`${a} — offline (read-only history)`,children:[(0,U.jsx)(K.Chevron,{open:!t,className:`w-3 h-3`}),(0,U.jsx)(`span`,{className:H(`inline-block h-2 w-2 shrink-0 rounded-full`,e.online?`bg-ok`:`bg-fg-faint`),"aria-label":e.online?`online`:`offline`}),(0,U.jsx)(`span`,{className:`truncate normal-case`,children:a}),d?(0,U.jsx)(`span`,{className:`shrink-0 rounded-full bg-warn-soft px-1.5 text-[10px] font-normal normal-case text-warn`,"data-testid":`remote-off-${e.hostId}`,children:`remote access off`}):null,(0,U.jsx)(`span`,{className:`ml-auto font-normal`,children:!d&&o?o.length:``})]}),(0,U.jsxs)(`div`,{className:`absolute right-1 hidden items-center rounded bg-surface/90 group-hover:flex group-focus-within:flex`,children:[(0,U.jsx)(J,{label:d?ol(a):e.online?`New chat on ${a}`:`${a} is offline — a new chat has to start on a PC that is awake`,className:`p-1`,disabled:!e.online||d,"data-testid":`remote-new-chat-${e.hostId}`,onClick:()=>void i.newRemoteTab(e.hostId),children:(0,U.jsx)(K.Plus,{className:`w-3 h-3`})}),(0,U.jsx)(J,{label:`Unlock this device`,className:`p-1`,disabled:d,"data-testid":`remote-unlock-${e.hostId}`,onClick:()=>c(`unlock`),children:(0,U.jsx)(K.Lock,{className:`w-3 h-3`})}),(0,U.jsx)(J,{label:`Rename device`,className:`p-1`,onClick:()=>c(`rename`),children:(0,U.jsx)(K.Edit,{className:`w-3 h-3`})})]}),(0,U.jsx)(hm,{open:s===`unlock`,title:`Unlock "${a}" remotely`,label:`Your account password — it never leaves this PC: the keys are sealed to that device and the server cannot read them.`,password:!0,submitLabel:`Unlock`,onSubmit:t=>void i.remoteUnlockHost(e.hostId,t),onClose:()=>c(null)}),(0,U.jsx)(hm,{open:s===`rename`,title:`Rename device`,label:`Device name`,initialValue:a,onSubmit:t=>{t!==a&&i.renameHost(e.hostId,t)},onClose:()=>c(null)})]}),!t&&d?(0,U.jsx)(`div`,{className:`px-3 py-2 text-xs text-warn`,"data-testid":`remote-off-note-${e.hostId}`,children:ol(a)}):t?null:o===void 0?(0,U.jsx)(`div`,{className:`px-3 py-2 text-xs text-fg-faint`,children:`Loading…`}):o.length===0?(0,U.jsx)(`div`,{className:`px-3 py-2 text-xs text-fg-faint`,children:`No sessions on this device.`}):o.map(t=>(0,U.jsx)(kj,{host:e,session:t,active:t.id===r.currentSessionId,onConfirmDelete:()=>u(t)},t.id)),(0,U.jsx)(mm,{open:l!==null,title:`Delete this chat?`,message:`Its conversation is removed from ${e.hostName} and from your account, so it stops showing here and on the website. Files, folders and code on that PC are not touched — only the chat is deleted.`,onConfirm:()=>{l&&i.deleteRemoteSession(e.hostId,l.id)},onClose:()=>u(null)})]})}function kj({host:e,session:t,active:n,onConfirmDelete:r}){let{actions:i}=W(),a=bd(t);return(0,U.jsxs)(`div`,{className:H(`group flex items-center rounded-md`,n?`bg-accent-soft`:`hover:bg-surface-2`),children:[(0,U.jsxs)(`button`,{type:`button`,onClick:()=>{i.openRemoteSession(e.hostId,t.id),window.innerWidth<768&&i.setSidebar(!1)},className:`flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5 text-left`,"aria-current":n?`true`:void 0,"data-testid":`remote-session-${t.id}`,title:e.online?void 0:`Read-only until that PC is online`,children:[(0,U.jsx)(Sj,{status:t.status}),(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:H(`truncate text-sm`,n?`font-medium`:``),children:a}),(0,U.jsxs)(`div`,{className:`truncate text-[11px] text-fg-faint`,children:[pd(t.updatedAt),t.model?` · ${t.model}`:``,e.online?``:` · read-only`]})]})]}),(0,U.jsx)(`div`,{className:`mr-1 hidden items-center gap-0.5 rounded bg-surface/90 group-hover:flex group-focus-within:flex`,children:(0,U.jsx)(J,{label:e.online?`Delete this chat`:`That PC is asleep — a chat can only be deleted while the PC that holds it is online`,className:`p-1 hover:text-danger disabled:opacity-40`,disabled:!e.online,"data-testid":`remote-session-delete-${t.id}`,onClick:()=>{r()},children:(0,U.jsx)(K.Trash,{className:`w-3.5 h-3.5`})})})]})}function Aj(){let{state:e}=W(),t=typeof window<`u`?window.oonacode:void 0;return mp(t?.appVersion??e.bundleAppVersion??e.connection.appVersion??e.info?.appVersion??`0.0.0`,pp({bridge:t,info:e.info}))}function jj({group:e,collapsed:t,actions:n,onToggle:r}){let i=[],a=e.projectId;return a?i.push({key:`settings`,label:`Project settings…`,icon:(0,U.jsx)(K.Settings,{className:`w-3.5 h-3.5`}),onSelect:()=>n.openProjectSettings(a),testId:`project-menu-settings`},{key:`new-chat`,label:`New chat in this project`,icon:(0,U.jsx)(K.Plus,{className:`w-3.5 h-3.5`}),onSelect:()=>n.newTab({projectId:a}),testId:`project-menu-new-chat`}):i.push({key:`new-project`,label:`New project…`,icon:(0,U.jsx)(K.Project,{className:`w-3.5 h-3.5`}),onSelect:()=>n.openNewProject(),testId:`project-menu-new-project`}),i.push({key:`fold`,label:t?`Expand`:`Collapse`,icon:(0,U.jsx)(K.Chevron,{open:t,className:`w-3.5 h-3.5`}),separated:!0,onSelect:r,testId:`project-menu-fold`}),i}function Mj({session:e,link:t,actions:n,onSync:r,onRename:i,onDelete:a}){let o=[];return t?.status===`ours-behind`&&o.push({key:`sync`,label:`Sync with ${t.agentName}…`,hint:`behind`,icon:(0,U.jsx)(K.Download,{className:`w-3.5 h-3.5`}),onSelect:r,testId:`session-menu-sync`}),o.push({key:`project`,label:`Move to Project`,icon:(0,U.jsx)(K.Project,{className:`w-3.5 h-3.5`}),separated:o.length>0,onSelect:()=>n.openAssignProject(e.id),testId:`session-menu-project`},...e.projectId?[{key:`project-settings`,label:`Project settings…`,icon:(0,U.jsx)(K.Settings,{className:`w-3.5 h-3.5`}),onSelect:()=>n.openProjectSettings(e.projectId),testId:`session-menu-project-settings`}]:[],{key:`folder`,label:`Change folder…`,icon:(0,U.jsx)(K.Folder,{className:`w-3.5 h-3.5`}),onSelect:()=>{n.selectSession(e.id),n.openDialog(`project`)},testId:`session-menu-folder`},{key:`details`,label:`Details`,icon:(0,U.jsx)(K.Info,{className:`w-3.5 h-3.5`}),onSelect:()=>{n.selectSession(e.id),n.savePrefs({sessionPanelOpen:!0})},testId:`session-menu-details`},{key:`files`,label:`Files`,icon:(0,U.jsx)(K.File,{className:`w-3.5 h-3.5`}),onSelect:()=>{n.selectSession(e.id),n.savePrefs({explorerOpen:!0})},testId:`session-menu-files`},{key:`rename`,label:`Rename…`,icon:(0,U.jsx)(K.Edit,{className:`w-3.5 h-3.5`}),onSelect:i,testId:`session-menu-rename`},{key:`fork`,label:`Fork`,icon:(0,U.jsx)(K.Fork,{className:`w-3.5 h-3.5`}),onSelect:()=>void n.forkSession(e.id),testId:`session-menu-fork`},{key:`delete`,label:`Delete`,icon:(0,U.jsx)(K.Trash,{className:`w-3.5 h-3.5`}),danger:!0,separated:!0,onSelect:a,testId:`session-menu-delete`}),o}function Nj({link:e}){return e?.status===`ours-behind`?(0,U.jsxs)(`span`,{className:`ml-1 inline-flex shrink-0 items-center gap-0.5 rounded bg-warn-soft px-1 text-[10px] font-medium leading-4 text-warn`,title:`${e.agentName} has newer messages in this chat — right-click to bring them in`,"data-testid":`session-behind-${e.sessionId}`,"aria-label":`behind its original`,children:[(0,U.jsx)(K.ArrowDown,{className:`w-2.5 h-2.5`}),`behind`]}):null}var Pj={idle:`idle`,running:`working`,waiting_permission:`waiting for permission`,error:`error`};function Fj({group:e,collapsed:t,onToggle:n,onMenu:r,menuOpen:i=!1}){let a=(0,v.useRef)(null),o=(0,v.useRef)(null),[s,c]=(0,v.useState)(null),l=(0,v.useCallback)(()=>{o.current!==null&&(clearTimeout(o.current),o.current=null),c(null)},[]),u=(0,v.useRef)(i);return u.current=i,(0,v.useEffect)(()=>{i&&l()},[i,l]),(0,v.useEffect)(()=>{if(s===null)return;let e=e=>{YE(e.target,a.current)&&l()};return window.addEventListener(`scroll`,e,!0),()=>window.removeEventListener(`scroll`,e,!0)},[s,l]),(0,v.useEffect)(()=>()=>{o.current!==null&&clearTimeout(o.current)},[]),(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`button`,{ref:a,type:`button`,className:Ej,onClick:()=>{l(),n()},onMouseEnter:()=>{o.current!==null&&clearTimeout(o.current),!u.current&&(o.current=setTimeout(()=>{o.current=null,a.current&&!u.current&&c(a.current.getBoundingClientRect())},450))},onMouseLeave:l,onContextMenu:e=>{e.preventDefault(),l(),r({x:e.clientX,y:e.clientY},a.current)},"aria-expanded":!t,"data-testid":`project-header-${e.key}`,children:[(0,U.jsx)(K.Chevron,{open:!t,className:`w-3 h-3 shrink-0`}),(0,U.jsx)(K.Project,{className:`w-3.5 h-3.5 shrink-0 text-project`}),(0,U.jsx)(`span`,{className:`truncate`,children:e.name}),(0,U.jsx)(wj,{sessions:e.sessions,testId:`project-busy-${e.key}`}),(0,U.jsx)(`span`,{className:`ml-auto shrink-0 rounded-full bg-surface-3 px-1.5 py-px text-[10px] font-semibold normal-case tracking-normal text-fg-muted`,"data-testid":`project-count-${e.key}`,children:e.sessions.length})]}),s===null?null:(0,U.jsx)(Ij,{group:e,anchor:s})]})}function Ij({group:e,anchor:t}){let{state:n}=W(),r=e.projectId?n.vaultProjects.find(t=>t.id===e.projectId):void 0,i=e.sessions.filter(e=>e.status===`running`||e.status===`waiting_permission`).length,a=e.sessions.reduce((e,t)=>e===null||t.updatedAt>e?t.updatedAt:e,null),o=[...new Set(e.sessions.map(e=>e.projectDir??e.cwd).filter(e=>typeof e==`string`&&e.length>0))],s=r?.instructions?.trim()??``,c=Math.max(8,Math.min(t.right+8,window.innerWidth-304-8)),l=Math.max(8,Math.min(t.top,window.innerHeight-320));return(0,tm.createPortal)((0,U.jsxs)(`div`,{role:`tooltip`,"data-testid":`project-details-${e.key}`,className:`fixed z-50 max-h-[20rem] w-[19rem] overflow-y-auto rounded-lg border border-border bg-surface p-3 text-xs shadow-lg`,style:{left:c,top:l},children:[(0,U.jsxs)(`div`,{className:`mb-2 flex items-center gap-1.5`,children:[(0,U.jsx)(K.Project,{className:`w-3.5 h-3.5 shrink-0 text-project`}),(0,U.jsx)(`span`,{className:`truncate text-sm font-medium text-fg`,children:e.name})]}),(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(Lj,{label:`Chats`,value:String(e.sessions.length)}),(0,U.jsx)(Lj,{label:`Working now`,value:i>0?String(i):null}),(0,U.jsx)(Lj,{label:`Last activity`,value:a?pd(a):null}),(0,U.jsx)(Lj,{label:o.length>1?`Folders`:`Folder`,value:o.length>1?`${o.length} folders`:o[0]??null})]}),e.projectId?(0,U.jsxs)(`div`,{className:`mt-2 border-t border-border pt-2`,children:[(0,U.jsx)(`div`,{className:`mb-1 text-fg-faint`,children:`Standing instructions`}),s?(0,U.jsx)(`div`,{className:`whitespace-pre-wrap break-words text-fg`,"data-testid":`project-instructions-${e.key}`,children:s.length>400?`${s.slice(0,400)}…`:s}):(0,U.jsx)(`div`,{className:`text-fg-faint`,children:`None — chats here start with nothing extra.`})]}):(0,U.jsx)(`div`,{className:`mt-2 border-t border-border pt-2 text-fg-faint`,children:`Chats filed under no project.`})]}),document.body)}function Lj({label:e,value:t}){return t==null||t===``?null:(0,U.jsxs)(`div`,{className:`flex justify-between gap-3`,children:[(0,U.jsx)(`span`,{className:`shrink-0 text-fg-faint`,children:e}),(0,U.jsx)(`span`,{className:`min-w-0 truncate text-right text-fg`,title:t,children:t})]})}function Rj({session:e,anchor:t}){let{state:n}=W(),r=n.providers.find(t=>t.definition.id===e.providerId)?.definition,i=r?.models.find(t=>t.id===e.model),a=e.projectId?n.vaultProjects.find(t=>t.id===e.projectId):void 0,o=JO.find(t=>t.value===e.permissionMode)?.label??e.permissionMode,s=ud(e.totalCostUsd)+(e.poolCredits!==void 0&&e.poolCredits!==null?` · ${e.poolCredits} credits`:``),c=Math.max(8,Math.min(t.right+8,window.innerWidth-304-8)),l=Math.max(8,Math.min(t.top,window.innerHeight-360));return(0,tm.createPortal)((0,U.jsxs)(`div`,{role:`tooltip`,"data-testid":`session-details-${e.id}`,className:`fixed z-50 max-h-[22rem] w-[19rem] overflow-y-auto rounded-lg border border-border bg-surface p-3 text-xs shadow-lg`,style:{left:c,top:l},children:[(0,U.jsx)(`div`,{className:`mb-2 truncate text-sm font-medium text-fg`,children:bd(e)}),(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(Lj,{label:`Model`,value:r&&e.model?`${e.model} · ${r.displayName}`:e.model}),(0,U.jsx)(Lj,{label:`Effort`,value:e.effort??`default`}),(0,U.jsx)(Lj,{label:`Mode`,value:o}),(0,U.jsx)(Lj,{label:`Status`,value:Pj[e.status]}),(0,U.jsx)(Lj,{label:`Context window`,value:i?.contextWindow?`${fd(i.contextWindow)} tokens`:null}),(0,U.jsx)(Lj,{label:`Tokens`,value:`${fd(e.inputTokens)} in · ${fd(e.outputTokens)} out`}),(0,U.jsx)(Lj,{label:`Cost`,value:s}),(0,U.jsx)(Lj,{label:`Messages`,value:String(e.entryCount)}),(0,U.jsx)(Lj,{label:`Folder`,value:e.projectDir??e.cwd}),(0,U.jsx)(Lj,{label:`Project`,value:a?.name??null}),(0,U.jsx)(Lj,{label:`Created`,value:md(e.createdAt)}),(0,U.jsx)(Lj,{label:`Updated`,value:md(e.updatedAt)}),(0,U.jsx)(Lj,{label:`Forked from`,value:e.forkedFrom}),(0,U.jsx)(Lj,{label:`Subagents`,value:e.hasSubagents?`yes`:null}),(0,U.jsx)(Lj,{label:`Mirrored`,value:e.mirrored?`yes`:null}),(0,U.jsx)(Lj,{label:`Engine since`,value:md(e.engineSince)})]})]}),document.body)}function zj({session:e,active:t,link:n,onMenu:r,menuOpen:i=!1}){let{actions:a}=W(),o=bd(e),s=e=>{let t=e.currentTarget.getBoundingClientRect();r({x:t.left,y:t.bottom+2},c.current)},c=(0,v.useRef)(null),l=(0,v.useRef)(null),[u,d]=(0,v.useState)(null),f=(0,v.useCallback)(()=>{l.current!==null&&(clearTimeout(l.current),l.current=null),d(null)},[]),p=(0,v.useRef)(i);return p.current=i,(0,v.useEffect)(()=>{i&&f()},[i,f]),(0,v.useEffect)(()=>{if(u===null)return;let e=e=>{YE(e.target,c.current)&&f()};return window.addEventListener(`scroll`,e,!0),()=>window.removeEventListener(`scroll`,e,!0)},[u,f]),(0,v.useEffect)(()=>()=>{l.current!==null&&clearTimeout(l.current)},[]),(0,U.jsxs)(`div`,{ref:c,className:H(`group relative flex items-center rounded-md`,t?`bg-accent-soft`:`hover:bg-surface-2`),onMouseEnter:()=>{l.current!==null&&clearTimeout(l.current),!p.current&&(l.current=setTimeout(()=>{l.current=null,c.current&&!p.current&&d(c.current.getBoundingClientRect())},450))},onMouseLeave:f,onClick:f,onContextMenu:e=>{e.preventDefault(),f(),r({x:e.clientX,y:e.clientY},c.current)},children:[(0,U.jsxs)(`button`,{type:`button`,onClick:()=>{a.selectSession(e.id),window.innerWidth<768&&a.setSidebar(!1)},className:`flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5 text-left`,"aria-current":t?`true`:void 0,"data-testid":`session-${e.id}`,children:[(0,U.jsx)(Sj,{status:e.status}),(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:`flex items-center gap-1`,children:(0,U.jsx)(`span`,{className:H(`min-w-0 flex-1 truncate text-sm`,t?`text-fg font-medium`:`text-fg`),children:o})}),(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center text-[11px] text-fg-faint`,children:[(0,U.jsxs)(`span`,{className:`truncate`,children:[pd(e.updatedAt),e.model?` · ${e.model}`:``,` · ${gd(e.projectDir??e.cwd)}`]}),(0,U.jsx)(Nj,{link:n})]})]})]}),(0,U.jsx)(J,{label:`Chat actions`,className:`absolute right-1 hidden bg-surface/90 p-1 group-hover:flex group-focus-within:flex`,"data-testid":`session-menu-${e.id}`,onClick:e=>{e.stopPropagation(),s(e)},children:(0,U.jsx)(K.More,{className:`w-3.5 h-3.5`})}),u===null?null:(0,U.jsx)(Rj,{session:e,anchor:u})]})}function Bj(e,t){return t.scrollWidth<=t.clientWidth||Math.abs(e.deltaX)>Math.abs(e.deltaY)||e.deltaY===0?0:e.deltaMode===1?e.deltaY*16:e.deltaMode===2?e.deltaY*t.clientWidth:e.deltaY}function Vj(e){let t=e.split(/[\\/]+/).filter(Boolean);return t[t.length-1]??e}function Hj(){let{state:e,actions:t}=W(),n=Yp(),r=Jp(),i=n?.projectDir??(r?.projectDir?r.cwd:null)??null,a=i?Vj(i):`no folder`,[o,s]=(0,v.useState)(null),c=e.currentSessionId?e.files[e.currentSessionId]:void 0,l=c?.active??null,[u,d]=(0,v.useState)(null),[f,p]=(0,v.useState)(null),m=(0,v.useCallback)(()=>p(null),[]),h=(0,v.useRef)(null);(0,v.useEffect)(()=>{h.current?.scrollIntoView({block:`nearest`,inline:`nearest`})},[l]);let g=e.tabs.ids,_=f?f.kind===`chat`?[{key:`rename`,label:`Rename…`,icon:(0,U.jsx)(K.Edit,{className:`w-3.5 h-3.5`}),onSelect:()=>{t.selectSession(f.id),d(f.id)},testId:`tab-menu-rename`},{key:`close`,label:`Close`,icon:(0,U.jsx)(K.X,{className:`w-3.5 h-3.5`}),separated:!0,onSelect:()=>t.closeTab(f.id),testId:`tab-menu-close`},{key:`close-others`,label:`Close other tabs`,disabled:g.length<2,onSelect:()=>{for(let e of g)e!==f.id&&t.closeTab(e)},testId:`tab-menu-close-others`},{key:`close-all`,label:`Close all tabs`,onSelect:()=>{for(let e of g)t.closeTab(e)},testId:`tab-menu-close-all`}]:[{key:`close`,label:`Close`,icon:(0,U.jsx)(K.X,{className:`w-3.5 h-3.5`}),onSelect:()=>t.closeFile(f.path),testId:`tab-menu-close`},{key:`close-others`,label:`Close other files`,disabled:(c?.open.length??0)<2,onSelect:()=>{for(let e of c?.open??[])e!==f.path&&t.closeFile(e)},testId:`tab-menu-close-others`},{key:`close-all`,label:`Close all files`,onSelect:()=>{for(let e of c?.open??[])t.closeFile(e)},testId:`tab-menu-close-all`}]:[],y=(0,v.useMemo)(()=>e.tabs.ids.map(t=>{let n=e.drafts[t],r=e.transcripts[t]?.session??e.sessions.find(e=>e.id===t)??null,i=e.transcripts[t]?.status??r?.status??`idle`;return{id:t,draft:n!==void 0,title:n?Od(n):r?bd(r):`Session ${t.slice(0,8)}`,customTitle:n?n.title??``:r?.title??``,cwd:n?n.projectDir??``:r?.cwd??``,running:i===`running`||i===`waiting_permission`,waiting:i===`waiting_permission`,error:i===`error`}}),[e.tabs.ids,e.drafts,e.transcripts,e.sessions]),b=(0,v.useCallback)((e,n)=>{d(null),t.renameTab(e,n)},[t]),x=e.currentSessionId?e.remote.tabs[e.currentSessionId]??null:null,S=(0,v.useRef)(null),C=e.tabs.activeId;(0,v.useEffect)(()=>{S.current?.scrollIntoView({block:`nearest`,inline:`nearest`})},[C]);let w=(0,v.useRef)(null),T=(0,v.useRef)(null);return(0,v.useEffect)(()=>{let e=w.current;if(!e)return;let t=e=>{let t=T.current;if(!t)return;let n=Bj(e,t);n!==0&&(e.preventDefault(),t.scrollLeft+=n)},n=e=>{e.button===1&&e.preventDefault()};return e.addEventListener(`wheel`,t,{passive:!1}),e.addEventListener(`mousedown`,n),()=>{e.removeEventListener(`wheel`,t),e.removeEventListener(`mousedown`,n)}},[]),(0,U.jsxs)(`div`,{ref:w,className:`flex h-9 shrink-0 items-stretch gap-1 border-b border-border bg-surface px-1`,role:`tablist`,"aria-label":`Open chats`,"data-testid":`tab-bar`,children:[(0,U.jsxs)(`div`,{ref:T,className:`flex min-w-0 flex-1 items-stretch gap-1 overflow-x-auto`,"data-testid":`tabs-scroller`,children:[y.map((n,r)=>{let i=n.id===e.tabs.activeId&&l===null,a=u===n.id;return(0,U.jsxs)(`div`,{ref:n.id===e.tabs.activeId?S:void 0,role:`tab`,"aria-selected":i,tabIndex:i?0:-1,draggable:!a,onDragStart:()=>s(r),onDragOver:e=>{o!==null&&e.preventDefault()},onDrop:e=>{o!==null&&(e.preventDefault(),t.moveTab(o,r),s(null))},onDragEnd:()=>s(null),onContextMenu:e=>{e.preventDefault(),p({kind:`chat`,id:n.id,title:n.title,at:{x:e.clientX,y:e.clientY},el:e.currentTarget})},onAuxClick:e=>{e.button===1&&(e.preventDefault(),t.closeTab(n.id))},className:H(`group relative flex min-w-[7rem] max-w-[15rem] shrink-0 items-center gap-1.5 rounded-t-md border-b-2 px-2 text-xs`,i?`border-accent bg-surface-2 text-fg`:`border-transparent text-fg-muted hover:bg-surface-2`),"data-testid":`tab-${n.id}`,children:[a?(0,U.jsx)(Uj,{initial:n.customTitle,placeholder:n.title,onCommit:e=>b(n.id,e),onCancel:()=>d(null)}):(0,U.jsxs)(`button`,{type:`button`,onClick:()=>{t.selectSession(n.id),t.showChat(n.id)},onDoubleClick:()=>d(n.id),title:n.cwd?`${n.title}\n${n.cwd}`:`${n.title}\nDouble-click to rename`,className:`flex min-w-0 flex-1 items-center gap-1.5 py-1 text-left`,children:[n.running?(0,U.jsx)(K.Spinner,{className:H(`w-3 h-3 shrink-0`,n.waiting?`text-warn`:`text-accent`),title:`Agent running`}):n.error?(0,U.jsx)(K.Alert,{className:`w-3 h-3 shrink-0 text-danger`}):(0,U.jsx)(`span`,{className:`w-3 shrink-0`,"aria-hidden":!0}),(0,U.jsx)(`span`,{className:`truncate`,children:_d(n.title,28)})]}),(0,U.jsx)(J,{label:`Close ${n.title}`,className:`p-0.5 opacity-0 group-hover:opacity-100 focus:opacity-100`,onClick:()=>t.closeTab(n.id),children:(0,U.jsx)(K.X,{className:`w-3 h-3`})})]},n.id)}),c?.open.map(e=>{let n=l===e,r=uw(e);return(0,U.jsxs)(`div`,{ref:n?h:void 0,role:`tab`,"aria-selected":n,tabIndex:n?0:-1,title:e,onContextMenu:t=>{t.preventDefault(),p({kind:`file`,path:e,at:{x:t.clientX,y:t.clientY},el:t.currentTarget})},onAuxClick:n=>{n.button===1&&(n.preventDefault(),t.closeFile(e))},className:H(`group relative flex min-w-[6rem] max-w-[14rem] shrink-0 items-center gap-1.5 rounded-t-md border-b-2 px-2 text-xs`,n?`border-accent bg-surface-2 text-fg`:`border-transparent text-fg-muted hover:bg-surface-2`),"data-testid":`file-tab-${e}`,children:[(0,U.jsxs)(`button`,{type:`button`,onClick:()=>t.activateFile(e),className:`flex min-w-0 flex-1 items-center gap-1.5 py-1 text-left`,children:[(0,U.jsx)(K.File,{className:`w-3 h-3 shrink-0 text-fg-faint`}),(0,U.jsx)(`span`,{className:`truncate`,children:_d(r,28)})]}),(0,U.jsx)(J,{label:`Close ${r}`,className:`p-0.5 opacity-0 group-hover:opacity-100 focus:opacity-100`,onClick:()=>t.closeFile(e),"data-testid":`file-tab-close-${e}`,children:(0,U.jsx)(K.X,{className:`w-3 h-3`})})]},`file:${e}`)})]}),(0,U.jsx)(ZE,{open:f!==null,at:f?.at??{x:0,y:0},anchorEl:f?.el??null,label:`Tab actions`,onClose:m,items:_.map(e=>({...e,onSelect:()=>{m(),e.onSelect()}}))}),(0,U.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5 pl-1`,children:[(0,U.jsx)(J,{label:`New chat`,onClick:()=>t.newTab(),"data-testid":`new-tab`,children:(0,U.jsx)(K.Plus,{className:`w-4 h-4`})}),(0,U.jsxs)(`button`,{type:`button`,title:x?`Choose a project folder in OonaCode on ${x.hostName}`:i?`${i} — click to change the folder`:`No project folder: this chat runs in its own workspace. Click to use one of your folders.`,"aria-label":x?`Choose a project folder in OonaCode on ${x.hostName}`:`Use a project folder…`,disabled:x!==null,onClick:()=>t.openDialog(`project`),className:`flex max-w-[220px] items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-fg-muted hover:border-accent/60 hover:text-fg disabled:opacity-50`,"data-testid":`open-project-dialog`,children:[(0,U.jsx)(K.Folder,{className:`w-3.5 h-3.5 shrink-0`}),(0,U.jsx)(`span`,{className:`hidden truncate sm:inline`,"data-testid":`folder-chip`,children:a})]})]})]})}function Uj({initial:e,placeholder:t,onCommit:n,onCancel:r}){let[i,a]=(0,v.useState)(e),o=(0,v.useRef)(null),s=(0,v.useRef)(!1);return(0,v.useEffect)(()=>{o.current?.focus(),o.current?.select()},[]),(0,U.jsx)(`input`,{ref:o,"aria-label":`Rename tab`,"data-testid":`tab-title-input`,className:`min-w-0 flex-1 rounded border border-accent bg-bg px-1 py-0.5 text-xs outline-none`,value:i,maxLength:500,placeholder:t,spellCheck:!1,onChange:e=>a(e.target.value),onKeyDown:e=>{e.stopPropagation(),e.key===`Enter`?(e.preventDefault(),n(i)):e.key===`Escape`&&(e.preventDefault(),s.current=!0,r())},onBlur:()=>{s.current||n(i)}})}function Wj(){let e=typeof window<`u`?window.oonacode:void 0;return{desktop:typeof e?.installUpdate==`function`,terminal:typeof e?.updateTerminalInstall==`function`}}function Gj(e){if(e.upToDate)return`Everything on this PC is up to date — the app, the host service and the oona CLI.`;let t=[];return e.terminal&&t.push(`OonaCode updates the oona CLI and the host service in place — the service restarts and your chats come back with it.`),e.desktop&&t.push(e.terminal?`Then it downloads the app, installs it and relaunches, restoring your open tabs.`:`OonaCode downloads the update, installs it and relaunches. Your open chat tabs are restored afterwards.`),t.length===0?t.push("This window cannot install updates by itself — run the installer again, or `oona update` in a terminal. Your open chat tabs are stored in the host and come back automatically."):e.manual.length>0&&t.push(e.manual.includes(`desktop`)?`The app itself needs the installer from the website.`:"The rest needs `oona update` in a terminal."),t.join(` `)}var Kj=2*Math.PI*10;function qj(){return typeof window<`u`&&window.oonacode!==void 0}function Jj(){let{state:e,actions:t}=W(),n=e.update,r=e.updateInstall,i=e.prefs.dismissedUpdateVersion,a=n.version!==``&&(e.updateDismissed===n.version||i===n.version);if(!qj())return null;let o=vp({install:r,manifestAvailable:n.available&&!a}),s=e.terminalUpdate.running,c=e.updateChecking||r.phase===`checking`||s,l=n.components.length,u=Math.round(r.percent),d=s?`Updating the CLI and host service`:o===`ready`?`Restart to finish updating`:o===`downloading`?`Downloading update (${u}%)`:o===`available`?`Update available (${l})`:`Check for updates`,f=s?`Updating the oona CLI and the host service…`:o===`ready`?`An update is ready — restart to finish`:o===`downloading`?`Downloading OonaCode ${r.version||`update`} — ${u}%`:o===`available`?`${l} component${l===1?``:`s`} can be updated`:`Check for updates`;return(0,U.jsxs)(`button`,{type:`button`,onClick:()=>{if(o===`idle`){t.checkUpdates(!0);return}if(o===`ready`){t.installUpdate();return}t.openDialog(`update`)},title:f,"aria-label":d,"aria-busy":c||void 0,"data-testid":`update-badge`,"data-state":o,className:H(`relative inline-flex h-7 w-7 items-center justify-center rounded-full border transition-transform hover:scale-105`,o===`idle`?`border-border bg-surface-2 text-fg-muted hover:text-fg`:`border-accent bg-accent-soft text-accent`),children:[o===`downloading`?(0,U.jsxs)(`svg`,{viewBox:`0 0 24 24`,"data-testid":`update-badge-progress`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":u,className:`absolute inset-0 h-full w-full -rotate-90`,children:[(0,U.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`,fill:`none`,strokeWidth:`2`,className:`stroke-border`}),(0,U.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`,fill:`none`,strokeWidth:`2`,strokeLinecap:`round`,strokeDasharray:Kj,strokeDashoffset:Kj*(1-Math.max(0,Math.min(100,u))/100),className:`stroke-accent`})]}):null,c&&o!==`downloading`&&o!==`ready`?(0,U.jsx)(`span`,{"data-testid":`update-badge-checking`,className:`inline-flex`,children:(0,U.jsx)(K.Spinner,{className:`w-3.5 h-3.5`})}):o===`ready`?(0,U.jsx)(`span`,{"data-testid":`update-badge-ready`,className:`inline-flex`,children:(0,U.jsx)(K.Refresh,{className:`w-3.5 h-3.5`})}):o===`downloading`?(0,U.jsx)(`span`,{"data-testid":`update-badge-downloading`,className:`text-[9px] font-semibold`,children:u}):(0,U.jsx)(`span`,{"data-testid":o===`available`?`update-badge-available`:`update-badge-idle`,className:`inline-flex`,children:(0,U.jsx)(K.Download,{className:`w-3.5 h-3.5`})}),o===`available`?(0,U.jsx)(`span`,{className:`absolute -right-0.5 -top-0.5 h-2 w-2 rounded-full bg-accent`,"aria-hidden":!0}):null]})}function Yj(){let{state:e,actions:t}=W(),n=e.updateInstall,r=Math.round(Math.max(0,Math.min(100,n.percent))),i=xp(n.bytesPerSecond);if(n.phase===`error`)return(0,U.jsxs)(`div`,{className:`rounded-md border border-danger-soft bg-danger-soft px-3 py-2 text-xs text-danger`,"data-testid":`update-error`,role:`alert`,children:[(0,U.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,U.jsx)(K.Alert,{className:`mt-0.5 w-3.5 h-3.5 shrink-0`}),(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:`font-medium`,children:`The update could not be downloaded.`}),(0,U.jsx)(`div`,{className:`mt-0.5 pre-wrap break-words`,children:n.error})]})]}),(0,U.jsx)(`div`,{className:`mt-2`,children:(0,U.jsxs)(q,{size:`sm`,onClick:()=>void t.installUpdate(),"data-testid":`update-retry`,children:[(0,U.jsx)(K.Refresh,{className:`w-3.5 h-3.5`}),` Try again`]})})]});let a=n.phase===`installing`;return(0,U.jsxs)(`div`,{className:`space-y-1.5`,"data-testid":`update-progress`,children:[(0,U.jsxs)(`div`,{className:`flex items-center justify-between text-xs`,children:[(0,U.jsx)(`span`,{className:`font-medium text-fg`,children:a?`Installing and restarting…`:n.phase===`ready`?`Downloaded — restart to install`:`Downloading OonaCode ${n.version||``}`.trim()}),a?null:(0,U.jsxs)(`span`,{className:`text-fg-muted`,children:[r,`%`]})]}),n.notice?(0,U.jsx)(`div`,{className:`pre-wrap text-xs text-warn`,"data-testid":`update-notice`,role:`status`,children:n.notice}):null,(0,U.jsx)(`div`,{className:`h-1.5 w-full overflow-hidden rounded-full bg-surface-2`,children:(0,U.jsx)(`div`,{className:H(`h-full rounded-full bg-accent`,a&&`animate-pulse`),style:{width:`${a?100:r}%`},"data-testid":`update-progress-bar`})}),a?(0,U.jsx)(`div`,{className:`text-xs text-fg-faint`,children:`The host service stops for a few seconds while the installer runs, then OonaCode starts again with your chat tabs.`}):(0,U.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-fg-faint`,children:[(0,U.jsxs)(`span`,{children:[bp(n.transferred),n.total>0?` of ${bp(n.total)}`:``]}),i?(0,U.jsx)(`span`,{children:i}):null]})]})}function Xj(){let{state:e,actions:t}=W(),n=e.terminalUpdate;return n.running?(0,U.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-border bg-surface-2 px-3 py-2 text-xs`,"data-testid":`terminal-update-running`,role:`status`,children:[(0,U.jsx)(K.Spinner,{className:`mt-0.5 w-3.5 h-3.5 shrink-0`}),(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:`font-medium text-fg`,children:`Updating the oona CLI and host service...`}),(0,U.jsx)(`div`,{className:`mt-0.5 text-fg-faint`,children:`The host service stops for a few seconds while its installer runs. Your chats are in the database and come back with it.`})]})]}):n.failed?(0,U.jsxs)(`div`,{className:`rounded-md border border-danger-soft bg-danger-soft px-3 py-2 text-xs text-danger`,"data-testid":`terminal-update-error`,role:`alert`,children:[(0,U.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,U.jsx)(K.Alert,{className:`mt-0.5 w-3.5 h-3.5 shrink-0`}),(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:`font-medium`,children:`The CLI and host service could not be updated.`}),(0,U.jsx)(`div`,{className:`mt-0.5 pre-wrap break-words`,children:n.message})]})]}),(0,U.jsx)(`div`,{className:`mt-2`,children:(0,U.jsxs)(q,{size:`sm`,onClick:()=>void t.installUpdate(),"data-testid":`terminal-update-retry`,children:[(0,U.jsx)(K.Refresh,{className:`w-3.5 h-3.5`}),` Try again`]})})]}):null}function Zj({open:e,onClose:t}){let{state:n,actions:r}=W(),i=n.update,a=n.updateInstall,o=r.checkUpdates,s=a.phase===`downloading`||a.phase===`installing`||a.phase===`ready`;(0,v.useEffect)(()=>{!e||s||o(!1)},[e,s,o]);let c=Wj(),l=Cp(i.components.map(e=>e.component),c,{checked:i.version!==``,shellEngaged:a.phase!==`idle`&&a.phase!==`checking`}),u=i.version||a.version,d=a.phase===`ready`,f=a.phase===`downloading`||a.phase===`installing`||d||a.phase===`error`,p=n.terminalUpdate.running,m=n.updateChecking||a.phase===`checking`||p;return(0,U.jsx)(um,{open:e,title:`Update OonaCode`,onClose:t,footer:d?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(q,{onClick:t,children:`Later`}),(0,U.jsxs)(q,{variant:`primary`,onClick:()=>void r.installUpdate(),"data-testid":`update-restart`,children:[(0,U.jsx)(K.Refresh,{className:`w-4 h-4`}),`Restart and install`]})]}):f?(0,U.jsx)(q,{onClick:t,children:`Close`}):l.upToDate?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(q,{onClick:()=>void r.checkUpdates(!0),busy:m,disabled:m,"data-testid":`update-check-again`,children:[(0,U.jsx)(K.Refresh,{className:`w-4 h-4`}),`Check again`]}),(0,U.jsx)(q,{variant:`primary`,onClick:t,children:`Close`})]}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(q,{onClick:()=>r.dismissUpdate(),children:`Skip this version`}),(0,U.jsx)(q,{onClick:t,children:`Later`}),(0,U.jsxs)(q,{variant:`primary`,busy:m,disabled:m,onClick:()=>void r.installUpdate(),children:[(0,U.jsx)(K.Download,{className:`w-4 h-4`}),l.label]})]}),children:(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-sm`,children:[u?(0,U.jsxs)(`span`,{className:`font-medium`,children:[`Release `,u]}):null,i.channel?(0,U.jsx)(X,{children:i.channel}):null,n.updateChecking?(0,U.jsx)(`span`,{className:`text-xs text-fg-faint`,"data-testid":`update-rechecking`,children:`checking for a newer one…`}):null,i.publishedAt?(0,U.jsxs)(`span`,{className:`text-xs text-fg-faint`,children:[`published `,new Date(i.publishedAt).toLocaleDateString()]}):null]}),f?(0,U.jsx)(Yj,{}):null,(0,U.jsx)(Xj,{}),i.components.length>0?(0,U.jsx)(`ul`,{className:`divide-y divide-border rounded-md border border-border`,children:i.components.map(e=>(0,U.jsxs)(`li`,{className:`flex items-start gap-3 px-3 py-2`,children:[(0,U.jsx)(K.Download,{className:`mt-0.5 w-3.5 h-3.5 shrink-0 text-accent`}),(0,U.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,U.jsx)(`div`,{className:`text-sm font-medium`,children:e.label}),(0,U.jsxs)(`div`,{className:`text-xs text-fg-muted`,children:[e.current,` → `,(0,U.jsx)(`span`,{className:`font-medium text-fg`,children:e.latest})]}),(0,U.jsx)(`div`,{className:`text-xs text-fg-faint`,"data-testid":`update-how-${e.component}`,children:wp(e.component,c)}),e.notes?(0,U.jsx)(`div`,{className:`mt-0.5 pre-wrap text-xs text-fg-faint`,children:e.notes}):null]})]},e.component))}):null,i.notes?(0,U.jsxs)(`div`,{children:[(0,U.jsx)(`div`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-fg-faint`,children:`Release notes`}),(0,U.jsx)(`div`,{className:`max-h-48 overflow-y-auto rounded-md bg-surface-2 px-3 py-2 pre-wrap text-xs text-fg-muted`,children:i.notes})]}):null,f?null:(0,U.jsx)(`p`,{className:`text-xs text-fg-faint`,"data-testid":`update-plan-note`,children:Gj(l)})]})})}function Qj(e){switch(e){case`open`:return{cls:`bg-ok`,label:`Connected`};case`connecting`:case`reconnecting`:return{cls:`bg-warn animate-pulse`,label:e===`connecting`?`Connecting…`:`Reconnecting…`};case`unauthorized`:return{cls:`bg-danger`,label:`Unauthorized`};case`closed`:return{cls:`bg-danger`,label:`Disconnected`};default:return{cls:`bg-fg-faint`,label:`Idle`}}}function $j(){let{state:e,actions:t}=W(),n=Qj(e.connection.status),r=e.account?.loggedIn===!0,i=typeof window<`u`&&window.oonacode?.host===`vscode`;return(0,U.jsxs)(`header`,{className:`flex h-12 shrink-0 items-center gap-2 border-b border-border bg-surface px-2 sm:px-3`,children:[i?null:(0,U.jsx)(J,{label:`Toggle sidebar`,onClick:()=>{typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(min-width: 768px)`).matches?t.savePrefs({sidebarPinned:!e.prefs.sidebarPinned}):t.setSidebar(!e.ui.sidebarOpen)},"data-testid":`toggle-sidebar`,children:(0,U.jsx)(K.PanelLeft,{})}),(0,U.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[i?null:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-semibold tracking-tight`,children:`OonaCode`}),(0,U.jsx)(`span`,{className:`hidden text-fg-faint sm:inline`,children:`/`})]}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>t.openDialog(`session-picker`),title:`Open a session on this PC or another device`,className:`hidden min-w-0 truncate text-sm text-fg-muted hover:text-fg sm:inline`,"data-testid":`host-name`,children:e.connection.hostName??`host`}),(0,U.jsxs)(`span`,{className:`flex items-center gap-1 text-xs text-fg-muted`,title:e.connection.detail??n.label,"data-testid":`connection-status`,children:[(0,U.jsx)(`span`,{className:H(`inline-block h-2 w-2 rounded-full`,n.cls),"aria-hidden":!0}),(0,U.jsx)(`span`,{className:`hidden sm:inline`,children:n.label})]})]}),(0,U.jsxs)(`div`,{className:`ml-auto flex items-center gap-1.5`,children:[(0,U.jsx)(`button`,{type:`button`,onClick:()=>t.openDialog(`bug-report`),title:`Bug Report...`,"aria-label":`Bug Report...`,"data-testid":`bug-report-button`,className:`inline-flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface-2 text-fg-muted transition-transform hover:scale-105 hover:text-fg`,children:(0,U.jsx)(K.Bug,{className:`w-3.5 h-3.5`})}),(0,U.jsx)(Jj,{}),e.hostUpdatedTo?(0,U.jsxs)(q,{size:`sm`,variant:`primary`,onClick:()=>window.location.reload(),title:`This window still runs the previous version; the host is now v${e.hostUpdatedTo}`,"data-testid":`reload-for-update`,children:[`Reload for v`,e.hostUpdatedTo]}):null,r?null:(0,U.jsxs)(q,{size:`sm`,variant:`primary`,onClick:()=>t.openDialog(`account`),"data-testid":`sign-in`,children:[(0,U.jsx)(K.LogIn,{className:`w-3.5 h-3.5`}),` Sign in`]}),(0,U.jsx)(J,{label:e.prefs.explorerOpen?`Hide files`:`Show files`,onClick:()=>void t.savePrefs({explorerOpen:!e.prefs.explorerOpen}),className:e.prefs.explorerOpen?`bg-surface-2 text-fg`:void 0,"data-testid":`toggle-explorer`,children:(0,U.jsx)(K.Folder,{})}),(0,U.jsx)(J,{label:e.prefs.sessionPanelOpen?`Hide session info`:`Show session info`,onClick:()=>void t.savePrefs({sessionPanelOpen:!e.prefs.sessionPanelOpen}),className:e.prefs.sessionPanelOpen?`bg-surface-2 text-fg`:void 0,"data-testid":`toggle-session-panel`,children:(0,U.jsx)(K.Panel,{})}),(0,U.jsx)(J,{label:`Doctor`,onClick:()=>t.openDialog(`doctor`),children:(0,U.jsx)(K.Stethoscope,{})}),r?(0,U.jsx)(eM,{}):null,(0,U.jsx)(J,{label:`Account`,onClick:()=>t.openDialog(`account`),children:(0,U.jsxs)(`span`,{className:`relative`,children:[(0,U.jsx)(K.User,{}),r?(0,U.jsx)(`span`,{className:H(`absolute -right-0.5 -top-0.5 h-1.5 w-1.5 rounded-full`,e.account?.vaultUnlocked?`bg-ok`:`bg-warn`)}):null]})}),(0,U.jsx)(J,{label:`Settings`,onClick:()=>t.openDialog(`settings`),children:(0,U.jsx)(K.Settings,{})})]})]})}function eM(){let{state:e}=W(),[t,n]=(0,v.useState)(!1),r=(0,v.useRef)(null),i=e.plan;(0,v.useEffect)(()=>{if(!t)return;let e=e=>{r.current&&!r.current.contains(e.target)&&n(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[t]);let a=i?i.credits.balance:null,o=i?Xf(i):null,s=$f(i),c=ep;return(0,U.jsxs)(`div`,{className:`relative`,ref:r,children:[(0,U.jsx)(J,{label:s?`Credits and plan — ${s.text}`:`Credits and plan`,onClick:()=>n(e=>!e),"data-testid":`balance-badge`,className:t?`bg-surface-2 text-fg`:void 0,children:(0,U.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,U.jsx)(K.Coins,{}),a===null?null:(0,U.jsx)(`span`,{className:H(`hidden text-xs tabular-nums sm:inline`,s?s.level===`empty`?`text-danger`:`text-warn`:void 0),"data-testid":`balance-credits`,"data-level":s?.level??`ok`,children:c(a)})]})}),t?(0,U.jsx)(`div`,{className:`absolute right-0 top-full z-50 mt-1 w-64 rounded-md border border-border bg-surface p-3 text-sm shadow-lg`,"data-testid":`balance-popover`,children:i===null||o===null?(0,U.jsx)(`div`,{className:`text-fg-muted`,children:`Balance is unavailable — the gateway can't be reached.`}):(0,U.jsxs)(`div`,{className:`space-y-2`,children:[(0,U.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,U.jsx)(`span`,{className:`text-fg-muted`,children:`Plan`}),(0,U.jsxs)(`span`,{className:`font-medium`,children:[i.planName,i.status===`none`?` (lapsed)`:``]})]}),(0,U.jsx)(`div`,{className:`h-px bg-border`}),(0,U.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,U.jsx)(`span`,{className:`text-fg-muted`,children:`Credits`}),(0,U.jsx)(`span`,{className:`font-semibold tabular-nums`,children:c(o.balance)})]}),s?(0,U.jsx)(`div`,{className:H(`rounded-sm px-2 py-1 text-[11px]`,s.level===`empty`?`bg-danger-soft text-danger`:`bg-warn-soft text-warn`),"data-testid":`balance-warning`,children:s.text}):null,o.hasSplit?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,U.jsx)(`span`,{className:`text-fg-muted`,children:`Plan credits`}),(0,U.jsx)(`span`,{className:`tabular-nums`,children:c(o.plan??0)})]}),(0,U.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,U.jsx)(`span`,{className:`text-fg-muted`,children:`Top-up credits`}),(0,U.jsx)(`span`,{className:`tabular-nums`,children:c(o.topup??0)})]})]}):null,(0,U.jsxs)(`div`,{className:`text-[11px] text-fg-faint`,children:[i.credits.monthlyGrant>0?`Plan credits top up to ${c(i.credits.monthlyGrant)} each 30-day period and expire with it; top-ups never do.`:`This plan pays no monthly credits — the signup gift and anything you buy never expire.`,` `,`Free models never draw on this balance.`]})]})}):null]})}function tM(e){return new Promise((t,n)=>{let r=new FileReader;r.onerror=()=>n(r.error??Error(`could not read the file`)),r.onload=()=>{let e=typeof r.result==`string`?r.result:``,n=e.indexOf(`,`);t(n>=0?e.slice(n+1):``)},r.readAsDataURL(e)})}function nM(e,t){let n=[],r=e.length,i=e.reduce((e,t)=>e+t.size,0);for(let e of t){if(r>=5)return{accepted:n,refused:`At most 5 files per report.`};if(e.size>5242880)return{accepted:n,refused:`${e.name} is ${bp(e.size)}; a file may be at most ${bp(Fs)}.`};if(i+e.size>12582912)return{accepted:n,refused:`All files together may be at most ${bp(Is)}.`};n.push(e),r+=1,i+=e.size}return{accepted:n,refused:null}}function rM(e){return e instanceof jl?e.code===`account_required`||e.status===401?`Sign in to OonaCode first — a report is filed under your account so we can answer it.`:Fl(e)?`This host build cannot send bug reports yet — update OonaCode on this PC.`:e.status===429?`Too many reports in a minute — wait a moment and send again.`:e.status===413?`The attachments are too large for one report.`:e.message||`The report could not be sent.`:e instanceof Error&&e.message?e.message:`The report could not be sent.`}var iM=0;function aM({open:e,onClose:t}){let{state:n,actions:r,api:i}=W(),[a,o]=(0,v.useState)(``),[s,c]=(0,v.useState)([]),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(null),[p,m]=(0,v.useState)(!1),h=(0,v.useRef)(null);(0,v.useEffect)(()=>{e&&(o(``),c([]),u(!1),f(null))},[e]);let g=n.account?.loggedIn===!0,_=typeof i.sendBugReport==`function`,y=typeof window<`u`?window.oonacode:void 0,b=y?y.host===`vscode`?`vscode`:`desktop`:`browser`,x=n.currentSessionId?n.sessions.find(e=>e.id===n.currentSessionId)??null:null,S=(0,v.useCallback)(async e=>{let t=Array.from(e);if(t.length===0)return;let{accepted:n,refused:r}=nM(s,t);f(r);let i=t.filter(e=>n.includes(e));if(i.length!==0){m(!0);try{let e=[];for(let t of i){let n=await tM(t);if(!n)continue;let r=t.type||`application/octet-stream`;iM+=1,e.push({key:`f${iM}`,name:t.name,contentType:r,dataBase64:n,size:t.size,preview:r.startsWith(`image/`)?`data:${r};base64,${n}`:null})}c(t=>[...t,...e])}catch(e){f(e instanceof Error?e.message:`could not read the file`)}finally{m(!1)}}},[s]),C=e=>{let t=e.target.files;t&&S(t),e.target.value=``},w=e=>c(t=>t.filter(t=>t.key!==e)),T=async()=>{let e=a.trim();if(!e||l)return;if(!_){f(`This host build cannot send bug reports yet — update OonaCode on this PC.`);return}u(!0),f(null);let o={message:e.slice(0,Ps),...s.length>0?{attachments:s.map(({name:e,contentType:t,dataBase64:n})=>({name:e,contentType:t,dataBase64:n}))}:{},...n.currentSessionId?{sessionId:n.currentSessionId}:{},detail:{embedded:b,connection:n.connection.status,...y?.appVersion?{appVersion:y.appVersion}:{},...n.bundleAppVersion?{uiVersion:n.bundleAppVersion}:{},...n.info?.appVersion?{hostVersion:n.info.appVersion}:{},...n.info?.engine?.version?{engineVersion:n.info.engine.version}:{},...x?.status?{sessionStatus:x.status}:{}}};try{let e=await i.sendBugReport(o);r.toast(`success`,`Bug report #${e.id} sent — thank you.`),t()}catch(e){f(rM(e))}finally{u(!1)}},E=Ps-a.length;return(0,U.jsx)(um,{open:e,title:`Bug Report`,onClose:t,footer:(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(q,{onClick:t,disabled:l,children:`Cancel`}),(0,U.jsxs)(q,{variant:`primary`,busy:l,disabled:!a.trim()||p,onClick:()=>void T(),"data-testid":`bug-report-send`,children:[(0,U.jsx)(K.Bug,{className:`w-4 h-4`}),`Send report`]})]}),children:(0,U.jsxs)(`div`,{className:`space-y-3 text-sm`,"data-testid":`bug-report-dialog`,children:[(0,U.jsxs)(`p`,{className:`text-fg-muted`,children:[`Tell us what went wrong and what you expected. Screenshots help. The report is filed under your account with this PC's versions`,x?` and the open chat’s model`:``,`; the chat itself is never sent.`]}),g?null:(0,U.jsx)(`div`,{className:`rounded-md border border-warn/40 bg-warn-soft px-3 py-2 text-xs text-warn`,children:`Sign in to OonaCode to send a report — it is filed under your account so we can answer it.`}),(0,U.jsxs)(`label`,{className:`flex flex-col gap-1`,children:[(0,U.jsx)(`span`,{className:`font-medium text-fg`,children:`What happened?`}),(0,U.jsx)(`textarea`,{name:`message`,className:H(Y,`min-h-32 resize-y`),value:a,maxLength:Ps,placeholder:`The answer stopped after a few seconds with “API error”. I was using…`,onChange:e=>o(e.target.value),"data-testid":`bug-report-message`}),(0,U.jsx)(`span`,{className:`text-xs text-fg-faint`,children:E<500?`${E} characters left`:``})]}),(0,U.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(`input`,{ref:h,type:`file`,multiple:!0,className:`hidden`,onChange:C,"data-testid":`bug-report-files`}),(0,U.jsxs)(q,{size:`sm`,onClick:()=>h.current?.click(),disabled:l||p||s.length>=5,children:[(0,U.jsx)(K.Paperclip,{className:`w-3.5 h-3.5`}),`Attach files or pictures`]}),(0,U.jsxs)(`span`,{className:`text-xs text-fg-faint`,children:[`up to `,5,` files,`,` `,bp(Fs),` each`]})]}),s.length>0?(0,U.jsx)(`ul`,{className:`flex flex-wrap gap-2`,"data-testid":`bug-report-attachments`,children:s.map(e=>(0,U.jsxs)(`li`,{className:`flex items-center gap-2 rounded-md border border-border bg-surface-2 px-2 py-1 text-xs`,children:[e.preview?(0,U.jsx)(`img`,{src:e.preview,alt:``,className:`h-8 w-8 rounded object-cover`,"aria-hidden":!0}):(0,U.jsx)(K.Paperclip,{className:`w-3.5 h-3.5 text-fg-muted`}),(0,U.jsx)(`span`,{className:`max-w-40 truncate`,title:e.name,children:e.name}),(0,U.jsx)(`span`,{className:`text-fg-faint`,children:bp(e.size)}),(0,U.jsx)(J,{label:`Remove ${e.name}`,onClick:()=>w(e.key),children:(0,U.jsx)(K.X,{className:`w-3.5 h-3.5`})})]},e.key))}):null]}),d?(0,U.jsx)(`div`,{className:`text-xs text-danger`,role:`alert`,"data-testid":`bug-report-error`,children:d}):null]})})}function oM(e){let t=Date.parse(`${e}T12:00:00`);return Number.isFinite(t)?new Date(t).toLocaleDateString(void 0,{dateStyle:`long`}):e}function sM({open:e,notes:t,onClose:n}){return(0,U.jsx)(um,{open:e,title:`What's new in OonaCode`,onClose:n,footer:(0,U.jsx)(q,{variant:`primary`,onClick:n,children:`Got it`}),children:(0,U.jsx)(`div`,{className:`space-y-5 text-sm`,"data-testid":`whats-new`,children:t.map(e=>(0,U.jsxs)(`section`,{"data-version":e.version,children:[(0,U.jsxs)(`div`,{className:`mb-2 flex items-baseline gap-2`,children:[(0,U.jsxs)(`h3`,{className:`text-base font-semibold`,children:[`Version `,e.version]}),(0,U.jsx)(`span`,{className:`text-xs text-fg-faint`,children:oM(e.date)})]}),e.added.length>0?(0,U.jsx)(`ul`,{className:`space-y-1.5`,children:e.added.map((e,t)=>(0,U.jsxs)(`li`,{className:`flex gap-2`,children:[(0,U.jsx)(K.Plus,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-accent`}),(0,U.jsx)(`span`,{children:e})]},t))}):null,e.fixed.length>0?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`mb-1 mt-3 text-xs font-medium uppercase tracking-wide text-fg-faint`,children:`Fixed`}),(0,U.jsx)(`ul`,{className:`space-y-1.5`,children:e.fixed.map((e,t)=>(0,U.jsxs)(`li`,{className:`flex gap-2`,children:[(0,U.jsx)(K.Check,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-ok`}),(0,U.jsx)(`span`,{children:e})]},t))})]}):null]},e.version))})})}function cM(){let{state:e,actions:t}=W(),n=Cl(e.account);return!n||e.ui.dialog===`account`?null:(0,U.jsxs)(`div`,{role:`status`,"data-testid":`vault-rekey-banner`,className:`flex items-center gap-2 bg-warn-soft px-3 py-1.5 text-xs text-warn`,children:[(0,U.jsx)(K.Alert,{className:`w-3.5 h-3.5`}),(0,U.jsx)(`span`,{className:`flex-1`,children:Al(n)}),(0,U.jsx)(q,{size:`sm`,variant:`primary`,onClick:()=>t.openDialog(`account`),children:`Open Account`})]})}function lM({onReconnect:e}){let{state:t}=W(),n=t.connection.status;if(n===`open`||n===`idle`||n===`connecting`)return null;let r=n===`unauthorized`&&!window.oonacode;return(0,U.jsxs)(`div`,{role:`status`,className:H(`flex items-center gap-2 px-3 py-1.5 text-xs`,r?`bg-danger-soft text-danger`:`bg-warn-soft text-warn`),children:[r?(0,U.jsx)(K.Alert,{className:`w-3.5 h-3.5`}):(0,U.jsx)(K.Spinner,{className:`w-3.5 h-3.5`}),(0,U.jsx)(`span`,{className:`flex-1`,children:r?`The host rejected this connection${t.connection.detail?` (${t.connection.detail})`:``}. Re-open the UI from the desktop app or paste a fresh token.`:`Reconnecting to the host${t.connection.detail?` — ${t.connection.detail}`:``}…`}),r&&e?(0,U.jsx)(q,{size:`sm`,variant:`danger`,onClick:e,children:`Enter token`}):null]})}function uM(){let{actions:e}=W();(0,v.useEffect)(()=>{if(typeof window>`u`)return;let t=t=>{!(t.ctrlKey||t.metaKey)||t.key!==`Tab`||(t.preventDefault(),e.cycleTab(t.shiftKey?-1:1))};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e])}function dM(){let{state:e,actions:t}=W(),n=(0,v.useRef)(!1),r=e.account?.loggedIn===!0,i=e.prefs.claudeImportOffered?3:e.prefs.claudeImportOffers,a=e.ui.dialog===`none`,o=e.settings!==null,s=(0,v.useRef)(e.ui.dialog);s.current=e.ui.dialog,(0,v.useEffect)(()=>{n.current||!o||i>=3||!r||!a||(n.current=!0,t.scanClaudeSessions().then(e=>{if(e.sessions.some(e=>!e.alreadyImported&&e.deletedHere!==!0&&!e.unavailable)){if(s.current!==`none`){n.current=!1;return}t.openDialog(`import-claude`),t.savePrefs({claudeImportOffers:i+1})}}).catch(()=>{}))},[t,a,r,i,o])}function fM(){let{state:e,actions:t}=W(),n=(0,v.useRef)(!1),[r,i]=(0,v.useState)(null),a=(typeof window<`u`?window.oonacode:void 0)?.appVersion??e.bundleAppVersion??null,o=e.settings!==null,s=e.prefs.lastSeenReleaseNotes,c=e.sessionListLoaded,l=e.sessionsTotal>0||e.sessions.length>0,u=e.settings?.uiPrefs,d=u!==void 0&&!(`lastSeenReleaseNotes`in u),f=e.ui.dialog===`none`;(0,v.useEffect)(()=>{if(n.current||!o||!a||!f||s===null&&!c||(n.current=!0,d))return;let{record:e,show:r}=xc(a,s,l);e!==null&&t.savePrefs({lastSeenReleaseNotes:e}),r.length!==0&&(i(r),t.openDialog(`whats-new`))},[t,d,f,a,s,c,o,l]);let p=e.ui.dialog===`whats-new`;return(0,v.useEffect)(()=>{!p&&r&&i(null)},[r,p]),r??(a?bc(a,`0`):[])}function pM({onUnauthorized:e}){let{state:t,actions:n}=W(),r=(0,v.useCallback)(()=>n.openDialog(`none`),[n]),i=fM();dM();let a=typeof window<`u`&&window.oonacode?.host===`vscode`,o=t.ui.sidebarOpen&&!a;return uM(),(0,U.jsxs)(`div`,{className:`flex h-full flex-col bg-bg text-fg`,children:[(0,U.jsx)($j,{}),(0,U.jsx)(lM,{onReconnect:e}),(0,U.jsx)(cM,{}),(0,U.jsxs)(`div`,{className:`relative flex min-h-0 flex-1`,children:[(0,U.jsx)(jk,{hidden:a,children:(0,U.jsx)(Dj,{})}),o?(0,U.jsx)(`div`,{className:`absolute inset-0 z-20 bg-black/30 md:hidden`,onClick:()=>n.setSidebar(!1),"aria-hidden":!0}):null,t.prefs.explorerOpen?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`absolute inset-0 z-20 bg-black/30 md:hidden`,onClick:()=>void n.savePrefs({explorerOpen:!1}),"aria-hidden":!0}),(0,U.jsx)(`div`,{className:`absolute inset-y-0 left-0 z-30 flex max-w-[85vw] md:static md:z-auto md:max-w-none`,children:(0,U.jsx)(_A,{})})]}):null,(0,U.jsxs)(`main`,{className:`flex min-w-0 flex-1 flex-col`,children:[(0,U.jsx)(Hj,{}),(0,U.jsx)(tD,{}),t.currentSessionId&&t.files[t.currentSessionId]?.active?(0,U.jsx)(DA,{}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(nO,{}),(0,U.jsx)(ak,{}),(0,U.jsx)(nk,{},t.currentSessionId??`none`)]})]}),t.prefs.sessionPanelOpen?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`absolute inset-0 z-20 bg-black/30 lg:hidden`,onClick:()=>void n.savePrefs({sessionPanelOpen:!1}),"aria-hidden":!0}),(0,U.jsx)(`div`,{className:`absolute inset-y-0 right-0 z-30 flex max-w-[85vw] lg:static lg:z-auto lg:max-w-none`,children:(0,U.jsx)(pA,{})})]}):null]}),(0,U.jsx)(sk,{open:t.ui.dialog===`project`,onClose:r}),(0,U.jsx)(Tk,{open:t.ui.dialog===`projects`,startNew:t.projectsStartNew,selectId:t.projectsSelectId,onClose:r}),(0,U.jsx)(Uk,{open:t.ui.dialog===`assign-project`,onClose:r}),(0,U.jsx)(YA,{open:t.ui.dialog===`settings`,onClose:r}),(0,U.jsx)(wm,{open:t.ui.dialog===`account`,onClose:r}),(0,U.jsx)(ok,{open:t.ui.dialog===`doctor`,onClose:r}),(0,U.jsx)(eD,{open:t.ui.dialog===`session-picker`,onClose:r}),(0,U.jsx)(Zj,{open:t.ui.dialog===`update`,onClose:r}),(0,U.jsx)(aM,{open:t.ui.dialog===`bug-report`,onClose:r}),(0,U.jsx)(xk,{open:t.ui.dialog===`claude-login`,onClose:r}),(0,U.jsx)(Xk,{open:t.ui.dialog===`oauth-login`,onClose:r}),(0,U.jsx)(Zk,{open:t.ui.dialog===`manage-models`,onClose:r}),(0,U.jsx)(aA,{open:t.ui.dialog===`import-claude`,onClose:r}),(0,U.jsx)(Mk,{open:t.ui.dialog===`export-chats`,onClose:r}),(0,U.jsx)(Pk,{open:t.ui.dialog===`conversations`,selectId:t.conversationsSelectId,onClose:r}),(0,U.jsx)(sM,{open:t.ui.dialog===`whats-new`,notes:i,onClose:r}),(0,U.jsx)(Yk,{open:t.ui.connectProviderId!==null,providerId:t.ui.connectProviderId,onClose:()=>n.openProviderConnect(null)}),(0,U.jsx)(ZA,{})]})}function mM({onUnauthorized:e}){let{state:t}=W(),n=t.account?.loggedIn===!0&&!t.account.vaultUnlocked;return(0,v.useEffect)(()=>{window.oonacode?.setVaultLocked?.(n)},[n]),t.accountLoaded?t.account?.loggedIn?!t.account.vaultUnlocked&&Cl(t.account)===null?(0,U.jsx)(cj,{}):(0,U.jsx)(pM,{onUnauthorized:e}):(0,U.jsx)(sj,{}):(0,U.jsx)(rj,{})}function hM({api:e,socket:t,relay:n,initialSessionId:r,onUnauthorized:i,reportError:a}){return(0,U.jsx)(em,{api:e,socket:t,relay:n??null,initialSessionId:r??null,onUnauthorized:i,...a?{reportError:a}:{},children:(0,U.jsx)(mM,{onUnauthorized:i})})}var gM=`oonacode.host.connection`,_M=`session`;function vM(e){let t=e.replace(/^#\/?\??/,``),n=new URLSearchParams(t),r=n.get(`token`),i=n.get(`host`)??n.get(`baseUrl`),a=n.get(_M);n.delete(`token`),n.delete(`host`),n.delete(`baseUrl`);let o=n.toString();return{token:r&&r.trim()?r.trim():null,baseUrl:i,sessionId:a,restHash:o?`#${o}`:``}}function yM(e){if(!e)return null;try{let t=e.getItem(gM);if(!t)return null;let n=JSON.parse(t);if(typeof n.baseUrl==`string`&&typeof n.token==`string`&&n.token)return{baseUrl:Nl(n.baseUrl),token:n.token}}catch{}return null}function bM(e,t){if(e)try{t?e.setItem(gM,JSON.stringify(t)):e.removeItem(gM)}catch{}}async function xM(e){let t=vM(e.location.hash);if(t.token){let n={baseUrl:Nl(t.baseUrl??e.location.origin),token:t.token};bM(e.storage,n);let r=`${e.location.pathname}${e.location.search}${t.restHash}`;try{e.replaceUrl?.(r)}catch{}return{connection:n,source:`hash`,sessionId:t.sessionId}}if(e.bridge&&typeof e.bridge.getConnection==`function`)try{let n=await e.bridge.getConnection();if(n&&typeof n.token==`string`&&n.token&&typeof n.baseUrl==`string`){let r={baseUrl:Nl(n.baseUrl),token:n.token};return bM(e.storage,r),{connection:r,source:`bridge`,sessionId:t.sessionId}}}catch{}let n=yM(e.storage);return n?{connection:n,source:`storage`,sessionId:t.sessionId}:{connection:null,source:`none`,sessionId:t.sessionId}}function SM(e=window){let t=null;try{t=e.sessionStorage}catch{t=null}return xM({location:e.location,storage:t,replaceUrl:t=>e.history.replaceState(null,``,t),bridge:e.oonacode})}var CM=1;function wM(){let e=globalThis.crypto;return e&&typeof e.randomUUID==`function`?e.randomUUID():`c-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function TM(e,t){return`${Nl(e).replace(/^http(s?):/i,`ws$1:`)}${b}?token=${encodeURIComponent(t)}`}var EM=class{clientId;opts;ws=null;_status=`idle`;attempts=0;preOpenFailures=0;epoch=0;reconnectTimer=null;pingTimer=null;manuallyClosed=!1;handlers=new Map;anyHandlers=new Set;statusHandlers=new Set;subscriptions=new Map;promptCounter=0;constructor(e){this.opts={clientKind:`web`,minBackoffMs:500,maxBackoffMs:15e3,pingIntervalMs:25e3,authProbeAfterFailures:2,...e,baseUrl:Nl(e.baseUrl)},this.clientId=e.clientId??wM()}get status(){return this._status}connect(){this.manuallyClosed=!1,!(this.ws&&(this._status===`open`||this._status===`connecting`))&&this.open()}close(){this.manuallyClosed=!0,this.epoch+=1,this.clearTimers();let e=this.ws;if(this.ws=null,e){e.onopen=e.onclose=e.onerror=e.onmessage=null;try{e.close(1e3,`client closed`)}catch{}}this.setStatus(`closed`)}send(e){let t=this.ws;if(!t||t.readyState!==CM)return!1;try{return t.send(JSON.stringify(e)),!0}catch{return!1}}on(e,t){let n=this.handlers.get(e);n||(n=new Set,this.handlers.set(e,n));let r=t;return n.add(r),()=>{n?.delete(r)}}onAny(e){return this.anyHandlers.add(e),()=>{this.anyHandlers.delete(e)}}onStatus(e){return this.statusHandlers.add(e),e(this._status),()=>{this.statusHandlers.delete(e)}}subscribe(e,t){let n=this.subscriptions.get(e),r=t??n;this.subscriptions.set(e,r),this.send(r===void 0?{type:`subscribe`,sessionId:e}:{type:`subscribe`,sessionId:e,afterSeq:r})}unsubscribe(e){this.subscriptions.delete(e),this.send({type:`unsubscribe`,sessionId:e})}noteSeq(e,t){if(t===null||!this.subscriptions.has(e))return;let n=this.subscriptions.get(e);(n===void 0||t>n)&&this.subscriptions.set(e,t)}prompt(e,t,n={}){let r=n.requestId??`req-${this.clientId.slice(0,8)}-${++this.promptCounter}`,i={type:`prompt`,sessionId:e,requestId:r,text:t};if(n.attachments&&n.attachments.length>0&&(i.attachments=n.attachments),n.options&&(i.options=n.options),!this.send(i))throw Error(`not connected`);return r}respondPermission(e,t,n){return this.send({type:`permission_response`,sessionId:e,requestId:t,decision:n})}interrupt(e){return this.send({type:`interrupt`,sessionId:e})}setModel(e,t){return this.send({type:`set_model`,sessionId:e,model:t})}setPermissionMode(e,t){return this.send({type:`set_permission_mode`,sessionId:e,mode:t})}setEffort(e,t){return this.send({type:`set_effort`,sessionId:e,effort:t})}open(){this.clearTimers(),this.epoch+=1,this.setStatus(this.attempts===0?`connecting`:`reconnecting`);let e=TM(this.opts.baseUrl,this.opts.token),t=this.opts.createWebSocket??(e=>new WebSocket(e)),n;try{n=t(e)}catch(e){this.scheduleReconnect(String(e?.message??e));return}this.ws=n;let r=!1;n.onopen=()=>{if(this.ws===n){r=!0,this.attempts=0,this.preOpenFailures=0,this.setStatus(`open`),this.send({type:`hello`,protocolVersion:1,clientKind:this.opts.clientKind,clientId:this.clientId,...this.opts.clientVersion?{clientVersion:this.opts.clientVersion}:{}});for(let[e,t]of this.subscriptions)this.send(t===void 0?{type:`subscribe`,sessionId:e}:{type:`subscribe`,sessionId:e,afterSeq:t});this.opts.pingIntervalMs>0&&(this.pingTimer=setInterval(()=>this.send({type:`ping`,ts:Date.now()}),this.opts.pingIntervalMs))}},n.onmessage=e=>{if(this.ws!==n)return;let t;try{t=typeof e.data==`string`?JSON.parse(e.data):null}catch{return}De(t)&&this.dispatch(t)},n.onerror=()=>{},n.onclose=e=>{if(this.ws!==n)return;if(this.ws=null,this.pingTimer&&=(clearInterval(this.pingTimer),null),this.manuallyClosed){this.setStatus(`closed`);return}if(e.code===4401||e.code===4403||e.code===1008){this.setStatus(`unauthorized`,e.reason||`host rejected the token or origin`);return}let t=e.reason||`closed (${e.code})`;if(this.preOpenFailures=r?0:this.preOpenFailures+1,!r&&this.opts.authProbeAfterFailures>0&&this.preOpenFailures>=this.opts.authProbeAfterFailures){this.probeAuthThenReconnect(t);return}this.scheduleReconnect(t)}}async probeAuthThenReconnect(e){let t=this.epoch;this.setStatus(`reconnecting`,e);let n=this.opts.fetchImpl??((e,t)=>fetch(e,t)),r=!1;try{let e=await n(`${this.opts.baseUrl}${I.health}`,{method:`GET`,headers:{authorization:`Bearer ${this.opts.token}`}});if(e.status===401||e.status===403)r=!0;else if(e.status===200){let t=await e.json().catch(()=>null);r=!(t&&typeof t==`object`&&typeof t.hostId==`string`)}}catch{}if(!(this.manuallyClosed||t!==this.epoch)){if(r){this.setStatus(`unauthorized`,`host rejected the token`);return}this.scheduleReconnect(e)}}dispatch(e){e.type===`agent`&&e.seq!==null&&this.noteSeq(e.sessionId,e.seq);let t=this.handlers.get(e.type);if(t)for(let n of[...t])DM(()=>n(e));for(let t of[...this.anyHandlers])DM(()=>t(e))}scheduleReconnect(e){this.attempts+=1;let t=Math.min(this.opts.maxBackoffMs,this.opts.minBackoffMs*2**Math.min(this.attempts-1,10)),n=Math.round(t*(.7+Math.random()*.6));this.setStatus(`reconnecting`,e);let r=this.opts.setTimeoutImpl??setTimeout;this.reconnectTimer=r(()=>{this.reconnectTimer=null,this.manuallyClosed||this.open()},n)}clearTimers(){this.reconnectTimer&&=((this.opts.clearTimeoutImpl??clearTimeout)(this.reconnectTimer),null),this.pingTimer&&=(clearInterval(this.pingTimer),null)}setStatus(e,t){this._status=e;for(let n of[...this.statusHandlers])DM(()=>n(e,t))}};function DM(e){try{e()}catch(e){console.error(`[HostSocket] handler failed`,e)}}var OM=/([?&#](?:token|access_token|key|api_key|secret|password)=)[^&#\s"']*/gi,kM=/\b(Bearer|Basic)\s+[A-Za-z0-9\-._~+/=]{8,}/g;function AM(e){return e.replace(OM,`$1[redacted]`).replace(kM,`$1 [redacted]`)}function jM(e,t){return e.length<=t?e:`${e.slice(0,t-1)}…`}function MM(e){return typeof e==`object`&&!!e&&typeof e.message==`string`}function NM(e){if(MM(e)){let t=typeof e.name==`string`&&e.name?e.name:`Error`,n=typeof e.stack==`string`&&e.stack?e.stack:null;return{message:e.message||t,stack:n}}return typeof e==`string`?{message:jM(e,512),stack:null}:{message:`Unhandled rejection (${e===null?`null`:Array.isArray(e)?`array`:typeof e})`,stack:null}}function PM(e){return e?e.split(`
|
|
144
|
-
`).find(e=>/^\s+at\s/.test(e))?.trim()??``:``}function FM(e){let t=e.now??(()=>Date.now()),n=e.maxPerMinute??5,r=e.embedded??`browser`,i=[],a=new Map,o=(e,t)=>{for(;i.length>0&&(i[0]??0)<=t-6e4;)i.shift();for(let[e,n]of a)n<=t-6e4&&a.delete(e);return a.has(e)||i.length>=n?!1:(i.push(t),a.set(e,t),!0)},s=async(n,i={})=>{try{let a=e.api.reportError;if(typeof a!=`function`)return!1;let{message:s,stack:c}=NM(n),l=t();if(!o(`${s}\n${PM(c)}`,l))return!1;let u={client:`web-ui`,message:jM(AM(s),Ms),detail:{source:`manual`,...i,embedded:r},at:new Date(l).toISOString()};return c&&(u.stack=jM(AM(c),Ns)),e.appVersion&&(u.appVersion=e.appVersion),e.platform&&(u.platform=e.platform),await a.call(e.api,u),!0}catch{return!1}},c=e=>{if(typeof e?.message!=`string`)return;let t=e.error??null;if(t===null&&!e.message)return;let n={source:`window.onerror`};typeof e.filename==`string`&&e.filename&&(n.filename=e.filename),typeof e.lineno==`number`&&e.lineno>0&&(n.lineno=e.lineno),typeof e.colno==`number`&&e.colno>0&&(n.colno=e.colno),s(t??e.message,n)},l=e=>{s(e?.reason,{source:`unhandledrejection`})};return{install:t=>{if(typeof e.api.reportError!=`function`)return()=>{};let n=e=>c(e),r=e=>l(e);return t.addEventListener(`error`,n),t.addEventListener(`unhandledrejection`,r),()=>{t.removeEventListener(`error`,n),t.removeEventListener(`unhandledrejection`,r)}},report:s,handleErrorEvent:c,handleRejectionEvent:l}}var IM=1;function LM(e,t){return`${Nl(e).replace(/^http(s?):/i,`ws$1:`)}${I.remoteWs}?token=${encodeURIComponent(t)}`}function RM(e){return`tab-${e}-${Math.random().toString(36).slice(2,10)}`}var zM=class{#e;#t=new Map;#n=new Set;#r=null;#i=`idle`;#a=null;#o=0;#s=!1;#c=0;#l=null;constructor(e){this.#e=e}get status(){return this.#i}get pairingCount(){return this.#t.size}onStatus(e){return this.#n.add(e),e(this.#i),()=>{this.#n.delete(e)}}connect(){if(this.#r||this.#i===`connecting`)return;this.#s=!1,this.#d(`connecting`);let e=LM(this.#e.baseUrl,this.#e.token),t=this.#e.createWebSocket??(e=>new WebSocket(e)),n;try{n=t(e)}catch{this.#d(`closed`),this.#u();return}this.#r=n,n.onopen=()=>{if(this.#r===n){this.#o=0,this.#d(`open`),this.#f({type:`remote_hello`,protocolVersion:1,clientId:this.#e.clientId??`web-ui`,...this.#e.clientVersion?{clientVersion:this.#e.clientVersion}:{}});for(let e of this.#t.values())this.#p(e)}},n.onmessage=e=>{this.#r===n&&this.#h(e.data)},n.onerror=()=>void 0,n.onclose=()=>{if(this.#r===n){this.#r=null;for(let e of this.#t.values())this.#m(e,{state:`host_offline`,online:!1,detail:`reconnecting to this PC…`});this.#i!==`unavailable`&&this.#d(`closed`),this.#u()}}}close(){this.#s=!0,this.#l=null,this.#a&&(this.#e.clearTimeoutImpl??clearTimeout)(this.#a),this.#a=null,this.#t.clear();let e=this.#r;if(this.#r=null,e){e.onopen=e.onclose=e.onerror=e.onmessage=null;try{e.close(1e3,`closed`)}catch{}}this.#d(`idle`)}#u(){let e=this.#e.reconnectDelayMs??1e3;if(this.#s||e<=0||this.#a||this.#t.size===0)return;let t=this.#e.maxReconnectDelayMs??2e4;this.#o+=1;let n=Math.min(e*2**Math.min(this.#o-1,5),t),r=this.#e.setTimeoutImpl??setTimeout;this.#a=r(()=>{this.#a=null,this.#s||this.connect()},n)}#d(e,t){if(this.#i!==e){this.#i=e;for(let n of[...this.#n])n(e,t)}}#f(e){let t=this.#r;if(!t||t.readyState!==IM)return!1;try{return t.send(JSON.stringify(e)),!0}catch{return!1}}attach(e){this.#c+=1;let t=RM(this.#c),n={pairingId:t,hostId:e.hostId,sessionId:e.sessionId,state:`unavailable`,online:!1,detail:null,onFrame:e.onFrame,onState:e.onState};return this.#t.set(t,n),this.#r&&this.#r.readyState===IM?(this.#l!==null&&this.#m(n,{detail:this.#l}),this.#p(n)):this.connect(),{pairingId:t,hostId:e.hostId,sessionId:e.sessionId,send:e=>this.send(t,e),detach:()=>this.detach(t)}}detach(e){this.#t.get(e)&&(this.#t.delete(e),this.#f({type:`remote_detach`,pairingId:e}),this.#t.size===0&&this.close())}send(e,t){let n=this.#t.get(e);return!n||!n.online?!1:this.#f({type:`remote_send`,pairingId:e,frame:t})}#p(e){this.#f({type:`remote_attach`,pairingId:e.pairingId,hostId:e.hostId,sessionId:e.sessionId})}#m(e,t){Object.assign(e,t),e.onState({pairingId:e.pairingId,hostId:e.hostId,sessionId:e.sessionId,state:e.state,online:e.online,detail:e.detail})}#h(e){let t;try{let n=JSON.parse(typeof e==`string`?e:String(e));if(!ke(n))return;t=n}catch{return}switch(t.type){case`remote_welcome`:if(!t.canRelay){let e=t.reason??`this PC cannot reach your other devices right now`;this.#l=e,this.#d(`unavailable`,e);for(let t of this.#t.values())this.#m(t,{state:`unavailable`,online:!1,detail:e});return}this.#l=null,this.#i===`unavailable`&&this.#d(`open`);for(let e of this.#t.values())e.online||this.#p(e);return;case`remote_status`:{let e=this.#t.get(t.pairingId);if(!e)return;this.#m(e,{state:t.state,online:Ae(t.state),detail:t.detail??null});return}case`remote_frame`:this.#t.get(t.pairingId)?.onFrame(t.frame);return;case`remote_error`:{let e=t.pairingId?this.#t.get(t.pairingId):void 0;e&&this.#m(e,{state:`error`,online:!1,detail:t.message});return}default:return}}};function BM({defaultBaseUrl:e,error:t,onConnect:n}){let[r,i]=(0,v.useState)(e),[a,o]=(0,v.useState)(``),s=r.trim().length>0&&a.trim().length>0;return(0,U.jsx)(`div`,{className:`flex min-h-full items-center justify-center bg-bg p-4`,children:(0,U.jsxs)(`form`,{className:`w-full max-w-md space-y-4 rounded-xl border border-border bg-surface p-6 shadow-md`,onSubmit:e=>{e.preventDefault(),s&&n({baseUrl:r.trim(),token:a.trim()})},children:[(0,U.jsxs)(`div`,{children:[(0,U.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Connect to your OonaCode host`}),(0,U.jsxs)(`p`,{className:`mt-1 text-sm text-fg-muted`,children:[`This page needs the host's access token. It is normally passed automatically when you open the UI from the desktop app or run`,` `,(0,U.jsx)(`code`,{className:`rounded bg-surface-2 px-1 font-mono`,children:`oona web`}),`.`]})]}),t?(0,U.jsx)(`div`,{className:`rounded-md border border-danger/40 bg-danger-soft px-3 py-2 text-sm text-danger`,role:`alert`,children:t}):null,(0,U.jsx)(cm,{label:`Host URL`,children:(0,U.jsx)(`input`,{className:Y,value:r,onChange:e=>i(e.target.value),placeholder:`http://127.0.0.1:41317`,spellCheck:!1,autoComplete:`url`})}),(0,U.jsx)(cm,{label:`Host token`,hint:'Found in host/host.json ("token") in the OonaCode folder of the PC running the host — %LOCALAPPDATA%\\OonaCode on Windows, ~/.oonacode on Linux — printed by `oona serve --show-token`, or embedded in the URL printed by `oona web --print`.',children:(0,U.jsx)(`input`,{className:Y,type:`password`,value:a,onChange:e=>o(e.target.value),autoComplete:`off`,spellCheck:!1,autoFocus:!0})}),(0,U.jsx)(q,{type:`submit`,variant:`primary`,className:`w-full justify-center`,disabled:!s,children:`Connect`})]})})}function VM(e){return!!e&&typeof e==`object`&&typeof e.hostId==`string`}function HM(e){return Math.min(5e3,500*2**Math.max(0,e))}async function UM(e){let t=e.sleep??(e=>new Promise(t=>setTimeout(t,e)));for(let n=0;;n++){if(e.cancelled?.())return null;try{let t=await e.getConnection();if(t&&typeof t.token==`string`&&t.token&&typeof t.baseUrl==`string`&&await e.accepts(t).catch(()=>!1))return t}catch{}await t(HM(n))}}function WM(){let[e,t]=(0,v.useState)(void 0),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(0),c=(0,v.useRef)(!1),l=(0,v.useRef)(!1);(0,v.useEffect)(()=>()=>{l.current=!0},[]);let u=(0,v.useCallback)(()=>{let e=window.oonacode;return!e||typeof e.getConnection!=`function`?!1:c.current?!0:(c.current=!0,UM({getConnection:()=>e.getConnection(),accepts:e=>Pl(e).health().then(e=>VM(e),()=>!1),cancelled:()=>l.current}).then(e=>{c.current=!1,e&&(bM(window.sessionStorage,e),s(e=>e+1),t({baseUrl:e.baseUrl,token:e.token}))}),!0)},[]);(0,v.useEffect)(()=>{SM().then(e=>{r(e.sessionId),!(!e.connection&&u())&&t(e.connection)})},[u]),(0,v.useEffect)(()=>{e!==void 0&&document.getElementById(`oona-splash`)?.remove()},[e]);let d=(0,v.useCallback)(()=>{bM(window.sessionStorage,null),!u()&&(a(`The host rejected the token. Paste a current one from the host.`),t(null))},[u]),f=(0,v.useMemo)(()=>e?{api:Pl(e),socket:new EM({baseUrl:e.baseUrl,token:e.token,clientKind:window.oonacode?`desktop`:`web`,clientVersion:window.oonacode?.appVersion}),relay:new zM({baseUrl:e.baseUrl,token:e.token,clientId:window.oonacode?`desktop`:`web-ui`,...window.oonacode?.appVersion?{clientVersion:window.oonacode.appVersion}:{}})}:null,[e]),p=(0,v.useMemo)(()=>f?FM({api:f.api,appVersion:window.oonacode?.appVersion??null,platform:window.oonacode?.platform??null,embedded:window.oonacode?`desktop`:`browser`}):null,[f]);return(0,v.useEffect)(()=>p?.install(window),[p]),e===void 0?null:!e||!f?(0,U.jsx)(BM,{defaultBaseUrl:window.location.origin,error:i,onConnect:e=>{bM(window.sessionStorage,e),a(null),t(e)}}):(0,U.jsx)(hM,{api:f.api,socket:f.socket,relay:f.relay,initialSessionId:n,onUnauthorized:d,...p?{reportError:p.report}:{}},o)}var GM=document.getElementById(`root`);(0,y.createRoot)(GM).render((0,U.jsx)(v.StrictMode,{children:(0,U.jsx)(WM,{})}));
|
|
144
|
+
`).find(e=>/^\s+at\s/.test(e))?.trim()??``:``}function FM(e){let t=e.now??(()=>Date.now()),n=e.maxPerMinute??5,r=e.embedded??`browser`,i=[],a=new Map,o=(e,t)=>{for(;i.length>0&&(i[0]??0)<=t-6e4;)i.shift();for(let[e,n]of a)n<=t-6e4&&a.delete(e);return a.has(e)||i.length>=n?!1:(i.push(t),a.set(e,t),!0)},s=async(n,i={})=>{try{let a=e.api.reportError;if(typeof a!=`function`)return!1;let{message:s,stack:c}=NM(n),l=t();if(!o(`${s}\n${PM(c)}`,l))return!1;let u={client:`web-ui`,message:jM(AM(s),Ms),detail:{source:`manual`,...i,embedded:r},at:new Date(l).toISOString()};return c&&(u.stack=jM(AM(c),Ns)),e.appVersion&&(u.appVersion=e.appVersion),e.platform&&(u.platform=e.platform),await a.call(e.api,u),!0}catch{return!1}},c=e=>{if(typeof e?.message!=`string`)return;let t=e.error??null;if(t===null&&!e.message)return;let n={source:`window.onerror`};typeof e.filename==`string`&&e.filename&&(n.filename=e.filename),typeof e.lineno==`number`&&e.lineno>0&&(n.lineno=e.lineno),typeof e.colno==`number`&&e.colno>0&&(n.colno=e.colno),s(t??e.message,n)},l=e=>{s(e?.reason,{source:`unhandledrejection`})};return{install:t=>{if(typeof e.api.reportError!=`function`)return()=>{};let n=e=>c(e),r=e=>l(e);return t.addEventListener(`error`,n),t.addEventListener(`unhandledrejection`,r),()=>{t.removeEventListener(`error`,n),t.removeEventListener(`unhandledrejection`,r)}},report:s,handleErrorEvent:c,handleRejectionEvent:l}}var IM=1;function LM(e,t){return`${Nl(e).replace(/^http(s?):/i,`ws$1:`)}${I.remoteWs}?token=${encodeURIComponent(t)}`}function RM(e){return`tab-${e}-${Math.random().toString(36).slice(2,10)}`}var zM=class{#e;#t=new Map;#n=new Set;#r=null;#i=`idle`;#a=null;#o=0;#s=!1;#c=0;#l=null;constructor(e){this.#e=e}get status(){return this.#i}get pairingCount(){return this.#t.size}onStatus(e){return this.#n.add(e),e(this.#i),()=>{this.#n.delete(e)}}connect(){if(this.#r||this.#i===`connecting`)return;this.#s=!1,this.#d(`connecting`);let e=LM(this.#e.baseUrl,this.#e.token),t=this.#e.createWebSocket??(e=>new WebSocket(e)),n;try{n=t(e)}catch{this.#d(`closed`),this.#u();return}this.#r=n,n.onopen=()=>{if(this.#r===n){this.#o=0,this.#d(`open`),this.#f({type:`remote_hello`,protocolVersion:1,clientId:this.#e.clientId??`web-ui`,...this.#e.clientVersion?{clientVersion:this.#e.clientVersion}:{}});for(let e of this.#t.values())this.#p(e)}},n.onmessage=e=>{this.#r===n&&this.#h(e.data)},n.onerror=()=>void 0,n.onclose=()=>{if(this.#r===n){this.#r=null;for(let e of this.#t.values())this.#m(e,{state:`host_offline`,online:!1,detail:`reconnecting to this PC…`});this.#i!==`unavailable`&&this.#d(`closed`),this.#u()}}}close(){this.#s=!0,this.#l=null,this.#a&&(this.#e.clearTimeoutImpl??clearTimeout)(this.#a),this.#a=null,this.#t.clear();let e=this.#r;if(this.#r=null,e){e.onopen=e.onclose=e.onerror=e.onmessage=null;try{e.close(1e3,`closed`)}catch{}}this.#d(`idle`)}#u(){let e=this.#e.reconnectDelayMs??1e3;if(this.#s||e<=0||this.#a||this.#t.size===0)return;let t=this.#e.maxReconnectDelayMs??2e4;this.#o+=1;let n=Math.min(e*2**Math.min(this.#o-1,5),t),r=this.#e.setTimeoutImpl??setTimeout;this.#a=r(()=>{this.#a=null,this.#s||this.connect()},n)}#d(e,t){if(this.#i!==e){this.#i=e;for(let n of[...this.#n])n(e,t)}}#f(e){let t=this.#r;if(!t||t.readyState!==IM)return!1;try{return t.send(JSON.stringify(e)),!0}catch{return!1}}attach(e){this.#c+=1;let t=RM(this.#c),n={pairingId:t,hostId:e.hostId,sessionId:e.sessionId,state:`unavailable`,online:!1,detail:null,onFrame:e.onFrame,onState:e.onState};return this.#t.set(t,n),this.#r&&this.#r.readyState===IM?(this.#l!==null&&this.#m(n,{detail:this.#l}),this.#p(n)):this.connect(),{pairingId:t,hostId:e.hostId,sessionId:e.sessionId,send:e=>this.send(t,e),detach:()=>this.detach(t)}}detach(e){this.#t.get(e)&&(this.#t.delete(e),this.#f({type:`remote_detach`,pairingId:e}),this.#t.size===0&&this.close())}send(e,t){let n=this.#t.get(e);return!n||!n.online?!1:this.#f({type:`remote_send`,pairingId:e,frame:t})}#p(e){this.#f({type:`remote_attach`,pairingId:e.pairingId,hostId:e.hostId,sessionId:e.sessionId})}#m(e,t){Object.assign(e,t),e.onState({pairingId:e.pairingId,hostId:e.hostId,sessionId:e.sessionId,state:e.state,online:e.online,detail:e.detail})}#h(e){let t;try{let n=JSON.parse(typeof e==`string`?e:String(e));if(!ke(n))return;t=n}catch{return}switch(t.type){case`remote_welcome`:if(!t.canRelay){let e=t.reason??`this PC cannot reach your other devices right now`;this.#l=e,this.#d(`unavailable`,e);for(let t of this.#t.values())this.#m(t,{state:`unavailable`,online:!1,detail:e});return}this.#l=null,this.#i===`unavailable`&&this.#d(`open`);for(let e of this.#t.values())e.online||this.#p(e);return;case`remote_status`:{let e=this.#t.get(t.pairingId);if(!e)return;this.#m(e,{state:t.state,online:Ae(t.state),detail:t.detail??null});return}case`remote_frame`:this.#t.get(t.pairingId)?.onFrame(t.frame);return;case`remote_error`:{let e=t.pairingId?this.#t.get(t.pairingId):void 0;e&&this.#m(e,{state:`error`,online:!1,detail:t.message});return}default:return}}};function BM({defaultBaseUrl:e,error:t,onConnect:n}){let[r,i]=(0,v.useState)(e),[a,o]=(0,v.useState)(``),s=r.trim().length>0&&a.trim().length>0;return(0,U.jsx)(`div`,{className:`flex min-h-full items-center justify-center bg-bg p-4`,children:(0,U.jsxs)(`form`,{className:`w-full max-w-md space-y-4 rounded-xl border border-border bg-surface p-6 shadow-md`,onSubmit:e=>{e.preventDefault(),s&&n({baseUrl:r.trim(),token:a.trim()})},children:[(0,U.jsxs)(`div`,{children:[(0,U.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Connect to your OonaCode host`}),(0,U.jsxs)(`p`,{className:`mt-1 text-sm text-fg-muted`,children:[`This page needs the host's access token. It is normally passed automatically when you open the UI from the desktop app or run`,` `,(0,U.jsx)(`code`,{className:`rounded bg-surface-2 px-1 font-mono`,children:`oona web`}),`.`]})]}),t?(0,U.jsx)(`div`,{className:`rounded-md border border-danger/40 bg-danger-soft px-3 py-2 text-sm text-danger`,role:`alert`,children:t}):null,(0,U.jsx)(cm,{label:`Host URL`,children:(0,U.jsx)(`input`,{className:Y,value:r,onChange:e=>i(e.target.value),placeholder:`http://127.0.0.1:41317`,spellCheck:!1,autoComplete:`url`})}),(0,U.jsx)(cm,{label:`Host token`,hint:'Found in host/host.json ("token") in the OonaCode folder of the PC running the host — %LOCALAPPDATA%\\OonaCode on Windows, ~/.oonacode on Linux — printed by `oona serve --show-token`, or embedded in the URL printed by `oona web --print`.',children:(0,U.jsx)(`input`,{className:Y,type:`password`,value:a,onChange:e=>o(e.target.value),autoComplete:`off`,spellCheck:!1,autoFocus:!0})}),(0,U.jsx)(q,{type:`submit`,variant:`primary`,className:`w-full justify-center`,disabled:!s,children:`Connect`})]})})}function VM(e){return!!e&&e.platform===`linux`&&e.host!==`vscode`&&!!e.onMenuModel}var HM=e=>!!e&&e.type!==`separator`&&e.enabled;function UM(e,t,n){let r=e.length;for(let i=1;i<=r;i+=1){let a=((t+n*i)%r+r)%r;if(HM(e[a]))return a}return-1}function WM({label:e,mnemonic:t,show:n}){let r=n&&t?e.toLowerCase().indexOf(t):-1;return r<0?e:(0,U.jsxs)(U.Fragment,{children:[e.slice(0,r),(0,U.jsx)(`span`,{className:`underline underline-offset-2`,children:e[r]}),e.slice(r+1)]})}function GM({bridge:e}){let[t,n]=(0,v.useState)(null),[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(-1),[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)(!1),d=(0,v.useRef)(null);(0,v.useEffect)(()=>e.onMenuModel?.(e=>{n(e),i(null),o(-1),c(null)}),[e]);let f=t?.items??[],p=(0,v.useCallback)(e=>e===null?[]:f[e]?.submenu??[],[f]),m=(0,v.useCallback)(()=>{i(null),o(-1),c(null)},[]),h=(0,v.useCallback)((e,t)=>{i(e);let n=p(e);o(t?UM(n,-1,1):-1),t&&c(e)},[p]),g=(0,v.useCallback)(t=>{!t||!HM(t)||t.type===`submenu`||(m(),e.invokeMenuItem?.(t.id))},[e,m]);if((0,v.useEffect)(()=>{if(f.length===0)return;let e=!1,t=()=>r!==null||s!==null,n=e=>{e.preventDefault(),e.stopPropagation()},l=l=>{if(l.key===`Alt`){e=!l.repeat,u(!0);return}e=!1;let d=!l.ctrlKey&&!l.metaKey&&!l.shiftKey;if(!t()){if(l.key===`F10`&&d&&!l.altKey){n(l),c(0);return}if(l.altKey&&d&&l.key.length===1){let e=f.findIndex(e=>e.mnemonic===l.key.toLowerCase());e>=0&&(n(l),h(e,!0))}return}let _=p(r),v=s??r??0,y=e=>{let t=(v+e+f.length)%f.length;r===null?c(t):h(t,!0)};switch(l.key){case`Escape`:n(l),r!==null&&s!==null?(i(null),o(-1)):m();return;case`ArrowLeft`:n(l),y(-1);return;case`ArrowRight`:n(l),y(1);return;case`ArrowDown`:n(l),r===null?h(v,!0):o(UM(_,a,1));return;case`ArrowUp`:n(l),r===null?(h(v,!0),o(UM(p(v),0,-1))):o(UM(_,a<0?0:a,-1));return;case`Home`:n(l),r!==null&&o(UM(_,-1,1));return;case`End`:n(l),r!==null&&o(UM(_,0,-1));return;case`Enter`:case` `:n(l),r===null?h(v,!0):g(_[a]);return;case`Tab`:m();return}if(l.key.length===1&&!l.ctrlKey&&!l.metaKey){n(l);let e=l.key.toLowerCase();if(r!==null)g(_.find(t=>t.mnemonic===e&&HM(t)));else{let t=f.findIndex(t=>t.mnemonic===e);t>=0&&h(t,!0)}return}m()},_=n=>{n.key===`Alt`&&(u(!1),e&&(e=!1,t()?m():c(0)))},v=()=>{e=!1,u(!1),m()},y=e=>{(r!==null||s!==null)&&(d.current&&e.target instanceof Node&&d.current.contains(e.target)||m())};return window.addEventListener(`keydown`,l,!0),window.addEventListener(`keyup`,_,!0),window.addEventListener(`blur`,v),document.addEventListener(`mousedown`,y,!0),()=>{window.removeEventListener(`keydown`,l,!0),window.removeEventListener(`keyup`,_,!0),window.removeEventListener(`blur`,v),document.removeEventListener(`mousedown`,y,!0)}},[f,r,s,a,p,h,g,m]),!t||f.length===0)return null;let _=l||s!==null;return(0,U.jsx)(`div`,{ref:d,role:`menubar`,"aria-label":`Application menu`,className:`flex h-7 shrink-0 items-stretch gap-px border-b border-border bg-surface px-1 text-[13px] text-fg select-none`,children:f.map((e,t)=>{let n=r===t;return(0,U.jsxs)(`div`,{className:`relative flex`,children:[(0,U.jsx)(`button`,{type:`button`,role:`menuitem`,"aria-haspopup":`menu`,"aria-expanded":n,tabIndex:-1,disabled:!e.enabled,"data-menu-top":e.id,onMouseDown:e=>{e.preventDefault(),n?m():h(t,!1)},onMouseEnter:()=>{r!==null&&r!==t&&h(t,!1)},className:H(`my-0.5 rounded-sm px-2.5`,n||s===t?`bg-surface-3`:`hover:bg-surface-2`,!e.enabled&&`text-fg-faint`),children:(0,U.jsx)(WM,{label:e.label,mnemonic:e.mnemonic,show:_})}),n&&e.submenu?(0,U.jsx)(KM,{entries:e.submenu,active:a,showMnemonics:_,onHover:o,onRun:g}):null]},e.id)})})}function KM({entries:e,active:t,showMnemonics:n,onHover:r,onRun:i,nested:a=!1}){let[o,s]=(0,v.useState)(null);return(0,U.jsx)(`div`,{role:`menu`,className:H(`absolute z-[70] min-w-[15rem] rounded-md border border-border bg-surface py-1 text-fg shadow-lg`,a?`top-0 left-full -mt-1 ml-px`:`top-full left-0 mt-px`),children:e.map((e,a)=>{if(e.type===`separator`)return(0,U.jsx)(`div`,{role:`separator`,className:`my-1 border-t border-border`},e.id);let c=e.type===`checkbox`?`menuitemcheckbox`:e.type===`radio`?`menuitemradio`:`menuitem`,l=e.type===`checkbox`||e.type===`radio`;return(0,U.jsxs)(`div`,{role:c,"aria-disabled":!e.enabled||void 0,"aria-checked":l?e.checked:void 0,"aria-haspopup":e.type===`submenu`?`menu`:void 0,"data-menu-entry":e.id,onMouseDown:e=>e.preventDefault(),onMouseEnter:()=>{r(a),s(e.type===`submenu`?a:null)},onClick:()=>i(e),className:H(`relative flex cursor-default items-center gap-2 px-3 py-1`,a===t&&e.enabled&&`bg-surface-2`,!e.enabled&&`text-fg-faint`),children:[(0,U.jsx)(`span`,{className:`w-4 shrink-0 text-center`,"aria-hidden":!0,children:l&&e.checked?e.type===`radio`?`•`:`✓`:``}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:(0,U.jsx)(WM,{label:e.label,mnemonic:e.mnemonic,show:n})}),e.accelerator?(0,U.jsx)(`span`,{className:`shrink-0 pl-6 text-xs text-fg-faint`,children:e.accelerator}):null,e.type===`submenu`?(0,U.jsx)(`span`,{className:`shrink-0 pl-4 text-fg-faint`,"aria-hidden":!0,children:`›`}):null,e.type===`submenu`&&o===a&&e.submenu?(0,U.jsx)(KM,{entries:e.submenu,active:-1,showMnemonics:n,onHover:()=>{},onRun:i,nested:!0}):null]},e.id)})})}function qM(e){return!!e&&typeof e==`object`&&typeof e.hostId==`string`}function JM(e){return Math.min(5e3,500*2**Math.max(0,e))}async function YM(e){let t=e.sleep??(e=>new Promise(t=>setTimeout(t,e)));for(let n=0;;n++){if(e.cancelled?.())return null;try{let t=await e.getConnection();if(t&&typeof t.token==`string`&&t.token&&typeof t.baseUrl==`string`&&await e.accepts(t).catch(()=>!1))return t}catch{}await t(JM(n))}}function XM(){let[e,t]=(0,v.useState)(void 0),[n,r]=(0,v.useState)(null),[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)(0),c=(0,v.useRef)(!1),l=(0,v.useRef)(!1);(0,v.useEffect)(()=>()=>{l.current=!0},[]);let u=(0,v.useCallback)(()=>{let e=window.oonacode;return!e||typeof e.getConnection!=`function`?!1:c.current?!0:(c.current=!0,YM({getConnection:()=>e.getConnection(),accepts:e=>Pl(e).health().then(e=>qM(e),()=>!1),cancelled:()=>l.current}).then(e=>{c.current=!1,e&&(bM(window.sessionStorage,e),s(e=>e+1),t({baseUrl:e.baseUrl,token:e.token}))}),!0)},[]);(0,v.useEffect)(()=>{SM().then(e=>{r(e.sessionId),!(!e.connection&&u())&&t(e.connection)})},[u]),(0,v.useEffect)(()=>{e!==void 0&&document.getElementById(`oona-splash`)?.remove()},[e]);let d=(0,v.useCallback)(()=>{bM(window.sessionStorage,null),!u()&&(a(`The host rejected the token. Paste a current one from the host.`),t(null))},[u]),f=(0,v.useMemo)(()=>e?{api:Pl(e),socket:new EM({baseUrl:e.baseUrl,token:e.token,clientKind:window.oonacode?`desktop`:`web`,clientVersion:window.oonacode?.appVersion}),relay:new zM({baseUrl:e.baseUrl,token:e.token,clientId:window.oonacode?`desktop`:`web-ui`,...window.oonacode?.appVersion?{clientVersion:window.oonacode.appVersion}:{}})}:null,[e]),p=(0,v.useMemo)(()=>f?FM({api:f.api,appVersion:window.oonacode?.appVersion??null,platform:window.oonacode?.platform??null,embedded:window.oonacode?`desktop`:`browser`}):null,[f]);return(0,v.useEffect)(()=>p?.install(window),[p]),e===void 0?null:!e||!f?(0,U.jsx)(BM,{defaultBaseUrl:window.location.origin,error:i,onConnect:e=>{bM(window.sessionStorage,e),a(null),t(e)}}):(0,U.jsx)(hM,{api:f.api,socket:f.socket,relay:f.relay,initialSessionId:n,onUnauthorized:d,...p?{reportError:p.report}:{}},o)}function ZM({children:e}){let t=typeof window>`u`?void 0:window.oonacode;return VM(t)?(0,U.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,U.jsx)(GM,{bridge:t}),(0,U.jsx)(`div`,{className:`min-h-0 flex-1`,children:e})]}):(0,U.jsx)(U.Fragment,{children:e})}var QM=document.getElementById(`root`);(0,y.createRoot)(QM).render((0,U.jsx)(v.StrictMode,{children:(0,U.jsx)(ZM,{children:(0,U.jsx)(XM,{})})}));
|
package/web-ui/index.html
CHANGED
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
</style>
|
|
107
|
-
<script type="module" crossorigin src="./assets/index-
|
|
108
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
107
|
+
<script type="module" crossorigin src="./assets/index-WE0Xeg3k.js"></script>
|
|
108
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DqQH7iib.css">
|
|
109
109
|
</head>
|
|
110
110
|
<body>
|
|
111
111
|
<div id="root"></div>
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}::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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-mono:ui-monospace, "Cascadia Code", "Cascadia Mono", Consolas, "JetBrains Mono", Menlo, monospace;--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear 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:ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--default-mono-font-family:ui-monospace, "Cascadia Code", "Cascadia Mono", Consolas, "JetBrains Mono", Menlo, monospace}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){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}button,input,select,textarea{font:inherit;color:inherit}select option{background-color:var(--surface);color:var(--fg)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-1{inset:var(--spacing)}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.-top-0\.5{top:calc(var(--spacing) * -.5)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-2{top:calc(var(--spacing) * 2)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.-right-1{right:calc(var(--spacing) * -1)}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.right-full{right:100%}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-full{bottom:100%}.left-0{left:0}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-\[1\.15rem\]{left:1.15rem}.left-full{left:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.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{margin:0}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.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)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!hidden{display:none!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.h-1{height:var(--spacing)}.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-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-28{height:calc(var(--spacing) * 28)}.h-40{height:calc(var(--spacing) * 40)}.h-full{height:100%}.h-px{height:1px}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[19rem\]{max-height:19rem}.max-h-\[20rem\]{max-height:20rem}.max-h-\[22rem\]{max-height:22rem}.max-h-\[24rem\]{max-height:24rem}.max-h-\[26rem\]{max-height:26rem}.max-h-\[45vh\]{max-height:45vh}.max-h-\[65vh\]{max-height:65vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[95vh\]{max-height:95vh}.max-h-\[200px\]{max-height:200px}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-\[2\.25rem\]{min-height:2.25rem}.min-h-\[20rem\]{min-height:20rem}.min-h-\[22rem\]{min-height:22rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.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-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[19rem\]{width:19rem}.w-\[22rem\]{width:22rem}.w-\[24rem\]{width:24rem}.w-\[26rem\]{width:26rem}.w-\[30rem\]{width:30rem}.w-\[460px\]{width:460px}.w-auto{width:auto}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\[12rem\]{max-width:12rem}.max-w-\[14rem\]{max-width:14rem}.max-w-\[15rem\]{max-width:15rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[22rem\]{max-width:22rem}.max-w-\[85\%\]{max-width:85%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[90vw\]{max-width:90vw}.max-w-\[220px\]{max-width:220px}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-\[calc\(100vw-16px\)\]{max-width:calc(100vw - 16px)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-\[6rem\]{min-width:6rem}.min-w-\[7rem\]{min-width:7rem}.min-w-\[9rem\]{min-width:9rem}.min-w-\[190px\]{min-width:190px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.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-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.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}.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-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}: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(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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.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-border>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.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)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-br-md{border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.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-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent,.border-accent\/20{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/20{border-color:color-mix(in oklab, var(--accent) 20%, transparent)}}.border-accent\/40{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/40{border-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.border-accent\/50{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/50{border-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.border-border{border-color:var(--border)}.border-danger-soft{border-color:var(--danger-soft)}.border-danger\/40{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/40{border-color:color-mix(in oklab, var(--danger) 40%, transparent)}}.border-danger\/50{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/50{border-color:color-mix(in oklab, var(--danger) 50%, transparent)}}.border-fg-faint{border-color:var(--fg-faint)}.border-ok\/40{border-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.border-ok\/40{border-color:color-mix(in oklab, var(--ok) 40%, transparent)}}.border-ok\/50{border-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.border-ok\/50{border-color:color-mix(in oklab, var(--ok) 50%, transparent)}}.border-project\/70{border-color:var(--project)}@supports (color:color-mix(in lab, red, red)){.border-project\/70{border-color:color-mix(in oklab, var(--project) 70%, transparent)}}.border-think\/20{border-color:var(--think)}@supports (color:color-mix(in lab, red, red)){.border-think\/20{border-color:color-mix(in oklab, var(--think) 20%, transparent)}}.border-think\/30{border-color:var(--think)}@supports (color:color-mix(in lab, red, red)){.border-think\/30{border-color:color-mix(in oklab, var(--think) 30%, transparent)}}.border-think\/40{border-color:var(--think)}@supports (color:color-mix(in lab, red, red)){.border-think\/40{border-color:color-mix(in oklab, var(--think) 40%, transparent)}}.border-transparent{border-color:#0000}.border-warn,.border-warn\/40{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/40{border-color:color-mix(in oklab, var(--warn) 40%, transparent)}}.border-warn\/50{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/50{border-color:color-mix(in oklab, var(--warn) 50%, transparent)}}.border-warn\/60{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/60{border-color:color-mix(in oklab, var(--warn) 60%, transparent)}}.bg-accent{background-color:var(--accent)}.bg-accent-soft,.bg-accent-soft\/20{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/20{background-color:color-mix(in oklab, var(--accent-soft) 20%, transparent)}}.bg-accent-soft\/40{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/40{background-color:color-mix(in oklab, var(--accent-soft) 40%, transparent)}}.bg-accent-soft\/60{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/60{background-color:color-mix(in oklab, var(--accent-soft) 60%, transparent)}}.bg-accent-soft\/70{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/70{background-color:color-mix(in oklab, var(--accent-soft) 70%, transparent)}}.bg-accent\/10{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/10{background-color:color-mix(in oklab, var(--accent) 10%, transparent)}}.bg-accent\/15{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/15{background-color:color-mix(in oklab, var(--accent) 15%, transparent)}}.bg-bg{background-color:var(--bg)}.bg-black{background-color:var(--color-black)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.bg-black\/70{background-color:color-mix(in oklab, var(--color-black) 70%, transparent)}}.bg-border{background-color:var(--border)}.bg-code-bg{background-color:var(--code-bg)}.bg-danger{background-color:var(--danger)}.bg-danger-soft{background-color:var(--danger-soft)}.bg-danger\/10{background-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.bg-danger\/10{background-color:color-mix(in oklab, var(--danger) 10%, transparent)}}.bg-fg-faint{background-color:var(--fg-faint)}.bg-fg\/5{background-color:var(--fg)}@supports (color:color-mix(in lab, red, red)){.bg-fg\/5{background-color:color-mix(in oklab, var(--fg) 5%, transparent)}}.bg-fg\/10{background-color:var(--fg)}@supports (color:color-mix(in lab, red, red)){.bg-fg\/10{background-color:color-mix(in oklab, var(--fg) 10%, transparent)}}.bg-inverse-bg{background-color:var(--inverse-bg)}.bg-ok{background-color:var(--ok)}.bg-ok-soft{background-color:var(--ok-soft)}.bg-ok\/15{background-color:var(--ok)}@supports (color:color-mix(in lab, red, red)){.bg-ok\/15{background-color:color-mix(in oklab, var(--ok) 15%, transparent)}}.bg-surface{background-color:var(--surface)}.bg-surface-2,.bg-surface-2\/40{background-color:var(--surface-2)}@supports (color:color-mix(in lab, red, red)){.bg-surface-2\/40{background-color:color-mix(in oklab, var(--surface-2) 40%, transparent)}}.bg-surface-3{background-color:var(--surface-3)}.bg-surface\/90{background-color:var(--surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/90{background-color:color-mix(in oklab, var(--surface) 90%, transparent)}}.bg-think-soft,.bg-think-soft\/40{background-color:var(--think-soft)}@supports (color:color-mix(in lab, red, red)){.bg-think-soft\/40{background-color:color-mix(in oklab, var(--think-soft) 40%, transparent)}}.bg-transparent{background-color:#0000}.bg-user-bubble{background-color:var(--user-bubble)}.bg-warn{background-color:var(--warn)}.bg-warn-soft,.bg-warn-soft\/40{background-color:var(--warn-soft)}@supports (color:color-mix(in lab, red, red)){.bg-warn-soft\/40{background-color:color-mix(in oklab, var(--warn-soft) 40%, transparent)}}.\[mask-image\:linear-gradient\(to_bottom\,black_60\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 60%,#0000);mask-image:linear-gradient(#000 60%,#0000)}.stroke-accent{stroke:var(--accent)}.stroke-border{stroke:var(--border)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0{padding-block:0}.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-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-1{padding-left:var(--spacing)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-7{padding-left:calc(var(--spacing) * 7)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-baseline{vertical-align:baseline}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,Cascadia Code,Cascadia Mono,Consolas,JetBrains Mono,Menlo,monospace}.font-sans{font-family:ui-sans-serif,system-ui,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif}.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-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-\[0\.92em\]{font-size:.92em}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13px\]{font-size:13px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent{color:var(--accent)}.text-accent-fg{color:var(--accent-fg)}.text-danger{color:var(--danger)}.text-fg{color:var(--fg)}.text-fg-faint{color:var(--fg-faint)}.text-fg-muted{color:var(--fg-muted)}.text-inverse-fg{color:var(--inverse-fg)}.text-ok{color:var(--ok)}.text-project{color:var(--project)}.text-think{color:var(--think)}.text-warn{color:var(--warn)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.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,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.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)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.group-focus-within\:flex:is(:where(.group):focus-within *){display:flex}@media (hover:hover){.group-hover\:flex:is(:where(.group):hover *){display:flex}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-fg-faint::placeholder{color:var(--fg-faint)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first\:pt-0:first-child{padding-top:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-accent\/60:hover{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent\/60:hover{border-color:color-mix(in oklab, var(--accent) 60%, transparent)}}.hover\:bg-accent-soft:hover{background-color:var(--accent-soft)}.hover\:bg-accent\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.hover\:bg-danger-soft:hover{background-color:var(--danger-soft)}.hover\:bg-fg\/5:hover{background-color:var(--fg)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-fg\/5:hover{background-color:color-mix(in oklab, var(--fg) 5%, transparent)}}.hover\:bg-surface-2:hover{background-color:var(--surface-2)}.hover\:bg-surface-3:hover{background-color:var(--surface-3)}.hover\:bg-warn\/10:hover{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warn\/10:hover{background-color:color-mix(in oklab, var(--warn) 10%, transparent)}}.hover\:text-danger:hover{color:var(--danger)}.hover\:text-fg:hover{color:var(--fg)}.hover\:text-fg-muted:hover{color:var(--fg-muted)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-solid:hover{text-decoration-style:solid}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}}.focus\:border-accent:focus{border-color:var(--accent)}.focus\:text-fg:focus{color:var(--fg)}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:text-fg:focus-visible{color:var(--fg)}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-accent:focus-visible{outline-color:var(--accent)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:inline{display:inline}.sm\:max-w-3xl{max-width:var(--container-3xl)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[180px_1fr\]{grid-template-columns:180px 1fr}.sm\:grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:rounded-xl{border-radius:var(--radius-xl)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pr-14{padding-right:calc(var(--spacing) * 14)}}@media (min-width:48rem){.md\:relative{position:relative}.md\:static{position:static}.md\:z-40{z-index:40}.md\:z-auto{z-index:auto}.md\:block{display:block}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:w-\[var\(--sidebar-w\)\]{width:var(--sidebar-w)}.md\:max-w-\[70vw\]{max-width:70vw}.md\:max-w-none{max-width:none}.md\:-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}@media (min-width:64rem){.lg\:static{position:static}.lg\:z-auto{z-index:auto}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:max-w-none{max-width:none}}}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--surface:#fff;--surface-2:#eef0f4;--surface-3:#e2e5eb;--border:#d6dae2;--fg:#171a21;--fg-muted:#5b6270;--fg-faint:#8a92a1;--accent:#2f6fed;--accent-fg:#000;--accent-soft:#e6eefd;--project:#2f6fed;--ok:#1f9d55;--ok-soft:#e4f6ec;--warn:#b7791f;--warn-soft:#fdf3dc;--danger:#d0453c;--danger-soft:#fce8e6;--think:#7c5cbf;--think-soft:#f0ebfa;--code-bg:#f0f2f6;--user-bubble:#e6eefd;--inverse-bg:#171a21;--inverse-fg:#f6f7f9;--shadow:0 1px 2px #1018280f, 0 1px 3px #1018281a}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0f1116;--surface:#161922;--surface-2:#1d212c;--surface-3:#262b38;--border:#2c3240;--fg:#e8eaf0;--inverse-bg:#e8eaf0;--inverse-fg:#0f1116;--fg-muted:#a0a7b6;--fg-faint:#6b7285;--accent:#6f9cff;--accent-fg:#000;--accent-soft:#1b2740;--project:#8ab4ff;--ok:#3ccc7a;--ok-soft:#14301f;--warn:#e0a83a;--warn-soft:#3a2c10;--danger:#f06a61;--danger-soft:#3d1a17;--think:#b39ae8;--think-soft:#2a2340;--code-bg:#0c0e13;--user-bubble:#1b2740;--shadow:0 1px 2px #0006}}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0f1116;--surface:#161922;--surface-2:#1d212c;--surface-3:#262b38;--border:#2c3240;--fg:#e8eaf0;--inverse-bg:#e8eaf0;--inverse-fg:#0f1116;--fg-muted:#a0a7b6;--fg-faint:#6b7285;--accent:#6f9cff;--accent-fg:#000;--accent-soft:#1b2740;--project:#8ab4ff;--ok:#3ccc7a;--ok-soft:#14301f;--warn:#e0a83a;--warn-soft:#3a2c10;--danger:#f06a61;--danger-soft:#3d1a17;--think:#b39ae8;--think-soft:#2a2340;--code-bg:#0c0e13;--user-bubble:#1b2740;--shadow:0 1px 2px #0006}html,body,#root{height:100%}#root{overflow:hidden}body{background:var(--bg);color:var(--fg);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;overscroll-behavior:none;margin:0;font-size:14px;line-height:1.5}:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md p,.md ul,.md ol,.md blockquote,.md table{margin:.5rem 0}.md ul{padding-left:1.4rem;list-style:outside}.md ol{padding-left:1.4rem;list-style:decimal}.md h1,.md h2,.md h3,.md h4{margin:.9rem 0 .4rem;font-weight:600;line-height:1.3}.md h1{font-size:1.25rem}.md h2{font-size:1.125rem}.md h3{font-size:1rem}.md.md-compact h1,.md.md-compact h2,.md.md-compact h3,.md.md-compact h4{margin:.75rem 0 .25rem;font-size:1.0833em}.md.md-compact p,.md.md-compact ul,.md.md-compact ol{margin:.35rem 0}.md.md-compact>:first-child{margin-top:0}.md.md-compact>:last-child{margin-bottom:0}.md a{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.md code{font-family:var(--font-mono);background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:.05em .3em;font-size:.875em}.md pre{margin:0}.md pre code{background:0 0;border:0;border-radius:0;padding:.75rem;line-height:1.45;display:block;overflow-x:auto}.md blockquote{border-left:3px solid var(--border);color:var(--fg-muted);padding-left:.75rem}.md table{border-collapse:collapse;font-size:.9em;display:block;overflow-x:auto}.md th,.md td{border:1px solid var(--border);text-align:left;padding:.25rem .5rem}.md hr{border:0;border-top:1px solid var(--border);margin:.75rem 0}.md input[type=checkbox]{margin-right:.35rem}.caret:after{content:"";vertical-align:-.15em;background:var(--fg-muted);width:.55em;height:1em;margin-left:2px;animation:1s steps(2,start) infinite caret-blink;display:inline-block}@keyframes caret-blink{to{visibility:hidden}}.blink{animation:1.2s ease-in-out infinite blink}@keyframes blink{0%,to{opacity:1}50%{opacity:.35}}.thinking-dots>span{animation:1.2s ease-in-out infinite blink}.thinking-dots>span:nth-child(2){animation-delay:.2s}.thinking-dots>span:nth-child(3){animation-delay:.4s}@media (prefers-reduced-motion:reduce){.blink,.thinking-dots>span,.caret:after{animation:none}}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}:root{--search-hit:#ffc56e;--search-hit-current:#ff8a00}::highlight(oona-search){background-color:var(--search-hit);color:#000}::highlight(oona-search-current){background-color:var(--search-hit-current);color:#000}.chat-search-current{outline:2px solid var(--search-hit-current);outline-offset:2px;border-radius:10px}.chat-jump-flash{border-radius:10px;animation:1.6s ease-out chat-jump-flash}@keyframes chat-jump-flash{0%,40%{outline:2px solid var(--accent);outline-offset:2px}to{outline-offset:2px;outline:2px solid #0000}}.pre-wrap{white-space:pre-wrap;word-break:break-word}[data-item-id]{content-visibility:auto;contain-intrinsic-size:auto 120px}.lazy-block{content-visibility:auto;contain-intrinsic-size:auto 300px}*{scrollbar-width:thin;scrollbar-color:var(--surface-3) transparent}@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-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}
|