@copilotkit/web-inspector 1.55.1 → 1.55.2-canary.test-01

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","names":["LitElement","nothing","inspectorLogoIconUrl","inspectorLogoUrl","clampSizeToViewport","icons","CopilotKitCoreRuntimeConnectionStatus","tailwindStyles"],"sources":["../src/styles/generated.css","../src/assets/inspector-logo.svg","../src/assets/inspector-logo-icon.svg","../src/lib/context-helpers.ts","../src/lib/persistence.ts","../src/index.ts"],"sourcesContent":["\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\",\\\"Noto Color Emoji\\\";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\\\"Liberation Mono\\\",\\\"Courier New\\\",monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-green-100:oklch(96.2% .044 156.743);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-700:oklch(50% .134 242.749);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-700:oklch(49.1% .27 292.581);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-700:oklch(49.6% .265 301.924);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\",\\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\\\"Liberation Mono\\\",\\\"Courier New\\\",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{font-family:var(--font-sans);color:var(--color-slate-900);background-color:#0000;display:block}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.bottom-1{bottom:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.m-0{margin:calc(var(--spacing)*0)}.mx-4{margin-inline:calc(var(--spacing)*4)}.my-1{margin-block:calc(var(--spacing)*1)}.my-3{margin-block:calc(var(--spacing)*3)}.mt-0\\\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\\\\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\\\\.5{height:calc(var(--spacing)*3.5)}.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-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-40{height:calc(var(--spacing)*40)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-96{max-height:calc(var(--spacing)*96)}.w-1\\\\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\\\\.5{width:calc(var(--spacing)*3.5)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-40{width:calc(var(--spacing)*40)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\\\[240px\\\\]{max-width:240px}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\\\[160px\\\\]{min-width:160px}.min-w-\\\\[200px\\\\]{min-width:200px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-y-\\\\[2px\\\\]{--tw-translate-y:calc(2px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.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-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-fuchsia-200{border-color:var(--color-fuchsia-200)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-purple-200{border-color:var(--color-purple-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-sky-200{border-color:var(--color-sky-200)}.border-slate-200{border-color:var(--color-slate-200)}.border-violet-200{border-color:var(--color-violet-200)}.border-white\\\\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\\\\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-50{background-color:var(--color-fuchsia-50)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-50\\\\/50{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\\\\/50{background-color:color-mix(in oklab,var(--color-gray-50)50%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950\\\\/95{background-color:#020618f2}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\\\\/95{background-color:color-mix(in oklab,var(--color-slate-950)95%,transparent)}}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.bg-white\\\\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\\\\/60{background-color:color-mix(in oklab,var(--color-white)60%,transparent)}}.bg-white\\\\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\\\\/95{background-color:color-mix(in oklab,var(--color-white)95%,transparent)}}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\\\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\\\[9px\\\\]{font-size:9px}.text-\\\\[10px\\\\]{font-size:10px}.text-\\\\[11px\\\\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-emerald-700{color:var(--color-emerald-700)}.text-fuchsia-700{color:var(--color-fuchsia-700)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-purple-700{color:var(--color-purple-700)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-sky-700{color:var(--color-sky-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.italic{font-style:italic}.opacity-0{opacity:0}.opacity-80{opacity:.8}.shadow-\\\\[0_12px_30px_rgba\\\\(15\\\\,23\\\\,42\\\\,0\\\\.12\\\\)\\\\]{--tw-shadow:0 12px 30px var(--tw-shadow-color,#0f172a1f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.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)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-black\\\\/5{--tw-ring-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.ring-black\\\\/5{--tw-ring-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.ring-transparent{--tw-ring-color:transparent}.ring-white\\\\/10{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.ring-white\\\\/10{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,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))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\\\\:opacity-100:is(:where(.group):hover *){opacity:1}.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-gray-300:hover{border-color:var(--color-gray-300)}.hover\\\\:border-white\\\\/30:hover{border-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\\\\:border-white\\\\/30:hover{border-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\\\\:bg-blue-50\\\\/50:hover{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-blue-50\\\\/50:hover{background-color:color-mix(in oklab,var(--color-blue-50)50%,transparent)}}.hover\\\\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\\\\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\\\\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\\\\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\\\\:bg-slate-900\\\\/95:hover{background-color:#0f172bf2}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-slate-900\\\\/95:hover{background-color:color-mix(in oklab,var(--color-slate-900)95%,transparent)}}.hover\\\\:text-gray-600:hover{color:var(--color-gray-600)}.hover\\\\:text-gray-900:hover{color:var(--color-gray-900)}}.focus\\\\:border-gray-300:focus{border-color:var(--color-gray-300)}.focus\\\\:bg-gray-50:focus{background-color:var(--color-gray-50)}.focus\\\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\\\\:ring-gray-200:focus{--tw-ring-color:var(--color-gray-200)}.focus\\\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\\\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.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-gray-300:focus-visible{outline-color:var(--color-gray-300)}.focus-visible\\\\:outline-gray-400:focus-visible{outline-color:var(--color-gray-400)}.focus-visible\\\\:outline-rose-500:focus-visible{outline-color:var(--color-rose-500)}.disabled\\\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\\\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\\\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\\\\[\\\\&\\\\>svg\\\\]\\\\:\\\\!h-8>svg{height:calc(var(--spacing)*8)!important}.\\\\[\\\\&\\\\>svg\\\\]\\\\:\\\\!w-8>svg{width:calc(var(--spacing)*8)!important}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}@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-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-backdrop-blur{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-brightness{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-contrast{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-grayscale{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-invert{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-opacity{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-saturate{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-sepia{syntax:\\\"*\\\";inherits:false}@property --tw-scale-x{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-outline-style{syntax:\\\"*\\\";inherits:false;initial-value:solid}@keyframes pulse{50%{opacity:.5}}\"","\"data:image/svg+xml,<svg width=\\\"136\\\" height=\\\"26\\\" viewBox=\\\"0 0 136 26\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">%0A<path d=\\\"M15.5253 11.0828H11.2602C11.2299 10.7299 11.1492 10.4097 11.0181 10.1224C10.8921 9.83503 10.7157 9.588 10.4888 9.38129C10.267 9.16958 9.99725 9.00818 9.67964 8.89733C9.36202 8.78136 9.00155 8.72338 8.59823 8.72338C7.89242 8.72338 7.29501 8.89477 6.80598 9.23756C6.322 9.58045 5.95397 10.072 5.70189 10.7122C5.45486 11.3524 5.33134 12.1213 5.33134 13.0187C5.33134 13.9665 5.45738 14.7606 5.70946 15.4008C5.96657 16.0361 6.33712 16.515 6.82111 16.8376C7.30509 17.1553 7.88739 17.314 8.56798 17.314C8.95618 17.314 9.30404 17.2662 9.61158 17.1704C9.91911 17.0695 10.1863 16.9259 10.4132 16.7393C10.64 16.5528 10.8241 16.3284 10.9653 16.0663C11.1114 15.7991 11.2097 15.4991 11.2602 15.1664L15.5253 15.1967C15.4748 15.852 15.2908 16.52 14.9732 17.2006C14.6556 17.8762 14.2044 18.5013 13.6195 19.076C13.0398 19.6457 12.3214 20.1046 11.4643 20.4524C10.6073 20.8003 9.61158 20.9742 8.47724 20.9742C7.05554 20.9742 5.78004 20.6692 4.65074 20.0592C3.52649 19.4491 2.63667 18.5517 1.98126 17.367C1.33091 16.1823 1.00574 14.7328 1.00574 13.0187C1.00574 11.2946 1.33848 9.84259 2.00396 8.66285C2.66944 7.47811 3.56682 6.58324 4.69611 5.97827C5.82541 5.36825 7.08578 5.06323 8.47724 5.06323C9.45528 5.06323 10.3552 5.19683 11.177 5.46403C11.9987 5.73123 12.7196 6.12194 13.3397 6.63618C13.9599 7.14537 14.4589 7.77302 14.8371 8.51922C15.2152 9.26533 15.4446 10.1198 15.5253 11.0828Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M23.0894 20.9742C21.829 20.9742 20.7501 20.7246 19.8527 20.2256C18.9553 19.7214 18.2672 19.0206 17.7883 18.1232C17.3093 17.2208 17.0698 16.1747 17.0698 14.9849C17.0698 13.7951 17.3093 12.7516 17.7883 11.8542C18.2672 10.9517 18.9553 10.2509 19.8527 9.75184C20.7501 9.24767 21.829 8.99564 23.0894 8.99564C24.3498 8.99564 25.4286 9.24767 26.326 9.75184C27.2234 10.2509 27.9115 10.9517 28.3905 11.8542C28.8695 12.7516 29.1089 13.7951 29.1089 14.9849C29.1089 16.1747 28.8695 17.2208 28.3905 18.1232C27.9115 19.0206 27.2234 19.7214 26.326 20.2256C25.4286 20.7246 24.3498 20.9742 23.0894 20.9742ZM23.1196 17.8888C23.4726 17.8888 23.7776 17.7703 24.0346 17.5334C24.2918 17.2965 24.4909 16.9587 24.6321 16.5201C24.7733 16.0814 24.8438 15.5597 24.8438 14.9547C24.8438 14.3446 24.7733 13.8228 24.6321 13.3893C24.4909 12.9506 24.2918 12.6128 24.0346 12.3759C23.7776 12.139 23.4726 12.0205 23.1196 12.0205C22.7466 12.0205 22.4265 12.139 22.1592 12.3759C21.8921 12.6128 21.6878 12.9506 21.5466 13.3893C21.4056 13.8228 21.3349 14.3446 21.3349 14.9547C21.3349 15.5597 21.4056 16.0814 21.5466 16.5201C21.6878 16.9587 21.8921 17.2965 22.1592 17.5334C22.4265 17.7703 22.7466 17.8888 23.1196 17.8888Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M30.8029 25.1184V9.14681H34.947V11.1735H35.0377C35.189 10.7803 35.4109 10.4199 35.7032 10.0922C35.9957 9.7594 36.3587 9.4947 36.7922 9.2981C37.2257 9.09639 37.7299 8.99564 38.3046 8.99564C39.0709 8.99564 39.7995 9.19979 40.4901 9.60811C41.1858 10.0165 41.7505 10.6593 42.1841 11.5365C42.6227 12.4138 42.842 13.5531 42.842 14.9547C42.842 16.2957 42.6328 17.4073 42.2143 18.2896C41.801 19.1719 41.2464 19.8298 40.5506 20.2633C39.8599 20.697 39.1011 20.9137 38.2744 20.9137C37.7299 20.9137 37.2434 20.8255 36.8149 20.649C36.3914 20.4675 36.0284 20.223 35.7259 19.9155C35.4285 19.6029 35.199 19.25 35.0377 18.8568H34.9772V25.1184H30.8029ZM34.8865 14.9547C34.8865 15.5193 34.9596 16.0083 35.1058 16.4218C35.257 16.8301 35.4688 17.1477 35.7411 17.3746C36.0183 17.5964 36.3486 17.7073 36.7317 17.7073C37.1149 17.7073 37.44 17.5989 37.7072 17.3821C37.9795 17.1603 38.1862 16.8452 38.3273 16.4369C38.4736 16.0234 38.5466 15.5294 38.5466 14.9547C38.5466 14.3799 38.4736 13.8884 38.3273 13.48C38.1862 13.0666 37.9795 12.7516 37.7072 12.5347C37.44 12.3129 37.1149 12.202 36.7317 12.202C36.3486 12.202 36.0183 12.3129 35.7411 12.5347C35.4688 12.7516 35.257 13.0666 35.1058 13.48C34.9596 13.8884 34.8865 14.3799 34.8865 14.9547Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M44.5908 20.7625V9.14678H48.7652V20.7625H44.5908ZM46.6779 7.93683C46.1133 7.93683 45.6294 7.75033 45.2261 7.37726C44.8227 7.00419 44.621 6.55549 44.621 6.03118C44.621 5.50686 44.8227 5.05816 45.2261 4.68509C45.6294 4.31202 46.1133 4.12549 46.6779 4.12549C47.2477 4.12549 47.7316 4.31202 48.1299 4.68509C48.5332 5.05816 48.7349 5.50686 48.7349 6.03118C48.7349 6.55549 48.5332 7.00419 48.1299 7.37726C47.7316 7.75033 47.2477 7.93683 46.6779 7.93683Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M55.0664 5.27496V20.7625H50.892V5.27496H55.0664Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M62.7893 20.9742C61.5289 20.9742 60.4501 20.7246 59.5527 20.2256C58.6553 19.7214 57.9671 19.0206 57.4881 18.1232C57.0093 17.2208 56.7698 16.1747 56.7698 14.9849C56.7698 13.7951 57.0093 12.7516 57.4881 11.8542C57.9671 10.9517 58.6553 10.2509 59.5527 9.75184C60.4501 9.24767 61.5289 8.99564 62.7893 8.99564C64.0497 8.99564 65.1286 9.24767 66.026 9.75184C66.9234 10.2509 67.6115 10.9517 68.0904 11.8542C68.5694 12.7516 68.8089 13.7951 68.8089 14.9849C68.8089 16.1747 68.5694 17.2208 68.0904 18.1232C67.6115 19.0206 66.9234 19.7214 66.026 20.2256C65.1286 20.7246 64.0497 20.9742 62.7893 20.9742ZM62.8195 17.8888C63.1724 17.8888 63.4775 17.7703 63.7346 17.5334C63.9917 17.2965 64.1908 16.9587 64.332 16.5201C64.4731 16.0814 64.5438 15.5597 64.5438 14.9547C64.5438 14.3446 64.4731 13.8228 64.332 13.3893C64.1908 12.9506 63.9917 12.6128 63.7346 12.3759C63.4775 12.139 63.1724 12.0205 62.8195 12.0205C62.4464 12.0205 62.1263 12.139 61.8592 12.3759C61.5919 12.6128 61.3878 12.9506 61.2466 13.3893C61.1054 13.8228 61.0349 14.3446 61.0349 14.9547C61.0349 15.5597 61.1054 16.0814 61.2466 16.5201C61.3878 16.9587 61.5919 17.2965 61.8592 17.5334C62.1263 17.7703 62.4464 17.8888 62.8195 17.8888Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M77.4298 9.1468V12.1717H69.7769V9.1468H77.4298ZM71.2591 6.36392H75.4334V17.0267C75.4334 17.188 75.4612 17.3241 75.5166 17.4351C75.572 17.5409 75.6578 17.6216 75.7738 17.677C75.8897 17.7274 76.0384 17.7527 76.2199 17.7527C76.3459 17.7527 76.4921 17.7375 76.6585 17.7073C76.8299 17.677 76.9559 17.6518 77.0366 17.6317L77.6416 20.5659C77.4551 20.6213 77.1879 20.6894 76.84 20.77C76.4972 20.8507 76.0888 20.9037 75.6149 20.9288C74.657 20.9792 73.8529 20.8809 73.2026 20.6339C72.5522 20.3818 72.0631 19.9861 71.7355 19.4466C71.4078 18.9072 71.249 18.2316 71.2591 17.42V6.36392Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M79.3223 20.7625V5.27496H83.5268V11.5365H83.7385L88.397 5.27496H93.2973L88.0642 12.1717L93.4183 20.7625H88.397L84.9183 14.9546L83.5268 16.7696V20.7625H79.3223Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M95.3334 20.7625V9.14678H99.5077V20.7625H95.3334ZM97.4206 7.93683C96.8559 7.93683 96.3719 7.75033 95.9686 7.37726C95.5653 7.00419 95.3637 6.55549 95.3637 6.03118C95.3637 5.50686 95.5653 5.05816 95.9686 4.68509C96.3719 4.31202 96.8559 4.12549 97.4206 4.12549C97.9902 4.12549 98.4743 4.31202 98.8725 4.68509C99.2758 5.05816 99.4775 5.50686 99.4775 6.03118C99.4775 6.55549 99.2758 7.00419 98.8725 7.37726C98.4743 7.75033 97.9902 7.93683 97.4206 7.93683Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M108.562 9.1468V12.1717H100.909V9.1468H108.562ZM102.391 6.36392H106.565V17.0267C106.565 17.188 106.593 17.3241 106.648 17.4351C106.704 17.5409 106.789 17.6216 106.905 17.677C107.021 17.7274 107.17 17.7527 107.352 17.7527C107.478 17.7527 107.623 17.7375 107.791 17.7073C107.962 17.677 108.087 17.6518 108.168 17.6317L108.774 20.5659C108.587 20.6213 108.319 20.6894 107.971 20.77C107.629 20.8507 107.22 20.9037 106.747 20.9288C105.789 20.9792 104.985 20.8809 104.334 20.6339C103.684 20.3818 103.195 19.9861 102.867 19.4466C102.54 18.9072 102.381 18.2316 102.391 17.42V6.36392Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M119.539 8.67678C121.648 5.91866 123.398 3.19128 124.071 0.988777C124.089 0.928849 124.159 0.90339 124.212 0.937987C126.553 2.48864 130.818 3.50932 134.591 3.53328C134.656 3.53369 134.7 3.59769 134.677 3.65822C133.423 6.84039 131.891 12.5423 131.831 19.0536C131.831 19.1503 131.695 19.185 131.647 19.1009C129.5 15.3438 122.623 10.0644 119.574 8.81838C119.518 8.79519 119.502 8.7255 119.539 8.67678Z\\\" fill=\\\"url(%23paint0_linear_8010_10612)\\\"/>%0A<path d=\\\"M126.653 6.98969C123.357 8.03321 120.345 8.61334 119.626 8.74516C119.58 8.75356 119.571 8.81686 119.614 8.83473C122.687 10.1121 129.53 15.3761 131.657 19.118C131.661 19.1262 131.671 19.1292 131.68 19.1255C131.688 19.1214 131.693 19.1108 131.69 19.1016L126.653 6.98969Z\\\" fill=\\\"url(%23paint1_linear_8010_10612)\\\"/>%0A<path d=\\\"M124.221 0.931179C127.043 2.4702 130.303 3.16142 134.629 3.52564C134.656 3.52796 134.665 3.56437 134.641 3.57702C134.088 3.86136 130.918 5.47409 128.565 6.33784C127.934 6.56926 127.3 6.78394 126.676 6.982C126.662 6.98633 126.647 6.97951 126.641 6.96631L124.156 0.989469C124.139 0.949222 124.183 0.910305 124.221 0.931179Z\\\" fill=\\\"url(%23paint2_linear_8010_10612)\\\"/>%0A<path d=\\\"M124.171 1.02203L131.742 19.082\\\" stroke=\\\"%23513C9F\\\" stroke-width=\\\"0.183881\\\" stroke-linecap=\\\"round\\\"/>%0A<path d=\\\"M119.628 8.74279C119.628 8.74279 123.809 7.99233 127.739 6.63677C131.668 5.28124 134.594 3.6214 134.594 3.6214\\\" stroke=\\\"%23513C9F\\\" stroke-width=\\\"0.183881\\\" stroke-linecap=\\\"round\\\"/>%0A<path d=\\\"M125.209 3.30383L122.405 12.6358M122.405 12.6358H129.07M122.405 12.6358L111.874 25.0383\\\" stroke=\\\"%23ABABAB\\\" stroke-width=\\\"0.321797\\\" stroke-linecap=\\\"round\\\"/>%0A<path d=\\\"M119.181 22.485L117.94 22.6596C118.584 24.3618 119.904 25.1053 121.479 25.1053C125.341 25.1053 124.163 20.7382 126.4 20.7382C128.023 20.7382 127.364 24.2778 130.857 24.2778C132.989 24.2778 133.201 22.1301 132.837 21.2061C132.835 21.2005 132.833 21.1953 132.83 21.1902L132.259 20.3154C132.222 20.2572 132.131 20.2791 132.125 20.3483L132.018 21.4087C132.011 21.4824 132.013 21.5559 132.021 21.6295C132.109 22.3621 132.165 24.14 130.857 24.14C129.477 24.14 129.145 20.6462 126.4 20.6462C123.181 20.6462 123.594 24.9675 121.618 24.9675C120.313 24.9675 119.319 23.4964 119.181 22.485Z\\\" fill=\\\"url(%23paint3_linear_8010_10612)\\\"/>%0A<defs>%0A<linearGradient id=\\\"paint0_linear_8010_10612\\\" x1=\\\"129.301\\\" y1=\\\"2.33848\\\" x2=\\\"125.623\\\" y2=\\\"12.452\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%236430AB\\\"/>%0A<stop offset=\\\"1\\\" stop-color=\\\"%23AA89D8\\\"/>%0A</linearGradient>%0A<linearGradient id=\\\"paint1_linear_8010_10612\\\" x1=\\\"126.451\\\" y1=\\\"8.03874\\\" x2=\\\"121.717\\\" y2=\\\"17.1869\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%23005DBB\\\"/>%0A<stop offset=\\\"1\\\" stop-color=\\\"%233D92E8\\\"/>%0A</linearGradient>%0A<linearGradient id=\\\"paint2_linear_8010_10612\\\" x1=\\\"128.565\\\" y1=\\\"2.33842\\\" x2=\\\"127.139\\\" y2=\\\"6.79755\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%231B70C4\\\"/>%0A<stop offset=\\\"1\\\" stop-color=\\\"%2354A4F2\\\"/>%0A</linearGradient>%0A<linearGradient id=\\\"paint3_linear_8010_10612\\\" x1=\\\"117.94\\\" y1=\\\"22.7838\\\" x2=\\\"132.981\\\" y2=\\\"22.7838\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%234497EA\\\"/>%0A<stop offset=\\\"0.254755\\\" stop-color=\\\"%231463B2\\\"/>%0A<stop offset=\\\"0.498725\\\" stop-color=\\\"%230A437D\\\"/>%0A<stop offset=\\\"0.666667\\\" stop-color=\\\"%232476C8\\\"/>%0A<stop offset=\\\"0.972542\\\" stop-color=\\\"%230C549A\\\"/>%0A</linearGradient>%0A</defs>%0A</svg>%0A\"","\"data:image/svg+xml,<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>%0A<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"55\\\" height=\\\"60\\\" viewBox=\\\"0 0 55 60\\\" fill=\\\"none\\\">%0A <g stroke=\\\"%23FFFFFF\\\" stroke-width=\\\"3.3125\\\" stroke-linejoin=\\\"round\\\">%0A <path d=\\\"M0 21.9336L16.5449 0C40.8483 5.37332 53 8.05998 53 8.05998L43.123 56L0 21.9336Z\\\" />%0A <line x1=\\\"16.5828\\\" y1=\\\"0\\\" x2=\\\"43.2454\\\" y2=\\\"56\\\" />%0A <line x1=\\\"0\\\" y1=\\\"21.9336\\\" x2=\\\"53\\\" y2=\\\"8.48421\\\" />%0A </g>%0A</svg>%0A\"","import type { Anchor, ContextState, Position, Size } from \"./types\";\n\nexport function updateSizeFromElement(\n state: ContextState,\n element: HTMLElement,\n fallback: Size,\n): void {\n const rect = element.getBoundingClientRect();\n state.size = {\n width: rect.width || fallback.width,\n height: rect.height || fallback.height,\n };\n}\n\nexport function clampSize(\n size: Size,\n viewport: Size,\n edgeMargin: number,\n minWidth: number,\n minHeight: number,\n): Size {\n const maxWidth = Math.max(minWidth, viewport.width - edgeMargin * 2);\n const maxHeight = Math.max(minHeight, viewport.height - edgeMargin * 2);\n\n return {\n width: clamp(size.width, minWidth, maxWidth),\n height: clamp(size.height, minHeight, maxHeight),\n };\n}\n\nexport function constrainToViewport(\n state: ContextState,\n position: Position,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxX = Math.max(\n edgeMargin,\n viewport.width - state.size.width - edgeMargin,\n );\n const maxY = Math.max(\n edgeMargin,\n viewport.height - state.size.height - edgeMargin,\n );\n\n return {\n x: clamp(position.x, edgeMargin, maxX),\n y: clamp(position.y, edgeMargin, maxY),\n };\n}\n\nexport function keepPositionWithinViewport(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): void {\n state.position = constrainToViewport(\n state,\n state.position,\n viewport,\n edgeMargin,\n );\n}\n\nexport function centerContext(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const centered: Position = {\n x: Math.round((viewport.width - state.size.width) / 2),\n y: Math.round((viewport.height - state.size.height) / 2),\n };\n\n state.position = constrainToViewport(state, centered, viewport, edgeMargin);\n updateAnchorFromPosition(state, viewport, edgeMargin);\n return state.position;\n}\n\nexport function updateAnchorFromPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): void {\n const centerX = state.position.x + state.size.width / 2;\n const centerY = state.position.y + state.size.height / 2;\n\n const horizontal: Anchor[\"horizontal\"] =\n centerX < viewport.width / 2 ? \"left\" : \"right\";\n const vertical: Anchor[\"vertical\"] =\n centerY < viewport.height / 2 ? \"top\" : \"bottom\";\n\n state.anchor = { horizontal, vertical };\n\n const maxHorizontalOffset = Math.max(\n edgeMargin,\n viewport.width - state.size.width - edgeMargin,\n );\n const maxVerticalOffset = Math.max(\n edgeMargin,\n viewport.height - state.size.height - edgeMargin,\n );\n\n state.anchorOffset = {\n x:\n horizontal === \"left\"\n ? clamp(state.position.x, edgeMargin, maxHorizontalOffset)\n : clamp(\n viewport.width - state.position.x - state.size.width,\n edgeMargin,\n maxHorizontalOffset,\n ),\n y:\n vertical === \"top\"\n ? clamp(state.position.y, edgeMargin, maxVerticalOffset)\n : clamp(\n viewport.height - state.position.y - state.size.height,\n edgeMargin,\n maxVerticalOffset,\n ),\n };\n}\n\nexport function applyAnchorPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxHorizontalOffset = Math.max(\n edgeMargin,\n viewport.width - state.size.width - edgeMargin,\n );\n const maxVerticalOffset = Math.max(\n edgeMargin,\n viewport.height - state.size.height - edgeMargin,\n );\n\n const horizontalOffset = clamp(\n state.anchorOffset.x,\n edgeMargin,\n maxHorizontalOffset,\n );\n const verticalOffset = clamp(\n state.anchorOffset.y,\n edgeMargin,\n maxVerticalOffset,\n );\n\n const x =\n state.anchor.horizontal === \"left\"\n ? horizontalOffset\n : viewport.width - state.size.width - horizontalOffset;\n\n const y =\n state.anchor.vertical === \"top\"\n ? verticalOffset\n : viewport.height - state.size.height - verticalOffset;\n\n state.anchorOffset = { x: horizontalOffset, y: verticalOffset };\n state.position = constrainToViewport(state, { x, y }, viewport, edgeMargin);\n return state.position;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(min, value), max);\n}\n","import type { Anchor, DockMode, Position, Size } from \"./types\";\n\nexport type PersistedContextState = {\n anchor?: Anchor;\n anchorOffset?: Position;\n size?: Size;\n hasCustomPosition?: boolean;\n};\n\nexport type PersistedState = {\n button?: Omit<PersistedContextState, \"size\">;\n window?: PersistedContextState;\n isOpen?: boolean;\n dockMode?: DockMode;\n selectedMenu?: string;\n selectedContext?: string;\n};\n\nexport function loadInspectorState(storageKey: string): PersistedState | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const raw = window.localStorage.getItem(storageKey);\n if (raw) {\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") {\n return parsed as PersistedState;\n }\n } catch {\n // Fall through to cookie migration path\n }\n }\n\n // Backwards compatibility: try to read the legacy cookie and migrate it\n if (typeof document !== \"undefined\") {\n const prefix = `${storageKey}=`;\n const entry = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(prefix));\n if (entry) {\n const legacyRaw = entry.substring(prefix.length);\n try {\n const parsed = JSON.parse(decodeURIComponent(legacyRaw));\n if (parsed && typeof parsed === \"object\") {\n return parsed as PersistedState;\n }\n } catch {\n return null;\n }\n }\n }\n\n return null;\n}\n\nexport function saveInspectorState(\n storageKey: string,\n state: PersistedState,\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(state));\n } catch (error) {\n console.warn(\"Failed to persist inspector state\", error);\n }\n}\n\nexport function isValidAnchor(value: unknown): value is Anchor {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Anchor;\n return (\n (candidate.horizontal === \"left\" || candidate.horizontal === \"right\") &&\n (candidate.vertical === \"top\" || candidate.vertical === \"bottom\")\n );\n}\n\nexport function isValidPosition(value: unknown): value is Position {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Position;\n return isFiniteNumber(candidate.x) && isFiniteNumber(candidate.y);\n}\n\nexport function isValidSize(value: unknown): value is Size {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Size;\n return isFiniteNumber(candidate.width) && isFiniteNumber(candidate.height);\n}\n\nexport function isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nexport function isValidDockMode(value: unknown): value is DockMode {\n return value === \"floating\" || value === \"docked-left\";\n}\n","import { LitElement, css, html, nothing, unsafeCSS } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport tailwindStyles from \"./styles/generated.css\";\nimport inspectorLogoUrl from \"./assets/inspector-logo.svg\";\nimport inspectorLogoIconUrl from \"./assets/inspector-logo-icon.svg\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport { icons } from \"lucide\";\nimport {\n CopilotKitCore,\n CopilotKitCoreRuntimeConnectionStatus,\n type CopilotKitCoreSubscriber,\n type CopilotKitCoreErrorCode,\n} from \"@copilotkit/core\";\nimport type { AbstractAgent, AgentSubscriber } from \"@ag-ui/client\";\nimport type {\n Anchor,\n ContextKey,\n ContextState,\n DockMode,\n Position,\n Size,\n} from \"./lib/types\";\nimport {\n applyAnchorPosition as applyAnchorPositionHelper,\n centerContext as centerContextHelper,\n constrainToViewport,\n keepPositionWithinViewport,\n updateAnchorFromPosition as updateAnchorFromPositionHelper,\n updateSizeFromElement,\n clampSize as clampSizeToViewport,\n} from \"./lib/context-helpers\";\nimport {\n loadInspectorState,\n saveInspectorState,\n type PersistedState,\n isValidAnchor,\n isValidPosition,\n isValidSize,\n isValidDockMode,\n} from \"./lib/persistence\";\n\nexport const WEB_INSPECTOR_TAG = \"cpk-web-inspector\" as const;\n\ntype LucideIconName = keyof typeof icons;\n\ntype MenuKey = \"ag-ui-events\" | \"agents\" | \"frontend-tools\" | \"agent-context\";\n\ntype MenuItem = {\n key: MenuKey;\n label: string;\n icon: LucideIconName;\n};\n\nconst EDGE_MARGIN = 16;\nconst DRAG_THRESHOLD = 6;\nconst MIN_WINDOW_WIDTH = 600;\nconst MIN_WINDOW_WIDTH_DOCKED_LEFT = 420;\nconst MIN_WINDOW_HEIGHT = 200;\nconst INSPECTOR_STORAGE_KEY = \"cpk:inspector:state\";\nconst ANNOUNCEMENT_STORAGE_KEY = \"cpk:inspector:announcements\";\nconst ANNOUNCEMENT_URL = \"https://cdn.copilotkit.ai/announcements.json\";\nconst DEFAULT_BUTTON_SIZE: Size = { width: 48, height: 48 };\nconst DEFAULT_WINDOW_SIZE: Size = { width: 840, height: 560 };\nconst DOCKED_LEFT_WIDTH = 500; // Sensible width for left dock with collapsed sidebar\nconst MAX_AGENT_EVENTS = 200;\nconst MAX_TOTAL_EVENTS = 500;\n\ntype InspectorAgentEventType =\n | \"RUN_STARTED\"\n | \"RUN_FINISHED\"\n | \"RUN_ERROR\"\n | \"TEXT_MESSAGE_START\"\n | \"TEXT_MESSAGE_CONTENT\"\n | \"TEXT_MESSAGE_END\"\n | \"TOOL_CALL_START\"\n | \"TOOL_CALL_ARGS\"\n | \"TOOL_CALL_END\"\n | \"TOOL_CALL_RESULT\"\n | \"STATE_SNAPSHOT\"\n | \"STATE_DELTA\"\n | \"MESSAGES_SNAPSHOT\"\n | \"RAW_EVENT\"\n | \"CUSTOM_EVENT\"\n | \"REASONING_START\"\n | \"REASONING_MESSAGE_START\"\n | \"REASONING_MESSAGE_CONTENT\"\n | \"REASONING_MESSAGE_END\"\n | \"REASONING_END\"\n | \"REASONING_ENCRYPTED_VALUE\";\n\nconst AGENT_EVENT_TYPES: readonly InspectorAgentEventType[] = [\n \"RUN_STARTED\",\n \"RUN_FINISHED\",\n \"RUN_ERROR\",\n \"TEXT_MESSAGE_START\",\n \"TEXT_MESSAGE_CONTENT\",\n \"TEXT_MESSAGE_END\",\n \"TOOL_CALL_START\",\n \"TOOL_CALL_ARGS\",\n \"TOOL_CALL_END\",\n \"TOOL_CALL_RESULT\",\n \"STATE_SNAPSHOT\",\n \"STATE_DELTA\",\n \"MESSAGES_SNAPSHOT\",\n \"RAW_EVENT\",\n \"CUSTOM_EVENT\",\n \"REASONING_START\",\n \"REASONING_MESSAGE_START\",\n \"REASONING_MESSAGE_CONTENT\",\n \"REASONING_MESSAGE_END\",\n \"REASONING_END\",\n \"REASONING_ENCRYPTED_VALUE\",\n] as const;\n\ntype SanitizedValue =\n | string\n | number\n | boolean\n | null\n | SanitizedValue[]\n | { [key: string]: SanitizedValue };\n\ntype InspectorToolCall = {\n id?: string;\n function?: {\n name?: string;\n arguments?: SanitizedValue | string;\n };\n toolName?: string;\n status?: string;\n};\n\ntype InspectorMessage = {\n id?: string;\n role: string;\n contentText: string;\n contentRaw?: SanitizedValue;\n toolCalls: InspectorToolCall[];\n};\n\ntype InspectorToolDefinition = {\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: \"handler\" | \"renderer\";\n};\n\ntype InspectorEvent = {\n id: string;\n agentId: string;\n type: InspectorAgentEventType;\n timestamp: number;\n payload: SanitizedValue;\n};\n\nexport class WebInspectorElement extends LitElement {\n static properties = {\n core: { attribute: false },\n autoAttachCore: { type: Boolean, attribute: \"auto-attach-core\" },\n } as const;\n\n private _core: CopilotKitCore | null = null;\n private coreSubscriber: CopilotKitCoreSubscriber | null = null;\n private coreUnsubscribe: (() => void) | null = null;\n private runtimeStatus: CopilotKitCoreRuntimeConnectionStatus | null = null;\n private coreProperties: Readonly<Record<string, unknown>> = {};\n private lastCoreError: {\n code: CopilotKitCoreErrorCode;\n message: string;\n } | null = null;\n private agentSubscriptions: Map<string, () => void> = new Map();\n private agentEvents: Map<string, InspectorEvent[]> = new Map();\n private agentMessages: Map<string, InspectorMessage[]> = new Map();\n private agentStates: Map<string, SanitizedValue> = new Map();\n private flattenedEvents: InspectorEvent[] = [];\n private eventCounter = 0;\n private contextStore: Record<\n string,\n { description?: string; value: unknown }\n > = {};\n\n private pointerId: number | null = null;\n private dragStart: Position | null = null;\n private dragOffset: Position = { x: 0, y: 0 };\n private isDragging = false;\n private pointerContext: ContextKey | null = null;\n private isOpen = false;\n private draggedDuringInteraction = false;\n private ignoreNextButtonClick = false;\n private selectedMenu: MenuKey = \"ag-ui-events\";\n private contextMenuOpen = false;\n private dockMode: DockMode = \"floating\";\n private previousBodyMargins: { left: string; bottom: string } | null = null;\n private transitionTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private bodyTransitionTimeoutIds: Set<ReturnType<typeof setTimeout>> =\n new Set();\n private pendingSelectedContext: string | null = null;\n private autoAttachCore = true;\n private attemptedAutoAttach = false;\n private cachedTools: InspectorToolDefinition[] = [];\n private toolSignature = \"\";\n private eventFilterText = \"\";\n private eventTypeFilter: InspectorAgentEventType | \"all\" = \"all\";\n\n private announcementMarkdown: string | null = null;\n private announcementHtml: string | null = null;\n private announcementTimestamp: string | null = null;\n private announcementPreviewText: string | null = null;\n private hasUnseenAnnouncement = false;\n private announcementLoaded = false;\n private announcementLoadError: unknown = null;\n private announcementPromise: Promise<void> | null = null;\n private showAnnouncementPreview = true;\n\n get core(): CopilotKitCore | null {\n return this._core;\n }\n\n set core(value: CopilotKitCore | null) {\n const oldValue = this._core;\n if (oldValue === value) {\n return;\n }\n\n this.detachFromCore();\n\n this._core = value ?? null;\n this.requestUpdate(\"core\", oldValue);\n\n if (this._core) {\n this.attachToCore(this._core);\n }\n }\n\n private readonly contextState: Record<ContextKey, ContextState> = {\n button: {\n position: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n size: { ...DEFAULT_BUTTON_SIZE },\n anchor: { horizontal: \"right\", vertical: \"top\" },\n anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n },\n window: {\n position: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n size: { ...DEFAULT_WINDOW_SIZE },\n anchor: { horizontal: \"right\", vertical: \"top\" },\n anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n },\n };\n\n private hasCustomPosition: Record<ContextKey, boolean> = {\n button: false,\n window: false,\n };\n\n private resizePointerId: number | null = null;\n private resizeStart: Position | null = null;\n private resizeInitialSize: { width: number; height: number } | null = null;\n private isResizing = false;\n\n private readonly menuItems: MenuItem[] = [\n { key: \"ag-ui-events\", label: \"AG-UI Events\", icon: \"Zap\" },\n { key: \"agents\", label: \"Agent\", icon: \"Bot\" },\n { key: \"frontend-tools\", label: \"Frontend Tools\", icon: \"Hammer\" },\n { key: \"agent-context\", label: \"Context\", icon: \"FileText\" },\n ];\n\n private attachToCore(core: CopilotKitCore): void {\n this.runtimeStatus = core.runtimeConnectionStatus;\n this.coreProperties = core.properties;\n this.lastCoreError = null;\n\n this.coreSubscriber = {\n onRuntimeConnectionStatusChanged: ({ status }) => {\n this.runtimeStatus = status;\n this.requestUpdate();\n },\n onPropertiesChanged: ({ properties }) => {\n this.coreProperties = properties;\n this.requestUpdate();\n },\n onError: ({ code, error }) => {\n this.lastCoreError = { code, message: error.message };\n this.requestUpdate();\n },\n onAgentsChanged: ({ agents }) => {\n this.processAgentsChanged(agents);\n },\n onContextChanged: ({ context }) => {\n this.contextStore = this.normalizeContextStore(context);\n this.requestUpdate();\n },\n } satisfies CopilotKitCoreSubscriber;\n\n this.coreUnsubscribe = core.subscribe(this.coreSubscriber).unsubscribe;\n this.processAgentsChanged(core.agents);\n\n // Initialize context from core\n if (core.context) {\n this.contextStore = this.normalizeContextStore(core.context);\n }\n }\n\n private detachFromCore(): void {\n if (this.coreUnsubscribe) {\n this.coreUnsubscribe();\n this.coreUnsubscribe = null;\n }\n this.coreSubscriber = null;\n this.runtimeStatus = null;\n this.lastCoreError = null;\n this.coreProperties = {};\n this.cachedTools = [];\n this.toolSignature = \"\";\n this.teardownAgentSubscriptions();\n }\n\n private teardownAgentSubscriptions(): void {\n for (const unsubscribe of this.agentSubscriptions.values()) {\n unsubscribe();\n }\n this.agentSubscriptions.clear();\n this.agentEvents.clear();\n this.agentMessages.clear();\n this.agentStates.clear();\n this.flattenedEvents = [];\n this.eventCounter = 0;\n }\n\n private processAgentsChanged(\n agents: Readonly<Record<string, AbstractAgent>>,\n ): void {\n const seenAgentIds = new Set<string>();\n\n for (const agent of Object.values(agents)) {\n if (!agent?.agentId) {\n continue;\n }\n seenAgentIds.add(agent.agentId);\n this.subscribeToAgent(agent);\n }\n\n for (const agentId of Array.from(this.agentSubscriptions.keys())) {\n if (!seenAgentIds.has(agentId)) {\n this.unsubscribeFromAgent(agentId);\n this.agentEvents.delete(agentId);\n this.agentMessages.delete(agentId);\n this.agentStates.delete(agentId);\n }\n }\n\n this.updateContextOptions(seenAgentIds);\n this.refreshToolsSnapshot();\n this.requestUpdate();\n }\n\n private refreshToolsSnapshot(): void {\n if (!this._core) {\n if (this.cachedTools.length > 0) {\n this.cachedTools = [];\n this.toolSignature = \"\";\n this.requestUpdate();\n }\n return;\n }\n\n const tools = this.extractToolsFromAgents();\n const signature = JSON.stringify(\n tools.map((tool) => ({\n agentId: tool.agentId,\n name: tool.name,\n type: tool.type,\n hasDescription: Boolean(tool.description),\n hasParameters: Boolean(tool.parameters),\n })),\n );\n\n if (signature !== this.toolSignature) {\n this.toolSignature = signature;\n this.cachedTools = tools;\n this.requestUpdate();\n }\n }\n\n private tryAutoAttachCore(): void {\n if (\n this.attemptedAutoAttach ||\n this._core ||\n !this.autoAttachCore ||\n typeof window === \"undefined\"\n ) {\n return;\n }\n\n this.attemptedAutoAttach = true;\n\n const globalWindow = window as unknown as Record<string, unknown>;\n const globalCandidates: Array<unknown> = [\n // Common app-level globals used during development\n globalWindow.__COPILOTKIT_CORE__,\n (globalWindow.copilotkit as { core?: unknown } | undefined)?.core,\n globalWindow.copilotkitCore,\n ];\n\n const foundCore = globalCandidates.find(\n (candidate): candidate is CopilotKitCore =>\n !!candidate && typeof candidate === \"object\",\n );\n\n if (foundCore) {\n this.core = foundCore;\n }\n }\n\n private subscribeToAgent(agent: AbstractAgent): void {\n if (!agent.agentId) {\n return;\n }\n\n const agentId = agent.agentId;\n\n this.unsubscribeFromAgent(agentId);\n\n const subscriber: AgentSubscriber = {\n onRunStartedEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RUN_STARTED\", event);\n },\n onRunFinishedEvent: ({ event, result }) => {\n this.recordAgentEvent(agentId, \"RUN_FINISHED\", { event, result });\n },\n onRunErrorEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RUN_ERROR\", event);\n },\n onTextMessageStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_START\", event);\n },\n onTextMessageContentEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_CONTENT\", {\n event,\n textMessageBuffer,\n });\n },\n onTextMessageEndEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_END\", {\n event,\n textMessageBuffer,\n });\n },\n onToolCallStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_START\", event);\n },\n onToolCallArgsEvent: ({\n event,\n toolCallBuffer,\n toolCallName,\n partialToolCallArgs,\n }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_ARGS\", {\n event,\n toolCallBuffer,\n toolCallName,\n partialToolCallArgs,\n });\n },\n onToolCallEndEvent: ({ event, toolCallArgs, toolCallName }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_END\", {\n event,\n toolCallArgs,\n toolCallName,\n });\n },\n onToolCallResultEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_RESULT\", event);\n },\n onStateSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_SNAPSHOT\", event);\n this.syncAgentState(agent);\n },\n onStateDeltaEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_DELTA\", event);\n this.syncAgentState(agent);\n },\n onMessagesSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"MESSAGES_SNAPSHOT\", event);\n this.syncAgentMessages(agent);\n },\n onMessagesChanged: () => {\n this.syncAgentMessages(agent);\n },\n onRawEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RAW_EVENT\", event);\n },\n onCustomEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"CUSTOM_EVENT\", event);\n },\n onReasoningStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_START\", event);\n },\n onReasoningMessageStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_MESSAGE_START\", event);\n },\n onReasoningMessageContentEvent: ({ event, reasoningMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"REASONING_MESSAGE_CONTENT\", {\n event,\n reasoningMessageBuffer,\n });\n },\n onReasoningMessageEndEvent: ({ event, reasoningMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"REASONING_MESSAGE_END\", {\n event,\n reasoningMessageBuffer,\n });\n },\n onReasoningEndEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_END\", event);\n },\n onReasoningEncryptedValueEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_ENCRYPTED_VALUE\", event);\n },\n };\n\n const { unsubscribe } = agent.subscribe(subscriber);\n this.agentSubscriptions.set(agentId, unsubscribe);\n this.syncAgentMessages(agent);\n this.syncAgentState(agent);\n\n if (!this.agentEvents.has(agentId)) {\n this.agentEvents.set(agentId, []);\n }\n }\n\n private unsubscribeFromAgent(agentId: string): void {\n const unsubscribe = this.agentSubscriptions.get(agentId);\n if (unsubscribe) {\n unsubscribe();\n this.agentSubscriptions.delete(agentId);\n }\n }\n\n private recordAgentEvent(\n agentId: string,\n type: InspectorAgentEventType,\n payload: unknown,\n ): void {\n const eventId = `${agentId}:${++this.eventCounter}`;\n const normalizedPayload = this.normalizeEventPayload(type, payload);\n const event: InspectorEvent = {\n id: eventId,\n agentId,\n type,\n timestamp: Date.now(),\n payload: normalizedPayload,\n };\n\n const currentAgentEvents = this.agentEvents.get(agentId) ?? [];\n const nextAgentEvents = [event, ...currentAgentEvents].slice(\n 0,\n MAX_AGENT_EVENTS,\n );\n this.agentEvents.set(agentId, nextAgentEvents);\n\n this.flattenedEvents = [event, ...this.flattenedEvents].slice(\n 0,\n MAX_TOTAL_EVENTS,\n );\n this.refreshToolsSnapshot();\n this.requestUpdate();\n }\n\n private syncAgentMessages(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const messages = this.normalizeAgentMessages(\n (agent as { messages?: unknown }).messages,\n );\n if (messages) {\n this.agentMessages.set(agent.agentId, messages);\n } else {\n this.agentMessages.delete(agent.agentId);\n }\n\n this.requestUpdate();\n }\n\n private syncAgentState(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const state = (agent as { state?: unknown }).state;\n\n if (state === undefined || state === null) {\n this.agentStates.delete(agent.agentId);\n } else {\n this.agentStates.set(agent.agentId, this.sanitizeForLogging(state));\n }\n\n this.requestUpdate();\n }\n\n private updateContextOptions(agentIds: Set<string>): void {\n const nextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ...Array.from(agentIds)\n .sort((a, b) => a.localeCompare(b))\n .map((id) => ({ key: id, label: id })),\n ];\n\n const optionsChanged =\n this.contextOptions.length !== nextOptions.length ||\n this.contextOptions.some(\n (option, index) => option.key !== nextOptions[index]?.key,\n );\n\n if (optionsChanged) {\n this.contextOptions = nextOptions;\n }\n\n const pendingContext = this.pendingSelectedContext;\n if (pendingContext) {\n const isPendingAvailable =\n pendingContext === \"all-agents\" || agentIds.has(pendingContext);\n if (isPendingAvailable) {\n if (this.selectedContext !== pendingContext) {\n this.selectedContext = pendingContext;\n this.expandedRows.clear();\n }\n this.pendingSelectedContext = null;\n } else if (agentIds.size > 0) {\n // Agents are loaded but the pending selection no longer exists\n this.pendingSelectedContext = null;\n }\n }\n\n const hasSelectedContext = nextOptions.some(\n (option) => option.key === this.selectedContext,\n );\n\n if (!hasSelectedContext && this.pendingSelectedContext === null) {\n // Auto-select \"default\" agent if it exists, otherwise first agent, otherwise \"all-agents\"\n let nextSelected: string = \"all-agents\";\n\n if (agentIds.has(\"default\")) {\n nextSelected = \"default\";\n } else if (agentIds.size > 0) {\n nextSelected = Array.from(agentIds).sort((a, b) =>\n a.localeCompare(b),\n )[0]!;\n }\n\n if (this.selectedContext !== nextSelected) {\n this.selectedContext = nextSelected;\n this.expandedRows.clear();\n this.persistState();\n }\n }\n }\n\n private getEventsForSelectedContext(): InspectorEvent[] {\n if (this.selectedContext === \"all-agents\") {\n return this.flattenedEvents;\n }\n\n return this.agentEvents.get(this.selectedContext) ?? [];\n }\n\n private filterEvents(events: InspectorEvent[]): InspectorEvent[] {\n const query = this.eventFilterText.trim().toLowerCase();\n\n return events.filter((event) => {\n if (\n this.eventTypeFilter !== \"all\" &&\n event.type !== this.eventTypeFilter\n ) {\n return false;\n }\n\n if (!query) {\n return true;\n }\n\n const payloadText = this.stringifyPayload(\n event.payload,\n false,\n ).toLowerCase();\n return (\n event.type.toLowerCase().includes(query) ||\n event.agentId.toLowerCase().includes(query) ||\n payloadText.includes(query)\n );\n });\n }\n\n private getLatestStateForAgent(agentId: string): SanitizedValue | null {\n if (this.agentStates.has(agentId)) {\n const value = this.agentStates.get(agentId);\n return value === undefined ? null : value;\n }\n\n const events = this.agentEvents.get(agentId) ?? [];\n const stateEvent = events.find((e) => e.type === \"STATE_SNAPSHOT\");\n if (!stateEvent) {\n return null;\n }\n return stateEvent.payload;\n }\n\n private getLatestMessagesForAgent(\n agentId: string,\n ): InspectorMessage[] | null {\n const messages = this.agentMessages.get(agentId);\n return messages ?? null;\n }\n\n private getAgentStatus(agentId: string): \"running\" | \"idle\" | \"error\" {\n const events = this.agentEvents.get(agentId) ?? [];\n if (events.length === 0) {\n return \"idle\";\n }\n\n // Check most recent run-related event\n const runEvent = events.find(\n (e) =>\n e.type === \"RUN_STARTED\" ||\n e.type === \"RUN_FINISHED\" ||\n e.type === \"RUN_ERROR\",\n );\n\n if (!runEvent) {\n return \"idle\";\n }\n\n if (runEvent.type === \"RUN_ERROR\") {\n return \"error\";\n }\n\n if (runEvent.type === \"RUN_STARTED\") {\n // Check if there's a RUN_FINISHED after this\n const finishedAfter = events.find(\n (e) => e.type === \"RUN_FINISHED\" && e.timestamp > runEvent.timestamp,\n );\n return finishedAfter ? \"idle\" : \"running\";\n }\n\n return \"idle\";\n }\n\n private getAgentStats(agentId: string): {\n totalEvents: number;\n lastActivity: number | null;\n messages: number;\n toolCalls: number;\n errors: number;\n } {\n const events = this.agentEvents.get(agentId) ?? [];\n\n const messages = this.agentMessages.get(agentId);\n\n const toolCallCount = messages\n ? messages.reduce(\n (count, message) => count + (message.toolCalls?.length ?? 0),\n 0,\n )\n : events.filter((e) => e.type === \"TOOL_CALL_END\").length;\n\n const messageCount = messages?.length ?? 0;\n\n return {\n totalEvents: events.length,\n lastActivity: events[0]?.timestamp ?? null,\n messages: messageCount,\n toolCalls: toolCallCount,\n errors: events.filter((e) => e.type === \"RUN_ERROR\").length,\n };\n }\n\n private renderToolCallDetails(toolCalls: InspectorToolCall[]) {\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n return nothing;\n }\n\n return html`\n <div class=\"mt-2 space-y-2\">\n ${toolCalls.map((call, index) => {\n const functionName =\n call.function?.name ?? call.toolName ?? \"Unknown function\";\n const callId =\n typeof call?.id === \"string\" ? call.id : `tool-call-${index + 1}`;\n const argsString = this.formatToolCallArguments(\n call.function?.arguments,\n );\n return html`\n <div\n class=\"rounded-md border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700\"\n >\n <div\n class=\"flex flex-wrap items-center justify-between gap-1 font-medium text-gray-900\"\n >\n <span>${functionName}</span>\n <span class=\"text-[10px] text-gray-500\">ID: ${callId}</span>\n </div>\n ${\n argsString\n ? html`<pre\n class=\"mt-2 overflow-auto rounded bg-white p-2 text-[11px] leading-relaxed text-gray-800\"\n >\n${argsString}</pre\n >`\n : nothing\n }\n </div>\n `;\n })}\n </div>\n `;\n }\n\n private formatToolCallArguments(args: unknown): string | null {\n if (args === undefined || args === null || args === \"\") {\n return null;\n }\n\n if (typeof args === \"string\") {\n try {\n const parsed = JSON.parse(args);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return args;\n }\n }\n\n if (typeof args === \"object\") {\n try {\n return JSON.stringify(args, null, 2);\n } catch {\n return String(args);\n }\n }\n\n return String(args);\n }\n\n private hasRenderableState(state: unknown): boolean {\n if (state === null || state === undefined) {\n return false;\n }\n\n if (Array.isArray(state)) {\n return state.length > 0;\n }\n\n if (typeof state === \"object\") {\n return Object.keys(state as Record<string, unknown>).length > 0;\n }\n\n if (typeof state === \"string\") {\n const trimmed = state.trim();\n return trimmed.length > 0 && trimmed !== \"{}\";\n }\n\n return true;\n }\n\n private formatStateForDisplay(state: unknown): string {\n if (state === null || state === undefined) {\n return \"\";\n }\n\n if (typeof state === \"string\") {\n const trimmed = state.trim();\n if (trimmed.length === 0) {\n return \"\";\n }\n try {\n const parsed = JSON.parse(trimmed);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return state;\n }\n }\n\n if (typeof state === \"object\") {\n try {\n return JSON.stringify(state, null, 2);\n } catch {\n return String(state);\n }\n }\n\n return String(state);\n }\n\n private getEventBadgeClasses(type: string): string {\n const base =\n \"font-mono text-[10px] font-medium inline-flex items-center rounded-sm px-1.5 py-0.5 border\";\n\n if (type.startsWith(\"RUN_\")) {\n return `${base} bg-blue-50 text-blue-700 border-blue-200`;\n }\n\n if (type.startsWith(\"TEXT_MESSAGE\")) {\n return `${base} bg-emerald-50 text-emerald-700 border-emerald-200`;\n }\n\n if (type.startsWith(\"TOOL_CALL\")) {\n return `${base} bg-amber-50 text-amber-700 border-amber-200`;\n }\n\n if (type.startsWith(\"REASONING\")) {\n return `${base} bg-fuchsia-50 text-fuchsia-700 border-fuchsia-200`;\n }\n\n if (type.startsWith(\"STATE\")) {\n return `${base} bg-violet-50 text-violet-700 border-violet-200`;\n }\n\n if (type.startsWith(\"MESSAGES\")) {\n return `${base} bg-sky-50 text-sky-700 border-sky-200`;\n }\n\n if (type === \"RUN_ERROR\") {\n return `${base} bg-rose-50 text-rose-700 border-rose-200`;\n }\n\n return `${base} bg-gray-100 text-gray-600 border-gray-200`;\n }\n\n private stringifyPayload(payload: unknown, pretty: boolean): string {\n try {\n if (payload === undefined) {\n return pretty ? \"undefined\" : \"undefined\";\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n return JSON.stringify(payload, null, pretty ? 2 : 0) ?? \"\";\n } catch (error) {\n console.warn(\"Failed to stringify inspector payload\", error);\n return String(payload);\n }\n }\n\n private extractEventFromPayload(payload: unknown): unknown {\n // If payload is an object with an 'event' field, extract it\n if (payload && typeof payload === \"object\" && \"event\" in payload) {\n return (payload as Record<string, unknown>).event;\n }\n // Otherwise, assume the payload itself is the event\n return payload;\n }\n\n private async copyToClipboard(text: string, eventId: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.copiedEvents.add(eventId);\n this.requestUpdate();\n\n // Clear the \"copied\" state after 2 seconds\n setTimeout(() => {\n this.copiedEvents.delete(eventId);\n this.requestUpdate();\n }, 2000);\n } catch (err) {\n console.error(\"Failed to copy to clipboard:\", err);\n }\n }\n\n static styles = [\n unsafeCSS(tailwindStyles),\n css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 2147483646;\n display: block;\n will-change: transform;\n }\n\n :host([data-transitioning=\"true\"]) {\n transition: transform 300ms ease;\n }\n\n .console-button {\n transition:\n transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n opacity 160ms ease;\n }\n\n .console-button[data-dragging=\"true\"] {\n transition: opacity 160ms ease;\n }\n\n .inspector-window[data-transitioning=\"true\"] {\n transition:\n width 300ms ease,\n height 300ms ease;\n }\n\n .inspector-window[data-docked=\"true\"] {\n border-radius: 0 !important;\n box-shadow: none !important;\n }\n\n .resize-handle {\n touch-action: none;\n user-select: none;\n }\n\n .dock-resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: 10px;\n height: 100%;\n cursor: ew-resize;\n touch-action: none;\n z-index: 50;\n background: transparent;\n }\n\n .tooltip-target {\n position: relative;\n }\n\n .tooltip-target::after {\n content: attr(data-tooltip);\n position: absolute;\n top: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%) translateY(-4px);\n white-space: nowrap;\n background: rgba(17, 24, 39, 0.95);\n color: white;\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 10px;\n line-height: 1.2;\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);\n opacity: 0;\n pointer-events: none;\n transition:\n opacity 120ms ease,\n transform 120ms ease;\n z-index: 4000;\n }\n\n .tooltip-target:hover::after {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n .announcement-preview {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n min-width: 300px;\n max-width: 300px;\n background: white;\n color: #111827;\n font-size: 13px;\n line-height: 1.4;\n border-radius: 12px;\n box-shadow: 0 12px 28px rgba(15, 23, 42, 0.22);\n padding: 10px 12px;\n display: inline-flex;\n align-items: flex-start;\n gap: 8px;\n z-index: 4500;\n animation: fade-slide-in 160ms ease;\n border: 1px solid rgba(148, 163, 184, 0.35);\n white-space: normal;\n word-break: break-word;\n text-align: left;\n }\n\n .announcement-preview[data-side=\"left\"] {\n right: 100%;\n margin-right: 10px;\n }\n\n .announcement-preview[data-side=\"right\"] {\n left: 100%;\n margin-left: 10px;\n }\n\n .announcement-preview__arrow {\n position: absolute;\n width: 10px;\n height: 10px;\n background: white;\n border: 1px solid rgba(148, 163, 184, 0.35);\n transform: rotate(45deg);\n top: 50%;\n margin-top: -5px;\n z-index: -1;\n }\n\n .announcement-preview[data-side=\"left\"] .announcement-preview__arrow {\n right: -5px;\n box-shadow: 6px -6px 10px rgba(15, 23, 42, 0.12);\n }\n\n .announcement-preview[data-side=\"right\"] .announcement-preview__arrow {\n left: -5px;\n box-shadow: -6px 6px 10px rgba(15, 23, 42, 0.12);\n }\n\n .announcement-dismiss {\n color: #6b7280;\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 8px;\n border: 1px solid rgba(148, 163, 184, 0.5);\n background: rgba(248, 250, 252, 0.9);\n transition:\n background 120ms ease,\n color 120ms ease;\n }\n\n .announcement-dismiss:hover {\n background: rgba(241, 245, 249, 1);\n color: #111827;\n }\n\n .announcement-content {\n color: #111827;\n font-size: 14px;\n line-height: 1.6;\n }\n\n .announcement-content h1,\n .announcement-content h2,\n .announcement-content h3 {\n font-weight: 700;\n margin: 0.4rem 0 0.2rem;\n }\n\n .announcement-content h1 {\n font-size: 1.1rem;\n }\n\n .announcement-content h2 {\n font-size: 1rem;\n }\n\n .announcement-content h3 {\n font-size: 0.95rem;\n }\n\n .announcement-content p {\n margin: 0.25rem 0;\n }\n\n .announcement-content ul {\n list-style: disc;\n padding-left: 1.25rem;\n margin: 0.3rem 0;\n }\n\n .announcement-content ol {\n list-style: decimal;\n padding-left: 1.25rem;\n margin: 0.3rem 0;\n }\n\n .announcement-content a {\n color: #0f766e;\n text-decoration: underline;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n window.addEventListener(\n \"pointerdown\",\n this.handleGlobalPointerDown as EventListener,\n );\n\n // Load state early (before first render) so menu selection is correct\n this.hydrateStateFromStorageEarly();\n this.tryAutoAttachCore();\n this.ensureAnnouncementLoading();\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"resize\", this.handleResize);\n window.removeEventListener(\n \"pointerdown\",\n this.handleGlobalPointerDown as EventListener,\n );\n }\n // Clear pending body-transition timers to prevent post-teardown errors\n for (const id of this.bodyTransitionTimeoutIds) {\n clearTimeout(id);\n }\n this.bodyTransitionTimeoutIds.clear();\n if (this.transitionTimeoutId !== null) {\n clearTimeout(this.transitionTimeoutId);\n this.transitionTimeoutId = null;\n }\n this.removeDockStyles(true); // Clean up any docking styles, skip transition\n this.detachFromCore();\n }\n\n firstUpdated(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (!this._core) {\n this.tryAutoAttachCore();\n }\n\n this.measureContext(\"button\");\n this.measureContext(\"window\");\n\n this.contextState.button.anchor = { horizontal: \"right\", vertical: \"top\" };\n this.contextState.button.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.contextState.window.anchor = { horizontal: \"right\", vertical: \"top\" };\n this.contextState.window.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.hydrateStateFromStorage();\n\n // Apply docking styles if open and docked (skip transition on initial load)\n if (this.isOpen && this.dockMode !== \"floating\") {\n this.applyDockStyles(true);\n }\n\n this.applyAnchorPosition(\"button\");\n\n if (this.dockMode === \"floating\") {\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n }\n\n this.ensureAnnouncementLoading();\n\n this.updateHostTransform(this.isOpen ? \"window\" : \"button\");\n }\n\n render() {\n return this.isOpen ? this.renderWindow() : this.renderButton();\n }\n\n private renderButton() {\n const buttonClasses = [\n \"console-button\",\n \"group\",\n \"relative\",\n \"pointer-events-auto\",\n \"inline-flex\",\n \"h-12\",\n \"w-12\",\n \"items-center\",\n \"justify-center\",\n \"rounded-full\",\n \"border\",\n \"border-white/20\",\n \"bg-slate-950/95\",\n \"text-xs\",\n \"font-medium\",\n \"text-white\",\n \"ring-1\",\n \"ring-white/10\",\n \"backdrop-blur-md\",\n \"transition\",\n \"hover:border-white/30\",\n \"hover:bg-slate-900/95\",\n \"hover:scale-105\",\n \"focus-visible:outline\",\n \"focus-visible:outline-2\",\n \"focus-visible:outline-offset-2\",\n \"focus-visible:outline-rose-500\",\n \"touch-none\",\n \"select-none\",\n this.isDragging ? \"cursor-grabbing\" : \"cursor-grab\",\n ].join(\" \");\n\n return html`\n <button\n class=${buttonClasses}\n type=\"button\"\n aria-label=\"Web Inspector\"\n data-drag-context=\"button\"\n data-dragging=${\n this.isDragging && this.pointerContext === \"button\" ? \"true\" : \"false\"\n }\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n @click=${this.handleButtonClick}\n >\n ${this.renderAnnouncementPreview()}\n <img\n src=${inspectorLogoIconUrl}\n alt=\"Inspector logo\"\n class=\"h-5 w-auto\"\n loading=\"lazy\"\n />\n </button>\n `;\n }\n\n private renderWindow() {\n const windowState = this.contextState.window;\n const isDocked = this.dockMode !== \"floating\";\n const isTransitioning = this.hasAttribute(\"data-transitioning\");\n\n const windowStyles = isDocked\n ? this.getDockedWindowStyles()\n : {\n width: `${Math.round(windowState.size.width)}px`,\n height: `${Math.round(windowState.size.height)}px`,\n minWidth: `${MIN_WINDOW_WIDTH}px`,\n minHeight: `${MIN_WINDOW_HEIGHT}px`,\n };\n\n const hasContextDropdown = this.contextOptions.length > 0;\n const contextDropdown = hasContextDropdown\n ? this.renderContextDropdown()\n : nothing;\n const coreStatus = this.getCoreStatusSummary();\n const agentSelector = hasContextDropdown\n ? contextDropdown\n : html`\n <div\n class=\"flex items-center gap-2 rounded-md border border-dashed border-gray-200 px-2 py-1 text-xs text-gray-400\"\n >\n <span>${this.renderIcon(\"Bot\")}</span>\n <span class=\"truncate\">No agents available</span>\n </div>\n `;\n\n return html`\n <section\n class=\"inspector-window pointer-events-auto relative flex flex-col overflow-hidden rounded-xl border border-gray-200 bg-white text-gray-900 shadow-lg\"\n style=${styleMap(windowStyles)}\n data-docked=${isDocked}\n data-transitioning=${isTransitioning}\n >\n ${\n isDocked\n ? html`\n <div\n class=\"dock-resize-handle pointer-events-auto\"\n role=\"presentation\"\n aria-hidden=\"true\"\n @pointerdown=${this.handleResizePointerDown}\n @pointermove=${this.handleResizePointerMove}\n @pointerup=${this.handleResizePointerUp}\n @pointercancel=${this.handleResizePointerCancel}\n ></div>\n `\n : nothing\n }\n <div\n class=\"flex flex-1 flex-col overflow-hidden bg-white text-gray-800\"\n >\n <div\n class=\"drag-handle relative z-30 flex flex-col border-b border-gray-200 bg-white/95 backdrop-blur-sm ${\n isDocked\n ? \"\"\n : this.isDragging && this.pointerContext === \"window\"\n ? \"cursor-grabbing\"\n : \"cursor-grab\"\n }\"\n data-drag-context=\"window\"\n @pointerdown=${isDocked ? undefined : this.handlePointerDown}\n @pointermove=${isDocked ? undefined : this.handlePointerMove}\n @pointerup=${isDocked ? undefined : this.handlePointerUp}\n @pointercancel=${isDocked ? undefined : this.handlePointerCancel}\n >\n <div class=\"flex flex-wrap items-center gap-3 px-4 py-3\">\n <div class=\"flex items-center min-w-0\">\n <img\n src=${inspectorLogoUrl}\n alt=\"Inspector logo\"\n class=\"h-6 w-auto\"\n loading=\"lazy\"\n />\n </div>\n <div class=\"ml-auto flex min-w-0 items-center gap-2\">\n <div class=\"min-w-[160px] max-w-xs\">${agentSelector}</div>\n <div class=\"flex items-center gap-1\">\n ${this.renderDockControls()}\n <button\n class=\"flex h-8 w-8 items-center justify-center rounded-md text-gray-400 transition hover:bg-gray-100 hover:text-gray-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\"\n type=\"button\"\n aria-label=\"Close Web Inspector\"\n @pointerdown=${this.handleClosePointerDown}\n @click=${this.handleCloseClick}\n >\n ${this.renderIcon(\"X\")}\n </button>\n </div>\n </div>\n </div>\n <div\n class=\"flex flex-wrap items-center gap-2 border-t border-gray-100 px-3 py-2 text-xs\"\n >\n ${this.menuItems.map(({ key, label, icon }) => {\n const isSelected = this.selectedMenu === key;\n const tabClasses = [\n \"inline-flex items-center gap-2 rounded-md px-3 py-2 transition focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-300\",\n isSelected\n ? \"bg-gray-900 text-white shadow-sm\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n ].join(\" \");\n\n return html`\n <button\n type=\"button\"\n class=${tabClasses}\n aria-pressed=${isSelected}\n @click=${() => this.handleMenuSelect(key)}\n >\n <span\n class=\"text-gray-400 ${isSelected ? \"text-white\" : \"\"}\"\n >\n ${this.renderIcon(icon)}\n </span>\n <span>${label}</span>\n </button>\n `;\n })}\n </div>\n </div>\n <div class=\"flex flex-1 flex-col overflow-hidden\">\n <div class=\"flex-1 overflow-auto\">\n ${this.renderAnnouncementPanel()}\n ${this.renderCoreWarningBanner()} ${this.renderMainContent()}\n <slot></slot>\n </div>\n <div class=\"border-t border-gray-200 bg-gray-50 px-4 py-2\">\n <div\n class=\"flex items-center gap-2 rounded-md px-3 py-2 text-xs ${coreStatus.tone} w-full overflow-hidden my-1\"\n title=${coreStatus.description}\n >\n <span\n class=\"flex h-6 w-6 items-center justify-center rounded bg-white/60\"\n >\n ${this.renderIcon(\"Activity\")}\n </span>\n <span class=\"font-medium\">${coreStatus.label}</span>\n <span class=\"truncate text-[11px] opacity-80\"\n >${coreStatus.description}</span\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"resize-handle pointer-events-auto absolute bottom-1 right-1 flex h-5 w-5 cursor-nwse-resize items-center justify-center text-gray-400 transition hover:text-gray-600\"\n role=\"presentation\"\n aria-hidden=\"true\"\n @pointerdown=${this.handleResizePointerDown}\n @pointermove=${this.handleResizePointerMove}\n @pointerup=${this.handleResizePointerUp}\n @pointercancel=${this.handleResizePointerCancel}\n >\n <svg\n class=\"h-3 w-3\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-width=\"1.5\"\n >\n <path d=\"M5 15L15 5\" />\n <path d=\"M9 15L15 9\" />\n </svg>\n </div>\n </section>\n `;\n }\n\n private hydrateStateFromStorageEarly(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(INSPECTOR_STORAGE_KEY);\n if (!persisted) {\n return;\n }\n\n // Restore the open/closed state\n if (typeof persisted.isOpen === \"boolean\") {\n this.isOpen = persisted.isOpen;\n }\n\n // Restore the dock mode\n if (isValidDockMode(persisted.dockMode)) {\n this.dockMode = persisted.dockMode;\n }\n\n // Restore selected menu\n if (typeof persisted.selectedMenu === \"string\") {\n const validMenu = this.menuItems.find(\n (item) => item.key === persisted.selectedMenu,\n );\n if (validMenu) {\n this.selectedMenu = validMenu.key;\n }\n }\n\n // Restore selected context (agent), will be validated later against available agents\n if (typeof persisted.selectedContext === \"string\") {\n this.selectedContext = persisted.selectedContext;\n this.pendingSelectedContext = persisted.selectedContext;\n }\n }\n\n private hydrateStateFromStorage(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(INSPECTOR_STORAGE_KEY);\n if (!persisted) {\n return;\n }\n\n const persistedButton = persisted.button;\n if (persistedButton) {\n if (isValidAnchor(persistedButton.anchor)) {\n this.contextState.button.anchor = persistedButton.anchor;\n }\n\n if (isValidPosition(persistedButton.anchorOffset)) {\n this.contextState.button.anchorOffset = persistedButton.anchorOffset;\n }\n\n if (typeof persistedButton.hasCustomPosition === \"boolean\") {\n this.hasCustomPosition.button = persistedButton.hasCustomPosition;\n }\n }\n\n const persistedWindow = persisted.window;\n if (persistedWindow) {\n if (isValidAnchor(persistedWindow.anchor)) {\n this.contextState.window.anchor = persistedWindow.anchor;\n }\n\n if (isValidPosition(persistedWindow.anchorOffset)) {\n this.contextState.window.anchorOffset = persistedWindow.anchorOffset;\n }\n\n if (isValidSize(persistedWindow.size)) {\n // Now clampWindowSize will use the correct minimum based on dockMode\n this.contextState.window.size = this.clampWindowSize(\n persistedWindow.size,\n );\n }\n\n if (typeof persistedWindow.hasCustomPosition === \"boolean\") {\n this.hasCustomPosition.window = persistedWindow.hasCustomPosition;\n }\n }\n\n if (typeof persisted.selectedContext === \"string\") {\n this.selectedContext = persisted.selectedContext;\n this.pendingSelectedContext = persisted.selectedContext;\n }\n }\n\n private get activeContext(): ContextKey {\n return this.isOpen ? \"window\" : \"button\";\n }\n\n private handlePointerDown = (event: PointerEvent) => {\n // Don't allow dragging when docked\n if (this.dockMode !== \"floating\" && this.isOpen) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n const contextAttr = target?.dataset.dragContext;\n const context: ContextKey = contextAttr === \"window\" ? \"window\" : \"button\";\n\n const eventTarget = event.target as HTMLElement | null;\n if (context === \"window\" && eventTarget?.closest(\"button\")) {\n return;\n }\n\n this.pointerContext = context;\n this.measureContext(context);\n\n event.preventDefault();\n\n this.pointerId = event.pointerId;\n this.dragStart = { x: event.clientX, y: event.clientY };\n const state = this.contextState[context];\n this.dragOffset = {\n x: event.clientX - state.position.x,\n y: event.clientY - state.position.y,\n };\n this.isDragging = false;\n this.draggedDuringInteraction = false;\n this.ignoreNextButtonClick = false;\n\n target?.setPointerCapture?.(this.pointerId);\n };\n\n private handlePointerMove = (event: PointerEvent) => {\n if (\n this.pointerId !== event.pointerId ||\n !this.dragStart ||\n !this.pointerContext\n ) {\n return;\n }\n\n const distance = Math.hypot(\n event.clientX - this.dragStart.x,\n event.clientY - this.dragStart.y,\n );\n if (!this.isDragging && distance < DRAG_THRESHOLD) {\n return;\n }\n\n event.preventDefault();\n this.setDragging(true);\n this.draggedDuringInteraction = true;\n\n const desired: Position = {\n x: event.clientX - this.dragOffset.x,\n y: event.clientY - this.dragOffset.y,\n };\n\n const constrained = this.constrainToViewport(desired, this.pointerContext);\n this.contextState[this.pointerContext].position = constrained;\n this.updateHostTransform(this.pointerContext);\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.pointerId)) {\n target.releasePointerCapture(this.pointerId);\n }\n\n const context = this.pointerContext ?? this.activeContext;\n\n if (this.isDragging && this.pointerContext) {\n event.preventDefault();\n this.setDragging(false);\n if (this.pointerContext === \"window\") {\n this.updateAnchorFromPosition(this.pointerContext);\n this.hasCustomPosition.window = true;\n this.applyAnchorPosition(this.pointerContext);\n } else if (this.pointerContext === \"button\") {\n // Snap button to nearest corner\n this.snapButtonToCorner();\n this.hasCustomPosition.button = true;\n if (this.draggedDuringInteraction) {\n this.ignoreNextButtonClick = true;\n }\n }\n } else if (\n context === \"button\" &&\n !this.isOpen &&\n !this.draggedDuringInteraction\n ) {\n this.openInspector();\n }\n\n this.resetPointerTracking();\n };\n\n private handlePointerCancel = (event: PointerEvent) => {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.pointerId)) {\n target.releasePointerCapture(this.pointerId);\n }\n\n this.resetPointerTracking();\n };\n\n private handleButtonClick = (event: Event) => {\n if (this.isDragging) {\n event.preventDefault();\n return;\n }\n\n if (this.ignoreNextButtonClick) {\n event.preventDefault();\n this.ignoreNextButtonClick = false;\n return;\n }\n\n if (!this.isOpen) {\n event.preventDefault();\n this.openInspector();\n }\n };\n\n private handleClosePointerDown = (event: PointerEvent) => {\n event.stopPropagation();\n event.preventDefault();\n };\n\n private handleCloseClick = () => {\n this.closeInspector();\n };\n\n private handleResizePointerDown = (event: PointerEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n this.hasCustomPosition.window = true;\n this.isResizing = true;\n this.resizePointerId = event.pointerId;\n this.resizeStart = { x: event.clientX, y: event.clientY };\n this.resizeInitialSize = { ...this.contextState.window.size };\n\n // Remove transition from body during resize to prevent lag\n if (document.body && this.dockMode !== \"floating\") {\n document.body.style.transition = \"\";\n }\n\n const target = event.currentTarget as HTMLElement | null;\n target?.setPointerCapture?.(event.pointerId);\n };\n\n private handleResizePointerMove = (event: PointerEvent) => {\n if (\n !this.isResizing ||\n this.resizePointerId !== event.pointerId ||\n !this.resizeStart ||\n !this.resizeInitialSize\n ) {\n return;\n }\n\n event.preventDefault();\n\n const deltaX = event.clientX - this.resizeStart.x;\n const deltaY = event.clientY - this.resizeStart.y;\n const state = this.contextState.window;\n\n // For docked states, only resize in the appropriate dimension\n if (this.dockMode === \"docked-left\") {\n // Only resize width for left dock\n state.size = this.clampWindowSize({\n width: this.resizeInitialSize.width + deltaX,\n height: state.size.height,\n });\n // Update the body margin\n if (document.body) {\n document.body.style.marginLeft = `${state.size.width}px`;\n }\n } else {\n // Full resize for floating mode\n state.size = this.clampWindowSize({\n width: this.resizeInitialSize.width + deltaX,\n height: this.resizeInitialSize.height + deltaY,\n });\n this.keepPositionWithinViewport(\"window\");\n this.updateAnchorFromPosition(\"window\");\n }\n\n this.requestUpdate();\n this.updateHostTransform(\"window\");\n };\n\n private handleResizePointerUp = (event: PointerEvent) => {\n if (this.resizePointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.resizePointerId)) {\n target.releasePointerCapture(this.resizePointerId);\n }\n\n // Only update anchor position for floating mode\n if (this.dockMode === \"floating\") {\n this.updateAnchorFromPosition(\"window\");\n this.applyAnchorPosition(\"window\");\n }\n\n // Persist the new size after resize completes\n this.persistState();\n this.resetResizeTracking();\n };\n\n private handleResizePointerCancel = (event: PointerEvent) => {\n if (this.resizePointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.resizePointerId)) {\n target.releasePointerCapture(this.resizePointerId);\n }\n\n // Only update anchor position for floating mode\n if (this.dockMode === \"floating\") {\n this.updateAnchorFromPosition(\"window\");\n this.applyAnchorPosition(\"window\");\n }\n\n // Persist the new size after resize completes\n this.persistState();\n this.resetResizeTracking();\n };\n\n private handleResize = () => {\n this.measureContext(\"button\");\n this.applyAnchorPosition(\"button\");\n\n this.measureContext(\"window\");\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n\n this.updateHostTransform();\n };\n\n private measureContext(context: ContextKey): void {\n const selector =\n context === \"window\" ? \".inspector-window\" : \".console-button\";\n const element = this.renderRoot?.querySelector(\n selector,\n ) as HTMLElement | null;\n if (!element) {\n return;\n }\n const fallback =\n context === \"window\" ? DEFAULT_WINDOW_SIZE : DEFAULT_BUTTON_SIZE;\n updateSizeFromElement(this.contextState[context], element, fallback);\n }\n\n private centerContext(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n centerContextHelper(this.contextState[context], viewport, EDGE_MARGIN);\n\n if (context === this.activeContext) {\n this.updateHostTransform(context);\n }\n\n this.hasCustomPosition[context] = false;\n this.persistState();\n }\n\n private ensureWindowPlacement(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (!this.hasCustomPosition.window) {\n this.centerContext(\"window\");\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(this.contextState.window, viewport, EDGE_MARGIN);\n updateAnchorFromPositionHelper(\n this.contextState.window,\n viewport,\n EDGE_MARGIN,\n );\n this.updateHostTransform(\"window\");\n this.persistState();\n }\n\n private constrainToViewport(\n position: Position,\n context: ContextKey,\n ): Position {\n if (typeof window === \"undefined\") {\n return position;\n }\n\n const viewport = this.getViewportSize();\n return constrainToViewport(\n this.contextState[context],\n position,\n viewport,\n EDGE_MARGIN,\n );\n }\n\n private keepPositionWithinViewport(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(\n this.contextState[context],\n viewport,\n EDGE_MARGIN,\n );\n }\n\n private getViewportSize(): Size {\n if (typeof window === \"undefined\") {\n return { ...DEFAULT_WINDOW_SIZE };\n }\n\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n private persistState(): void {\n const state: PersistedState = {\n button: {\n anchor: this.contextState.button.anchor,\n anchorOffset: this.contextState.button.anchorOffset,\n hasCustomPosition: this.hasCustomPosition.button,\n },\n window: {\n anchor: this.contextState.window.anchor,\n anchorOffset: this.contextState.window.anchorOffset,\n size: {\n width: Math.round(this.contextState.window.size.width),\n height: Math.round(this.contextState.window.size.height),\n },\n hasCustomPosition: this.hasCustomPosition.window,\n },\n isOpen: this.isOpen,\n dockMode: this.dockMode,\n selectedMenu: this.selectedMenu,\n selectedContext: this.selectedContext,\n };\n saveInspectorState(INSPECTOR_STORAGE_KEY, state);\n this.pendingSelectedContext = state.selectedContext ?? null;\n }\n\n private clampWindowSize(size: Size): Size {\n // Use smaller minimum width when docked left\n const minWidth =\n this.dockMode === \"docked-left\"\n ? MIN_WINDOW_WIDTH_DOCKED_LEFT\n : MIN_WINDOW_WIDTH;\n\n if (typeof window === \"undefined\") {\n return {\n width: Math.max(minWidth, size.width),\n height: Math.max(MIN_WINDOW_HEIGHT, size.height),\n };\n }\n\n const viewport = this.getViewportSize();\n return clampSizeToViewport(\n size,\n viewport,\n EDGE_MARGIN,\n minWidth,\n MIN_WINDOW_HEIGHT,\n );\n }\n\n private setDockMode(mode: DockMode): void {\n if (this.dockMode === mode) {\n return;\n }\n\n // Add transition class for smooth dock mode changes\n this.startHostTransition();\n\n // Clean up previous dock state\n this.removeDockStyles();\n\n this.dockMode = mode;\n\n if (mode !== \"floating\") {\n // For docking, set the target size immediately so body margins are correct\n if (mode === \"docked-left\") {\n this.contextState.window.size.width = DOCKED_LEFT_WIDTH;\n }\n\n // Then apply dock styles with correct sizes\n this.applyDockStyles();\n } else {\n // When floating, set size first then center\n this.contextState.window.size = { ...DEFAULT_WINDOW_SIZE };\n this.centerContext(\"window\");\n }\n\n this.persistState();\n this.requestUpdate();\n this.updateHostTransform(\"window\");\n }\n\n private startHostTransition(duration = 300): void {\n this.setAttribute(\"data-transitioning\", \"true\");\n\n if (this.transitionTimeoutId !== null) {\n clearTimeout(this.transitionTimeoutId);\n }\n\n this.transitionTimeoutId = setTimeout(() => {\n this.removeAttribute(\"data-transitioning\");\n this.transitionTimeoutId = null;\n }, duration);\n }\n\n private applyDockStyles(skipTransition = false): void {\n if (typeof document === \"undefined\" || !document.body) {\n return;\n }\n\n // Save original body margins\n const computedStyle = window.getComputedStyle(document.body);\n this.previousBodyMargins = {\n left: computedStyle.marginLeft,\n bottom: computedStyle.marginBottom,\n };\n\n // Apply transition to body for smooth animation (only when docking, not during resize or initial load)\n if (!this.isResizing && !skipTransition) {\n document.body.style.transition = \"margin 300ms ease\";\n }\n\n // Apply body margins with the actual window sizes\n if (this.dockMode === \"docked-left\") {\n document.body.style.marginLeft = `${this.contextState.window.size.width}px`;\n }\n\n // Remove transition after animation completes\n if (!this.isResizing && !skipTransition) {\n const id = setTimeout(() => {\n this.bodyTransitionTimeoutIds.delete(id);\n if (typeof document !== \"undefined\" && document.body) {\n document.body.style.transition = \"\";\n }\n }, 300);\n this.bodyTransitionTimeoutIds.add(id);\n }\n }\n\n private removeDockStyles(skipTransition = false): void {\n if (typeof document === \"undefined\" || !document.body) {\n return;\n }\n\n // Only add transition if not resizing and not skipping\n if (!this.isResizing && !skipTransition) {\n document.body.style.transition = \"margin 300ms ease\";\n }\n\n // Restore original margins if saved\n if (this.previousBodyMargins) {\n document.body.style.marginLeft = this.previousBodyMargins.left;\n document.body.style.marginBottom = this.previousBodyMargins.bottom;\n this.previousBodyMargins = null;\n } else {\n // Reset to default if no previous values\n document.body.style.marginLeft = \"\";\n document.body.style.marginBottom = \"\";\n }\n\n // Clean up transition after animation completes\n if (!skipTransition) {\n const id = setTimeout(() => {\n this.bodyTransitionTimeoutIds.delete(id);\n if (typeof document !== \"undefined\" && document.body) {\n document.body.style.transition = \"\";\n }\n }, 300);\n this.bodyTransitionTimeoutIds.add(id);\n } else {\n document.body.style.transition = \"\";\n }\n }\n\n private updateHostTransform(context: ContextKey = this.activeContext): void {\n if (context !== this.activeContext) {\n return;\n }\n\n // For docked states, CSS handles positioning with fixed positioning\n if (this.isOpen && this.dockMode === \"docked-left\") {\n this.style.transform = `translate3d(0, 0, 0)`;\n } else {\n const { position } = this.contextState[context];\n this.style.transform = `translate3d(${position.x}px, ${position.y}px, 0)`;\n }\n }\n\n private setDragging(value: boolean): void {\n if (this.isDragging !== value) {\n this.isDragging = value;\n this.requestUpdate();\n }\n }\n\n private updateAnchorFromPosition(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const viewport = this.getViewportSize();\n updateAnchorFromPositionHelper(\n this.contextState[context],\n viewport,\n EDGE_MARGIN,\n );\n }\n\n private snapButtonToCorner(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n const state = this.contextState.button;\n\n // Determine which corner is closest based on center of button\n const centerX = state.position.x + state.size.width / 2;\n const centerY = state.position.y + state.size.height / 2;\n\n const horizontal: Anchor[\"horizontal\"] =\n centerX < viewport.width / 2 ? \"left\" : \"right\";\n const vertical: Anchor[\"vertical\"] =\n centerY < viewport.height / 2 ? \"top\" : \"bottom\";\n\n // Set anchor to nearest corner\n state.anchor = { horizontal, vertical };\n\n // Always use EDGE_MARGIN as offset (pinned to corner)\n state.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n // Apply the anchor position to snap to corner\n this.startHostTransition();\n this.applyAnchorPosition(\"button\");\n }\n\n private applyAnchorPosition(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const viewport = this.getViewportSize();\n applyAnchorPositionHelper(\n this.contextState[context],\n viewport,\n EDGE_MARGIN,\n );\n this.updateHostTransform(context);\n this.persistState();\n }\n\n private resetResizeTracking(): void {\n this.resizePointerId = null;\n this.resizeStart = null;\n this.resizeInitialSize = null;\n this.isResizing = false;\n }\n\n private resetPointerTracking(): void {\n this.pointerId = null;\n this.dragStart = null;\n this.pointerContext = null;\n this.setDragging(false);\n this.draggedDuringInteraction = false;\n }\n\n private openInspector(): void {\n if (this.isOpen) {\n return;\n }\n\n this.showAnnouncementPreview = false; // hide the bubble once the inspector is opened\n\n this.ensureAnnouncementLoading();\n\n this.isOpen = true;\n this.persistState(); // Save the open state\n\n // Apply docking styles if in docked mode\n if (this.dockMode !== \"floating\") {\n this.applyDockStyles();\n }\n\n this.ensureWindowPlacement();\n this.requestUpdate();\n void this.updateComplete.then(() => {\n this.measureContext(\"window\");\n if (this.dockMode === \"floating\") {\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n } else {\n // Update transform for docked position\n this.updateHostTransform(\"window\");\n }\n });\n }\n\n private closeInspector(): void {\n if (!this.isOpen) {\n return;\n }\n\n this.isOpen = false;\n\n // Remove docking styles when closing\n if (this.dockMode !== \"floating\") {\n this.removeDockStyles();\n }\n\n this.persistState(); // Save the closed state\n this.updateHostTransform(\"button\");\n this.requestUpdate();\n void this.updateComplete.then(() => {\n this.measureContext(\"button\");\n this.applyAnchorPosition(\"button\");\n });\n }\n\n private renderIcon(name: LucideIconName) {\n const iconNode = icons[name];\n if (!iconNode) {\n return nothing;\n }\n\n const svgAttrs: Record<string, string | number> = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"1.5\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n class: \"h-3.5 w-3.5\",\n };\n\n const svgMarkup = `<svg ${this.serializeAttributes(svgAttrs)}>${iconNode\n .map(([tag, attrs]) => `<${tag} ${this.serializeAttributes(attrs)} />`)\n .join(\"\")}</svg>`;\n\n return unsafeHTML(svgMarkup);\n }\n\n private renderDockControls() {\n if (this.dockMode === \"floating\") {\n // Show dock left button\n return html`\n <button\n class=\"flex h-8 w-8 items-center justify-center rounded-md text-gray-400 transition hover:bg-gray-100 hover:text-gray-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\"\n type=\"button\"\n aria-label=\"Dock to left\"\n title=\"Dock Left\"\n @click=${() => this.handleDockClick(\"docked-left\")}\n >\n ${this.renderIcon(\"PanelLeft\")}\n </button>\n `;\n } else {\n // Show float button\n return html`\n <button\n class=\"flex h-8 w-8 items-center justify-center rounded-md text-gray-400 transition hover:bg-gray-100 hover:text-gray-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\"\n type=\"button\"\n aria-label=\"Float window\"\n title=\"Float\"\n @click=${() => this.handleDockClick(\"floating\")}\n >\n ${this.renderIcon(\"Maximize2\")}\n </button>\n `;\n }\n }\n\n private getDockedWindowStyles(): Record<string, string> {\n if (this.dockMode === \"docked-left\") {\n return {\n position: \"fixed\",\n top: \"0\",\n left: \"0\",\n bottom: \"0\",\n width: `${Math.round(this.contextState.window.size.width)}px`,\n height: \"100vh\",\n minWidth: `${MIN_WINDOW_WIDTH_DOCKED_LEFT}px`,\n borderRadius: \"0\",\n };\n }\n // Default to floating styles\n return {\n width: `${Math.round(this.contextState.window.size.width)}px`,\n height: `${Math.round(this.contextState.window.size.height)}px`,\n minWidth: `${MIN_WINDOW_WIDTH}px`,\n minHeight: `${MIN_WINDOW_HEIGHT}px`,\n };\n }\n\n private handleDockClick(mode: DockMode): void {\n this.setDockMode(mode);\n }\n\n private serializeAttributes(\n attributes: Record<string, string | number | undefined>,\n ): string {\n return Object.entries(attributes)\n .filter(\n ([key, value]) =>\n key !== \"key\" &&\n value !== undefined &&\n value !== null &&\n value !== \"\",\n )\n .map(\n ([key, value]) => `${key}=\"${String(value).replace(/\"/g, \"&quot;\")}\"`,\n )\n .join(\" \");\n }\n\n private sanitizeForLogging(\n value: unknown,\n depth = 0,\n seen = new WeakSet<object>(),\n ): SanitizedValue {\n if (value === undefined) {\n return \"[undefined]\";\n }\n\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (\n typeof value === \"bigint\" ||\n typeof value === \"symbol\" ||\n typeof value === \"function\"\n ) {\n return String(value);\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n if (depth >= 4) {\n return \"[Truncated depth]\" as SanitizedValue;\n }\n return value.map((item) =>\n this.sanitizeForLogging(item, depth + 1, seen),\n );\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value as object)) {\n return \"[Circular]\" as SanitizedValue;\n }\n seen.add(value as object);\n\n if (depth >= 4) {\n return \"[Truncated depth]\" as SanitizedValue;\n }\n\n const result: Record<string, SanitizedValue> = {};\n for (const [key, entry] of Object.entries(\n value as Record<string, unknown>,\n )) {\n result[key] = this.sanitizeForLogging(entry, depth + 1, seen);\n }\n return result;\n }\n\n return String(value);\n }\n\n private normalizeEventPayload(\n _type: InspectorAgentEventType,\n payload: unknown,\n ): SanitizedValue {\n if (payload && typeof payload === \"object\" && \"event\" in payload) {\n const { event, ...rest } = payload as Record<string, unknown>;\n const cleaned =\n Object.keys(rest).length === 0 ? event : { event, ...rest };\n return this.sanitizeForLogging(cleaned);\n }\n\n return this.sanitizeForLogging(payload);\n }\n\n private normalizeMessageContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (\n content &&\n typeof content === \"object\" &&\n \"text\" in (content as Record<string, unknown>)\n ) {\n const maybeText = (content as Record<string, unknown>).text;\n if (typeof maybeText === \"string\") {\n return maybeText;\n }\n }\n\n if (content === null || content === undefined) {\n return \"\";\n }\n\n if (typeof content === \"object\") {\n try {\n return JSON.stringify(this.sanitizeForLogging(content));\n } catch {\n return \"\";\n }\n }\n\n return String(content);\n }\n\n private normalizeToolCalls(raw: unknown): InspectorToolCall[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .map((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n const call = entry as Record<string, unknown>;\n const fn = call.function as Record<string, unknown> | undefined;\n const functionName =\n typeof fn?.name === \"string\"\n ? fn.name\n : typeof call.toolName === \"string\"\n ? call.toolName\n : undefined;\n const args =\n fn && \"arguments\" in fn\n ? (fn as Record<string, unknown>).arguments\n : call.arguments;\n\n const normalized: InspectorToolCall = {\n id: typeof call.id === \"string\" ? call.id : undefined,\n toolName:\n typeof call.toolName === \"string\" ? call.toolName : functionName,\n status: typeof call.status === \"string\" ? call.status : undefined,\n };\n\n if (functionName) {\n normalized.function = {\n name: functionName,\n arguments: this.sanitizeForLogging(args),\n };\n }\n\n return normalized;\n })\n .filter((call): call is InspectorToolCall => Boolean(call));\n }\n\n private normalizeAgentMessage(message: unknown): InspectorMessage | null {\n if (!message || typeof message !== \"object\") {\n return null;\n }\n\n const raw = message as Record<string, unknown>;\n const role = typeof raw.role === \"string\" ? raw.role : \"unknown\";\n const contentText = this.normalizeMessageContent(raw.content);\n const toolCalls = this.normalizeToolCalls(raw.toolCalls);\n\n return {\n id: typeof raw.id === \"string\" ? raw.id : undefined,\n role,\n contentText,\n contentRaw:\n raw.content !== undefined\n ? this.sanitizeForLogging(raw.content)\n : undefined,\n toolCalls,\n };\n }\n\n private normalizeAgentMessages(messages: unknown): InspectorMessage[] | null {\n if (!Array.isArray(messages)) {\n return null;\n }\n\n const normalized = messages\n .map((message) => this.normalizeAgentMessage(message))\n .filter((msg): msg is InspectorMessage => msg !== null);\n\n return normalized;\n }\n\n private normalizeContextStore(\n context: Readonly<Record<string, unknown>> | null | undefined,\n ): Record<string, { description?: string; value: unknown }> {\n if (!context || typeof context !== \"object\") {\n return {};\n }\n\n const normalized: Record<string, { description?: string; value: unknown }> =\n {};\n for (const [key, entry] of Object.entries(context)) {\n if (\n entry &&\n typeof entry === \"object\" &&\n \"value\" in (entry as Record<string, unknown>)\n ) {\n const candidate = entry as Record<string, unknown>;\n const description =\n typeof candidate.description === \"string\" &&\n candidate.description.trim().length > 0\n ? candidate.description\n : undefined;\n normalized[key] = { description, value: candidate.value };\n } else {\n normalized[key] = { value: entry };\n }\n }\n\n return normalized;\n }\n\n private contextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ];\n\n private selectedContext = \"all-agents\";\n private expandedRows: Set<string> = new Set();\n private copiedEvents: Set<string> = new Set();\n private expandedTools: Set<string> = new Set();\n private expandedContextItems: Set<string> = new Set();\n private copiedContextItems: Set<string> = new Set();\n\n private getSelectedMenu(): MenuItem {\n const found = this.menuItems.find((item) => item.key === this.selectedMenu);\n return found ?? this.menuItems[0]!;\n }\n\n private renderCoreWarningBanner() {\n if (this._core) {\n return nothing;\n }\n\n return html`\n <div\n class=\"mx-4 my-3 flex items-start gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800\"\n >\n <span class=\"mt-0.5 shrink-0 text-amber-600\"\n >${this.renderIcon(\"AlertTriangle\")}</span\n >\n <div class=\"space-y-1\">\n <div class=\"font-semibold text-amber-900\">\n CopilotKit core not attached\n </div>\n <p class=\"text-[11px] leading-snug text-amber-800\">\n Pass a live <code>CopilotKitCore</code> instance to\n <code>&lt;cpk-web-inspector&gt;</code> or expose it on\n <code>window.__COPILOTKIT_CORE__</code> for auto-attach.\n </p>\n </div>\n </div>\n `;\n }\n\n private getCoreStatusSummary(): {\n label: string;\n tone: string;\n description: string;\n } {\n if (!this._core) {\n return {\n label: \"Core not attached\",\n tone: \"border border-amber-200 bg-amber-50 text-amber-800\",\n description:\n \"Pass a CopilotKitCore instance to <cpk-web-inspector> or enable auto-attach.\",\n };\n }\n\n const status =\n this.runtimeStatus ?? CopilotKitCoreRuntimeConnectionStatus.Disconnected;\n const lastErrorMessage = this.lastCoreError?.message;\n\n if (status === CopilotKitCoreRuntimeConnectionStatus.Error) {\n return {\n label: \"Runtime error\",\n tone: \"border border-rose-200 bg-rose-50 text-rose-700\",\n description:\n lastErrorMessage ?? \"CopilotKit runtime reported an error.\",\n };\n }\n\n if (status === CopilotKitCoreRuntimeConnectionStatus.Connecting) {\n return {\n label: \"Connecting\",\n tone: \"border border-amber-200 bg-amber-50 text-amber-800\",\n description: \"Waiting for CopilotKit runtime to finish connecting.\",\n };\n }\n\n if (status === CopilotKitCoreRuntimeConnectionStatus.Connected) {\n return {\n label: \"Connected\",\n tone: \"border border-emerald-200 bg-emerald-50 text-emerald-700\",\n description: \"Live runtime connection established.\",\n };\n }\n\n return {\n label: \"Disconnected\",\n tone: \"border border-gray-200 bg-gray-50 text-gray-700\",\n description:\n lastErrorMessage ?? \"Waiting for CopilotKit runtime to connect.\",\n };\n }\n\n private renderMainContent() {\n if (this.selectedMenu === \"ag-ui-events\") {\n return this.renderEventsTable();\n }\n\n if (this.selectedMenu === \"agents\") {\n return this.renderAgentsView();\n }\n\n if (this.selectedMenu === \"frontend-tools\") {\n return this.renderToolsView();\n }\n\n if (this.selectedMenu === \"agent-context\") {\n return this.renderContextView();\n }\n\n return nothing;\n }\n\n private renderEventsTable() {\n const events = this.getEventsForSelectedContext();\n const filteredEvents = this.filterEvents(events);\n const selectedLabel =\n this.selectedContext === \"all-agents\"\n ? \"all agents\"\n : `agent ${this.selectedContext}`;\n\n if (events.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Zap\")}\n </div>\n <p class=\"text-sm text-gray-600\">No events yet</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Trigger an agent run to see live activity.\n </p>\n </div>\n </div>\n `;\n }\n\n if (filteredEvents.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md space-y-3\">\n <div\n class=\"flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Filter\")}\n </div>\n <p class=\"text-sm text-gray-600\">\n No events match the current filters.\n </p>\n <div>\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-1 rounded-md bg-gray-900 px-3 py-1.5 text-[11px] font-medium text-white transition hover:bg-gray-800\"\n @click=${this.resetEventFilters}\n >\n ${this.renderIcon(\"RefreshCw\")}\n <span>Reset filters</span>\n </button>\n </div>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"flex h-full flex-col\">\n <div\n class=\"flex flex-col gap-1.5 border-b border-gray-200 bg-white px-4 py-2.5\"\n >\n <div class=\"flex flex-wrap items-center gap-2\">\n <div class=\"relative min-w-[200px] flex-1\">\n <input\n type=\"search\"\n class=\"w-full rounded-md border border-gray-200 px-3 py-1.5 text-[11px] text-gray-700 shadow-sm outline-none ring-1 ring-transparent transition focus:border-gray-300 focus:ring-gray-200\"\n placeholder=\"Search agent, type, payload\"\n .value=${this.eventFilterText}\n @input=${this.handleEventFilterInput}\n />\n </div>\n <select\n class=\"w-40 rounded-md border border-gray-200 bg-white px-2 py-1.5 text-[11px] text-gray-700 shadow-sm outline-none transition focus:border-gray-300 focus:ring-2 focus:ring-gray-200\"\n .value=${this.eventTypeFilter}\n @change=${this.handleEventTypeChange}\n >\n <option value=\"all\">All event types</option>\n ${AGENT_EVENT_TYPES.map(\n (type) =>\n html`<option value=${type}>\n ${type.toLowerCase().replace(/_/g, \" \")}\n </option>`,\n )}\n </select>\n <div class=\"flex items-center gap-1 text-[11px]\">\n <button\n type=\"button\"\n class=\"tooltip-target flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 bg-white text-gray-600 transition hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50\"\n title=\"Reset filters\"\n data-tooltip=\"Reset filters\"\n aria-label=\"Reset filters\"\n @click=${this.resetEventFilters}\n ?disabled=${\n !this.eventFilterText && this.eventTypeFilter === \"all\"\n }\n >\n ${this.renderIcon(\"RotateCw\")}\n </button>\n <button\n type=\"button\"\n class=\"tooltip-target flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 bg-white text-gray-600 transition hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50\"\n title=\"Export JSON\"\n data-tooltip=\"Export JSON\"\n aria-label=\"Export JSON\"\n @click=${() => this.exportEvents(filteredEvents)}\n ?disabled=${filteredEvents.length === 0}\n >\n ${this.renderIcon(\"Download\")}\n </button>\n <button\n type=\"button\"\n class=\"tooltip-target flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 bg-white text-gray-600 transition hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50\"\n title=\"Clear events\"\n data-tooltip=\"Clear events\"\n aria-label=\"Clear events\"\n @click=${this.handleClearEvents}\n ?disabled=${events.length === 0}\n >\n ${this.renderIcon(\"Trash2\")}\n </button>\n </div>\n </div>\n <div class=\"text-[11px] text-gray-500\">\n Showing ${filteredEvents.length} of\n ${events.length}${\n this.selectedContext === \"all-agents\"\n ? \"\"\n : ` for ${selectedLabel}`\n }\n </div>\n </div>\n <div class=\"relative h-full w-full overflow-y-auto overflow-x-hidden\">\n <table class=\"w-full table-fixed border-collapse text-xs box-border\">\n <thead class=\"sticky top-0 z-10\">\n <tr class=\"bg-white\">\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n Agent\n </th>\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n Time\n </th>\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n Event Type\n </th>\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n AG-UI Event\n </th>\n </tr>\n </thead>\n <tbody>\n ${filteredEvents.map((event, index) => {\n const rowBg = index % 2 === 0 ? \"bg-white\" : \"bg-gray-50/50\";\n const badgeClasses = this.getEventBadgeClasses(event.type);\n const extractedEvent = this.extractEventFromPayload(\n event.payload,\n );\n const inlineEvent =\n this.stringifyPayload(extractedEvent, false) || \"—\";\n const prettyEvent =\n this.stringifyPayload(extractedEvent, true) || inlineEvent;\n const isExpanded = this.expandedRows.has(event.id);\n\n return html`\n <tr\n class=\"${rowBg} cursor-pointer transition hover:bg-blue-50/50\"\n @click=${() => this.toggleRowExpansion(event.id)}\n >\n <td\n class=\"border-l border-r border-b border-gray-200 px-3 py-2\"\n >\n <span class=\"font-mono text-[11px] text-gray-600\"\n >${event.agentId}</span\n >\n </td>\n <td\n class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[11px] text-gray-600\"\n >\n <span title=${new Date(event.timestamp).toLocaleString()}>\n ${new Date(event.timestamp).toLocaleTimeString()}\n </span>\n </td>\n <td class=\"border-r border-b border-gray-200 px-3 py-2\">\n <span class=${badgeClasses}>${event.type}</span>\n </td>\n <td\n class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[10px] text-gray-600 ${\n isExpanded ? \"\" : \"truncate max-w-xs\"\n }\"\n >\n ${\n isExpanded\n ? html`\n <div class=\"group relative\">\n <pre\n class=\"m-0 whitespace-pre-wrap break-words text-[10px] font-mono text-gray-600\"\n >\n${prettyEvent}</pre\n >\n <button\n class=\"absolute right-0 top-0 cursor-pointer rounded px-2 py-1 text-[10px] opacity-0 transition group-hover:opacity-100 ${\n this.copiedEvents.has(event.id)\n ? \"bg-green-100 text-green-700\"\n : \"bg-gray-100 text-gray-600 hover:bg-gray-200 hover:text-gray-900\"\n }\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this.copyToClipboard(prettyEvent, event.id);\n }}\n >\n ${\n this.copiedEvents.has(event.id)\n ? html`\n <span>✓ Copied</span>\n `\n : html`\n <span>Copy</span>\n `\n }\n </button>\n </div>\n `\n : inlineEvent\n }\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n </div>\n </div>\n `;\n }\n\n private handleEventFilterInput(event: Event): void {\n const target = event.target as HTMLInputElement | null;\n this.eventFilterText = target?.value ?? \"\";\n this.requestUpdate();\n }\n\n private handleEventTypeChange(event: Event): void {\n const target = event.target as HTMLSelectElement | null;\n const value = target?.value as InspectorAgentEventType | \"all\" | undefined;\n if (!value) {\n return;\n }\n this.eventTypeFilter = value;\n this.requestUpdate();\n }\n\n private resetEventFilters(): void {\n this.eventFilterText = \"\";\n this.eventTypeFilter = \"all\";\n this.requestUpdate();\n }\n\n private handleClearEvents = (): void => {\n if (this.selectedContext === \"all-agents\") {\n this.agentEvents.clear();\n this.flattenedEvents = [];\n } else {\n this.agentEvents.delete(this.selectedContext);\n this.flattenedEvents = this.flattenedEvents.filter(\n (event) => event.agentId !== this.selectedContext,\n );\n }\n\n this.expandedRows.clear();\n this.copiedEvents.clear();\n this.requestUpdate();\n };\n\n private exportEvents(events: InspectorEvent[]): void {\n try {\n const payload = JSON.stringify(events, null, 2);\n const blob = new Blob([payload], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `copilotkit-events-${Date.now()}.json`;\n anchor.click();\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error(\"Failed to export events\", error);\n }\n }\n\n private renderAgentsView() {\n // Show message if \"all-agents\" is selected or no agents available\n if (this.selectedContext === \"all-agents\") {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Bot\")}\n </div>\n <p class=\"text-sm text-gray-600\">No agent selected</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Select an agent from the dropdown above to view details.\n </p>\n </div>\n </div>\n `;\n }\n\n const agentId = this.selectedContext;\n const status = this.getAgentStatus(agentId);\n const stats = this.getAgentStats(agentId);\n const state = this.getLatestStateForAgent(agentId);\n const messages = this.getLatestMessagesForAgent(agentId);\n\n const statusColors = {\n running: \"bg-emerald-50 text-emerald-700\",\n idle: \"bg-gray-100 text-gray-600\",\n error: \"bg-rose-50 text-rose-700\",\n };\n\n return html`\n <div class=\"flex flex-col gap-4 p-4 overflow-auto\">\n <!-- Agent Overview Card -->\n <div class=\"rounded-lg border border-gray-200 bg-white p-4\">\n <div class=\"flex items-start justify-between mb-4\">\n <div class=\"flex items-center gap-3\">\n <div\n class=\"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 text-blue-600\"\n >\n ${this.renderIcon(\"Bot\")}\n </div>\n <div>\n <h3 class=\"font-semibold text-sm text-gray-900\">${agentId}</h3>\n <span\n class=\"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium ${\n statusColors[status]\n } relative -translate-y-[2px]\"\n >\n <span\n class=\"h-1.5 w-1.5 rounded-full ${\n status === \"running\"\n ? \"bg-emerald-500 animate-pulse\"\n : status === \"error\"\n ? \"bg-rose-500\"\n : \"bg-gray-400\"\n }\"\n ></span>\n ${status.charAt(0).toUpperCase() + status.slice(1)}\n </span>\n </div>\n </div>\n ${\n stats.lastActivity\n ? html`<span class=\"text-xs text-gray-500\"\n >Last activity:\n ${new Date(stats.lastActivity).toLocaleTimeString()}</span\n >`\n : nothing\n }\n </div>\n <div class=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n <button\n type=\"button\"\n class=\"rounded-md bg-gray-50 px-3 py-2 text-left transition hover:bg-gray-100 cursor-pointer overflow-hidden\"\n @click=${() => this.handleMenuSelect(\"ag-ui-events\")}\n title=\"View all events in AG-UI Events\"\n >\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Total Events\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.totalEvents}\n </div>\n </button>\n <div class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden\">\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Messages\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.messages}\n </div>\n </div>\n <div class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden\">\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Tool Calls\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.toolCalls}\n </div>\n </div>\n <div class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden\">\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Errors\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.errors}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Current State Section -->\n <div class=\"rounded-lg border border-gray-200 bg-white\">\n <div class=\"border-b border-gray-200 px-4 py-3\">\n <h4 class=\"text-sm font-semibold text-gray-900\">Current State</h4>\n </div>\n <div class=\"overflow-auto p-4\">\n ${\n this.hasRenderableState(state)\n ? html`\n <pre\n class=\"overflow-auto rounded-md bg-gray-50 p-3 text-xs text-gray-800 max-h-64\"\n ><code>${this.formatStateForDisplay(state)}</code></pre>\n `\n : html`\n <div\n class=\"flex h-40 items-center justify-center text-xs text-gray-500\"\n >\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\"\n >${this.renderIcon(\"Database\")}</span\n >\n <span>State is empty</span>\n </div>\n </div>\n `\n }\n </div>\n </div>\n\n <!-- Current Messages Section -->\n <div class=\"rounded-lg border border-gray-200 bg-white\">\n <div class=\"border-b border-gray-200 px-4 py-3\">\n <h4 class=\"text-sm font-semibold text-gray-900\">\n Current Messages\n </h4>\n </div>\n <div class=\"overflow-auto\">\n ${\n messages && messages.length > 0\n ? html`\n <table class=\"w-full text-xs\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th\n class=\"px-4 py-2 text-left font-medium text-gray-700\"\n >\n Role\n </th>\n <th\n class=\"px-4 py-2 text-left font-medium text-gray-700\"\n >\n Content\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200\">\n ${messages.map((msg) => {\n const role = msg.role || \"unknown\";\n const roleColors: Record<string, string> = {\n user: \"bg-blue-100 text-blue-800\",\n assistant: \"bg-green-100 text-green-800\",\n system: \"bg-gray-100 text-gray-800\",\n tool: \"bg-amber-100 text-amber-800\",\n unknown: \"bg-gray-100 text-gray-600\",\n };\n\n const rawContent = msg.contentText ?? \"\";\n const toolCalls = msg.toolCalls ?? [];\n const hasContent = rawContent.trim().length > 0;\n const contentFallback =\n toolCalls.length > 0 ? \"Invoked tool call\" : \"—\";\n\n return html`\n <tr>\n <td class=\"px-4 py-2 align-top\">\n <span\n class=\"inline-flex rounded px-2 py-0.5 text-[10px] font-medium ${\n roleColors[role] || roleColors.unknown\n }\"\n >\n ${role}\n </span>\n </td>\n <td class=\"px-4 py-2\">\n ${\n hasContent\n ? html`<div\n class=\"max-w-2xl whitespace-pre-wrap break-words text-gray-700\"\n >\n ${rawContent}\n </div>`\n : html`<div\n class=\"text-xs italic text-gray-400\"\n >\n ${contentFallback}\n </div>`\n }\n ${\n role === \"assistant\" && toolCalls.length > 0\n ? this.renderToolCallDetails(toolCalls)\n : nothing\n }\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n `\n : html`\n <div\n class=\"flex h-40 items-center justify-center text-xs text-gray-500\"\n >\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\"\n >${this.renderIcon(\"MessageSquare\")}</span\n >\n <span>No messages available</span>\n </div>\n </div>\n `\n }\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextDropdown() {\n // Filter out \"all-agents\" when in agents view\n const filteredOptions =\n this.selectedMenu === \"agents\"\n ? this.contextOptions.filter((opt) => opt.key !== \"all-agents\")\n : this.contextOptions;\n\n const selectedLabel =\n filteredOptions.find((opt) => opt.key === this.selectedContext)?.label ??\n \"\";\n\n return html`\n <div\n class=\"relative z-40 min-w-0 flex-1\"\n data-context-dropdown-root=\"true\"\n >\n <button\n type=\"button\"\n class=\"relative z-40 flex w-full min-w-0 max-w-[240px] items-center gap-1.5 rounded-md border border-gray-200 px-2 py-1 text-xs font-medium text-gray-700 transition hover:border-gray-300 hover:bg-gray-50\"\n @pointerdown=${this.handleContextDropdownToggle}\n >\n <span class=\"truncate flex-1 text-left\">${selectedLabel}</span>\n <span class=\"shrink-0 text-gray-400\"\n >${this.renderIcon(\"ChevronDown\")}</span\n >\n </button>\n ${\n this.contextMenuOpen\n ? html`\n <div\n class=\"absolute left-0 z-50 mt-1.5 w-40 rounded-md border border-gray-200 bg-white py-1 shadow-md ring-1 ring-black/5\"\n data-context-dropdown-root=\"true\"\n >\n ${filteredOptions.map(\n (option) => html`\n <button\n type=\"button\"\n class=\"flex w-full items-center justify-between px-3 py-1.5 text-left text-xs transition hover:bg-gray-50 focus:bg-gray-50 focus:outline-none\"\n data-context-dropdown-root=\"true\"\n @click=${() => this.handleContextOptionSelect(option.key)}\n >\n <span\n class=\"truncate ${\n option.key === this.selectedContext\n ? \"text-gray-900 font-medium\"\n : \"text-gray-600\"\n }\"\n >${option.label}</span\n >\n ${\n option.key === this.selectedContext\n ? html`<span class=\"text-gray-500\"\n >${this.renderIcon(\"Check\")}</span\n >`\n : nothing\n }\n </button>\n `,\n )}\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n private handleMenuSelect(key: MenuKey): void {\n if (!this.menuItems.some((item) => item.key === key)) {\n return;\n }\n\n this.selectedMenu = key;\n\n // If switching to agents view and \"all-agents\" is selected, switch to default or first agent\n if (key === \"agents\" && this.selectedContext === \"all-agents\") {\n const agentOptions = this.contextOptions.filter(\n (opt) => opt.key !== \"all-agents\",\n );\n if (agentOptions.length > 0) {\n // Try to find \"default\" agent first\n const defaultAgent = agentOptions.find((opt) => opt.key === \"default\");\n this.selectedContext = defaultAgent\n ? defaultAgent.key\n : agentOptions[0]!.key;\n }\n }\n\n this.contextMenuOpen = false;\n this.persistState();\n this.requestUpdate();\n }\n\n private handleContextDropdownToggle(event: PointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuOpen = !this.contextMenuOpen;\n this.requestUpdate();\n }\n\n private handleContextOptionSelect(key: string): void {\n if (!this.contextOptions.some((option) => option.key === key)) {\n return;\n }\n\n if (this.selectedContext !== key) {\n this.selectedContext = key;\n this.expandedRows.clear();\n }\n\n this.contextMenuOpen = false;\n this.persistState();\n this.requestUpdate();\n }\n\n private renderToolsView() {\n if (!this._core) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-xs text-gray-500\"\n >\n No core instance available\n </div>\n `;\n }\n\n this.refreshToolsSnapshot();\n const allTools = this.cachedTools;\n\n if (allTools.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Hammer\")}\n </div>\n <p class=\"text-sm text-gray-600\">No tools available</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Tools will appear here once agents are configured with tool\n handlers or renderers.\n </p>\n </div>\n </div>\n `;\n }\n\n // Filter tools by selected agent\n const filteredTools =\n this.selectedContext === \"all-agents\"\n ? allTools\n : allTools.filter(\n (tool) => !tool.agentId || tool.agentId === this.selectedContext,\n );\n\n return html`\n <div class=\"flex h-full flex-col overflow-hidden\">\n <div class=\"overflow-auto p-4\">\n <div class=\"space-y-3\">\n ${filteredTools.map((tool) => this.renderToolCard(tool))}\n </div>\n </div>\n </div>\n `;\n }\n\n private extractToolsFromAgents(): InspectorToolDefinition[] {\n if (!this._core) {\n return [];\n }\n\n const tools: InspectorToolDefinition[] = [];\n\n // Start with tools registered on the core (frontend tools / HIL)\n for (const coreTool of this._core.tools ?? []) {\n tools.push({\n agentId: coreTool.agentId ?? \"\",\n name: coreTool.name,\n description: coreTool.description,\n parameters: coreTool.parameters,\n type: \"handler\",\n });\n }\n\n // Augment with agent-level tool handlers/renderers\n for (const [agentId, agent] of Object.entries(this._core.agents)) {\n if (!agent) continue;\n\n // Try to extract tool handlers\n const handlers = (agent as { toolHandlers?: Record<string, unknown> })\n .toolHandlers;\n if (handlers && typeof handlers === \"object\") {\n for (const [toolName, handler] of Object.entries(handlers)) {\n if (handler && typeof handler === \"object\") {\n const handlerObj = handler as Record<string, unknown>;\n tools.push({\n agentId,\n name: toolName,\n description:\n (typeof handlerObj.description === \"string\" &&\n handlerObj.description) ||\n (handlerObj.tool as { description?: string } | undefined)\n ?.description,\n parameters:\n handlerObj.parameters ??\n (handlerObj.tool as { parameters?: unknown } | undefined)\n ?.parameters,\n type: \"handler\",\n });\n }\n }\n }\n\n // Try to extract tool renderers\n const renderers = (agent as { toolRenderers?: Record<string, unknown> })\n .toolRenderers;\n if (renderers && typeof renderers === \"object\") {\n for (const [toolName, renderer] of Object.entries(renderers)) {\n // Don't duplicate if we already have it as a handler\n if (\n !tools.some((t) => t.agentId === agentId && t.name === toolName)\n ) {\n if (renderer && typeof renderer === \"object\") {\n const rendererObj = renderer as Record<string, unknown>;\n tools.push({\n agentId,\n name: toolName,\n description:\n (typeof rendererObj.description === \"string\" &&\n rendererObj.description) ||\n (rendererObj.tool as { description?: string } | undefined)\n ?.description,\n parameters:\n rendererObj.parameters ??\n (rendererObj.tool as { parameters?: unknown } | undefined)\n ?.parameters,\n type: \"renderer\",\n });\n }\n }\n }\n }\n }\n\n return tools.sort((a, b) => {\n const agentCompare = a.agentId.localeCompare(b.agentId);\n if (agentCompare !== 0) return agentCompare;\n return a.name.localeCompare(b.name);\n });\n }\n\n private renderToolCard(tool: InspectorToolDefinition) {\n const isExpanded = this.expandedTools.has(`${tool.agentId}:${tool.name}`);\n const schema = this.extractSchemaInfo(tool.parameters);\n\n const typeColors = {\n handler: \"bg-blue-50 text-blue-700 border-blue-200\",\n renderer: \"bg-purple-50 text-purple-700 border-purple-200\",\n };\n\n return html`\n <div class=\"rounded-lg border border-gray-200 bg-white overflow-hidden\">\n <button\n type=\"button\"\n class=\"w-full px-4 py-3 text-left transition hover:bg-gray-50\"\n @click=${() =>\n this.toggleToolExpansion(`${tool.agentId}:${tool.name}`)}\n >\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"flex items-center gap-2 mb-1\">\n <span class=\"font-mono text-sm font-semibold text-gray-900\"\n >${tool.name}</span\n >\n <span\n class=\"inline-flex items-center rounded-sm border px-1.5 py-0.5 text-[10px] font-medium ${\n typeColors[tool.type]\n }\"\n >\n ${tool.type}\n </span>\n </div>\n <div class=\"flex items-center gap-2 text-xs text-gray-500\">\n <span class=\"flex items-center gap-1\">\n ${this.renderIcon(\"Bot\")}\n <span class=\"font-mono\">${tool.agentId}</span>\n </span>\n ${\n schema.properties.length > 0\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span\n >${schema.properties.length}\n parameter${\n schema.properties.length !== 1 ? \"s\" : \"\"\n }</span\n >\n `\n : nothing\n }\n </div>\n ${\n tool.description\n ? html`<p class=\"mt-2 text-xs text-gray-600\">\n ${tool.description}\n </p>`\n : nothing\n }\n </div>\n <span\n class=\"shrink-0 text-gray-400 transition ${\n isExpanded ? \"rotate-180\" : \"\"\n }\"\n >\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\n\n ${\n isExpanded\n ? html`\n <div class=\"border-t border-gray-200 bg-gray-50/50 px-4 py-3\">\n ${\n schema.properties.length > 0\n ? html`\n <h5 class=\"mb-3 text-xs font-semibold text-gray-700\">\n Parameters\n </h5>\n <div class=\"space-y-3\">\n ${schema.properties.map(\n (prop) => html`\n <div\n class=\"rounded-md border border-gray-200 bg-white p-3\"\n >\n <div\n class=\"flex items-start justify-between gap-2 mb-1\"\n >\n <span\n class=\"font-mono text-xs font-medium text-gray-900\"\n >${prop.name}</span\n >\n <div class=\"flex items-center gap-1.5 shrink-0\">\n ${\n prop.required\n ? html`\n <span\n class=\"text-[9px] rounded border border-rose-200 bg-rose-50 px-1 py-0.5 font-medium text-rose-700\"\n >required</span\n >\n `\n : html`\n <span\n class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-medium text-gray-600\"\n >optional</span\n >\n `\n }\n ${\n prop.type\n ? html`<span\n class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-mono text-gray-600\"\n >${prop.type}</span\n >`\n : nothing\n }\n </div>\n </div>\n ${\n prop.description\n ? html`<p class=\"mt-1 text-xs text-gray-600\">\n ${prop.description}\n </p>`\n : nothing\n }\n ${\n prop.defaultValue !== undefined\n ? html`\n <div\n class=\"mt-2 flex items-center gap-1.5 text-[10px] text-gray-500\"\n >\n <span>Default:</span>\n <code\n class=\"rounded bg-gray-100 px-1 py-0.5 font-mono\"\n >${JSON.stringify(\n prop.defaultValue,\n )}</code\n >\n </div>\n `\n : nothing\n }\n ${\n prop.enum && prop.enum.length > 0\n ? html`\n <div class=\"mt-2\">\n <span class=\"text-[10px] text-gray-500\"\n >Allowed values:</span\n >\n <div class=\"mt-1 flex flex-wrap gap-1\">\n ${prop.enum.map(\n (val) => html`\n <code\n class=\"rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 text-[10px] font-mono text-gray-700\"\n >${JSON.stringify(val)}</code\n >\n `,\n )}\n </div>\n </div>\n `\n : nothing\n }\n </div>\n `,\n )}\n </div>\n `\n : html`\n <div class=\"flex items-center justify-center py-4 text-xs text-gray-500\">\n <span>No parameters defined</span>\n </div>\n `\n }\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n private extractSchemaInfo(parameters: unknown): {\n properties: Array<{\n name: string;\n type?: string;\n description?: string;\n required: boolean;\n defaultValue?: unknown;\n enum?: unknown[];\n }>;\n } {\n const result: {\n properties: Array<{\n name: string;\n type?: string;\n description?: string;\n required: boolean;\n defaultValue?: unknown;\n enum?: unknown[];\n }>;\n } = { properties: [] };\n\n if (!parameters || typeof parameters !== \"object\") {\n return result;\n }\n\n // Try Zod schema introspection\n const zodDef = (parameters as { _def?: Record<string, unknown> })._def;\n if (zodDef && typeof zodDef === \"object\") {\n // Handle Zod object schema\n if (zodDef.typeName === \"ZodObject\") {\n const rawShape = zodDef.shape;\n const shape =\n typeof rawShape === \"function\"\n ? (rawShape as () => Record<string, unknown>)()\n : (rawShape as Record<string, unknown> | undefined);\n\n if (!shape || typeof shape !== \"object\") {\n return result;\n }\n const requiredKeys = new Set<string>();\n\n // Get required fields\n if (zodDef.unknownKeys === \"strict\" || !zodDef.catchall) {\n Object.keys(shape || {}).forEach((key) => {\n const candidate = (shape as Record<string, unknown>)[key];\n const fieldDef = (\n candidate as { _def?: Record<string, unknown> } | undefined\n )?._def;\n if (fieldDef && !this.isZodOptional(candidate)) {\n requiredKeys.add(key);\n }\n });\n }\n\n // Extract properties\n for (const [key, value] of Object.entries(shape || {})) {\n const fieldInfo = this.extractZodFieldInfo(value);\n result.properties.push({\n name: key,\n type: fieldInfo.type,\n description: fieldInfo.description,\n required: requiredKeys.has(key),\n defaultValue: fieldInfo.defaultValue,\n enum: fieldInfo.enum,\n });\n }\n }\n } else if (\n (parameters as { type?: string; properties?: Record<string, unknown> })\n .type === \"object\" &&\n (parameters as { properties?: Record<string, unknown> }).properties\n ) {\n // Handle JSON Schema format\n const props = (parameters as { properties?: Record<string, unknown> })\n .properties;\n const required = new Set(\n Array.isArray((parameters as { required?: string[] }).required)\n ? (parameters as { required?: string[] }).required\n : [],\n );\n\n for (const [key, value] of Object.entries(props ?? {})) {\n const prop = value as Record<string, unknown>;\n result.properties.push({\n name: key,\n type: prop.type as string | undefined,\n description:\n typeof prop.description === \"string\" ? prop.description : undefined,\n required: required.has(key),\n defaultValue: prop.default,\n enum: Array.isArray(prop.enum) ? prop.enum : undefined,\n });\n }\n }\n\n return result;\n }\n\n private isZodOptional(zodSchema: unknown): boolean {\n const schema = zodSchema as { _def?: Record<string, unknown> };\n if (!schema?._def) return false;\n\n const def = schema._def;\n\n // Check if it's explicitly optional or nullable\n if (def.typeName === \"ZodOptional\" || def.typeName === \"ZodNullable\") {\n return true;\n }\n\n // Check if it has a default value\n if (def.defaultValue !== undefined) {\n return true;\n }\n\n return false;\n }\n\n private extractZodFieldInfo(zodSchema: unknown): {\n type?: string;\n description?: string;\n defaultValue?: unknown;\n enum?: unknown[];\n } {\n const info: {\n type?: string;\n description?: string;\n defaultValue?: unknown;\n enum?: unknown[];\n } = {};\n\n const schema = zodSchema as { _def?: Record<string, unknown> };\n if (!schema?._def) return info;\n\n let currentSchema = schema as { _def?: Record<string, unknown> };\n let def = currentSchema._def as Record<string, unknown>;\n\n // Unwrap optional/nullable\n while (\n def.typeName === \"ZodOptional\" ||\n def.typeName === \"ZodNullable\" ||\n def.typeName === \"ZodDefault\"\n ) {\n if (def.typeName === \"ZodDefault\" && def.defaultValue !== undefined) {\n info.defaultValue =\n typeof def.defaultValue === \"function\"\n ? def.defaultValue()\n : def.defaultValue;\n }\n currentSchema =\n (def.innerType as { _def?: Record<string, unknown> }) ?? currentSchema;\n if (!currentSchema?._def) break;\n def = currentSchema._def as Record<string, unknown>;\n }\n\n // Extract description\n info.description =\n typeof def.description === \"string\" ? def.description : undefined;\n\n const typeName =\n typeof def.typeName === \"string\" ? def.typeName : undefined;\n\n // Extract type\n const typeMap: Record<string, string> = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBoolean: \"boolean\",\n ZodArray: \"array\",\n ZodObject: \"object\",\n ZodEnum: \"enum\",\n ZodLiteral: \"literal\",\n ZodUnion: \"union\",\n ZodAny: \"any\",\n ZodUnknown: \"unknown\",\n };\n info.type = typeName\n ? typeMap[typeName] || typeName.replace(\"Zod\", \"\").toLowerCase()\n : undefined;\n\n // Extract enum values\n if (typeName === \"ZodEnum\" && Array.isArray(def.values)) {\n info.enum = def.values as unknown[];\n } else if (typeName === \"ZodLiteral\" && def.value !== undefined) {\n info.enum = [def.value];\n }\n\n return info;\n }\n\n private toggleToolExpansion(toolId: string): void {\n if (this.expandedTools.has(toolId)) {\n this.expandedTools.delete(toolId);\n } else {\n this.expandedTools.add(toolId);\n }\n this.requestUpdate();\n }\n\n private renderContextView() {\n const contextEntries = Object.entries(this.contextStore);\n\n if (contextEntries.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"FileText\")}\n </div>\n <p class=\"text-sm text-gray-600\">No context available</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Context will appear here once added to CopilotKit.\n </p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"flex h-full flex-col overflow-hidden\">\n <div class=\"overflow-auto p-4\">\n <div class=\"space-y-3\">\n ${contextEntries.map(([id, context]) =>\n this.renderContextCard(id, context),\n )}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextCard(\n id: string,\n context: { description?: string; value: unknown },\n ) {\n const isExpanded = this.expandedContextItems.has(id);\n const valuePreview = this.getContextValuePreview(context.value);\n const hasValue = context.value !== undefined && context.value !== null;\n const title = context.description?.trim() || id;\n\n return html`\n <div class=\"rounded-lg border border-gray-200 bg-white overflow-hidden\">\n <button\n type=\"button\"\n class=\"w-full px-4 py-3 text-left transition hover:bg-gray-50\"\n @click=${() => this.toggleContextExpansion(id)}\n >\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"flex-1 min-w-0\">\n <p class=\"text-sm font-medium text-gray-900 mb-1\">${title}</p>\n <div class=\"flex items-center gap-2 text-xs text-gray-500\">\n <span\n class=\"font-mono truncate inline-block align-middle\"\n style=\"max-width: 180px;\"\n >${id}</span\n >\n ${\n hasValue\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span class=\"truncate\">${valuePreview}</span>\n `\n : nothing\n }\n </div>\n </div>\n <span\n class=\"shrink-0 text-gray-400 transition ${\n isExpanded ? \"rotate-180\" : \"\"\n }\"\n >\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\n\n ${\n isExpanded\n ? html`\n <div class=\"border-t border-gray-200 bg-gray-50/50 px-4 py-3\">\n <div class=\"mb-3\">\n <h5 class=\"mb-1 text-xs font-semibold text-gray-700\">ID</h5>\n <code\n class=\"block rounded bg-white border border-gray-200 px-2 py-1 text-[10px] font-mono text-gray-600\"\n >${id}</code\n >\n </div>\n ${\n hasValue\n ? html`\n <div class=\"mb-2 flex items-center justify-between gap-2\">\n <h5 class=\"text-xs font-semibold text-gray-700\">\n Value\n </h5>\n <button\n class=\"flex items-center gap-1 rounded-md border border-gray-200 bg-white px-2 py-1 text-[10px] font-medium text-gray-700 transition hover:bg-gray-50\"\n type=\"button\"\n @click=${(e: Event) => {\n e.stopPropagation();\n void this.copyContextValue(context.value, id);\n }}\n >\n ${\n this.copiedContextItems.has(id)\n ? \"Copied\"\n : \"Copy JSON\"\n }\n </button>\n </div>\n <div\n class=\"rounded-md border border-gray-200 bg-white p-3\"\n >\n <pre\n class=\"overflow-auto text-xs text-gray-800 max-h-96\"\n ><code>${this.formatContextValue(\n context.value,\n )}</code></pre>\n </div>\n `\n : html`\n <div class=\"flex items-center justify-center py-4 text-xs text-gray-500\">\n <span>No value available</span>\n </div>\n `\n }\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n private getContextValuePreview(value: unknown): string {\n if (value === undefined || value === null) {\n return \"—\";\n }\n\n if (typeof value === \"string\") {\n return value.length > 50 ? `${value.substring(0, 50)}...` : value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n return `Object with ${keys.length} key${keys.length !== 1 ? \"s\" : \"\"}`;\n }\n\n if (typeof value === \"function\") {\n return \"Function\";\n }\n\n return String(value);\n }\n\n private formatContextValue(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (value === null) {\n return \"null\";\n }\n\n if (typeof value === \"function\") {\n return value.toString();\n }\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n\n private async copyContextValue(\n value: unknown,\n contextId: string,\n ): Promise<void> {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n console.warn(\"Clipboard API is not available in this environment.\");\n return;\n }\n\n const serialized = this.formatContextValue(value);\n try {\n await navigator.clipboard.writeText(serialized);\n this.copiedContextItems.add(contextId);\n this.requestUpdate();\n setTimeout(() => {\n this.copiedContextItems.delete(contextId);\n this.requestUpdate();\n }, 1500);\n } catch (error) {\n console.error(\"Failed to copy context value:\", error);\n }\n }\n\n private toggleContextExpansion(contextId: string): void {\n if (this.expandedContextItems.has(contextId)) {\n this.expandedContextItems.delete(contextId);\n } else {\n this.expandedContextItems.add(contextId);\n }\n this.requestUpdate();\n }\n\n private handleGlobalPointerDown = (event: PointerEvent): void => {\n if (!this.contextMenuOpen) {\n return;\n }\n\n const clickedDropdown = event.composedPath().some((node) => {\n return (\n node instanceof HTMLElement &&\n node.dataset?.contextDropdownRoot === \"true\"\n );\n });\n\n if (!clickedDropdown) {\n this.contextMenuOpen = false;\n this.requestUpdate();\n }\n };\n\n private toggleRowExpansion(eventId: string): void {\n // Don't toggle if user is selecting text\n const selection = window.getSelection();\n if (selection && selection.toString().length > 0) {\n return;\n }\n\n if (this.expandedRows.has(eventId)) {\n this.expandedRows.delete(eventId);\n } else {\n this.expandedRows.add(eventId);\n }\n this.requestUpdate();\n }\n\n private renderAnnouncementPanel() {\n if (!this.isOpen) {\n return nothing;\n }\n\n // Ensure loading is triggered even if we mounted in an already-open state\n this.ensureAnnouncementLoading();\n\n if (!this.hasUnseenAnnouncement) {\n return nothing;\n }\n\n if (!this.announcementLoaded && !this.announcementMarkdown) {\n return html`<div\n class=\"mx-4 my-3 rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-800 shadow-[0_12px_30px_rgba(15,23,42,0.12)]\"\n >\n <div class=\"flex items-center gap-2 font-semibold\">\n <span\n class=\"inline-flex h-6 w-6 items-center justify-center rounded-md bg-slate-900 text-white shadow-sm\"\n >\n ${this.renderIcon(\"Megaphone\")}\n </span>\n <span>Loading latest announcement…</span>\n </div>\n </div>`;\n }\n\n if (this.announcementLoadError) {\n return html`<div\n class=\"mx-4 my-3 rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-900 shadow-[0_12px_30px_rgba(15,23,42,0.12)]\"\n >\n <div class=\"flex items-center gap-2 font-semibold\">\n <span\n class=\"inline-flex h-6 w-6 items-center justify-center rounded-md bg-rose-600 text-white shadow-sm\"\n >\n ${this.renderIcon(\"Megaphone\")}\n </span>\n <span>Announcement unavailable</span>\n </div>\n <p class=\"mt-2 text-xs text-rose-800\">\n We couldn’t load the latest notice. Please try opening the inspector\n again.\n </p>\n </div>`;\n }\n\n if (!this.announcementMarkdown) {\n return nothing;\n }\n\n const content = this.announcementHtml\n ? unsafeHTML(this.announcementHtml)\n : html`<pre class=\"whitespace-pre-wrap text-sm text-gray-900\">\n${this.announcementMarkdown}</pre\n >`;\n\n return html`<div\n class=\"mx-4 my-3 rounded-xl border border-slate-200 bg-white px-4 py-4 shadow-[0_12px_30px_rgba(15,23,42,0.12)]\"\n >\n <div\n class=\"mb-3 flex items-center gap-2 text-sm font-semibold text-slate-900\"\n >\n <span\n class=\"inline-flex h-7 w-7 items-center justify-center rounded-md bg-slate-900 text-white shadow-sm\"\n >\n ${this.renderIcon(\"Megaphone\")}\n </span>\n <span>Announcement</span>\n <button\n class=\"announcement-dismiss ml-auto\"\n type=\"button\"\n @click=${this.handleDismissAnnouncement}\n aria-label=\"Dismiss announcement\"\n >\n Dismiss\n </button>\n </div>\n <div class=\"announcement-content text-sm leading-relaxed text-gray-900\">\n ${content}\n </div>\n </div>`;\n }\n\n private ensureAnnouncementLoading(): void {\n if (\n this.announcementPromise ||\n typeof window === \"undefined\" ||\n typeof fetch === \"undefined\"\n ) {\n return;\n }\n this.announcementPromise = this.fetchAnnouncement();\n }\n\n private renderAnnouncementPreview() {\n if (\n !this.hasUnseenAnnouncement ||\n !this.showAnnouncementPreview ||\n !this.announcementPreviewText\n ) {\n return nothing;\n }\n\n const side =\n this.contextState.button.anchor.horizontal === \"left\" ? \"right\" : \"left\";\n\n return html`<div\n class=\"announcement-preview\"\n data-side=${side}\n role=\"note\"\n @click=${() => this.handleAnnouncementPreviewClick()}\n >\n <span>${this.announcementPreviewText}</span>\n <span class=\"announcement-preview__arrow\"></span>\n </div>`;\n }\n\n private handleAnnouncementPreviewClick(): void {\n this.showAnnouncementPreview = false;\n this.openInspector();\n }\n\n private handleDismissAnnouncement = (): void => {\n this.markAnnouncementSeen();\n };\n\n private async fetchAnnouncement(): Promise<void> {\n try {\n const response = await fetch(ANNOUNCEMENT_URL, { cache: \"no-cache\" });\n if (!response.ok) {\n throw new Error(`Failed to load announcement (${response.status})`);\n }\n\n const data = (await response.json()) as {\n timestamp?: unknown;\n previewText?: unknown;\n announcement?: unknown;\n };\n\n const timestamp =\n typeof data?.timestamp === \"string\" ? data.timestamp : null;\n const previewText =\n typeof data?.previewText === \"string\" ? data.previewText : null;\n const markdown =\n typeof data?.announcement === \"string\" ? data.announcement : null;\n\n if (!timestamp || !markdown) {\n throw new Error(\"Malformed announcement payload\");\n }\n\n const storedTimestamp = this.loadStoredAnnouncementTimestamp();\n\n this.announcementTimestamp = timestamp;\n this.announcementPreviewText = previewText ?? \"\";\n this.announcementMarkdown = markdown;\n this.hasUnseenAnnouncement =\n (!storedTimestamp || storedTimestamp !== timestamp) &&\n !!this.announcementPreviewText;\n this.showAnnouncementPreview = this.hasUnseenAnnouncement;\n this.announcementHtml = await this.convertMarkdownToHtml(markdown);\n this.announcementLoaded = true;\n\n this.requestUpdate();\n } catch (error) {\n this.announcementLoadError = error;\n this.announcementLoaded = true;\n this.requestUpdate();\n }\n }\n\n private async convertMarkdownToHtml(\n markdown: string,\n ): Promise<string | null> {\n const renderer = new marked.Renderer();\n renderer.link = (href, title, text) => {\n const safeHref = this.escapeHtmlAttr(this.appendRefParam(href ?? \"\"));\n const titleAttr = title ? ` title=\"${this.escapeHtmlAttr(title)}\"` : \"\";\n return `<a href=\"${safeHref}\" target=\"_blank\" rel=\"noopener\"${titleAttr}>${text}</a>`;\n };\n return marked.parse(markdown, { renderer });\n }\n\n private appendRefParam(href: string): string {\n try {\n const url = new URL(\n href,\n typeof window !== \"undefined\"\n ? window.location.href\n : \"https://copilotkit.ai\",\n );\n if (!url.searchParams.has(\"ref\")) {\n url.searchParams.append(\"ref\", \"cpk-inspector\");\n }\n return url.toString();\n } catch {\n return href;\n }\n }\n\n private escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\\\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n }\n\n private loadStoredAnnouncementTimestamp(): string | null {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(ANNOUNCEMENT_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed.timestamp === \"string\") {\n return parsed.timestamp;\n }\n // Backward compatibility: previous shape { hash }\n return null;\n } catch {\n // ignore malformed storage\n }\n return null;\n }\n\n private persistAnnouncementTimestamp(timestamp: string): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n const payload = JSON.stringify({ timestamp });\n window.localStorage.setItem(ANNOUNCEMENT_STORAGE_KEY, payload);\n } catch {\n // Non-fatal if storage is unavailable\n }\n }\n\n private markAnnouncementSeen(): void {\n // Clear badge only when explicitly dismissed\n this.hasUnseenAnnouncement = false;\n this.showAnnouncementPreview = false;\n\n if (!this.announcementTimestamp) {\n // If still loading, attempt once more after promise resolves; avoid infinite requeues\n if (this.announcementPromise && !this.announcementLoaded) {\n void this.announcementPromise\n .then(() => this.markAnnouncementSeen())\n .catch(() => undefined);\n }\n this.requestUpdate();\n return;\n }\n\n this.persistAnnouncementTimestamp(this.announcementTimestamp);\n this.requestUpdate();\n }\n}\n\nexport function defineWebInspector(): void {\n if (!customElements.get(WEB_INSPECTOR_TAG)) {\n customElements.define(WEB_INSPECTOR_TAG, WebInspectorElement);\n }\n}\n\ndefineWebInspector();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"cpk-web-inspector\": WebInspectorElement;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","names":["LitElement","nothing","inspectorLogoIconUrl","inspectorLogoUrl","clampSizeToViewport","icons","CopilotKitCoreRuntimeConnectionStatus","tailwindStyles"],"sources":["../src/styles/generated.css","../src/assets/inspector-logo.svg","../src/assets/inspector-logo-icon.svg","../src/lib/context-helpers.ts","../src/lib/persistence.ts","../src/index.ts"],"sourcesContent":["\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\",\\\"Noto Color Emoji\\\";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\\\"Liberation Mono\\\",\\\"Courier New\\\",monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-green-100:oklch(96.2% .044 156.743);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-700:oklch(50% .134 242.749);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-700:oklch(49.1% .27 292.581);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-700:oklch(49.6% .265 301.924);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\",\\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\\\"Liberation Mono\\\",\\\"Courier New\\\",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{font-family:var(--font-sans);color:var(--color-slate-900);background-color:#0000;display:block}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.bottom-1{bottom:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.m-0{margin:calc(var(--spacing)*0)}.mx-4{margin-inline:calc(var(--spacing)*4)}.my-1{margin-block:calc(var(--spacing)*1)}.my-3{margin-block:calc(var(--spacing)*3)}.mt-0\\\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\\\\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\\\\.5{height:calc(var(--spacing)*3.5)}.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-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-40{height:calc(var(--spacing)*40)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-96{max-height:calc(var(--spacing)*96)}.w-1\\\\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\\\\.5{width:calc(var(--spacing)*3.5)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-40{width:calc(var(--spacing)*40)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\\\[240px\\\\]{max-width:240px}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\\\[160px\\\\]{min-width:160px}.min-w-\\\\[200px\\\\]{min-width:200px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-y-\\\\[2px\\\\]{--tw-translate-y:calc(2px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.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-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-fuchsia-200{border-color:var(--color-fuchsia-200)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-purple-200{border-color:var(--color-purple-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-sky-200{border-color:var(--color-sky-200)}.border-slate-200{border-color:var(--color-slate-200)}.border-violet-200{border-color:var(--color-violet-200)}.border-white\\\\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\\\\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-50{background-color:var(--color-fuchsia-50)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-50\\\\/50{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\\\\/50{background-color:color-mix(in oklab,var(--color-gray-50)50%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950\\\\/95{background-color:#020618f2}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\\\\/95{background-color:color-mix(in oklab,var(--color-slate-950)95%,transparent)}}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.bg-white\\\\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\\\\/60{background-color:color-mix(in oklab,var(--color-white)60%,transparent)}}.bg-white\\\\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\\\\/95{background-color:color-mix(in oklab,var(--color-white)95%,transparent)}}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\\\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\\\[9px\\\\]{font-size:9px}.text-\\\\[10px\\\\]{font-size:10px}.text-\\\\[11px\\\\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-emerald-700{color:var(--color-emerald-700)}.text-fuchsia-700{color:var(--color-fuchsia-700)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-purple-700{color:var(--color-purple-700)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-sky-700{color:var(--color-sky-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.italic{font-style:italic}.opacity-0{opacity:0}.opacity-80{opacity:.8}.shadow-\\\\[0_12px_30px_rgba\\\\(15\\\\,23\\\\,42\\\\,0\\\\.12\\\\)\\\\]{--tw-shadow:0 12px 30px var(--tw-shadow-color,#0f172a1f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.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)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-black\\\\/5{--tw-ring-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.ring-black\\\\/5{--tw-ring-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.ring-transparent{--tw-ring-color:transparent}.ring-white\\\\/10{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.ring-white\\\\/10{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,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))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\\\\:opacity-100:is(:where(.group):hover *){opacity:1}.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-gray-300:hover{border-color:var(--color-gray-300)}.hover\\\\:border-white\\\\/30:hover{border-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\\\\:border-white\\\\/30:hover{border-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\\\\:bg-blue-50\\\\/50:hover{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-blue-50\\\\/50:hover{background-color:color-mix(in oklab,var(--color-blue-50)50%,transparent)}}.hover\\\\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\\\\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\\\\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\\\\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\\\\:bg-slate-900\\\\/95:hover{background-color:#0f172bf2}@supports (color:color-mix(in lab, red, red)){.hover\\\\:bg-slate-900\\\\/95:hover{background-color:color-mix(in oklab,var(--color-slate-900)95%,transparent)}}.hover\\\\:text-gray-600:hover{color:var(--color-gray-600)}.hover\\\\:text-gray-900:hover{color:var(--color-gray-900)}}.focus\\\\:border-gray-300:focus{border-color:var(--color-gray-300)}.focus\\\\:bg-gray-50:focus{background-color:var(--color-gray-50)}.focus\\\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\\\\:ring-gray-200:focus{--tw-ring-color:var(--color-gray-200)}.focus\\\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\\\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.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-gray-300:focus-visible{outline-color:var(--color-gray-300)}.focus-visible\\\\:outline-gray-400:focus-visible{outline-color:var(--color-gray-400)}.focus-visible\\\\:outline-rose-500:focus-visible{outline-color:var(--color-rose-500)}.disabled\\\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\\\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\\\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\\\\[\\\\&\\\\>svg\\\\]\\\\:\\\\!h-8>svg{height:calc(var(--spacing)*8)!important}.\\\\[\\\\&\\\\>svg\\\\]\\\\:\\\\!w-8>svg{width:calc(var(--spacing)*8)!important}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}@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-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-backdrop-blur{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-brightness{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-contrast{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-grayscale{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-invert{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-opacity{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-saturate{syntax:\\\"*\\\";inherits:false}@property --tw-backdrop-sepia{syntax:\\\"*\\\";inherits:false}@property --tw-scale-x{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\\\"*\\\";inherits:false;initial-value:1}@property --tw-outline-style{syntax:\\\"*\\\";inherits:false;initial-value:solid}@keyframes pulse{50%{opacity:.5}}\"","\"data:image/svg+xml,<svg width=\\\"136\\\" height=\\\"26\\\" viewBox=\\\"0 0 136 26\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">%0A<path d=\\\"M15.5253 11.0828H11.2602C11.2299 10.7299 11.1492 10.4097 11.0181 10.1224C10.8921 9.83503 10.7157 9.588 10.4888 9.38129C10.267 9.16958 9.99725 9.00818 9.67964 8.89733C9.36202 8.78136 9.00155 8.72338 8.59823 8.72338C7.89242 8.72338 7.29501 8.89477 6.80598 9.23756C6.322 9.58045 5.95397 10.072 5.70189 10.7122C5.45486 11.3524 5.33134 12.1213 5.33134 13.0187C5.33134 13.9665 5.45738 14.7606 5.70946 15.4008C5.96657 16.0361 6.33712 16.515 6.82111 16.8376C7.30509 17.1553 7.88739 17.314 8.56798 17.314C8.95618 17.314 9.30404 17.2662 9.61158 17.1704C9.91911 17.0695 10.1863 16.9259 10.4132 16.7393C10.64 16.5528 10.8241 16.3284 10.9653 16.0663C11.1114 15.7991 11.2097 15.4991 11.2602 15.1664L15.5253 15.1967C15.4748 15.852 15.2908 16.52 14.9732 17.2006C14.6556 17.8762 14.2044 18.5013 13.6195 19.076C13.0398 19.6457 12.3214 20.1046 11.4643 20.4524C10.6073 20.8003 9.61158 20.9742 8.47724 20.9742C7.05554 20.9742 5.78004 20.6692 4.65074 20.0592C3.52649 19.4491 2.63667 18.5517 1.98126 17.367C1.33091 16.1823 1.00574 14.7328 1.00574 13.0187C1.00574 11.2946 1.33848 9.84259 2.00396 8.66285C2.66944 7.47811 3.56682 6.58324 4.69611 5.97827C5.82541 5.36825 7.08578 5.06323 8.47724 5.06323C9.45528 5.06323 10.3552 5.19683 11.177 5.46403C11.9987 5.73123 12.7196 6.12194 13.3397 6.63618C13.9599 7.14537 14.4589 7.77302 14.8371 8.51922C15.2152 9.26533 15.4446 10.1198 15.5253 11.0828Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M23.0894 20.9742C21.829 20.9742 20.7501 20.7246 19.8527 20.2256C18.9553 19.7214 18.2672 19.0206 17.7883 18.1232C17.3093 17.2208 17.0698 16.1747 17.0698 14.9849C17.0698 13.7951 17.3093 12.7516 17.7883 11.8542C18.2672 10.9517 18.9553 10.2509 19.8527 9.75184C20.7501 9.24767 21.829 8.99564 23.0894 8.99564C24.3498 8.99564 25.4286 9.24767 26.326 9.75184C27.2234 10.2509 27.9115 10.9517 28.3905 11.8542C28.8695 12.7516 29.1089 13.7951 29.1089 14.9849C29.1089 16.1747 28.8695 17.2208 28.3905 18.1232C27.9115 19.0206 27.2234 19.7214 26.326 20.2256C25.4286 20.7246 24.3498 20.9742 23.0894 20.9742ZM23.1196 17.8888C23.4726 17.8888 23.7776 17.7703 24.0346 17.5334C24.2918 17.2965 24.4909 16.9587 24.6321 16.5201C24.7733 16.0814 24.8438 15.5597 24.8438 14.9547C24.8438 14.3446 24.7733 13.8228 24.6321 13.3893C24.4909 12.9506 24.2918 12.6128 24.0346 12.3759C23.7776 12.139 23.4726 12.0205 23.1196 12.0205C22.7466 12.0205 22.4265 12.139 22.1592 12.3759C21.8921 12.6128 21.6878 12.9506 21.5466 13.3893C21.4056 13.8228 21.3349 14.3446 21.3349 14.9547C21.3349 15.5597 21.4056 16.0814 21.5466 16.5201C21.6878 16.9587 21.8921 17.2965 22.1592 17.5334C22.4265 17.7703 22.7466 17.8888 23.1196 17.8888Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M30.8029 25.1184V9.14681H34.947V11.1735H35.0377C35.189 10.7803 35.4109 10.4199 35.7032 10.0922C35.9957 9.7594 36.3587 9.4947 36.7922 9.2981C37.2257 9.09639 37.7299 8.99564 38.3046 8.99564C39.0709 8.99564 39.7995 9.19979 40.4901 9.60811C41.1858 10.0165 41.7505 10.6593 42.1841 11.5365C42.6227 12.4138 42.842 13.5531 42.842 14.9547C42.842 16.2957 42.6328 17.4073 42.2143 18.2896C41.801 19.1719 41.2464 19.8298 40.5506 20.2633C39.8599 20.697 39.1011 20.9137 38.2744 20.9137C37.7299 20.9137 37.2434 20.8255 36.8149 20.649C36.3914 20.4675 36.0284 20.223 35.7259 19.9155C35.4285 19.6029 35.199 19.25 35.0377 18.8568H34.9772V25.1184H30.8029ZM34.8865 14.9547C34.8865 15.5193 34.9596 16.0083 35.1058 16.4218C35.257 16.8301 35.4688 17.1477 35.7411 17.3746C36.0183 17.5964 36.3486 17.7073 36.7317 17.7073C37.1149 17.7073 37.44 17.5989 37.7072 17.3821C37.9795 17.1603 38.1862 16.8452 38.3273 16.4369C38.4736 16.0234 38.5466 15.5294 38.5466 14.9547C38.5466 14.3799 38.4736 13.8884 38.3273 13.48C38.1862 13.0666 37.9795 12.7516 37.7072 12.5347C37.44 12.3129 37.1149 12.202 36.7317 12.202C36.3486 12.202 36.0183 12.3129 35.7411 12.5347C35.4688 12.7516 35.257 13.0666 35.1058 13.48C34.9596 13.8884 34.8865 14.3799 34.8865 14.9547Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M44.5908 20.7625V9.14678H48.7652V20.7625H44.5908ZM46.6779 7.93683C46.1133 7.93683 45.6294 7.75033 45.2261 7.37726C44.8227 7.00419 44.621 6.55549 44.621 6.03118C44.621 5.50686 44.8227 5.05816 45.2261 4.68509C45.6294 4.31202 46.1133 4.12549 46.6779 4.12549C47.2477 4.12549 47.7316 4.31202 48.1299 4.68509C48.5332 5.05816 48.7349 5.50686 48.7349 6.03118C48.7349 6.55549 48.5332 7.00419 48.1299 7.37726C47.7316 7.75033 47.2477 7.93683 46.6779 7.93683Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M55.0664 5.27496V20.7625H50.892V5.27496H55.0664Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M62.7893 20.9742C61.5289 20.9742 60.4501 20.7246 59.5527 20.2256C58.6553 19.7214 57.9671 19.0206 57.4881 18.1232C57.0093 17.2208 56.7698 16.1747 56.7698 14.9849C56.7698 13.7951 57.0093 12.7516 57.4881 11.8542C57.9671 10.9517 58.6553 10.2509 59.5527 9.75184C60.4501 9.24767 61.5289 8.99564 62.7893 8.99564C64.0497 8.99564 65.1286 9.24767 66.026 9.75184C66.9234 10.2509 67.6115 10.9517 68.0904 11.8542C68.5694 12.7516 68.8089 13.7951 68.8089 14.9849C68.8089 16.1747 68.5694 17.2208 68.0904 18.1232C67.6115 19.0206 66.9234 19.7214 66.026 20.2256C65.1286 20.7246 64.0497 20.9742 62.7893 20.9742ZM62.8195 17.8888C63.1724 17.8888 63.4775 17.7703 63.7346 17.5334C63.9917 17.2965 64.1908 16.9587 64.332 16.5201C64.4731 16.0814 64.5438 15.5597 64.5438 14.9547C64.5438 14.3446 64.4731 13.8228 64.332 13.3893C64.1908 12.9506 63.9917 12.6128 63.7346 12.3759C63.4775 12.139 63.1724 12.0205 62.8195 12.0205C62.4464 12.0205 62.1263 12.139 61.8592 12.3759C61.5919 12.6128 61.3878 12.9506 61.2466 13.3893C61.1054 13.8228 61.0349 14.3446 61.0349 14.9547C61.0349 15.5597 61.1054 16.0814 61.2466 16.5201C61.3878 16.9587 61.5919 17.2965 61.8592 17.5334C62.1263 17.7703 62.4464 17.8888 62.8195 17.8888Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M77.4298 9.1468V12.1717H69.7769V9.1468H77.4298ZM71.2591 6.36392H75.4334V17.0267C75.4334 17.188 75.4612 17.3241 75.5166 17.4351C75.572 17.5409 75.6578 17.6216 75.7738 17.677C75.8897 17.7274 76.0384 17.7527 76.2199 17.7527C76.3459 17.7527 76.4921 17.7375 76.6585 17.7073C76.8299 17.677 76.9559 17.6518 77.0366 17.6317L77.6416 20.5659C77.4551 20.6213 77.1879 20.6894 76.84 20.77C76.4972 20.8507 76.0888 20.9037 75.6149 20.9288C74.657 20.9792 73.8529 20.8809 73.2026 20.6339C72.5522 20.3818 72.0631 19.9861 71.7355 19.4466C71.4078 18.9072 71.249 18.2316 71.2591 17.42V6.36392Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M79.3223 20.7625V5.27496H83.5268V11.5365H83.7385L88.397 5.27496H93.2973L88.0642 12.1717L93.4183 20.7625H88.397L84.9183 14.9546L83.5268 16.7696V20.7625H79.3223Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M95.3334 20.7625V9.14678H99.5077V20.7625H95.3334ZM97.4206 7.93683C96.8559 7.93683 96.3719 7.75033 95.9686 7.37726C95.5653 7.00419 95.3637 6.55549 95.3637 6.03118C95.3637 5.50686 95.5653 5.05816 95.9686 4.68509C96.3719 4.31202 96.8559 4.12549 97.4206 4.12549C97.9902 4.12549 98.4743 4.31202 98.8725 4.68509C99.2758 5.05816 99.4775 5.50686 99.4775 6.03118C99.4775 6.55549 99.2758 7.00419 98.8725 7.37726C98.4743 7.75033 97.9902 7.93683 97.4206 7.93683Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M108.562 9.1468V12.1717H100.909V9.1468H108.562ZM102.391 6.36392H106.565V17.0267C106.565 17.188 106.593 17.3241 106.648 17.4351C106.704 17.5409 106.789 17.6216 106.905 17.677C107.021 17.7274 107.17 17.7527 107.352 17.7527C107.478 17.7527 107.623 17.7375 107.791 17.7073C107.962 17.677 108.087 17.6518 108.168 17.6317L108.774 20.5659C108.587 20.6213 108.319 20.6894 107.971 20.77C107.629 20.8507 107.22 20.9037 106.747 20.9288C105.789 20.9792 104.985 20.8809 104.334 20.6339C103.684 20.3818 103.195 19.9861 102.867 19.4466C102.54 18.9072 102.381 18.2316 102.391 17.42V6.36392Z\\\" fill=\\\"%23010507\\\"/>%0A<path d=\\\"M119.539 8.67678C121.648 5.91866 123.398 3.19128 124.071 0.988777C124.089 0.928849 124.159 0.90339 124.212 0.937987C126.553 2.48864 130.818 3.50932 134.591 3.53328C134.656 3.53369 134.7 3.59769 134.677 3.65822C133.423 6.84039 131.891 12.5423 131.831 19.0536C131.831 19.1503 131.695 19.185 131.647 19.1009C129.5 15.3438 122.623 10.0644 119.574 8.81838C119.518 8.79519 119.502 8.7255 119.539 8.67678Z\\\" fill=\\\"url(%23paint0_linear_8010_10612)\\\"/>%0A<path d=\\\"M126.653 6.98969C123.357 8.03321 120.345 8.61334 119.626 8.74516C119.58 8.75356 119.571 8.81686 119.614 8.83473C122.687 10.1121 129.53 15.3761 131.657 19.118C131.661 19.1262 131.671 19.1292 131.68 19.1255C131.688 19.1214 131.693 19.1108 131.69 19.1016L126.653 6.98969Z\\\" fill=\\\"url(%23paint1_linear_8010_10612)\\\"/>%0A<path d=\\\"M124.221 0.931179C127.043 2.4702 130.303 3.16142 134.629 3.52564C134.656 3.52796 134.665 3.56437 134.641 3.57702C134.088 3.86136 130.918 5.47409 128.565 6.33784C127.934 6.56926 127.3 6.78394 126.676 6.982C126.662 6.98633 126.647 6.97951 126.641 6.96631L124.156 0.989469C124.139 0.949222 124.183 0.910305 124.221 0.931179Z\\\" fill=\\\"url(%23paint2_linear_8010_10612)\\\"/>%0A<path d=\\\"M124.171 1.02203L131.742 19.082\\\" stroke=\\\"%23513C9F\\\" stroke-width=\\\"0.183881\\\" stroke-linecap=\\\"round\\\"/>%0A<path d=\\\"M119.628 8.74279C119.628 8.74279 123.809 7.99233 127.739 6.63677C131.668 5.28124 134.594 3.6214 134.594 3.6214\\\" stroke=\\\"%23513C9F\\\" stroke-width=\\\"0.183881\\\" stroke-linecap=\\\"round\\\"/>%0A<path d=\\\"M125.209 3.30383L122.405 12.6358M122.405 12.6358H129.07M122.405 12.6358L111.874 25.0383\\\" stroke=\\\"%23ABABAB\\\" stroke-width=\\\"0.321797\\\" stroke-linecap=\\\"round\\\"/>%0A<path d=\\\"M119.181 22.485L117.94 22.6596C118.584 24.3618 119.904 25.1053 121.479 25.1053C125.341 25.1053 124.163 20.7382 126.4 20.7382C128.023 20.7382 127.364 24.2778 130.857 24.2778C132.989 24.2778 133.201 22.1301 132.837 21.2061C132.835 21.2005 132.833 21.1953 132.83 21.1902L132.259 20.3154C132.222 20.2572 132.131 20.2791 132.125 20.3483L132.018 21.4087C132.011 21.4824 132.013 21.5559 132.021 21.6295C132.109 22.3621 132.165 24.14 130.857 24.14C129.477 24.14 129.145 20.6462 126.4 20.6462C123.181 20.6462 123.594 24.9675 121.618 24.9675C120.313 24.9675 119.319 23.4964 119.181 22.485Z\\\" fill=\\\"url(%23paint3_linear_8010_10612)\\\"/>%0A<defs>%0A<linearGradient id=\\\"paint0_linear_8010_10612\\\" x1=\\\"129.301\\\" y1=\\\"2.33848\\\" x2=\\\"125.623\\\" y2=\\\"12.452\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%236430AB\\\"/>%0A<stop offset=\\\"1\\\" stop-color=\\\"%23AA89D8\\\"/>%0A</linearGradient>%0A<linearGradient id=\\\"paint1_linear_8010_10612\\\" x1=\\\"126.451\\\" y1=\\\"8.03874\\\" x2=\\\"121.717\\\" y2=\\\"17.1869\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%23005DBB\\\"/>%0A<stop offset=\\\"1\\\" stop-color=\\\"%233D92E8\\\"/>%0A</linearGradient>%0A<linearGradient id=\\\"paint2_linear_8010_10612\\\" x1=\\\"128.565\\\" y1=\\\"2.33842\\\" x2=\\\"127.139\\\" y2=\\\"6.79755\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%231B70C4\\\"/>%0A<stop offset=\\\"1\\\" stop-color=\\\"%2354A4F2\\\"/>%0A</linearGradient>%0A<linearGradient id=\\\"paint3_linear_8010_10612\\\" x1=\\\"117.94\\\" y1=\\\"22.7838\\\" x2=\\\"132.981\\\" y2=\\\"22.7838\\\" gradientUnits=\\\"userSpaceOnUse\\\">%0A<stop stop-color=\\\"%234497EA\\\"/>%0A<stop offset=\\\"0.254755\\\" stop-color=\\\"%231463B2\\\"/>%0A<stop offset=\\\"0.498725\\\" stop-color=\\\"%230A437D\\\"/>%0A<stop offset=\\\"0.666667\\\" stop-color=\\\"%232476C8\\\"/>%0A<stop offset=\\\"0.972542\\\" stop-color=\\\"%230C549A\\\"/>%0A</linearGradient>%0A</defs>%0A</svg>%0A\"","\"data:image/svg+xml,<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>%0A<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"55\\\" height=\\\"60\\\" viewBox=\\\"0 0 55 60\\\" fill=\\\"none\\\">%0A <g stroke=\\\"%23FFFFFF\\\" stroke-width=\\\"3.3125\\\" stroke-linejoin=\\\"round\\\">%0A <path d=\\\"M0 21.9336L16.5449 0C40.8483 5.37332 53 8.05998 53 8.05998L43.123 56L0 21.9336Z\\\" />%0A <line x1=\\\"16.5828\\\" y1=\\\"0\\\" x2=\\\"43.2454\\\" y2=\\\"56\\\" />%0A <line x1=\\\"0\\\" y1=\\\"21.9336\\\" x2=\\\"53\\\" y2=\\\"8.48421\\\" />%0A </g>%0A</svg>%0A\"","import type { Anchor, ContextState, Position, Size } from \"./types\";\n\nexport function updateSizeFromElement(\n state: ContextState,\n element: HTMLElement,\n fallback: Size,\n): void {\n const rect = element.getBoundingClientRect();\n state.size = {\n width: rect.width || fallback.width,\n height: rect.height || fallback.height,\n };\n}\n\nexport function clampSize(\n size: Size,\n viewport: Size,\n edgeMargin: number,\n minWidth: number,\n minHeight: number,\n): Size {\n const maxWidth = Math.max(minWidth, viewport.width - edgeMargin * 2);\n const maxHeight = Math.max(minHeight, viewport.height - edgeMargin * 2);\n\n return {\n width: clamp(size.width, minWidth, maxWidth),\n height: clamp(size.height, minHeight, maxHeight),\n };\n}\n\nexport function constrainToViewport(\n state: ContextState,\n position: Position,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxX = Math.max(\n edgeMargin,\n viewport.width - state.size.width - edgeMargin,\n );\n const maxY = Math.max(\n edgeMargin,\n viewport.height - state.size.height - edgeMargin,\n );\n\n return {\n x: clamp(position.x, edgeMargin, maxX),\n y: clamp(position.y, edgeMargin, maxY),\n };\n}\n\nexport function keepPositionWithinViewport(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): void {\n state.position = constrainToViewport(\n state,\n state.position,\n viewport,\n edgeMargin,\n );\n}\n\nexport function centerContext(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const centered: Position = {\n x: Math.round((viewport.width - state.size.width) / 2),\n y: Math.round((viewport.height - state.size.height) / 2),\n };\n\n state.position = constrainToViewport(state, centered, viewport, edgeMargin);\n updateAnchorFromPosition(state, viewport, edgeMargin);\n return state.position;\n}\n\nexport function updateAnchorFromPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): void {\n const centerX = state.position.x + state.size.width / 2;\n const centerY = state.position.y + state.size.height / 2;\n\n const horizontal: Anchor[\"horizontal\"] =\n centerX < viewport.width / 2 ? \"left\" : \"right\";\n const vertical: Anchor[\"vertical\"] =\n centerY < viewport.height / 2 ? \"top\" : \"bottom\";\n\n state.anchor = { horizontal, vertical };\n\n const maxHorizontalOffset = Math.max(\n edgeMargin,\n viewport.width - state.size.width - edgeMargin,\n );\n const maxVerticalOffset = Math.max(\n edgeMargin,\n viewport.height - state.size.height - edgeMargin,\n );\n\n state.anchorOffset = {\n x:\n horizontal === \"left\"\n ? clamp(state.position.x, edgeMargin, maxHorizontalOffset)\n : clamp(\n viewport.width - state.position.x - state.size.width,\n edgeMargin,\n maxHorizontalOffset,\n ),\n y:\n vertical === \"top\"\n ? clamp(state.position.y, edgeMargin, maxVerticalOffset)\n : clamp(\n viewport.height - state.position.y - state.size.height,\n edgeMargin,\n maxVerticalOffset,\n ),\n };\n}\n\nexport function applyAnchorPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxHorizontalOffset = Math.max(\n edgeMargin,\n viewport.width - state.size.width - edgeMargin,\n );\n const maxVerticalOffset = Math.max(\n edgeMargin,\n viewport.height - state.size.height - edgeMargin,\n );\n\n const horizontalOffset = clamp(\n state.anchorOffset.x,\n edgeMargin,\n maxHorizontalOffset,\n );\n const verticalOffset = clamp(\n state.anchorOffset.y,\n edgeMargin,\n maxVerticalOffset,\n );\n\n const x =\n state.anchor.horizontal === \"left\"\n ? horizontalOffset\n : viewport.width - state.size.width - horizontalOffset;\n\n const y =\n state.anchor.vertical === \"top\"\n ? verticalOffset\n : viewport.height - state.size.height - verticalOffset;\n\n state.anchorOffset = { x: horizontalOffset, y: verticalOffset };\n state.position = constrainToViewport(state, { x, y }, viewport, edgeMargin);\n return state.position;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(min, value), max);\n}\n","import type { Anchor, DockMode, Position, Size } from \"./types\";\n\nexport type PersistedContextState = {\n anchor?: Anchor;\n anchorOffset?: Position;\n size?: Size;\n hasCustomPosition?: boolean;\n};\n\nexport type PersistedState = {\n button?: Omit<PersistedContextState, \"size\">;\n window?: PersistedContextState;\n isOpen?: boolean;\n dockMode?: DockMode;\n selectedMenu?: string;\n selectedContext?: string;\n};\n\nexport function loadInspectorState(storageKey: string): PersistedState | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const raw = window.localStorage.getItem(storageKey);\n if (raw) {\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") {\n return parsed as PersistedState;\n }\n } catch {\n // Fall through to cookie migration path\n }\n }\n\n // Backwards compatibility: try to read the legacy cookie and migrate it\n if (typeof document !== \"undefined\") {\n const prefix = `${storageKey}=`;\n const entry = document.cookie\n .split(\"; \")\n .find((cookie) => cookie.startsWith(prefix));\n if (entry) {\n const legacyRaw = entry.substring(prefix.length);\n try {\n const parsed = JSON.parse(decodeURIComponent(legacyRaw));\n if (parsed && typeof parsed === \"object\") {\n return parsed as PersistedState;\n }\n } catch {\n return null;\n }\n }\n }\n\n return null;\n}\n\nexport function saveInspectorState(\n storageKey: string,\n state: PersistedState,\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(state));\n } catch (error) {\n console.warn(\"Failed to persist inspector state\", error);\n }\n}\n\nexport function isValidAnchor(value: unknown): value is Anchor {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Anchor;\n return (\n (candidate.horizontal === \"left\" || candidate.horizontal === \"right\") &&\n (candidate.vertical === \"top\" || candidate.vertical === \"bottom\")\n );\n}\n\nexport function isValidPosition(value: unknown): value is Position {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Position;\n return isFiniteNumber(candidate.x) && isFiniteNumber(candidate.y);\n}\n\nexport function isValidSize(value: unknown): value is Size {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Size;\n return isFiniteNumber(candidate.width) && isFiniteNumber(candidate.height);\n}\n\nexport function isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nexport function isValidDockMode(value: unknown): value is DockMode {\n return value === \"floating\" || value === \"docked-left\";\n}\n","import { LitElement, css, html, nothing, unsafeCSS } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport tailwindStyles from \"./styles/generated.css\";\nimport inspectorLogoUrl from \"./assets/inspector-logo.svg\";\nimport inspectorLogoIconUrl from \"./assets/inspector-logo-icon.svg\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport { icons } from \"lucide\";\nimport {\n CopilotKitCore,\n CopilotKitCoreRuntimeConnectionStatus,\n type CopilotKitCoreSubscriber,\n type CopilotKitCoreErrorCode,\n} from \"@copilotkit/core\";\nimport type { AbstractAgent, AgentSubscriber } from \"@ag-ui/client\";\nimport type {\n Anchor,\n ContextKey,\n ContextState,\n DockMode,\n Position,\n Size,\n} from \"./lib/types\";\nimport {\n applyAnchorPosition as applyAnchorPositionHelper,\n centerContext as centerContextHelper,\n constrainToViewport,\n keepPositionWithinViewport,\n updateAnchorFromPosition as updateAnchorFromPositionHelper,\n updateSizeFromElement,\n clampSize as clampSizeToViewport,\n} from \"./lib/context-helpers\";\nimport {\n loadInspectorState,\n saveInspectorState,\n type PersistedState,\n isValidAnchor,\n isValidPosition,\n isValidSize,\n isValidDockMode,\n} from \"./lib/persistence\";\n\nexport const WEB_INSPECTOR_TAG = \"cpk-web-inspector\" as const;\n\ntype LucideIconName = keyof typeof icons;\n\ntype MenuKey = \"ag-ui-events\" | \"agents\" | \"frontend-tools\" | \"agent-context\";\n\ntype MenuItem = {\n key: MenuKey;\n label: string;\n icon: LucideIconName;\n};\n\nconst EDGE_MARGIN = 16;\nconst DRAG_THRESHOLD = 6;\nconst MIN_WINDOW_WIDTH = 600;\nconst MIN_WINDOW_WIDTH_DOCKED_LEFT = 420;\nconst MIN_WINDOW_HEIGHT = 200;\nconst INSPECTOR_STORAGE_KEY = \"cpk:inspector:state\";\nconst ANNOUNCEMENT_STORAGE_KEY = \"cpk:inspector:announcements\";\nconst ANNOUNCEMENT_URL = \"https://cdn.copilotkit.ai/announcements.json\";\nconst DEFAULT_BUTTON_SIZE: Size = { width: 48, height: 48 };\nconst DEFAULT_WINDOW_SIZE: Size = { width: 840, height: 560 };\nconst DOCKED_LEFT_WIDTH = 500; // Sensible width for left dock with collapsed sidebar\nconst MAX_AGENT_EVENTS = 200;\nconst MAX_TOTAL_EVENTS = 500;\n\ntype InspectorAgentEventType =\n | \"RUN_STARTED\"\n | \"RUN_FINISHED\"\n | \"RUN_ERROR\"\n | \"TEXT_MESSAGE_START\"\n | \"TEXT_MESSAGE_CONTENT\"\n | \"TEXT_MESSAGE_END\"\n | \"TOOL_CALL_START\"\n | \"TOOL_CALL_ARGS\"\n | \"TOOL_CALL_END\"\n | \"TOOL_CALL_RESULT\"\n | \"STATE_SNAPSHOT\"\n | \"STATE_DELTA\"\n | \"MESSAGES_SNAPSHOT\"\n | \"RAW_EVENT\"\n | \"CUSTOM_EVENT\"\n | \"REASONING_START\"\n | \"REASONING_MESSAGE_START\"\n | \"REASONING_MESSAGE_CONTENT\"\n | \"REASONING_MESSAGE_END\"\n | \"REASONING_END\"\n | \"REASONING_ENCRYPTED_VALUE\";\n\nconst AGENT_EVENT_TYPES: readonly InspectorAgentEventType[] = [\n \"RUN_STARTED\",\n \"RUN_FINISHED\",\n \"RUN_ERROR\",\n \"TEXT_MESSAGE_START\",\n \"TEXT_MESSAGE_CONTENT\",\n \"TEXT_MESSAGE_END\",\n \"TOOL_CALL_START\",\n \"TOOL_CALL_ARGS\",\n \"TOOL_CALL_END\",\n \"TOOL_CALL_RESULT\",\n \"STATE_SNAPSHOT\",\n \"STATE_DELTA\",\n \"MESSAGES_SNAPSHOT\",\n \"RAW_EVENT\",\n \"CUSTOM_EVENT\",\n \"REASONING_START\",\n \"REASONING_MESSAGE_START\",\n \"REASONING_MESSAGE_CONTENT\",\n \"REASONING_MESSAGE_END\",\n \"REASONING_END\",\n \"REASONING_ENCRYPTED_VALUE\",\n] as const;\n\ntype SanitizedValue =\n | string\n | number\n | boolean\n | null\n | SanitizedValue[]\n | { [key: string]: SanitizedValue };\n\ntype InspectorToolCall = {\n id?: string;\n function?: {\n name?: string;\n arguments?: SanitizedValue | string;\n };\n toolName?: string;\n status?: string;\n};\n\ntype InspectorMessage = {\n id?: string;\n role: string;\n contentText: string;\n contentRaw?: SanitizedValue;\n toolCalls: InspectorToolCall[];\n};\n\ntype InspectorToolDefinition = {\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: \"handler\" | \"renderer\";\n};\n\ntype InspectorEvent = {\n id: string;\n agentId: string;\n type: InspectorAgentEventType;\n timestamp: number;\n payload: SanitizedValue;\n};\n\nexport class WebInspectorElement extends LitElement {\n static properties = {\n core: { attribute: false },\n autoAttachCore: { type: Boolean, attribute: \"auto-attach-core\" },\n } as const;\n\n private _core: CopilotKitCore | null = null;\n private coreSubscriber: CopilotKitCoreSubscriber | null = null;\n private coreUnsubscribe: (() => void) | null = null;\n private runtimeStatus: CopilotKitCoreRuntimeConnectionStatus | null = null;\n private coreProperties: Readonly<Record<string, unknown>> = {};\n private lastCoreError: {\n code: CopilotKitCoreErrorCode;\n message: string;\n } | null = null;\n private agentSubscriptions: Map<string, () => void> = new Map();\n private agentEvents: Map<string, InspectorEvent[]> = new Map();\n private agentMessages: Map<string, InspectorMessage[]> = new Map();\n private agentStates: Map<string, SanitizedValue> = new Map();\n private flattenedEvents: InspectorEvent[] = [];\n private eventCounter = 0;\n private contextStore: Record<\n string,\n { description?: string; value: unknown }\n > = {};\n\n private pointerId: number | null = null;\n private dragStart: Position | null = null;\n private dragOffset: Position = { x: 0, y: 0 };\n private isDragging = false;\n private pointerContext: ContextKey | null = null;\n private isOpen = false;\n private draggedDuringInteraction = false;\n private ignoreNextButtonClick = false;\n private selectedMenu: MenuKey = \"ag-ui-events\";\n private contextMenuOpen = false;\n private dockMode: DockMode = \"floating\";\n private previousBodyMargins: { left: string; bottom: string } | null = null;\n private transitionTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private bodyTransitionTimeoutIds: Set<ReturnType<typeof setTimeout>> =\n new Set();\n private pendingSelectedContext: string | null = null;\n private autoAttachCore = true;\n private attemptedAutoAttach = false;\n private cachedTools: InspectorToolDefinition[] = [];\n private toolSignature = \"\";\n private eventFilterText = \"\";\n private eventTypeFilter: InspectorAgentEventType | \"all\" = \"all\";\n\n private announcementMarkdown: string | null = null;\n private announcementHtml: string | null = null;\n private announcementTimestamp: string | null = null;\n private announcementPreviewText: string | null = null;\n private hasUnseenAnnouncement = false;\n private announcementLoaded = false;\n private announcementLoadError: unknown = null;\n private announcementPromise: Promise<void> | null = null;\n private showAnnouncementPreview = true;\n\n get core(): CopilotKitCore | null {\n return this._core;\n }\n\n set core(value: CopilotKitCore | null) {\n const oldValue = this._core;\n if (oldValue === value) {\n return;\n }\n\n this.detachFromCore();\n\n this._core = value ?? null;\n this.requestUpdate(\"core\", oldValue);\n\n if (this._core) {\n this.attachToCore(this._core);\n }\n }\n\n private readonly contextState: Record<ContextKey, ContextState> = {\n button: {\n position: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n size: { ...DEFAULT_BUTTON_SIZE },\n anchor: { horizontal: \"right\", vertical: \"top\" },\n anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n },\n window: {\n position: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n size: { ...DEFAULT_WINDOW_SIZE },\n anchor: { horizontal: \"right\", vertical: \"top\" },\n anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN },\n },\n };\n\n private hasCustomPosition: Record<ContextKey, boolean> = {\n button: false,\n window: false,\n };\n\n private resizePointerId: number | null = null;\n private resizeStart: Position | null = null;\n private resizeInitialSize: { width: number; height: number } | null = null;\n private isResizing = false;\n\n private readonly menuItems: MenuItem[] = [\n { key: \"ag-ui-events\", label: \"AG-UI Events\", icon: \"Zap\" },\n { key: \"agents\", label: \"Agent\", icon: \"Bot\" },\n { key: \"frontend-tools\", label: \"Frontend Tools\", icon: \"Hammer\" },\n { key: \"agent-context\", label: \"Context\", icon: \"FileText\" },\n ];\n\n private attachToCore(core: CopilotKitCore): void {\n this.runtimeStatus = core.runtimeConnectionStatus;\n this.coreProperties = core.properties;\n this.lastCoreError = null;\n\n this.coreSubscriber = {\n onRuntimeConnectionStatusChanged: ({ status }) => {\n this.runtimeStatus = status;\n this.requestUpdate();\n },\n onPropertiesChanged: ({ properties }) => {\n this.coreProperties = properties;\n this.requestUpdate();\n },\n onError: ({ code, error }) => {\n this.lastCoreError = { code, message: error.message };\n this.requestUpdate();\n },\n onAgentsChanged: ({ agents }) => {\n this.processAgentsChanged(agents);\n },\n onContextChanged: ({ context }) => {\n this.contextStore = this.normalizeContextStore(context);\n this.requestUpdate();\n },\n } satisfies CopilotKitCoreSubscriber;\n\n this.coreUnsubscribe = core.subscribe(this.coreSubscriber).unsubscribe;\n this.processAgentsChanged(core.agents);\n\n // Initialize context from core\n if (core.context) {\n this.contextStore = this.normalizeContextStore(core.context);\n }\n }\n\n private detachFromCore(): void {\n if (this.coreUnsubscribe) {\n this.coreUnsubscribe();\n this.coreUnsubscribe = null;\n }\n this.coreSubscriber = null;\n this.runtimeStatus = null;\n this.lastCoreError = null;\n this.coreProperties = {};\n this.cachedTools = [];\n this.toolSignature = \"\";\n this.teardownAgentSubscriptions();\n }\n\n private teardownAgentSubscriptions(): void {\n for (const unsubscribe of this.agentSubscriptions.values()) {\n unsubscribe();\n }\n this.agentSubscriptions.clear();\n this.agentEvents.clear();\n this.agentMessages.clear();\n this.agentStates.clear();\n this.flattenedEvents = [];\n this.eventCounter = 0;\n }\n\n private processAgentsChanged(\n agents: Readonly<Record<string, AbstractAgent>>,\n ): void {\n const seenAgentIds = new Set<string>();\n\n for (const agent of Object.values(agents)) {\n if (!agent?.agentId) {\n continue;\n }\n seenAgentIds.add(agent.agentId);\n this.subscribeToAgent(agent);\n }\n\n for (const agentId of Array.from(this.agentSubscriptions.keys())) {\n if (!seenAgentIds.has(agentId)) {\n this.unsubscribeFromAgent(agentId);\n this.agentEvents.delete(agentId);\n this.agentMessages.delete(agentId);\n this.agentStates.delete(agentId);\n }\n }\n\n this.updateContextOptions(seenAgentIds);\n this.refreshToolsSnapshot();\n this.requestUpdate();\n }\n\n private refreshToolsSnapshot(): void {\n if (!this._core) {\n if (this.cachedTools.length > 0) {\n this.cachedTools = [];\n this.toolSignature = \"\";\n this.requestUpdate();\n }\n return;\n }\n\n const tools = this.extractToolsFromAgents();\n const signature = JSON.stringify(\n tools.map((tool) => ({\n agentId: tool.agentId,\n name: tool.name,\n type: tool.type,\n hasDescription: Boolean(tool.description),\n hasParameters: Boolean(tool.parameters),\n })),\n );\n\n if (signature !== this.toolSignature) {\n this.toolSignature = signature;\n this.cachedTools = tools;\n this.requestUpdate();\n }\n }\n\n private tryAutoAttachCore(): void {\n if (\n this.attemptedAutoAttach ||\n this._core ||\n !this.autoAttachCore ||\n typeof window === \"undefined\"\n ) {\n return;\n }\n\n this.attemptedAutoAttach = true;\n\n const globalWindow = window as unknown as Record<string, unknown>;\n const globalCandidates: Array<unknown> = [\n // Common app-level globals used during development\n globalWindow.__COPILOTKIT_CORE__,\n (globalWindow.copilotkit as { core?: unknown } | undefined)?.core,\n globalWindow.copilotkitCore,\n ];\n\n const foundCore = globalCandidates.find(\n (candidate): candidate is CopilotKitCore =>\n !!candidate && typeof candidate === \"object\",\n );\n\n if (foundCore) {\n this.core = foundCore;\n }\n }\n\n private subscribeToAgent(agent: AbstractAgent): void {\n if (!agent.agentId) {\n return;\n }\n\n const agentId = agent.agentId;\n\n this.unsubscribeFromAgent(agentId);\n\n const subscriber: AgentSubscriber = {\n onRunStartedEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RUN_STARTED\", event);\n },\n onRunFinishedEvent: ({ event, result }) => {\n this.recordAgentEvent(agentId, \"RUN_FINISHED\", { event, result });\n },\n onRunErrorEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RUN_ERROR\", event);\n },\n onTextMessageStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_START\", event);\n },\n onTextMessageContentEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_CONTENT\", {\n event,\n textMessageBuffer,\n });\n },\n onTextMessageEndEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_END\", {\n event,\n textMessageBuffer,\n });\n },\n onToolCallStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_START\", event);\n },\n onToolCallArgsEvent: ({\n event,\n toolCallBuffer,\n toolCallName,\n partialToolCallArgs,\n }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_ARGS\", {\n event,\n toolCallBuffer,\n toolCallName,\n partialToolCallArgs,\n });\n },\n onToolCallEndEvent: ({ event, toolCallArgs, toolCallName }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_END\", {\n event,\n toolCallArgs,\n toolCallName,\n });\n },\n onToolCallResultEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_RESULT\", event);\n },\n onStateSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_SNAPSHOT\", event);\n this.syncAgentState(agent);\n },\n onStateDeltaEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_DELTA\", event);\n this.syncAgentState(agent);\n },\n onMessagesSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"MESSAGES_SNAPSHOT\", event);\n this.syncAgentMessages(agent);\n },\n onMessagesChanged: () => {\n this.syncAgentMessages(agent);\n },\n onRawEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RAW_EVENT\", event);\n },\n onCustomEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"CUSTOM_EVENT\", event);\n },\n onReasoningStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_START\", event);\n },\n onReasoningMessageStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_MESSAGE_START\", event);\n },\n onReasoningMessageContentEvent: ({ event, reasoningMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"REASONING_MESSAGE_CONTENT\", {\n event,\n reasoningMessageBuffer,\n });\n },\n onReasoningMessageEndEvent: ({ event, reasoningMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"REASONING_MESSAGE_END\", {\n event,\n reasoningMessageBuffer,\n });\n },\n onReasoningEndEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_END\", event);\n },\n onReasoningEncryptedValueEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"REASONING_ENCRYPTED_VALUE\", event);\n },\n };\n\n const { unsubscribe } = agent.subscribe(subscriber);\n this.agentSubscriptions.set(agentId, unsubscribe);\n this.syncAgentMessages(agent);\n this.syncAgentState(agent);\n\n if (!this.agentEvents.has(agentId)) {\n this.agentEvents.set(agentId, []);\n }\n }\n\n private unsubscribeFromAgent(agentId: string): void {\n const unsubscribe = this.agentSubscriptions.get(agentId);\n if (unsubscribe) {\n unsubscribe();\n this.agentSubscriptions.delete(agentId);\n }\n }\n\n private recordAgentEvent(\n agentId: string,\n type: InspectorAgentEventType,\n payload: unknown,\n ): void {\n const eventId = `${agentId}:${++this.eventCounter}`;\n const normalizedPayload = this.normalizeEventPayload(type, payload);\n const event: InspectorEvent = {\n id: eventId,\n agentId,\n type,\n timestamp: Date.now(),\n payload: normalizedPayload,\n };\n\n const currentAgentEvents = this.agentEvents.get(agentId) ?? [];\n const nextAgentEvents = [event, ...currentAgentEvents].slice(\n 0,\n MAX_AGENT_EVENTS,\n );\n this.agentEvents.set(agentId, nextAgentEvents);\n\n this.flattenedEvents = [event, ...this.flattenedEvents].slice(\n 0,\n MAX_TOTAL_EVENTS,\n );\n this.refreshToolsSnapshot();\n this.requestUpdate();\n }\n\n private syncAgentMessages(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const messages = this.normalizeAgentMessages(\n (agent as { messages?: unknown }).messages,\n );\n if (messages) {\n this.agentMessages.set(agent.agentId, messages);\n } else {\n this.agentMessages.delete(agent.agentId);\n }\n\n this.requestUpdate();\n }\n\n private syncAgentState(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const state = (agent as { state?: unknown }).state;\n\n if (state === undefined || state === null) {\n this.agentStates.delete(agent.agentId);\n } else {\n this.agentStates.set(agent.agentId, this.sanitizeForLogging(state));\n }\n\n this.requestUpdate();\n }\n\n private updateContextOptions(agentIds: Set<string>): void {\n const nextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ...Array.from(agentIds)\n .sort((a, b) => a.localeCompare(b))\n .map((id) => ({ key: id, label: id })),\n ];\n\n const optionsChanged =\n this.contextOptions.length !== nextOptions.length ||\n this.contextOptions.some(\n (option, index) => option.key !== nextOptions[index]?.key,\n );\n\n if (optionsChanged) {\n this.contextOptions = nextOptions;\n }\n\n const pendingContext = this.pendingSelectedContext;\n if (pendingContext) {\n const isPendingAvailable =\n pendingContext === \"all-agents\" || agentIds.has(pendingContext);\n if (isPendingAvailable) {\n if (this.selectedContext !== pendingContext) {\n this.selectedContext = pendingContext;\n this.expandedRows.clear();\n }\n this.pendingSelectedContext = null;\n } else if (agentIds.size > 0) {\n // Agents are loaded but the pending selection no longer exists\n this.pendingSelectedContext = null;\n }\n }\n\n const hasSelectedContext = nextOptions.some(\n (option) => option.key === this.selectedContext,\n );\n\n if (!hasSelectedContext && this.pendingSelectedContext === null) {\n // Auto-select \"default\" agent if it exists, otherwise first agent, otherwise \"all-agents\"\n let nextSelected: string = \"all-agents\";\n\n if (agentIds.has(\"default\")) {\n nextSelected = \"default\";\n } else if (agentIds.size > 0) {\n nextSelected = Array.from(agentIds).sort((a, b) =>\n a.localeCompare(b),\n )[0]!;\n }\n\n if (this.selectedContext !== nextSelected) {\n this.selectedContext = nextSelected;\n this.expandedRows.clear();\n this.persistState();\n }\n }\n }\n\n private getEventsForSelectedContext(): InspectorEvent[] {\n if (this.selectedContext === \"all-agents\") {\n return this.flattenedEvents;\n }\n\n return this.agentEvents.get(this.selectedContext) ?? [];\n }\n\n private filterEvents(events: InspectorEvent[]): InspectorEvent[] {\n const query = this.eventFilterText.trim().toLowerCase();\n\n return events.filter((event) => {\n if (\n this.eventTypeFilter !== \"all\" &&\n event.type !== this.eventTypeFilter\n ) {\n return false;\n }\n\n if (!query) {\n return true;\n }\n\n const payloadText = this.stringifyPayload(\n event.payload,\n false,\n ).toLowerCase();\n return (\n event.type.toLowerCase().includes(query) ||\n event.agentId.toLowerCase().includes(query) ||\n payloadText.includes(query)\n );\n });\n }\n\n private getLatestStateForAgent(agentId: string): SanitizedValue | null {\n if (this.agentStates.has(agentId)) {\n const value = this.agentStates.get(agentId);\n return value === undefined ? null : value;\n }\n\n const events = this.agentEvents.get(agentId) ?? [];\n const stateEvent = events.find((e) => e.type === \"STATE_SNAPSHOT\");\n if (!stateEvent) {\n return null;\n }\n return stateEvent.payload;\n }\n\n private getLatestMessagesForAgent(\n agentId: string,\n ): InspectorMessage[] | null {\n const messages = this.agentMessages.get(agentId);\n return messages ?? null;\n }\n\n private getAgentStatus(agentId: string): \"running\" | \"idle\" | \"error\" {\n const events = this.agentEvents.get(agentId) ?? [];\n if (events.length === 0) {\n return \"idle\";\n }\n\n // Check most recent run-related event\n const runEvent = events.find(\n (e) =>\n e.type === \"RUN_STARTED\" ||\n e.type === \"RUN_FINISHED\" ||\n e.type === \"RUN_ERROR\",\n );\n\n if (!runEvent) {\n return \"idle\";\n }\n\n if (runEvent.type === \"RUN_ERROR\") {\n return \"error\";\n }\n\n if (runEvent.type === \"RUN_STARTED\") {\n // Check if there's a RUN_FINISHED after this\n const finishedAfter = events.find(\n (e) => e.type === \"RUN_FINISHED\" && e.timestamp > runEvent.timestamp,\n );\n return finishedAfter ? \"idle\" : \"running\";\n }\n\n return \"idle\";\n }\n\n private getAgentStats(agentId: string): {\n totalEvents: number;\n lastActivity: number | null;\n messages: number;\n toolCalls: number;\n errors: number;\n } {\n const events = this.agentEvents.get(agentId) ?? [];\n\n const messages = this.agentMessages.get(agentId);\n\n const toolCallCount = messages\n ? messages.reduce(\n (count, message) => count + (message.toolCalls?.length ?? 0),\n 0,\n )\n : events.filter((e) => e.type === \"TOOL_CALL_END\").length;\n\n const messageCount = messages?.length ?? 0;\n\n return {\n totalEvents: events.length,\n lastActivity: events[0]?.timestamp ?? null,\n messages: messageCount,\n toolCalls: toolCallCount,\n errors: events.filter((e) => e.type === \"RUN_ERROR\").length,\n };\n }\n\n private renderToolCallDetails(toolCalls: InspectorToolCall[]) {\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n return nothing;\n }\n\n return html`\n <div class=\"mt-2 space-y-2\">\n ${toolCalls.map((call, index) => {\n const functionName =\n call.function?.name ?? call.toolName ?? \"Unknown function\";\n const callId =\n typeof call?.id === \"string\" ? call.id : `tool-call-${index + 1}`;\n const argsString = this.formatToolCallArguments(\n call.function?.arguments,\n );\n return html`\n <div\n class=\"rounded-md border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700\"\n >\n <div\n class=\"flex flex-wrap items-center justify-between gap-1 font-medium text-gray-900\"\n >\n <span>${functionName}</span>\n <span class=\"text-[10px] text-gray-500\">ID: ${callId}</span>\n </div>\n ${\n argsString\n ? html`<pre\n class=\"mt-2 overflow-auto rounded bg-white p-2 text-[11px] leading-relaxed text-gray-800\"\n >\n${argsString}</pre\n >`\n : nothing\n }\n </div>\n `;\n })}\n </div>\n `;\n }\n\n private formatToolCallArguments(args: unknown): string | null {\n if (args === undefined || args === null || args === \"\") {\n return null;\n }\n\n if (typeof args === \"string\") {\n try {\n const parsed = JSON.parse(args);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return args;\n }\n }\n\n if (typeof args === \"object\") {\n try {\n return JSON.stringify(args, null, 2);\n } catch {\n return String(args);\n }\n }\n\n return String(args);\n }\n\n private hasRenderableState(state: unknown): boolean {\n if (state === null || state === undefined) {\n return false;\n }\n\n if (Array.isArray(state)) {\n return state.length > 0;\n }\n\n if (typeof state === \"object\") {\n return Object.keys(state as Record<string, unknown>).length > 0;\n }\n\n if (typeof state === \"string\") {\n const trimmed = state.trim();\n return trimmed.length > 0 && trimmed !== \"{}\";\n }\n\n return true;\n }\n\n private formatStateForDisplay(state: unknown): string {\n if (state === null || state === undefined) {\n return \"\";\n }\n\n if (typeof state === \"string\") {\n const trimmed = state.trim();\n if (trimmed.length === 0) {\n return \"\";\n }\n try {\n const parsed = JSON.parse(trimmed);\n return JSON.stringify(parsed, null, 2);\n } catch {\n return state;\n }\n }\n\n if (typeof state === \"object\") {\n try {\n return JSON.stringify(state, null, 2);\n } catch {\n return String(state);\n }\n }\n\n return String(state);\n }\n\n private getEventBadgeClasses(type: string): string {\n const base =\n \"font-mono text-[10px] font-medium inline-flex items-center rounded-sm px-1.5 py-0.5 border\";\n\n if (type.startsWith(\"RUN_\")) {\n return `${base} bg-blue-50 text-blue-700 border-blue-200`;\n }\n\n if (type.startsWith(\"TEXT_MESSAGE\")) {\n return `${base} bg-emerald-50 text-emerald-700 border-emerald-200`;\n }\n\n if (type.startsWith(\"TOOL_CALL\")) {\n return `${base} bg-amber-50 text-amber-700 border-amber-200`;\n }\n\n if (type.startsWith(\"REASONING\")) {\n return `${base} bg-fuchsia-50 text-fuchsia-700 border-fuchsia-200`;\n }\n\n if (type.startsWith(\"STATE\")) {\n return `${base} bg-violet-50 text-violet-700 border-violet-200`;\n }\n\n if (type.startsWith(\"MESSAGES\")) {\n return `${base} bg-sky-50 text-sky-700 border-sky-200`;\n }\n\n if (type === \"RUN_ERROR\") {\n return `${base} bg-rose-50 text-rose-700 border-rose-200`;\n }\n\n return `${base} bg-gray-100 text-gray-600 border-gray-200`;\n }\n\n private stringifyPayload(payload: unknown, pretty: boolean): string {\n try {\n if (payload === undefined) {\n return pretty ? \"undefined\" : \"undefined\";\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n return JSON.stringify(payload, null, pretty ? 2 : 0) ?? \"\";\n } catch (error) {\n console.warn(\"Failed to stringify inspector payload\", error);\n return String(payload);\n }\n }\n\n private extractEventFromPayload(payload: unknown): unknown {\n // If payload is an object with an 'event' field, extract it\n if (payload && typeof payload === \"object\" && \"event\" in payload) {\n return (payload as Record<string, unknown>).event;\n }\n // Otherwise, assume the payload itself is the event\n return payload;\n }\n\n private async copyToClipboard(text: string, eventId: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.copiedEvents.add(eventId);\n this.requestUpdate();\n\n // Clear the \"copied\" state after 2 seconds\n setTimeout(() => {\n this.copiedEvents.delete(eventId);\n this.requestUpdate();\n }, 2000);\n } catch (err) {\n console.error(\"Failed to copy to clipboard:\", err);\n }\n }\n\n static styles = [\n unsafeCSS(tailwindStyles),\n css`\n :host {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 2147483646;\n display: block;\n will-change: transform;\n }\n\n :host([data-transitioning=\"true\"]) {\n transition: transform 300ms ease;\n }\n\n .console-button {\n transition:\n transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n opacity 160ms ease;\n }\n\n .console-button[data-dragging=\"true\"] {\n transition: opacity 160ms ease;\n }\n\n .inspector-window[data-transitioning=\"true\"] {\n transition:\n width 300ms ease,\n height 300ms ease;\n }\n\n .inspector-window[data-docked=\"true\"] {\n border-radius: 0 !important;\n box-shadow: none !important;\n }\n\n .resize-handle {\n touch-action: none;\n user-select: none;\n }\n\n .dock-resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: 10px;\n height: 100%;\n cursor: ew-resize;\n touch-action: none;\n z-index: 50;\n background: transparent;\n }\n\n .tooltip-target {\n position: relative;\n }\n\n .tooltip-target::after {\n content: attr(data-tooltip);\n position: absolute;\n top: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%) translateY(-4px);\n white-space: nowrap;\n background: rgba(17, 24, 39, 0.95);\n color: white;\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 10px;\n line-height: 1.2;\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);\n opacity: 0;\n pointer-events: none;\n transition:\n opacity 120ms ease,\n transform 120ms ease;\n z-index: 4000;\n }\n\n .tooltip-target:hover::after {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n .announcement-preview {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n min-width: 300px;\n max-width: 300px;\n background: white;\n color: #111827;\n font-size: 13px;\n line-height: 1.4;\n border-radius: 12px;\n box-shadow: 0 12px 28px rgba(15, 23, 42, 0.22);\n padding: 10px 12px;\n display: inline-flex;\n align-items: flex-start;\n gap: 8px;\n z-index: 4500;\n animation: fade-slide-in 160ms ease;\n border: 1px solid rgba(148, 163, 184, 0.35);\n white-space: normal;\n word-break: break-word;\n text-align: left;\n }\n\n .announcement-preview[data-side=\"left\"] {\n right: 100%;\n margin-right: 10px;\n }\n\n .announcement-preview[data-side=\"right\"] {\n left: 100%;\n margin-left: 10px;\n }\n\n .announcement-preview__arrow {\n position: absolute;\n width: 10px;\n height: 10px;\n background: white;\n border: 1px solid rgba(148, 163, 184, 0.35);\n transform: rotate(45deg);\n top: 50%;\n margin-top: -5px;\n z-index: -1;\n }\n\n .announcement-preview[data-side=\"left\"] .announcement-preview__arrow {\n right: -5px;\n box-shadow: 6px -6px 10px rgba(15, 23, 42, 0.12);\n }\n\n .announcement-preview[data-side=\"right\"] .announcement-preview__arrow {\n left: -5px;\n box-shadow: -6px 6px 10px rgba(15, 23, 42, 0.12);\n }\n\n .announcement-dismiss {\n color: #6b7280;\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 8px;\n border: 1px solid rgba(148, 163, 184, 0.5);\n background: rgba(248, 250, 252, 0.9);\n transition:\n background 120ms ease,\n color 120ms ease;\n }\n\n .announcement-dismiss:hover {\n background: rgba(241, 245, 249, 1);\n color: #111827;\n }\n\n .announcement-content {\n color: #111827;\n font-size: 14px;\n line-height: 1.6;\n }\n\n .announcement-content h1,\n .announcement-content h2,\n .announcement-content h3 {\n font-weight: 700;\n margin: 0.4rem 0 0.2rem;\n }\n\n .announcement-content h1 {\n font-size: 1.1rem;\n }\n\n .announcement-content h2 {\n font-size: 1rem;\n }\n\n .announcement-content h3 {\n font-size: 0.95rem;\n }\n\n .announcement-content p {\n margin: 0.25rem 0;\n }\n\n .announcement-content ul {\n list-style: disc;\n padding-left: 1.25rem;\n margin: 0.3rem 0;\n }\n\n .announcement-content ol {\n list-style: decimal;\n padding-left: 1.25rem;\n margin: 0.3rem 0;\n }\n\n .announcement-content a {\n color: #0f766e;\n text-decoration: underline;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n window.addEventListener(\n \"pointerdown\",\n this.handleGlobalPointerDown as EventListener,\n );\n\n // Load state early (before first render) so menu selection is correct\n this.hydrateStateFromStorageEarly();\n this.tryAutoAttachCore();\n this.ensureAnnouncementLoading();\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"resize\", this.handleResize);\n window.removeEventListener(\n \"pointerdown\",\n this.handleGlobalPointerDown as EventListener,\n );\n }\n // Clear pending body-transition timers to prevent post-teardown errors\n for (const id of this.bodyTransitionTimeoutIds) {\n clearTimeout(id);\n }\n this.bodyTransitionTimeoutIds.clear();\n if (this.transitionTimeoutId !== null) {\n clearTimeout(this.transitionTimeoutId);\n this.transitionTimeoutId = null;\n }\n this.removeDockStyles(true); // Clean up any docking styles, skip transition\n this.detachFromCore();\n }\n\n firstUpdated(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (!this._core) {\n this.tryAutoAttachCore();\n }\n\n this.measureContext(\"button\");\n this.measureContext(\"window\");\n\n this.contextState.button.anchor = { horizontal: \"right\", vertical: \"top\" };\n this.contextState.button.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.contextState.window.anchor = { horizontal: \"right\", vertical: \"top\" };\n this.contextState.window.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.hydrateStateFromStorage();\n\n // Apply docking styles if open and docked (skip transition on initial load)\n if (this.isOpen && this.dockMode !== \"floating\") {\n this.applyDockStyles(true);\n }\n\n this.applyAnchorPosition(\"button\");\n\n if (this.dockMode === \"floating\") {\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n }\n\n this.ensureAnnouncementLoading();\n\n this.updateHostTransform(this.isOpen ? \"window\" : \"button\");\n }\n\n render() {\n return this.isOpen ? this.renderWindow() : this.renderButton();\n }\n\n private renderButton() {\n const buttonClasses = [\n \"console-button\",\n \"group\",\n \"relative\",\n \"pointer-events-auto\",\n \"inline-flex\",\n \"h-12\",\n \"w-12\",\n \"items-center\",\n \"justify-center\",\n \"rounded-full\",\n \"border\",\n \"border-white/20\",\n \"bg-slate-950/95\",\n \"text-xs\",\n \"font-medium\",\n \"text-white\",\n \"ring-1\",\n \"ring-white/10\",\n \"backdrop-blur-md\",\n \"transition\",\n \"hover:border-white/30\",\n \"hover:bg-slate-900/95\",\n \"hover:scale-105\",\n \"focus-visible:outline\",\n \"focus-visible:outline-2\",\n \"focus-visible:outline-offset-2\",\n \"focus-visible:outline-rose-500\",\n \"touch-none\",\n \"select-none\",\n this.isDragging ? \"cursor-grabbing\" : \"cursor-grab\",\n ].join(\" \");\n\n return html`\n <button\n class=${buttonClasses}\n type=\"button\"\n aria-label=\"Web Inspector\"\n data-drag-context=\"button\"\n data-dragging=${\n this.isDragging && this.pointerContext === \"button\" ? \"true\" : \"false\"\n }\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n @click=${this.handleButtonClick}\n >\n ${this.renderAnnouncementPreview()}\n <img\n src=${inspectorLogoIconUrl}\n alt=\"Inspector logo\"\n class=\"h-5 w-auto\"\n loading=\"lazy\"\n />\n </button>\n `;\n }\n\n private renderWindow() {\n const windowState = this.contextState.window;\n const isDocked = this.dockMode !== \"floating\";\n const isTransitioning = this.hasAttribute(\"data-transitioning\");\n\n const windowStyles = isDocked\n ? this.getDockedWindowStyles()\n : {\n width: `${Math.round(windowState.size.width)}px`,\n height: `${Math.round(windowState.size.height)}px`,\n minWidth: `${MIN_WINDOW_WIDTH}px`,\n minHeight: `${MIN_WINDOW_HEIGHT}px`,\n };\n\n const hasContextDropdown = this.contextOptions.length > 0;\n const contextDropdown = hasContextDropdown\n ? this.renderContextDropdown()\n : nothing;\n const coreStatus = this.getCoreStatusSummary();\n const agentSelector = hasContextDropdown\n ? contextDropdown\n : html`\n <div\n class=\"flex items-center gap-2 rounded-md border border-dashed border-gray-200 px-2 py-1 text-xs text-gray-400\"\n >\n <span>${this.renderIcon(\"Bot\")}</span>\n <span class=\"truncate\">No agents available</span>\n </div>\n `;\n\n return html`\n <section\n class=\"inspector-window pointer-events-auto relative flex flex-col overflow-hidden rounded-xl border border-gray-200 bg-white text-gray-900 shadow-lg\"\n style=${styleMap(windowStyles)}\n data-docked=${isDocked}\n data-transitioning=${isTransitioning}\n >\n ${\n isDocked\n ? html`\n <div\n class=\"dock-resize-handle pointer-events-auto\"\n role=\"presentation\"\n aria-hidden=\"true\"\n @pointerdown=${this.handleResizePointerDown}\n @pointermove=${this.handleResizePointerMove}\n @pointerup=${this.handleResizePointerUp}\n @pointercancel=${this.handleResizePointerCancel}\n ></div>\n `\n : nothing\n }\n <div\n class=\"flex flex-1 flex-col overflow-hidden bg-white text-gray-800\"\n >\n <div\n class=\"drag-handle relative z-30 flex flex-col border-b border-gray-200 bg-white/95 backdrop-blur-sm ${\n isDocked\n ? \"\"\n : this.isDragging && this.pointerContext === \"window\"\n ? \"cursor-grabbing\"\n : \"cursor-grab\"\n }\"\n data-drag-context=\"window\"\n @pointerdown=${isDocked ? undefined : this.handlePointerDown}\n @pointermove=${isDocked ? undefined : this.handlePointerMove}\n @pointerup=${isDocked ? undefined : this.handlePointerUp}\n @pointercancel=${isDocked ? undefined : this.handlePointerCancel}\n >\n <div class=\"flex flex-wrap items-center gap-3 px-4 py-3\">\n <div class=\"flex items-center min-w-0\">\n <img\n src=${inspectorLogoUrl}\n alt=\"Inspector logo\"\n class=\"h-6 w-auto\"\n loading=\"lazy\"\n />\n </div>\n <div class=\"ml-auto flex min-w-0 items-center gap-2\">\n <div class=\"min-w-[160px] max-w-xs\">${agentSelector}</div>\n <div class=\"flex items-center gap-1\">\n ${this.renderDockControls()}\n <button\n class=\"flex h-8 w-8 items-center justify-center rounded-md text-gray-400 transition hover:bg-gray-100 hover:text-gray-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\"\n type=\"button\"\n aria-label=\"Close Web Inspector\"\n @pointerdown=${this.handleClosePointerDown}\n @click=${this.handleCloseClick}\n >\n ${this.renderIcon(\"X\")}\n </button>\n </div>\n </div>\n </div>\n <div\n class=\"flex flex-wrap items-center gap-2 border-t border-gray-100 px-3 py-2 text-xs\"\n >\n ${this.menuItems.map(({ key, label, icon }) => {\n const isSelected = this.selectedMenu === key;\n const tabClasses = [\n \"inline-flex items-center gap-2 rounded-md px-3 py-2 transition focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-300\",\n isSelected\n ? \"bg-gray-900 text-white shadow-sm\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n ].join(\" \");\n\n return html`\n <button\n type=\"button\"\n class=${tabClasses}\n aria-pressed=${isSelected}\n @click=${() => this.handleMenuSelect(key)}\n >\n <span\n class=\"text-gray-400 ${isSelected ? \"text-white\" : \"\"}\"\n >\n ${this.renderIcon(icon)}\n </span>\n <span>${label}</span>\n </button>\n `;\n })}\n </div>\n </div>\n <div class=\"flex flex-1 flex-col overflow-hidden\">\n <div class=\"flex-1 overflow-auto\">\n ${this.renderAnnouncementPanel()}\n ${this.renderCoreWarningBanner()} ${this.renderMainContent()}\n <slot></slot>\n </div>\n <div class=\"border-t border-gray-200 bg-gray-50 px-4 py-2\">\n <div\n class=\"flex items-center gap-2 rounded-md px-3 py-2 text-xs ${coreStatus.tone} w-full overflow-hidden my-1\"\n title=${coreStatus.description}\n >\n <span\n class=\"flex h-6 w-6 items-center justify-center rounded bg-white/60\"\n >\n ${this.renderIcon(\"Activity\")}\n </span>\n <span class=\"font-medium\">${coreStatus.label}</span>\n <span class=\"truncate text-[11px] opacity-80\"\n >${coreStatus.description}</span\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"resize-handle pointer-events-auto absolute bottom-1 right-1 flex h-5 w-5 cursor-nwse-resize items-center justify-center text-gray-400 transition hover:text-gray-600\"\n role=\"presentation\"\n aria-hidden=\"true\"\n @pointerdown=${this.handleResizePointerDown}\n @pointermove=${this.handleResizePointerMove}\n @pointerup=${this.handleResizePointerUp}\n @pointercancel=${this.handleResizePointerCancel}\n >\n <svg\n class=\"h-3 w-3\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-linecap=\"round\"\n stroke-width=\"1.5\"\n >\n <path d=\"M5 15L15 5\" />\n <path d=\"M9 15L15 9\" />\n </svg>\n </div>\n </section>\n `;\n }\n\n private hydrateStateFromStorageEarly(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(INSPECTOR_STORAGE_KEY);\n if (!persisted) {\n return;\n }\n\n // Restore the open/closed state\n if (typeof persisted.isOpen === \"boolean\") {\n this.isOpen = persisted.isOpen;\n }\n\n // Restore the dock mode\n if (isValidDockMode(persisted.dockMode)) {\n this.dockMode = persisted.dockMode;\n }\n\n // Restore selected menu\n if (typeof persisted.selectedMenu === \"string\") {\n const validMenu = this.menuItems.find(\n (item) => item.key === persisted.selectedMenu,\n );\n if (validMenu) {\n this.selectedMenu = validMenu.key;\n }\n }\n\n // Restore selected context (agent), will be validated later against available agents\n if (typeof persisted.selectedContext === \"string\") {\n this.selectedContext = persisted.selectedContext;\n this.pendingSelectedContext = persisted.selectedContext;\n }\n }\n\n private hydrateStateFromStorage(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(INSPECTOR_STORAGE_KEY);\n if (!persisted) {\n return;\n }\n\n const persistedButton = persisted.button;\n if (persistedButton) {\n if (isValidAnchor(persistedButton.anchor)) {\n this.contextState.button.anchor = persistedButton.anchor;\n }\n\n if (isValidPosition(persistedButton.anchorOffset)) {\n this.contextState.button.anchorOffset = persistedButton.anchorOffset;\n }\n\n if (typeof persistedButton.hasCustomPosition === \"boolean\") {\n this.hasCustomPosition.button = persistedButton.hasCustomPosition;\n }\n }\n\n const persistedWindow = persisted.window;\n if (persistedWindow) {\n if (isValidAnchor(persistedWindow.anchor)) {\n this.contextState.window.anchor = persistedWindow.anchor;\n }\n\n if (isValidPosition(persistedWindow.anchorOffset)) {\n this.contextState.window.anchorOffset = persistedWindow.anchorOffset;\n }\n\n if (isValidSize(persistedWindow.size)) {\n // Now clampWindowSize will use the correct minimum based on dockMode\n this.contextState.window.size = this.clampWindowSize(\n persistedWindow.size,\n );\n }\n\n if (typeof persistedWindow.hasCustomPosition === \"boolean\") {\n this.hasCustomPosition.window = persistedWindow.hasCustomPosition;\n }\n }\n\n if (typeof persisted.selectedContext === \"string\") {\n this.selectedContext = persisted.selectedContext;\n this.pendingSelectedContext = persisted.selectedContext;\n }\n }\n\n private get activeContext(): ContextKey {\n return this.isOpen ? \"window\" : \"button\";\n }\n\n private handlePointerDown = (event: PointerEvent) => {\n // Don't allow dragging when docked\n if (this.dockMode !== \"floating\" && this.isOpen) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n const contextAttr = target?.dataset.dragContext;\n const context: ContextKey = contextAttr === \"window\" ? \"window\" : \"button\";\n\n const eventTarget = event.target as HTMLElement | null;\n if (context === \"window\" && eventTarget?.closest(\"button\")) {\n return;\n }\n\n this.pointerContext = context;\n this.measureContext(context);\n\n event.preventDefault();\n\n this.pointerId = event.pointerId;\n this.dragStart = { x: event.clientX, y: event.clientY };\n const state = this.contextState[context];\n this.dragOffset = {\n x: event.clientX - state.position.x,\n y: event.clientY - state.position.y,\n };\n this.isDragging = false;\n this.draggedDuringInteraction = false;\n this.ignoreNextButtonClick = false;\n\n target?.setPointerCapture?.(this.pointerId);\n };\n\n private handlePointerMove = (event: PointerEvent) => {\n if (\n this.pointerId !== event.pointerId ||\n !this.dragStart ||\n !this.pointerContext\n ) {\n return;\n }\n\n const distance = Math.hypot(\n event.clientX - this.dragStart.x,\n event.clientY - this.dragStart.y,\n );\n if (!this.isDragging && distance < DRAG_THRESHOLD) {\n return;\n }\n\n event.preventDefault();\n this.setDragging(true);\n this.draggedDuringInteraction = true;\n\n const desired: Position = {\n x: event.clientX - this.dragOffset.x,\n y: event.clientY - this.dragOffset.y,\n };\n\n const constrained = this.constrainToViewport(desired, this.pointerContext);\n this.contextState[this.pointerContext].position = constrained;\n this.updateHostTransform(this.pointerContext);\n };\n\n private handlePointerUp = (event: PointerEvent) => {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.pointerId)) {\n target.releasePointerCapture(this.pointerId);\n }\n\n const context = this.pointerContext ?? this.activeContext;\n\n if (this.isDragging && this.pointerContext) {\n event.preventDefault();\n this.setDragging(false);\n if (this.pointerContext === \"window\") {\n this.updateAnchorFromPosition(this.pointerContext);\n this.hasCustomPosition.window = true;\n this.applyAnchorPosition(this.pointerContext);\n } else if (this.pointerContext === \"button\") {\n // Snap button to nearest corner\n this.snapButtonToCorner();\n this.hasCustomPosition.button = true;\n if (this.draggedDuringInteraction) {\n this.ignoreNextButtonClick = true;\n }\n }\n } else if (\n context === \"button\" &&\n !this.isOpen &&\n !this.draggedDuringInteraction\n ) {\n this.openInspector();\n }\n\n this.resetPointerTracking();\n };\n\n private handlePointerCancel = (event: PointerEvent) => {\n if (this.pointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.pointerId)) {\n target.releasePointerCapture(this.pointerId);\n }\n\n this.resetPointerTracking();\n };\n\n private handleButtonClick = (event: Event) => {\n if (this.isDragging) {\n event.preventDefault();\n return;\n }\n\n if (this.ignoreNextButtonClick) {\n event.preventDefault();\n this.ignoreNextButtonClick = false;\n return;\n }\n\n if (!this.isOpen) {\n event.preventDefault();\n this.openInspector();\n }\n };\n\n private handleClosePointerDown = (event: PointerEvent) => {\n event.stopPropagation();\n event.preventDefault();\n };\n\n private handleCloseClick = () => {\n this.closeInspector();\n };\n\n private handleResizePointerDown = (event: PointerEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n this.hasCustomPosition.window = true;\n this.isResizing = true;\n this.resizePointerId = event.pointerId;\n this.resizeStart = { x: event.clientX, y: event.clientY };\n this.resizeInitialSize = { ...this.contextState.window.size };\n\n // Remove transition from body during resize to prevent lag\n if (document.body && this.dockMode !== \"floating\") {\n document.body.style.transition = \"\";\n }\n\n const target = event.currentTarget as HTMLElement | null;\n target?.setPointerCapture?.(event.pointerId);\n };\n\n private handleResizePointerMove = (event: PointerEvent) => {\n if (\n !this.isResizing ||\n this.resizePointerId !== event.pointerId ||\n !this.resizeStart ||\n !this.resizeInitialSize\n ) {\n return;\n }\n\n event.preventDefault();\n\n const deltaX = event.clientX - this.resizeStart.x;\n const deltaY = event.clientY - this.resizeStart.y;\n const state = this.contextState.window;\n\n // For docked states, only resize in the appropriate dimension\n if (this.dockMode === \"docked-left\") {\n // Only resize width for left dock\n state.size = this.clampWindowSize({\n width: this.resizeInitialSize.width + deltaX,\n height: state.size.height,\n });\n // Update the body margin\n if (document.body) {\n document.body.style.marginLeft = `${state.size.width}px`;\n }\n } else {\n // Full resize for floating mode\n state.size = this.clampWindowSize({\n width: this.resizeInitialSize.width + deltaX,\n height: this.resizeInitialSize.height + deltaY,\n });\n this.keepPositionWithinViewport(\"window\");\n this.updateAnchorFromPosition(\"window\");\n }\n\n this.requestUpdate();\n this.updateHostTransform(\"window\");\n };\n\n private handleResizePointerUp = (event: PointerEvent) => {\n if (this.resizePointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.resizePointerId)) {\n target.releasePointerCapture(this.resizePointerId);\n }\n\n // Only update anchor position for floating mode\n if (this.dockMode === \"floating\") {\n this.updateAnchorFromPosition(\"window\");\n this.applyAnchorPosition(\"window\");\n }\n\n // Persist the new size after resize completes\n this.persistState();\n this.resetResizeTracking();\n };\n\n private handleResizePointerCancel = (event: PointerEvent) => {\n if (this.resizePointerId !== event.pointerId) {\n return;\n }\n\n const target = event.currentTarget as HTMLElement | null;\n if (target?.hasPointerCapture(this.resizePointerId)) {\n target.releasePointerCapture(this.resizePointerId);\n }\n\n // Only update anchor position for floating mode\n if (this.dockMode === \"floating\") {\n this.updateAnchorFromPosition(\"window\");\n this.applyAnchorPosition(\"window\");\n }\n\n // Persist the new size after resize completes\n this.persistState();\n this.resetResizeTracking();\n };\n\n private handleResize = () => {\n this.measureContext(\"button\");\n this.applyAnchorPosition(\"button\");\n\n this.measureContext(\"window\");\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n\n this.updateHostTransform();\n };\n\n private measureContext(context: ContextKey): void {\n const selector =\n context === \"window\" ? \".inspector-window\" : \".console-button\";\n const element = this.renderRoot?.querySelector(\n selector,\n ) as HTMLElement | null;\n if (!element) {\n return;\n }\n const fallback =\n context === \"window\" ? DEFAULT_WINDOW_SIZE : DEFAULT_BUTTON_SIZE;\n updateSizeFromElement(this.contextState[context], element, fallback);\n }\n\n private centerContext(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n centerContextHelper(this.contextState[context], viewport, EDGE_MARGIN);\n\n if (context === this.activeContext) {\n this.updateHostTransform(context);\n }\n\n this.hasCustomPosition[context] = false;\n this.persistState();\n }\n\n private ensureWindowPlacement(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (!this.hasCustomPosition.window) {\n this.centerContext(\"window\");\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(this.contextState.window, viewport, EDGE_MARGIN);\n updateAnchorFromPositionHelper(\n this.contextState.window,\n viewport,\n EDGE_MARGIN,\n );\n this.updateHostTransform(\"window\");\n this.persistState();\n }\n\n private constrainToViewport(\n position: Position,\n context: ContextKey,\n ): Position {\n if (typeof window === \"undefined\") {\n return position;\n }\n\n const viewport = this.getViewportSize();\n return constrainToViewport(\n this.contextState[context],\n position,\n viewport,\n EDGE_MARGIN,\n );\n }\n\n private keepPositionWithinViewport(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(\n this.contextState[context],\n viewport,\n EDGE_MARGIN,\n );\n }\n\n private getViewportSize(): Size {\n if (typeof window === \"undefined\") {\n return { ...DEFAULT_WINDOW_SIZE };\n }\n\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n private persistState(): void {\n const state: PersistedState = {\n button: {\n anchor: this.contextState.button.anchor,\n anchorOffset: this.contextState.button.anchorOffset,\n hasCustomPosition: this.hasCustomPosition.button,\n },\n window: {\n anchor: this.contextState.window.anchor,\n anchorOffset: this.contextState.window.anchorOffset,\n size: {\n width: Math.round(this.contextState.window.size.width),\n height: Math.round(this.contextState.window.size.height),\n },\n hasCustomPosition: this.hasCustomPosition.window,\n },\n isOpen: this.isOpen,\n dockMode: this.dockMode,\n selectedMenu: this.selectedMenu,\n selectedContext: this.selectedContext,\n };\n saveInspectorState(INSPECTOR_STORAGE_KEY, state);\n this.pendingSelectedContext = state.selectedContext ?? null;\n }\n\n private clampWindowSize(size: Size): Size {\n // Use smaller minimum width when docked left\n const minWidth =\n this.dockMode === \"docked-left\"\n ? MIN_WINDOW_WIDTH_DOCKED_LEFT\n : MIN_WINDOW_WIDTH;\n\n if (typeof window === \"undefined\") {\n return {\n width: Math.max(minWidth, size.width),\n height: Math.max(MIN_WINDOW_HEIGHT, size.height),\n };\n }\n\n const viewport = this.getViewportSize();\n return clampSizeToViewport(\n size,\n viewport,\n EDGE_MARGIN,\n minWidth,\n MIN_WINDOW_HEIGHT,\n );\n }\n\n private setDockMode(mode: DockMode): void {\n if (this.dockMode === mode) {\n return;\n }\n\n // Add transition class for smooth dock mode changes\n this.startHostTransition();\n\n // Clean up previous dock state\n this.removeDockStyles();\n\n this.dockMode = mode;\n\n if (mode !== \"floating\") {\n // For docking, set the target size immediately so body margins are correct\n if (mode === \"docked-left\") {\n this.contextState.window.size.width = DOCKED_LEFT_WIDTH;\n }\n\n // Then apply dock styles with correct sizes\n this.applyDockStyles();\n } else {\n // When floating, set size first then center\n this.contextState.window.size = { ...DEFAULT_WINDOW_SIZE };\n this.centerContext(\"window\");\n }\n\n this.persistState();\n this.requestUpdate();\n this.updateHostTransform(\"window\");\n }\n\n private startHostTransition(duration = 300): void {\n this.setAttribute(\"data-transitioning\", \"true\");\n\n if (this.transitionTimeoutId !== null) {\n clearTimeout(this.transitionTimeoutId);\n }\n\n this.transitionTimeoutId = setTimeout(() => {\n this.removeAttribute(\"data-transitioning\");\n this.transitionTimeoutId = null;\n }, duration);\n }\n\n private applyDockStyles(skipTransition = false): void {\n if (typeof document === \"undefined\" || !document.body) {\n return;\n }\n\n // Save original body margins\n const computedStyle = window.getComputedStyle(document.body);\n this.previousBodyMargins = {\n left: computedStyle.marginLeft,\n bottom: computedStyle.marginBottom,\n };\n\n // Apply transition to body for smooth animation (only when docking, not during resize or initial load)\n if (!this.isResizing && !skipTransition) {\n document.body.style.transition = \"margin 300ms ease\";\n }\n\n // Apply body margins with the actual window sizes\n if (this.dockMode === \"docked-left\") {\n document.body.style.marginLeft = `${this.contextState.window.size.width}px`;\n }\n\n // Remove transition after animation completes\n if (!this.isResizing && !skipTransition) {\n const id = setTimeout(() => {\n this.bodyTransitionTimeoutIds.delete(id);\n if (typeof document !== \"undefined\" && document.body) {\n document.body.style.transition = \"\";\n }\n }, 300);\n this.bodyTransitionTimeoutIds.add(id);\n }\n }\n\n private removeDockStyles(skipTransition = false): void {\n if (typeof document === \"undefined\" || !document.body) {\n return;\n }\n\n // Only add transition if not resizing and not skipping\n if (!this.isResizing && !skipTransition) {\n document.body.style.transition = \"margin 300ms ease\";\n }\n\n // Restore original margins if saved\n if (this.previousBodyMargins) {\n document.body.style.marginLeft = this.previousBodyMargins.left;\n document.body.style.marginBottom = this.previousBodyMargins.bottom;\n this.previousBodyMargins = null;\n } else {\n // Reset to default if no previous values\n document.body.style.marginLeft = \"\";\n document.body.style.marginBottom = \"\";\n }\n\n // Clean up transition after animation completes\n if (!skipTransition) {\n const id = setTimeout(() => {\n this.bodyTransitionTimeoutIds.delete(id);\n if (typeof document !== \"undefined\" && document.body) {\n document.body.style.transition = \"\";\n }\n }, 300);\n this.bodyTransitionTimeoutIds.add(id);\n } else {\n document.body.style.transition = \"\";\n }\n }\n\n private updateHostTransform(context: ContextKey = this.activeContext): void {\n if (context !== this.activeContext) {\n return;\n }\n\n // For docked states, CSS handles positioning with fixed positioning\n if (this.isOpen && this.dockMode === \"docked-left\") {\n this.style.transform = `translate3d(0, 0, 0)`;\n } else {\n const { position } = this.contextState[context];\n this.style.transform = `translate3d(${position.x}px, ${position.y}px, 0)`;\n }\n }\n\n private setDragging(value: boolean): void {\n if (this.isDragging !== value) {\n this.isDragging = value;\n this.requestUpdate();\n }\n }\n\n private updateAnchorFromPosition(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const viewport = this.getViewportSize();\n updateAnchorFromPositionHelper(\n this.contextState[context],\n viewport,\n EDGE_MARGIN,\n );\n }\n\n private snapButtonToCorner(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n const state = this.contextState.button;\n\n // Determine which corner is closest based on center of button\n const centerX = state.position.x + state.size.width / 2;\n const centerY = state.position.y + state.size.height / 2;\n\n const horizontal: Anchor[\"horizontal\"] =\n centerX < viewport.width / 2 ? \"left\" : \"right\";\n const vertical: Anchor[\"vertical\"] =\n centerY < viewport.height / 2 ? \"top\" : \"bottom\";\n\n // Set anchor to nearest corner\n state.anchor = { horizontal, vertical };\n\n // Always use EDGE_MARGIN as offset (pinned to corner)\n state.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n // Apply the anchor position to snap to corner\n this.startHostTransition();\n this.applyAnchorPosition(\"button\");\n }\n\n private applyAnchorPosition(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const viewport = this.getViewportSize();\n applyAnchorPositionHelper(\n this.contextState[context],\n viewport,\n EDGE_MARGIN,\n );\n this.updateHostTransform(context);\n this.persistState();\n }\n\n private resetResizeTracking(): void {\n this.resizePointerId = null;\n this.resizeStart = null;\n this.resizeInitialSize = null;\n this.isResizing = false;\n }\n\n private resetPointerTracking(): void {\n this.pointerId = null;\n this.dragStart = null;\n this.pointerContext = null;\n this.setDragging(false);\n this.draggedDuringInteraction = false;\n }\n\n private openInspector(): void {\n if (this.isOpen) {\n return;\n }\n\n this.showAnnouncementPreview = false; // hide the bubble once the inspector is opened\n\n this.ensureAnnouncementLoading();\n\n this.isOpen = true;\n this.persistState(); // Save the open state\n\n // Apply docking styles if in docked mode\n if (this.dockMode !== \"floating\") {\n this.applyDockStyles();\n }\n\n this.ensureWindowPlacement();\n this.requestUpdate();\n void this.updateComplete.then(() => {\n this.measureContext(\"window\");\n if (this.dockMode === \"floating\") {\n if (this.hasCustomPosition.window) {\n this.applyAnchorPosition(\"window\");\n } else {\n this.centerContext(\"window\");\n }\n } else {\n // Update transform for docked position\n this.updateHostTransform(\"window\");\n }\n });\n }\n\n private closeInspector(): void {\n if (!this.isOpen) {\n return;\n }\n\n this.isOpen = false;\n\n // Remove docking styles when closing\n if (this.dockMode !== \"floating\") {\n this.removeDockStyles();\n }\n\n this.persistState(); // Save the closed state\n this.updateHostTransform(\"button\");\n this.requestUpdate();\n void this.updateComplete.then(() => {\n this.measureContext(\"button\");\n this.applyAnchorPosition(\"button\");\n });\n }\n\n private renderIcon(name: LucideIconName) {\n const iconNode = icons[name];\n if (!iconNode) {\n return nothing;\n }\n\n const svgAttrs: Record<string, string | number> = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"1.5\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n class: \"h-3.5 w-3.5\",\n };\n\n const svgMarkup = `<svg ${this.serializeAttributes(svgAttrs)}>${iconNode\n .map(([tag, attrs]) => `<${tag} ${this.serializeAttributes(attrs)} />`)\n .join(\"\")}</svg>`;\n\n return unsafeHTML(svgMarkup);\n }\n\n private renderDockControls() {\n if (this.dockMode === \"floating\") {\n // Show dock left button\n return html`\n <button\n class=\"flex h-8 w-8 items-center justify-center rounded-md text-gray-400 transition hover:bg-gray-100 hover:text-gray-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\"\n type=\"button\"\n aria-label=\"Dock to left\"\n title=\"Dock Left\"\n @click=${() => this.handleDockClick(\"docked-left\")}\n >\n ${this.renderIcon(\"PanelLeft\")}\n </button>\n `;\n } else {\n // Show float button\n return html`\n <button\n class=\"flex h-8 w-8 items-center justify-center rounded-md text-gray-400 transition hover:bg-gray-100 hover:text-gray-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400\"\n type=\"button\"\n aria-label=\"Float window\"\n title=\"Float\"\n @click=${() => this.handleDockClick(\"floating\")}\n >\n ${this.renderIcon(\"Maximize2\")}\n </button>\n `;\n }\n }\n\n private getDockedWindowStyles(): Record<string, string> {\n if (this.dockMode === \"docked-left\") {\n return {\n position: \"fixed\",\n top: \"0\",\n left: \"0\",\n bottom: \"0\",\n width: `${Math.round(this.contextState.window.size.width)}px`,\n height: \"100vh\",\n minWidth: `${MIN_WINDOW_WIDTH_DOCKED_LEFT}px`,\n borderRadius: \"0\",\n };\n }\n // Default to floating styles\n return {\n width: `${Math.round(this.contextState.window.size.width)}px`,\n height: `${Math.round(this.contextState.window.size.height)}px`,\n minWidth: `${MIN_WINDOW_WIDTH}px`,\n minHeight: `${MIN_WINDOW_HEIGHT}px`,\n };\n }\n\n private handleDockClick(mode: DockMode): void {\n this.setDockMode(mode);\n }\n\n private serializeAttributes(\n attributes: Record<string, string | number | undefined>,\n ): string {\n return Object.entries(attributes)\n .filter(\n ([key, value]) =>\n key !== \"key\" &&\n value !== undefined &&\n value !== null &&\n value !== \"\",\n )\n .map(\n ([key, value]) => `${key}=\"${String(value).replace(/\"/g, \"&quot;\")}\"`,\n )\n .join(\" \");\n }\n\n private sanitizeForLogging(\n value: unknown,\n depth = 0,\n seen = new WeakSet<object>(),\n ): SanitizedValue {\n if (value === undefined) {\n return \"[undefined]\";\n }\n\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (\n typeof value === \"bigint\" ||\n typeof value === \"symbol\" ||\n typeof value === \"function\"\n ) {\n return String(value);\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n if (depth >= 4) {\n return \"[Truncated depth]\" as SanitizedValue;\n }\n return value.map((item) =>\n this.sanitizeForLogging(item, depth + 1, seen),\n );\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value as object)) {\n return \"[Circular]\" as SanitizedValue;\n }\n seen.add(value as object);\n\n if (depth >= 4) {\n return \"[Truncated depth]\" as SanitizedValue;\n }\n\n const result: Record<string, SanitizedValue> = {};\n for (const [key, entry] of Object.entries(\n value as Record<string, unknown>,\n )) {\n result[key] = this.sanitizeForLogging(entry, depth + 1, seen);\n }\n return result;\n }\n\n return String(value);\n }\n\n private normalizeEventPayload(\n _type: InspectorAgentEventType,\n payload: unknown,\n ): SanitizedValue {\n if (payload && typeof payload === \"object\" && \"event\" in payload) {\n const { event, ...rest } = payload as Record<string, unknown>;\n const cleaned =\n Object.keys(rest).length === 0 ? event : { event, ...rest };\n return this.sanitizeForLogging(cleaned);\n }\n\n return this.sanitizeForLogging(payload);\n }\n\n private normalizeMessageContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (\n content &&\n typeof content === \"object\" &&\n \"text\" in (content as Record<string, unknown>)\n ) {\n const maybeText = (content as Record<string, unknown>).text;\n if (typeof maybeText === \"string\") {\n return maybeText;\n }\n }\n\n if (content === null || content === undefined) {\n return \"\";\n }\n\n if (typeof content === \"object\") {\n try {\n return JSON.stringify(this.sanitizeForLogging(content));\n } catch {\n return \"\";\n }\n }\n\n return String(content);\n }\n\n private normalizeToolCalls(raw: unknown): InspectorToolCall[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw\n .map((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n const call = entry as Record<string, unknown>;\n const fn = call.function as Record<string, unknown> | undefined;\n const functionName =\n typeof fn?.name === \"string\"\n ? fn.name\n : typeof call.toolName === \"string\"\n ? call.toolName\n : undefined;\n const args =\n fn && \"arguments\" in fn\n ? (fn as Record<string, unknown>).arguments\n : call.arguments;\n\n const normalized: InspectorToolCall = {\n id: typeof call.id === \"string\" ? call.id : undefined,\n toolName:\n typeof call.toolName === \"string\" ? call.toolName : functionName,\n status: typeof call.status === \"string\" ? call.status : undefined,\n };\n\n if (functionName) {\n normalized.function = {\n name: functionName,\n arguments: this.sanitizeForLogging(args),\n };\n }\n\n return normalized;\n })\n .filter((call): call is InspectorToolCall => Boolean(call));\n }\n\n private normalizeAgentMessage(message: unknown): InspectorMessage | null {\n if (!message || typeof message !== \"object\") {\n return null;\n }\n\n const raw = message as Record<string, unknown>;\n const role = typeof raw.role === \"string\" ? raw.role : \"unknown\";\n const contentText = this.normalizeMessageContent(raw.content);\n const toolCalls = this.normalizeToolCalls(raw.toolCalls);\n\n return {\n id: typeof raw.id === \"string\" ? raw.id : undefined,\n role,\n contentText,\n contentRaw:\n raw.content !== undefined\n ? this.sanitizeForLogging(raw.content)\n : undefined,\n toolCalls,\n };\n }\n\n private normalizeAgentMessages(messages: unknown): InspectorMessage[] | null {\n if (!Array.isArray(messages)) {\n return null;\n }\n\n const normalized = messages\n .map((message) => this.normalizeAgentMessage(message))\n .filter((msg): msg is InspectorMessage => msg !== null);\n\n return normalized;\n }\n\n private normalizeContextStore(\n context: Readonly<Record<string, unknown>> | null | undefined,\n ): Record<string, { description?: string; value: unknown }> {\n if (!context || typeof context !== \"object\") {\n return {};\n }\n\n const normalized: Record<string, { description?: string; value: unknown }> =\n {};\n for (const [key, entry] of Object.entries(context)) {\n if (\n entry &&\n typeof entry === \"object\" &&\n \"value\" in (entry as Record<string, unknown>)\n ) {\n const candidate = entry as Record<string, unknown>;\n const description =\n typeof candidate.description === \"string\" &&\n candidate.description.trim().length > 0\n ? candidate.description\n : undefined;\n normalized[key] = { description, value: candidate.value };\n } else {\n normalized[key] = { value: entry };\n }\n }\n\n return normalized;\n }\n\n private contextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ];\n\n private selectedContext = \"all-agents\";\n private expandedRows: Set<string> = new Set();\n private copiedEvents: Set<string> = new Set();\n private expandedTools: Set<string> = new Set();\n private expandedContextItems: Set<string> = new Set();\n private copiedContextItems: Set<string> = new Set();\n\n private getSelectedMenu(): MenuItem {\n const found = this.menuItems.find((item) => item.key === this.selectedMenu);\n return found ?? this.menuItems[0]!;\n }\n\n private renderCoreWarningBanner() {\n if (this._core) {\n return nothing;\n }\n\n return html`\n <div\n class=\"mx-4 my-3 flex items-start gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800\"\n >\n <span class=\"mt-0.5 shrink-0 text-amber-600\"\n >${this.renderIcon(\"AlertTriangle\")}</span\n >\n <div class=\"space-y-1\">\n <div class=\"font-semibold text-amber-900\">\n CopilotKit core not attached\n </div>\n <p class=\"text-[11px] leading-snug text-amber-800\">\n Pass a live <code>CopilotKitCore</code> instance to\n <code>&lt;cpk-web-inspector&gt;</code> or expose it on\n <code>window.__COPILOTKIT_CORE__</code> for auto-attach.\n </p>\n </div>\n </div>\n `;\n }\n\n private getCoreStatusSummary(): {\n label: string;\n tone: string;\n description: string;\n } {\n if (!this._core) {\n return {\n label: \"Core not attached\",\n tone: \"border border-amber-200 bg-amber-50 text-amber-800\",\n description:\n \"Pass a CopilotKitCore instance to <cpk-web-inspector> or enable auto-attach.\",\n };\n }\n\n const status =\n this.runtimeStatus ?? CopilotKitCoreRuntimeConnectionStatus.Disconnected;\n const lastErrorMessage = this.lastCoreError?.message;\n\n if (status === CopilotKitCoreRuntimeConnectionStatus.Error) {\n return {\n label: \"Runtime error\",\n tone: \"border border-rose-200 bg-rose-50 text-rose-700\",\n description:\n lastErrorMessage ?? \"CopilotKit runtime reported an error.\",\n };\n }\n\n if (status === CopilotKitCoreRuntimeConnectionStatus.Connecting) {\n return {\n label: \"Connecting\",\n tone: \"border border-amber-200 bg-amber-50 text-amber-800\",\n description: \"Waiting for CopilotKit runtime to finish connecting.\",\n };\n }\n\n if (status === CopilotKitCoreRuntimeConnectionStatus.Connected) {\n return {\n label: \"Connected\",\n tone: \"border border-emerald-200 bg-emerald-50 text-emerald-700\",\n description: \"Live runtime connection established.\",\n };\n }\n\n return {\n label: \"Disconnected\",\n tone: \"border border-gray-200 bg-gray-50 text-gray-700\",\n description:\n lastErrorMessage ?? \"Waiting for CopilotKit runtime to connect.\",\n };\n }\n\n private renderMainContent() {\n if (this.selectedMenu === \"ag-ui-events\") {\n return this.renderEventsTable();\n }\n\n if (this.selectedMenu === \"agents\") {\n return this.renderAgentsView();\n }\n\n if (this.selectedMenu === \"frontend-tools\") {\n return this.renderToolsView();\n }\n\n if (this.selectedMenu === \"agent-context\") {\n return this.renderContextView();\n }\n\n return nothing;\n }\n\n private renderEventsTable() {\n const events = this.getEventsForSelectedContext();\n const filteredEvents = this.filterEvents(events);\n const selectedLabel =\n this.selectedContext === \"all-agents\"\n ? \"all agents\"\n : `agent ${this.selectedContext}`;\n\n if (events.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Zap\")}\n </div>\n <p class=\"text-sm text-gray-600\">No events yet</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Trigger an agent run to see live activity.\n </p>\n </div>\n </div>\n `;\n }\n\n if (filteredEvents.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md space-y-3\">\n <div\n class=\"flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Filter\")}\n </div>\n <p class=\"text-sm text-gray-600\">\n No events match the current filters.\n </p>\n <div>\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-1 rounded-md bg-gray-900 px-3 py-1.5 text-[11px] font-medium text-white transition hover:bg-gray-800\"\n @click=${this.resetEventFilters}\n >\n ${this.renderIcon(\"RefreshCw\")}\n <span>Reset filters</span>\n </button>\n </div>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"flex h-full flex-col\">\n <div\n class=\"flex flex-col gap-1.5 border-b border-gray-200 bg-white px-4 py-2.5\"\n >\n <div class=\"flex flex-wrap items-center gap-2\">\n <div class=\"relative min-w-[200px] flex-1\">\n <input\n type=\"search\"\n class=\"w-full rounded-md border border-gray-200 px-3 py-1.5 text-[11px] text-gray-700 shadow-sm outline-none ring-1 ring-transparent transition focus:border-gray-300 focus:ring-gray-200\"\n placeholder=\"Search agent, type, payload\"\n .value=${this.eventFilterText}\n @input=${this.handleEventFilterInput}\n />\n </div>\n <select\n class=\"w-40 rounded-md border border-gray-200 bg-white px-2 py-1.5 text-[11px] text-gray-700 shadow-sm outline-none transition focus:border-gray-300 focus:ring-2 focus:ring-gray-200\"\n .value=${this.eventTypeFilter}\n @change=${this.handleEventTypeChange}\n >\n <option value=\"all\">All event types</option>\n ${AGENT_EVENT_TYPES.map(\n (type) =>\n html`<option value=${type}>\n ${type.toLowerCase().replace(/_/g, \" \")}\n </option>`,\n )}\n </select>\n <div class=\"flex items-center gap-1 text-[11px]\">\n <button\n type=\"button\"\n class=\"tooltip-target flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 bg-white text-gray-600 transition hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50\"\n title=\"Reset filters\"\n data-tooltip=\"Reset filters\"\n aria-label=\"Reset filters\"\n @click=${this.resetEventFilters}\n ?disabled=${\n !this.eventFilterText && this.eventTypeFilter === \"all\"\n }\n >\n ${this.renderIcon(\"RotateCw\")}\n </button>\n <button\n type=\"button\"\n class=\"tooltip-target flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 bg-white text-gray-600 transition hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50\"\n title=\"Export JSON\"\n data-tooltip=\"Export JSON\"\n aria-label=\"Export JSON\"\n @click=${() => this.exportEvents(filteredEvents)}\n ?disabled=${filteredEvents.length === 0}\n >\n ${this.renderIcon(\"Download\")}\n </button>\n <button\n type=\"button\"\n class=\"tooltip-target flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 bg-white text-gray-600 transition hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50\"\n title=\"Clear events\"\n data-tooltip=\"Clear events\"\n aria-label=\"Clear events\"\n @click=${this.handleClearEvents}\n ?disabled=${events.length === 0}\n >\n ${this.renderIcon(\"Trash2\")}\n </button>\n </div>\n </div>\n <div class=\"text-[11px] text-gray-500\">\n Showing ${filteredEvents.length} of\n ${events.length}${\n this.selectedContext === \"all-agents\"\n ? \"\"\n : ` for ${selectedLabel}`\n }\n </div>\n </div>\n <div class=\"relative h-full w-full overflow-y-auto overflow-x-hidden\">\n <table class=\"w-full table-fixed border-collapse text-xs box-border\">\n <thead class=\"sticky top-0 z-10\">\n <tr class=\"bg-white\">\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n Agent\n </th>\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n Time\n </th>\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n Event Type\n </th>\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n >\n AG-UI Event\n </th>\n </tr>\n </thead>\n <tbody>\n ${filteredEvents.map((event, index) => {\n const rowBg = index % 2 === 0 ? \"bg-white\" : \"bg-gray-50/50\";\n const badgeClasses = this.getEventBadgeClasses(event.type);\n const extractedEvent = this.extractEventFromPayload(\n event.payload,\n );\n const inlineEvent =\n this.stringifyPayload(extractedEvent, false) || \"—\";\n const prettyEvent =\n this.stringifyPayload(extractedEvent, true) || inlineEvent;\n const isExpanded = this.expandedRows.has(event.id);\n\n return html`\n <tr\n class=\"${rowBg} cursor-pointer transition hover:bg-blue-50/50\"\n @click=${() => this.toggleRowExpansion(event.id)}\n >\n <td\n class=\"border-l border-r border-b border-gray-200 px-3 py-2\"\n >\n <span class=\"font-mono text-[11px] text-gray-600\"\n >${event.agentId}</span\n >\n </td>\n <td\n class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[11px] text-gray-600\"\n >\n <span title=${new Date(event.timestamp).toLocaleString()}>\n ${new Date(event.timestamp).toLocaleTimeString()}\n </span>\n </td>\n <td class=\"border-r border-b border-gray-200 px-3 py-2\">\n <span class=${badgeClasses}>${event.type}</span>\n </td>\n <td\n class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[10px] text-gray-600 ${\n isExpanded ? \"\" : \"truncate max-w-xs\"\n }\"\n >\n ${\n isExpanded\n ? html`\n <div class=\"group relative\">\n <pre\n class=\"m-0 whitespace-pre-wrap break-words text-[10px] font-mono text-gray-600\"\n >\n${prettyEvent}</pre\n >\n <button\n class=\"absolute right-0 top-0 cursor-pointer rounded px-2 py-1 text-[10px] opacity-0 transition group-hover:opacity-100 ${\n this.copiedEvents.has(event.id)\n ? \"bg-green-100 text-green-700\"\n : \"bg-gray-100 text-gray-600 hover:bg-gray-200 hover:text-gray-900\"\n }\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this.copyToClipboard(prettyEvent, event.id);\n }}\n >\n ${\n this.copiedEvents.has(event.id)\n ? html`\n <span>✓ Copied</span>\n `\n : html`\n <span>Copy</span>\n `\n }\n </button>\n </div>\n `\n : inlineEvent\n }\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n </div>\n </div>\n `;\n }\n\n private handleEventFilterInput(event: Event): void {\n const target = event.target as HTMLInputElement | null;\n this.eventFilterText = target?.value ?? \"\";\n this.requestUpdate();\n }\n\n private handleEventTypeChange(event: Event): void {\n const target = event.target as HTMLSelectElement | null;\n const value = target?.value as InspectorAgentEventType | \"all\" | undefined;\n if (!value) {\n return;\n }\n this.eventTypeFilter = value;\n this.requestUpdate();\n }\n\n private resetEventFilters(): void {\n this.eventFilterText = \"\";\n this.eventTypeFilter = \"all\";\n this.requestUpdate();\n }\n\n private handleClearEvents = (): void => {\n if (this.selectedContext === \"all-agents\") {\n this.agentEvents.clear();\n this.flattenedEvents = [];\n } else {\n this.agentEvents.delete(this.selectedContext);\n this.flattenedEvents = this.flattenedEvents.filter(\n (event) => event.agentId !== this.selectedContext,\n );\n }\n\n this.expandedRows.clear();\n this.copiedEvents.clear();\n this.requestUpdate();\n };\n\n private exportEvents(events: InspectorEvent[]): void {\n try {\n const payload = JSON.stringify(events, null, 2);\n const blob = new Blob([payload], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `copilotkit-events-${Date.now()}.json`;\n anchor.click();\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error(\"Failed to export events\", error);\n }\n }\n\n private renderAgentsView() {\n // Show message if \"all-agents\" is selected or no agents available\n if (this.selectedContext === \"all-agents\") {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Bot\")}\n </div>\n <p class=\"text-sm text-gray-600\">No agent selected</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Select an agent from the dropdown above to view details.\n </p>\n </div>\n </div>\n `;\n }\n\n const agentId = this.selectedContext;\n const status = this.getAgentStatus(agentId);\n const stats = this.getAgentStats(agentId);\n const state = this.getLatestStateForAgent(agentId);\n const messages = this.getLatestMessagesForAgent(agentId);\n\n const statusColors = {\n running: \"bg-emerald-50 text-emerald-700\",\n idle: \"bg-gray-100 text-gray-600\",\n error: \"bg-rose-50 text-rose-700\",\n };\n\n return html`\n <div class=\"flex flex-col gap-4 p-4 overflow-auto\">\n <!-- Agent Overview Card -->\n <div class=\"rounded-lg border border-gray-200 bg-white p-4\">\n <div class=\"flex items-start justify-between mb-4\">\n <div class=\"flex items-center gap-3\">\n <div\n class=\"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 text-blue-600\"\n >\n ${this.renderIcon(\"Bot\")}\n </div>\n <div>\n <h3 class=\"font-semibold text-sm text-gray-900\">${agentId}</h3>\n <span\n class=\"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium ${\n statusColors[status]\n } relative -translate-y-[2px]\"\n >\n <span\n class=\"h-1.5 w-1.5 rounded-full ${\n status === \"running\"\n ? \"bg-emerald-500 animate-pulse\"\n : status === \"error\"\n ? \"bg-rose-500\"\n : \"bg-gray-400\"\n }\"\n ></span>\n ${status.charAt(0).toUpperCase() + status.slice(1)}\n </span>\n </div>\n </div>\n ${\n stats.lastActivity\n ? html`<span class=\"text-xs text-gray-500\"\n >Last activity:\n ${new Date(stats.lastActivity).toLocaleTimeString()}</span\n >`\n : nothing\n }\n </div>\n <div class=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n <button\n type=\"button\"\n class=\"rounded-md bg-gray-50 px-3 py-2 text-left transition hover:bg-gray-100 cursor-pointer overflow-hidden\"\n @click=${() => this.handleMenuSelect(\"ag-ui-events\")}\n title=\"View all events in AG-UI Events\"\n >\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Total Events\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.totalEvents}\n </div>\n </button>\n <div class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden\">\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Messages\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.messages}\n </div>\n </div>\n <div class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden\">\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Tool Calls\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.toolCalls}\n </div>\n </div>\n <div class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden\">\n <div class=\"truncate whitespace-nowrap text-xs text-gray-600\">\n Errors\n </div>\n <div class=\"text-lg font-semibold text-gray-900\">\n ${stats.errors}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Current State Section -->\n <div class=\"rounded-lg border border-gray-200 bg-white\">\n <div class=\"border-b border-gray-200 px-4 py-3\">\n <h4 class=\"text-sm font-semibold text-gray-900\">Current State</h4>\n </div>\n <div class=\"overflow-auto p-4\">\n ${\n this.hasRenderableState(state)\n ? html`\n <pre\n class=\"overflow-auto rounded-md bg-gray-50 p-3 text-xs text-gray-800 max-h-64\"\n ><code>${this.formatStateForDisplay(state)}</code></pre>\n `\n : html`\n <div\n class=\"flex h-40 items-center justify-center text-xs text-gray-500\"\n >\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\"\n >${this.renderIcon(\"Database\")}</span\n >\n <span>State is empty</span>\n </div>\n </div>\n `\n }\n </div>\n </div>\n\n <!-- Current Messages Section -->\n <div class=\"rounded-lg border border-gray-200 bg-white\">\n <div class=\"border-b border-gray-200 px-4 py-3\">\n <h4 class=\"text-sm font-semibold text-gray-900\">\n Current Messages\n </h4>\n </div>\n <div class=\"overflow-auto\">\n ${\n messages && messages.length > 0\n ? html`\n <table class=\"w-full text-xs\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th\n class=\"px-4 py-2 text-left font-medium text-gray-700\"\n >\n Role\n </th>\n <th\n class=\"px-4 py-2 text-left font-medium text-gray-700\"\n >\n Content\n </th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200\">\n ${messages.map((msg) => {\n const role = msg.role || \"unknown\";\n const roleColors: Record<string, string> = {\n user: \"bg-blue-100 text-blue-800\",\n assistant: \"bg-green-100 text-green-800\",\n system: \"bg-gray-100 text-gray-800\",\n tool: \"bg-amber-100 text-amber-800\",\n unknown: \"bg-gray-100 text-gray-600\",\n };\n\n const rawContent = msg.contentText ?? \"\";\n const toolCalls = msg.toolCalls ?? [];\n const hasContent = rawContent.trim().length > 0;\n const contentFallback =\n toolCalls.length > 0 ? \"Invoked tool call\" : \"—\";\n\n return html`\n <tr>\n <td class=\"px-4 py-2 align-top\">\n <span\n class=\"inline-flex rounded px-2 py-0.5 text-[10px] font-medium ${\n roleColors[role] || roleColors.unknown\n }\"\n >\n ${role}\n </span>\n </td>\n <td class=\"px-4 py-2\">\n ${\n hasContent\n ? html`<div\n class=\"max-w-2xl whitespace-pre-wrap break-words text-gray-700\"\n >\n ${rawContent}\n </div>`\n : html`<div\n class=\"text-xs italic text-gray-400\"\n >\n ${contentFallback}\n </div>`\n }\n ${\n role === \"assistant\" && toolCalls.length > 0\n ? this.renderToolCallDetails(toolCalls)\n : nothing\n }\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n `\n : html`\n <div\n class=\"flex h-40 items-center justify-center text-xs text-gray-500\"\n >\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\"\n >${this.renderIcon(\"MessageSquare\")}</span\n >\n <span>No messages available</span>\n </div>\n </div>\n `\n }\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextDropdown() {\n // Filter out \"all-agents\" when in agents view\n const filteredOptions =\n this.selectedMenu === \"agents\"\n ? this.contextOptions.filter((opt) => opt.key !== \"all-agents\")\n : this.contextOptions;\n\n const selectedLabel =\n filteredOptions.find((opt) => opt.key === this.selectedContext)?.label ??\n \"\";\n\n return html`\n <div\n class=\"relative z-40 min-w-0 flex-1\"\n data-context-dropdown-root=\"true\"\n >\n <button\n type=\"button\"\n class=\"relative z-40 flex w-full min-w-0 max-w-[240px] items-center gap-1.5 rounded-md border border-gray-200 px-2 py-1 text-xs font-medium text-gray-700 transition hover:border-gray-300 hover:bg-gray-50\"\n @pointerdown=${this.handleContextDropdownToggle}\n >\n <span class=\"truncate flex-1 text-left\">${selectedLabel}</span>\n <span class=\"shrink-0 text-gray-400\"\n >${this.renderIcon(\"ChevronDown\")}</span\n >\n </button>\n ${\n this.contextMenuOpen\n ? html`\n <div\n class=\"absolute left-0 z-50 mt-1.5 w-40 rounded-md border border-gray-200 bg-white py-1 shadow-md ring-1 ring-black/5\"\n data-context-dropdown-root=\"true\"\n >\n ${filteredOptions.map(\n (option) => html`\n <button\n type=\"button\"\n class=\"flex w-full items-center justify-between px-3 py-1.5 text-left text-xs transition hover:bg-gray-50 focus:bg-gray-50 focus:outline-none\"\n data-context-dropdown-root=\"true\"\n @click=${() => this.handleContextOptionSelect(option.key)}\n >\n <span\n class=\"truncate ${\n option.key === this.selectedContext\n ? \"text-gray-900 font-medium\"\n : \"text-gray-600\"\n }\"\n >${option.label}</span\n >\n ${\n option.key === this.selectedContext\n ? html`<span class=\"text-gray-500\"\n >${this.renderIcon(\"Check\")}</span\n >`\n : nothing\n }\n </button>\n `,\n )}\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n private handleMenuSelect(key: MenuKey): void {\n if (!this.menuItems.some((item) => item.key === key)) {\n return;\n }\n\n this.selectedMenu = key;\n\n // If switching to agents view and \"all-agents\" is selected, switch to default or first agent\n if (key === \"agents\" && this.selectedContext === \"all-agents\") {\n const agentOptions = this.contextOptions.filter(\n (opt) => opt.key !== \"all-agents\",\n );\n if (agentOptions.length > 0) {\n // Try to find \"default\" agent first\n const defaultAgent = agentOptions.find((opt) => opt.key === \"default\");\n this.selectedContext = defaultAgent\n ? defaultAgent.key\n : agentOptions[0]!.key;\n }\n }\n\n this.contextMenuOpen = false;\n this.persistState();\n this.requestUpdate();\n }\n\n private handleContextDropdownToggle(event: PointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuOpen = !this.contextMenuOpen;\n this.requestUpdate();\n }\n\n private handleContextOptionSelect(key: string): void {\n if (!this.contextOptions.some((option) => option.key === key)) {\n return;\n }\n\n if (this.selectedContext !== key) {\n this.selectedContext = key;\n this.expandedRows.clear();\n }\n\n this.contextMenuOpen = false;\n this.persistState();\n this.requestUpdate();\n }\n\n private renderToolsView() {\n if (!this._core) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-xs text-gray-500\"\n >\n No core instance available\n </div>\n `;\n }\n\n this.refreshToolsSnapshot();\n const allTools = this.cachedTools;\n\n if (allTools.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"Hammer\")}\n </div>\n <p class=\"text-sm text-gray-600\">No tools available</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Tools will appear here once agents are configured with tool\n handlers or renderers.\n </p>\n </div>\n </div>\n `;\n }\n\n // Filter tools by selected agent\n const filteredTools =\n this.selectedContext === \"all-agents\"\n ? allTools\n : allTools.filter(\n (tool) => !tool.agentId || tool.agentId === this.selectedContext,\n );\n\n return html`\n <div class=\"flex h-full flex-col overflow-hidden\">\n <div class=\"overflow-auto p-4\">\n <div class=\"space-y-3\">\n ${filteredTools.map((tool) => this.renderToolCard(tool))}\n </div>\n </div>\n </div>\n `;\n }\n\n private extractToolsFromAgents(): InspectorToolDefinition[] {\n if (!this._core) {\n return [];\n }\n\n const tools: InspectorToolDefinition[] = [];\n\n // Start with tools registered on the core (frontend tools / HIL)\n for (const coreTool of this._core.tools ?? []) {\n tools.push({\n agentId: coreTool.agentId ?? \"\",\n name: coreTool.name,\n description: coreTool.description,\n parameters: coreTool.parameters,\n type: \"handler\",\n });\n }\n\n // Augment with agent-level tool handlers/renderers\n for (const [agentId, agent] of Object.entries(this._core.agents)) {\n if (!agent) continue;\n\n // Try to extract tool handlers\n const handlers = (agent as { toolHandlers?: Record<string, unknown> })\n .toolHandlers;\n if (handlers && typeof handlers === \"object\") {\n for (const [toolName, handler] of Object.entries(handlers)) {\n if (handler && typeof handler === \"object\") {\n const handlerObj = handler as Record<string, unknown>;\n tools.push({\n agentId,\n name: toolName,\n description:\n (typeof handlerObj.description === \"string\" &&\n handlerObj.description) ||\n (handlerObj.tool as { description?: string } | undefined)\n ?.description,\n parameters:\n handlerObj.parameters ??\n (handlerObj.tool as { parameters?: unknown } | undefined)\n ?.parameters,\n type: \"handler\",\n });\n }\n }\n }\n\n // Try to extract tool renderers\n const renderers = (agent as { toolRenderers?: Record<string, unknown> })\n .toolRenderers;\n if (renderers && typeof renderers === \"object\") {\n for (const [toolName, renderer] of Object.entries(renderers)) {\n // Don't duplicate if we already have it as a handler\n if (\n !tools.some((t) => t.agentId === agentId && t.name === toolName)\n ) {\n if (renderer && typeof renderer === \"object\") {\n const rendererObj = renderer as Record<string, unknown>;\n tools.push({\n agentId,\n name: toolName,\n description:\n (typeof rendererObj.description === \"string\" &&\n rendererObj.description) ||\n (rendererObj.tool as { description?: string } | undefined)\n ?.description,\n parameters:\n rendererObj.parameters ??\n (rendererObj.tool as { parameters?: unknown } | undefined)\n ?.parameters,\n type: \"renderer\",\n });\n }\n }\n }\n }\n }\n\n return tools.sort((a, b) => {\n const agentCompare = a.agentId.localeCompare(b.agentId);\n if (agentCompare !== 0) return agentCompare;\n return a.name.localeCompare(b.name);\n });\n }\n\n private renderToolCard(tool: InspectorToolDefinition) {\n const isExpanded = this.expandedTools.has(`${tool.agentId}:${tool.name}`);\n const schema = this.extractSchemaInfo(tool.parameters);\n\n const typeColors = {\n handler: \"bg-blue-50 text-blue-700 border-blue-200\",\n renderer: \"bg-purple-50 text-purple-700 border-purple-200\",\n };\n\n return html`\n <div class=\"rounded-lg border border-gray-200 bg-white overflow-hidden\">\n <button\n type=\"button\"\n class=\"w-full px-4 py-3 text-left transition hover:bg-gray-50\"\n @click=${() =>\n this.toggleToolExpansion(`${tool.agentId}:${tool.name}`)}\n >\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"flex items-center gap-2 mb-1\">\n <span class=\"font-mono text-sm font-semibold text-gray-900\"\n >${tool.name}</span\n >\n <span\n class=\"inline-flex items-center rounded-sm border px-1.5 py-0.5 text-[10px] font-medium ${\n typeColors[tool.type]\n }\"\n >\n ${tool.type}\n </span>\n </div>\n <div class=\"flex items-center gap-2 text-xs text-gray-500\">\n <span class=\"flex items-center gap-1\">\n ${this.renderIcon(\"Bot\")}\n <span class=\"font-mono\">${tool.agentId}</span>\n </span>\n ${\n schema.properties.length > 0\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span\n >${schema.properties.length}\n parameter${\n schema.properties.length !== 1 ? \"s\" : \"\"\n }</span\n >\n `\n : nothing\n }\n </div>\n ${\n tool.description\n ? html`<p class=\"mt-2 text-xs text-gray-600\">\n ${tool.description}\n </p>`\n : nothing\n }\n </div>\n <span\n class=\"shrink-0 text-gray-400 transition ${\n isExpanded ? \"rotate-180\" : \"\"\n }\"\n >\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\n\n ${\n isExpanded\n ? html`\n <div class=\"border-t border-gray-200 bg-gray-50/50 px-4 py-3\">\n ${\n schema.properties.length > 0\n ? html`\n <h5 class=\"mb-3 text-xs font-semibold text-gray-700\">\n Parameters\n </h5>\n <div class=\"space-y-3\">\n ${schema.properties.map(\n (prop) => html`\n <div\n class=\"rounded-md border border-gray-200 bg-white p-3\"\n >\n <div\n class=\"flex items-start justify-between gap-2 mb-1\"\n >\n <span\n class=\"font-mono text-xs font-medium text-gray-900\"\n >${prop.name}</span\n >\n <div class=\"flex items-center gap-1.5 shrink-0\">\n ${\n prop.required\n ? html`\n <span\n class=\"text-[9px] rounded border border-rose-200 bg-rose-50 px-1 py-0.5 font-medium text-rose-700\"\n >required</span\n >\n `\n : html`\n <span\n class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-medium text-gray-600\"\n >optional</span\n >\n `\n }\n ${\n prop.type\n ? html`<span\n class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-mono text-gray-600\"\n >${prop.type}</span\n >`\n : nothing\n }\n </div>\n </div>\n ${\n prop.description\n ? html`<p class=\"mt-1 text-xs text-gray-600\">\n ${prop.description}\n </p>`\n : nothing\n }\n ${\n prop.defaultValue !== undefined\n ? html`\n <div\n class=\"mt-2 flex items-center gap-1.5 text-[10px] text-gray-500\"\n >\n <span>Default:</span>\n <code\n class=\"rounded bg-gray-100 px-1 py-0.5 font-mono\"\n >${JSON.stringify(\n prop.defaultValue,\n )}</code\n >\n </div>\n `\n : nothing\n }\n ${\n prop.enum && prop.enum.length > 0\n ? html`\n <div class=\"mt-2\">\n <span class=\"text-[10px] text-gray-500\"\n >Allowed values:</span\n >\n <div class=\"mt-1 flex flex-wrap gap-1\">\n ${prop.enum.map(\n (val) => html`\n <code\n class=\"rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 text-[10px] font-mono text-gray-700\"\n >${JSON.stringify(val)}</code\n >\n `,\n )}\n </div>\n </div>\n `\n : nothing\n }\n </div>\n `,\n )}\n </div>\n `\n : html`\n <div class=\"flex items-center justify-center py-4 text-xs text-gray-500\">\n <span>No parameters defined</span>\n </div>\n `\n }\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n private extractSchemaInfo(parameters: unknown): {\n properties: Array<{\n name: string;\n type?: string;\n description?: string;\n required: boolean;\n defaultValue?: unknown;\n enum?: unknown[];\n }>;\n } {\n const result: {\n properties: Array<{\n name: string;\n type?: string;\n description?: string;\n required: boolean;\n defaultValue?: unknown;\n enum?: unknown[];\n }>;\n } = { properties: [] };\n\n if (!parameters || typeof parameters !== \"object\") {\n return result;\n }\n\n // Try Zod schema introspection\n const zodDef = (parameters as { _def?: Record<string, unknown> })._def;\n if (zodDef && typeof zodDef === \"object\") {\n // Handle Zod object schema\n if (zodDef.typeName === \"ZodObject\") {\n const rawShape = zodDef.shape;\n const shape =\n typeof rawShape === \"function\"\n ? (rawShape as () => Record<string, unknown>)()\n : (rawShape as Record<string, unknown> | undefined);\n\n if (!shape || typeof shape !== \"object\") {\n return result;\n }\n const requiredKeys = new Set<string>();\n\n // Get required fields\n if (zodDef.unknownKeys === \"strict\" || !zodDef.catchall) {\n Object.keys(shape || {}).forEach((key) => {\n const candidate = (shape as Record<string, unknown>)[key];\n const fieldDef = (\n candidate as { _def?: Record<string, unknown> } | undefined\n )?._def;\n if (fieldDef && !this.isZodOptional(candidate)) {\n requiredKeys.add(key);\n }\n });\n }\n\n // Extract properties\n for (const [key, value] of Object.entries(shape || {})) {\n const fieldInfo = this.extractZodFieldInfo(value);\n result.properties.push({\n name: key,\n type: fieldInfo.type,\n description: fieldInfo.description,\n required: requiredKeys.has(key),\n defaultValue: fieldInfo.defaultValue,\n enum: fieldInfo.enum,\n });\n }\n }\n } else if (\n (parameters as { type?: string; properties?: Record<string, unknown> })\n .type === \"object\" &&\n (parameters as { properties?: Record<string, unknown> }).properties\n ) {\n // Handle JSON Schema format\n const props = (parameters as { properties?: Record<string, unknown> })\n .properties;\n const required = new Set(\n Array.isArray((parameters as { required?: string[] }).required)\n ? (parameters as { required?: string[] }).required\n : [],\n );\n\n for (const [key, value] of Object.entries(props ?? {})) {\n const prop = value as Record<string, unknown>;\n result.properties.push({\n name: key,\n type: prop.type as string | undefined,\n description:\n typeof prop.description === \"string\" ? prop.description : undefined,\n required: required.has(key),\n defaultValue: prop.default,\n enum: Array.isArray(prop.enum) ? prop.enum : undefined,\n });\n }\n }\n\n return result;\n }\n\n private isZodOptional(zodSchema: unknown): boolean {\n const schema = zodSchema as { _def?: Record<string, unknown> };\n if (!schema?._def) return false;\n\n const def = schema._def;\n\n // Check if it's explicitly optional or nullable\n if (def.typeName === \"ZodOptional\" || def.typeName === \"ZodNullable\") {\n return true;\n }\n\n // Check if it has a default value\n if (def.defaultValue !== undefined) {\n return true;\n }\n\n return false;\n }\n\n private extractZodFieldInfo(zodSchema: unknown): {\n type?: string;\n description?: string;\n defaultValue?: unknown;\n enum?: unknown[];\n } {\n const info: {\n type?: string;\n description?: string;\n defaultValue?: unknown;\n enum?: unknown[];\n } = {};\n\n const schema = zodSchema as { _def?: Record<string, unknown> };\n if (!schema?._def) return info;\n\n let currentSchema = schema as { _def?: Record<string, unknown> };\n let def = currentSchema._def as Record<string, unknown>;\n\n // Unwrap optional/nullable\n while (\n def.typeName === \"ZodOptional\" ||\n def.typeName === \"ZodNullable\" ||\n def.typeName === \"ZodDefault\"\n ) {\n if (def.typeName === \"ZodDefault\" && def.defaultValue !== undefined) {\n info.defaultValue =\n typeof def.defaultValue === \"function\"\n ? def.defaultValue()\n : def.defaultValue;\n }\n currentSchema =\n (def.innerType as { _def?: Record<string, unknown> }) ?? currentSchema;\n if (!currentSchema?._def) break;\n def = currentSchema._def as Record<string, unknown>;\n }\n\n // Extract description\n info.description =\n typeof def.description === \"string\" ? def.description : undefined;\n\n const typeName =\n typeof def.typeName === \"string\" ? def.typeName : undefined;\n\n // Extract type\n const typeMap: Record<string, string> = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBoolean: \"boolean\",\n ZodArray: \"array\",\n ZodObject: \"object\",\n ZodEnum: \"enum\",\n ZodLiteral: \"literal\",\n ZodUnion: \"union\",\n ZodAny: \"any\",\n ZodUnknown: \"unknown\",\n };\n info.type = typeName\n ? typeMap[typeName] || typeName.replace(\"Zod\", \"\").toLowerCase()\n : undefined;\n\n // Extract enum values\n if (typeName === \"ZodEnum\" && Array.isArray(def.values)) {\n info.enum = def.values as unknown[];\n } else if (typeName === \"ZodLiteral\" && def.value !== undefined) {\n info.enum = [def.value];\n }\n\n return info;\n }\n\n private toggleToolExpansion(toolId: string): void {\n if (this.expandedTools.has(toolId)) {\n this.expandedTools.delete(toolId);\n } else {\n this.expandedTools.add(toolId);\n }\n this.requestUpdate();\n }\n\n private renderContextView() {\n const contextEntries = Object.entries(this.contextStore);\n\n if (contextEntries.length === 0) {\n return html`\n <div\n class=\"flex h-full items-center justify-center px-4 py-8 text-center\"\n >\n <div class=\"max-w-md\">\n <div\n class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\"\n >\n ${this.renderIcon(\"FileText\")}\n </div>\n <p class=\"text-sm text-gray-600\">No context available</p>\n <p class=\"mt-2 text-xs text-gray-500\">\n Context will appear here once added to CopilotKit.\n </p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"flex h-full flex-col overflow-hidden\">\n <div class=\"overflow-auto p-4\">\n <div class=\"space-y-3\">\n ${contextEntries.map(([id, context]) =>\n this.renderContextCard(id, context),\n )}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextCard(\n id: string,\n context: { description?: string; value: unknown },\n ) {\n const isExpanded = this.expandedContextItems.has(id);\n const valuePreview = this.getContextValuePreview(context.value);\n const hasValue = context.value !== undefined && context.value !== null;\n const title = context.description?.trim() || id;\n\n return html`\n <div class=\"rounded-lg border border-gray-200 bg-white overflow-hidden\">\n <button\n type=\"button\"\n class=\"w-full px-4 py-3 text-left transition hover:bg-gray-50\"\n @click=${() => this.toggleContextExpansion(id)}\n >\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"flex-1 min-w-0\">\n <p class=\"text-sm font-medium text-gray-900 mb-1\">${title}</p>\n <div class=\"flex items-center gap-2 text-xs text-gray-500\">\n <span\n class=\"font-mono truncate inline-block align-middle\"\n style=\"max-width: 180px;\"\n >${id}</span\n >\n ${\n hasValue\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span class=\"truncate\">${valuePreview}</span>\n `\n : nothing\n }\n </div>\n </div>\n <span\n class=\"shrink-0 text-gray-400 transition ${\n isExpanded ? \"rotate-180\" : \"\"\n }\"\n >\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\n\n ${\n isExpanded\n ? html`\n <div class=\"border-t border-gray-200 bg-gray-50/50 px-4 py-3\">\n <div class=\"mb-3\">\n <h5 class=\"mb-1 text-xs font-semibold text-gray-700\">ID</h5>\n <code\n class=\"block rounded bg-white border border-gray-200 px-2 py-1 text-[10px] font-mono text-gray-600\"\n >${id}</code\n >\n </div>\n ${\n hasValue\n ? html`\n <div class=\"mb-2 flex items-center justify-between gap-2\">\n <h5 class=\"text-xs font-semibold text-gray-700\">\n Value\n </h5>\n <button\n class=\"flex items-center gap-1 rounded-md border border-gray-200 bg-white px-2 py-1 text-[10px] font-medium text-gray-700 transition hover:bg-gray-50\"\n type=\"button\"\n @click=${(e: Event) => {\n e.stopPropagation();\n void this.copyContextValue(context.value, id);\n }}\n >\n ${\n this.copiedContextItems.has(id)\n ? \"Copied\"\n : \"Copy JSON\"\n }\n </button>\n </div>\n <div\n class=\"rounded-md border border-gray-200 bg-white p-3\"\n >\n <pre\n class=\"overflow-auto text-xs text-gray-800 max-h-96\"\n ><code>${this.formatContextValue(\n context.value,\n )}</code></pre>\n </div>\n `\n : html`\n <div class=\"flex items-center justify-center py-4 text-xs text-gray-500\">\n <span>No value available</span>\n </div>\n `\n }\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n private getContextValuePreview(value: unknown): string {\n if (value === undefined || value === null) {\n return \"—\";\n }\n\n if (typeof value === \"string\") {\n return value.length > 50 ? `${value.substring(0, 50)}...` : value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n return `Object with ${keys.length} key${keys.length !== 1 ? \"s\" : \"\"}`;\n }\n\n if (typeof value === \"function\") {\n return \"Function\";\n }\n\n return String(value);\n }\n\n private formatContextValue(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (value === null) {\n return \"null\";\n }\n\n if (typeof value === \"function\") {\n return value.toString();\n }\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n\n private async copyContextValue(\n value: unknown,\n contextId: string,\n ): Promise<void> {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n console.warn(\"Clipboard API is not available in this environment.\");\n return;\n }\n\n const serialized = this.formatContextValue(value);\n try {\n await navigator.clipboard.writeText(serialized);\n this.copiedContextItems.add(contextId);\n this.requestUpdate();\n setTimeout(() => {\n this.copiedContextItems.delete(contextId);\n this.requestUpdate();\n }, 1500);\n } catch (error) {\n console.error(\"Failed to copy context value:\", error);\n }\n }\n\n private toggleContextExpansion(contextId: string): void {\n if (this.expandedContextItems.has(contextId)) {\n this.expandedContextItems.delete(contextId);\n } else {\n this.expandedContextItems.add(contextId);\n }\n this.requestUpdate();\n }\n\n private handleGlobalPointerDown = (event: PointerEvent): void => {\n if (!this.contextMenuOpen) {\n return;\n }\n\n const clickedDropdown = event.composedPath().some((node) => {\n return (\n node instanceof HTMLElement &&\n node.dataset?.contextDropdownRoot === \"true\"\n );\n });\n\n if (!clickedDropdown) {\n this.contextMenuOpen = false;\n this.requestUpdate();\n }\n };\n\n private toggleRowExpansion(eventId: string): void {\n // Don't toggle if user is selecting text\n const selection = window.getSelection();\n if (selection && selection.toString().length > 0) {\n return;\n }\n\n if (this.expandedRows.has(eventId)) {\n this.expandedRows.delete(eventId);\n } else {\n this.expandedRows.add(eventId);\n }\n this.requestUpdate();\n }\n\n private renderAnnouncementPanel() {\n if (!this.isOpen) {\n return nothing;\n }\n\n // Ensure loading is triggered even if we mounted in an already-open state\n this.ensureAnnouncementLoading();\n\n if (!this.hasUnseenAnnouncement) {\n return nothing;\n }\n\n if (!this.announcementLoaded && !this.announcementMarkdown) {\n return html`<div\n class=\"mx-4 my-3 rounded-xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-800 shadow-[0_12px_30px_rgba(15,23,42,0.12)]\"\n >\n <div class=\"flex items-center gap-2 font-semibold\">\n <span\n class=\"inline-flex h-6 w-6 items-center justify-center rounded-md bg-slate-900 text-white shadow-sm\"\n >\n ${this.renderIcon(\"Megaphone\")}\n </span>\n <span>Loading latest announcement…</span>\n </div>\n </div>`;\n }\n\n if (this.announcementLoadError) {\n return html`<div\n class=\"mx-4 my-3 rounded-xl border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-900 shadow-[0_12px_30px_rgba(15,23,42,0.12)]\"\n >\n <div class=\"flex items-center gap-2 font-semibold\">\n <span\n class=\"inline-flex h-6 w-6 items-center justify-center rounded-md bg-rose-600 text-white shadow-sm\"\n >\n ${this.renderIcon(\"Megaphone\")}\n </span>\n <span>Announcement unavailable</span>\n </div>\n <p class=\"mt-2 text-xs text-rose-800\">\n We couldn’t load the latest notice. Please try opening the inspector\n again.\n </p>\n </div>`;\n }\n\n if (!this.announcementMarkdown) {\n return nothing;\n }\n\n const content = this.announcementHtml\n ? unsafeHTML(this.announcementHtml)\n : html`<pre class=\"whitespace-pre-wrap text-sm text-gray-900\">\n${this.announcementMarkdown}</pre\n >`;\n\n return html`<div\n class=\"mx-4 my-3 rounded-xl border border-slate-200 bg-white px-4 py-4 shadow-[0_12px_30px_rgba(15,23,42,0.12)]\"\n >\n <div\n class=\"mb-3 flex items-center gap-2 text-sm font-semibold text-slate-900\"\n >\n <span\n class=\"inline-flex h-7 w-7 items-center justify-center rounded-md bg-slate-900 text-white shadow-sm\"\n >\n ${this.renderIcon(\"Megaphone\")}\n </span>\n <span>Announcement</span>\n <button\n class=\"announcement-dismiss ml-auto\"\n type=\"button\"\n @click=${this.handleDismissAnnouncement}\n aria-label=\"Dismiss announcement\"\n >\n Dismiss\n </button>\n </div>\n <div class=\"announcement-content text-sm leading-relaxed text-gray-900\">\n ${content}\n </div>\n </div>`;\n }\n\n private ensureAnnouncementLoading(): void {\n if (\n this.announcementPromise ||\n typeof window === \"undefined\" ||\n typeof fetch === \"undefined\"\n ) {\n return;\n }\n this.announcementPromise = this.fetchAnnouncement();\n }\n\n private renderAnnouncementPreview() {\n if (\n !this.hasUnseenAnnouncement ||\n !this.showAnnouncementPreview ||\n !this.announcementPreviewText\n ) {\n return nothing;\n }\n\n const side =\n this.contextState.button.anchor.horizontal === \"left\" ? \"right\" : \"left\";\n\n return html`<div\n class=\"announcement-preview\"\n data-side=${side}\n role=\"note\"\n @click=${() => this.handleAnnouncementPreviewClick()}\n >\n <span>${this.announcementPreviewText}</span>\n <span class=\"announcement-preview__arrow\"></span>\n </div>`;\n }\n\n private handleAnnouncementPreviewClick(): void {\n this.showAnnouncementPreview = false;\n this.openInspector();\n }\n\n private handleDismissAnnouncement = (): void => {\n this.markAnnouncementSeen();\n };\n\n private async fetchAnnouncement(): Promise<void> {\n try {\n const response = await fetch(ANNOUNCEMENT_URL, { cache: \"no-cache\" });\n if (!response.ok) {\n throw new Error(`Failed to load announcement (${response.status})`);\n }\n\n const data = (await response.json()) as {\n timestamp?: unknown;\n previewText?: unknown;\n announcement?: unknown;\n };\n\n const timestamp =\n typeof data?.timestamp === \"string\" ? data.timestamp : null;\n const previewText =\n typeof data?.previewText === \"string\" ? data.previewText : null;\n const markdown =\n typeof data?.announcement === \"string\" ? data.announcement : null;\n\n if (!timestamp || !markdown) {\n throw new Error(\"Malformed announcement payload\");\n }\n\n const storedTimestamp = this.loadStoredAnnouncementTimestamp();\n\n this.announcementTimestamp = timestamp;\n this.announcementPreviewText = previewText ?? \"\";\n this.announcementMarkdown = markdown;\n this.hasUnseenAnnouncement =\n (!storedTimestamp || storedTimestamp !== timestamp) &&\n !!this.announcementPreviewText;\n this.showAnnouncementPreview = this.hasUnseenAnnouncement;\n this.announcementHtml = await this.convertMarkdownToHtml(markdown);\n this.announcementLoaded = true;\n\n this.requestUpdate();\n } catch (error) {\n this.announcementLoadError = error;\n this.announcementLoaded = true;\n this.requestUpdate();\n }\n }\n\n private async convertMarkdownToHtml(\n markdown: string,\n ): Promise<string | null> {\n const renderer = new marked.Renderer();\n renderer.link = (href, title, text) => {\n const safeHref = this.escapeHtmlAttr(this.appendRefParam(href ?? \"\"));\n const titleAttr = title ? ` title=\"${this.escapeHtmlAttr(title)}\"` : \"\";\n return `<a href=\"${safeHref}\" target=\"_blank\" rel=\"noopener\"${titleAttr}>${text}</a>`;\n };\n return marked.parse(markdown, { renderer });\n }\n\n private appendRefParam(href: string): string {\n try {\n const url = new URL(\n href,\n typeof window !== \"undefined\"\n ? window.location.href\n : \"https://copilotkit.ai\",\n );\n if (!url.searchParams.has(\"ref\")) {\n url.searchParams.append(\"ref\", \"cpk-inspector\");\n }\n return url.toString();\n } catch {\n return href;\n }\n }\n\n private escapeHtmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n }\n\n private loadStoredAnnouncementTimestamp(): string | null {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(ANNOUNCEMENT_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed.timestamp === \"string\") {\n return parsed.timestamp;\n }\n // Backward compatibility: previous shape { hash }\n return null;\n } catch {\n // ignore malformed storage\n }\n return null;\n }\n\n private persistAnnouncementTimestamp(timestamp: string): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n const payload = JSON.stringify({ timestamp });\n window.localStorage.setItem(ANNOUNCEMENT_STORAGE_KEY, payload);\n } catch {\n // Non-fatal if storage is unavailable\n }\n }\n\n private markAnnouncementSeen(): void {\n // Clear badge only when explicitly dismissed\n this.hasUnseenAnnouncement = false;\n this.showAnnouncementPreview = false;\n\n if (!this.announcementTimestamp) {\n // If still loading, attempt once more after promise resolves; avoid infinite requeues\n if (this.announcementPromise && !this.announcementLoaded) {\n void this.announcementPromise\n .then(() => this.markAnnouncementSeen())\n .catch(() => undefined);\n }\n this.requestUpdate();\n return;\n }\n\n this.persistAnnouncementTimestamp(this.announcementTimestamp);\n this.requestUpdate();\n }\n}\n\nexport function defineWebInspector(): void {\n if (!customElements.get(WEB_INSPECTOR_TAG)) {\n customElements.define(WEB_INSPECTOR_TAG, WebInspectorElement);\n }\n}\n\ndefineWebInspector();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"cpk-web-inspector\": WebInspectorElement;\n }\n}\n"],"mappings":"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"}