@copilotkitnext/web-inspector 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,1205 @@
1
+ // src/index.ts
2
+ import { LitElement, css, html, nothing, unsafeCSS } from "lit";
3
+ import { styleMap } from "lit/directives/style-map.js";
4
+
5
+ // src/styles/generated.css
6
+ var generated_default = '/*! tailwindcss v4.1.11 | 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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-200:oklch(92.4% .12 95.746);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--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-200:oklch(88.2% .059 254.128);--color-blue-700:oklch(48.8% .243 264.376);--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-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-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;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wider:.05em;--leading-tight:1.25;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--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}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.static{position:static}.right-1{right:calc(var(--spacing)*1)}.bottom-1{bottom:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.z-50{z-index:50}.m-0{margin:calc(var(--spacing)*0)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.flex{display:flex}.inline-flex{display:inline-flex}.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-12{height:calc(var(--spacing)*12)}.h-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.h-full{height:100%}.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-12{width:calc(var(--spacing)*12)}.w-40{width:calc(var(--spacing)*40)}.w-56{width:calc(var(--spacing)*56)}.w-full{width:100%}.w-px{width:1px}.max-w-xs{max-width:var(--container-xs)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.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}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow: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-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-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-gray-200{border-color:var(--color-gray-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-sky-200{border-color:var(--color-sky-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-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-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-200{background-color:var(--color-gray-200)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-sky-50{background-color:var(--color-sky-50)}.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)}.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-3{padding-block:calc(var(--spacing)*3)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pr-3{padding-right:calc(var(--spacing)*3)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.text-blue-700{color:var(--color-blue-700)}.text-emerald-700{color:var(--color-emerald-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-rose-700{color:var(--color-rose-700)}.text-sky-700{color:var(--color-sky-700)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-60{opacity:.6}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-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-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,)}.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,visibility,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))}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\\:border-gray-300:is(:where(.group):hover *){border-color:var(--color-gray-300)}.group-hover\\:text-gray-700:is(:where(.group):hover *){color:var(--color-gray-700)}.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-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-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\\:bg-gray-50:focus{background-color:var(--color-gray-50)}.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)}.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-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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-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}';
7
+
8
+ // src/assets/logo-mark.svg
9
+ var logo_mark_default = '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';
10
+
11
+ // src/index.ts
12
+ import { unsafeHTML } from "lit/directives/unsafe-html.js";
13
+ import { icons } from "lucide";
14
+
15
+ // src/lib/context-helpers.ts
16
+ function updateSizeFromElement(state, element, fallback) {
17
+ const rect = element.getBoundingClientRect();
18
+ state.size = {
19
+ width: rect.width || fallback.width,
20
+ height: rect.height || fallback.height
21
+ };
22
+ }
23
+ function clampSize(size, viewport, edgeMargin, minWidth, minHeight) {
24
+ const maxWidth = Math.max(minWidth, viewport.width - edgeMargin * 2);
25
+ const maxHeight = Math.max(minHeight, viewport.height - edgeMargin * 2);
26
+ return {
27
+ width: clamp(size.width, minWidth, maxWidth),
28
+ height: clamp(size.height, minHeight, maxHeight)
29
+ };
30
+ }
31
+ function constrainToViewport(state, position, viewport, edgeMargin) {
32
+ const maxX = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);
33
+ const maxY = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);
34
+ return {
35
+ x: clamp(position.x, edgeMargin, maxX),
36
+ y: clamp(position.y, edgeMargin, maxY)
37
+ };
38
+ }
39
+ function keepPositionWithinViewport(state, viewport, edgeMargin) {
40
+ state.position = constrainToViewport(state, state.position, viewport, edgeMargin);
41
+ }
42
+ function centerContext(state, viewport, edgeMargin) {
43
+ const centered = {
44
+ x: Math.round((viewport.width - state.size.width) / 2),
45
+ y: Math.round((viewport.height - state.size.height) / 2)
46
+ };
47
+ state.position = constrainToViewport(state, centered, viewport, edgeMargin);
48
+ updateAnchorFromPosition(state, viewport, edgeMargin);
49
+ return state.position;
50
+ }
51
+ function updateAnchorFromPosition(state, viewport, edgeMargin) {
52
+ const centerX = state.position.x + state.size.width / 2;
53
+ const centerY = state.position.y + state.size.height / 2;
54
+ const horizontal = centerX < viewport.width / 2 ? "left" : "right";
55
+ const vertical = centerY < viewport.height / 2 ? "top" : "bottom";
56
+ state.anchor = { horizontal, vertical };
57
+ const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);
58
+ const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);
59
+ state.anchorOffset = {
60
+ x: horizontal === "left" ? clamp(state.position.x, edgeMargin, maxHorizontalOffset) : clamp(viewport.width - state.position.x - state.size.width, edgeMargin, maxHorizontalOffset),
61
+ y: vertical === "top" ? clamp(state.position.y, edgeMargin, maxVerticalOffset) : clamp(viewport.height - state.position.y - state.size.height, edgeMargin, maxVerticalOffset)
62
+ };
63
+ }
64
+ function applyAnchorPosition(state, viewport, edgeMargin) {
65
+ const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);
66
+ const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);
67
+ const horizontalOffset = clamp(state.anchorOffset.x, edgeMargin, maxHorizontalOffset);
68
+ const verticalOffset = clamp(state.anchorOffset.y, edgeMargin, maxVerticalOffset);
69
+ const x = state.anchor.horizontal === "left" ? horizontalOffset : viewport.width - state.size.width - horizontalOffset;
70
+ const y = state.anchor.vertical === "top" ? verticalOffset : viewport.height - state.size.height - verticalOffset;
71
+ state.anchorOffset = { x: horizontalOffset, y: verticalOffset };
72
+ state.position = constrainToViewport(state, { x, y }, viewport, edgeMargin);
73
+ return state.position;
74
+ }
75
+ function clamp(value, min, max) {
76
+ return Math.min(Math.max(min, value), max);
77
+ }
78
+
79
+ // src/lib/persistence.ts
80
+ function loadInspectorState(cookieName) {
81
+ if (typeof document === "undefined") {
82
+ return null;
83
+ }
84
+ const prefix = `${cookieName}=`;
85
+ const entry = document.cookie.split("; ").find((cookie) => cookie.startsWith(prefix));
86
+ if (!entry) {
87
+ return null;
88
+ }
89
+ const raw = entry.substring(prefix.length);
90
+ if (!raw) {
91
+ return null;
92
+ }
93
+ try {
94
+ const parsed = JSON.parse(decodeURIComponent(raw));
95
+ if (parsed && typeof parsed === "object") {
96
+ return parsed;
97
+ }
98
+ } catch (error) {
99
+ return null;
100
+ }
101
+ return null;
102
+ }
103
+ function saveInspectorState(cookieName, state, maxAgeSeconds) {
104
+ if (typeof document === "undefined") {
105
+ return;
106
+ }
107
+ const encoded = encodeURIComponent(JSON.stringify(state));
108
+ document.cookie = `${cookieName}=${encoded}; path=/; max-age=${maxAgeSeconds}; SameSite=Lax`;
109
+ }
110
+ function isValidAnchor(value) {
111
+ if (!value || typeof value !== "object") {
112
+ return false;
113
+ }
114
+ const candidate = value;
115
+ return (candidate.horizontal === "left" || candidate.horizontal === "right") && (candidate.vertical === "top" || candidate.vertical === "bottom");
116
+ }
117
+ function isValidPosition(value) {
118
+ if (!value || typeof value !== "object") {
119
+ return false;
120
+ }
121
+ const candidate = value;
122
+ return isFiniteNumber(candidate.x) && isFiniteNumber(candidate.y);
123
+ }
124
+ function isValidSize(value) {
125
+ if (!value || typeof value !== "object") {
126
+ return false;
127
+ }
128
+ const candidate = value;
129
+ return isFiniteNumber(candidate.width) && isFiniteNumber(candidate.height);
130
+ }
131
+ function isFiniteNumber(value) {
132
+ return typeof value === "number" && Number.isFinite(value);
133
+ }
134
+
135
+ // src/index.ts
136
+ var WEB_INSPECTOR_TAG = "web-inspector";
137
+ var EDGE_MARGIN = 16;
138
+ var DRAG_THRESHOLD = 6;
139
+ var MIN_WINDOW_WIDTH = 260;
140
+ var MIN_WINDOW_HEIGHT = 200;
141
+ var COOKIE_NAME = "copilotkit_inspector_state";
142
+ var COOKIE_MAX_AGE_SECONDS = 60 * 60 * 24 * 30;
143
+ var DEFAULT_BUTTON_SIZE = { width: 48, height: 48 };
144
+ var DEFAULT_WINDOW_SIZE = { width: 320, height: 380 };
145
+ var MAX_AGENT_EVENTS = 200;
146
+ var MAX_TOTAL_EVENTS = 500;
147
+ var WebInspectorElement = class extends LitElement {
148
+ constructor() {
149
+ super(...arguments);
150
+ this._core = null;
151
+ this.coreSubscriber = null;
152
+ this.coreUnsubscribe = null;
153
+ this.agentSubscriptions = /* @__PURE__ */ new Map();
154
+ this.agentEvents = /* @__PURE__ */ new Map();
155
+ this.flattenedEvents = [];
156
+ this.eventCounter = 0;
157
+ this.pointerId = null;
158
+ this.dragStart = null;
159
+ this.dragOffset = { x: 0, y: 0 };
160
+ this.isDragging = false;
161
+ this.pointerContext = null;
162
+ this.isOpen = false;
163
+ this.draggedDuringInteraction = false;
164
+ this.ignoreNextButtonClick = false;
165
+ this.selectedMenu = "ag-ui-events";
166
+ this.contextMenuOpen = false;
167
+ this.contextState = {
168
+ button: {
169
+ position: { x: EDGE_MARGIN, y: EDGE_MARGIN },
170
+ size: { ...DEFAULT_BUTTON_SIZE },
171
+ anchor: { horizontal: "right", vertical: "bottom" },
172
+ anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN }
173
+ },
174
+ window: {
175
+ position: { x: EDGE_MARGIN, y: EDGE_MARGIN },
176
+ size: { ...DEFAULT_WINDOW_SIZE },
177
+ anchor: { horizontal: "right", vertical: "bottom" },
178
+ anchorOffset: { x: EDGE_MARGIN, y: EDGE_MARGIN }
179
+ }
180
+ };
181
+ this.hasCustomPosition = {
182
+ button: false,
183
+ window: false
184
+ };
185
+ this.resizePointerId = null;
186
+ this.resizeStart = null;
187
+ this.resizeInitialSize = null;
188
+ this.isResizing = false;
189
+ this.menuItems = [
190
+ { key: "ag-ui-events", label: "AG-UI Events", icon: "Zap" },
191
+ { key: "agents", label: "Agents", icon: "Bot" },
192
+ { key: "frontend-tools", label: "Frontend Tools", icon: "Hammer" },
193
+ { key: "agent-context", label: "Agent Context", icon: "FileText" }
194
+ ];
195
+ this.handlePointerDown = (event) => {
196
+ const target = event.currentTarget;
197
+ const contextAttr = target?.dataset.dragContext;
198
+ const context = contextAttr === "window" ? "window" : "button";
199
+ this.pointerContext = context;
200
+ this.measureContext(context);
201
+ event.preventDefault();
202
+ this.pointerId = event.pointerId;
203
+ this.dragStart = { x: event.clientX, y: event.clientY };
204
+ const state = this.contextState[context];
205
+ this.dragOffset = {
206
+ x: event.clientX - state.position.x,
207
+ y: event.clientY - state.position.y
208
+ };
209
+ this.isDragging = false;
210
+ this.draggedDuringInteraction = false;
211
+ this.ignoreNextButtonClick = false;
212
+ target?.setPointerCapture?.(this.pointerId);
213
+ };
214
+ this.handlePointerMove = (event) => {
215
+ if (this.pointerId !== event.pointerId || !this.dragStart || !this.pointerContext) {
216
+ return;
217
+ }
218
+ const distance = Math.hypot(event.clientX - this.dragStart.x, event.clientY - this.dragStart.y);
219
+ if (!this.isDragging && distance < DRAG_THRESHOLD) {
220
+ return;
221
+ }
222
+ event.preventDefault();
223
+ this.setDragging(true);
224
+ this.draggedDuringInteraction = true;
225
+ const desired = {
226
+ x: event.clientX - this.dragOffset.x,
227
+ y: event.clientY - this.dragOffset.y
228
+ };
229
+ const constrained = this.constrainToViewport(desired, this.pointerContext);
230
+ this.contextState[this.pointerContext].position = constrained;
231
+ this.updateHostTransform(this.pointerContext);
232
+ };
233
+ this.handlePointerUp = (event) => {
234
+ if (this.pointerId !== event.pointerId) {
235
+ return;
236
+ }
237
+ const target = event.currentTarget;
238
+ if (target?.hasPointerCapture(this.pointerId)) {
239
+ target.releasePointerCapture(this.pointerId);
240
+ }
241
+ const context = this.pointerContext ?? this.activeContext;
242
+ if (this.isDragging && this.pointerContext) {
243
+ event.preventDefault();
244
+ this.setDragging(false);
245
+ this.updateAnchorFromPosition(this.pointerContext);
246
+ if (this.pointerContext === "window") {
247
+ this.hasCustomPosition.window = true;
248
+ } else if (this.pointerContext === "button") {
249
+ this.hasCustomPosition.button = true;
250
+ if (this.draggedDuringInteraction) {
251
+ this.ignoreNextButtonClick = true;
252
+ }
253
+ }
254
+ this.applyAnchorPosition(this.pointerContext);
255
+ } else if (context === "button" && !this.isOpen && !this.draggedDuringInteraction) {
256
+ this.openInspector();
257
+ }
258
+ this.resetPointerTracking();
259
+ };
260
+ this.handlePointerCancel = (event) => {
261
+ if (this.pointerId !== event.pointerId) {
262
+ return;
263
+ }
264
+ const target = event.currentTarget;
265
+ if (target?.hasPointerCapture(this.pointerId)) {
266
+ target.releasePointerCapture(this.pointerId);
267
+ }
268
+ this.resetPointerTracking();
269
+ };
270
+ this.handleButtonClick = (event) => {
271
+ if (this.isDragging) {
272
+ event.preventDefault();
273
+ return;
274
+ }
275
+ if (this.ignoreNextButtonClick) {
276
+ event.preventDefault();
277
+ this.ignoreNextButtonClick = false;
278
+ return;
279
+ }
280
+ if (!this.isOpen) {
281
+ event.preventDefault();
282
+ this.openInspector();
283
+ }
284
+ };
285
+ this.handleClosePointerDown = (event) => {
286
+ event.stopPropagation();
287
+ event.preventDefault();
288
+ };
289
+ this.handleCloseClick = () => {
290
+ this.closeInspector();
291
+ };
292
+ this.handleResizePointerDown = (event) => {
293
+ event.stopPropagation();
294
+ event.preventDefault();
295
+ this.hasCustomPosition.window = true;
296
+ this.isResizing = true;
297
+ this.resizePointerId = event.pointerId;
298
+ this.resizeStart = { x: event.clientX, y: event.clientY };
299
+ this.resizeInitialSize = { ...this.contextState.window.size };
300
+ const target = event.currentTarget;
301
+ target?.setPointerCapture?.(event.pointerId);
302
+ };
303
+ this.handleResizePointerMove = (event) => {
304
+ if (!this.isResizing || this.resizePointerId !== event.pointerId || !this.resizeStart || !this.resizeInitialSize) {
305
+ return;
306
+ }
307
+ event.preventDefault();
308
+ const deltaX = event.clientX - this.resizeStart.x;
309
+ const deltaY = event.clientY - this.resizeStart.y;
310
+ const state = this.contextState.window;
311
+ state.size = this.clampWindowSize({
312
+ width: this.resizeInitialSize.width + deltaX,
313
+ height: this.resizeInitialSize.height + deltaY
314
+ });
315
+ this.keepPositionWithinViewport("window");
316
+ this.updateAnchorFromPosition("window");
317
+ this.requestUpdate();
318
+ this.updateHostTransform("window");
319
+ };
320
+ this.handleResizePointerUp = (event) => {
321
+ if (this.resizePointerId !== event.pointerId) {
322
+ return;
323
+ }
324
+ const target = event.currentTarget;
325
+ if (target?.hasPointerCapture(this.resizePointerId)) {
326
+ target.releasePointerCapture(this.resizePointerId);
327
+ }
328
+ this.updateAnchorFromPosition("window");
329
+ this.applyAnchorPosition("window");
330
+ this.resetResizeTracking();
331
+ };
332
+ this.handleResizePointerCancel = (event) => {
333
+ if (this.resizePointerId !== event.pointerId) {
334
+ return;
335
+ }
336
+ const target = event.currentTarget;
337
+ if (target?.hasPointerCapture(this.resizePointerId)) {
338
+ target.releasePointerCapture(this.resizePointerId);
339
+ }
340
+ this.updateAnchorFromPosition("window");
341
+ this.applyAnchorPosition("window");
342
+ this.resetResizeTracking();
343
+ };
344
+ this.handleResize = () => {
345
+ this.measureContext("button");
346
+ this.applyAnchorPosition("button");
347
+ this.measureContext("window");
348
+ if (this.hasCustomPosition.window) {
349
+ this.applyAnchorPosition("window");
350
+ } else {
351
+ this.centerContext("window");
352
+ }
353
+ this.updateHostTransform();
354
+ };
355
+ this.contextOptions = [
356
+ { key: "all-agents", label: "All Agents" }
357
+ ];
358
+ this.selectedContext = "all-agents";
359
+ this.expandedRows = /* @__PURE__ */ new Set();
360
+ this.handleGlobalPointerDown = (event) => {
361
+ if (!this.contextMenuOpen) {
362
+ return;
363
+ }
364
+ const clickedDropdown = event.composedPath().some((node) => {
365
+ return node instanceof HTMLElement && node.dataset?.contextDropdownRoot === "true";
366
+ });
367
+ if (!clickedDropdown) {
368
+ this.contextMenuOpen = false;
369
+ this.requestUpdate();
370
+ }
371
+ };
372
+ }
373
+ static {
374
+ this.properties = {
375
+ core: { attribute: false }
376
+ };
377
+ }
378
+ get core() {
379
+ return this._core;
380
+ }
381
+ set core(value) {
382
+ const oldValue = this._core;
383
+ if (oldValue === value) {
384
+ return;
385
+ }
386
+ this.detachFromCore();
387
+ this._core = value ?? null;
388
+ this.requestUpdate("core", oldValue);
389
+ if (this._core) {
390
+ this.attachToCore(this._core);
391
+ }
392
+ }
393
+ attachToCore(core) {
394
+ this.coreSubscriber = {
395
+ onAgentsChanged: ({ agents }) => {
396
+ this.processAgentsChanged(agents);
397
+ }
398
+ };
399
+ this.coreUnsubscribe = core.subscribe(this.coreSubscriber);
400
+ this.processAgentsChanged(core.agents);
401
+ }
402
+ detachFromCore() {
403
+ if (this.coreUnsubscribe) {
404
+ this.coreUnsubscribe();
405
+ this.coreUnsubscribe = null;
406
+ }
407
+ this.coreSubscriber = null;
408
+ this.teardownAgentSubscriptions();
409
+ }
410
+ teardownAgentSubscriptions() {
411
+ for (const unsubscribe of this.agentSubscriptions.values()) {
412
+ unsubscribe();
413
+ }
414
+ this.agentSubscriptions.clear();
415
+ this.agentEvents.clear();
416
+ this.flattenedEvents = [];
417
+ this.eventCounter = 0;
418
+ }
419
+ processAgentsChanged(agents) {
420
+ const seenAgentIds = /* @__PURE__ */ new Set();
421
+ for (const agent of Object.values(agents)) {
422
+ if (!agent?.agentId) {
423
+ continue;
424
+ }
425
+ seenAgentIds.add(agent.agentId);
426
+ this.subscribeToAgent(agent);
427
+ }
428
+ for (const agentId of Array.from(this.agentSubscriptions.keys())) {
429
+ if (!seenAgentIds.has(agentId)) {
430
+ this.unsubscribeFromAgent(agentId);
431
+ this.agentEvents.delete(agentId);
432
+ }
433
+ }
434
+ this.updateContextOptions(seenAgentIds);
435
+ this.requestUpdate();
436
+ }
437
+ subscribeToAgent(agent) {
438
+ if (!agent.agentId) {
439
+ return;
440
+ }
441
+ const agentId = agent.agentId;
442
+ this.unsubscribeFromAgent(agentId);
443
+ const subscriber = {
444
+ onRunStartedEvent: ({ event }) => {
445
+ this.recordAgentEvent(agentId, "RUN_STARTED", event);
446
+ },
447
+ onRunFinishedEvent: ({ event, result }) => {
448
+ this.recordAgentEvent(agentId, "RUN_FINISHED", { event, result });
449
+ },
450
+ onRunErrorEvent: ({ event }) => {
451
+ this.recordAgentEvent(agentId, "RUN_ERROR", event);
452
+ },
453
+ onTextMessageStartEvent: ({ event }) => {
454
+ this.recordAgentEvent(agentId, "TEXT_MESSAGE_START", event);
455
+ },
456
+ onTextMessageContentEvent: ({ event, textMessageBuffer }) => {
457
+ this.recordAgentEvent(agentId, "TEXT_MESSAGE_CONTENT", { event, textMessageBuffer });
458
+ },
459
+ onTextMessageEndEvent: ({ event, textMessageBuffer }) => {
460
+ this.recordAgentEvent(agentId, "TEXT_MESSAGE_END", { event, textMessageBuffer });
461
+ },
462
+ onToolCallStartEvent: ({ event }) => {
463
+ this.recordAgentEvent(agentId, "TOOL_CALL_START", event);
464
+ },
465
+ onToolCallArgsEvent: ({ event, toolCallBuffer, toolCallName, partialToolCallArgs }) => {
466
+ this.recordAgentEvent(agentId, "TOOL_CALL_ARGS", { event, toolCallBuffer, toolCallName, partialToolCallArgs });
467
+ },
468
+ onToolCallEndEvent: ({ event, toolCallArgs, toolCallName }) => {
469
+ this.recordAgentEvent(agentId, "TOOL_CALL_END", { event, toolCallArgs, toolCallName });
470
+ },
471
+ onToolCallResultEvent: ({ event }) => {
472
+ this.recordAgentEvent(agentId, "TOOL_CALL_RESULT", event);
473
+ },
474
+ onStateSnapshotEvent: ({ event }) => {
475
+ this.recordAgentEvent(agentId, "STATE_SNAPSHOT", event);
476
+ },
477
+ onStateDeltaEvent: ({ event }) => {
478
+ this.recordAgentEvent(agentId, "STATE_DELTA", event);
479
+ },
480
+ onMessagesSnapshotEvent: ({ event }) => {
481
+ this.recordAgentEvent(agentId, "MESSAGES_SNAPSHOT", event);
482
+ },
483
+ onRawEvent: ({ event }) => {
484
+ this.recordAgentEvent(agentId, "RAW_EVENT", event);
485
+ },
486
+ onCustomEvent: ({ event }) => {
487
+ this.recordAgentEvent(agentId, "CUSTOM_EVENT", event);
488
+ }
489
+ };
490
+ const { unsubscribe } = agent.subscribe(subscriber);
491
+ this.agentSubscriptions.set(agentId, unsubscribe);
492
+ if (!this.agentEvents.has(agentId)) {
493
+ this.agentEvents.set(agentId, []);
494
+ }
495
+ }
496
+ unsubscribeFromAgent(agentId) {
497
+ const unsubscribe = this.agentSubscriptions.get(agentId);
498
+ if (unsubscribe) {
499
+ unsubscribe();
500
+ this.agentSubscriptions.delete(agentId);
501
+ }
502
+ }
503
+ recordAgentEvent(agentId, type, payload) {
504
+ const eventId = `${agentId}:${++this.eventCounter}`;
505
+ const event = {
506
+ id: eventId,
507
+ agentId,
508
+ type,
509
+ timestamp: Date.now(),
510
+ payload
511
+ };
512
+ const currentAgentEvents = this.agentEvents.get(agentId) ?? [];
513
+ const nextAgentEvents = [event, ...currentAgentEvents].slice(0, MAX_AGENT_EVENTS);
514
+ this.agentEvents.set(agentId, nextAgentEvents);
515
+ this.flattenedEvents = [event, ...this.flattenedEvents].slice(0, MAX_TOTAL_EVENTS);
516
+ this.requestUpdate();
517
+ }
518
+ updateContextOptions(agentIds) {
519
+ const nextOptions = [
520
+ { key: "all-agents", label: "All Agents" },
521
+ ...Array.from(agentIds).sort((a, b) => a.localeCompare(b)).map((id) => ({ key: id, label: id }))
522
+ ];
523
+ const optionsChanged = this.contextOptions.length !== nextOptions.length || this.contextOptions.some((option, index) => option.key !== nextOptions[index]?.key);
524
+ if (optionsChanged) {
525
+ this.contextOptions = nextOptions;
526
+ }
527
+ if (!nextOptions.some((option) => option.key === this.selectedContext)) {
528
+ this.selectedContext = "all-agents";
529
+ this.expandedRows.clear();
530
+ }
531
+ }
532
+ getEventsForSelectedContext() {
533
+ if (this.selectedContext === "all-agents") {
534
+ return this.flattenedEvents;
535
+ }
536
+ return this.agentEvents.get(this.selectedContext) ?? [];
537
+ }
538
+ getEventBadgeClasses(type) {
539
+ const base = "font-mono text-[10px] font-medium inline-flex items-center rounded-sm px-1.5 py-0.5 border";
540
+ if (type.startsWith("RUN_")) {
541
+ return `${base} bg-blue-50 text-blue-700 border-blue-200`;
542
+ }
543
+ if (type.startsWith("TEXT_MESSAGE")) {
544
+ return `${base} bg-emerald-50 text-emerald-700 border-emerald-200`;
545
+ }
546
+ if (type.startsWith("TOOL_CALL")) {
547
+ return `${base} bg-amber-50 text-amber-700 border-amber-200`;
548
+ }
549
+ if (type.startsWith("STATE")) {
550
+ return `${base} bg-violet-50 text-violet-700 border-violet-200`;
551
+ }
552
+ if (type.startsWith("MESSAGES")) {
553
+ return `${base} bg-sky-50 text-sky-700 border-sky-200`;
554
+ }
555
+ if (type === "RUN_ERROR") {
556
+ return `${base} bg-rose-50 text-rose-700 border-rose-200`;
557
+ }
558
+ return `${base} bg-gray-100 text-gray-600 border-gray-200`;
559
+ }
560
+ stringifyPayload(payload, pretty) {
561
+ try {
562
+ if (payload === void 0) {
563
+ return pretty ? "undefined" : "undefined";
564
+ }
565
+ if (typeof payload === "string") {
566
+ return payload;
567
+ }
568
+ return JSON.stringify(payload, null, pretty ? 2 : 0) ?? "";
569
+ } catch (error) {
570
+ console.warn("Failed to stringify inspector payload", error);
571
+ return String(payload);
572
+ }
573
+ }
574
+ static {
575
+ this.styles = [
576
+ unsafeCSS(generated_default),
577
+ css`
578
+ :host {
579
+ position: fixed;
580
+ top: 0;
581
+ left: 0;
582
+ z-index: 2147483646;
583
+ display: block;
584
+ will-change: transform;
585
+ }
586
+
587
+ .console-button {
588
+ transition:
589
+ transform 160ms ease,
590
+ opacity 160ms ease;
591
+ }
592
+
593
+ .resize-handle {
594
+ touch-action: none;
595
+ user-select: none;
596
+ }
597
+ `
598
+ ];
599
+ }
600
+ connectedCallback() {
601
+ super.connectedCallback();
602
+ if (typeof window !== "undefined") {
603
+ window.addEventListener("resize", this.handleResize);
604
+ window.addEventListener("pointerdown", this.handleGlobalPointerDown);
605
+ }
606
+ }
607
+ disconnectedCallback() {
608
+ super.disconnectedCallback();
609
+ if (typeof window !== "undefined") {
610
+ window.removeEventListener("resize", this.handleResize);
611
+ window.removeEventListener("pointerdown", this.handleGlobalPointerDown);
612
+ }
613
+ this.detachFromCore();
614
+ }
615
+ firstUpdated() {
616
+ if (typeof window === "undefined") {
617
+ return;
618
+ }
619
+ this.measureContext("button");
620
+ this.measureContext("window");
621
+ this.contextState.button.anchor = { horizontal: "right", vertical: "bottom" };
622
+ this.contextState.button.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };
623
+ this.contextState.window.anchor = { horizontal: "right", vertical: "bottom" };
624
+ this.contextState.window.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };
625
+ this.hydrateStateFromCookie();
626
+ this.applyAnchorPosition("button");
627
+ if (this.hasCustomPosition.window) {
628
+ this.applyAnchorPosition("window");
629
+ } else {
630
+ this.centerContext("window");
631
+ }
632
+ this.updateHostTransform("button");
633
+ }
634
+ render() {
635
+ return this.isOpen ? this.renderWindow() : this.renderButton();
636
+ }
637
+ renderButton() {
638
+ const buttonClasses = [
639
+ "console-button",
640
+ "group",
641
+ "pointer-events-auto",
642
+ "inline-flex",
643
+ "h-12",
644
+ "w-12",
645
+ "items-center",
646
+ "justify-center",
647
+ "rounded-full",
648
+ "border",
649
+ "border-white/20",
650
+ "bg-slate-950/95",
651
+ "text-xs",
652
+ "font-medium",
653
+ "text-white",
654
+ "ring-1",
655
+ "ring-white/10",
656
+ "backdrop-blur-md",
657
+ "transition",
658
+ "hover:border-white/30",
659
+ "hover:bg-slate-900/95",
660
+ "hover:scale-105",
661
+ "focus-visible:outline",
662
+ "focus-visible:outline-2",
663
+ "focus-visible:outline-offset-2",
664
+ "focus-visible:outline-rose-500",
665
+ "touch-none",
666
+ "select-none",
667
+ this.isDragging ? "cursor-grabbing" : "cursor-grab"
668
+ ].join(" ");
669
+ return html`
670
+ <button
671
+ class=${buttonClasses}
672
+ type="button"
673
+ aria-label="Web Inspector"
674
+ data-drag-context="button"
675
+ @pointerdown=${this.handlePointerDown}
676
+ @pointermove=${this.handlePointerMove}
677
+ @pointerup=${this.handlePointerUp}
678
+ @pointercancel=${this.handlePointerCancel}
679
+ @click=${this.handleButtonClick}
680
+ >
681
+ <img src=${logo_mark_default} alt="" class="h-7 w-7" loading="lazy" />
682
+ </button>
683
+ `;
684
+ }
685
+ renderWindow() {
686
+ const windowState = this.contextState.window;
687
+ const windowStyles = {
688
+ width: `${Math.round(windowState.size.width)}px`,
689
+ height: `${Math.round(windowState.size.height)}px`,
690
+ minWidth: `${MIN_WINDOW_WIDTH}px`,
691
+ minHeight: `${MIN_WINDOW_HEIGHT}px`
692
+ };
693
+ const contextDropdown = this.renderContextDropdown();
694
+ const hasContextDropdown = contextDropdown !== nothing;
695
+ return html`
696
+ <section
697
+ 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"
698
+ style=${styleMap(windowStyles)}
699
+ >
700
+ <div class="flex flex-1 overflow-hidden bg-white text-gray-800">
701
+ <nav
702
+ class="flex w-56 shrink-0 flex-col justify-between border-r border-gray-200 bg-gray-50/50 px-3 pb-3 pt-3 text-xs"
703
+ aria-label="Inspector sections"
704
+ >
705
+ <div class="flex flex-col gap-4 overflow-y-auto">
706
+ <div
707
+ class="flex items-center gap-2 pl-1 touch-none select-none ${this.isDragging && this.pointerContext === "window" ? "cursor-grabbing" : "cursor-grab"}"
708
+ data-drag-context="window"
709
+ @pointerdown=${this.handlePointerDown}
710
+ @pointermove=${this.handlePointerMove}
711
+ @pointerup=${this.handlePointerUp}
712
+ @pointercancel=${this.handlePointerCancel}
713
+ >
714
+ <span
715
+ class="flex h-8 w-8 items-center justify-center rounded-lg bg-gray-900 text-white pointer-events-none"
716
+ >
717
+ ${this.renderIcon("Building2")}
718
+ </span>
719
+ <div class="flex flex-1 flex-col leading-tight pointer-events-none">
720
+ <span class="text-sm font-semibold text-gray-900">Acme Inc</span>
721
+ <span class="text-[10px] text-gray-500">Enterprise</span>
722
+ </div>
723
+ </div>
724
+
725
+ <div class="flex flex-col gap-2 pt-2">
726
+ <div class="px-1 text-[10px] font-semibold uppercase tracking-wider text-gray-400">Platform</div>
727
+ <div class="flex flex-col gap-0.5">
728
+ ${this.menuItems.map(({ key, label, icon }) => {
729
+ const isSelected = this.selectedMenu === key;
730
+ const buttonClasses = [
731
+ "group flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-xs transition focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-300",
732
+ isSelected ? "bg-gray-900 text-white" : "text-gray-600 hover:bg-gray-100 hover:text-gray-900"
733
+ ].join(" ");
734
+ const badgeClasses = isSelected ? "bg-gray-800 text-white" : "bg-white border border-gray-200 text-gray-500 group-hover:border-gray-300 group-hover:text-gray-700";
735
+ return html`
736
+ <button
737
+ type="button"
738
+ class=${buttonClasses}
739
+ aria-pressed=${isSelected}
740
+ @click=${() => this.handleMenuSelect(key)}
741
+ >
742
+ <span
743
+ class="flex h-6 w-6 items-center justify-center rounded ${badgeClasses}"
744
+ aria-hidden="true"
745
+ >
746
+ ${this.renderIcon(icon)}
747
+ </span>
748
+ <span class="flex-1">${label}</span>
749
+ <span class="text-gray-400 opacity-60">${this.renderIcon("ChevronRight")}</span>
750
+ </button>
751
+ `;
752
+ })}
753
+ </div>
754
+ </div>
755
+ </div>
756
+
757
+ <div
758
+ class="relative flex items-center rounded-lg border border-gray-200 bg-white px-2 py-2 text-left text-xs text-gray-700 cursor-pointer hover:bg-gray-50 transition"
759
+ >
760
+ <span
761
+ class="w-6 h-6 flex items-center justify-center overflow-hidden rounded bg-gray-100 text-[10px] font-semibold text-gray-700"
762
+ >
763
+ JS
764
+ </span>
765
+ <div class="pl-2 flex flex-1 flex-col leading-tight">
766
+ <span class="font-medium text-gray-900">John Snow</span>
767
+ <span class="text-[10px] text-gray-500">john@snow.com</span>
768
+ </div>
769
+ <span class="text-gray-300">${this.renderIcon("ChevronRight")}</span>
770
+ </div>
771
+ </nav>
772
+ <div class="relative flex flex-1 flex-col overflow-hidden">
773
+ <div
774
+ class="drag-handle flex items-center justify-between border-b border-gray-200 px-4 py-3 touch-none select-none ${this.isDragging && this.pointerContext === "window" ? "cursor-grabbing" : "cursor-grab"}"
775
+ data-drag-context="window"
776
+ @pointerdown=${this.handlePointerDown}
777
+ @pointermove=${this.handlePointerMove}
778
+ @pointerup=${this.handlePointerUp}
779
+ @pointercancel=${this.handlePointerCancel}
780
+ >
781
+ <div class="flex items-center gap-2 text-xs text-gray-500">
782
+ <span class="text-gray-400">
783
+ ${this.renderIcon(this.getSelectedMenu().icon)}
784
+ </span>
785
+ <div class="flex items-center text-xs text-gray-600">
786
+ <span class="pr-3">${this.getSelectedMenu().label}</span>
787
+ ${hasContextDropdown ? html`
788
+ <span class="h-3 w-px bg-gray-200"></span>
789
+ <div class="pl-3">${contextDropdown}</div>
790
+ ` : nothing}
791
+ </div>
792
+ </div>
793
+ <button
794
+ class="flex h-6 w-6 items-center justify-center rounded 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"
795
+ type="button"
796
+ aria-label="Close Web Inspector"
797
+ @pointerdown=${this.handleClosePointerDown}
798
+ @click=${this.handleCloseClick}
799
+ >
800
+ ${this.renderIcon("X")}
801
+ </button>
802
+ </div>
803
+ <div class="flex-1 overflow-auto">
804
+ ${this.renderMainContent()}
805
+ <slot></slot>
806
+ </div>
807
+ </div>
808
+ </div>
809
+ <div
810
+ 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"
811
+ role="presentation"
812
+ aria-hidden="true"
813
+ @pointerdown=${this.handleResizePointerDown}
814
+ @pointermove=${this.handleResizePointerMove}
815
+ @pointerup=${this.handleResizePointerUp}
816
+ @pointercancel=${this.handleResizePointerCancel}
817
+ >
818
+ <svg
819
+ class="h-3 w-3"
820
+ viewBox="0 0 16 16"
821
+ fill="none"
822
+ stroke="currentColor"
823
+ stroke-linecap="round"
824
+ stroke-width="1.5"
825
+ >
826
+ <path d="M5 15L15 5" />
827
+ <path d="M9 15L15 9" />
828
+ </svg>
829
+ </div>
830
+ </section>
831
+ `;
832
+ }
833
+ hydrateStateFromCookie() {
834
+ if (typeof document === "undefined" || typeof window === "undefined") {
835
+ return;
836
+ }
837
+ const persisted = loadInspectorState(COOKIE_NAME);
838
+ if (!persisted) {
839
+ return;
840
+ }
841
+ const persistedButton = persisted.button;
842
+ if (persistedButton) {
843
+ if (isValidAnchor(persistedButton.anchor)) {
844
+ this.contextState.button.anchor = persistedButton.anchor;
845
+ }
846
+ if (isValidPosition(persistedButton.anchorOffset)) {
847
+ this.contextState.button.anchorOffset = persistedButton.anchorOffset;
848
+ }
849
+ if (typeof persistedButton.hasCustomPosition === "boolean") {
850
+ this.hasCustomPosition.button = persistedButton.hasCustomPosition;
851
+ }
852
+ }
853
+ const persistedWindow = persisted.window;
854
+ if (persistedWindow) {
855
+ if (isValidAnchor(persistedWindow.anchor)) {
856
+ this.contextState.window.anchor = persistedWindow.anchor;
857
+ }
858
+ if (isValidPosition(persistedWindow.anchorOffset)) {
859
+ this.contextState.window.anchorOffset = persistedWindow.anchorOffset;
860
+ }
861
+ if (isValidSize(persistedWindow.size)) {
862
+ this.contextState.window.size = this.clampWindowSize(persistedWindow.size);
863
+ }
864
+ if (typeof persistedWindow.hasCustomPosition === "boolean") {
865
+ this.hasCustomPosition.window = persistedWindow.hasCustomPosition;
866
+ }
867
+ }
868
+ }
869
+ get activeContext() {
870
+ return this.isOpen ? "window" : "button";
871
+ }
872
+ measureContext(context) {
873
+ const selector = context === "window" ? ".inspector-window" : ".console-button";
874
+ const element = this.renderRoot?.querySelector(selector);
875
+ if (!element) {
876
+ return;
877
+ }
878
+ const fallback = context === "window" ? DEFAULT_WINDOW_SIZE : DEFAULT_BUTTON_SIZE;
879
+ updateSizeFromElement(this.contextState[context], element, fallback);
880
+ }
881
+ centerContext(context) {
882
+ if (typeof window === "undefined") {
883
+ return;
884
+ }
885
+ const viewport = this.getViewportSize();
886
+ centerContext(this.contextState[context], viewport, EDGE_MARGIN);
887
+ if (context === this.activeContext) {
888
+ this.updateHostTransform(context);
889
+ }
890
+ this.hasCustomPosition[context] = false;
891
+ this.persistState();
892
+ }
893
+ ensureWindowPlacement() {
894
+ if (typeof window === "undefined") {
895
+ return;
896
+ }
897
+ if (!this.hasCustomPosition.window) {
898
+ this.centerContext("window");
899
+ return;
900
+ }
901
+ const viewport = this.getViewportSize();
902
+ keepPositionWithinViewport(this.contextState.window, viewport, EDGE_MARGIN);
903
+ updateAnchorFromPosition(this.contextState.window, viewport, EDGE_MARGIN);
904
+ this.updateHostTransform("window");
905
+ this.persistState();
906
+ }
907
+ constrainToViewport(position, context) {
908
+ if (typeof window === "undefined") {
909
+ return position;
910
+ }
911
+ const viewport = this.getViewportSize();
912
+ return constrainToViewport(this.contextState[context], position, viewport, EDGE_MARGIN);
913
+ }
914
+ keepPositionWithinViewport(context) {
915
+ if (typeof window === "undefined") {
916
+ return;
917
+ }
918
+ const viewport = this.getViewportSize();
919
+ keepPositionWithinViewport(this.contextState[context], viewport, EDGE_MARGIN);
920
+ }
921
+ getViewportSize() {
922
+ if (typeof window === "undefined") {
923
+ return { ...DEFAULT_WINDOW_SIZE };
924
+ }
925
+ return { width: window.innerWidth, height: window.innerHeight };
926
+ }
927
+ persistState() {
928
+ const state = {
929
+ button: {
930
+ anchor: this.contextState.button.anchor,
931
+ anchorOffset: this.contextState.button.anchorOffset,
932
+ hasCustomPosition: this.hasCustomPosition.button
933
+ },
934
+ window: {
935
+ anchor: this.contextState.window.anchor,
936
+ anchorOffset: this.contextState.window.anchorOffset,
937
+ size: {
938
+ width: Math.round(this.contextState.window.size.width),
939
+ height: Math.round(this.contextState.window.size.height)
940
+ },
941
+ hasCustomPosition: this.hasCustomPosition.window
942
+ }
943
+ };
944
+ saveInspectorState(COOKIE_NAME, state, COOKIE_MAX_AGE_SECONDS);
945
+ }
946
+ clampWindowSize(size) {
947
+ if (typeof window === "undefined") {
948
+ return {
949
+ width: Math.max(MIN_WINDOW_WIDTH, size.width),
950
+ height: Math.max(MIN_WINDOW_HEIGHT, size.height)
951
+ };
952
+ }
953
+ const viewport = this.getViewportSize();
954
+ return clampSize(size, viewport, EDGE_MARGIN, MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT);
955
+ }
956
+ updateHostTransform(context = this.activeContext) {
957
+ if (context !== this.activeContext) {
958
+ return;
959
+ }
960
+ const { position } = this.contextState[context];
961
+ this.style.transform = `translate3d(${position.x}px, ${position.y}px, 0)`;
962
+ }
963
+ setDragging(value) {
964
+ if (this.isDragging !== value) {
965
+ this.isDragging = value;
966
+ this.requestUpdate();
967
+ }
968
+ }
969
+ updateAnchorFromPosition(context) {
970
+ if (typeof window === "undefined") {
971
+ return;
972
+ }
973
+ const viewport = this.getViewportSize();
974
+ updateAnchorFromPosition(this.contextState[context], viewport, EDGE_MARGIN);
975
+ }
976
+ applyAnchorPosition(context) {
977
+ if (typeof window === "undefined") {
978
+ return;
979
+ }
980
+ const viewport = this.getViewportSize();
981
+ applyAnchorPosition(this.contextState[context], viewport, EDGE_MARGIN);
982
+ this.updateHostTransform(context);
983
+ this.persistState();
984
+ }
985
+ resetResizeTracking() {
986
+ this.resizePointerId = null;
987
+ this.resizeStart = null;
988
+ this.resizeInitialSize = null;
989
+ this.isResizing = false;
990
+ }
991
+ resetPointerTracking() {
992
+ this.pointerId = null;
993
+ this.dragStart = null;
994
+ this.pointerContext = null;
995
+ this.setDragging(false);
996
+ this.draggedDuringInteraction = false;
997
+ }
998
+ openInspector() {
999
+ if (this.isOpen) {
1000
+ return;
1001
+ }
1002
+ this.isOpen = true;
1003
+ this.ensureWindowPlacement();
1004
+ this.requestUpdate();
1005
+ void this.updateComplete.then(() => {
1006
+ this.measureContext("window");
1007
+ if (this.hasCustomPosition.window) {
1008
+ this.applyAnchorPosition("window");
1009
+ } else {
1010
+ this.centerContext("window");
1011
+ }
1012
+ });
1013
+ }
1014
+ closeInspector() {
1015
+ if (!this.isOpen) {
1016
+ return;
1017
+ }
1018
+ this.isOpen = false;
1019
+ this.updateHostTransform("button");
1020
+ this.requestUpdate();
1021
+ void this.updateComplete.then(() => {
1022
+ this.measureContext("button");
1023
+ this.applyAnchorPosition("button");
1024
+ });
1025
+ }
1026
+ renderIcon(name) {
1027
+ const iconNode = icons[name];
1028
+ if (!iconNode) {
1029
+ return nothing;
1030
+ }
1031
+ const svgAttrs = {
1032
+ xmlns: "http://www.w3.org/2000/svg",
1033
+ viewBox: "0 0 24 24",
1034
+ fill: "none",
1035
+ stroke: "currentColor",
1036
+ "stroke-width": "1.5",
1037
+ "stroke-linecap": "round",
1038
+ "stroke-linejoin": "round",
1039
+ class: "h-3.5 w-3.5"
1040
+ };
1041
+ const svgMarkup = `<svg ${this.serializeAttributes(svgAttrs)}>${iconNode.map(([tag, attrs]) => `<${tag} ${this.serializeAttributes(attrs)} />`).join("")}</svg>`;
1042
+ return unsafeHTML(svgMarkup);
1043
+ }
1044
+ serializeAttributes(attributes) {
1045
+ return Object.entries(attributes).filter(([key, value]) => key !== "key" && value !== void 0 && value !== null && value !== "").map(([key, value]) => `${key}="${String(value).replace(/"/g, "&quot;")}"`).join(" ");
1046
+ }
1047
+ getSelectedMenu() {
1048
+ const found = this.menuItems.find((item) => item.key === this.selectedMenu);
1049
+ return found ?? this.menuItems[0];
1050
+ }
1051
+ renderMainContent() {
1052
+ if (this.selectedMenu === "ag-ui-events") {
1053
+ return this.renderEventsTable();
1054
+ }
1055
+ return html`
1056
+ <div class="flex flex-col gap-3 p-4">
1057
+ <div class="h-24 rounded-lg bg-gray-50"></div>
1058
+ <div class="h-20 rounded-lg bg-gray-50"></div>
1059
+ </div>
1060
+ `;
1061
+ }
1062
+ renderEventsTable() {
1063
+ const events = this.getEventsForSelectedContext();
1064
+ if (events.length === 0) {
1065
+ return html`
1066
+ <div class="flex h-full items-center justify-center px-4 py-8 text-xs text-gray-500">
1067
+ No events yet. Trigger an agent run to see live activity.
1068
+ </div>
1069
+ `;
1070
+ }
1071
+ return html`
1072
+ <div class="overflow-hidden">
1073
+ <table class="w-full border-collapse text-xs">
1074
+ <thead>
1075
+ <tr class="bg-white">
1076
+ <th class="border-r border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900">
1077
+ Type
1078
+ </th>
1079
+ <th class="border-r border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900">
1080
+ Time
1081
+ </th>
1082
+ <th class="border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900">
1083
+ Payload
1084
+ </th>
1085
+ </tr>
1086
+ </thead>
1087
+ <tbody>
1088
+ ${events.map((event, index) => {
1089
+ const isLastRow = index === events.length - 1;
1090
+ const rowBg = index % 2 === 0 ? "bg-white" : "bg-gray-50/50";
1091
+ const badgeClasses = this.getEventBadgeClasses(event.type);
1092
+ const inlinePayload = this.stringifyPayload(event.payload, false) || "\u2014";
1093
+ const prettyPayload = this.stringifyPayload(event.payload, true) || inlinePayload;
1094
+ const isExpanded = this.expandedRows.has(event.id);
1095
+ return html`
1096
+ <tr
1097
+ class="${rowBg} transition hover:bg-blue-50/50"
1098
+ @click=${() => this.toggleRowExpansion(event.id)}
1099
+ >
1100
+ <td class="border-r ${!isLastRow ? "border-b" : ""} border-gray-200 px-3 py-2">
1101
+ <div class="flex flex-col gap-1">
1102
+ <span class=${badgeClasses}>${event.type}</span>
1103
+ <span class="font-mono text-[10px] text-gray-400">${event.agentId}</span>
1104
+ </div>
1105
+ </td>
1106
+ <td class="border-r ${!isLastRow ? "border-b" : ""} border-gray-200 px-3 py-2 font-mono text-[11px] text-gray-600">
1107
+ <span title=${new Date(event.timestamp).toLocaleString()}>
1108
+ ${new Date(event.timestamp).toLocaleTimeString()}
1109
+ </span>
1110
+ </td>
1111
+ <td class="${!isLastRow ? "border-b" : ""} border-gray-200 px-3 py-2 font-mono text-[10px] text-gray-600 ${isExpanded ? "" : "truncate max-w-xs"}">
1112
+ ${isExpanded ? html`<pre class="m-0 whitespace-pre-wrap text-[10px] font-mono text-gray-600">${prettyPayload}</pre>` : inlinePayload}
1113
+ </td>
1114
+ </tr>
1115
+ `;
1116
+ })}
1117
+ </tbody>
1118
+ </table>
1119
+ </div>
1120
+ `;
1121
+ }
1122
+ renderContextDropdown() {
1123
+ if (this.selectedMenu !== "ag-ui-events") {
1124
+ return nothing;
1125
+ }
1126
+ const selectedLabel = this.contextOptions.find((opt) => opt.key === this.selectedContext)?.label ?? "";
1127
+ return html`
1128
+ <div class="relative" data-context-dropdown-root="true">
1129
+ <button
1130
+ type="button"
1131
+ class="flex items-center gap-1.5 rounded-md px-2 py-0.5 text-xs font-medium text-gray-600 transition hover:bg-gray-100 hover:text-gray-900"
1132
+ @pointerdown=${this.handleContextDropdownToggle}
1133
+ >
1134
+ <span>${selectedLabel}</span>
1135
+ <span class="text-gray-400">${this.renderIcon("ChevronDown")}</span>
1136
+ </button>
1137
+ ${this.contextMenuOpen ? html`
1138
+ <div
1139
+ 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"
1140
+ data-context-dropdown-root="true"
1141
+ >
1142
+ ${this.contextOptions.map(
1143
+ (option) => html`
1144
+ <button
1145
+ type="button"
1146
+ 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"
1147
+ data-context-dropdown-root="true"
1148
+ @click=${() => this.handleContextOptionSelect(option.key)}
1149
+ >
1150
+ <span class="${option.key === this.selectedContext ? "text-gray-900 font-medium" : "text-gray-600"}">${option.label}</span>
1151
+ ${option.key === this.selectedContext ? html`<span class="text-gray-500">${this.renderIcon("Check")}</span>` : nothing}
1152
+ </button>
1153
+ `
1154
+ )}
1155
+ </div>
1156
+ ` : nothing}
1157
+ </div>
1158
+ `;
1159
+ }
1160
+ handleMenuSelect(key) {
1161
+ if (!this.menuItems.some((item) => item.key === key)) {
1162
+ return;
1163
+ }
1164
+ this.selectedMenu = key;
1165
+ this.contextMenuOpen = false;
1166
+ this.requestUpdate();
1167
+ }
1168
+ handleContextDropdownToggle(event) {
1169
+ event.preventDefault();
1170
+ event.stopPropagation();
1171
+ this.contextMenuOpen = !this.contextMenuOpen;
1172
+ this.requestUpdate();
1173
+ }
1174
+ handleContextOptionSelect(key) {
1175
+ if (!this.contextOptions.some((option) => option.key === key)) {
1176
+ return;
1177
+ }
1178
+ if (this.selectedContext !== key) {
1179
+ this.selectedContext = key;
1180
+ this.expandedRows.clear();
1181
+ }
1182
+ this.contextMenuOpen = false;
1183
+ this.requestUpdate();
1184
+ }
1185
+ toggleRowExpansion(eventId) {
1186
+ if (this.expandedRows.has(eventId)) {
1187
+ this.expandedRows.delete(eventId);
1188
+ } else {
1189
+ this.expandedRows.add(eventId);
1190
+ }
1191
+ this.requestUpdate();
1192
+ }
1193
+ };
1194
+ function defineWebInspector() {
1195
+ if (!customElements.get(WEB_INSPECTOR_TAG)) {
1196
+ customElements.define(WEB_INSPECTOR_TAG, WebInspectorElement);
1197
+ }
1198
+ }
1199
+ defineWebInspector();
1200
+ export {
1201
+ WEB_INSPECTOR_TAG,
1202
+ WebInspectorElement,
1203
+ defineWebInspector
1204
+ };
1205
+ //# sourceMappingURL=index.mjs.map