@copilotkit/web-inspector 1.56.5 → 1.57.0

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 onAgentRunStarted: ({ agent }) => {\n // Per-thread clones are not in the agent registry, so\n // onAgentsChanged never fires for them. Subscribe here so\n // the inspector captures their AG-UI events.\n if (agent?.agentId) {\n this.subscribeToAgent(agent);\n }\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 onStateChanged: () => {\n this.syncAgentState(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 try {\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 } catch (error) {\n console.error(\n `[CopilotKit Inspector] Failed to sync messages for agent \"${agent.agentId}\":`,\n error,\n );\n }\n }\n\n private syncAgentState(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n try {\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 } catch (error) {\n console.error(\n `[CopilotKit Inspector] Failed to sync state for agent \"${agent.agentId}\":`,\n error,\n );\n }\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","ɵselectThreads","ɵselectThreadsError","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-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-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}}}@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-700:oklch(51.4% .222 16.935);--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;--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}.visible{visibility:visible}.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)}.mt-3{margin-top:calc(var(--spacing)*3)}.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}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.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-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing)*64)}.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-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-\\\\[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}.flex-shrink,.shrink{flex-shrink: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-800{background-color:var(--color-gray-800)}.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-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)}.py-10{padding-block:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.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-line{white-space:pre-line}.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-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{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-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)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.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-\\\\[\\\\#BEC2FF\\\\]:focus-visible{outline-color:#bec2ff}.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)}.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-outline-style{syntax:\\\"*\\\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\\\"*\\\";inherits:false}@property --tw-brightness{syntax:\\\"*\\\";inherits:false}@property --tw-contrast{syntax:\\\"*\\\";inherits:false}@property --tw-grayscale{syntax:\\\"*\\\";inherits:false}@property --tw-hue-rotate{syntax:\\\"*\\\";inherits:false}@property --tw-invert{syntax:\\\"*\\\";inherits:false}@property --tw-opacity{syntax:\\\"*\\\";inherits:false}@property --tw-saturate{syntax:\\\"*\\\";inherits:false}@property --tw-sepia{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow-color{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\\\"<percentage>\\\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\\\"*\\\";inherits:false}@property --tw-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}@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 type { TemplateResult } from \"lit\";\nimport { marked } from \"marked\";\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 { icons } from \"lucide\";\nimport type { CopilotKitCore } from \"@copilotkit/core\";\nimport {\n CopilotKitCoreRuntimeConnectionStatus,\n ɵselectThreads,\n ɵselectThreadsError,\n ɵcreateThreadStore,\n} from \"@copilotkit/core\";\nimport type {\n CopilotKitCoreSubscriber,\n CopilotKitCoreErrorCode,\n ɵThreadStore,\n ɵThread,\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 isValidAnchor,\n isValidPosition,\n isValidSize,\n isValidDockMode,\n} from \"./lib/persistence\";\nimport type { PersistedState } from \"./lib/persistence\";\n\nexport const WEB_INSPECTOR_TAG = \"cpk-web-inspector\" as const;\n\ntype LucideIconName = keyof typeof icons;\n\ntype MenuKey =\n | \"ag-ui-events\"\n | \"agents\"\n | \"frontend-tools\"\n | \"agent-context\"\n | \"threads\";\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: 700 };\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 | \"ACTIVITY_SNAPSHOT\"\n | \"ACTIVITY_DELTA\";\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 \"ACTIVITY_SNAPSHOT\",\n \"ACTIVITY_DELTA\",\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 /** Populated for role=\"activity\" messages (Generative UI). */\n activityType?: string;\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\n// ─── Thread details types ────────────────────────────────────────────────────\n\ninterface ApiThreadMessage {\n id: string;\n role: string;\n content?: string;\n toolCalls?: Array<{ id: string; name: string; args: string }>;\n toolCallId?: string;\n /** Present when role === \"activity\" (Generative UI output). */\n activityType?: string;\n}\n\ninterface ConversationUser {\n id: string;\n type: \"user\";\n content: string;\n createdAt: string;\n}\n\ninterface ConversationAssistant {\n id: string;\n type: \"assistant\";\n content: string;\n createdAt: string;\n}\n\ninterface ConversationToolCall {\n id: string;\n type: \"tool_call\";\n toolName: string;\n toolCallId: string;\n arguments: Record<string, unknown>;\n result: Record<string, unknown> | null;\n createdAt: string;\n groupId?: string;\n}\n\ninterface ConversationReasoning {\n id: string;\n type: \"reasoning\";\n duration: string;\n createdAt: string;\n}\n\ninterface ConversationStateUpdate {\n id: string;\n type: \"state_update\";\n createdAt: string;\n}\n\ninterface ConversationAgentResponded {\n id: string;\n type: \"agent_responded\";\n createdAt: string;\n}\n\ninterface ConversationGenerativeUIItem {\n id: string;\n type: \"generative-ui\";\n activityType: string;\n createdAt: string;\n}\n\ninterface ToolCallGroup {\n type: \"tool_call_group\";\n id: string;\n items: ConversationToolCall[];\n}\n\ntype ConversationItem =\n | ConversationUser\n | ConversationAssistant\n | ConversationToolCall\n | ConversationReasoning\n | ConversationStateUpdate\n | ConversationAgentResponded\n | ConversationGenerativeUIItem;\n\ntype RenderItem = ConversationItem | ToolCallGroup;\n\ninterface ApiAgentEvent {\n type: string;\n timestamp: string | number;\n payload: Record<string, unknown>;\n}\n\ntype ThreadDetailsTab = \"conversation\" | \"agent-state\" | \"ag-ui-events\";\n\n// ─── JSON syntax highlighter ─────────────────────────────────────────────────\n// Inline-styled so shadow DOM encapsulation preserves colors when the output\n// is injected via unsafeHTML. Only for structured data — never raw user HTML.\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\n// Memoize highlight output by payload reference. Tab switches cause Lit to\n// re-render the active panel from scratch, and the JSON.stringify + regex\n// pass below is by far the most expensive thing in the events / state\n// panels (potentially MB of agent state). Caching by object reference\n// turns subsequent renders of an unchanged event list into near-zero JS work.\nconst highlightedJsonCache = new WeakMap<object, string>();\n\nfunction highlightedJson(obj: unknown): string {\n if (typeof obj === \"object\" && obj !== null) {\n const cached = highlightedJsonCache.get(obj);\n if (cached !== undefined) return cached;\n }\n const colors = {\n key: \"#5558B2\",\n str: \"#189370\",\n num: \"#996300\",\n bool: \"#c0333a\",\n nil: \"#838389\",\n };\n const json = JSON.stringify(obj, null, 2);\n if (!json) return \"\";\n const parts: string[] = [];\n let lastIndex = 0;\n const re =\n /(\"(?:\\\\u[a-fA-F0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(?:\\s*:)?|\\b(?:true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(json)) !== null) {\n parts.push(escapeHtml(json.slice(lastIndex, match.index)));\n const m = match[0];\n let color = colors.num;\n if (m.startsWith('\"')) {\n color = m.trimEnd().endsWith(\":\") ? colors.key : colors.str;\n } else if (m === \"true\" || m === \"false\") {\n color = colors.bool;\n } else if (m === \"null\") {\n color = colors.nil;\n }\n parts.push(`<span style=\"color:${color}\">${escapeHtml(m)}</span>`);\n lastIndex = match.index + m.length;\n }\n parts.push(escapeHtml(json.slice(lastIndex)));\n const result = parts.join(\"\");\n if (typeof obj === \"object\" && obj !== null) {\n highlightedJsonCache.set(obj, result);\n }\n return result;\n}\n\nfunction eventColors(type: string): { bg: string; fg: string } {\n if (type.startsWith(\"TEXT_MESSAGE\")) return { bg: \"#EEE6FE\", fg: \"#57575B\" };\n if (type.startsWith(\"TOOL_CALL\"))\n return { bg: \"rgba(133,236,206,0.15)\", fg: \"#189370\" };\n if (type.startsWith(\"STATE\"))\n return { bg: \"rgba(190,194,255,0.102)\", fg: \"#5558B2\" };\n if (type.startsWith(\"RUN_\") || type.startsWith(\"STEP_\"))\n return { bg: \"rgba(255,172,77,0.2)\", fg: \"#996300\" };\n if (type === \"ERROR\") return { bg: \"rgba(250,95,103,0.13)\", fg: \"#c0333a\" };\n return { bg: \"#F7F7F9\", fg: \"#838389\" };\n}\n\nfunction formatTimestamp(ts: string | number): string {\n const date = typeof ts === \"number\" ? new Date(ts) : new Date(ts);\n if (Number.isNaN(date.getTime())) return \"\";\n const ms = date.getMilliseconds().toString().padStart(3, \"0\");\n return (\n date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n }) +\n \".\" +\n ms\n );\n}\n\n// ─── cpk-thread-list ────────────────────────────────────────────────────────\n\nclass CpkThreadList extends LitElement {\n static properties = {\n threads: { attribute: false },\n selectedThreadId: { attribute: false },\n errorMessage: { attribute: false },\n _query: { state: true },\n };\n threads: ɵThread[] = [];\n selectedThreadId: string | null = null;\n /**\n * Non-null when the underlying thread store reported a load error\n * (REST list rejection, Phoenix subscribe failure, retry exhaustion).\n * Surfaced inline so users see a real error state instead of stale or\n * empty data with no indication of what went wrong.\n */\n errorMessage: string | null = null;\n private _query = \"\";\n\n static styles = css`\n @import url(\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600&family=Spline+Sans+Mono:wght@400;500&display=swap\");\n\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .cpk-tl {\n font-family: \"Plus Jakarta Sans\", sans-serif;\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: #f7f7f9;\n }\n\n /* ── Search ── */\n .cpk-tl__search {\n padding: 10px 12px;\n border-bottom: 1px solid #dbdbe5;\n flex-shrink: 0;\n }\n\n .cpk-tl__search-input {\n width: 100%;\n box-sizing: border-box;\n font-family: \"Plus Jakarta Sans\", sans-serif;\n font-size: 12px;\n padding: 7px 10px;\n border-radius: 6px;\n border: 1px solid #dbdbe5;\n background: #ffffff;\n color: #010507;\n outline: none;\n transition: border-color 0.15s;\n }\n\n .cpk-tl__search-input:focus {\n border-color: #bec2ff;\n }\n\n /* ── List ── */\n .cpk-tl__list {\n flex: 1;\n overflow-y: auto;\n }\n\n /* ── Thread item ── */\n .cpk-tl__item {\n padding: 11px 13px;\n cursor: pointer;\n border-bottom: 1px solid #e9e9ef;\n border-left: 3px solid transparent;\n transition: background 0.1s;\n }\n\n .cpk-tl__item:hover {\n background: #ffffff;\n }\n\n .cpk-tl__item--active {\n background: #bec2ff1a;\n border-left-color: #bec2ff;\n }\n\n .cpk-tl__item--active:hover {\n background: #bec2ff33;\n }\n\n .cpk-tl__row1 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 3px;\n }\n\n .cpk-tl__name {\n font-size: 12px;\n font-weight: 500;\n color: #010507;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .cpk-tl__name--unnamed {\n color: #838389;\n font-style: italic;\n font-weight: 400;\n }\n\n .cpk-tl__time {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 10px;\n color: #838389;\n flex-shrink: 0;\n }\n\n .cpk-tl__meta {\n display: flex;\n gap: 6px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .cpk-tl__pill {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 9px;\n padding: 1px 7px;\n border-radius: 4px;\n text-transform: uppercase;\n font-weight: 500;\n white-space: nowrap;\n background: #eee6fe;\n color: #57575b;\n }\n\n /* ── Empty state ── */\n .cpk-tl__empty {\n padding: 32px 16px;\n text-align: center;\n color: #838389;\n font-size: 12px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .cpk-tl__empty-icon {\n color: #c0c0c8;\n }\n `;\n\n private relativeTime(dateStr: string): string {\n const date = new Date(dateStr);\n const diffMs = Date.now() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n if (diffSec < 60) return `${diffSec}s ago`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffH = Math.floor(diffMin / 60);\n if (diffH < 24) return `${diffH}h ago`;\n const diffD = Math.floor(diffH / 24);\n return `${diffD}d ago`;\n }\n\n private get filtered(): ɵThread[] {\n const q = this._query.toLowerCase();\n if (!q) return this.threads;\n return this.threads.filter(\n (t) =>\n (t.name?.toLowerCase().includes(q) ?? false) ||\n t.agentId.toLowerCase().includes(q) ||\n t.id.toLowerCase().includes(q),\n );\n }\n\n private onThreadClick(threadId: string): void {\n this.dispatchEvent(\n new CustomEvent(\"threadSelected\", {\n detail: threadId,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private onSearchInput = (event: Event): void => {\n this._query = (event.target as HTMLInputElement).value;\n };\n\n render() {\n const filtered = this.filtered;\n return html`\n <div class=\"cpk-tl\">\n <!-- Search -->\n <div class=\"cpk-tl__search\">\n <input\n type=\"text\"\n placeholder=\"Search threads…\"\n .value=${this._query}\n @input=${this.onSearchInput}\n class=\"cpk-tl__search-input\"\n />\n </div>\n\n <!-- Thread list -->\n <div class=\"cpk-tl__list\">\n ${filtered.map(\n (thread) => html`\n <div\n class=\"cpk-tl__item ${\n this.selectedThreadId === thread.id\n ? \"cpk-tl__item--active\"\n : \"\"\n }\"\n @click=${() => this.onThreadClick(thread.id)}\n >\n <div class=\"cpk-tl__row1\">\n <span\n class=\"cpk-tl__name ${\n !thread.name ? \"cpk-tl__name--unnamed\" : \"\"\n }\"\n >${thread.name ?? \"Untitled\"}</span\n >\n <span class=\"cpk-tl__time\"\n >${this.relativeTime(thread.updatedAt)}</span\n >\n </div>\n <div class=\"cpk-tl__meta\">\n <span class=\"cpk-tl__pill\">${thread.agentId}</span>\n </div>\n </div>\n `,\n )}\n ${\n filtered.length === 0\n ? html`\n <div class=\"cpk-tl__empty\">\n ${\n this.errorMessage\n ? html`\n <svg\n width=\"24\"\n height=\"24\"\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=\"cpk-tl__empty-icon\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <div>\n Failed to load threads\n <div style=\"font-size:11px;margin-top:4px;color:#c0333a;\">\n ${this.errorMessage}\n </div>\n </div>\n `\n : this.threads.length === 0\n ? html`\n <svg\n width=\"24\"\n height=\"24\"\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=\"cpk-tl__empty-icon\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n No threads yet\n `\n : html`\n No threads match your search.\n `\n }\n </div>\n `\n : nothing\n }\n </div>\n </div>\n `;\n }\n}\n\n// ─── cpk-thread-details ──────────────────────────────────────────────────────\n// Renders the selected thread's conversation, agent state, and AG-UI events.\n// Conversation comes from the runtime's `/threads/:id/messages` endpoint\n// (always thread-accurate). Agent state and AG-UI events accept live inputs\n// (`agentStateInput`, `agentEventsInput`) from the parent inspector's ongoing\n// agent subscriptions; when those are absent we fall back to the per-thread\n// fetched data via `/threads/:id/{events,state}`.\n\n// Exported (with the underscore-prefixed name signalling internal/test-only)\n// so unit tests can pin down the per-panel template-cache invariants without\n// reaching through `customElements`. Production consumers continue to use the\n// `cpk-thread-details` custom element registered below.\nexport class ɵCpkThreadDetails extends LitElement {\n static properties = {\n threadId: { attribute: false },\n thread: { attribute: false },\n runtimeUrl: { attribute: false },\n headers: { attribute: false },\n agentStateInput: { attribute: false },\n agentEventsInput: { attribute: false },\n liveMessageVersion: { attribute: false },\n _tab: { state: true },\n _conversation: { state: true },\n _fetchedEvents: { state: true },\n _fetchedState: { state: true },\n _loadingMessages: { state: true },\n _loadingEvents: { state: true },\n _loadingState: { state: true },\n _messagesError: { state: true },\n _eventsError: { state: true },\n _stateError: { state: true },\n _expandedTools: { state: true },\n _expandedMessages: { state: true },\n _showDetailPanel: { state: true },\n _detailPanelWidth: { state: true },\n _eventsNotAvailable: { state: true },\n _stateNotAvailable: { state: true },\n _panelInitializing: { state: true },\n _activatedTabs: { state: true },\n };\n\n threadId: string | null = null;\n thread: ɵThread | null = null;\n runtimeUrl = \"\";\n headers: Record<string, string> = {};\n agentStateInput: Record<string, unknown> | null = null;\n agentEventsInput: ApiAgentEvent[] = [];\n /**\n * Monotonic per-thread counter the parent inspector ticks every time the\n * agent currently running on this thread emits a message change. When this\n * prop changes for the same `threadId`, we re-fetch `/threads/:id/messages`\n * so the conversation view reflects live streaming output.\n */\n liveMessageVersion = 0;\n\n private _tab: ThreadDetailsTab = \"conversation\";\n private _conversation: ConversationItem[] = [];\n private _fetchedEvents: ApiAgentEvent[] | null = null;\n private _fetchedState: Record<string, unknown> | null = null;\n private _loadingMessages = false;\n private _loadingEvents = false;\n private _loadingState = false;\n private _messagesError: string | null = null;\n private _eventsError: string | null = null;\n private _stateError: string | null = null;\n private _expandedTools = new Set<string>();\n private _expandedMessages = new Set<string>();\n private _showDetailPanel = false;\n private _detailPanelWidth = 250;\n /** True when the /events endpoint returned 501 — don't fall back to live data. */\n private _eventsNotAvailable = false;\n /** True when the /state endpoint returned 501 — don't fall back to live data. */\n private _stateNotAvailable = false;\n /**\n * Briefly true after a tab switch so the active-tab highlight + a generic\n * \"Loading…\" placeholder paint before the heavy per-tab render runs. Without\n * this, large event/conversation lists block the next paint and the user\n * sees the click as unresponsive for seconds.\n */\n private _panelInitializing = false;\n /**\n * Tabs that have been opened at least once for the current thread. Once a\n * tab is activated, its rendered DOM stays mounted (we hide inactive tabs\n * via display:none) so flipping back to it is just a CSS swap rather than\n * tearing down and rebuilding the entire panel from scratch. Without this,\n * switching back to AG-UI Events on a thread with hundreds of events\n * triggers a multi-second DOM-creation pass each time.\n *\n * Reset to {\"conversation\"} when the selected thread changes.\n */\n private _activatedTabs: Set<ThreadDetailsTab> = new Set([\"conversation\"]);\n /**\n * Memoized per-panel templates keyed by the inputs they render from.\n * When the underlying data hasn't changed (same `_conversation` /\n * `_fetchedState` / events array reference, plus expand-state for the\n * conversation panel), we return the previously built TemplateResult.\n * Lit then sees \"same template, same values\" and skips the diff entirely,\n * so re-rendering on tab switch is near-zero work even when the panel\n * content is large. The key is an opaque tuple compared element-wise by\n * reference; if any element flips, the cache misses and rebuilds.\n */\n private _panelTplCache: Map<\n ThreadDetailsTab,\n { key: readonly unknown[]; tpl: TemplateResult }\n > = new Map();\n /**\n * Tracks whether we've fetched events for the current thread yet. Events\n * fetch lazily on first sub-tab click so a large response's JSON.parse\n * doesn't block the main thread when the user only ever cares about the\n * conversation.\n */\n private _eventsFetched = false;\n /**\n * Tracks whether we've fetched state for the current thread yet. Same\n * lazy-load reasoning as `_eventsFetched`.\n */\n private _stateFetched = false;\n private _lastFetchedThreadId: string | null = null;\n private _lastSeenLiveMessageVersion = 0;\n private _messagesAbort: AbortController | null = null;\n private _eventsAbort: AbortController | null = null;\n private _stateAbort: AbortController | null = null;\n private _dividerResizing = false;\n private _dividerPointerId = -1;\n private _dividerStartX = 0;\n private _dividerStartWidth = 0;\n\n static readonly COLLAPSE_THRESHOLD = 800;\n private static readonly TAB_LIST: ReadonlyArray<{\n id: ThreadDetailsTab;\n label: string;\n }> = [\n { id: \"conversation\", label: \"Conversation\" },\n { id: \"agent-state\", label: \"Agent State\" },\n { id: \"ag-ui-events\", label: \"AG-UI Events\" },\n ];\n\n private renderTabContent(id: ThreadDetailsTab): TemplateResult {\n if (id === \"conversation\") return this.renderConversation();\n if (id === \"agent-state\") return this.renderState();\n return this.renderEvents();\n }\n\n private activateTab(id: ThreadDetailsTab): void {\n if (this._tab === id) return;\n const isFirstActivation = !this._activatedTabs.has(id);\n this._tab = id;\n if (isFirstActivation) {\n // First time opening this tab: paint a \"Loading…\" overlay for one\n // frame so the tab highlight + spinner appear before the heavy\n // per-tab render runs (events list, state JSON). The rAF batches\n // mounting the panel into `_activatedTabs` and clearing the spinner\n // into a single subsequent paint. Subsequent activations are pure\n // CSS toggles via display:none on the already-mounted panel — no\n // re-render required.\n this._panelInitializing = true;\n requestAnimationFrame(() => {\n this._activatedTabs = new Set([...this._activatedTabs, id]);\n this._panelInitializing = false;\n });\n }\n this.maybeFetchTabData(id);\n }\n\n private maybeFetchTabData(id: ThreadDetailsTab): void {\n // Lazy-trigger the events / state fetches so their (potentially huge)\n // JSON.parse only blocks the main thread after the user has shown\n // intent to view that sub-tab. Without lazy-load, the eager fetch runs\n // as soon as the thread opens and a single large response can stall\n // the entire panel for seconds — including making the tab buttons\n // themselves feel unresponsive.\n if (!this.threadId) return;\n if (id === \"ag-ui-events\" && !this._eventsFetched) {\n this._eventsFetched = true;\n void this.fetchEvents(this.threadId);\n } else if (id === \"agent-state\" && !this._stateFetched) {\n this._stateFetched = true;\n void this.fetchState(this.threadId);\n }\n }\n\n static styles = css`\n @import url(\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600&family=Spline+Sans+Mono:wght@400;500&display=swap\");\n\n /* ── Root ────────────────────────────────────────────────────────── */\n :host {\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .cpk-td {\n font-family: \"Plus Jakarta Sans\", sans-serif;\n font-size: 13px;\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 100%;\n overflow: hidden;\n background: #ffffff;\n }\n\n /* ── Left area ───────────────────────────────────────────────────── */\n .cpk-td__left {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n /* ── Tab bar header ──────────────────────────────────────────────── */\n .cpk-td__tabs-header {\n /* No top/right padding so tabs and toggle sit flush against the\n top and right edges of the inspector. */\n padding: 0 0 0 12px;\n border-bottom: 1px solid #dbdbe5;\n flex-shrink: 0;\n display: flex;\n align-items: stretch;\n }\n\n .cpk-td__tab-group {\n display: flex;\n gap: 0;\n margin-bottom: -1px;\n /* Allow the tab list to shrink rather than pushing the panel-toggle\n button past the right edge of the inspector when horizontal space\n gets tight (the drawer being open eats noticeably into width). */\n min-width: 0;\n flex-shrink: 1;\n overflow: hidden;\n }\n\n .cpk-td__tab {\n font-family: \"Plus Jakarta Sans\", sans-serif;\n font-size: 11px;\n font-weight: 500;\n padding: 10px 12px;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n background: transparent;\n color: #838389;\n transition:\n color 0.12s,\n border-color 0.12s;\n white-space: nowrap;\n }\n\n .cpk-td__tab:hover {\n color: #010507;\n }\n\n .cpk-td__tab--active {\n color: #010507;\n border-bottom-color: #bec2ff;\n }\n\n /* Toggle is a separate control, not a tab — so it does NOT use the\n tabs' bottom-border active indicator. Instead, a subtle filled\n state communicates \"the drawer is open,\" and a vertical separator\n on the left visually divorces it from the tab group. */\n .cpk-td__panel-toggle {\n margin-left: auto;\n align-self: stretch;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 12px;\n border: none;\n border-left: 1px solid #dbdbe5;\n background: transparent;\n color: #838389;\n cursor: pointer;\n flex-shrink: 0;\n transition:\n color 0.12s,\n background 0.12s;\n }\n .cpk-td__panel-toggle:hover {\n color: #010507;\n background: #f4f4f9;\n }\n .cpk-td__panel-toggle--active {\n color: #5558b2;\n background: #eee6fe;\n }\n .cpk-td__panel-toggle--active:hover {\n background: #e4d8fc;\n }\n\n /* ── Scrollable content ──────────────────────────────────────────── */\n .cpk-td__content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n /* Pin direct children so expanded tool bodies don't get flex-shrunk. */\n .cpk-td__content > * {\n flex-shrink: 0;\n }\n\n /*\n * Each tab's content is wrapped in this panel so the keep-mounted\n * inactive panels can be hidden via display:none without disturbing\n * the gap between visible siblings. The flex column + gap gives each\n * conversation item / event row breathing room (the cpk-td__content\n * rule above no longer reaches them now that they are nested inside\n * the per-panel wrapper).\n */\n .cpk-td__panel {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .cpk-td__panel > * {\n flex-shrink: 0;\n }\n\n /* ── Empty state ─────────────────────────────────────────────────── */\n .cpk-td__empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #838389;\n font-size: 13px;\n padding: 40px 0;\n }\n\n .cpk-td__empty-hint {\n font-size: 11px;\n color: #838389;\n text-align: center;\n max-width: 220px;\n line-height: 1.5;\n }\n\n /* ── Status messages ─────────────────────────────────────────────── */\n .cpk-td__status {\n padding: 16px;\n font-size: 12px;\n color: #838389;\n text-align: center;\n }\n\n .cpk-td__status--error {\n color: #c0333a;\n }\n\n /* ── Conversation bubbles ────────────────────────────────────────── */\n .cpk-td__bubble {\n display: flex;\n margin-bottom: 2px;\n }\n\n .cpk-td__bubble--user {\n justify-content: flex-end;\n }\n\n .cpk-td__bubble--assistant {\n justify-content: flex-start;\n }\n\n .cpk-td__bubble-inner {\n padding: 9px 14px;\n max-width: 75%;\n font-size: 13px;\n line-height: 1.55;\n }\n\n .cpk-td__bubble-inner--user {\n background: #eee6fe;\n color: #57575b;\n border-radius: 10px 10px 3px 10px;\n }\n\n .cpk-td__show-more {\n display: inline-block;\n margin-top: 4px;\n font-size: 11px;\n font-weight: 500;\n color: #57575b;\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n\n .cpk-td__bubble-inner--assistant {\n background: #f7f7f9;\n color: #010507;\n border-radius: 10px 10px 10px 3px;\n border: 1px solid #e9e9ef;\n }\n\n /* ── Tool call blocks ────────────────────────────────────────────── */\n .cpk-td__tool-block {\n border: 1px solid #e9e9ef;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .cpk-td__tool-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n background: rgba(133, 236, 206, 0.15);\n cursor: pointer;\n font-size: 11px;\n user-select: none;\n }\n\n .cpk-td__tool-header:hover {\n background: rgba(133, 236, 206, 0.22);\n }\n\n .cpk-td__tool-name {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 10px;\n font-weight: 500;\n color: #189370;\n text-transform: uppercase;\n flex: 1;\n }\n\n .cpk-td__tool-status {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 9px;\n text-transform: uppercase;\n color: #189370;\n }\n\n .cpk-td__tool-status--pending {\n color: #996300;\n }\n\n .cpk-td__tool-chevron {\n color: #838389;\n font-size: 10px;\n }\n\n .cpk-td__tool-body {\n padding: 8px 10px;\n border-top: 1px solid #e9e9ef;\n background: #ffffff;\n }\n\n .cpk-td__tool-section-label {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 9px;\n font-weight: 500;\n color: #838389;\n text-transform: uppercase;\n margin-bottom: 4px;\n letter-spacing: 0.3px;\n }\n\n .cpk-td__tool-pre {\n margin: 0;\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 10px;\n background: #f7f7f9;\n padding: 6px 8px;\n border-radius: 4px;\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n color: #010507;\n line-height: 1.6;\n }\n\n /* ── Tool call group ─────────────────────────────────────────────── */\n .cpk-td__tool-group {\n border: 1px solid #e9e9ef;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .cpk-td__tool-group-header {\n padding: 5px 10px;\n background: rgba(133, 236, 206, 0.15);\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 10px;\n color: #189370;\n text-transform: uppercase;\n font-weight: 500;\n border-bottom: 1px solid #e9e9ef;\n }\n\n .cpk-td__tool-group .cpk-td__tool-block {\n border: none;\n border-bottom: 1px solid #e9e9ef;\n border-radius: 0;\n }\n\n .cpk-td__tool-group .cpk-td__tool-block:last-child {\n border-bottom: none;\n }\n\n /* ── Inline chips (reasoning / state update) ─────────────────────── */\n .cpk-td__inline-chip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 0;\n color: #838389;\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 9px;\n text-transform: uppercase;\n }\n\n .cpk-td__inline-chip::before,\n .cpk-td__inline-chip::after {\n content: \"\";\n flex: 1;\n height: 1px;\n background: #e9e9ef;\n }\n\n /* ── Generative UI ──────────────────────────────────────────────── */\n @keyframes cpk-genui-enter {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .cpk-td__genui {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 4px 16px 8px;\n animation: cpk-genui-enter 0.25s cubic-bezier(0.16, 1, 0.3, 1) both;\n }\n\n .cpk-td__genui-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 4px;\n background: #eee6fe;\n color: #57575b;\n font-size: 10px;\n font-weight: 600;\n align-self: flex-start;\n }\n\n .cpk-td__genui-card {\n overflow: hidden;\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n background: #fff;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.08);\n }\n\n .cpk-td__genui-placeholder {\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid #ede9fe;\n background: #f5f3ff;\n color: #7c3aed;\n font-size: 11px;\n }\n\n /* ── AG-UI Events ────────────────────────────────────────────────── */\n .cpk-td__event {\n flex-shrink: 0;\n border: 1px solid #e9e9ef;\n border-radius: 6px;\n overflow: hidden;\n /*\n * content-visibility: auto lets the browser skip layout + paint for\n * off-screen events while keeping them in the DOM (so scroll size\n * stays correct). Without this, switching back to AG-UI Events on a\n * thread with hundreds of events triggers a full layout pass over\n * every event row, which on Martha's intelligence-backed example\n * shows up as a multi-second freeze each time the panel becomes\n * visible. The intrinsic-size hint avoids the visible jump as the\n * browser swaps in real heights when items scroll into view.\n */\n content-visibility: auto;\n contain-intrinsic-size: 0 80px;\n }\n\n .cpk-td__event-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 5px 10px;\n }\n\n .cpk-td__event-type {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 9px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n .cpk-td__event-time {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 9px;\n color: #838389;\n }\n\n .cpk-td__event-payload {\n margin: 0;\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 10px;\n line-height: 1.6;\n white-space: pre-wrap;\n word-break: break-all;\n color: #57575b;\n padding: 8px 10px;\n border-top: 1px solid #e9e9ef;\n }\n\n /* ── JSON block (agent state) ────────────────────────────────────── */\n .cpk-td__json-block {\n margin: 0;\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 11px;\n line-height: 1.8;\n white-space: pre-wrap;\n word-break: break-all;\n color: #57575b;\n }\n\n /* ── Resize divider ──────────────────────────────────────────────── */\n /* Floats over the drawer's left edge so the toggle and the drawer\n touch directly without a 4px flex-gap between them. The hit zone\n is wider than its visual hint to make it easy to grab. */\n .cpk-td__detail-divider {\n position: absolute;\n top: 0;\n bottom: 0;\n left: -3px;\n width: 7px;\n cursor: col-resize;\n background: transparent;\n z-index: 5;\n }\n\n .cpk-td__detail-divider:hover {\n background: rgba(190, 194, 255, 0.3);\n }\n\n /* ── Right detail panel ──────────────────────────────────────────── */\n .cpk-td__detail {\n flex-shrink: 0;\n overflow: hidden;\n background: #f7f7f9;\n display: flex;\n flex-direction: column;\n gap: 0;\n padding: 0;\n box-sizing: border-box;\n position: relative;\n /* Slide open/closed via width + padding transition. When closed,\n width and padding are 0 so the drawer fully collapses. */\n transition:\n width 220ms cubic-bezier(0.4, 0, 0.2, 1),\n padding 220ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .cpk-td__detail[data-open=\"true\"] {\n overflow-y: auto;\n padding: 16px;\n }\n\n .cpk-tdp__section-title {\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 10px;\n font-weight: 500;\n color: #838389;\n text-transform: uppercase;\n letter-spacing: 0.6px;\n margin-bottom: 8px;\n }\n\n .cpk-tdp__divider {\n height: 1px;\n background: #dbdbe5;\n margin: 14px 0;\n }\n\n .cpk-tdp__row {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 3px 0;\n gap: 8px;\n }\n\n .cpk-tdp__label {\n color: #838389;\n font-size: 11px;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n .cpk-tdp__value {\n color: #010507;\n font-family: \"Spline Sans Mono\", monospace;\n font-size: 11px;\n text-align: right;\n min-width: 0;\n }\n\n .cpk-tdp__value--truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 130px;\n }\n\n .cpk-tdp__value--wrap {\n white-space: normal;\n word-break: break-all;\n text-align: right;\n }\n `;\n\n updated(_changed: Map<string, unknown>): void {\n if (this.threadId !== this._lastFetchedThreadId) {\n this._lastFetchedThreadId = this.threadId;\n this._lastSeenLiveMessageVersion = this.liveMessageVersion;\n this._tab = \"conversation\";\n this._activatedTabs = new Set([\"conversation\"]);\n this._panelTplCache = new Map();\n this._expandedTools = new Set();\n this._expandedMessages = new Set();\n this._messagesAbort?.abort();\n this._messagesAbort = null;\n this._eventsAbort?.abort();\n this._eventsAbort = null;\n this._stateAbort?.abort();\n this._stateAbort = null;\n // Reset cleared so the next click into events/state triggers a fresh\n // fetch. Eagerly clear `_fetchedEvents` / `_fetchedState` so the empty\n // state doesn't briefly show last thread's data.\n this._eventsFetched = false;\n this._stateFetched = false;\n this._fetchedEvents = null;\n this._fetchedState = null;\n\n if (this.threadId) {\n // Conversation is the default tab and shows immediately on thread\n // open, so fetch eagerly. Events and state are only visible once the\n // user clicks their sub-tab; deferring those fetches prevents a long\n // JSON.parse of a large events payload from blocking the main thread\n // before the user has even shown intent to view them.\n void this.fetchMessages(this.threadId);\n } else {\n this._conversation = [];\n }\n } else if (\n this.threadId &&\n this.liveMessageVersion !== this._lastSeenLiveMessageVersion\n ) {\n // Same thread, but the parent inspector signalled new agent-emitted\n // messages on this thread (via `liveMessageVersion`). Re-fetch the\n // canonical conversation from the runtime so streaming output flows\n // into the view without us reimplementing AG-UI → ConversationItem\n // mapping in the parent. `silent: true` so the loading-state indicator\n // doesn't flash between every streaming chunk and we keep the\n // last-good view on transient fetch errors.\n this._lastSeenLiveMessageVersion = this.liveMessageVersion;\n this._messagesAbort?.abort();\n this._messagesAbort = null;\n void this.fetchMessages(this.threadId, true);\n }\n }\n\n /**\n * Fetch the canonical conversation for `threadId` from the runtime.\n *\n * `silent` is true for live re-fetches triggered by `liveMessageVersion`\n * bumps during streaming. In that mode we never toggle the loading state\n * (which would flash \"Loading messages…\" between every message) and we\n * keep the previous conversation on transient errors instead of blanking\n * it. Initial threadId-change fetches use the default (`silent=false`)\n * so users see an explicit loading indicator on first load.\n */\n private async fetchMessages(\n threadId: string,\n silent: boolean = false,\n ): Promise<void> {\n if (!this.runtimeUrl) {\n if (!silent) this._conversation = [];\n return;\n }\n const controller = new AbortController();\n this._messagesAbort = controller;\n if (!silent) {\n this._loadingMessages = true;\n this._messagesError = null;\n }\n try {\n const res = await fetch(\n `${this.runtimeUrl}/threads/${encodeURIComponent(threadId)}/messages`,\n { headers: { ...this.headers }, signal: controller.signal },\n );\n if (controller.signal.aborted || this.threadId !== threadId) return;\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = (await res.json()) as { messages: ApiThreadMessage[] };\n if (controller.signal.aborted || this.threadId !== threadId) return;\n this._conversation = this.mapMessages(data.messages);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") return;\n if (!silent) {\n this._messagesError =\n err instanceof Error ? err.message : \"Failed to load messages\";\n this._conversation = [];\n }\n // Silent mode: keep last-good conversation, don't surface the error.\n // The next successful live re-fetch will recover automatically.\n } finally {\n if (!silent && !controller.signal.aborted) {\n this._loadingMessages = false;\n }\n }\n }\n\n private async fetchEvents(threadId: string): Promise<void> {\n this._eventsNotAvailable = false;\n if (!this.runtimeUrl) {\n this._fetchedEvents = null;\n return;\n }\n const controller = new AbortController();\n this._eventsAbort = controller;\n this._loadingEvents = true;\n this._eventsError = null;\n try {\n const res = await fetch(\n `${this.runtimeUrl}/threads/${encodeURIComponent(threadId)}/events`,\n { headers: { ...this.headers }, signal: controller.signal },\n );\n // Drop results if a newer fetch superseded this one (thread switched\n // mid-flight). Without this, switching A→B can leave thread B's view\n // showing thread A's events when A's request resolves last.\n if (controller.signal.aborted || this.threadId !== threadId) return;\n if (res.status === 501) {\n // Endpoint not supported on this runtime (e.g. Intelligence platform).\n // Mark unavailable so we don't misleadingly fall back to the parent's\n // live agent events — those are agent-keyed, not thread-keyed, and\n // would render identical across every thread on the same agent.\n this._eventsNotAvailable = true;\n this._fetchedEvents = null;\n return;\n }\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = (await res.json()) as {\n events: Array<Record<string, unknown>>;\n };\n if (controller.signal.aborted || this.threadId !== threadId) return;\n this._fetchedEvents = this.mapApiEvents(data.events);\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") return;\n if (this.threadId !== threadId) return;\n this._eventsError =\n err instanceof Error ? err.message : \"Failed to load events\";\n this._fetchedEvents = [];\n } finally {\n if (!controller.signal.aborted && this.threadId === threadId) {\n this._loadingEvents = false;\n }\n }\n }\n\n private async fetchState(threadId: string): Promise<void> {\n this._stateNotAvailable = false;\n if (!this.runtimeUrl) {\n this._fetchedState = null;\n return;\n }\n const controller = new AbortController();\n this._stateAbort = controller;\n this._loadingState = true;\n this._stateError = null;\n try {\n const res = await fetch(\n `${this.runtimeUrl}/threads/${encodeURIComponent(threadId)}/state`,\n { headers: { ...this.headers }, signal: controller.signal },\n );\n if (controller.signal.aborted || this.threadId !== threadId) return;\n if (res.status === 501) {\n this._stateNotAvailable = true;\n this._fetchedState = null;\n return;\n }\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = (await res.json()) as {\n state: Record<string, unknown> | null;\n };\n if (controller.signal.aborted || this.threadId !== threadId) return;\n this._fetchedState = data.state ?? null;\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") return;\n if (this.threadId !== threadId) return;\n this._stateError =\n err instanceof Error ? err.message : \"Failed to load state\";\n this._fetchedState = null;\n } finally {\n if (!controller.signal.aborted && this.threadId === threadId) {\n this._loadingState = false;\n }\n }\n }\n\n private mapMessages(messages: ApiThreadMessage[]): ConversationItem[] {\n const items: ConversationItem[] = [];\n const toolCallMap = new Map<string, ConversationToolCall>();\n for (const msg of messages) {\n if (msg.role === \"user\" && msg.content) {\n items.push({\n id: msg.id,\n type: \"user\",\n content: msg.content,\n createdAt: \"\",\n });\n } else if (msg.role === \"assistant\") {\n if (msg.toolCalls?.length) {\n for (const tc of msg.toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.args) as Record<string, unknown>;\n } catch (err) {\n // Inspector is a debugging surface — surface malformed payloads\n // instead of silently substituting `{}`. The sentinel lets the\n // renderer flag \"raw arguments — failed to parse\" if/when it\n // grows that branch; the console.error gives anyone with the\n // devtools open immediate visibility into the offending blob.\n console.error(\n \"[CopilotKit Inspector] Failed to parse tool-call arguments\",\n { toolCallId: tc.id, raw: tc.args, error: err },\n );\n args = { __parseError: true, __raw: tc.args };\n }\n const item: ConversationToolCall = {\n id: tc.id,\n type: \"tool_call\",\n toolName: tc.name,\n toolCallId: tc.id,\n arguments: args,\n result: null,\n createdAt: \"\",\n };\n toolCallMap.set(tc.id, item);\n items.push(item);\n }\n }\n if (msg.content) {\n items.push({\n id: msg.id,\n type: \"assistant\",\n content: msg.content,\n createdAt: \"\",\n });\n }\n } else if (msg.role === \"activity\") {\n items.push({\n id: msg.id,\n type: \"generative-ui\",\n activityType: msg.activityType ?? \"unknown\",\n createdAt: \"\",\n });\n } else if (msg.role === \"tool\" && msg.toolCallId) {\n const tc = toolCallMap.get(msg.toolCallId);\n if (tc) {\n try {\n tc.result = JSON.parse(msg.content ?? \"{}\") as Record<\n string,\n unknown\n >;\n } catch (err) {\n // See the comment on the assistant tool-call args parse above —\n // same rationale, same sentinel shape so the renderer can treat\n // both consistently.\n console.error(\n \"[CopilotKit Inspector] Failed to parse tool-call result content\",\n { toolCallId: msg.toolCallId, raw: msg.content, error: err },\n );\n tc.result = { __parseError: true, __raw: msg.content ?? null };\n }\n }\n }\n }\n return items;\n }\n\n private mapApiEvents(\n events: Array<Record<string, unknown>>,\n ): ApiAgentEvent[] {\n return events.map((event) => {\n const { type, timestamp, ...rest } = event;\n return {\n type: typeof type === \"string\" ? type : \"UNKNOWN\",\n timestamp:\n typeof timestamp === \"string\" || typeof timestamp === \"number\"\n ? timestamp\n : Date.now(),\n payload: rest,\n };\n });\n }\n\n private get renderItems(): RenderItem[] {\n const items = this._conversation;\n const result: RenderItem[] = [];\n const seen = new Set<string>();\n for (const item of items) {\n if (item.type === \"agent_responded\") continue;\n if (item.type !== \"tool_call\" || !item.groupId) {\n result.push(item);\n continue;\n }\n if (seen.has(item.groupId)) continue;\n seen.add(item.groupId);\n const group: ToolCallGroup = {\n type: \"tool_call_group\",\n id: item.groupId,\n items: items.filter(\n (i): i is ConversationToolCall =>\n i.type === \"tool_call\" && i.groupId === item.groupId,\n ),\n };\n result.push(group);\n }\n return result;\n }\n\n private get activityCounts(): {\n messages: number;\n toolCalls: number;\n generativeUi: number;\n } {\n let messages = 0;\n let toolCalls = 0;\n let generativeUi = 0;\n for (const item of this._conversation) {\n if (item.type === \"user\" || item.type === \"assistant\") messages++;\n if (item.type === \"tool_call\") toolCalls++;\n if (item.type === \"generative-ui\") generativeUi++;\n }\n return { messages, toolCalls, generativeUi };\n }\n\n private get duration(): string {\n const t = this.thread;\n if (!t?.createdAt || !t?.updatedAt) return \"—\";\n const ms =\n new Date(t.updatedAt).getTime() - new Date(t.createdAt).getTime();\n if (ms < 0) return \"—\";\n if (ms < 1000) return `${ms}ms`;\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const rs = s % 60;\n return `${m}m ${rs}s`;\n }\n\n private toggleToolExpand(id: string): void {\n const next = new Set(this._expandedTools);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n this._expandedTools = next;\n }\n\n private toggleMessageExpand(id: string): void {\n const next = new Set(this._expandedMessages);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n this._expandedMessages = next;\n }\n\n private get activeEvents(): ApiAgentEvent[] {\n // When the endpoint explicitly returned 501 we report no events rather\n // than leaking the parent's agent-keyed live events across historical\n // threads (those would render identically for every thread on the same\n // agent and mislead the reader).\n if (this._eventsNotAvailable) return [];\n return this._fetchedEvents ?? this.agentEventsInput ?? [];\n }\n\n private get activeState(): Record<string, unknown> | null {\n if (this._stateNotAvailable) return null;\n return this._fetchedState ?? this.agentStateInput ?? null;\n }\n\n private hasRenderableState(): boolean {\n const s = this.activeState;\n return !!s && typeof s === \"object\" && Object.keys(s).length > 0;\n }\n\n private shortId(id: string | null | undefined): string {\n if (!id) return \"—\";\n return id.length > 20 ? id.slice(0, 8) + \"…\" : id;\n }\n\n private fmtTime(dateStr: string | null | undefined): string {\n if (!dateStr) return \"—\";\n const d = new Date(dateStr);\n if (Number.isNaN(d.getTime())) return \"—\";\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n }\n\n private onDetailDividerDown = (event: PointerEvent): void => {\n this._dividerResizing = true;\n this._dividerPointerId = event.pointerId;\n this._dividerStartX = event.clientX;\n this._dividerStartWidth = this._detailPanelWidth;\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n event.preventDefault();\n };\n\n private onDetailDividerMove = (event: PointerEvent): void => {\n if (!this._dividerResizing || this._dividerPointerId !== event.pointerId)\n return;\n const delta = this._dividerStartX - event.clientX;\n this._detailPanelWidth = Math.max(\n 160,\n Math.min(400, this._dividerStartWidth + delta),\n );\n };\n\n private onDetailDividerUp = (event: PointerEvent): void => {\n if (this._dividerPointerId !== event.pointerId) return;\n const target = event.currentTarget as HTMLElement;\n if (target.hasPointerCapture(this._dividerPointerId)) {\n target.releasePointerCapture(this._dividerPointerId);\n }\n this._dividerResizing = false;\n };\n\n render() {\n return html`\n <div class=\"cpk-td\">\n <!-- ── Left area: tabs + content ─────────────────────────────────── -->\n <div class=\"cpk-td__left\">\n <!-- Tab bar -->\n <div class=\"cpk-td__tabs-header\">\n <div class=\"cpk-td__tab-group\" role=\"tablist\">\n ${ɵCpkThreadDetails.TAB_LIST.map(\n (tab) => html`\n <button\n role=\"tab\"\n class=\"cpk-td__tab ${\n this._tab === tab.id ? \"cpk-td__tab--active\" : \"\"\n }\"\n @click=${() => this.activateTab(tab.id)}\n >\n ${tab.label}\n </button>\n `,\n )}\n </div>\n ${this.renderPanelToggle()}\n </div>\n\n <!-- Scrollable content -->\n <div class=\"cpk-td__content\">\n ${\n this._panelInitializing\n ? html`\n <div class=\"cpk-td__status\">Loading…</div>\n `\n : nothing\n }\n ${ɵCpkThreadDetails.TAB_LIST.map((tab) =>\n this._activatedTabs.has(tab.id)\n ? html`<div\n class=\"cpk-td__panel\"\n style=${\n this._tab === tab.id && !this._panelInitializing\n ? \"\"\n : \"display:none\"\n }\n >\n ${this.renderTabContent(tab.id)}\n </div>`\n : nothing,\n )}\n </div>\n </div>\n\n <!--\n Drawer always rendered so width animates between 0 and its\n target. Divider lives INSIDE the drawer and is absolutely\n positioned over its left edge so the toggle (rightmost of the\n tab row) and the drawer touch with no flex-gap between them.\n -->\n <div\n class=\"cpk-td__detail\"\n data-open=${this._showDetailPanel ? \"true\" : \"false\"}\n style=\"width:${this._showDetailPanel ? this._detailPanelWidth : 0}px\"\n aria-hidden=${this._showDetailPanel ? \"false\" : \"true\"}\n >\n ${\n this._showDetailPanel\n ? html`\n <div\n class=\"cpk-td__detail-divider\"\n @pointerdown=${this.onDetailDividerDown}\n @pointermove=${this.onDetailDividerMove}\n @pointerup=${this.onDetailDividerUp}\n @pointercancel=${this.onDetailDividerUp}\n ></div>\n `\n : nothing\n }\n ${this.renderDetailPanel()}\n </div>\n </div>\n `;\n }\n\n private renderConversation() {\n if (this._loadingMessages) {\n return html`\n <div class=\"cpk-td__status\">Loading messages…</div>\n `;\n }\n if (this._messagesError) {\n return html`<div class=\"cpk-td__status cpk-td__status--error\">\n ${this._messagesError}\n </div>`;\n }\n if (this._conversation.length === 0) {\n return html`\n <div class=\"cpk-td__empty-state\">\n <svg\n width=\"28\"\n height=\"28\"\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 >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n <span>No messages yet</span>\n </div>\n `;\n }\n // Expand state is part of the cache key because clicking a tool-call\n // header or the \"Show more\" button on a long message replaces\n // `_expandedTools` / `_expandedMessages` without touching\n // `_conversation` — without those keys the cache returns the\n // pre-toggle template and the disclosure appears broken.\n return this.cachedPanelTpl(\n \"conversation\",\n [this._conversation, this._expandedTools, this._expandedMessages],\n () => {\n const items = this.renderItems;\n return html`${items.map((item) => this.renderRenderItem(item))}`;\n },\n );\n }\n\n /**\n * Memoize the rendered TemplateResult for `slot` keyed by tuple\n * element-wise reference equality. The hot path for tab switches: when\n * the underlying data hasn't changed, return the previously built\n * TemplateResult so Lit's diff short-circuits. Each panel's `key` is\n * the tuple of inputs the template reads — pass everything the template\n * depends on, or the cache will return stale output when those inputs\n * change without the listed key flipping.\n */\n private cachedPanelTpl(\n slot: ThreadDetailsTab,\n key: readonly unknown[],\n build: () => TemplateResult,\n ): TemplateResult {\n const cached = this._panelTplCache.get(slot);\n if (\n cached &&\n cached.key.length === key.length &&\n cached.key.every((v, i) => v === key[i])\n ) {\n return cached.tpl;\n }\n const tpl = build();\n this._panelTplCache.set(slot, { key, tpl });\n return tpl;\n }\n\n private renderRenderItem(item: RenderItem) {\n switch (item.type) {\n case \"user\":\n case \"assistant\":\n return this.renderBubble(item);\n case \"tool_call\":\n return this.renderToolBlock(item);\n case \"tool_call_group\":\n return this.renderToolGroup(item);\n case \"reasoning\":\n return html`<div class=\"cpk-td__inline-chip\">\n <span>Reasoned for ${item.duration}</span>\n </div>`;\n case \"state_update\":\n return html`\n <div class=\"cpk-td__inline-chip\">\n <span>Updated agent state</span>\n </div>\n `;\n case \"generative-ui\":\n return this.renderGenerativeUI(item);\n case \"agent_responded\":\n return nothing;\n }\n }\n\n private renderBubble(item: ConversationUser | ConversationAssistant) {\n const isUser = item.type === \"user\";\n const threshold = ɵCpkThreadDetails.COLLAPSE_THRESHOLD;\n const expanded = this._expandedMessages.has(item.id);\n const tooLong = item.content.length > threshold;\n const shown =\n tooLong && !expanded\n ? item.content.slice(0, threshold) + \"…\"\n : item.content;\n return html`\n <div\n class=\"cpk-td__bubble ${\n isUser ? \"cpk-td__bubble--user\" : \"cpk-td__bubble--assistant\"\n }\"\n >\n <div\n class=\"cpk-td__bubble-inner ${\n isUser\n ? \"cpk-td__bubble-inner--user\"\n : \"cpk-td__bubble-inner--assistant\"\n }\"\n >\n ${shown}\n ${\n tooLong\n ? html`<span\n class=\"cpk-td__show-more\"\n @click=${() => this.toggleMessageExpand(item.id)}\n >${expanded ? \"Show less\" : \"Show more\"}</span\n >`\n : nothing\n }\n </div>\n </div>\n `;\n }\n\n private renderToolBlock(item: ConversationToolCall) {\n const expanded = this._expandedTools.has(item.id);\n return html`\n <div class=\"cpk-td__tool-block\">\n <div\n class=\"cpk-td__tool-header\"\n @click=${() => this.toggleToolExpand(item.id)}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path\n d=\"M1 9C1 9 2 7 5 7C8 7 9 9 9 9M5 1C5 1 7 2.5 7 4.5C7 6.5 5 7 5 7C5 7 3 6.5 3 4.5C3 2.5 5 1 5 1Z\"\n stroke=\"#189370\"\n stroke-width=\"1.2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span class=\"cpk-td__tool-name\">${item.toolName}</span>\n ${\n item.result || Object.keys(item.arguments).length > 0\n ? html`\n <span class=\"cpk-td__tool-status\">DONE</span>\n `\n : html`\n <span class=\"cpk-td__tool-status cpk-td__tool-status--pending\">PENDING</span>\n `\n }\n <span class=\"cpk-td__tool-chevron\">${expanded ? \"▾\" : \"▸\"}</span>\n </div>\n ${\n expanded\n ? html`\n <div class=\"cpk-td__tool-body\">\n <div class=\"cpk-td__tool-section-label\">Arguments</div>\n <pre class=\"cpk-td__tool-pre\">\n${unsafeHTML(highlightedJson(item.arguments))}</pre\n >\n ${\n item.result\n ? html`\n <div\n class=\"cpk-td__tool-section-label\"\n style=\"margin-top:8px\"\n >\n Result\n </div>\n <pre class=\"cpk-td__tool-pre\">\n${unsafeHTML(highlightedJson(item.result))}</pre\n >\n `\n : nothing\n }\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n\n private renderToolGroup(group: ToolCallGroup) {\n return html`\n <div class=\"cpk-td__tool-group\">\n <div class=\"cpk-td__tool-group-header\">\n ${group.items.length} tool call${group.items.length !== 1 ? \"s\" : \"\"}\n </div>\n ${group.items.map((tc) => this.renderToolBlock(tc))}\n </div>\n `;\n }\n\n private renderGenerativeUI(item: ConversationGenerativeUIItem) {\n return html`\n <div class=\"cpk-td__genui\">\n <div class=\"cpk-td__genui-badge\">\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n Generative UI\n </div>\n <div class=\"cpk-td__genui-placeholder\">\n ${item.activityType} — rendered in chat\n </div>\n </div>\n `;\n }\n\n private renderState() {\n if (this._loadingState) {\n return html`\n <div class=\"cpk-td__status\">Loading state…</div>\n `;\n }\n if (this._stateError) {\n return html`<div class=\"cpk-td__status cpk-td__status--error\">\n ${this._stateError}\n </div>`;\n }\n if (this._stateNotAvailable) {\n return html`\n <div class=\"cpk-td__empty-state\">\n <svg\n width=\"28\"\n height=\"28\"\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 >\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n </svg>\n <span>State history not available</span>\n <span class=\"cpk-td__empty-hint\"\n >This runtime doesn't yet expose per-thread agent state. Available when\n running against the in-memory runner.</span\n >\n </div>\n `;\n }\n if (!this.hasRenderableState()) {\n return html`\n <div class=\"cpk-td__empty-state\">\n <svg\n width=\"28\"\n height=\"28\"\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 >\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n </svg>\n <span>No state captured</span>\n <span class=\"cpk-td__empty-hint\"\n >Emitted live from STATE_SNAPSHOT events.</span\n >\n </div>\n `;\n }\n const stateValue = this.activeState;\n return this.cachedPanelTpl(\"agent-state\", [stateValue], () => {\n return html`<pre class=\"cpk-td__json-block\">\n${unsafeHTML(highlightedJson(stateValue))}</pre\n >`;\n });\n }\n\n private renderEvents() {\n if (this._loadingEvents) {\n return html`\n <div class=\"cpk-td__status\">Loading events…</div>\n `;\n }\n if (this._eventsError) {\n return html`<div class=\"cpk-td__status cpk-td__status--error\">\n ${this._eventsError}\n </div>`;\n }\n if (this._eventsNotAvailable) {\n return html`\n <div class=\"cpk-td__empty-state\">\n <span>Event history not available</span>\n <span class=\"cpk-td__empty-hint\"\n >This runtime doesn't yet expose per-thread AG-UI events. Available when\n running against the in-memory runner.</span\n >\n </div>\n `;\n }\n const events = this.activeEvents;\n if (events.length === 0) {\n return html`\n <div class=\"cpk-td__empty-state\">\n <span>No events captured</span>\n <span class=\"cpk-td__empty-hint\"\n >Events are recorded live. Run the agent to see them here.</span\n >\n </div>\n `;\n }\n return this.cachedPanelTpl(\"ag-ui-events\", [events], () => {\n return html`${events.map((event) => {\n const { bg, fg } = eventColors(event.type);\n return html`\n <div class=\"cpk-td__event\">\n <div class=\"cpk-td__event-header\" style=\"background:${bg}\">\n <span class=\"cpk-td__event-type\" style=\"color:${fg}\"\n >${event.type}</span\n >\n <span class=\"cpk-td__event-time\"\n >${formatTimestamp(event.timestamp)}</span\n >\n </div>\n <pre class=\"cpk-td__event-payload\">\n${unsafeHTML(highlightedJson(event.payload))}</pre\n >\n </div>\n `;\n })}`;\n });\n }\n\n private renderPanelToggle() {\n return html`\n <button\n class=\"cpk-td__panel-toggle ${\n this._showDetailPanel ? \"cpk-td__panel-toggle--active\" : \"\"\n }\"\n @click=${() => {\n this._showDetailPanel = !this._showDetailPanel;\n }}\n title=\"Toggle thread details\"\n type=\"button\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n </svg>\n </button>\n `;\n }\n\n private renderDetailPanel() {\n const counts = this.activityCounts;\n return html`\n <!-- Thread -->\n <div class=\"cpk-tdp__section-title\">Thread</div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">ID</span>\n <span class=\"cpk-tdp__value cpk-tdp__value--wrap\"\n >${this.shortId(this.thread?.id)}</span\n >\n </div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Name</span>\n <span class=\"cpk-tdp__value\">${this.thread?.name ?? \"—\"}</span>\n </div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Agent</span>\n <span class=\"cpk-tdp__value cpk-tdp__value--truncate\"\n >${this.thread?.agentId ?? \"—\"}</span\n >\n </div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Created by</span>\n <span class=\"cpk-tdp__value cpk-tdp__value--truncate\"\n >${this.thread?.createdById ?? \"—\"}</span\n >\n </div>\n\n <div class=\"cpk-tdp__divider\"></div>\n\n <!-- Timestamps -->\n <div class=\"cpk-tdp__section-title\">Timestamps</div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Created</span>\n <span class=\"cpk-tdp__value\">${this.fmtTime(this.thread?.createdAt)}</span>\n </div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Updated</span>\n <span class=\"cpk-tdp__value\">${this.fmtTime(this.thread?.updatedAt)}</span>\n </div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Duration</span>\n <span class=\"cpk-tdp__value\">${this.duration}</span>\n </div>\n\n <div class=\"cpk-tdp__divider\"></div>\n\n <!-- Activity -->\n <div class=\"cpk-tdp__section-title\">Activity</div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Messages</span>\n <span class=\"cpk-tdp__value\">${counts.messages}</span>\n </div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">Tool calls</span>\n <span class=\"cpk-tdp__value\">${counts.toolCalls}</span>\n </div>\n <div class=\"cpk-tdp__row\">\n <span class=\"cpk-tdp__label\">AG-UI events</span>\n <span class=\"cpk-tdp__value\">${this.activeEvents.length}</span>\n </div>\n `;\n }\n}\n\nif (!customElements.get(\"cpk-thread-list\")) {\n customElements.define(\"cpk-thread-list\", CpkThreadList);\n}\nif (!customElements.get(\"cpk-thread-details\")) {\n customElements.define(\"cpk-thread-details\", ɵCpkThreadDetails);\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 // Tracks which thread each agent is currently running on. Populated from the\n // agent instance handed to `onAgentRunStarted` so that, when that agent\n // subsequently emits message changes, we can bump the per-thread live\n // version (below) only for the thread the messages actually belong to.\n private agentRunThreadId: Map<string, string> = new Map();\n // Per-thread monotonic version that ticks every time an agent currently\n // running on that thread emits a message change. `cpk-thread-details`\n // watches this prop and re-fetches `/threads/:id/messages` when it changes,\n // which is how live updates flow into the conversation view without\n // duplicating the runtime's message-shape conversion in the inspector.\n private liveMessageVersion: Map<string, number> = 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 selectedThreadId: string | null = null;\n private threadListWidth = 290;\n private threadDividerResizing = false;\n private threadDividerPointerId = -1;\n private threadDividerStartX = 0;\n private threadDividerStartWidth = 0;\n private _threads: ɵThread[] = [];\n private _threadStoreSubscriptions: Map<string, () => void> = new Map();\n private _threadsByAgent: Map<string, ɵThread[]> = new Map();\n // Error from each agent's thread store (REST list rejection, Phoenix\n // subscribe failure, retry exhaustion). When non-empty for the active\n // selection, the threads view renders an error state instead of stale\n // data with no indication.\n private _threadsErrorByAgent: Map<string, Error> = new Map();\n // Thread stores created and owned by the inspector (keyed by agentId)\n private _ownedThreadStores: Map<string, ɵThreadStore> = new Map();\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 // Column widths for the AG-UI events table (agent, time, event-type; last col is auto)\n private evtColWidths = [100, 80, 150];\n private _evtColResize: {\n col: number;\n startX: number;\n startW: number;\n } | null = null;\n\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 announcementPromise: Promise<void> | null = null;\n private showAnnouncementPreview = true;\n private announcementExpanded = false;\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 customTabIcons: Record<string, string> = {\n threads: `<svg class=\"h-3.5 w-3.5\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.04167 15C8.29167 15 7.65972 14.7431 7.14583 14.2292C6.63194 13.7153 6.375 13.0972 6.375 12.375C6.375 11.3194 6.80208 10.3646 7.65625 9.51042C8.51042 8.65625 9.57639 8.125 10.8542 7.91667C10.8125 7.41667 10.6875 7.03819 10.4792 6.78125C10.2708 6.52431 9.98611 6.39583 9.625 6.39583C9.20833 6.39583 8.75694 6.56944 8.27083 6.91667C7.78472 7.26389 7.20833 7.83333 6.54167 8.625C5.45833 9.91667 4.66319 10.7569 4.15625 11.1458C3.64931 11.5347 3.10417 11.7292 2.52083 11.7292C1.8125 11.7292 1.21528 11.4653 0.729167 10.9375C0.243056 10.4097 0 9.77083 0 9.02083C0 8.27083 0.163194 7.50347 0.489583 6.71875C0.815972 5.93403 1.36806 4.99306 2.14583 3.89583C2.40972 3.53472 2.60417 3.22917 2.72917 2.97917C2.85417 2.72917 2.91667 2.52778 2.91667 2.375C2.91667 2.27778 2.89931 2.20486 2.86458 2.15625C2.82986 2.10764 2.77778 2.08333 2.70833 2.08333C2.56944 2.08333 2.39583 2.17014 2.1875 2.34375C1.97917 2.51736 1.73611 2.78472 1.45833 3.14583L0 1.66667C0.444444 1.125 0.895833 0.711806 1.35417 0.427083C1.8125 0.142361 2.26389 0 2.70833 0C3.34722 0 3.88889 0.222222 4.33333 0.666667C4.77778 1.11111 5 1.66667 5 2.33333C5 2.73611 4.89583 3.18056 4.6875 3.66667C4.47917 4.15278 4.13194 4.73611 3.64583 5.41667C3.11806 6.16667 2.72569 6.82639 2.46875 7.39583C2.21181 7.96528 2.08333 8.46528 2.08333 8.89583C2.08333 9.13194 2.12153 9.31597 2.19792 9.44792C2.27431 9.57986 2.38194 9.64583 2.52083 9.64583C2.65972 9.64583 2.78125 9.60764 2.88542 9.53125C2.98958 9.45486 3.18056 9.27083 3.45833 8.97917C3.63889 8.78472 3.85417 8.54514 4.10417 8.26042C4.35417 7.97569 4.65972 7.625 5.02083 7.20833C5.89583 6.16667 6.6875 5.42361 7.39583 4.97917C8.10417 4.53472 8.84722 4.3125 9.625 4.3125C10.5556 4.3125 11.3194 4.625 11.9167 5.25C12.5139 5.875 12.8542 6.72917 12.9375 7.8125H15V9.89583H12.9375C12.8264 11.4514 12.4201 12.691 11.7188 13.6146C11.0174 14.5382 10.125 15 9.04167 15ZM9.08333 12.9167C9.52778 12.9167 9.90278 12.6632 10.2083 12.1562C10.5139 11.6493 10.7222 10.9444 10.8333 10.0417C10.1944 10.1944 9.63889 10.4965 9.16667 10.9479C8.69444 11.3993 8.45833 11.8472 8.45833 12.2917C8.45833 12.4861 8.51389 12.6389 8.625 12.75C8.73611 12.8611 8.88889 12.9167 9.08333 12.9167Z\" fill=\"currentColor\"/></svg>`,\n };\n\n private get menuItems(): MenuItem[] {\n const hasFrontendTools = (this._core?.tools?.length ?? 0) > 0;\n return [\n {\n key: \"ag-ui-events\",\n label: \"AG-UI Events\",\n icon: \"Zap\" as LucideIconName,\n },\n { key: \"agents\", label: \"Agent\", icon: \"Bot\" as LucideIconName },\n ...(hasFrontendTools\n ? [\n {\n key: \"frontend-tools\" as const,\n label: \"Frontend Tools\",\n icon: \"Hammer\" as LucideIconName,\n },\n ]\n : []),\n {\n key: \"agent-context\",\n label: \"Context\",\n icon: \"FileText\" as LucideIconName,\n },\n {\n key: \"threads\",\n label: \"Threads\",\n icon: \"MessageSquare\" as LucideIconName,\n },\n ];\n }\n\n private subscribeToThreadStore(agentId: string, store: ɵThreadStore): void {\n if (this._threadStoreSubscriptions.has(agentId)) return;\n const threadsSub = store.select(ɵselectThreads).subscribe((threads) => {\n this._threadsByAgent.set(agentId, threads as ɵThread[]);\n this._threads = Array.from(this._threadsByAgent.values()).flat();\n this.autoSelectLatestThread();\n this.requestUpdate();\n });\n const errorSub = store.select(ɵselectThreadsError).subscribe((error) => {\n if (error) {\n this._threadsErrorByAgent.set(agentId, error);\n } else {\n this._threadsErrorByAgent.delete(agentId);\n }\n this.requestUpdate();\n });\n this._threadStoreSubscriptions.set(agentId, () => {\n threadsSub.unsubscribe();\n errorSub.unsubscribe();\n });\n // Populate immediately from current state\n const initialState = store.getState();\n this._threadsByAgent.set(agentId, ɵselectThreads(initialState));\n const initialError = ɵselectThreadsError(initialState);\n if (initialError) {\n this._threadsErrorByAgent.set(agentId, initialError);\n } else {\n this._threadsErrorByAgent.delete(agentId);\n }\n this._threads = Array.from(this._threadsByAgent.values()).flat();\n this.autoSelectLatestThread();\n }\n\n private autoSelectLatestThread(): void {\n if (this._threads.length === 0) return;\n const stillValid =\n this.selectedThreadId != null &&\n this._threads.some((t) => t.id === this.selectedThreadId);\n if (!stillValid) {\n // Threads are sorted most-recently-updated first\n this.selectedThreadId = this._threads[0]!.id;\n }\n }\n\n private teardownThreadStoreSubscriptions(): void {\n for (const unsub of this._threadStoreSubscriptions.values()) {\n unsub();\n }\n this._threadStoreSubscriptions.clear();\n this._threadsByAgent.clear();\n this._threadsErrorByAgent.clear();\n this._threads = [];\n }\n\n private ensureOwnedThreadStore(agentId: string): void {\n if (this._ownedThreadStores.has(agentId)) return;\n // Don't overwrite a store already registered by useThreads() or another external caller\n if (this.core?.getThreadStore(agentId)) return;\n const core = this.core;\n if (!core?.runtimeUrl) return;\n\n const store = ɵcreateThreadStore({ fetch: globalThis.fetch });\n store.start();\n store.setContext({\n runtimeUrl: core.runtimeUrl,\n headers: {},\n agentId,\n });\n this._ownedThreadStores.set(agentId, store);\n // Subscribe directly so threads render even before the registry callback\n // fires (some published-core code paths land on the subscriber after\n // registerThreadStore returns).\n this.subscribeToThreadStore(agentId, store);\n core.registerThreadStore(agentId, store);\n }\n\n private refreshOwnedThreadStore(agentId: string): void {\n const store = this._ownedThreadStores.get(agentId);\n if (!store) return;\n // refresh() re-fetches without resetting threads to [] first, so the list\n // stays visible while new data loads and survives transient fetch failures.\n store.refresh();\n }\n\n private removeOwnedThreadStore(agentId: string): void {\n const store = this._ownedThreadStores.get(agentId);\n if (!store) return;\n store.stop();\n this.core?.unregisterThreadStore(agentId);\n this._ownedThreadStores.delete(agentId);\n }\n\n private teardownOwnedThreadStores(): void {\n for (const [agentId, store] of this._ownedThreadStores) {\n store.stop();\n this.core?.unregisterThreadStore(agentId);\n }\n this._ownedThreadStores.clear();\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 if (status === \"connected\") {\n for (const agentId of this._ownedThreadStores.keys()) {\n this.refreshOwnedThreadStore(agentId);\n }\n } else {\n // Clear stale thread data immediately when the server goes away\n this._threadsByAgent.clear();\n this._threads = [];\n }\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 onThreadStoreRegistered: ({ agentId, store }) => {\n this.subscribeToThreadStore(agentId, store);\n this.requestUpdate();\n },\n onThreadStoreUnregistered: ({ agentId }) => {\n const unsub = this._threadStoreSubscriptions.get(agentId);\n if (unsub) {\n unsub();\n this._threadStoreSubscriptions.delete(agentId);\n }\n this._threadsByAgent.delete(agentId);\n this._threadsErrorByAgent.delete(agentId);\n this._threads = Array.from(this._threadsByAgent.values()).flat();\n this.requestUpdate();\n },\n onAgentRunStarted: ({ agent }) => {\n // Subscribe to the concrete agent instance about to run. This handles\n // per-thread clones that are not in core.agents and therefore not\n // reachable via onAgentsChanged. Replacing an existing subscription for\n // the same agentId is safe: the previous instance emits no more events\n // once a new run starts on a fresh clone.\n this.subscribeToAgent(agent);\n const runThreadId = (agent as { threadId?: string }).threadId;\n if (agent.agentId && runThreadId) {\n this.agentRunThreadId.set(agent.agentId, runThreadId);\n }\n this.requestUpdate();\n },\n } satisfies CopilotKitCoreSubscriber;\n\n this.coreUnsubscribe = core.subscribe(this.coreSubscriber).unsubscribe;\n this.processAgentsChanged(core.agents);\n\n // Subscribe to any already-registered thread stores. `getThreadStores` was\n // added in the same release as this inspector; guard so consumers still on\n // an older @copilotkit/core don't throw when assigning `inspector.core`.\n const threadStores =\n typeof core.getThreadStores === \"function\" ? core.getThreadStores() : {};\n for (const [agentId, store] of Object.entries(threadStores)) {\n this.subscribeToThreadStore(agentId, store);\n }\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 this.teardownThreadStoreSubscriptions();\n this.teardownOwnedThreadStores();\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 this.ensureOwnedThreadStore(agent.agentId);\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 // Do NOT remove owned thread stores here — they are independent of\n // whether the agent appears in core.agents (published cores discover\n // agents asynchronously so agents may be empty on first fire). Stores\n // are torn down in teardownOwnedThreadStores() when the core detaches.\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 this.refreshOwnedThreadStore(agentId);\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 onStateChanged: () => {\n this.syncAgentState(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 onActivitySnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"ACTIVITY_SNAPSHOT\", event);\n this.syncAgentMessages(agent);\n },\n onActivityDeltaEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"ACTIVITY_DELTA\", event);\n this.syncAgentMessages(agent);\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 mapMessagesToConversation(\n messages: InspectorMessage[] | null,\n ): { id: string; type: string; content: string; createdAt: string }[] | null {\n if (!messages) return null;\n return messages\n .filter(\n (m) =>\n m.role === \"user\" || m.role === \"assistant\" || m.role === \"activity\",\n )\n .map((m, i) => ({\n id: m.id ?? `msg-${i}`,\n type:\n m.role === \"user\"\n ? \"user\"\n : m.role === \"activity\"\n ? \"generative-ui\"\n : \"assistant\",\n // For activity messages, store the activityType as a label so the\n // renderer has something meaningful to display.\n // TODO: render activity payload once available.\n content:\n m.role === \"activity\" ? (m.activityType ?? \"unknown\") : m.contentText,\n createdAt: \"\",\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 try {\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 // Bump the live-message version for whichever thread this agent is\n // currently running on. cpk-thread-details watches this for the\n // selected thread and re-fetches `/threads/:id/messages` when it ticks,\n // so the conversation view stays in sync with the streaming agent\n // without the parent re-implementing AG-UI → ConversationItem mapping.\n const runThreadId = this.agentRunThreadId.get(agent.agentId);\n if (runThreadId) {\n this.liveMessageVersion.set(\n runThreadId,\n (this.liveMessageVersion.get(runThreadId) ?? 0) + 1,\n );\n }\n\n this.requestUpdate();\n } catch (error) {\n console.error(\n `[CopilotKit Inspector] Failed to sync messages for agent \"${agent.agentId}\":`,\n error,\n );\n }\n }\n\n private syncAgentState(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n try {\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 } catch (error) {\n console.error(\n `[CopilotKit Inspector] Failed to sync state for agent \"${agent.agentId}\":`,\n error,\n );\n }\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 // Only restore a specific-agent selection when there is exactly one\n // agent registered. With multiple agents, fall back to \"all-agents\" so\n // events from any agent are visible regardless of what was persisted.\n const shouldRestore =\n isPendingAvailable &&\n (pendingContext === \"all-agents\" || agentIds.size === 1);\n if (shouldRestore) {\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 // Persisted selection is unavailable or inappropriate for multiple\n // agents — reset to \"all-agents\" so nothing is silently filtered.\n if (this.selectedContext !== \"all-agents\") {\n this.selectedContext = \"all-agents\";\n this.expandedRows.clear();\n }\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 // When there is exactly one agent, auto-select it so the view is\n // immediately focused. When multiple agents are registered (e.g. \"default\"\n // + \"openai\"), keep \"all-agents\" so events from any agent are visible.\n let nextSelected: string = \"all-agents\";\n\n if (agentIds.size === 1) {\n nextSelected = Array.from(agentIds)[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 font-family: \"Plus Jakarta Sans\", system-ui, sans-serif;\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(1, 5, 7, 0.95);\n color: white;\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 10px;\n font-family: \"Plus Jakarta Sans\", system-ui, sans-serif;\n line-height: 1.2;\n box-shadow: 0 4px 10px rgba(1, 5, 7, 0.18);\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: #010507;\n font-size: 13px;\n font-family: \"Plus Jakarta Sans\", system-ui, sans-serif;\n line-height: 1.4;\n border-radius: 12px;\n box-shadow: 0 12px 28px rgba(1, 5, 7, 0.12);\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(219, 219, 229, 0.4);\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(219, 219, 229, 0.4);\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(1, 5, 7, 0.08);\n }\n\n .announcement-preview[data-side=\"right\"] .announcement-preview__arrow {\n left: -5px;\n box-shadow: -6px 6px 10px rgba(1, 5, 7, 0.08);\n }\n\n .announcement-dismiss {\n background: none;\n border: none;\n cursor: pointer;\n color: #838389;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n padding: 0;\n transition:\n background 120ms ease,\n color 120ms ease;\n }\n\n .announcement-dismiss:hover {\n background: rgba(0, 0, 0, 0.06);\n color: #010507;\n }\n\n /* ── Agent tab section cards ─────────────────────────────────────── */\n .cpk-section-card {\n border-radius: 8px;\n background: #ffffff;\n overflow: hidden;\n }\n\n /* ── Agent icon bubble ───────────────────────────────────────────── */\n .cpk-agent-icon {\n background-color: #f0f0f4 !important;\n color: #57575b !important;\n }\n\n /* ── Agent stat cards ────────────────────────────────────────────── */\n .cpk-stat-card {\n background-color: #ffffff !important;\n border: 1px solid #dbdbe5 !important;\n }\n button.cpk-stat-card:hover {\n background-color: #f7f7f9 !important;\n }\n\n /* ── Circle chevron (Frontend Tools + Context) ──────────────────── */\n .cpk-chevron-circle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background-color: #f0f0f4;\n color: #838389;\n flex-shrink: 0;\n transition: transform 0.2s;\n }\n .cpk-chevron-circle svg {\n width: 14px !important;\n height: 14px !important;\n }\n .cpk-chevron-circle--open {\n transform: rotate(180deg);\n }\n\n /* ── Inline copy button ─────────────────────────────────────────── */\n .cpk-copy-btn {\n font-size: 10px;\n font-weight: 500;\n color: #57575b;\n background: #ffffff;\n border: 1px solid #dbdbe5;\n cursor: pointer;\n padding: 2px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n transition:\n background-color 0.15s,\n border-color 0.15s;\n }\n .cpk-copy-btn:hover {\n background-color: #f0f0f4;\n border-color: #afafb7;\n }\n\n .cpk-section-header {\n background: #e8edf5;\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\n padding: 10px 16px;\n }\n .cpk-section-header h4 {\n font-size: 11px;\n font-weight: 600;\n color: #181c1f;\n margin: 0;\n }\n\n /* Inputs/selects inside the lavender header need an explicit white bg */\n .cpk-section-header input,\n .cpk-section-header select {\n background-color: #ffffff !important;\n box-shadow: none !important;\n }\n .cpk-section-header select {\n padding-right: 24px !important;\n }\n /* Events table column headers */\n table thead th {\n font-weight: 600 !important;\n }\n\n .announcement-content {\n color: #1f2230;\n font-size: 13px;\n font-family: \"Plus Jakarta Sans\", system-ui, sans-serif;\n line-height: 1.55;\n }\n\n .announcement-content h1,\n .announcement-content h2,\n .announcement-content h3 {\n color: #010507;\n font-weight: 700;\n line-height: 1.3;\n margin: 0.9rem 0 0.4rem;\n }\n .announcement-content > h1:first-child,\n .announcement-content > h2:first-child,\n .announcement-content > h3:first-child {\n margin-top: 0;\n }\n\n .announcement-content h1 {\n font-size: 1.15rem;\n letter-spacing: -0.01em;\n }\n .announcement-content h2 {\n font-size: 1rem;\n }\n .announcement-content h3 {\n font-size: 0.9rem;\n text-transform: none;\n }\n\n .announcement-content p {\n margin: 0.45rem 0;\n }\n\n .announcement-content strong {\n color: #010507;\n font-weight: 700;\n }\n\n .announcement-content ul {\n list-style: disc;\n padding-left: 1.25rem;\n margin: 0.45rem 0;\n }\n\n .announcement-content ol {\n list-style: decimal;\n padding-left: 1.25rem;\n margin: 0.45rem 0;\n }\n\n .announcement-content li + li {\n margin-top: 0.15rem;\n }\n\n .announcement-content a {\n color: #757cf2;\n text-decoration: underline;\n }\n\n .announcement-content :not(pre) > code {\n background: #f3f3f7;\n border: 1px solid #e4e4ec;\n border-radius: 4px;\n padding: 1px 5px;\n font-size: 0.85em;\n color: #4a3a8a;\n }\n\n .announcement-code {\n position: relative;\n margin: 0.6rem 0;\n }\n\n .announcement-code pre {\n background: #0f1117;\n color: #e6e8f2;\n border-radius: 8px;\n padding: 10px 12px;\n overflow-x: auto;\n font-size: 12px;\n line-height: 1.5;\n white-space: pre;\n }\n\n .announcement-code pre code::after {\n content: \"\";\n display: inline-block;\n width: 80px;\n }\n\n .announcement-code__copy-shield {\n position: absolute;\n top: 4px;\n right: 4px;\n padding: 4px 4px 4px 24px;\n border-top-right-radius: 8px;\n background: linear-gradient(\n to right,\n rgba(15, 17, 23, 0) 0%,\n rgba(15, 17, 23, 0.95) 40%,\n #0f1117 100%\n );\n pointer-events: none;\n }\n\n .announcement-code pre code {\n background: transparent;\n border: none;\n padding: 0;\n color: inherit;\n font-size: inherit;\n }\n\n .announcement-code pre::-webkit-scrollbar {\n height: 6px;\n }\n .announcement-code pre::-webkit-scrollbar-track {\n background: transparent;\n }\n .announcement-code pre::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.2);\n border-radius: 3px;\n }\n\n .announcement-code__copy {\n position: relative;\n pointer-events: auto;\n padding: 3px 8px;\n font-family: \"Plus Jakarta Sans\", system-ui, sans-serif;\n font-size: 11px;\n font-weight: 600;\n color: #e6e8f2;\n background: #1f222d;\n border: 1px solid rgba(255, 255, 255, 0.15);\n border-radius: 5px;\n cursor: pointer;\n transition:\n background 0.12s ease,\n color 0.12s ease;\n }\n .announcement-code__copy:hover {\n background: #2a2e3c;\n }\n .announcement-code__copy[data-copied=\"true\"] {\n background: #eee6fe;\n color: #6430ab;\n border-color: transparent;\n }\n\n .announcement-body {\n position: relative;\n overflow: hidden;\n transition: max-height 0.25s ease;\n }\n .announcement-body--collapsed {\n max-height: 72px;\n }\n .announcement-body--expanded {\n max-height: 2000px;\n }\n .announcement-fade {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 48px;\n background: linear-gradient(to bottom, transparent, #ffffff);\n pointer-events: none;\n }\n .announcement-toggle {\n display: block;\n width: 100%;\n margin-top: 6px;\n padding: 0;\n background: none;\n border: none;\n font-family: \"Plus Jakarta Sans\", system-ui, sans-serif;\n font-size: 12px;\n font-weight: 500;\n color: #757cf2;\n cursor: pointer;\n text-align: center;\n }\n .announcement-toggle:hover {\n color: #6430ab;\n }\n\n /* ── Brand typography ────────────────────────────────────────── */\n /* Override Tailwind font-mono stack → Spline Sans Mono */\n .font-mono,\n pre,\n code {\n font-family: \"Spline Sans Mono\", ui-monospace, \"Cascadia Code\", monospace;\n }\n\n /* ── Floating button ─────────────────────────────────────────── */\n .console-button {\n background-color: rgba(1, 5, 7, 0.95) !important;\n border-color: rgba(190, 194, 255, 0.25) !important;\n box-shadow:\n 0 0 0 1px rgba(190, 194, 255, 0.15),\n 0 4px 14px rgba(1, 5, 7, 0.28) !important;\n }\n .console-button:hover {\n background-color: rgba(1, 5, 7, 1) !important;\n border-color: rgba(190, 194, 255, 0.45) !important;\n }\n .console-button:focus-visible {\n outline-color: #bec2ff !important;\n }\n\n /* ── Inspector window ────────────────────────────────────────── */\n .inspector-window {\n border-color: #dbdbe5 !important;\n box-shadow:\n 0 8px 32px rgba(1, 5, 7, 0.1),\n 0 2px 8px rgba(1, 5, 7, 0.06) !important;\n }\n\n /* ── Header drag area ────────────────────────────────────────── */\n .drag-handle {\n border-bottom-color: #dbdbe5 !important;\n /* Subtle pale lavender gradient — brand \"light, spacious\" surface */\n background: linear-gradient(180deg, #f4f4fd 0%, #ffffff 100%) !important;\n }\n\n /* Tab strip row: soft off-white, separated from content */\n .drag-handle > div:last-child {\n border-top-color: #e2e2ea !important;\n background-color: #fafafc !important;\n }\n\n /* ── Tab buttons ─────────────────────────────────────────────── */\n /*\n * Named classes owned by this component — no Tailwind conflict.\n * Active: brand surface/surfaceContainerActive (lilac tint) +\n * border/borderActionEnabled underline.\n * Dark fill is for primary action buttons only, not nav tabs.\n */\n .cpk-tab-active {\n background-color: rgba(190, 194, 255, 0.18);\n color: #010507;\n font-weight: 600;\n }\n .cpk-tab-active .cpk-tab-icon {\n color: #757cf2;\n }\n .cpk-tab-inactive {\n background-color: transparent;\n color: #2b2b2b;\n }\n .cpk-tab-inactive .cpk-tab-icon {\n color: #838389;\n }\n .cpk-tab-inactive:hover {\n background-color: rgba(190, 194, 255, 0.08);\n color: #010507;\n cursor: pointer;\n }\n .cpk-tab-active {\n cursor: pointer;\n }\n\n /* ── Header control buttons (dock, close) — first row only ───── */\n .drag-handle > div:first-child button {\n color: #838389 !important;\n }\n .drag-handle > div:first-child button:hover {\n background-color: #f0f0f4 !important;\n color: #57575b !important;\n }\n .drag-handle > div:first-child button:focus-visible {\n outline-color: #bec2ff !important;\n }\n\n /* ── Agent/context dropdown ──────────────────────────────────── */\n [data-context-dropdown-root=\"true\"] > button {\n border-color: #dbdbe5 !important;\n color: #010507 !important;\n }\n [data-context-dropdown-root=\"true\"] > button:hover {\n border-color: #bec2ff !important;\n background-color: #f7f7f9 !important;\n }\n [data-context-dropdown-root=\"true\"] > button > span:last-child {\n color: #838389 !important;\n }\n [data-context-dropdown-root=\"true\"] > div {\n border-color: #dbdbe5 !important;\n box-shadow: 0 4px 12px rgba(1, 5, 7, 0.08) !important;\n }\n [data-context-dropdown-root=\"true\"] > div button:hover,\n [data-context-dropdown-root=\"true\"] > div button:focus {\n background-color: #f7f7f9 !important;\n }\n\n /* ── Status bar (bottom chrome) ──────────────────────────────── */\n .inspector-window > div > div:last-child {\n border-top-color: #dbdbe5 !important;\n background-color: #f7f7f9 !important;\n }\n\n /* ── Resize handle ───────────────────────────────────────────── */\n .resize-handle {\n color: #838389 !important;\n }\n .resize-handle:hover {\n color: #57575b !important;\n }\n\n /* ── AG-UI Events tab ────────────────────────────────────────── */\n /* Row hover: replace blue tint with brand lilac */\n tr:hover td {\n background-color: rgba(190, 194, 255, 0.08) !important;\n }\n /* Reset/dark action button */\n button[class*=\"bg-gray-900\"] {\n background-color: #010507 !important;\n }\n button[class*=\"bg-gray-800\"] {\n background-color: #2b2b2b !important;\n }\n /* Copy \"copied\" state: generic green → brand mint */\n button[class*=\"bg-green-100\"] {\n background-color: rgba(133, 236, 206, 0.2) !important;\n color: #189370 !important;\n }\n\n /* ── Agents tab ──────────────────────────────────────────────── */\n /* Agent icon bubble: blue → lilac */\n span[class*=\"bg-blue-100\"]:not([class*=\"text-blue-800\"]) {\n background-color: rgba(190, 194, 255, 0.15) !important;\n }\n span[class*=\"text-blue-600\"] {\n color: #757cf2 !important;\n }\n /* Running badge: emerald → mint */\n span[class*=\"bg-emerald-50\"] {\n background-color: rgba(133, 236, 206, 0.15) !important;\n }\n span[class*=\"text-emerald-700\"] {\n color: #189370 !important;\n }\n /* Running status dot */\n span[class*=\"bg-emerald-500\"] {\n background-color: #85ecce !important;\n }\n /* Idle dot */\n span[class*=\"bg-gray-400\"] {\n background-color: #afafb7 !important;\n }\n /* User role badge (blue → lilac) */\n span[class*=\"bg-blue-100\"][class*=\"text-blue-800\"] {\n background-color: rgba(190, 194, 255, 0.22) !important;\n border: 1px solid rgba(190, 194, 255, 0.45) !important;\n color: #57575b !important;\n }\n /* Assistant role badge (green → mint) */\n span[class*=\"bg-green-100\"][class*=\"text-green-800\"] {\n background-color: rgba(133, 236, 206, 0.18) !important;\n border: 1px solid rgba(133, 236, 206, 0.4) !important;\n color: #189370 !important;\n }\n /* Tool role badge (amber → orange brand) */\n span[class*=\"bg-amber-100\"][class*=\"text-amber-800\"] {\n background-color: rgba(255, 172, 77, 0.15) !important;\n color: #57575b !important;\n }\n\n /* ── Frontend Tools tab ──────────────────────────────────────── */\n /* Handler badge (blue → lilac) */\n span[class*=\"bg-blue-50\"][class*=\"text-blue-700\"] {\n background-color: rgba(190, 194, 255, 0.12) !important;\n border-color: rgba(190, 194, 255, 0.3) !important;\n color: #010507 !important;\n }\n /* Renderer badge (purple → lilac-adjacent) */\n span[class*=\"bg-purple-50\"][class*=\"text-purple-700\"] {\n background-color: rgba(190, 194, 255, 0.12) !important;\n border-color: rgba(190, 194, 255, 0.3) !important;\n color: #57575b !important;\n }\n /* Required badge (rose → brand red) */\n span[class*=\"bg-rose-50\"][class*=\"text-rose-700\"] {\n background-color: rgba(250, 95, 103, 0.1) !important;\n border-color: rgba(250, 95, 103, 0.25) !important;\n color: #fa5f67 !important;\n }\n /* Code/default value blocks */\n code[class*=\"bg-gray-100\"],\n span[class*=\"bg-gray-100\"] {\n background-color: #f0f0f4 !important;\n }\n\n /* ── Connected status bar: match threads header mint (#5BE4BB) ──── */\n /* Outer strip bg + top border + text when connected badge is present */\n .inspector-window\n > div\n > div:last-child\n > div:last-child:has(div[class*=\"bg-emerald-50\"]) {\n background-color: rgba(91, 228, 187, 0.08) !important;\n border-top-color: rgba(91, 228, 187, 0.3) !important;\n color: #189370 !important;\n }\n /* Inner badge — slightly more opaque on the mint bg */\n div[class*=\"bg-emerald-50\"][class*=\"border-emerald-200\"] {\n background-color: rgba(91, 228, 187, 0.12) !important;\n border-color: rgba(91, 228, 187, 0.4) !important;\n color: #189370 !important;\n }\n /* Icon bubble inside connected badge → mint tint */\n div[class*=\"bg-emerald-50\"] span[class*=\"bg-white\"] {\n background-color: rgba(91, 228, 187, 0.3) !important;\n }\n\n /* ── Announcement panel ──────────────────────────────────────── */\n div[class*=\"border-slate-200\"][class*=\"bg-white\"] {\n border-color: #dbdbe5 !important;\n }\n /* Announcement icon bubble: black → brand light lavender + lilac icon */\n span[class*=\"bg-slate-900\"],\n div[class*=\"bg-slate-900\"] {\n background-color: #eee6fe !important;\n color: #757cf2 !important;\n }\n span[class*=\"text-slate-800\"],\n div[class*=\"text-slate-800\"] {\n color: #010507 !important;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n if (typeof window !== \"undefined\") {\n this.ensureBrandFonts();\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 private ensureBrandFonts(): void {\n const FONT_LINK_ID = \"cpk-inspector-brand-fonts\";\n if (document.getElementById(FONT_LINK_ID)) return;\n const link = document.createElement(\"link\");\n link.id = FONT_LINK_ID;\n link.rel = \"stylesheet\";\n link.href =\n \"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600&family=Spline+Sans+Mono:wght@600&display=swap\";\n document.head.appendChild(link);\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-[#BEC2FF]\",\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 ? \"cpk-tab-active\" : \"cpk-tab-inactive\",\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 class=\"cpk-tab-icon\">\n ${\n key in this.customTabIcons\n ? unsafeHTML(this.customTabIcons[key])\n : this.renderIcon(icon)\n }\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 id=\"cpk-main-scroll\" class=\"flex-1 overflow-auto\">\n ${this.renderAnnouncementBanner()}\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 activityType:\n typeof raw.activityType === \"string\" ? raw.activityType : undefined,\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 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 if (this.selectedMenu === \"threads\") {\n return this.renderThreadsView();\n }\n\n return nothing;\n }\n\n private handleThreadDividerPointerDown = (event: PointerEvent) => {\n this.threadDividerResizing = true;\n this.threadDividerPointerId = event.pointerId;\n this.threadDividerStartX = event.clientX;\n this.threadDividerStartWidth = this.threadListWidth;\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n event.preventDefault();\n };\n\n private handleThreadDividerPointerMove = (event: PointerEvent) => {\n if (\n !this.threadDividerResizing ||\n this.threadDividerPointerId !== event.pointerId\n )\n return;\n const delta = event.clientX - this.threadDividerStartX;\n this.threadListWidth = Math.max(\n 180,\n Math.min(480, this.threadDividerStartWidth + delta),\n );\n this.requestUpdate();\n };\n\n private handleThreadDividerPointerUp = (event: PointerEvent) => {\n if (this.threadDividerPointerId !== event.pointerId) return;\n const target = event.currentTarget as HTMLElement;\n if (target.hasPointerCapture(this.threadDividerPointerId)) {\n target.releasePointerCapture(this.threadDividerPointerId);\n }\n this.threadDividerResizing = false;\n };\n\n private renderThreadsView() {\n const displayThreads =\n this.selectedContext === \"all-agents\"\n ? this._threads\n : (this._threadsByAgent.get(this.selectedContext) ?? []);\n\n // Surface a thread-store load error inline. For \"all-agents\" we report\n // the first error encountered across all agents (good enough for a\n // debugging surface — the per-agent context filter narrows down the\n // culprit). For a specific agent we use that agent's error directly.\n let threadsErrorMessage: string | null = null;\n if (this.selectedContext === \"all-agents\") {\n const firstError = this._threadsErrorByAgent.values().next().value;\n threadsErrorMessage = firstError?.message ?? null;\n } else {\n threadsErrorMessage =\n this._threadsErrorByAgent.get(this.selectedContext)?.message ?? null;\n }\n\n const selectedThread =\n this.selectedThreadId != null\n ? (displayThreads.find((t) => t.id === this.selectedThreadId) ?? null)\n : null;\n\n return html`\n <div style=\"display:flex;height:100%;overflow:hidden;\">\n <!-- Left sidebar: thread list -->\n <div\n style=\"width:${this.threadListWidth}px;flex-shrink:0;overflow:hidden;display:flex;flex-direction:column;border-right:1px solid #DBDBE5;\"\n >\n <cpk-thread-list\n style=\"height:100%;\"\n .threads=${displayThreads}\n .selectedThreadId=${this.selectedThreadId}\n .errorMessage=${threadsErrorMessage}\n @threadSelected=${(e: CustomEvent<string>) => {\n this.selectedThreadId = e.detail;\n this.requestUpdate();\n }}\n ></cpk-thread-list>\n </div>\n\n <!-- Resize divider -->\n <div\n style=\"width:4px;flex-shrink:0;cursor:col-resize;background:transparent;position:relative;z-index:1;\"\n @pointerdown=${this.handleThreadDividerPointerDown}\n @pointermove=${this.handleThreadDividerPointerMove}\n @pointerup=${this.handleThreadDividerPointerUp}\n @pointercancel=${this.handleThreadDividerPointerUp}\n ></div>\n\n <!-- Center + right: thread details or empty state -->\n <div style=\"flex:1;min-width:0;overflow:hidden;display:flex;\">\n ${\n this.selectedThreadId\n ? html`<cpk-thread-details\n style=\"flex:1;min-width:0;\"\n .threadId=${this.selectedThreadId}\n .thread=${selectedThread}\n .runtimeUrl=${this._core?.runtimeUrl ?? \"\"}\n .headers=${this._core?.headers ?? {}}\n .liveMessageVersion=${\n this.selectedThreadId\n ? (this.liveMessageVersion.get(this.selectedThreadId) ??\n 0)\n : 0\n }\n .agentStateInput=${\n selectedThread\n ? this.getLatestStateForAgent(selectedThread.agentId)\n : null\n }\n .agentEventsInput=${\n selectedThread\n ? (this.agentEvents.get(selectedThread.agentId) ?? [])\n : []\n }\n ></cpk-thread-details>`\n : html`\n <div\n style=\"\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #838389;\n \"\n >\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#c0c0c8\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n <span style=\"font-size: 13px\">${displayThreads.length === 0 ? \"No threads yet\" : \"Select a thread to inspect\"}</span>\n </div>\n `\n }\n </div>\n </div>\n `;\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 flex-col items-center justify-center gap-2 px-4 py-10 text-center\"\n >\n <div class=\"text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\n ${this.renderIcon(\"Zap\")}\n </div>\n <span class=\"text-sm text-gray-600\">No events yet</span>\n <span class=\"max-w-[240px] text-xs leading-snug text-gray-400\"\n >Events are recorded live. Run the agent to see them here.</span\n >\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 <colgroup>\n <col style=\"width:${this.evtColWidths[0]}px\">\n <col style=\"width:${this.evtColWidths[1]}px\">\n <col style=\"width:${this.evtColWidths[2]}px\">\n <col>\n </colgroup>\n <thead class=\"sticky top-0 z-10\">\n <tr class=\"bg-white\">\n ${[\"Agent\", \"Time\", \"Event Type\"].map(\n (label, col) => html`\n <th\n class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\"\n style=\"position:relative;overflow:hidden;\"\n >\n ${label}\n <div\n style=\"position:absolute;top:0;right:0;width:5px;height:100%;cursor:col-resize;user-select:none;background:transparent;\"\n @pointerdown=${(e: PointerEvent) => this._onEvtColResizeStart(e, col)}\n @pointermove=${(e: PointerEvent) => this._onEvtColResizeMove(e)}\n @pointerup=${() => this._onEvtColResizeEnd()}\n @pointercancel=${() => this._onEvtColResizeEnd()}\n ></div>\n </th>`,\n )}\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 _onEvtColResizeStart(e: PointerEvent, col: number): void {\n e.preventDefault();\n e.stopPropagation();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n this._evtColResize = {\n col,\n startX: e.clientX,\n startW: this.evtColWidths[col] ?? 0,\n };\n }\n\n private _onEvtColResizeMove(e: PointerEvent): void {\n if (!this._evtColResize) return;\n const { col, startX, startW } = this._evtColResize;\n this.evtColWidths = this.evtColWidths.map((w, i) =>\n i === col ? Math.max(40, startW + (e.clientX - startX)) : w,\n );\n this.requestUpdate();\n }\n\n private _onEvtColResizeEnd(): void {\n this._evtColResize = null;\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 cpk-agent-icon\"\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 cpk-stat-card\"\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\n class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden cpk-stat-card\"\n >\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\n class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden cpk-stat-card\"\n >\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\n class=\"rounded-md bg-gray-50 px-3 py-2 overflow-hidden cpk-stat-card\"\n >\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=\"cpk-section-card\">\n <div class=\"cpk-section-header\">\n <h4>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-12 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=\"cpk-section-card\">\n <div class=\"cpk-section-header\">\n <h4>Current Messages</h4>\n </div>\n <div class=\"overflow-auto\">\n ${\n messages && messages.length > 0\n ? html`\n <div class=\"w-full text-xs\">\n <div class=\"flex bg-gray-50\">\n <div class=\"w-40 shrink-0 px-4 py-2 font-medium text-gray-700\">Role</div>\n <div class=\"flex-1 px-4 py-2 font-medium text-gray-700\">Content</div>\n </div>\n <div 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 <div class=\"flex items-start\">\n <div class=\"w-40 shrink-0 px-4 py-2\">\n <span\n class=\"inline-flex rounded px-2 py-0.5 text-[10px] font-medium ${roleColors[role] || roleColors.unknown}\"\n >\n ${role}\n </span>\n </div>\n <div class=\"flex-1 px-4 py-2\">\n ${\n hasContent\n ? html`<div\n class=\"whitespace-pre-line break-words text-gray-700\"\n >\n ${rawContent}\n </div>`\n : html`<div class=\"italic text-gray-400\">\n ${contentFallback}\n </div>`\n }\n ${\n role === \"assistant\" && toolCalls.length > 0\n ? this.renderToolCallDetails(toolCalls)\n : nothing\n }\n </div>\n </div>\n `;\n })}\n </div>\n </div>\n `\n : html`\n <div\n class=\"flex h-12 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 const previousMenu = this.selectedMenu;\n this.selectedMenu = key;\n\n // If switching to agents view and \"all-agents\" is selected, switch to the most recently active 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 // Pick the agent with the most recent activity; fall back to first\n const mostRecent = agentOptions.reduce<{\n key: string;\n ts: number;\n } | null>((best, opt) => {\n const ts = this.getAgentStats(opt.key).lastActivity ?? -1;\n return best === null || ts > best.ts ? { key: opt.key, ts } : best;\n }, null);\n this.selectedContext = mostRecent\n ? mostRecent.key\n : agentOptions[0]!.key;\n }\n }\n\n // If leaving the agents view with multiple agents registered, restore\n // \"all-agents\" so the Events tab isn't silently filtered to one agent.\n if (previousMenu === \"agents\" && key !== \"agents\") {\n const agentCount = this.contextOptions.filter(\n (opt) => opt.key !== \"all-agents\",\n ).length;\n if (agentCount > 1) {\n this.selectedContext = \"all-agents\";\n }\n }\n\n if (key === \"threads\") {\n this.autoSelectLatestThread();\n }\n\n if (key === \"ag-ui-events\" || key === \"agents\") {\n requestAnimationFrame(() => {\n const scroller = this.shadowRoot?.getElementById(\"cpk-main-scroll\");\n if (scroller) scroller.scrollTop = 0;\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=\"font-mono text-xs font-medium text-gray-800 flex-1 truncate min-w-0\"\n >${id}</code\n >\n <button\n type=\"button\"\n class=\"cpk-copy-btn\"\n @click=${(e: Event) => {\n e.stopPropagation();\n void this.copyContextValue(id, `${id}:id`);\n }}\n >\n ${this.copiedContextItems.has(`${id}:id`) ? \"✓\" : \"Copy\"}\n </button>\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 type=\"button\"\n class=\"cpk-copy-btn\"\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 `\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.slice(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 renderAnnouncementBanner() {\n if (!this.hasUnseenAnnouncement) {\n return nothing;\n }\n\n if (!this.announcementLoaded && !this.announcementHtml) {\n return html`<div\n class=\"flex items-center gap-2 px-4 py-3 text-sm font-semibold text-slate-800\"\n >\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 }\n\n if (!this.announcementHtml) {\n return nothing;\n }\n\n return html`<div class=\"mx-4 mt-3 mb-3 rounded-xl border border-slate-200 bg-white px-4 py-3\">\n <div\n class=\"mb-2 flex items-center gap-2 text-xs font-semibold text-slate-900\"\n >\n <span\n class=\"inline-flex h-5 w-5 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 ${this.renderIcon(\"X\")}\n </button>\n </div>\n <div class=\"announcement-body ${this.announcementExpanded ? \"announcement-body--expanded\" : \"announcement-body--collapsed\"}\">\n <div\n class=\"announcement-content\"\n @click=${this.handleAnnouncementContentClick}\n >\n ${unsafeHTML(this.announcementHtml)}\n </div>\n ${\n !this.announcementExpanded\n ? html`\n <div class=\"announcement-fade\"></div>\n `\n : nothing\n }\n </div>\n <button\n class=\"announcement-toggle\"\n type=\"button\"\n @click=${() => {\n this.announcementExpanded = !this.announcementExpanded;\n this.requestUpdate();\n }}\n >\n ${this.announcementExpanded ? \"Show less ↑\" : \"Show more ↓\"}\n </button>\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.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 // Swallowing here would hide non-network failures (malformed JSON, the\n // explicit \"Malformed announcement payload\" throw above, exceptions\n // from `convertMarkdownToHtml`). At minimum, surface in the console so\n // a stale announcement is debuggable.\n console.warn(\"[CopilotKit Inspector] Failed to load announcement\", 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 renderer.code = (code, lang) => {\n const safeLang = (lang ?? \"\").replace(/[^a-z0-9-]/gi, \"\");\n const langClass = safeLang ? ` class=\"language-${safeLang}\"` : \"\";\n const escaped = escapeHtml(code);\n const encoded = this.encodeBase64(code);\n return `<div class=\"announcement-code\"><pre><code${langClass}>${escaped}</code></pre><div class=\"announcement-code__copy-shield\"><button type=\"button\" class=\"announcement-code__copy\" data-copy=\"${encoded}\" aria-label=\"Copy code\">Copy</button></div></div>`;\n };\n return marked.parse(markdown, { renderer, async: false });\n }\n\n private copyResetTimeouts = new WeakMap<HTMLButtonElement, number>();\n\n private encodeBase64(value: string): string {\n if (typeof window === \"undefined\" || typeof window.btoa !== \"function\") {\n return \"\";\n }\n // btoa only accepts Latin-1; round-trip via TextEncoder to keep full UTF-8.\n const bytes = new TextEncoder().encode(value);\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n return window.btoa(binary);\n }\n\n private decodeBase64(value: string): string {\n if (typeof window === \"undefined\" || typeof window.atob !== \"function\") {\n return \"\";\n }\n const decoded = window.atob(value);\n const bytes = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) bytes[i] = decoded.charCodeAt(i);\n return new TextDecoder().decode(bytes);\n }\n\n private handleAnnouncementContentClick = (event: Event): void => {\n const target = event.target instanceof HTMLElement ? event.target : null;\n const button = target?.closest(\".announcement-code__copy\");\n if (!(button instanceof HTMLButtonElement)) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const encoded = button.getAttribute(\"data-copy\") ?? \"\";\n const code = this.decodeBase64(encoded);\n if (!code) {\n return;\n }\n const showCopied = () => {\n const existing = this.copyResetTimeouts.get(button);\n if (existing !== undefined) {\n window.clearTimeout(existing);\n }\n button.setAttribute(\"data-copied\", \"true\");\n button.setAttribute(\"aria-label\", \"Code copied\");\n button.textContent = \"Copied\";\n const id = window.setTimeout(() => {\n button.removeAttribute(\"data-copied\");\n button.setAttribute(\"aria-label\", \"Copy code\");\n button.textContent = \"Copy\";\n this.copyResetTimeouts.delete(button);\n }, 1500);\n this.copyResetTimeouts.set(button, id);\n };\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(code).then(showCopied, () => {\n // ignore — clipboard may be unavailable (insecure context, denied\n // permission, focus loss); button silently stays in idle state.\n });\n }\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 escapeHtml(value).replace(/\"/g, \"&quot;\").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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"}