@copilotkitnext/web-inspector 0.0.14 → 0.0.16
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/.turbo/turbo-build$colon$css.log +9 -0
- package/.turbo/turbo-build.log +23 -29
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/styles/generated.css","../src/lib/context-helpers.ts","../src/lib/persistence.ts"],"sourcesContent":["import { LitElement, css, html, nothing, unsafeCSS } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport tailwindStyles from \"./styles/generated.css\";\nimport logoMarkUrl from \"./assets/logo-mark.svg\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { icons } from \"lucide\";\nimport type { CopilotKitCore, CopilotKitCoreSubscriber } from \"@copilotkitnext/core\";\nimport type { AbstractAgent, AgentSubscriber } from \"@ag-ui/client\";\nimport type { Anchor, ContextKey, ContextState, DockMode, Position, Size } 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 = \"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 COOKIE_NAME = \"copilotkit_inspector_state\";\nconst COOKIE_MAX_AGE_SECONDS = 60 * 60 * 24 * 30; // 30 days\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 InspectorEvent = {\n id: string;\n agentId: string;\n type: string;\n timestamp: number;\n payload: unknown;\n};\n\nexport class WebInspectorElement extends LitElement {\n static properties = {\n core: { attribute: false },\n } as const;\n\n private _core: CopilotKitCore | null = null;\n private coreSubscriber: CopilotKitCoreSubscriber | null = null;\n private coreUnsubscribe: (() => void) | null = null;\n private agentSubscriptions: Map<string, () => void> = new Map();\n private agentEvents: Map<string, InspectorEvent[]> = new Map();\n private agentMessages: Map<string, unknown[]> = new Map();\n private agentStates: Map<string, unknown> = new Map();\n private flattenedEvents: InspectorEvent[] = [];\n private eventCounter = 0;\n private contextStore: Record<string, { description?: string; value: unknown }> = {};\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 pendingSelectedContext: string | null = null;\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: \"bottom\" },\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: \"bottom\" },\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: \"Agents\", icon: \"Bot\" },\n { key: \"frontend-tools\", label: \"Frontend Tools\", icon: \"Hammer\" },\n { key: \"agent-context\", label: \"Agent Context\", icon: \"FileText\" },\n ];\n\n private attachToCore(core: CopilotKitCore): void {\n this.coreSubscriber = {\n onAgentsChanged: ({ agents }) => {\n this.processAgentsChanged(agents);\n },\n onContextChanged: ({ context }) => {\n this.contextStore = { ...context };\n this.requestUpdate();\n },\n } satisfies CopilotKitCoreSubscriber;\n\n this.coreUnsubscribe = core.subscribe(this.coreSubscriber);\n this.processAgentsChanged(core.agents);\n\n // Initialize context from core\n if (core.context) {\n this.contextStore = { ...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.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(agents: Readonly<Record<string, AbstractAgent>>): 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.requestUpdate();\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\", { event, textMessageBuffer });\n },\n onTextMessageEndEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_END\", { event, textMessageBuffer });\n },\n onToolCallStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_START\", event);\n },\n onToolCallArgsEvent: ({ event, toolCallBuffer, toolCallName, partialToolCallArgs }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_ARGS\", { event, toolCallBuffer, toolCallName, partialToolCallArgs });\n },\n onToolCallEndEvent: ({ event, toolCallArgs, toolCallName }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_END\", { event, toolCallArgs, toolCallName });\n },\n onToolCallResultEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_RESULT\", event);\n },\n onStateSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_SNAPSHOT\", event);\n this.syncAgentState(agent);\n },\n onStateDeltaEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_DELTA\", event);\n this.syncAgentState(agent);\n },\n onMessagesSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"MESSAGES_SNAPSHOT\", event);\n this.syncAgentMessages(agent);\n },\n onMessagesChanged: () => {\n this.syncAgentMessages(agent);\n },\n onRawEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RAW_EVENT\", event);\n },\n onCustomEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"CUSTOM_EVENT\", event);\n },\n };\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(agentId: string, type: string, payload: unknown): void {\n const eventId = `${agentId}:${++this.eventCounter}`;\n const event: InspectorEvent = {\n id: eventId,\n agentId,\n type,\n timestamp: Date.now(),\n payload,\n };\n\n const currentAgentEvents = this.agentEvents.get(agentId) ?? [];\n const nextAgentEvents = [event, ...currentAgentEvents].slice(0, MAX_AGENT_EVENTS);\n this.agentEvents.set(agentId, nextAgentEvents);\n\n this.flattenedEvents = [event, ...this.flattenedEvents].slice(0, MAX_TOTAL_EVENTS);\n this.requestUpdate();\n }\n\n private syncAgentMessages(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const messages = (agent as { messages?: unknown }).messages;\n\n if (Array.isArray(messages)) {\n this.agentMessages.set(agent.agentId, messages);\n } else {\n this.agentMessages.delete(agent.agentId);\n }\n\n this.requestUpdate();\n }\n\n private syncAgentState(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const state = (agent as { state?: unknown }).state;\n\n if (state === undefined || state === null) {\n this.agentStates.delete(agent.agentId);\n } else {\n this.agentStates.set(agent.agentId, state);\n }\n\n this.requestUpdate();\n }\n\n private updateContextOptions(agentIds: Set<string>): void {\n const nextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ...Array.from(agentIds)\n .sort((a, b) => a.localeCompare(b))\n .map((id) => ({ key: id, label: id })),\n ];\n\n const optionsChanged =\n this.contextOptions.length !== nextOptions.length ||\n this.contextOptions.some((option, index) => option.key !== nextOptions[index]?.key);\n\n if (optionsChanged) {\n this.contextOptions = nextOptions;\n }\n\n const pendingContext = this.pendingSelectedContext;\n if (pendingContext) {\n const isPendingAvailable = 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((option) => option.key === this.selectedContext);\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) => a.localeCompare(b))[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 getLatestStateForAgent(agentId: string): unknown | null {\n if (this.agentStates.has(agentId)) {\n return this.agentStates.get(agentId);\n }\n\n const events = this.agentEvents.get(agentId) ?? [];\n const stateEvent = events.find((e) => e.type === \"STATE_SNAPSHOT\");\n return stateEvent?.payload ?? null;\n }\n\n private getLatestMessagesForAgent(agentId: string): unknown[] | 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((e) => e.type === \"RUN_STARTED\" || e.type === \"RUN_FINISHED\" || e.type === \"RUN_ERROR\");\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): { totalEvents: number; lastActivity: number | null; messages: number; toolCalls: number; errors: number } {\n const events = this.agentEvents.get(agentId) ?? [];\n\n const messages = this.agentMessages.get(agentId);\n\n const toolCallCount = Array.isArray(messages)\n ? (messages as unknown[]).reduce<number>((count, rawMessage) => {\n if (!rawMessage || typeof rawMessage !== 'object') {\n return count;\n }\n\n const toolCalls = (rawMessage as { toolCalls?: unknown }).toolCalls;\n if (!Array.isArray(toolCalls)) {\n return count;\n }\n\n return count + toolCalls.length;\n }, 0)\n : events.filter((e) => e.type === \"TOOL_CALL_END\").length;\n\n const messageCount = Array.isArray(messages) ? 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: unknown[]) {\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 toolCall = call as any;\n const functionName = typeof toolCall?.function?.name === 'string' ? toolCall.function.name : 'Unknown function';\n const callId = typeof toolCall?.id === 'string' ? toolCall.id : `tool-call-${index + 1}`;\n const argsString = this.formatToolCallArguments(toolCall?.function?.arguments);\n return html`\n <div class=\"rounded-md border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700\">\n <div class=\"flex flex-wrap items-center justify-between gap-1 font-medium text-gray-900\">\n <span>${functionName}</span>\n <span class=\"text-[10px] text-gray-500\">ID: ${callId}</span>\n </div>\n ${argsString\n ? html`<pre class=\"mt-2 overflow-auto rounded bg-white p-2 text-[11px] leading-relaxed text-gray-800\">${argsString}</pre>`\n : nothing}\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 (error) {\n return args;\n }\n }\n\n if (typeof args === 'object') {\n try {\n return JSON.stringify(args, null, 2);\n } catch (error) {\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 = \"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(\"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 any).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: width 300ms ease, 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 ];\n\n connectedCallback(): void {\n super.connectedCallback();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n window.addEventListener(\"pointerdown\", this.handleGlobalPointerDown as EventListener);\n\n // Load state early (before first render) so menu selection is correct\n this.hydrateStateFromCookieEarly();\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"resize\", this.handleResize);\n window.removeEventListener(\"pointerdown\", this.handleGlobalPointerDown as EventListener);\n }\n this.removeDockStyles(); // Clean up any docking styles\n this.detachFromCore();\n }\n\n firstUpdated(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n this.measureContext(\"button\");\n this.measureContext(\"window\");\n\n this.contextState.button.anchor = { horizontal: \"right\", vertical: \"bottom\" };\n this.contextState.button.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.contextState.window.anchor = { horizontal: \"right\", vertical: \"bottom\" };\n this.contextState.window.anchorOffset = { x: EDGE_MARGIN, y: EDGE_MARGIN };\n\n this.hydrateStateFromCookie();\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.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 \"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=${this.isDragging && this.pointerContext === \"button\" ? \"true\" : \"false\"}\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n @click=${this.handleButtonClick}\n >\n <img src=${logoMarkUrl} alt=\"\" class=\"h-7 w-7\" loading=\"lazy\" />\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 const isCollapsed = this.dockMode === 'docked-left';\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 contextDropdown = this.renderContextDropdown();\n const hasContextDropdown = contextDropdown !== nothing;\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 ${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 <div class=\"flex flex-1 overflow-hidden bg-white text-gray-800\">\n <nav\n class=\"flex ${isCollapsed ? 'w-16' : '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 transition-all duration-300\"\n aria-label=\"Inspector sections\"\n >\n <div class=\"flex flex-col gap-4 overflow-y-auto\">\n <div\n class=\"flex items-center ${isCollapsed ? 'justify-center' : 'gap-2 pl-1'} touch-none select-none ${this.isDragging && this.pointerContext === 'window' ? 'cursor-grabbing' : 'cursor-grab'}\"\n data-drag-context=\"window\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n title=\"${isCollapsed ? 'Acme Inc - Enterprise' : ''}\"\n >\n <span\n class=\"flex h-8 w-8 items-center justify-center rounded-lg bg-gray-900 text-white pointer-events-none\"\n >\n ${this.renderIcon(\"Building2\")}\n </span>\n ${!isCollapsed\n ? html`\n <div class=\"flex flex-1 flex-col leading-tight pointer-events-none\">\n <span class=\"text-sm font-semibold text-gray-900\">Acme Inc</span>\n <span class=\"text-[10px] text-gray-500\">Enterprise</span>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"flex flex-col gap-2 pt-2\">\n ${!isCollapsed\n ? html`<div class=\"px-1 text-[10px] font-semibold uppercase tracking-wider text-gray-400\">Platform</div>`\n : nothing}\n <div class=\"flex flex-col gap-0.5\">\n ${this.menuItems.map(({ key, label, icon }) => {\n const isSelected = this.selectedMenu === key;\n const buttonClasses = [\n \"group flex w-full items-center\",\n isCollapsed ? \"justify-center p-2\" : \"gap-2 px-2 py-1.5\",\n \"rounded-md text-left text-xs 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\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n ].join(\" \");\n\n const badgeClasses = isSelected\n ? \"bg-gray-800 text-white\"\n : \"bg-white border border-gray-200 text-gray-500 group-hover:border-gray-300 group-hover:text-gray-700\";\n\n return html`\n <button\n type=\"button\"\n class=${buttonClasses}\n aria-pressed=${isSelected}\n title=\"${isCollapsed ? label : ''}\"\n @click=${() => this.handleMenuSelect(key)}\n >\n <span\n class=\"flex h-6 w-6 items-center justify-center rounded ${isCollapsed && isSelected ? 'text-white' : isCollapsed ? 'text-gray-600' : badgeClasses}\"\n aria-hidden=\"true\"\n >\n ${this.renderIcon(icon)}\n </span>\n ${!isCollapsed\n ? html`\n <span class=\"flex-1\">${label}</span>\n <span class=\"text-gray-400 opacity-60\">${this.renderIcon(\"ChevronRight\")}</span>\n `\n : nothing}\n </button>\n `;\n })}\n </div>\n </div>\n </div>\n\n <div\n class=\"relative flex items-center ${isCollapsed ? 'justify-center p-1' : ''} rounded-lg border border-gray-200 bg-white ${isCollapsed ? '' : 'px-2 py-2'} text-left text-xs text-gray-700 cursor-pointer hover:bg-gray-50 transition\"\n title=\"${isCollapsed ? 'John Snow - john@snow.com' : ''}\"\n >\n <span\n class=\"${isCollapsed ? 'w-8 h-8 shrink-0' : 'w-6 h-6'} flex items-center justify-center overflow-hidden rounded bg-gray-100 text-[10px] font-semibold text-gray-700\"\n >\n JS\n </span>\n ${!isCollapsed\n ? html`\n <div class=\"pl-2 flex flex-1 flex-col leading-tight\">\n <span class=\"font-medium text-gray-900\">John Snow</span>\n <span class=\"text-[10px] text-gray-500\">john@snow.com</span>\n </div>\n <span class=\"text-gray-300\">${this.renderIcon(\"ChevronRight\")}</span>\n `\n : nothing}\n </div>\n </nav>\n <div class=\"relative flex flex-1 flex-col overflow-hidden\">\n <div\n class=\"drag-handle flex items-center justify-between border-b border-gray-200 px-4 py-3 touch-none select-none ${isDocked ? '' : (this.isDragging && this.pointerContext === 'window' ? 'cursor-grabbing' : 'cursor-grab')}\"\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 min-w-0 flex-1 items-center gap-2 text-xs text-gray-500\">\n <div class=\"flex min-w-0 flex-1 items-center text-xs text-gray-600\">\n <span class=\"flex shrink-0 items-center gap-1\">\n <span>🪁</span>\n <span class=\"font-medium whitespace-nowrap\">CopilotKit Inspector</span>\n </span>\n <span class=\"mx-3 h-3 w-px shrink-0 bg-gray-200\"></span>\n <span class=\"shrink-0 text-gray-400\">\n ${this.renderIcon(this.getSelectedMenu().icon)}\n </span>\n <span class=\"ml-2 truncate\">${this.getSelectedMenu().label}</span>\n ${hasContextDropdown\n ? html`\n <span class=\"mx-3 h-3 w-px shrink-0 bg-gray-200\"></span>\n <div class=\"min-w-0\">${contextDropdown}</div>\n `\n : nothing}\n </div>\n </div>\n <div class=\"flex items-center gap-1\">\n ${this.renderDockControls()}\n <button\n 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\"\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 class=\"flex-1 overflow-auto\">\n ${this.renderMainContent()}\n <slot></slot>\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 hydrateStateFromCookieEarly(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(COOKIE_NAME);\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((item) => item.key === persisted.selectedMenu);\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 hydrateStateFromCookie(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(COOKIE_NAME);\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(persistedWindow.size);\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 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 (this.pointerId !== event.pointerId || !this.dragStart || !this.pointerContext) {\n return;\n }\n\n const distance = Math.hypot(event.clientX - this.dragStart.x, event.clientY - this.dragStart.y);\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 (context === \"button\" && !this.isOpen && !this.draggedDuringInteraction) {\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 (!this.isResizing || this.resizePointerId !== event.pointerId || !this.resizeStart || !this.resizeInitialSize) {\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 = context === \"window\" ? \".inspector-window\" : \".console-button\";\n const element = this.renderRoot?.querySelector(selector) as HTMLElement | null;\n if (!element) {\n return;\n }\n const fallback = 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(this.contextState.window, viewport, EDGE_MARGIN);\n this.updateHostTransform(\"window\");\n this.persistState();\n }\n\n private constrainToViewport(position: Position, context: ContextKey): Position {\n if (typeof window === \"undefined\") {\n return position;\n }\n\n const viewport = this.getViewportSize();\n return constrainToViewport(this.contextState[context], position, viewport, EDGE_MARGIN);\n }\n\n private keepPositionWithinViewport(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(this.contextState[context], viewport, EDGE_MARGIN);\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(COOKIE_NAME, state, COOKIE_MAX_AGE_SECONDS);\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 = this.dockMode === 'docked-left' ? MIN_WINDOW_WIDTH_DOCKED_LEFT : 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(size, viewport, EDGE_MARGIN, minWidth, MIN_WINDOW_HEIGHT);\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 const previousMode = this.dockMode;\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 setTimeout(() => {\n if (document.body) {\n document.body.style.transition = '';\n }\n }, 300);\n }\n }\n\n private removeDockStyles(): void {\n if (typeof document === 'undefined' || !document.body) {\n return;\n }\n\n // Only add transition if not resizing\n if (!this.isResizing) {\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 setTimeout(() => {\n if (document.body) {\n document.body.style.transition = '';\n }\n }, 300);\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(this.contextState[context], viewport, EDGE_MARGIN);\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'] = centerX < viewport.width / 2 ? 'left' : 'right';\n const vertical: Anchor['vertical'] = 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(this.contextState[context], viewport, EDGE_MARGIN);\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.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-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\"\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-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\"\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(attributes: Record<string, string | number | undefined>): string {\n return Object.entries(attributes)\n .filter(([key, value]) => key !== \"key\" && value !== undefined && value !== null && value !== \"\")\n .map(([key, value]) => `${key}=\"${String(value).replace(/\"/g, \""\")}\"`)\n .join(\" \");\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\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 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 // Default placeholder content for other sections\n return html`\n <div class=\"flex flex-col gap-3 p-4\">\n <div class=\"h-24 rounded-lg bg-gray-50\"></div>\n <div class=\"h-20 rounded-lg bg-gray-50\"></div>\n </div>\n `;\n }\n\n private renderEventsTable() {\n const events = this.getEventsForSelectedContext();\n\n if (events.length === 0) {\n return html`\n <div class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Trigger an agent run to see live activity.</p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"relative h-full overflow-auto\">\n <table class=\"w-full border-separate border-spacing-0 text-xs\">\n <thead class=\"sticky top-0 z-10\">\n <tr class=\"bg-white\">\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Agent\n </th>\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Time\n </th>\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Event Type\n </th>\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n AG-UI Event\n </th>\n </tr>\n </thead>\n <tbody>\n ${events.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(event.payload);\n const inlineEvent = this.stringifyPayload(extractedEvent, false) || \"—\";\n const prettyEvent = 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 class=\"border-l border-r border-b border-gray-200 px-3 py-2\">\n <span class=\"font-mono text-[11px] text-gray-600\">${event.agentId}</span>\n </td>\n <td class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[11px] text-gray-600\">\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 class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[10px] text-gray-600 ${isExpanded ? '' : 'truncate max-w-xs'}\">\n ${isExpanded\n ? html`\n <div class=\"group relative\">\n <pre class=\"m-0 whitespace-pre-wrap text-[10px] font-mono text-gray-600\">${prettyEvent}</pre>\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 ${this.copiedEvents.has(event.id)\n ? html`<span>✓ Copied</span>`\n : html`<span>Copy</span>`}\n </button>\n </div>\n `\n : inlineEvent}\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n </div>\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 class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Select an agent from the dropdown above to view details.</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 class=\"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 text-blue-600\">\n ${this.renderIcon(\"Bot\")}\n </div>\n <div>\n <h3 class=\"font-semibold text-sm text-gray-900\">${agentId}</h3>\n <span class=\"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium ${statusColors[status]} relative -translate-y-[2px]\">\n <span class=\"h-1.5 w-1.5 rounded-full ${status === 'running' ? 'bg-emerald-500 animate-pulse' : status === 'error' ? 'bg-rose-500' : 'bg-gray-400'}\"></span>\n ${status.charAt(0).toUpperCase() + status.slice(1)}\n </span>\n </div>\n </div>\n ${stats.lastActivity\n ? html`<span class=\"text-xs text-gray-500\">Last activity: ${new Date(stats.lastActivity).toLocaleTimeString()}</span>`\n : nothing}\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\">Total Events</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.totalEvents}</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\">Messages</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.messages}</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\">Tool Calls</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.toolCalls}</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\">Errors</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.errors}</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 ${this.hasRenderableState(state)\n ? html`\n <pre class=\"overflow-auto rounded-md bg-gray-50 p-3 text-xs text-gray-800 max-h-64\"><code>${this.formatStateForDisplay(state)}</code></pre>\n `\n : html`\n <div class=\"flex h-40 items-center justify-center text-xs text-gray-500\">\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\">${this.renderIcon(\"Database\")}</span>\n <span>State is empty</span>\n </div>\n </div>\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\">Current Messages</h4>\n </div>\n <div class=\"overflow-auto\">\n ${messages && Array.isArray(messages) && messages.length > 0\n ? html`\n <table class=\"w-full text-xs\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th class=\"px-4 py-2 text-left font-medium text-gray-700\">Role</th>\n <th class=\"px-4 py-2 text-left font-medium text-gray-700\">Content</th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200\">\n ${messages.map((msg: any, idx: number) => {\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 unknown: \"bg-gray-100 text-gray-600\",\n };\n\n const rawContent = typeof msg?.content === \"string\"\n ? msg.content\n : msg?.content != null\n ? JSON.stringify(msg.content)\n : \"\";\n\n const toolCalls = Array.isArray(msg?.toolCalls) ? msg.toolCalls : [];\n const hasContent = rawContent.trim().length > 0;\n const contentFallback = toolCalls.length > 0\n ? \"Invoked tool call\"\n : \"—\";\n\n return html`\n <tr>\n <td class=\"px-4 py-2 align-top\">\n <span class=\"inline-flex rounded px-2 py-0.5 text-[10px] font-medium ${roleColors[role] || roleColors.unknown}\">\n ${role}\n </span>\n </td>\n <td class=\"px-4 py-2\">\n ${hasContent\n ? html`<div class=\"max-w-2xl whitespace-pre-wrap break-words text-gray-700\">${rawContent}</div>`\n : html`<div class=\"text-xs italic text-gray-400\">${contentFallback}</div>`}\n ${role === 'assistant' && toolCalls.length > 0\n ? this.renderToolCallDetails(toolCalls)\n : nothing}\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n `\n : html`\n <div class=\"flex h-40 items-center justify-center text-xs text-gray-500\">\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\">${this.renderIcon(\"MessageSquare\")}</span>\n <span>No messages available</span>\n </div>\n </div>\n `}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextDropdown() {\n // Agent Context doesn't use the dropdown - it's global\n if (this.selectedMenu === \"agent-context\") {\n return nothing;\n }\n\n if (this.selectedMenu !== \"ag-ui-events\" && this.selectedMenu !== \"agents\" && this.selectedMenu !== \"frontend-tools\") {\n return nothing;\n }\n\n // Filter out \"all-agents\" when in agents view\n const filteredOptions = this.selectedMenu === \"agents\"\n ? this.contextOptions.filter((opt) => opt.key !== \"all-agents\")\n : this.contextOptions;\n\n const selectedLabel = filteredOptions.find((opt) => opt.key === this.selectedContext)?.label ?? \"\";\n\n return html`\n <div class=\"relative min-w-0 flex-1\" data-context-dropdown-root=\"true\">\n <button\n type=\"button\"\n class=\"flex w-full min-w-0 max-w-[150px] 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\"\n @pointerdown=${this.handleContextDropdownToggle}\n >\n <span class=\"truncate flex-1 text-left\">${selectedLabel}</span>\n <span class=\"shrink-0 text-gray-400\">${this.renderIcon(\"ChevronDown\")}</span>\n </button>\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 class=\"truncate ${option.key === this.selectedContext ? 'text-gray-900 font-medium' : 'text-gray-600'}\">${option.label}</span>\n ${option.key === this.selectedContext\n ? html`<span class=\"text-gray-500\">${this.renderIcon(\"Check\")}</span>`\n : nothing}\n </button>\n `,\n )}\n </div>\n `\n : nothing}\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((opt) => opt.key !== \"all-agents\");\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 ? defaultAgent.key : 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 class=\"flex h-full items-center justify-center px-4 py-8 text-xs text-gray-500\">\n No core instance available\n </div>\n `;\n }\n\n const allTools = this.extractToolsFromAgents();\n\n if (allTools.length === 0) {\n return html`\n <div class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Tools will appear here once agents are configured with tool handlers or renderers.</p>\n </div>\n </div>\n `;\n }\n\n // Filter tools by selected agent\n const filteredTools = this.selectedContext === \"all-agents\"\n ? allTools\n : allTools.filter(tool => tool.agentId === this.selectedContext);\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(): Array<{\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: 'handler' | 'renderer';\n }> {\n if (!this._core) {\n return [];\n }\n\n const tools: Array<{\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: 'handler' | 'renderer';\n }> = [];\n\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 any).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 any;\n tools.push({\n agentId,\n name: toolName,\n description: handlerObj.description || handlerObj.tool?.description,\n parameters: handlerObj.parameters || handlerObj.tool?.parameters,\n type: 'handler',\n });\n }\n }\n }\n\n // Try to extract tool renderers\n const renderers = (agent as any).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 (!tools.some(t => t.agentId === agentId && t.name === toolName)) {\n if (renderer && typeof renderer === 'object') {\n const rendererObj = renderer as any;\n tools.push({\n agentId,\n name: toolName,\n description: rendererObj.description || rendererObj.tool?.description,\n parameters: rendererObj.parameters || rendererObj.tool?.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: {\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: 'handler' | 'renderer';\n }) {\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=${() => 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\">${tool.name}</span>\n <span class=\"inline-flex items-center rounded-sm border px-1.5 py-0.5 text-[10px] font-medium ${typeColors[tool.type]}\">\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 ${schema.properties.length > 0\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span>${schema.properties.length} parameter${schema.properties.length !== 1 ? 's' : ''}</span>\n `\n : nothing}\n </div>\n ${tool.description\n ? html`<p class=\"mt-2 text-xs text-gray-600\">${tool.description}</p>`\n : nothing}\n </div>\n <span class=\"shrink-0 text-gray-400 transition ${isExpanded ? 'rotate-180' : ''}\">\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\n\n ${isExpanded\n ? html`\n <div class=\"border-t border-gray-200 bg-gray-50/50 px-4 py-3\">\n ${schema.properties.length > 0\n ? html`\n <h5 class=\"mb-3 text-xs font-semibold text-gray-700\">Parameters</h5>\n <div class=\"space-y-3\">\n ${schema.properties.map(prop => html`\n <div class=\"rounded-md border border-gray-200 bg-white p-3\">\n <div class=\"flex items-start justify-between gap-2 mb-1\">\n <span class=\"font-mono text-xs font-medium text-gray-900\">${prop.name}</span>\n <div class=\"flex items-center gap-1.5 shrink-0\">\n ${prop.required\n ? html`<span class=\"text-[9px] rounded border border-rose-200 bg-rose-50 px-1 py-0.5 font-medium text-rose-700\">required</span>`\n : html`<span class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-medium text-gray-600\">optional</span>`}\n ${prop.type\n ? html`<span class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-mono text-gray-600\">${prop.type}</span>`\n : nothing}\n </div>\n </div>\n ${prop.description\n ? html`<p class=\"mt-1 text-xs text-gray-600\">${prop.description}</p>`\n : nothing}\n ${prop.defaultValue !== undefined\n ? html`\n <div class=\"mt-2 flex items-center gap-1.5 text-[10px] text-gray-500\">\n <span>Default:</span>\n <code class=\"rounded bg-gray-100 px-1 py-0.5 font-mono\">${JSON.stringify(prop.defaultValue)}</code>\n </div>\n `\n : nothing}\n ${prop.enum && prop.enum.length > 0\n ? html`\n <div class=\"mt-2\">\n <span class=\"text-[10px] text-gray-500\">Allowed values:</span>\n <div class=\"mt-1 flex flex-wrap gap-1\">\n ${prop.enum.map(val => html`\n <code class=\"rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 text-[10px] font-mono text-gray-700\">${JSON.stringify(val)}</code>\n `)}\n </div>\n </div>\n `\n : nothing}\n </div>\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 </div>\n `\n : nothing}\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 any)._def;\n if (zodDef) {\n // Handle Zod object schema\n if (zodDef.typeName === 'ZodObject') {\n const shape = zodDef.shape?.() || zodDef.shape;\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 fieldDef = shape[key]?._def;\n if (fieldDef && !this.isZodOptional(shape[key])) {\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 ((parameters as any).type === 'object' && (parameters as any).properties) {\n // Handle JSON Schema format\n const props = (parameters as any).properties;\n const required = new Set((parameters as any).required || []);\n\n for (const [key, value] of Object.entries(props)) {\n const prop = value as any;\n result.properties.push({\n name: key,\n type: prop.type,\n description: prop.description,\n required: required.has(key),\n defaultValue: prop.default,\n enum: prop.enum,\n });\n }\n }\n\n return result;\n }\n\n private isZodOptional(zodSchema: any): boolean {\n if (!zodSchema?._def) return false;\n\n const def = zodSchema._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: any): {\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 if (!zodSchema?._def) return info;\n\n let currentSchema = zodSchema;\n let def = currentSchema._def;\n\n // Unwrap optional/nullable\n while (def.typeName === 'ZodOptional' || def.typeName === 'ZodNullable' || def.typeName === 'ZodDefault') {\n if (def.typeName === 'ZodDefault' && def.defaultValue !== undefined) {\n info.defaultValue = typeof def.defaultValue === 'function' ? def.defaultValue() : def.defaultValue;\n }\n currentSchema = def.innerType;\n if (!currentSchema?._def) break;\n def = currentSchema._def;\n }\n\n // Extract description\n info.description = def.description;\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 = typeMap[def.typeName] || def.typeName?.replace('Zod', '').toLowerCase();\n\n // Extract enum values\n if (def.typeName === 'ZodEnum' && Array.isArray(def.values)) {\n info.enum = def.values;\n } else if (def.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 class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Context will appear here once added to CopilotKit.</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]) => this.renderContextCard(id, context))}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextCard(id: string, context: { description?: string; value: unknown }) {\n const isExpanded = this.expandedContextItems.has(id);\n const valuePreview = this.getContextValuePreview(context.value);\n const hasValue = context.value !== undefined && context.value !== null;\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 ${context.description\n ? html`<p class=\"text-sm font-medium text-gray-900 mb-1\">${context.description}</p>`\n : html`<p class=\"text-sm font-medium text-gray-500 italic mb-1\">No description</p>`}\n <div class=\"flex items-center gap-2 text-xs text-gray-500\">\n <span class=\"font-mono\">${id.substring(0, 8)}...</span>\n ${hasValue\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span class=\"truncate\">${valuePreview}</span>\n `\n : nothing}\n </div>\n </div>\n <span class=\"shrink-0 text-gray-400 transition ${isExpanded ? 'rotate-180' : ''}\">\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\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 class=\"block rounded bg-white border border-gray-200 px-2 py-1 text-[10px] font-mono text-gray-600\">${id}</code>\n </div>\n ${hasValue\n ? html`\n <h5 class=\"mb-2 text-xs font-semibold text-gray-700\">Value</h5>\n <div class=\"rounded-md border border-gray-200 bg-white p-3\">\n <pre class=\"overflow-auto text-xs text-gray-800 max-h-96\"><code>${this.formatContextValue(context.value)}</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 </div>\n `\n : nothing}\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 (error) {\n return String(value);\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 node instanceof HTMLElement && node.dataset?.contextDropdownRoot === \"true\";\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\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 \"web-inspector\": WebInspectorElement;\n }\n}\n","/*! 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-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-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-duration: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-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-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;--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;--tracking-wider:.05em;--leading-tight:1.25;--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-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}.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-50{z-index:50}.m-0{margin:calc(var(--spacing)*0)}.mx-3{margin-inline:calc(var(--spacing)*3)}.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-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.flex{display:flex}.grid{display:grid}.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-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.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-16{width:calc(var(--spacing)*16)}.w-40{width:calc(var(--spacing)*40)}.w-56{width:calc(var(--spacing)*56)}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\[150px\\]{max-width:150px}.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)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.-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-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)}: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-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-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-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-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-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-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-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-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-1{padding:calc(var(--spacing)*1)}.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-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top: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)}.text-center{text-align:center}.text-left{text-align:left}.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-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)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.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-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-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.opacity-0{opacity:0}.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))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.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)}.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-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-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)}@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-border-spacing-x{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-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-duration{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}}","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(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxY = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\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(state, state.position, viewport, edgeMargin);\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'] = centerX < viewport.width / 2 ? 'left' : 'right';\n const vertical: Anchor['vertical'] = centerY < viewport.height / 2 ? 'top' : 'bottom';\n\n state.anchor = { horizontal, vertical };\n\n const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\n\n state.anchorOffset = {\n x:\n horizontal === 'left'\n ? clamp(state.position.x, edgeMargin, maxHorizontalOffset)\n : clamp(viewport.width - state.position.x - state.size.width, edgeMargin, maxHorizontalOffset),\n y:\n vertical === 'top'\n ? clamp(state.position.y, edgeMargin, maxVerticalOffset)\n : clamp(viewport.height - state.position.y - state.size.height, edgeMargin, maxVerticalOffset),\n };\n}\n\nexport function applyAnchorPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\n\n const horizontalOffset = clamp(state.anchorOffset.x, edgeMargin, maxHorizontalOffset);\n const verticalOffset = clamp(state.anchorOffset.y, edgeMargin, maxVerticalOffset);\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(cookieName: string): PersistedState | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const prefix = `${cookieName}=`;\n const entry = document.cookie.split('; ').find((cookie) => cookie.startsWith(prefix));\n if (!entry) {\n return null;\n }\n\n const raw = entry.substring(prefix.length);\n if (!raw) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(decodeURIComponent(raw));\n if (parsed && typeof parsed === 'object') {\n return parsed as PersistedState;\n }\n } catch (error) {\n return null;\n }\n\n return null;\n}\n\nexport function saveInspectorState(\n cookieName: string,\n state: PersistedState,\n maxAgeSeconds: number,\n): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const encoded = encodeURIComponent(JSON.stringify(state));\n document.cookie = `${cookieName}=${encoded}; path=/; max-age=${maxAgeSeconds}; SameSite=Lax`;\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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/styles/generated.css","../src/lib/context-helpers.ts","../src/lib/persistence.ts"],"sourcesContent":["import { LitElement, css, html, nothing, unsafeCSS } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport tailwindStyles from \"./styles/generated.css\";\nimport logoMarkUrl from \"./assets/logo-mark.svg\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { icons } from \"lucide\";\nimport type { CopilotKitCore, CopilotKitCoreSubscriber } from \"@copilotkitnext/core\";\nimport type { AbstractAgent, AgentSubscriber } from \"@ag-ui/client\";\nimport type { Anchor, ContextKey, ContextState, DockMode, Position, Size } 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 = \"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 COOKIE_NAME = \"copilotkit_inspector_state\";\nconst COOKIE_MAX_AGE_SECONDS = 60 * 60 * 24 * 30; // 30 days\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 InspectorEvent = {\n id: string;\n agentId: string;\n type: string;\n timestamp: number;\n payload: unknown;\n};\n\nexport class WebInspectorElement extends LitElement {\n static properties = {\n core: { attribute: false },\n } as const;\n\n private _core: CopilotKitCore | null = null;\n private coreSubscriber: CopilotKitCoreSubscriber | null = null;\n private coreUnsubscribe: (() => void) | null = null;\n private agentSubscriptions: Map<string, () => void> = new Map();\n private agentEvents: Map<string, InspectorEvent[]> = new Map();\n private agentMessages: Map<string, unknown[]> = new Map();\n private agentStates: Map<string, unknown> = new Map();\n private flattenedEvents: InspectorEvent[] = [];\n private eventCounter = 0;\n private contextStore: Record<string, { description?: string; value: unknown }> = {};\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 pendingSelectedContext: string | null = null;\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: \"Agents\", icon: \"Bot\" },\n { key: \"frontend-tools\", label: \"Frontend Tools\", icon: \"Hammer\" },\n { key: \"agent-context\", label: \"Agent Context\", icon: \"FileText\" },\n ];\n\n private attachToCore(core: CopilotKitCore): void {\n this.coreSubscriber = {\n onAgentsChanged: ({ agents }) => {\n this.processAgentsChanged(agents);\n },\n onContextChanged: ({ context }) => {\n this.contextStore = { ...context };\n this.requestUpdate();\n },\n } satisfies CopilotKitCoreSubscriber;\n\n this.coreUnsubscribe = core.subscribe(this.coreSubscriber);\n this.processAgentsChanged(core.agents);\n\n // Initialize context from core\n if (core.context) {\n this.contextStore = { ...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.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(agents: Readonly<Record<string, AbstractAgent>>): 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.requestUpdate();\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\", { event, textMessageBuffer });\n },\n onTextMessageEndEvent: ({ event, textMessageBuffer }) => {\n this.recordAgentEvent(agentId, \"TEXT_MESSAGE_END\", { event, textMessageBuffer });\n },\n onToolCallStartEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_START\", event);\n },\n onToolCallArgsEvent: ({ event, toolCallBuffer, toolCallName, partialToolCallArgs }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_ARGS\", { event, toolCallBuffer, toolCallName, partialToolCallArgs });\n },\n onToolCallEndEvent: ({ event, toolCallArgs, toolCallName }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_END\", { event, toolCallArgs, toolCallName });\n },\n onToolCallResultEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"TOOL_CALL_RESULT\", event);\n },\n onStateSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_SNAPSHOT\", event);\n this.syncAgentState(agent);\n },\n onStateDeltaEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"STATE_DELTA\", event);\n this.syncAgentState(agent);\n },\n onMessagesSnapshotEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"MESSAGES_SNAPSHOT\", event);\n this.syncAgentMessages(agent);\n },\n onMessagesChanged: () => {\n this.syncAgentMessages(agent);\n },\n onRawEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"RAW_EVENT\", event);\n },\n onCustomEvent: ({ event }) => {\n this.recordAgentEvent(agentId, \"CUSTOM_EVENT\", event);\n },\n };\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(agentId: string, type: string, payload: unknown): void {\n const eventId = `${agentId}:${++this.eventCounter}`;\n const event: InspectorEvent = {\n id: eventId,\n agentId,\n type,\n timestamp: Date.now(),\n payload,\n };\n\n const currentAgentEvents = this.agentEvents.get(agentId) ?? [];\n const nextAgentEvents = [event, ...currentAgentEvents].slice(0, MAX_AGENT_EVENTS);\n this.agentEvents.set(agentId, nextAgentEvents);\n\n this.flattenedEvents = [event, ...this.flattenedEvents].slice(0, MAX_TOTAL_EVENTS);\n this.requestUpdate();\n }\n\n private syncAgentMessages(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const messages = (agent as { messages?: unknown }).messages;\n\n if (Array.isArray(messages)) {\n this.agentMessages.set(agent.agentId, messages);\n } else {\n this.agentMessages.delete(agent.agentId);\n }\n\n this.requestUpdate();\n }\n\n private syncAgentState(agent: AbstractAgent): void {\n if (!agent?.agentId) {\n return;\n }\n\n const state = (agent as { state?: unknown }).state;\n\n if (state === undefined || state === null) {\n this.agentStates.delete(agent.agentId);\n } else {\n this.agentStates.set(agent.agentId, state);\n }\n\n this.requestUpdate();\n }\n\n private updateContextOptions(agentIds: Set<string>): void {\n const nextOptions: Array<{ key: string; label: string }> = [\n { key: \"all-agents\", label: \"All Agents\" },\n ...Array.from(agentIds)\n .sort((a, b) => a.localeCompare(b))\n .map((id) => ({ key: id, label: id })),\n ];\n\n const optionsChanged =\n this.contextOptions.length !== nextOptions.length ||\n this.contextOptions.some((option, index) => option.key !== nextOptions[index]?.key);\n\n if (optionsChanged) {\n this.contextOptions = nextOptions;\n }\n\n const pendingContext = this.pendingSelectedContext;\n if (pendingContext) {\n const isPendingAvailable = 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((option) => option.key === this.selectedContext);\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) => a.localeCompare(b))[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 getLatestStateForAgent(agentId: string): unknown | null {\n if (this.agentStates.has(agentId)) {\n return this.agentStates.get(agentId);\n }\n\n const events = this.agentEvents.get(agentId) ?? [];\n const stateEvent = events.find((e) => e.type === \"STATE_SNAPSHOT\");\n return stateEvent?.payload ?? null;\n }\n\n private getLatestMessagesForAgent(agentId: string): unknown[] | 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((e) => e.type === \"RUN_STARTED\" || e.type === \"RUN_FINISHED\" || e.type === \"RUN_ERROR\");\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): { totalEvents: number; lastActivity: number | null; messages: number; toolCalls: number; errors: number } {\n const events = this.agentEvents.get(agentId) ?? [];\n\n const messages = this.agentMessages.get(agentId);\n\n const toolCallCount = Array.isArray(messages)\n ? (messages as unknown[]).reduce<number>((count, rawMessage) => {\n if (!rawMessage || typeof rawMessage !== 'object') {\n return count;\n }\n\n const toolCalls = (rawMessage as { toolCalls?: unknown }).toolCalls;\n if (!Array.isArray(toolCalls)) {\n return count;\n }\n\n return count + toolCalls.length;\n }, 0)\n : events.filter((e) => e.type === \"TOOL_CALL_END\").length;\n\n const messageCount = Array.isArray(messages) ? 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: unknown[]) {\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 toolCall = call as any;\n const functionName = typeof toolCall?.function?.name === 'string' ? toolCall.function.name : 'Unknown function';\n const callId = typeof toolCall?.id === 'string' ? toolCall.id : `tool-call-${index + 1}`;\n const argsString = this.formatToolCallArguments(toolCall?.function?.arguments);\n return html`\n <div class=\"rounded-md border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700\">\n <div class=\"flex flex-wrap items-center justify-between gap-1 font-medium text-gray-900\">\n <span>${functionName}</span>\n <span class=\"text-[10px] text-gray-500\">ID: ${callId}</span>\n </div>\n ${argsString\n ? html`<pre class=\"mt-2 overflow-auto rounded bg-white p-2 text-[11px] leading-relaxed text-gray-800\">${argsString}</pre>`\n : nothing}\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 (error) {\n return args;\n }\n }\n\n if (typeof args === 'object') {\n try {\n return JSON.stringify(args, null, 2);\n } catch (error) {\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 = \"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(\"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 any).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: width 300ms ease, 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 ];\n\n connectedCallback(): void {\n super.connectedCallback();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n window.addEventListener(\"pointerdown\", this.handleGlobalPointerDown as EventListener);\n\n // Load state early (before first render) so menu selection is correct\n this.hydrateStateFromCookieEarly();\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"resize\", this.handleResize);\n window.removeEventListener(\"pointerdown\", this.handleGlobalPointerDown as EventListener);\n }\n this.removeDockStyles(); // Clean up any docking styles\n this.detachFromCore();\n }\n\n firstUpdated(): void {\n if (typeof window === \"undefined\") {\n return;\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.hydrateStateFromCookie();\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.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 \"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=${this.isDragging && this.pointerContext === \"button\" ? \"true\" : \"false\"}\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n @click=${this.handleButtonClick}\n >\n <img src=${logoMarkUrl} alt=\"\" class=\"h-7 w-7\" loading=\"lazy\" />\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 const isCollapsed = this.dockMode === 'docked-left';\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 contextDropdown = this.renderContextDropdown();\n const hasContextDropdown = contextDropdown !== nothing;\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 ${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 <div class=\"flex flex-1 overflow-hidden bg-white text-gray-800\">\n <nav\n class=\"flex ${isCollapsed ? 'w-16' : '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 transition-all duration-300\"\n aria-label=\"Inspector sections\"\n >\n <div class=\"flex flex-col gap-4 overflow-y-auto\">\n <div\n class=\"flex items-center ${isCollapsed ? 'justify-center' : 'gap-2 pl-1'} touch-none select-none ${this.isDragging && this.pointerContext === 'window' ? 'cursor-grabbing' : 'cursor-grab'}\"\n data-drag-context=\"window\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerCancel}\n title=\"${isCollapsed ? 'Acme Inc - Enterprise' : ''}\"\n >\n <span\n class=\"flex h-8 w-8 items-center justify-center rounded-lg bg-gray-900 text-white pointer-events-none\"\n >\n ${this.renderIcon(\"Building2\")}\n </span>\n ${!isCollapsed\n ? html`\n <div class=\"flex flex-1 flex-col leading-tight pointer-events-none\">\n <span class=\"text-sm font-semibold text-gray-900\">Acme Inc</span>\n <span class=\"text-[10px] text-gray-500\">Enterprise</span>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"flex flex-col gap-2 pt-2\">\n ${!isCollapsed\n ? html`<div class=\"px-1 text-[10px] font-semibold uppercase tracking-wider text-gray-400\">Platform</div>`\n : nothing}\n <div class=\"flex flex-col gap-0.5\">\n ${this.menuItems.map(({ key, label, icon }) => {\n const isSelected = this.selectedMenu === key;\n const buttonClasses = [\n \"group flex w-full items-center\",\n isCollapsed ? \"justify-center p-2\" : \"gap-2 px-2 py-1.5\",\n \"rounded-md text-left text-xs 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\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n ].join(\" \");\n\n const badgeClasses = isSelected\n ? \"bg-gray-800 text-white\"\n : \"bg-white border border-gray-200 text-gray-500 group-hover:border-gray-300 group-hover:text-gray-700\";\n\n return html`\n <button\n type=\"button\"\n class=${buttonClasses}\n aria-pressed=${isSelected}\n title=\"${isCollapsed ? label : ''}\"\n @click=${() => this.handleMenuSelect(key)}\n >\n <span\n class=\"flex h-6 w-6 items-center justify-center rounded ${isCollapsed && isSelected ? 'text-white' : isCollapsed ? 'text-gray-600' : badgeClasses}\"\n aria-hidden=\"true\"\n >\n ${this.renderIcon(icon)}\n </span>\n ${!isCollapsed\n ? html`\n <span class=\"flex-1\">${label}</span>\n <span class=\"text-gray-400 opacity-60\">${this.renderIcon(\"ChevronRight\")}</span>\n `\n : nothing}\n </button>\n `;\n })}\n </div>\n </div>\n </div>\n\n <div\n class=\"relative flex items-center ${isCollapsed ? 'justify-center p-1' : ''} rounded-lg border border-gray-200 bg-white ${isCollapsed ? '' : 'px-2 py-2'} text-left text-xs text-gray-700 cursor-pointer hover:bg-gray-50 transition\"\n title=\"${isCollapsed ? 'John Snow - john@snow.com' : ''}\"\n >\n <span\n class=\"${isCollapsed ? 'w-8 h-8 shrink-0' : 'w-6 h-6'} flex items-center justify-center overflow-hidden rounded bg-gray-100 text-[10px] font-semibold text-gray-700\"\n >\n JS\n </span>\n ${!isCollapsed\n ? html`\n <div class=\"pl-2 flex flex-1 flex-col leading-tight\">\n <span class=\"font-medium text-gray-900\">John Snow</span>\n <span class=\"text-[10px] text-gray-500\">john@snow.com</span>\n </div>\n <span class=\"text-gray-300\">${this.renderIcon(\"ChevronRight\")}</span>\n `\n : nothing}\n </div>\n </nav>\n <div class=\"relative flex flex-1 flex-col overflow-hidden\">\n <div\n class=\"drag-handle flex items-center justify-between border-b border-gray-200 px-4 py-3 touch-none select-none ${isDocked ? '' : (this.isDragging && this.pointerContext === 'window' ? 'cursor-grabbing' : 'cursor-grab')}\"\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 min-w-0 flex-1 items-center gap-2 text-xs text-gray-500\">\n <div class=\"flex min-w-0 flex-1 items-center text-xs text-gray-600\">\n <span class=\"flex shrink-0 items-center gap-1\">\n <span>🪁</span>\n <span class=\"font-medium whitespace-nowrap\">CopilotKit Inspector</span>\n </span>\n <span class=\"mx-3 h-3 w-px shrink-0 bg-gray-200\"></span>\n <span class=\"shrink-0 text-gray-400\">\n ${this.renderIcon(this.getSelectedMenu().icon)}\n </span>\n <span class=\"ml-2 truncate\">${this.getSelectedMenu().label}</span>\n ${hasContextDropdown\n ? html`\n <span class=\"mx-3 h-3 w-px shrink-0 bg-gray-200\"></span>\n <div class=\"min-w-0\">${contextDropdown}</div>\n `\n : nothing}\n </div>\n </div>\n <div class=\"flex items-center gap-1\">\n ${this.renderDockControls()}\n <button\n 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\"\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 class=\"flex-1 overflow-auto\">\n ${this.renderMainContent()}\n <slot></slot>\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 hydrateStateFromCookieEarly(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(COOKIE_NAME);\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((item) => item.key === persisted.selectedMenu);\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 hydrateStateFromCookie(): void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n const persisted = loadInspectorState(COOKIE_NAME);\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(persistedWindow.size);\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 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 (this.pointerId !== event.pointerId || !this.dragStart || !this.pointerContext) {\n return;\n }\n\n const distance = Math.hypot(event.clientX - this.dragStart.x, event.clientY - this.dragStart.y);\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 (context === \"button\" && !this.isOpen && !this.draggedDuringInteraction) {\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 (!this.isResizing || this.resizePointerId !== event.pointerId || !this.resizeStart || !this.resizeInitialSize) {\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 = context === \"window\" ? \".inspector-window\" : \".console-button\";\n const element = this.renderRoot?.querySelector(selector) as HTMLElement | null;\n if (!element) {\n return;\n }\n const fallback = 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(this.contextState.window, viewport, EDGE_MARGIN);\n this.updateHostTransform(\"window\");\n this.persistState();\n }\n\n private constrainToViewport(position: Position, context: ContextKey): Position {\n if (typeof window === \"undefined\") {\n return position;\n }\n\n const viewport = this.getViewportSize();\n return constrainToViewport(this.contextState[context], position, viewport, EDGE_MARGIN);\n }\n\n private keepPositionWithinViewport(context: ContextKey): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const viewport = this.getViewportSize();\n keepPositionWithinViewport(this.contextState[context], viewport, EDGE_MARGIN);\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(COOKIE_NAME, state, COOKIE_MAX_AGE_SECONDS);\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 = this.dockMode === 'docked-left' ? MIN_WINDOW_WIDTH_DOCKED_LEFT : 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(size, viewport, EDGE_MARGIN, minWidth, MIN_WINDOW_HEIGHT);\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 const previousMode = this.dockMode;\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 setTimeout(() => {\n if (document.body) {\n document.body.style.transition = '';\n }\n }, 300);\n }\n }\n\n private removeDockStyles(): void {\n if (typeof document === 'undefined' || !document.body) {\n return;\n }\n\n // Only add transition if not resizing\n if (!this.isResizing) {\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 setTimeout(() => {\n if (document.body) {\n document.body.style.transition = '';\n }\n }, 300);\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(this.contextState[context], viewport, EDGE_MARGIN);\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'] = centerX < viewport.width / 2 ? 'left' : 'right';\n const vertical: Anchor['vertical'] = 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(this.contextState[context], viewport, EDGE_MARGIN);\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.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-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\"\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-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\"\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(attributes: Record<string, string | number | undefined>): string {\n return Object.entries(attributes)\n .filter(([key, value]) => key !== \"key\" && value !== undefined && value !== null && value !== \"\")\n .map(([key, value]) => `${key}=\"${String(value).replace(/\"/g, \""\")}\"`)\n .join(\" \");\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\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 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 // Default placeholder content for other sections\n return html`\n <div class=\"flex flex-col gap-3 p-4\">\n <div class=\"h-24 rounded-lg bg-gray-50\"></div>\n <div class=\"h-20 rounded-lg bg-gray-50\"></div>\n </div>\n `;\n }\n\n private renderEventsTable() {\n const events = this.getEventsForSelectedContext();\n\n if (events.length === 0) {\n return html`\n <div class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Trigger an agent run to see live activity.</p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"relative h-full overflow-auto\">\n <table class=\"w-full border-separate border-spacing-0 text-xs\">\n <thead class=\"sticky top-0 z-10\">\n <tr class=\"bg-white\">\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Agent\n </th>\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Time\n </th>\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n Event Type\n </th>\n <th class=\"border-b border-gray-200 bg-white px-3 py-2 text-left font-medium text-gray-900\">\n AG-UI Event\n </th>\n </tr>\n </thead>\n <tbody>\n ${events.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(event.payload);\n const inlineEvent = this.stringifyPayload(extractedEvent, false) || \"—\";\n const prettyEvent = 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 class=\"border-l border-r border-b border-gray-200 px-3 py-2\">\n <span class=\"font-mono text-[11px] text-gray-600\">${event.agentId}</span>\n </td>\n <td class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[11px] text-gray-600\">\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 class=\"border-r border-b border-gray-200 px-3 py-2 font-mono text-[10px] text-gray-600 ${isExpanded ? '' : 'truncate max-w-xs'}\">\n ${isExpanded\n ? html`\n <div class=\"group relative\">\n <pre class=\"m-0 whitespace-pre-wrap text-[10px] font-mono text-gray-600\">${prettyEvent}</pre>\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 ${this.copiedEvents.has(event.id)\n ? html`<span>✓ Copied</span>`\n : html`<span>Copy</span>`}\n </button>\n </div>\n `\n : inlineEvent}\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n </div>\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 class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Select an agent from the dropdown above to view details.</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 class=\"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 text-blue-600\">\n ${this.renderIcon(\"Bot\")}\n </div>\n <div>\n <h3 class=\"font-semibold text-sm text-gray-900\">${agentId}</h3>\n <span class=\"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium ${statusColors[status]} relative -translate-y-[2px]\">\n <span class=\"h-1.5 w-1.5 rounded-full ${status === 'running' ? 'bg-emerald-500 animate-pulse' : status === 'error' ? 'bg-rose-500' : 'bg-gray-400'}\"></span>\n ${status.charAt(0).toUpperCase() + status.slice(1)}\n </span>\n </div>\n </div>\n ${stats.lastActivity\n ? html`<span class=\"text-xs text-gray-500\">Last activity: ${new Date(stats.lastActivity).toLocaleTimeString()}</span>`\n : nothing}\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\">Total Events</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.totalEvents}</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\">Messages</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.messages}</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\">Tool Calls</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.toolCalls}</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\">Errors</div>\n <div class=\"text-lg font-semibold text-gray-900\">${stats.errors}</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 ${this.hasRenderableState(state)\n ? html`\n <pre class=\"overflow-auto rounded-md bg-gray-50 p-3 text-xs text-gray-800 max-h-64\"><code>${this.formatStateForDisplay(state)}</code></pre>\n `\n : html`\n <div class=\"flex h-40 items-center justify-center text-xs text-gray-500\">\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\">${this.renderIcon(\"Database\")}</span>\n <span>State is empty</span>\n </div>\n </div>\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\">Current Messages</h4>\n </div>\n <div class=\"overflow-auto\">\n ${messages && Array.isArray(messages) && messages.length > 0\n ? html`\n <table class=\"w-full text-xs\">\n <thead class=\"bg-gray-50\">\n <tr>\n <th class=\"px-4 py-2 text-left font-medium text-gray-700\">Role</th>\n <th class=\"px-4 py-2 text-left font-medium text-gray-700\">Content</th>\n </tr>\n </thead>\n <tbody class=\"divide-y divide-gray-200\">\n ${messages.map((msg: any, idx: number) => {\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 unknown: \"bg-gray-100 text-gray-600\",\n };\n\n const rawContent = typeof msg?.content === \"string\"\n ? msg.content\n : msg?.content != null\n ? JSON.stringify(msg.content)\n : \"\";\n\n const toolCalls = Array.isArray(msg?.toolCalls) ? msg.toolCalls : [];\n const hasContent = rawContent.trim().length > 0;\n const contentFallback = toolCalls.length > 0\n ? \"Invoked tool call\"\n : \"—\";\n\n return html`\n <tr>\n <td class=\"px-4 py-2 align-top\">\n <span class=\"inline-flex rounded px-2 py-0.5 text-[10px] font-medium ${roleColors[role] || roleColors.unknown}\">\n ${role}\n </span>\n </td>\n <td class=\"px-4 py-2\">\n ${hasContent\n ? html`<div class=\"max-w-2xl whitespace-pre-wrap break-words text-gray-700\">${rawContent}</div>`\n : html`<div class=\"text-xs italic text-gray-400\">${contentFallback}</div>`}\n ${role === 'assistant' && toolCalls.length > 0\n ? this.renderToolCallDetails(toolCalls)\n : nothing}\n </td>\n </tr>\n `;\n })}\n </tbody>\n </table>\n `\n : html`\n <div class=\"flex h-40 items-center justify-center text-xs text-gray-500\">\n <div class=\"flex items-center gap-2 text-gray-500\">\n <span class=\"text-lg text-gray-400\">${this.renderIcon(\"MessageSquare\")}</span>\n <span>No messages available</span>\n </div>\n </div>\n `}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextDropdown() {\n // Agent Context doesn't use the dropdown - it's global\n if (this.selectedMenu === \"agent-context\") {\n return nothing;\n }\n\n if (this.selectedMenu !== \"ag-ui-events\" && this.selectedMenu !== \"agents\" && this.selectedMenu !== \"frontend-tools\") {\n return nothing;\n }\n\n // Filter out \"all-agents\" when in agents view\n const filteredOptions = this.selectedMenu === \"agents\"\n ? this.contextOptions.filter((opt) => opt.key !== \"all-agents\")\n : this.contextOptions;\n\n const selectedLabel = filteredOptions.find((opt) => opt.key === this.selectedContext)?.label ?? \"\";\n\n return html`\n <div class=\"relative min-w-0 flex-1\" data-context-dropdown-root=\"true\">\n <button\n type=\"button\"\n class=\"flex w-full min-w-0 max-w-[150px] 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\"\n @pointerdown=${this.handleContextDropdownToggle}\n >\n <span class=\"truncate flex-1 text-left\">${selectedLabel}</span>\n <span class=\"shrink-0 text-gray-400\">${this.renderIcon(\"ChevronDown\")}</span>\n </button>\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 class=\"truncate ${option.key === this.selectedContext ? 'text-gray-900 font-medium' : 'text-gray-600'}\">${option.label}</span>\n ${option.key === this.selectedContext\n ? html`<span class=\"text-gray-500\">${this.renderIcon(\"Check\")}</span>`\n : nothing}\n </button>\n `,\n )}\n </div>\n `\n : nothing}\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((opt) => opt.key !== \"all-agents\");\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 ? defaultAgent.key : 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 class=\"flex h-full items-center justify-center px-4 py-8 text-xs text-gray-500\">\n No core instance available\n </div>\n `;\n }\n\n const allTools = this.extractToolsFromAgents();\n\n if (allTools.length === 0) {\n return html`\n <div class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Tools will appear here once agents are configured with tool handlers or renderers.</p>\n </div>\n </div>\n `;\n }\n\n // Filter tools by selected agent\n const filteredTools = this.selectedContext === \"all-agents\"\n ? allTools\n : allTools.filter(tool => tool.agentId === this.selectedContext);\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(): Array<{\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: 'handler' | 'renderer';\n }> {\n if (!this._core) {\n return [];\n }\n\n const tools: Array<{\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: 'handler' | 'renderer';\n }> = [];\n\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 any).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 any;\n tools.push({\n agentId,\n name: toolName,\n description: handlerObj.description || handlerObj.tool?.description,\n parameters: handlerObj.parameters || handlerObj.tool?.parameters,\n type: 'handler',\n });\n }\n }\n }\n\n // Try to extract tool renderers\n const renderers = (agent as any).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 (!tools.some(t => t.agentId === agentId && t.name === toolName)) {\n if (renderer && typeof renderer === 'object') {\n const rendererObj = renderer as any;\n tools.push({\n agentId,\n name: toolName,\n description: rendererObj.description || rendererObj.tool?.description,\n parameters: rendererObj.parameters || rendererObj.tool?.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: {\n agentId: string;\n name: string;\n description?: string;\n parameters?: unknown;\n type: 'handler' | 'renderer';\n }) {\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=${() => 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\">${tool.name}</span>\n <span class=\"inline-flex items-center rounded-sm border px-1.5 py-0.5 text-[10px] font-medium ${typeColors[tool.type]}\">\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 ${schema.properties.length > 0\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span>${schema.properties.length} parameter${schema.properties.length !== 1 ? 's' : ''}</span>\n `\n : nothing}\n </div>\n ${tool.description\n ? html`<p class=\"mt-2 text-xs text-gray-600\">${tool.description}</p>`\n : nothing}\n </div>\n <span class=\"shrink-0 text-gray-400 transition ${isExpanded ? 'rotate-180' : ''}\">\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\n\n ${isExpanded\n ? html`\n <div class=\"border-t border-gray-200 bg-gray-50/50 px-4 py-3\">\n ${schema.properties.length > 0\n ? html`\n <h5 class=\"mb-3 text-xs font-semibold text-gray-700\">Parameters</h5>\n <div class=\"space-y-3\">\n ${schema.properties.map(prop => html`\n <div class=\"rounded-md border border-gray-200 bg-white p-3\">\n <div class=\"flex items-start justify-between gap-2 mb-1\">\n <span class=\"font-mono text-xs font-medium text-gray-900\">${prop.name}</span>\n <div class=\"flex items-center gap-1.5 shrink-0\">\n ${prop.required\n ? html`<span class=\"text-[9px] rounded border border-rose-200 bg-rose-50 px-1 py-0.5 font-medium text-rose-700\">required</span>`\n : html`<span class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-medium text-gray-600\">optional</span>`}\n ${prop.type\n ? html`<span class=\"text-[9px] rounded border border-gray-200 bg-gray-50 px-1 py-0.5 font-mono text-gray-600\">${prop.type}</span>`\n : nothing}\n </div>\n </div>\n ${prop.description\n ? html`<p class=\"mt-1 text-xs text-gray-600\">${prop.description}</p>`\n : nothing}\n ${prop.defaultValue !== undefined\n ? html`\n <div class=\"mt-2 flex items-center gap-1.5 text-[10px] text-gray-500\">\n <span>Default:</span>\n <code class=\"rounded bg-gray-100 px-1 py-0.5 font-mono\">${JSON.stringify(prop.defaultValue)}</code>\n </div>\n `\n : nothing}\n ${prop.enum && prop.enum.length > 0\n ? html`\n <div class=\"mt-2\">\n <span class=\"text-[10px] text-gray-500\">Allowed values:</span>\n <div class=\"mt-1 flex flex-wrap gap-1\">\n ${prop.enum.map(val => html`\n <code class=\"rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 text-[10px] font-mono text-gray-700\">${JSON.stringify(val)}</code>\n `)}\n </div>\n </div>\n `\n : nothing}\n </div>\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 </div>\n `\n : nothing}\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 any)._def;\n if (zodDef) {\n // Handle Zod object schema\n if (zodDef.typeName === 'ZodObject') {\n const shape = zodDef.shape?.() || zodDef.shape;\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 fieldDef = shape[key]?._def;\n if (fieldDef && !this.isZodOptional(shape[key])) {\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 ((parameters as any).type === 'object' && (parameters as any).properties) {\n // Handle JSON Schema format\n const props = (parameters as any).properties;\n const required = new Set((parameters as any).required || []);\n\n for (const [key, value] of Object.entries(props)) {\n const prop = value as any;\n result.properties.push({\n name: key,\n type: prop.type,\n description: prop.description,\n required: required.has(key),\n defaultValue: prop.default,\n enum: prop.enum,\n });\n }\n }\n\n return result;\n }\n\n private isZodOptional(zodSchema: any): boolean {\n if (!zodSchema?._def) return false;\n\n const def = zodSchema._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: any): {\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 if (!zodSchema?._def) return info;\n\n let currentSchema = zodSchema;\n let def = currentSchema._def;\n\n // Unwrap optional/nullable\n while (def.typeName === 'ZodOptional' || def.typeName === 'ZodNullable' || def.typeName === 'ZodDefault') {\n if (def.typeName === 'ZodDefault' && def.defaultValue !== undefined) {\n info.defaultValue = typeof def.defaultValue === 'function' ? def.defaultValue() : def.defaultValue;\n }\n currentSchema = def.innerType;\n if (!currentSchema?._def) break;\n def = currentSchema._def;\n }\n\n // Extract description\n info.description = def.description;\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 = typeMap[def.typeName] || def.typeName?.replace('Zod', '').toLowerCase();\n\n // Extract enum values\n if (def.typeName === 'ZodEnum' && Array.isArray(def.values)) {\n info.enum = def.values;\n } else if (def.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 class=\"flex h-full items-center justify-center px-4 py-8 text-center\">\n <div class=\"max-w-md\">\n <div class=\"mb-3 flex justify-center text-gray-300 [&>svg]:!h-8 [&>svg]:!w-8\">\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\">Context will appear here once added to CopilotKit.</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]) => this.renderContextCard(id, context))}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderContextCard(id: string, context: { description?: string; value: unknown }) {\n const isExpanded = this.expandedContextItems.has(id);\n const valuePreview = this.getContextValuePreview(context.value);\n const hasValue = context.value !== undefined && context.value !== null;\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 ${context.description\n ? html`<p class=\"text-sm font-medium text-gray-900 mb-1\">${context.description}</p>`\n : html`<p class=\"text-sm font-medium text-gray-500 italic mb-1\">No description</p>`}\n <div class=\"flex items-center gap-2 text-xs text-gray-500\">\n <span class=\"font-mono\">${id.substring(0, 8)}...</span>\n ${hasValue\n ? html`\n <span class=\"text-gray-300\">•</span>\n <span class=\"truncate\">${valuePreview}</span>\n `\n : nothing}\n </div>\n </div>\n <span class=\"shrink-0 text-gray-400 transition ${isExpanded ? 'rotate-180' : ''}\">\n ${this.renderIcon(\"ChevronDown\")}\n </span>\n </div>\n </button>\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 class=\"block rounded bg-white border border-gray-200 px-2 py-1 text-[10px] font-mono text-gray-600\">${id}</code>\n </div>\n ${hasValue\n ? html`\n <h5 class=\"mb-2 text-xs font-semibold text-gray-700\">Value</h5>\n <div class=\"rounded-md border border-gray-200 bg-white p-3\">\n <pre class=\"overflow-auto text-xs text-gray-800 max-h-96\"><code>${this.formatContextValue(context.value)}</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 </div>\n `\n : nothing}\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 (error) {\n return String(value);\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 node instanceof HTMLElement && node.dataset?.contextDropdownRoot === \"true\";\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\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 \"web-inspector\": WebInspectorElement;\n }\n}\n","/*! 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-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-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-duration: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-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-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;--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;--tracking-wider:.05em;--leading-tight:1.25;--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-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}.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-50{z-index:50}.m-0{margin:calc(var(--spacing)*0)}.mx-3{margin-inline:calc(var(--spacing)*3)}.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-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.flex{display:flex}.grid{display:grid}.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-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.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-16{width:calc(var(--spacing)*16)}.w-40{width:calc(var(--spacing)*40)}.w-56{width:calc(var(--spacing)*56)}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\[150px\\]{max-width:150px}.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)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.-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-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)}: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-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-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-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-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-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-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-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-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-1{padding:calc(var(--spacing)*1)}.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-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top: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)}.text-center{text-align:center}.text-left{text-align:left}.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-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)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-700{color:var(--color-amber-700)}.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-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-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.opacity-0{opacity:0}.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))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.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)}.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-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-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)}@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-border-spacing-x{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-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-duration{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}}","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(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxY = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\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(state, state.position, viewport, edgeMargin);\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'] = centerX < viewport.width / 2 ? 'left' : 'right';\n const vertical: Anchor['vertical'] = centerY < viewport.height / 2 ? 'top' : 'bottom';\n\n state.anchor = { horizontal, vertical };\n\n const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\n\n state.anchorOffset = {\n x:\n horizontal === 'left'\n ? clamp(state.position.x, edgeMargin, maxHorizontalOffset)\n : clamp(viewport.width - state.position.x - state.size.width, edgeMargin, maxHorizontalOffset),\n y:\n vertical === 'top'\n ? clamp(state.position.y, edgeMargin, maxVerticalOffset)\n : clamp(viewport.height - state.position.y - state.size.height, edgeMargin, maxVerticalOffset),\n };\n}\n\nexport function applyAnchorPosition(\n state: ContextState,\n viewport: Size,\n edgeMargin: number,\n): Position {\n const maxHorizontalOffset = Math.max(edgeMargin, viewport.width - state.size.width - edgeMargin);\n const maxVerticalOffset = Math.max(edgeMargin, viewport.height - state.size.height - edgeMargin);\n\n const horizontalOffset = clamp(state.anchorOffset.x, edgeMargin, maxHorizontalOffset);\n const verticalOffset = clamp(state.anchorOffset.y, edgeMargin, maxVerticalOffset);\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(cookieName: string): PersistedState | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const prefix = `${cookieName}=`;\n const entry = document.cookie.split('; ').find((cookie) => cookie.startsWith(prefix));\n if (!entry) {\n return null;\n }\n\n const raw = entry.substring(prefix.length);\n if (!raw) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(decodeURIComponent(raw));\n if (parsed && typeof parsed === 'object') {\n return parsed as PersistedState;\n }\n } catch (error) {\n return null;\n }\n\n return null;\n}\n\nexport function saveInspectorState(\n cookieName: string,\n state: PersistedState,\n maxAgeSeconds: number,\n): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n const encoded = encodeURIComponent(JSON.stringify(state));\n document.cookie = `${cookieName}=${encoded}; path=/; max-age=${maxAgeSeconds}; SameSite=Lax`;\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"],"mappings":"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","names":[]}
|