theokit 0.5.2 → 0.5.3

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.
@@ -447,7 +447,9 @@ function methodColor(method) {
447
447
  }
448
448
 
449
449
  // src/devtools/assets/logo-data.ts
450
- var THEO_LOGO_BASE64 = "data:image/png;base64,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";
450
+ var THEO_LOGO_BASE64 = "data:image/svg+xml," + encodeURIComponent(
451
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="8" fill="#6366f1"/><text x="16" y="22" font-family="system-ui,-apple-system,sans-serif" font-size="20" font-weight="700" fill="white" text-anchor="middle">T</text></svg>'
452
+ );
451
453
 
452
454
  // src/devtools/components/TheoLogo.tsx
453
455
  import { jsx } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/devtools/dom/entry.tsx","../../src/devtools/dom/Overlay.tsx","../../src/devtools/bridge/hmr-bridge.ts","../../src/devtools/bridge/install-global.ts","../../src/devtools/hooks/useDevtoolsContext.ts","../../src/devtools/hooks/useDrag.ts","../../src/devtools/styles/tokens.ts","../../src/devtools/assets/logo-data.ts","../../src/devtools/components/TheoLogo.tsx","../../src/devtools/components/Indicator.tsx","../../src/devtools/components/Tabs/ActionsTab.tsx","../../src/devtools/format/pii-mask.ts","../../src/devtools/state/actions-row-state.ts","../../src/devtools/components/Tabs/AgentsTab.tsx","../../src/devtools/components/Tabs/CsrfReadinessTab.tsx","../../src/devtools/format/csrf-readiness-classify.ts","../../src/devtools/components/ErrorRow.tsx","../../src/devtools/components/Tabs/ErrorsTab.tsx","../../src/devtools/components/RequestRow.tsx","../../src/devtools/components/JSONExplorer.tsx","../../src/devtools/components/Tabs/RequestsTab.tsx","../../src/devtools/components/Tabs/RoutesTab.tsx","../../src/devtools/components/Tabs/SettingsTab.tsx","../../src/devtools/components/Panel.tsx","../../src/devtools/hooks/useActiveRoute.ts","../../src/devtools/hooks/useResolvedTheme.ts","../../src/devtools/hooks/useShortcuts.ts","../../src/devtools/state/persistence.ts","../../src/devtools/state/reducer.ts","../../src/devtools/styles/styles.ts","../../src/devtools/dom/shadow-portal.tsx"],"sourcesContent":["/**\n * Devtools entry — runs in the browser, in DEV only.\n *\n * - EC-1: wrapper element has `position: absolute` so parent `body { display: flex }`\n * does not skew the overlay layout.\n * - EC-12: custom element name namespaced as `theo-devtools-portal` to avoid collision.\n * Guarded by `customElements.get` so HMR re-execution doesn't re-define.\n * - EC-16: singleton flag on `window.__theoDevtoolsMounted` prevents double-mount\n * on HMR module re-run.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\n\nimport { Overlay } from './Overlay.js'\n\ndeclare global {\n interface Window {\n __theoDevtoolsMounted?: boolean\n }\n}\n\nconst PORTAL_TAG = 'theo-devtools-portal'\n\nfunction definePortalElement(): void {\n if (typeof customElements === 'undefined') return\n if (customElements.get(PORTAL_TAG)) return\n customElements.define(PORTAL_TAG, class TheoDevtoolsPortal extends HTMLElement {})\n}\n\nfunction mount(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n if (window.__theoDevtoolsMounted) return\n window.__theoDevtoolsMounted = true\n\n definePortalElement()\n\n // EC-1: wrapper script-tag with position: absolute removes the wrapper from\n // a flexbox parent's layout — chip+panel float free of user app layout.\n const wrapper = document.createElement('script')\n wrapper.style.display = 'block'\n wrapper.style.position = 'absolute'\n wrapper.setAttribute('data-theo-devtools', 'true')\n wrapper.setAttribute('type', 'application/json')\n\n const host = document.createElement(PORTAL_TAG)\n wrapper.appendChild(host)\n document.body.appendChild(wrapper)\n\n const shadowRoot = host.attachShadow({ mode: 'open' })\n\n const reactRootHost = document.createElement('div')\n reactRootHost.setAttribute('data-theo-devtools-root', '')\n shadowRoot.appendChild(reactRootHost)\n\n const root = createRoot(reactRootHost)\n root.render(\n <StrictMode>\n <Overlay shadowRoot={shadowRoot} />\n </StrictMode>,\n )\n}\n\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mount, { once: true })\n } else {\n mount()\n }\n}\n","/**\n * Devtools root component.\n *\n * Phase 1: shell (chip + panel).\n * Phase 2: dispatcher wiring via useInsertionEffect + HMR subscription.\n *\n * EC-24: setDispatch is idempotent (NULL → non-null only). React.StrictMode\n * double-effect safe — second mount sets the same dispatch fn; no double-flush.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect, useInsertionEffect, useMemo, useReducer } from 'react'\n\nimport { dispatcher } from '../bridge/dispatcher.js'\nimport { subscribeToServerEvents } from '../bridge/hmr-bridge.js'\nimport { installDispatcherGlobal } from '../bridge/install-global.js'\nimport { Indicator } from '../components/Indicator.js'\nimport { Panel } from '../components/Panel.js'\nimport { useActiveRoute } from '../hooks/useActiveRoute.js'\nimport { DevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport { useResolvedTheme } from '../hooks/useResolvedTheme.js'\nimport { useShortcuts } from '../hooks/useShortcuts.js'\nimport { loadFromStorage, writeToStorage } from '../state/persistence.js'\nimport { devtoolsReducer, initialState } from '../state/reducer.js'\nimport { createStyles } from '../styles/styles.js'\nimport { buildThemeCssVars } from '../styles/tokens.js'\n\nimport { ShadowPortal } from './shadow-portal.js'\n\nfunction ActiveRouteTracker() {\n useActiveRoute()\n return null\n}\n\nfunction ShortcutsTracker() {\n useShortcuts()\n return null\n}\n\n/**\n * Inject CSS custom properties for the resolved theme into the shadow root.\n *\n * `:host` targets the shadow host element (<theo-devtools-portal>), so the\n * vars cascade to EVERY descendant in the shadow tree (chip + panel + all\n * portal-rendered children). Without `:host`, scoping by\n * `[data-theo-devtools-root]` would miss the portal-rendered children that\n * createPortal mounts as direct children of the shadow root (siblings of\n * the React root div, NOT descendants).\n */\nfunction ThemeVars({ resolved }: Readonly<{ resolved: 'light' | 'dark' }>) {\n const css = `:host { color-scheme: ${resolved}; ${buildThemeCssVars(resolved)} }`\n return <style data-theo-devtools-theme={resolved}>{css}</style>\n}\n\nexport function Overlay({ shadowRoot }: Readonly<{ shadowRoot: ShadowRoot }>) {\n const [state, dispatch] = useReducer(\n devtoolsReducer,\n initialState,\n // T4.2 — lazy init merges persisted preferences over defaults\n (initial) => ({ ...initial, ...loadFromStorage() }),\n )\n const styles = useMemo(() => createStyles(shadowRoot), [shadowRoot])\n const resolvedTheme = useResolvedTheme(state.theme)\n\n // T4.2 — persist on every change to preferences (open/position/theme/tab/visible)\n useEffect(() => {\n writeToStorage({\n position: state.position,\n theme: state.theme,\n open: state.open,\n activeTab: state.activeTab,\n visible: state.visible,\n })\n }, [state.position, state.theme, state.open, state.activeTab, state.visible])\n\n // useInsertionEffect runs DURING commit, before any DOM mutations —\n // earliest hook React gives us. Lets queued events (Pattern F) flush\n // before any component reads state.\n //\n // The window global pointer is install-once for the page lifetime\n // (see install-global.ts). Only the React dispatch reference is wired\n // up/down per mount — that one IS lifecycle-bound.\n useInsertionEffect(() => {\n dispatcher.setDispatch(dispatch)\n const uninstall = installDispatcherGlobal()\n return () => {\n dispatcher.setDispatch(null)\n uninstall()\n }\n }, [])\n\n // HMR bridge subscription runs in useEffect (after paint OK — events\n // either queue or dispatch synchronously, both safe paths).\n useEffect(() => {\n const sub = subscribeToServerEvents(dispatcher)\n return () => {\n sub.unsubscribe()\n }\n }, [])\n\n return (\n <DevtoolsContext.Provider value={{ shadowRoot, state, dispatch, styles }}>\n <ShadowPortal>\n <ThemeVars resolved={resolvedTheme} />\n <ActiveRouteTracker />\n <ShortcutsTracker />\n <Indicator />\n <Panel />\n </ShadowPortal>\n </DevtoolsContext.Provider>\n )\n}\n","/**\n * T2.1 — HMR bridge: subscribes the dispatcher to server-side events\n * delivered over Vite's HMR WebSocket (`import.meta.hot.on`).\n *\n * Server-side code calls `server.ws.send({ type: 'custom', event, data })`\n * via `broadcastToDevtools`; this bridge wires the client-side listener.\n *\n * EC-25: each callback wrapped in try/catch — a throwing reducer / type\n * mismatch must NOT propagate to Vite's HMR client (would kill HMR).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport {\n CHANNEL_CSRF_WARN,\n CHANNEL_ERROR,\n CHANNEL_MANIFEST,\n CHANNEL_REQUEST,\n CHANNEL_ROUTE_MATCHED,\n CHANNEL_AGENT_STREAM,\n type CsrfWarnPayload,\n type ErrorRecord,\n type RequestRecord,\n type RouteManifest,\n type AgentStreamRecord,\n} from '../shared.js'\n\nimport type { Dispatcher } from './dispatcher.js'\n\nexport interface ViteHot {\n on(event: string, cb: (data: unknown) => void): void\n off?: (event: string, cb: (data: unknown) => void) => void\n send?: (event: string, data?: unknown) => void\n}\n\nfunction getHot(): ViteHot | null {\n // import.meta.hot is undefined in production / non-Vite contexts.\n try {\n const hot = (import.meta as { hot?: ViteHot }).hot\n if (hot) return hot\n } catch {\n /* fall through */\n }\n // Test escape hatch — allow tests to inject a fake hot via globalThis.\n const g = (globalThis as { __theoViteHotForTests?: ViteHot }).__theoViteHotForTests\n return g ?? null\n}\n\n// `wrap` adapts a typed handler `(data: T) => void` into the untyped\n// Vite HMR contract `(data: unknown) => void`, casting once at the\n// boundary. `T` appears only on the argument by design — the cast IS\n// the value of the helper. ESLint flags this as `unnecessary-type-\n// parameters`, but removing T would force every call site to cast\n// internally, which is worse for readability.\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- T is the documentation; the cast lives here so call sites don't repeat it\nfunction wrap<T>(label: string, fn: (data: T) => void): (data: unknown) => void {\n return (data: unknown): void => {\n try {\n fn(data as T)\n } catch (err) {\n // EC-25: never propagate to HMR\n console.error(`[theo devtools] ${label} callback failed`, err)\n }\n }\n}\n\nexport interface BridgeSubscription {\n unsubscribe(): void\n}\n\n/**\n * Subscribe the dispatcher to all Theo devtools HMR channels.\n * Returns an unsubscribe function. No-op when not in dev / non-Vite context.\n */\nexport function subscribeToServerEvents(dispatcher: Dispatcher): BridgeSubscription {\n const hot = getHot()\n if (!hot) {\n // No HMR client (production, build, or non-Vite). No-op subscription\n // — unsubscribe() is a documented contract that intentionally does\n // nothing in this path.\n return {\n unsubscribe(): void {\n /* no-op: nothing to detach in non-HMR contexts */\n },\n }\n }\n\n const reqHandler = wrap<RequestRecord>('request', (req) => {\n dispatcher.onRequest(req)\n })\n const errHandler = wrap<ErrorRecord>('error', (err) => {\n dispatcher.onError(err)\n })\n const csrfHandler = wrap<CsrfWarnPayload>('csrf.warn', (p) => {\n dispatcher.onCsrfWarn(p)\n })\n const manifestHandler = wrap<RouteManifest>('manifest', (m) => {\n dispatcher.onManifestUpdated(m)\n })\n const routeMatchedHandler = wrap<{ path: string; chain: string[] }>(\n 'route-matched',\n ({ path, chain }) => {\n dispatcher.onRouteMatched(path, chain)\n },\n )\n\n const agentStreamHandler = wrap<AgentStreamRecord>('agent-stream', (event) => {\n dispatcher.onAgentStreamEvent(event)\n })\n\n hot.on(CHANNEL_REQUEST, reqHandler)\n hot.on(CHANNEL_ERROR, errHandler)\n hot.on(CHANNEL_CSRF_WARN, csrfHandler)\n hot.on(CHANNEL_MANIFEST, manifestHandler)\n hot.on(CHANNEL_ROUTE_MATCHED, routeMatchedHandler)\n hot.on(CHANNEL_AGENT_STREAM, agentStreamHandler)\n\n // T3.1 — solicit the latest manifest. The initial manifest broadcast\n // happens during `load()` for the manifest virtual module, which fires\n // BEFORE this bridge subscribes (typical page-load race). By sending a\n // request-manifest message AFTER subscribing, the server replies and\n // the bridge catches it. Fire-and-forget: safe even if server ignores.\n try {\n hot.send?.('theo:devtools:request-manifest', null)\n } catch {\n /* no-op */\n }\n\n return {\n unsubscribe() {\n hot.off?.(CHANNEL_REQUEST, reqHandler)\n hot.off?.(CHANNEL_ERROR, errHandler)\n hot.off?.(CHANNEL_CSRF_WARN, csrfHandler)\n hot.off?.(CHANNEL_MANIFEST, manifestHandler)\n hot.off?.(CHANNEL_ROUTE_MATCHED, routeMatchedHandler)\n },\n }\n}\n","/**\n * Stable global pointer to the devtools dispatcher singleton.\n *\n * Mirrors the React DevTools pattern (`__REACT_DEVTOOLS_GLOBAL_HOOK__`):\n * a synchronously-readable handle on `window` that callers in another\n * package (e.g. the `@theo/actions` virtual module client facade) can\n * use to dispatch telemetry without a cross-package dynamic import.\n *\n * Invariant — INSTALL ONCE, NEVER UNINSTALL:\n * The dispatcher is a module singleton with no lifecycle. The window\n * pointer just exposes that singleton to other realms. Clearing the\n * pointer on React unmount races with sibling mounts (StrictMode\n * double-invoke, HMR module replace) and silently drops telemetry —\n * the call-site reads `window.__theoDevtoolsDispatcher`, sees\n * undefined, and no-ops. This was the c7906fa regression.\n *\n * Returned cleanup is therefore a NO-OP for the global; it exists only\n * to keep the React effect contract honest (effects return cleanups).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { dispatcher } from './dispatcher.js'\n\ninterface WindowWithDispatcher {\n __theoDevtoolsDispatcher?: typeof dispatcher\n}\n\n// NO-OP cleanup. See module header: the global pointer is install-once\n// for the page lifetime. Tearing it down on cleanup races with sibling\n// mounts and was the root cause of the c7906fa Actions-tab silent-drop\n// regression. Caller still gets a function so it conforms to the React\n// effect-cleanup contract.\nfunction noopCleanup(): void {\n // intentional no-op\n}\n\nexport function installDispatcherGlobal(): () => void {\n if (typeof window === 'undefined') return noopCleanup\n const w = window as unknown as WindowWithDispatcher\n w.__theoDevtoolsDispatcher = dispatcher\n return noopCleanup\n}\n","/**\n * Devtools React context — shadow root + state + dispatch.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { createContext, useContext } from 'react'\n\nimport type { DevtoolsAction, DevtoolsState } from '../shared.js'\nimport type { StyleFactory } from '../styles/styles.js'\n\nexport interface DevtoolsContextValue {\n shadowRoot: ShadowRoot\n state: DevtoolsState\n dispatch: (action: DevtoolsAction) => void\n styles: StyleFactory\n}\n\nexport const DevtoolsContext = createContext<DevtoolsContextValue | null>(null)\n\nexport function useDevtoolsContext(): DevtoolsContextValue {\n const ctx = useContext(DevtoolsContext)\n if (!ctx) throw new Error('useDevtoolsContext: must be used inside <Overlay />')\n return ctx\n}\n","/**\n * T4.1 — Draggable state machine + velocity-aware corner snap.\n *\n * State machine: idle → press → drag → drag-end → idle\n *\n * - EC-8: click-after-drag swallow. The 'drag-end' state intercepts the\n * click that follows pointerup and prevents the default (else dragging\n * the chip would also toggle the panel).\n * - EC-9: right-click ignored (e.button !== 0 returns early).\n * - EC-10: transitionend listener removes ITSELF inside its own handler\n * to prevent leaks across many drags.\n * - EC-28: corner positions recomputed on every pointermove (NOT cached\n * at drag start). Window resize during drag would otherwise use stale\n * corners.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { DevtoolsPosition } from '../shared.js'\n\n// Pattern to extract `<x>px <y>px` from `el.style.translate`. The two\n// capture groups carry small numeric literals; the regex has no ambiguous\n// quantifier that could backtrack super-linearly (sonarjs/slow-regex is a\n// false positive here).\n// eslint-disable-next-line security/detect-unsafe-regex, sonarjs/slow-regex -- bounded numeric pattern, no nested quantifiers\nconst TRANSLATE_PATTERN = /(-?\\d+(?:\\.\\d+)?)px\\s+(-?\\d+(?:\\.\\d+)?)px/\n\ntype DragState =\n | { kind: 'idle' }\n | { kind: 'press'; startX: number; startY: number }\n | { kind: 'drag'; pointerId: number; lastX: number; lastY: number }\n | { kind: 'drag-end' }\n\ninterface Point {\n x: number\n y: number\n}\n\ninterface VelocitySample {\n position: Point\n timestamp: number\n}\n\nconst DRAG_THRESHOLD_PX = 5\nconst VELOCITY_SAMPLE_MIN_MS = 10\nconst VELOCITY_SAMPLE_LIMIT = 5\nconst SPRING_TRANSITION = 'translate 491ms cubic-bezier(0.485, -0.050, 0.285, 1.505)'\n\nfunction calcVelocity(history: VelocitySample[]): Point {\n if (history.length < 2) return { x: 0, y: 0 }\n const first = history[0]\n const last = history[history.length - 1]\n const dt = last.timestamp - first.timestamp\n if (dt === 0) return { x: 0, y: 0 }\n return {\n x: ((last.position.x - first.position.x) / dt) * 1000,\n y: ((last.position.y - first.position.y) / dt) * 1000,\n }\n}\n\nfunction projectVelocity(v: number, deceleration = 0.999): number {\n return ((v / 1000) * deceleration) / (1 - deceleration)\n}\n\n/**\n * Compute the 4 corner positions relative to viewport, accounting for\n * scrollbar width and current element size. EC-14: scrollbar offset.\n * EC-28: invoked on every move so window resize during drag is reflected.\n */\nexport function computeCorners(\n elementWidth: number,\n elementHeight: number,\n padding: number,\n): Record<DevtoolsPosition, Point> {\n const w = typeof window !== 'undefined' ? window.innerWidth : 1024\n const h = typeof window !== 'undefined' ? window.innerHeight : 768\n const scrollbarW = typeof document !== 'undefined' ? w - document.documentElement.clientWidth : 0\n\n return {\n 'top-left': { x: padding, y: padding },\n 'top-right': { x: w - elementWidth - padding - scrollbarW, y: padding },\n 'bottom-left': { x: padding, y: h - elementHeight - padding },\n 'bottom-right': {\n x: w - elementWidth - padding - scrollbarW,\n y: h - elementHeight - padding,\n },\n }\n}\n\n/**\n * Pick the nearest corner to a given point (Euclidean).\n * Exported for unit testing.\n */\nexport function nearestCorner(\n point: Point,\n corners: Record<DevtoolsPosition, Point>,\n): DevtoolsPosition {\n let best: DevtoolsPosition = 'bottom-right'\n let bestDist = Infinity\n for (const [k, p] of Object.entries(corners) as [DevtoolsPosition, Point][]) {\n const dx = point.x - p.x\n const dy = point.y - p.y\n const d = Math.sqrt(dx * dx + dy * dy)\n if (d < bestDist) {\n bestDist = d\n best = k\n }\n }\n return best\n}\n\nexport interface UseDragOptions {\n disabled?: boolean\n position: DevtoolsPosition\n padding: number\n onChange: (position: DevtoolsPosition) => void\n}\n\nexport interface UseDragApi {\n ref: React.RefObject<HTMLElement | null>\n onPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n}\n\n/**\n * Build the pointermove handler. Extracted from `useDrag` so the hook\n * fits within the max-lines-per-function ceiling. Captures the same refs\n * the hook owns.\n */\nfunction handlePointerMove(\n machine: React.RefObject<DragState>,\n ref: React.RefObject<HTMLElement | null>,\n velocityHistory: React.RefObject<VelocitySample[]>,\n lastSampleTime: React.RefObject<number>,\n): (ev: PointerEvent) => void {\n return (ev: PointerEvent): void => {\n const m = machine.current\n if (m.kind === 'idle') return\n\n // press → drag transition when threshold exceeded\n if (m.kind === 'press') {\n const dx = ev.clientX - m.startX\n const dy = ev.clientY - m.startY\n if (Math.sqrt(dx * dx + dy * dy) >= DRAG_THRESHOLD_PX) {\n machine.current = {\n kind: 'drag',\n pointerId: ev.pointerId,\n lastX: ev.clientX,\n lastY: ev.clientY,\n }\n try {\n ref.current?.setPointerCapture(ev.pointerId)\n } catch {\n /* setPointerCapture may throw if pointer already captured elsewhere */\n }\n } else {\n return\n }\n }\n\n const drag = machine.current\n if (drag.kind !== 'drag') return\n\n if (ref.current) {\n const el = ref.current\n const tx = ev.clientX - drag.lastX\n const ty = ev.clientY - drag.lastY\n const currentTranslate = el.style.translate\n let curX = 0\n let curY = 0\n if (currentTranslate) {\n const parts = TRANSLATE_PATTERN.exec(currentTranslate)\n if (parts) {\n curX = Number(parts[1])\n curY = Number(parts[2])\n }\n }\n el.style.translate = `${curX + tx}px ${curY + ty}px`\n drag.lastX = ev.clientX\n drag.lastY = ev.clientY\n }\n\n // velocity sampling (10ms apart, last 5 samples)\n const now = Date.now()\n if (now - lastSampleTime.current >= VELOCITY_SAMPLE_MIN_MS) {\n velocityHistory.current.push({ position: { x: ev.clientX, y: ev.clientY }, timestamp: now })\n if (velocityHistory.current.length > VELOCITY_SAMPLE_LIMIT) {\n velocityHistory.current.shift()\n }\n lastSampleTime.current = now\n }\n }\n}\n\n/**\n * useDrag hook. Returns a ref + pointerDown handler. State managed internally.\n *\n * Exported state machine — _machine and _setMachine are internal helpers.\n * Tests exercise via computeCorners + nearestCorner (pure helpers above);\n * full E2E coverage via Playwright (T4.4).\n */\nexport function useDrag(options: UseDragOptions): UseDragApi {\n const ref = useRef<HTMLElement | null>(null)\n const machine = useRef<DragState>({ kind: 'idle' })\n const velocityHistory = useRef<VelocitySample[]>([])\n const lastSampleTime = useRef(0)\n\n // EC-10: cleanup tracker — any move/up listeners attached during press/drag\n // get torn down here. Listener self-removal pattern means a one-off\n // transitionend handler removes itself; this cleanup handles the\n // pointer event pair.\n const cleanup = useRef<(() => void) | null>(null)\n\n // EC-10 transitionend self-removal helper\n function animateToCorner(corner: DevtoolsPosition): void {\n const el = ref.current\n if (!el) {\n options.onChange(corner)\n return\n }\n const corners = computeCorners(el.offsetWidth, el.offsetHeight, options.padding)\n const target = corners[corner]\n const onTransitionEnd = (ev: TransitionEvent) => {\n if (ev.propertyName !== 'translate') return\n el.removeEventListener('transitionend', onTransitionEnd)\n el.style.transition = ''\n el.style.translate = ''\n options.onChange(corner)\n }\n el.style.transition = SPRING_TRANSITION\n el.addEventListener('transitionend', onTransitionEnd)\n el.style.translate = `${target.x}px ${target.y}px`\n }\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent<HTMLElement>) => {\n if (options.disabled) return\n // EC-9: right-click and middle-click never start drag\n if (e.button !== 0) return\n if (machine.current.kind !== 'idle') return\n\n const startX = e.clientX\n const startY = e.clientY\n machine.current = { kind: 'press', startX, startY }\n velocityHistory.current = [{ position: { x: startX, y: startY }, timestamp: Date.now() }]\n lastSampleTime.current = Date.now()\n\n const onMove = handlePointerMove(machine, ref, velocityHistory, lastSampleTime)\n\n const onUp = (_ev: PointerEvent) => {\n const m = machine.current\n if (m.kind === 'drag') {\n // Project + snap\n const v = calcVelocity(velocityHistory.current)\n const el = ref.current\n if (el) {\n const corners = computeCorners(el.offsetWidth, el.offsetHeight, options.padding)\n const currentTranslate = el.style.translate\n let curX = 0\n let curY = 0\n if (currentTranslate) {\n const parts = TRANSLATE_PATTERN.exec(currentTranslate)\n if (parts) {\n curX = Number(parts[1])\n curY = Number(parts[2])\n }\n }\n const base = corners[options.position]\n const projectedPoint: Point = {\n x: base.x + curX + projectVelocity(v.x),\n y: base.y + curY + projectVelocity(v.y),\n }\n const snapTarget = nearestCorner(projectedPoint, corners)\n // EC-8: enter drag-end so the synthetic click that follows is swallowed\n machine.current = { kind: 'drag-end' }\n animateToCorner(snapTarget)\n // Reset drag-end → idle on next tick so future drags work\n setTimeout(() => {\n if (machine.current.kind === 'drag-end') {\n machine.current = { kind: 'idle' }\n }\n }, 0)\n }\n } else {\n // Was just a press (no drag) — that's a click; let it through\n machine.current = { kind: 'idle' }\n }\n velocityHistory.current = []\n cleanup.current?.()\n cleanup.current = null\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n cleanup.current = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n },\n // `animateToCorner` is intentionally not listed: re-binding listeners\n // every render would interrupt an in-flight drag. `animateToCorner`\n // reads only refs (no captured state), so a stale closure is safe.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [options.disabled, options.padding, options.position],\n )\n\n // EC-8: click handler on the element — swallow click that fires right\n // after a drag (browser's synthetic click after pointerup).\n useEffect(() => {\n const el = ref.current\n if (!el) return\n const onClickCapture = (ev: MouseEvent) => {\n if (machine.current.kind === 'drag-end') {\n ev.preventDefault()\n ev.stopPropagation()\n }\n }\n el.addEventListener('click', onClickCapture, true)\n return () => {\n el.removeEventListener('click', onClickCapture, true)\n }\n }, [])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanup.current?.()\n cleanup.current = null\n }\n }, [])\n\n return { ref, onPointerDown }\n}\n","/**\n * Devtools design tokens.\n *\n * Colors are exposed as CSS custom properties at the shadow root so\n * theme changes (light/dark/system) are visually instant — no component\n * re-render needed. Each surface references `var(--theo-...)`.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\ninterface Palette {\n bgPanel: string\n bgPanelHover: string\n bgChip: string\n bgChipHover: string\n border: string\n borderSubtle: string\n text: string\n textMuted: string\n textDim: string\n accent: string\n accentHover: string\n}\n\nconst darkPalette: Palette = {\n bgPanel: '#13151a',\n bgPanelHover: '#1c1f26',\n bgChip: '#13151a',\n bgChipHover: '#2a2d35',\n border: '#343841',\n borderSubtle: '#23262d',\n text: '#e6e6e6',\n textMuted: '#9aa0a6',\n textDim: '#6b7280',\n accent: '#7c3aed',\n accentHover: '#9061f9',\n}\n\nconst lightPalette: Palette = {\n bgPanel: '#ffffff',\n bgPanelHover: '#f5f5f7',\n bgChip: '#ffffff',\n bgChipHover: '#ececef',\n border: '#d4d4d8',\n borderSubtle: '#e4e4e7',\n text: '#1a1a1f',\n textMuted: '#52525b',\n textDim: '#9aa0a6',\n accent: '#6d28d9',\n accentHover: '#5b21b6',\n}\n\n/**\n * Build the CSS custom properties block for a resolved theme.\n * Inject into the shadow root so any `var(--theo-...)` reference\n * updates instantly when the host attribute flips.\n */\nexport function buildThemeCssVars(resolved: 'light' | 'dark'): string {\n const p = resolved === 'light' ? lightPalette : darkPalette\n return `\n --theo-bg-panel: ${p.bgPanel};\n --theo-bg-panel-hover: ${p.bgPanelHover};\n --theo-bg-chip: ${p.bgChip};\n --theo-bg-chip-hover: ${p.bgChipHover};\n --theo-border: ${p.border};\n --theo-border-subtle: ${p.borderSubtle};\n --theo-text: ${p.text};\n --theo-text-muted: ${p.textMuted};\n --theo-text-dim: ${p.textDim};\n --theo-accent: ${p.accent};\n --theo-accent-hover: ${p.accentHover};\n `\n}\n\nexport const tokens = {\n // Backward-compat: hardcoded constants now point at CSS vars.\n // Existing styles using `${tokens.colors.bgPanel}` resolve to\n // `var(--theo-bg-panel)` at render time.\n colors: {\n bgPanel: 'var(--theo-bg-panel)',\n bgPanelHover: 'var(--theo-bg-panel-hover)',\n bgChip: 'var(--theo-bg-chip)',\n bgChipHover: 'var(--theo-bg-chip-hover)',\n border: 'var(--theo-border)',\n borderSubtle: 'var(--theo-border-subtle)',\n text: 'var(--theo-text)',\n textMuted: 'var(--theo-text-muted)',\n textDim: 'var(--theo-text-dim)',\n accent: 'var(--theo-accent)',\n accentHover: 'var(--theo-accent-hover)',\n\n method: {\n GET: '#10b981',\n POST: '#3b82f6',\n PUT: '#f59e0b',\n PATCH: '#f59e0b',\n DELETE: '#ef4444',\n HEAD: '#6b7280',\n OPTIONS: '#6b7280',\n },\n\n status: {\n success: '#10b981',\n redirect: '#3b82f6',\n clientError: '#f59e0b',\n serverError: '#ef4444',\n unknown: '#6b7280',\n },\n\n error: {\n csrf: '#ef4444',\n unhandled: '#ef4444',\n console: '#f59e0b',\n },\n },\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '24px',\n xxl: '32px',\n },\n radius: {\n sm: '4px',\n md: '8px',\n lg: '12px',\n full: '9999px',\n },\n font: {\n family: 'system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif',\n mono: 'ui-monospace, Menlo, Monaco, Consolas, monospace',\n sizeXs: '11px',\n sizeSm: '12px',\n sizeMd: '14px',\n sizeLg: '16px',\n },\n zIndex: {\n chip: 2147483640,\n panel: 2147483641,\n },\n panel: {\n minWidth: 360,\n minHeight: 280,\n defaultWidth: 480,\n defaultHeight: 360,\n chipPadding: 20,\n },\n} as const\n\nexport function statusColor(s: number): string {\n if (s >= 200 && s < 300) return tokens.colors.status.success\n if (s >= 300 && s < 400) return tokens.colors.status.redirect\n if (s >= 400 && s < 500) return tokens.colors.status.clientError\n if (s >= 500) return tokens.colors.status.serverError\n return tokens.colors.status.unknown\n}\n\nexport function methodColor(method: string): string {\n const key = method.toUpperCase()\n const palette = tokens.colors.method as Record<string, string | undefined>\n return palette[key] ?? tokens.colors.status.unknown\n}\n","/**\n * Theo brand logo — official purple logo from theo-business/arquivos.\n * Resized to 128x128, embedded as base64 PNG (7.6KB).\n */\nexport const THEO_LOGO_BASE64 = 'data:image/png;base64,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'\n","/**\n * Theo brand logo — official purple logo from theo-business/arquivos.\n *\n * Embedded as base64 PNG (see ./assets/logo-data.ts) so the devtools UI has\n * zero external asset dependency.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { THEO_LOGO_BASE64 } from '../assets/logo-data.js'\n\nexport interface TheoLogoProps {\n size?: number\n}\n\nexport function TheoLogo({ size = 18 }: Readonly<TheoLogoProps>) {\n return (\n <img\n src={THEO_LOGO_BASE64}\n alt=\"TheoKit\"\n width={size}\n height={size}\n style={{\n display: 'inline-block',\n flexShrink: 0,\n }}\n />\n )\n}\n","/**\n * Devtools floating chip indicator.\n *\n * Phase 1: fixed corner.\n * Phase 4 (T4.1): draggable via useDrag.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport { useDrag } from '../hooks/useDrag.js'\nimport { tokens } from '../styles/tokens.js'\n\nimport { TheoLogo } from './TheoLogo.js'\n\nexport function Indicator() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n const drag = useDrag({\n disabled: state.open, // chip not draggable while panel is open\n position: state.position,\n padding: tokens.panel.chipPadding,\n onChange: (position) => {\n dispatch({ type: 'SET_POSITION', position })\n },\n })\n\n if (!state.visible) return null\n\n const [vertical, horizontal] = state.position.split('-', 2) as [\n 'top' | 'bottom',\n 'left' | 'right',\n ]\n\n // Logo-only chip — compact circular button. Logo at 35px.\n const buttonClass = styles.css`\n position: fixed;\n ${vertical}: ${tokens.panel.chipPadding}px;\n ${horizontal}: ${tokens.panel.chipPadding}px;\n z-index: ${tokens.zIndex.chip};\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm};\n background: ${tokens.colors.bgChip};\n color: ${tokens.colors.text};\n border: 1px solid ${tokens.colors.border};\n border-radius: ${tokens.radius.full};\n cursor: pointer;\n user-select: none;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);\n transition: background 150ms ease;\n &:hover { background: ${tokens.colors.bgChipHover}; }\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n `\n\n return (\n <button\n ref={drag.ref as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n aria-label=\"Open devtools\"\n aria-expanded={state.open}\n title=\"Theo Devtools\"\n className={buttonClass}\n onPointerDown={drag.onPointerDown}\n onClick={() => {\n dispatch({ type: 'TOGGLE_PANEL' })\n }}\n >\n <TheoLogo size={35} />\n </button>\n )\n}\n","/**\n * Actions tab — per-action-call telemetry (timestamp, name, status, duration).\n *\n * G3 plan T5.1 + ADR D7. Consumes `state.actionCalls` populated by\n * `dispatcher.onActionCall()`.\n *\n * UX: row-level inline expand/collapse, mirroring RequestsTab. Each row\n * is a click-to-toggle button; details render inline under the expanded\n * row. Multiple rows can be expanded simultaneously. JSONExplorer is\n * used for input/output bodies (nested collapsibility).\n *\n * EC absorbed:\n * - EC-12 (PII mask heuristic): bodies pass through maskPiiFields when\n * not revealed (password/token/secret/apiKey/credit_card/ssn/cpf/cnpj).\n * Click-to-reveal per-record toggle stores the unmasked view in local\n * component state (NEVER persisted; reset on tab close).\n * - EC-11 (tree-shake prod): the dispatcher emit path is __IS_DEV-guarded;\n * in prod the entire telemetry module is dead-code-eliminated.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { maskPiiFields } from '../../format/pii-mask.js'\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport type { ActionCallRecord } from '../../shared.js'\nimport { toggleExpandedIds } from '../../state/actions-row-state.js'\nimport { tokens } from '../../styles/tokens.js'\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts)\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nfunction formatPayload(value: unknown, reveal: boolean): string {\n const display = reveal ? value : maskPiiFields(value)\n try {\n return JSON.stringify(display, null, 2)\n } catch {\n return '<unserializable>'\n }\n}\n\nfunction buildActionsStyles(styles: ReturnType<typeof useDevtoolsContext>['styles']) {\n return {\n header: styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `,\n clearBtn: styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `,\n rowContainer: styles.css`\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n font-size: ${tokens.font.sizeXs};\n `,\n rowSummary: styles.css`\n display: grid;\n grid-template-columns: 24px 80px 1fr 80px 80px;\n gap: ${tokens.spacing.sm};\n align-items: center;\n width: 100%;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background: transparent;\n border: none;\n color: ${tokens.colors.text};\n text-align: left;\n cursor: pointer;\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeXs};\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n &[aria-expanded='true'] { background: ${tokens.colors.bgPanelHover}; }\n .chev { color: ${tokens.colors.textMuted}; font-family: ${tokens.font.mono}; }\n .name { font-family: ${tokens.font.mono}; }\n .time { color: ${tokens.colors.textMuted}; font-family: ${tokens.font.mono}; }\n .status-success { color: ${tokens.colors.accent}; }\n .status-error { color: #c92a2a; }\n .duration { color: ${tokens.colors.textMuted}; text-align: right; }\n `,\n detail: styles.css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border-top: 1px dashed ${tokens.colors.borderSubtle};\n font-size: ${tokens.font.sizeXs};\n pre {\n margin: 0;\n padding: ${tokens.spacing.xs};\n background: ${tokens.colors.borderSubtle};\n border-radius: ${tokens.radius.sm};\n overflow: auto;\n max-height: 200px;\n font-family: ${tokens.font.mono};\n }\n .reveal-btn {\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 8px;\n margin-bottom: ${tokens.spacing.xs};\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n }\n .reveal-btn:hover { color: ${tokens.colors.text}; }\n .section { margin-top: ${tokens.spacing.sm}; }\n .field-errors { margin-top: ${tokens.spacing.xs}; color: #c92a2a; }\n .field-errors li { margin-left: ${tokens.spacing.md}; }\n `,\n }\n}\n\nfunction ActionsEmptyState() {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No action calls yet. Trigger a server action (via <code>useAction</code> or direct{' '}\n <code>POST /_actions/&lt;name&gt;</code>) to see it here. Production builds tree-shake this\n telemetry path.\n </div>\n )\n}\n\nexport function ActionsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n const [revealedIds, setRevealedIds] = useState<Set<string>>(() => new Set())\n const [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set())\n\n if (state.actionCalls.length === 0) return <ActionsEmptyState />\n\n const cls = buildActionsStyles(styles)\n\n const toggleReveal = (id: string): void => {\n setRevealedIds((prev) => toggleExpandedIds(prev, id))\n }\n const toggleExpand = (id: string): void => {\n setExpandedIds((prev) => toggleExpandedIds(prev, id))\n }\n\n return (\n <div data-testid=\"devtools-actions-tab\">\n <ActionsHeader\n className={cls.header}\n clearBtnClass={cls.clearBtn}\n count={state.actionCalls.length}\n onClear={() => {\n dispatch({ type: 'RESET_ACTION_CALLS' })\n setRevealedIds(new Set())\n setExpandedIds(new Set())\n }}\n />\n <div>\n {state.actionCalls.map((r) => (\n <ActionRow\n key={r.id}\n record={r}\n containerClass={cls.rowContainer}\n summaryClass={cls.rowSummary}\n detailClass={cls.detail}\n expanded={expandedIds.has(r.id)}\n revealed={revealedIds.has(r.id)}\n onToggleExpand={() => {\n toggleExpand(r.id)\n }}\n onToggleReveal={() => {\n toggleReveal(r.id)\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n\nfunction ActionsHeader({\n className,\n clearBtnClass,\n count,\n onClear,\n}: Readonly<{ className: string; clearBtnClass: string; count: number; onClear: () => void }>) {\n return (\n <div className={className}>\n <span>\n {count} call{count === 1 ? '' : 's'}\n </span>\n <button type=\"button\" className={clearBtnClass} onClick={onClear}>\n Clear\n </button>\n </div>\n )\n}\n\nfunction ActionRow({\n record,\n containerClass,\n summaryClass,\n detailClass,\n expanded,\n revealed,\n onToggleExpand,\n onToggleReveal,\n}: Readonly<{\n record: ActionCallRecord\n containerClass: string\n summaryClass: string\n detailClass: string\n expanded: boolean\n revealed: boolean\n onToggleExpand: () => void\n onToggleReveal: () => void\n}>) {\n const statusClass = record.status === 'success' ? 'status-success' : 'status-error'\n return (\n <div className={containerClass} data-testid=\"devtools-action-row\">\n <button\n type=\"button\"\n className={summaryClass}\n onClick={onToggleExpand}\n aria-expanded={expanded}\n title={`${record.name} — click to ${expanded ? 'collapse' : 'expand'} details`}\n >\n <span className=\"chev\">{expanded ? '▼' : '▶'}</span>\n <span className=\"time\">{formatTime(record.timestamp)}</span>\n <span className=\"name\">{record.name}</span>\n <span className={statusClass}>{record.status}</span>\n <span className=\"duration\">{record.durationMs}ms</span>\n </button>\n {expanded && (\n <div className={detailClass}>\n <button type=\"button\" className=\"reveal-btn\" onClick={onToggleReveal}>\n {revealed ? 'Hide values' : 'Reveal values'}\n </button>\n <div className=\"section\">\n <strong>Input</strong>\n <pre>{formatPayload(record.input, revealed)}</pre>\n </div>\n {record.status === 'success' && record.output !== undefined && (\n <div className=\"section\">\n <strong>Output</strong>\n <pre>{formatPayload(record.output, revealed)}</pre>\n </div>\n )}\n {record.status === 'error' && record.error && <ActionDetailError error={record.error} />}\n </div>\n )}\n </div>\n )\n}\n\nfunction ActionDetailError({ error }: Readonly<{ error: NonNullable<ActionCallRecord['error']> }>) {\n return (\n <div className=\"section\">\n <strong>Error: {error.code}</strong>\n <p>{error.message}</p>\n {error.fields && Object.keys(error.fields).length > 0 && (\n <ul className=\"field-errors\">\n {Object.entries(error.fields).map(([field, msgs]) => (\n <li key={field}>\n <strong>{field || '(root)'}:</strong> {msgs.join('; ')}\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n","/**\n * PII masking heuristic for devtools Action Call records.\n *\n * Per plan g3-server-actions-and-useaction v1.2 § Phase 5 / T5.1 + ADR D7.\n * EC absorbed: EC-12 (PII mask heuristic).\n *\n * Heuristic regex matches common sensitive field names. Walks objects and\n * arrays recursively. Documented limitations:\n * - Falses positives (`tokenize` → masked because matches `token`) accepted;\n * click-to-reveal in the Actions tab mitigates.\n * - Falses negatives (PII in custom-named field like `userInput`) NOT detected.\n * Documented in ADR D7 as accepted v1 limitation.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\nconst SENSITIVE_KEY_PATTERN = /(password|token|secret|api_?key|apikey|credit_?card|ssn|cpf|cnpj)/i\n\n/**\n * Check whether a field key matches the sensitive-name heuristic.\n * Case-insensitive; partial-match (e.g., `userPassword` matches).\n */\nexport function isSensitiveKey(key: string): boolean {\n return SENSITIVE_KEY_PATTERN.test(key)\n}\n\n/**\n * Deep-mask sensitive fields in a value. Returns a new object/array with\n * sensitive values replaced by `'***'`. Non-objects pass through unchanged.\n * Walks arrays element-wise.\n */\nexport function maskPiiFields(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (typeof value !== 'object') return value\n if (Array.isArray(value)) {\n return value.map((item) => maskPiiFields(item))\n }\n const out: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n if (isSensitiveKey(key)) {\n out[key] = '***'\n } else {\n out[key] = maskPiiFields(val)\n }\n }\n return out\n}\n","/**\n * Pure state helpers for ActionsTab row-level expand/collapse.\n *\n * Mirrors RequestsTab UX: each row is a click-to-toggle button. State\n * lives in a single `Set<string>` of expanded ids — naturally React-safe\n * via clone-on-toggle and unmount-clean.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\nimport type { ActionCallRecord } from '../shared.js'\n\n/**\n * Toggle `id` membership in the expanded set. Returns a NEW Set (never\n * mutates the input) so React reference-equality detects the change.\n */\nexport function toggleExpandedIds(prev: Set<string>, id: string): Set<string> {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n}\n\n/**\n * Dedupe + sort ids from action records. Sorted order keeps row keys\n * stable across re-renders (otherwise React would tear down + remount\n * expanded rows when records re-arrive out of order).\n */\nexport function computeActionsTabIds(records: readonly ActionCallRecord[]): string[] {\n const seen = new Set<string>()\n for (const r of records) seen.add(r.id)\n return [...seen].sort((a, b) => a.localeCompare(b))\n}\n","/**\n * Agents tab — per-agent-run telemetry (timestamp, model, tokens, cost, duration).\n *\n * theokit-evolution-ci-and-dx Phase 3 (T3.2). Consumes `state.agentRuns`\n * populated by `dispatcher.onAgentRun()` which is called from\n * `server/cost/track-agent-run.ts` in dev mode (tree-shaken in prod).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts)\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nfunction formatCost(usd: number): string {\n if (usd === 0) return '$0.0000'\n if (usd < 0.0001) return `<$0.0001`\n return `$${usd.toFixed(4)}`\n}\n\nexport function AgentsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n if (state.agentRuns.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No agent runs yet. Trigger a request to an endpoint using <code>trackAgentRun</code> to see\n it here. (Wired in the saas template; opt-in elsewhere.)\n </div>\n )\n }\n\n const totalCost = state.agentRuns.reduce((sum, r) => sum + r.costUsd, 0)\n const totalIn = state.agentRuns.reduce((sum, r) => sum + r.tokensInput, 0)\n const totalOut = state.agentRuns.reduce((sum, r) => sum + r.tokensOutput, 0)\n\n const headerClass = styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const clearBtn = styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `\n const tableClass = styles.css`\n width: 100%;\n border-collapse: collapse;\n font-size: ${tokens.font.sizeXs};\n th, td {\n text-align: left;\n padding: 4px 8px;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n }\n th {\n color: ${tokens.colors.textMuted};\n font-weight: 500;\n font-size: ${tokens.font.sizeXs};\n }\n tr.status-error td { color: #c92a2a; }\n tr.status-aborted td { color: ${tokens.colors.textMuted}; }\n `\n\n return (\n <div data-testid=\"devtools-agents-tab\">\n <div className={headerClass}>\n <span>\n {state.agentRuns.length} run{state.agentRuns.length === 1 ? '' : 's'}\n {' · '}\n tokens {totalIn}/{totalOut}\n {' · '}\n {formatCost(totalCost)} total\n </span>\n <button\n type=\"button\"\n className={clearBtn}\n onClick={() => {\n dispatch({ type: 'RESET_AGENT_RUNS' })\n }}\n >\n clear\n </button>\n </div>\n <table className={tableClass}>\n <thead>\n <tr>\n <th>Time</th>\n <th>User</th>\n <th>Model</th>\n <th>Tokens (in/out)</th>\n <th>Cost</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n {state.agentRuns.map((run) => (\n <tr key={run.id} className={`status-${run.status}`}>\n <td>{formatTime(run.timestamp)}</td>\n <td>{run.userId}</td>\n <td>{run.model}</td>\n <td>\n {run.tokensInput}/{run.tokensOutput}\n </td>\n <td>{formatCost(run.costUsd)}</td>\n <td>{run.status}</td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* Live stream events */}\n {state.agentStreamEvents.length > 0 && (\n <>\n <div className={headerClass} style={{ marginTop: 12 }}>\n <span>🔴 Live Stream ({state.agentStreamEvents.length} events)</span>\n <button type=\"button\" className={clearBtn} onClick={() => dispatch({ type: 'RESET_AGENT_STREAM' })}>clear</button>\n </div>\n <div style={{ maxHeight: 200, overflow: 'auto', fontSize: tokens.font.sizeXs, fontFamily: 'monospace' }}>\n {state.agentStreamEvents.slice(-30).map((e, i) => (\n <div key={i} style={{ padding: '2px 4px', borderBottom: `1px solid ${tokens.colors.border}` }}>\n <span style={{ color: tokens.colors.textDim }}>{new Date(e.timestamp).toLocaleTimeString()}</span>\n {' '}\n <span style={{ color: e.type === 'error' ? '#c92a2a' : tokens.colors.accent }}>{e.type}</span>\n {e.content && <span style={{ color: tokens.colors.text }}> {e.content.substring(0, 80)}</span>}\n {e.toolName && <span style={{ color: tokens.colors.textMuted }}> → {e.toolName}</span>}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n )\n}\n","/**\n * CSRF Readiness tab (T2.2) — surfaces csrf.warn events captured by the\n * in-memory `CsrfReadinessStore`. Helps devs see which routes would\n * fail under 0.3.0 strict CSRF WITHOUT grepping stdout.\n *\n * Fetches GET /__theo/csrf-readiness on mount + every 5s while the tab\n * is open. Reset button POSTs /__theo/csrf-readiness/reset with the\n * required X-Theo-Action header.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect, useState, useCallback, type ReactElement } from 'react'\n\nimport {\n classifyCsrfReadinessError,\n type ClassifiedCsrfReadinessError,\n} from '../../format/csrf-readiness-classify.js'\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\n\ninterface ReadinessRoute {\n method: string\n path: string\n reason: string\n count: number\n firstSeen: string\n lastSeen: string\n}\n\ninterface ReadinessSummary {\n generatedAt: string\n totalEvents: number\n routes: ReadinessRoute[]\n}\n\nfunction buildTabStyles(styles: ReturnType<typeof useDevtoolsContext>['styles']) {\n return {\n container: styles.css`\n padding: ${tokens.spacing.md};\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n `,\n headerRow: styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: ${tokens.spacing.md};\n `,\n button: styles.css`\n padding: ${tokens.spacing.xs} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border: 1px solid ${tokens.colors.borderSubtle};\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeXs};\n cursor: pointer;\n border-radius: ${tokens.radius.sm};\n &:hover { background: ${tokens.colors.bgPanel}; }\n &:disabled { opacity: 0.5; cursor: not-allowed; }\n `,\n row: styles.css`\n display: grid;\n grid-template-columns: 60px 1fr auto;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n `,\n }\n}\n\nfunction ReadinessRow({\n rowClass,\n route,\n}: Readonly<{\n rowClass: string\n route: ReadinessRoute\n}>): ReactElement {\n return (\n <div className={rowClass}>\n <span style={{ color: tokens.colors.accent }}>{route.method}</span>\n <span>\n {route.path}\n <span style={{ color: tokens.colors.textMuted, marginLeft: tokens.spacing.sm }}>\n {route.reason}\n </span>\n </span>\n <span style={{ color: tokens.colors.textMuted }}>×{String(route.count)}</span>\n </div>\n )\n}\n\nexport function CsrfReadinessTab(): ReactElement {\n const { styles } = useDevtoolsContext()\n const cls = buildTabStyles(styles)\n const [data, setData] = useState<ReadinessSummary | null>(null)\n const [error, setError] = useState<ClassifiedCsrfReadinessError | null>(null)\n const [busy, setBusy] = useState(false)\n\n const fetchData = useCallback(async () => {\n try {\n const res = await fetch('/__theo/csrf-readiness')\n if (!res.ok) {\n setError(classifyCsrfReadinessError({ kind: 'http', status: res.status }))\n return\n }\n const json = (await res.json()) as ReadinessSummary\n setData(json)\n setError(null)\n } catch (e) {\n const classified = classifyCsrfReadinessError({ kind: 'thrown', error: e })\n // Silently ignore aborts — user navigated away mid-poll.\n if (classified.kind === 'aborted') return\n setError(classified)\n }\n }, [])\n\n useEffect(() => {\n void fetchData()\n const t = setInterval(() => void fetchData(), 5000)\n return () => {\n clearInterval(t)\n }\n }, [fetchData])\n\n const handleReset = useCallback(async () => {\n setBusy(true)\n try {\n await fetch('/__theo/csrf-readiness/reset', {\n method: 'POST',\n headers: { 'X-Theo-Action': '1', Origin: window.location.origin },\n })\n await fetchData()\n } finally {\n setBusy(false)\n }\n }, [fetchData])\n\n if (error) {\n return (\n <div\n className={cls.container}\n data-testid=\"devtools-csrf-readiness-error\"\n data-error-kind={error.kind}\n >\n <div style={{ color: tokens.colors.error.csrf }}>{error.summary}</div>\n {error.hint.length > 0 && (\n <p style={{ color: tokens.colors.textMuted, marginTop: tokens.spacing.sm }}>\n {error.hint}\n </p>\n )}\n </div>\n )\n }\n if (data === null) {\n return (\n <div className={cls.container} data-testid=\"devtools-csrf-readiness-loading\">\n Loading…\n </div>\n )\n }\n\n const isEmpty = data.totalEvents === 0\n const testid = isEmpty ? 'devtools-csrf-readiness-empty' : 'devtools-csrf-readiness'\n\n return (\n <div className={cls.container} data-testid={testid}>\n <div className={cls.headerRow}>\n <strong>\n {isEmpty\n ? 'CSRF Readiness'\n : `CSRF Readiness — ${String(data.totalEvents)} event(s) across ${String(data.routes.length)} route(s)`}\n </strong>\n <button\n type=\"button\"\n className={cls.button}\n disabled={busy}\n onClick={() => {\n void handleReset()\n }}\n >\n Reset\n </button>\n </div>\n {isEmpty ? (\n <div style={{ color: tokens.colors.textMuted }}>\n No csrf.warn events recorded. Endpoints are ready for 0.3.0 strict CSRF.\n </div>\n ) : (\n data.routes.map((r) => (\n <ReadinessRow key={`${r.method} ${r.path} ${r.reason}`} rowClass={cls.row} route={r} />\n ))\n )}\n </div>\n )\n}\n","/**\n * Pure classifier for CSRF Readiness tab fetch failures.\n *\n * Replaces the previous one-size-fits-all \"Failed to fetch — wire\n * csrfReadinessStore\" hint that surfaced regardless of the actual cause.\n * Maps each failure mode to an actionable `{kind, summary, hint}` so the\n * tab can direct the developer at the real problem (server down vs.\n * endpoint missing vs. unauthorized vs. crashed handler).\n *\n * Tested as a pure function (no DOM, no React, no fetch). The tab\n * consumes this via `classifyCsrfReadinessError(input)` and renders\n * `{summary, hint}` plus styles per `kind`.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\nexport type CsrfReadinessErrorKind =\n | 'store-not-wired' // HTTP 404 — endpoint missing (canonical case)\n | 'server-crash' // HTTP 5xx — server-side handler threw\n | 'unauthorized' // HTTP 401/403 — readiness route gated behind auth\n | 'unexpected-status' // Other 4xx — surface the status, no canned hint\n | 'server-unreachable' // TypeError \"Failed to fetch\" — dev server down/restarting\n | 'aborted' // AbortError — user navigated away, silent\n | 'unknown-error' // Fallback — unrecognized throw\n\nexport interface ClassifiedCsrfReadinessError {\n readonly kind: CsrfReadinessErrorKind\n /** Short, dev-facing description of WHAT happened. */\n readonly summary: string\n /** Actionable hint — WHAT TO DO next. Empty string for `aborted`. */\n readonly hint: string\n}\n\nexport type CsrfReadinessFailureInput =\n | { readonly kind: 'http'; readonly status: number }\n | { readonly kind: 'thrown'; readonly error: unknown }\n\nconst NETWORK_ERROR_PATTERN = /failed to fetch|networkerror|network request failed/i\n\nexport function classifyCsrfReadinessError(\n input: CsrfReadinessFailureInput,\n): ClassifiedCsrfReadinessError {\n if (input.kind === 'http') {\n return classifyHttpStatus(input.status)\n }\n return classifyThrown(input.error)\n}\n\nfunction classifyHttpStatus(status: number): ClassifiedCsrfReadinessError {\n if (status === 404) {\n return {\n kind: 'store-not-wired',\n summary: `Endpoint returned 404 — /__theo/csrf-readiness not registered.`,\n hint: 'Wire `csrfReadinessStore` in the api-middleware options to enable this tab.',\n }\n }\n if (status === 401 || status === 403) {\n return {\n kind: 'unauthorized',\n summary: `Endpoint returned ${String(status)} — the readiness route is auth-gated.`,\n hint: 'Authenticate (e.g. via session) before opening this tab, or move the route outside of requireAuth.',\n }\n }\n if (status >= 500 && status < 600) {\n return {\n kind: 'server-crash',\n summary: `Endpoint returned ${String(status)} — the readiness handler threw.`,\n hint: 'Check dev server logs (terminal running `theokit dev`) for the underlying stack trace.',\n }\n }\n return {\n kind: 'unexpected-status',\n summary: `Endpoint returned unexpected status ${String(status)}.`,\n hint: 'This is not a status the readiness route normally emits. Inspect the response body in Network tab.',\n }\n}\n\nfunction classifyThrown(error: unknown): ClassifiedCsrfReadinessError {\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n kind: 'aborted',\n summary: 'Request aborted.',\n hint: '',\n }\n }\n const message = error instanceof Error ? error.message : String(error)\n if (error instanceof TypeError && NETWORK_ERROR_PATTERN.test(message)) {\n return {\n kind: 'server-unreachable',\n summary: 'Dev server unreachable — request failed before any HTTP response.',\n hint: 'Restart the dev server (`theokit dev`) and verify the port matches the browser URL.',\n }\n }\n return {\n kind: 'unknown-error',\n summary: message.length > 0 ? message : 'Unknown error',\n hint: 'Open the browser DevTools Network panel to inspect the failed request.',\n }\n}\n","/**\n * ErrorRow — single error entry in the Errors tab.\n *\n * EC-27: stack truncated to 4KB display (1MB+ stacks would freeze main thread).\n * EC-20: NO dangerouslySetInnerHTML — React auto-escapes.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport type { ErrorRecord } from '../shared.js'\nimport { tokens } from '../styles/tokens.js'\n\nexport const STACK_DISPLAY_LIMIT = 4096\n\n/**\n * EC-27 — pure helper: cap stack trace display at 4KB.\n * Exported for unit testing — 1MB+ stacks would freeze main thread on render.\n */\nexport function truncateStackForDisplay(\n stack: string | undefined,\n limit = STACK_DISPLAY_LIMIT,\n): string | null {\n if (!stack) return null\n if (stack.length <= limit) return stack\n return `${stack.slice(0, limit)}\\n…[truncated ${stack.length - limit} chars]`\n}\n\nfunction typeColor(type: ErrorRecord['type']): string {\n switch (type) {\n case 'csrf.warn':\n return tokens.colors.error.csrf\n case 'unhandled':\n return tokens.colors.error.unhandled\n case 'console':\n default:\n return tokens.colors.error.console\n }\n}\n\nfunction typeIcon(type: ErrorRecord['type']): string {\n switch (type) {\n case 'csrf.warn':\n return '⛨'\n case 'unhandled':\n return '⚠'\n case 'console':\n default:\n return '!'\n }\n}\n\ninterface ErrorRowProps {\n error: ErrorRecord\n}\n\nexport function ErrorRow({ error }: Readonly<ErrorRowProps>) {\n const [expanded, setExpanded] = useState(false)\n const { styles } = useDevtoolsContext()\n\n const containerClass = styles.css`\n display: block;\n width: 100%;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const summaryClass = styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background: transparent;\n border: none;\n width: 100%;\n cursor: pointer;\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n text-align: left;\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n `\n const iconClass = styles.css`\n color: ${typeColor(error.type)};\n font-weight: 700;\n min-width: 16px;\n text-align: center;\n `\n const msgClass = styles.css`\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `\n const docLinkClass = styles.css`\n color: ${tokens.colors.accent};\n font-size: ${tokens.font.sizeXs};\n text-decoration: underline;\n &:hover { color: ${tokens.colors.accentHover}; }\n `\n const detailsClass = styles.css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border-top: 1px solid ${tokens.colors.borderSubtle};\n `\n\n // EC-27: cap stack display length (delegated to pure helper for testability)\n const displayedStack = truncateStackForDisplay(error.stack)\n\n // EC-20: render docsUrl only when present AND non-empty (don't show broken link)\n const showDocsLink = typeof error.docsUrl === 'string' && error.docsUrl.length > 0\n\n return (\n <div className={containerClass} data-testid=\"devtools-error-row\">\n <button\n type=\"button\"\n className={summaryClass}\n onClick={() => {\n setExpanded((e) => !e)\n }}\n aria-expanded={expanded}\n title={error.message}\n >\n <span className={iconClass} aria-hidden=\"true\">\n {typeIcon(error.type)}\n </span>\n <span className={msgClass}>{error.message}</span>\n {error.code && (\n <span\n style={{\n color: tokens.colors.textMuted,\n fontFamily: tokens.font.mono,\n fontSize: tokens.font.sizeXs,\n }}\n >\n {error.code}\n </span>\n )}\n </button>\n {expanded && (\n <div className={detailsClass}>\n {showDocsLink && (\n <div style={{ marginBottom: tokens.spacing.sm }}>\n <a\n href={error.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={docLinkClass}\n >\n Open migration guide\n </a>\n </div>\n )}\n {displayedStack && (\n <pre\n style={{\n margin: 0,\n padding: tokens.spacing.sm,\n background: tokens.colors.bgPanel,\n color: tokens.colors.textMuted,\n fontFamily: tokens.font.mono,\n fontSize: tokens.font.sizeXs,\n borderRadius: tokens.radius.sm,\n overflow: 'auto',\n maxHeight: '200px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {displayedStack}\n </pre>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Errors tab — list of recent errors (console, unhandled, csrf.warn).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\nimport { ErrorRow } from '../ErrorRow.js'\n\nexport function ErrorsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n if (state.errors.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No errors yet. csrf.warn, console.error and unhandled rejections will surface here.\n </div>\n )\n }\n\n const headerClass = styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const clearBtn = styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `\n\n return (\n <div data-testid=\"devtools-errors-tab\">\n <div className={headerClass}>\n <span>\n {state.errors.length} error{state.errors.length === 1 ? '' : 's'}\n </span>\n <button\n type=\"button\"\n className={clearBtn}\n onClick={() => {\n dispatch({ type: 'RESET_ERRORS' })\n }}\n >\n clear\n </button>\n </div>\n {state.errors.map((err) => (\n <ErrorRow key={err.id} error={err} />\n ))}\n </div>\n )\n}\n","/**\n * RequestRow — single request entry in the Requests tab.\n *\n * Renders method badge, path, status code, duration, traceId.\n * Click toggles expanded view (headers + body via JSONExplorer).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport type { RequestRecord } from '../shared.js'\nimport { methodColor, statusColor, tokens } from '../styles/tokens.js'\n\nimport { JSONExplorer } from './JSONExplorer.js'\n\ninterface RequestRowProps {\n request: RequestRecord\n}\n\nfunction buildRequestRowStyles(\n styles: ReturnType<typeof useDevtoolsContext>['styles'],\n request: RequestRecord,\n) {\n return {\n container: styles.css`\n display: block;\n width: 100%;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `,\n summary: styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background: transparent;\n border: none;\n width: 100%;\n cursor: pointer;\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n text-align: left;\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n `,\n methodBadge: styles.css`\n display: inline-block;\n min-width: 44px;\n padding: 1px 6px;\n border-radius: ${tokens.radius.sm};\n background: ${methodColor(request.method)}33;\n color: ${methodColor(request.method)};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n font-weight: 600;\n text-align: center;\n `,\n path: styles.css`\n flex: 1;\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n status: styles.css`\n color: ${statusColor(request.status)};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n `,\n dur: styles.css`\n color: ${tokens.colors.textMuted};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n min-width: 56px;\n text-align: right;\n `,\n trace: styles.css`\n color: ${tokens.colors.textDim};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n `,\n details: styles.css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border-top: 1px solid ${tokens.colors.borderSubtle};\n `,\n }\n}\n\nfunction formatDuration(ms: number | null | undefined): string {\n if (ms == null || !Number.isFinite(ms)) return '—'\n if (ms < 1) return '<1ms'\n return `${Math.round(ms)}ms`\n}\n\nexport function RequestRow({ request }: Readonly<RequestRowProps>) {\n const [expanded, setExpanded] = useState(false)\n const { styles } = useDevtoolsContext()\n const cls = buildRequestRowStyles(styles, request)\n const containerClass = cls.container\n const summaryClass = cls.summary\n const methodBadge = cls.methodBadge\n const pathClass = cls.path\n const statusClass = cls.status\n const durClass = cls.dur\n const traceClass = cls.trace\n const detailsClass = cls.details\n const displayDuration = formatDuration(request.durationMs)\n const displayStatus = request.status === 0 ? 'failed' : String(request.status)\n\n return (\n <div className={containerClass} data-testid=\"devtools-request-row\">\n <button\n type=\"button\"\n className={summaryClass}\n onClick={() => {\n setExpanded((e) => !e)\n }}\n aria-expanded={expanded}\n title={request.path}\n >\n <span className={methodBadge}>{request.method}</span>\n <span className={pathClass}>{request.path}</span>\n <span className={statusClass}>{displayStatus}</span>\n <span className={durClass}>{displayDuration}</span>\n <span className={traceClass}>{request.traceId.slice(0, 8)}</span>\n </button>\n {expanded && (\n <div className={detailsClass}>\n {request.csrfWarn && (\n <div style={{ color: tokens.colors.error.csrf, marginBottom: tokens.spacing.sm }}>\n CSRF warn:{' '}\n <a\n href={request.csrfWarn.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: tokens.colors.accent }}\n >\n {request.csrfWarn.code}\n </a>\n </div>\n )}\n {request.headers && (\n <JSONExplorer label=\"headers\" value={request.headers} defaultExpanded={false} />\n )}\n {request.bodyPreview !== undefined && request.bodyPreview !== '' && (\n <div\n style={{\n color: tokens.colors.textMuted,\n marginTop: tokens.spacing.sm,\n fontFamily: tokens.font.mono,\n fontSize: tokens.font.sizeXs,\n }}\n >\n body{request.bodyTruncated ? ` (truncated, ${request.bodyLength} bytes)` : ''}:\n <pre style={{ marginTop: 4, whiteSpace: 'pre-wrap', wordBreak: 'break-all' }}>\n {request.bodyPreview}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Recursive JSON walker — collapsible object/array tree.\n *\n * Adapted from TanStack router-devtools Explorer.tsx (pattern §7.2 of\n * .claude/knowledge-base/reference/devtools.md). Pagination at 100 entries.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport { tokens } from '../styles/tokens.js'\n\nconst PAGE_SIZE = 100\nconst MAX_STRING_DISPLAY = 256\n\nfunction describe(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'string') {\n const display =\n value.length > MAX_STRING_DISPLAY ? `${value.slice(0, MAX_STRING_DISPLAY)}…` : value\n return JSON.stringify(display)\n }\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (typeof value === 'bigint') return `${value.toString()}n`\n if (typeof value === 'function') return 'fn()'\n if (Array.isArray(value)) return `Array(${value.length})`\n return 'Object'\n}\n\ninterface ExplorerProps {\n label: string\n value: unknown\n defaultExpanded?: boolean\n depth?: number\n}\n\nexport function JSONExplorer({\n label,\n value,\n defaultExpanded = false,\n depth = 0,\n}: Readonly<ExplorerProps>) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n const [pageIndex, setPageIndex] = useState(0)\n const { styles } = useDevtoolsContext()\n\n const rowClass = styles.css`\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n line-height: 1.5;\n color: ${tokens.colors.text};\n padding-left: ${depth * 12}px;\n `\n const labelBtnClass = styles.css`\n background: transparent;\n border: none;\n color: ${tokens.colors.text};\n padding: 0;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n &:hover { color: ${tokens.colors.accentHover}; }\n `\n const keyClass = styles.css`color: ${tokens.colors.accent};`\n const valClass = styles.css`color: ${tokens.colors.textMuted};`\n\n if (value === null || value === undefined || typeof value !== 'object') {\n return (\n <div className={rowClass}>\n <span className={keyClass}>{label}</span>:{' '}\n <span className={valClass}>{describe(value)}</span>\n </div>\n )\n }\n\n const entries: [string, unknown][] = Array.isArray(value)\n ? value.map((v, i) => [String(i), v] as [string, unknown])\n : Object.entries(value as Record<string, unknown>)\n\n if (entries.length === 0) {\n return (\n <div className={rowClass}>\n <span className={keyClass}>{label}</span>:{' '}\n <span className={valClass}>{Array.isArray(value) ? '[]' : '{}'}</span>\n </div>\n )\n }\n\n const totalPages = Math.ceil(entries.length / PAGE_SIZE)\n const slice = entries.slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE)\n\n return (\n <div className={rowClass}>\n <button\n type=\"button\"\n className={labelBtnClass}\n onClick={() => {\n setExpanded((e) => !e)\n }}\n aria-expanded={expanded}\n >\n <span>{expanded ? '▾' : '▸'}</span>\n <span className={keyClass}>{label}</span>\n <span className={valClass}>{describe(value)}</span>\n </button>\n {expanded && (\n <div>\n {slice.map(([k, v]) => (\n <JSONExplorer key={k} label={k} value={v} depth={depth + 1} />\n ))}\n {totalPages > 1 && (\n <div\n className={styles.css`padding-left: ${(depth + 1) * 12}px; color: ${tokens.colors.textMuted}; font-size: ${tokens.font.sizeXs};`}\n >\n page {pageIndex + 1}/{totalPages}\n {pageIndex > 0 && (\n <button\n type=\"button\"\n className={labelBtnClass}\n onClick={() => {\n setPageIndex(pageIndex - 1)\n }}\n >\n prev\n </button>\n )}\n {pageIndex < totalPages - 1 && (\n <button\n type=\"button\"\n className={labelBtnClass}\n onClick={() => {\n setPageIndex(pageIndex + 1)\n }}\n >\n next\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Requests tab — list of recent HTTP requests.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\nimport { RequestRow } from '../RequestRow.js'\n\nexport function RequestsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n if (state.requests.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No requests yet. Make a fetch call in your app to see it here.\n </div>\n )\n }\n\n const headerClass = styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const clearBtn = styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `\n\n return (\n <div data-testid=\"devtools-requests-tab\">\n <div className={headerClass}>\n <span>\n {state.requests.length} request{state.requests.length === 1 ? '' : 's'}\n </span>\n <button\n type=\"button\"\n className={clearBtn}\n onClick={() => {\n dispatch({ type: 'RESET_REQUESTS' })\n }}\n >\n clear\n </button>\n </div>\n {state.requests.map((req) => (\n <RequestRow key={req.id} request={req} />\n ))}\n </div>\n )\n}\n","/**\n * Routes tab — file tree of app/** with active highlight (Phase 3 — T3.1).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\n\nexport function RoutesTab() {\n const { state, styles } = useDevtoolsContext()\n\n if (!state.routeManifest || state.routeManifest.routes.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n Routes will appear when the manifest loads.\n </div>\n )\n }\n\n const rowClass = styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.text};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n cursor: pointer;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n &[data-active='true'] {\n background: ${tokens.colors.bgPanelHover};\n border-left: 2px solid ${tokens.colors.accent};\n }\n `\n\n function openInEditor(file: string): void {\n fetch(`/__open-in-editor?file=${encodeURIComponent(file)}`)\n .then((res) => {\n if (!res.ok) {\n console.warn(\n '[theo devtools] Editor not configured — set VITE_EDITOR=code (or your editor) in your env',\n )\n }\n })\n .catch(() => {\n console.warn('[theo devtools] Editor not configured')\n })\n }\n\n return (\n <div data-testid=\"devtools-routes-tab\">\n <a\n href=\"/__theo/openapi/docs\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.css`\n display: inline-block;\n margin-bottom: 8px;\n padding: 4px 10px;\n font-size: ${tokens.font.sizeSm};\n color: ${tokens.colors.accent};\n border: 1px solid ${tokens.colors.accent};\n border-radius: 4px;\n text-decoration: none;\n &:hover { background: ${tokens.colors.accent}22; }\n `}\n >\n 📖 View API Docs\n </a>\n {state.routeManifest.routes.map((route) => {\n const active =\n state.activeRoutePath === route.path || state.activeChain.includes(route.absoluteFilePath)\n return (\n <button\n key={route.absoluteFilePath}\n type=\"button\"\n className={rowClass}\n data-active={active}\n onClick={() => {\n openInEditor(route.absoluteFilePath)\n }}\n title={`Open ${route.absoluteFilePath} in editor`}\n >\n <span\n style={{\n color: active ? tokens.colors.accent : tokens.colors.textMuted,\n minWidth: 12,\n }}\n >\n {active ? '▸' : ' '}\n </span>\n <span style={{ flex: 1 }}>{route.path}</span>\n <span style={{ color: tokens.colors.textDim, fontSize: tokens.font.sizeXs }}>\n {route.absoluteFilePath.split('/').slice(-2).join('/')}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n","/**\n * Settings tab — position + theme (Phase 4 T4.3).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport type { DevtoolsPosition, DevtoolsTheme } from '../../shared.js'\nimport { tokens } from '../../styles/tokens.js'\n\nconst POSITIONS: DevtoolsPosition[] = ['top-left', 'top-right', 'bottom-left', 'bottom-right']\nconst THEMES: DevtoolsTheme[] = ['light', 'dark', 'system']\n\nexport function SettingsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n const sectionClass = styles.css`\n margin-bottom: ${tokens.spacing.md};\n `\n const headingClass = styles.css`\n margin: 0 0 ${tokens.spacing.xs};\n font-size: ${tokens.font.sizeMd};\n color: ${tokens.colors.text};\n `\n const radioRowClass = styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} 0;\n color: ${tokens.colors.text};\n font-size: ${tokens.font.sizeSm};\n `\n\n return (\n <div data-testid=\"devtools-settings-tab\" style={{ padding: tokens.spacing.md }}>\n <fieldset className={sectionClass} style={{ border: 0, padding: 0, margin: 0 }}>\n <legend className={headingClass}>Position</legend>\n {POSITIONS.map((p) => (\n <label key={p} className={radioRowClass}>\n <input\n type=\"radio\"\n name=\"theo-devtools-position\"\n value={p}\n checked={state.position === p}\n onChange={() => {\n dispatch({ type: 'SET_POSITION', position: p })\n }}\n />\n <span>{p}</span>\n </label>\n ))}\n </fieldset>\n\n <fieldset className={sectionClass} style={{ border: 0, padding: 0, margin: 0 }}>\n <legend className={headingClass}>Theme</legend>\n {THEMES.map((t) => (\n <label key={t} className={radioRowClass}>\n <input\n type=\"radio\"\n name=\"theo-devtools-theme\"\n value={t}\n checked={state.theme === t}\n onChange={() => {\n dispatch({ type: 'SET_THEME', theme: t })\n }}\n />\n <span>{t}</span>\n </label>\n ))}\n </fieldset>\n </div>\n )\n}\n","/**\n * Devtools expandable panel.\n *\n * Renders header (tab buttons + close) + body (active tab content).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport type { DevtoolsTab } from '../shared.js'\nimport { tokens } from '../styles/tokens.js'\n\nimport { ActionsTab } from './Tabs/ActionsTab.js'\nimport { AgentsTab } from './Tabs/AgentsTab.js'\nimport { CsrfReadinessTab } from './Tabs/CsrfReadinessTab.js'\nimport { ErrorsTab } from './Tabs/ErrorsTab.js'\nimport { RequestsTab } from './Tabs/RequestsTab.js'\nimport { RoutesTab } from './Tabs/RoutesTab.js'\nimport { SettingsTab } from './Tabs/SettingsTab.js'\nimport { TheoLogo } from './TheoLogo.js'\n\nconst TABS: DevtoolsTab[] = [\n 'requests',\n 'routes',\n 'agents',\n 'actions',\n 'errors',\n 'csrf-readiness',\n 'settings',\n]\n\n// Style builder extracted to keep Panel's body under the line ceiling.\nfunction buildPanelStyles(\n styles: ReturnType<typeof useDevtoolsContext>['styles'],\n vertical: 'top' | 'bottom',\n horizontal: 'left' | 'right',\n verticalOffset: number,\n) {\n return {\n panel: styles.css`\n position: fixed;\n ${vertical}: ${verticalOffset}px;\n ${horizontal}: ${tokens.panel.chipPadding}px;\n z-index: ${tokens.zIndex.panel};\n width: ${tokens.panel.defaultWidth}px;\n height: ${tokens.panel.defaultHeight}px;\n background: ${tokens.colors.bgPanel};\n color: ${tokens.colors.text};\n border: 1px solid ${tokens.colors.border};\n border-radius: ${tokens.radius.md};\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5);\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n display: flex;\n flex-direction: column;\n overflow: hidden;\n `,\n header: styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n flex-shrink: 0;\n `,\n tabs: styles.css`\n display: flex;\n gap: ${tokens.spacing.xs};\n `,\n tabBtn: styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: none;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n text-transform: capitalize;\n &:hover {\n background: ${tokens.colors.bgPanelHover};\n color: ${tokens.colors.text};\n }\n &[data-active='true'] {\n background: ${tokens.colors.bgPanelHover};\n color: ${tokens.colors.text};\n }\n `,\n closeBtn: styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: none;\n cursor: pointer;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n border-radius: ${tokens.radius.sm};\n font-size: 16px;\n &:hover {\n background: ${tokens.colors.bgPanelHover};\n color: ${tokens.colors.text};\n }\n `,\n body: styles.css`\n flex: 1;\n overflow: auto;\n `,\n }\n}\n\nexport function Panel() {\n const { state, dispatch, styles } = useDevtoolsContext()\n if (!state.open) return null\n\n const [vertical, horizontal] = state.position.split('-', 2) as [\n 'top' | 'bottom',\n 'left' | 'right',\n ]\n const verticalOffset = tokens.panel.chipPadding + 56\n const cls = buildPanelStyles(styles, vertical, horizontal, verticalOffset)\n const panelClass = cls.panel\n const headerClass = cls.header\n const tabsClass = cls.tabs\n const tabBtnClass = cls.tabBtn\n const closeBtnClass = cls.closeBtn\n const bodyClass = cls.body\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Theo Devtools panel\"\n data-theo-devtools-panel=\"\"\n className={panelClass}\n >\n <div className={headerClass}>\n <div className={tabsClass} role=\"tablist\">\n <span\n className={styles.css`\n display: inline-flex;\n align-items: center;\n padding: 0 ${tokens.spacing.xs};\n opacity: 0.9;\n `}\n aria-hidden=\"true\"\n >\n <TheoLogo size={16} />\n </span>\n {TABS.map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n data-active={state.activeTab === t}\n aria-selected={state.activeTab === t}\n className={tabBtnClass}\n onClick={() => {\n dispatch({ type: 'SET_TAB', tab: t })\n }}\n >\n {t}\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n aria-label=\"Close devtools panel\"\n className={closeBtnClass}\n onClick={() => {\n dispatch({ type: 'TOGGLE_PANEL' })\n }}\n >\n ×\n </button>\n </div>\n <div className={bodyClass} data-testid=\"devtools-tab-body\">\n {state.activeTab === 'requests' && <RequestsTab />}\n {state.activeTab === 'routes' && <RoutesTab />}\n {state.activeTab === 'agents' && <AgentsTab />}\n {state.activeTab === 'actions' && <ActionsTab />}\n {state.activeTab === 'errors' && <ErrorsTab />}\n {state.activeTab === 'csrf-readiness' && <CsrfReadinessTab />}\n {state.activeTab === 'settings' && <SettingsTab />}\n </div>\n </div>\n )\n}\n","/**\n * T3.1 — Track the current pathname and dispatch ROUTE_MATCHED\n * with the matching route's layoutChain + leaf.\n *\n * Subscribes to `popstate` events; also patches history.pushState/replaceState\n * to fire a synthetic 'theo:devtools:locationchange' event so SPA navigation\n * is captured.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect } from 'react'\n\nimport type { RouteManifest } from '../shared.js'\n\nimport { useDevtoolsContext } from './useDevtoolsContext.js'\n\nconst LOCATION_CHANGE_EVENT = 'theo:devtools:locationchange'\n\nlet _historyPatched = false\n\nfunction patchHistoryOnce(): void {\n if (_historyPatched || typeof history === 'undefined') return\n _historyPatched = true\n const originalPush = history.pushState.bind(history)\n const originalReplace = history.replaceState.bind(history)\n history.pushState = function patchedPush(...args) {\n originalPush(...args)\n window.dispatchEvent(new Event(LOCATION_CHANGE_EVENT))\n }\n history.replaceState = function patchedReplace(...args) {\n originalReplace(...args)\n window.dispatchEvent(new Event(LOCATION_CHANGE_EVENT))\n }\n}\n\n/**\n * Match a runtime pathname against the manifest's route patterns.\n *\n * The route's `path` may contain `:slug` / `:slug?` / `*` style params\n * (the framework lifts react-router-style patterns). For v0 we do an\n * exact-or-prefix match: if the pathname equals the pattern after\n * normalizing trailing slash, return that route; otherwise pick the\n * longest-prefix match.\n *\n * Exported for unit testing.\n */\nexport function matchActiveRoute(\n pathname: string,\n manifest: RouteManifest,\n): { path: string; chain: string[] } | null {\n const norm = (s: string) => (s.length > 1 && s.endsWith('/') ? s.slice(0, -1) : s)\n const target = norm(pathname)\n\n // Exact match wins\n for (const route of manifest.routes) {\n if (norm(route.path) === target) {\n return { path: route.path, chain: [...route.layoutChain, route.absoluteFilePath] }\n }\n }\n\n // Otherwise longest-prefix match (for nested routes)\n let best: { path: string; chain: string[] } | null = null\n let bestLen = -1\n for (const route of manifest.routes) {\n const rp = norm(route.path)\n if (rp === '/' || target.startsWith(`${rp}/`)) {\n const len = rp.length\n if (len > bestLen) {\n bestLen = len\n best = { path: route.path, chain: [...route.layoutChain, route.absoluteFilePath] }\n }\n }\n }\n return best\n}\n\nexport function useActiveRoute(): void {\n const { state, dispatch } = useDevtoolsContext()\n const manifest = state.routeManifest\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n patchHistoryOnce()\n\n function update(): void {\n if (!manifest) return\n const match = matchActiveRoute(window.location.pathname, manifest)\n if (match) {\n dispatch({ type: 'ROUTE_MATCHED', path: match.path, chain: match.chain })\n }\n }\n\n // Initial match\n update()\n\n window.addEventListener('popstate', update)\n window.addEventListener(LOCATION_CHANGE_EVENT, update)\n\n return () => {\n window.removeEventListener('popstate', update)\n window.removeEventListener(LOCATION_CHANGE_EVENT, update)\n }\n }, [dispatch, manifest])\n}\n","/**\n * useResolvedTheme — resolves `'system'` to `'light'` / `'dark'` via\n * `prefers-color-scheme`. Tracks media query changes so flipping the\n * OS theme while devtools is open updates the UI immediately.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect, useState } from 'react'\n\nimport type { DevtoolsTheme } from '../shared.js'\n\n/**\n * Read `prefers-color-scheme`. `matchMedia` exists in every supported\n * browser, but `window` itself is absent in SSR and Node test runs — we\n * default to `'dark'` there. The `window`/`matchMedia` access is wrapped\n * in `typeof` checks rather than property dereferences so SSR never hits\n * a ReferenceError.\n */\nfunction getSystemTheme(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'\n}\n\nexport function useResolvedTheme(theme: DevtoolsTheme): 'light' | 'dark' {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => getSystemTheme())\n\n useEffect(() => {\n if (theme !== 'system') return\n if (typeof window === 'undefined') return\n const mq = window.matchMedia('(prefers-color-scheme: light)')\n const onChange = () => {\n setSystemTheme(mq.matches ? 'light' : 'dark')\n }\n onChange() // initial sync\n mq.addEventListener('change', onChange)\n return () => {\n mq.removeEventListener('change', onChange)\n }\n }, [theme])\n\n if (theme === 'light') return 'light'\n if (theme === 'dark') return 'dark'\n return systemTheme\n}\n","/**\n * T4.3 — Devtools keyboard shortcuts.\n *\n * - Escape: close panel (no-op when already closed)\n * - Cmd+Shift+D (Mac) / Ctrl+Shift+D (other): toggle chip visibility\n *\n * Pure helpers exported for testing (no DOM required).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect } from 'react'\n\nimport { useDevtoolsContext } from './useDevtoolsContext.js'\n\nexport interface ShortcutEvent {\n key: string\n shiftKey: boolean\n metaKey: boolean\n ctrlKey: boolean\n}\n\nfunction isMacPlatform(): boolean {\n if (typeof navigator === 'undefined') return false\n // `navigator.platform` is deprecated in favor of `navigator.userAgentData`,\n // but the modern API is still gated by an origin trial on most browsers\n // (2026). Falling back to `userAgent` covers Safari and older Firefox,\n // where the data API is absent. The combined check is intentional.\n const ua = navigator.userAgent\n // eslint-disable-next-line @typescript-eslint/no-deprecated, sonarjs/deprecation -- userAgentData not widely available yet\n const platform = navigator.platform\n return /Mac|iPhone|iPad/.test(platform) || /Macintosh|iPhone|iPad/.test(ua)\n}\n\nexport function isToggleVisibleShortcut(\n e: ShortcutEvent,\n isMac: boolean = isMacPlatform(),\n): boolean {\n if (!e.shiftKey) return false\n if (e.key !== 'd' && e.key !== 'D') return false\n return isMac ? e.metaKey : e.ctrlKey\n}\n\nexport function isCloseShortcut(e: ShortcutEvent): boolean {\n return e.key === 'Escape'\n}\n\nexport function useShortcuts(): void {\n const { state, dispatch } = useDevtoolsContext()\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n function onKeyUp(ev: KeyboardEvent) {\n if (isToggleVisibleShortcut(ev)) {\n ev.preventDefault()\n dispatch({ type: 'TOGGLE_VISIBLE' })\n return\n }\n if (isCloseShortcut(ev) && state.open) {\n ev.preventDefault()\n dispatch({ type: 'TOGGLE_PANEL' })\n }\n }\n\n window.addEventListener('keyup', onKeyUp)\n return () => {\n window.removeEventListener('keyup', onKeyUp)\n }\n }, [dispatch, state.open])\n}\n","/**\n * T4.2 — localStorage round-trip for devtools preferences.\n *\n * - EC-21: STORAGE_VERSION key shipped from day 0. Version mismatch\n * returns empty (defaults used) — protects against future schema drift.\n * - EC-29: per-key try/catch. Corrupt JSON in ONE key falls back to default\n * for THAT key; other valid keys remain restored.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport {\n type DevtoolsPosition,\n type DevtoolsState,\n type DevtoolsTab,\n type DevtoolsTheme,\n STORAGE_VERSION,\n} from '../shared.js'\n\nexport const STORAGE_KEYS = {\n version: 'theo-devtools-storage-version',\n position: 'theo-devtools-position',\n theme: 'theo-devtools-theme',\n open: 'theo-devtools-open',\n activeTab: 'theo-devtools-active-tab',\n visible: 'theo-devtools-visible',\n} as const\n\nfunction getLocalStorage(): Storage | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage\n } catch {\n return null\n }\n}\n\n/**\n * EC-29 — per-key read with isolated try/catch.\n * Corrupt JSON or missing key → fallback. Never throws.\n */\nfunction readKey<T>(key: string, fallback: T): T {\n const ls = getLocalStorage()\n if (!ls) return fallback\n try {\n const raw = ls.getItem(key)\n if (raw === null) return fallback\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nfunction writeKey(key: string, value: unknown): void {\n const ls = getLocalStorage()\n if (!ls) return\n try {\n ls.setItem(key, JSON.stringify(value))\n } catch {\n // Quota exceeded, private browsing, etc. — silently skip.\n }\n}\n\nexport type PersistedState = Pick<\n DevtoolsState,\n 'position' | 'theme' | 'open' | 'activeTab' | 'visible'\n>\n\nconst VALID_POSITIONS = new Set<DevtoolsPosition>([\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n])\nconst VALID_THEMES = new Set<DevtoolsTheme>(['light', 'dark', 'system'])\nconst VALID_TABS = new Set<DevtoolsTab>([\n 'requests',\n 'routes',\n 'errors',\n 'csrf-readiness',\n 'settings',\n])\n\nfunction asPosition(v: unknown): DevtoolsPosition | null {\n return typeof v === 'string' && VALID_POSITIONS.has(v as DevtoolsPosition)\n ? (v as DevtoolsPosition)\n : null\n}\nfunction asTheme(v: unknown): DevtoolsTheme | null {\n return typeof v === 'string' && VALID_THEMES.has(v as DevtoolsTheme) ? (v as DevtoolsTheme) : null\n}\nfunction asTab(v: unknown): DevtoolsTab | null {\n return typeof v === 'string' && VALID_TABS.has(v as DevtoolsTab) ? (v as DevtoolsTab) : null\n}\nfunction asBool(v: unknown): boolean | null {\n return typeof v === 'boolean' ? v : null\n}\n\n/**\n * Load persisted preferences from localStorage.\n *\n * EC-21: Returns {} if STORAGE_VERSION key does not match the current\n * version — defaults are used at the Overlay level. Any future major\n * version bump simply clears the slate without an explicit migration.\n *\n * EC-29: each field is read independently. Corrupt 'position' key does\n * NOT cause 'theme' to also reset.\n */\nexport function loadFromStorage(): Partial<PersistedState> {\n const storedVersion = readKey<number>(STORAGE_KEYS.version, 0)\n if (storedVersion !== STORAGE_VERSION) return {}\n\n const out: Partial<PersistedState> = {}\n\n const pos = asPosition(readKey<unknown>(STORAGE_KEYS.position, null))\n if (pos) out.position = pos\n\n const theme = asTheme(readKey<unknown>(STORAGE_KEYS.theme, null))\n if (theme) out.theme = theme\n\n const tab = asTab(readKey<unknown>(STORAGE_KEYS.activeTab, null))\n if (tab) out.activeTab = tab\n\n const open = asBool(readKey<unknown>(STORAGE_KEYS.open, null))\n if (open !== null) out.open = open\n\n const visible = asBool(readKey<unknown>(STORAGE_KEYS.visible, null))\n if (visible !== null) out.visible = visible\n\n return out\n}\n\n/**\n * Persist the current preferences. Always writes the version key first\n * so future loads can detect this schema.\n */\nexport function writeToStorage(s: PersistedState): void {\n writeKey(STORAGE_KEYS.version, STORAGE_VERSION)\n writeKey(STORAGE_KEYS.position, s.position)\n writeKey(STORAGE_KEYS.theme, s.theme)\n writeKey(STORAGE_KEYS.open, s.open)\n writeKey(STORAGE_KEYS.activeTab, s.activeTab)\n writeKey(STORAGE_KEYS.visible, s.visible)\n}\n","/**\n * Devtools reducer.\n *\n * EC-23 ring buffer cap 50 — requests/errors capped at RING_BUFFER_CAP.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport {\n type DevtoolsAction,\n type DevtoolsState,\n type ErrorRecord,\n RING_BUFFER_CAP,\n initialState,\n} from '../shared.js'\n\nfunction appendCapped<T>(arr: T[], item: T, cap = RING_BUFFER_CAP): T[] {\n return [item, ...arr].slice(0, cap)\n}\n\nfunction reduceAppend(state: DevtoolsState, action: DevtoolsAction): DevtoolsState | null {\n switch (action.type) {\n case 'REQUEST_ADD':\n return { ...state, requests: appendCapped(state.requests, action.request) }\n case 'ERROR_ADD':\n return { ...state, errors: appendCapped(state.errors, action.error) }\n case 'AGENT_RUN_ADD':\n return { ...state, agentRuns: appendCapped(state.agentRuns, action.run) }\n case 'ACTION_CALL_ADD':\n return { ...state, actionCalls: appendCapped(state.actionCalls, action.record) }\n case 'AGENT_STREAM_EVENT':\n return { ...state, agentStreamEvents: appendCapped(state.agentStreamEvents, action.event) }\n default:\n return null\n }\n}\n\nfunction reduceReset(state: DevtoolsState, action: DevtoolsAction): DevtoolsState | null {\n switch (action.type) {\n case 'RESET_REQUESTS':\n return { ...state, requests: [] }\n case 'RESET_ERRORS':\n return { ...state, errors: [] }\n case 'RESET_AGENT_RUNS':\n return { ...state, agentRuns: [] }\n case 'RESET_ACTION_CALLS':\n return { ...state, actionCalls: [] }\n case 'RESET_AGENT_STREAM':\n return { ...state, agentStreamEvents: [] }\n default:\n return null\n }\n}\n\nfunction csrfWarnToErrorRecord(payload: {\n method: string\n path: string\n reason: string\n code?: string\n docsUrl?: string\n}): ErrorRecord {\n return {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-secret correlation id for devtools UI\n id: `csrf-${String(Date.now())}-${Math.random().toString(36).slice(2, 8)}`,\n type: 'csrf.warn',\n message: `CSRF warn: ${payload.method} ${payload.path} — ${payload.reason}`,\n code: payload.code,\n docsUrl: payload.docsUrl,\n timestamp: Date.now(),\n }\n}\n\nexport function devtoolsReducer(state: DevtoolsState, action: DevtoolsAction): DevtoolsState {\n switch (action.type) {\n case 'TOGGLE_PANEL':\n return { ...state, open: !state.open }\n case 'TOGGLE_VISIBLE':\n return { ...state, visible: !state.visible }\n case 'SET_TAB':\n return { ...state, activeTab: action.tab }\n case 'SET_POSITION':\n return { ...state, position: action.position }\n case 'SET_THEME':\n return { ...state, theme: action.theme }\n case 'CSRF_WARN':\n return { ...state, errors: appendCapped(state.errors, csrfWarnToErrorRecord(action.payload)) }\n case 'MANIFEST_UPDATED':\n return { ...state, routeManifest: action.manifest }\n case 'ROUTE_MATCHED':\n return { ...state, activeRoutePath: action.path, activeChain: action.chain }\n default:\n return reduceAppend(state, action) ?? reduceReset(state, action) ?? state\n }\n}\n\nexport { initialState }\n","/**\n * Goober-based CSS factory scoped to a Shadow DOM target.\n *\n * Devtools UI lives inside an open shadow root. Global stylesheets\n * (Tailwind, user app CSS) do not reach into shadow roots; goober's\n * `css.bind({ target })` injects styles INSIDE the shadow root so\n * our UI renders correctly while the user's app stays untouched.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { css as gooberCss, setup as gooberSetup } from 'goober'\n\nlet _initialized: WeakSet<ShadowRoot> | null = null\n\nfunction getInitialized(): WeakSet<ShadowRoot> {\n _initialized ??= new WeakSet()\n return _initialized\n}\n\nexport interface StyleFactory {\n css: typeof gooberCss\n}\n\n/**\n * Create a goober css tag bound to a specific Shadow DOM target.\n *\n * Subsequent calls with the same shadowRoot return cached factory.\n * EC-23 / EC-25 unrelated; this just ensures we don't re-bind goober per render.\n */\nexport function createStyles(shadowRoot: ShadowRoot): StyleFactory {\n const initialized = getInitialized()\n if (!initialized.has(shadowRoot)) {\n // goober's setup() registers the global `css` tag's target.\n // We pass a no-op pragma since we use bind() per shadow root.\n gooberSetup(null as never)\n initialized.add(shadowRoot)\n }\n\n // goober.css.bind({ target }) returns a new tagged template fn whose\n // emitted styles land inside shadowRoot, not document.head.\n const bound = (\n gooberCss as unknown as { bind: (ctx: { target: ShadowRoot }) => typeof gooberCss }\n ).bind({\n target: shadowRoot,\n })\n\n return { css: bound }\n}\n","/**\n * Render React children inside the devtools Shadow Root via createPortal.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\n\nexport function ShadowPortal({ children }: { children: ReactNode }) {\n const { shadowRoot } = useDevtoolsContext()\n return createPortal(children, shadowRoot)\n}\n"],"mappings":"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","names":["useEffect","dispatcher","history","jsx","jsx","jsx","jsxs","formatTime","useEffect","useState","useCallback","jsx","jsxs","useState","useCallback","useEffect","useState","jsx","jsxs","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useEffect","useEffect","useEffect","useState","useEffect","useEffect","jsx","jsxs","useEffect","jsx"]}
1
+ {"version":3,"sources":["../../src/devtools/dom/entry.tsx","../../src/devtools/dom/Overlay.tsx","../../src/devtools/bridge/hmr-bridge.ts","../../src/devtools/bridge/install-global.ts","../../src/devtools/hooks/useDevtoolsContext.ts","../../src/devtools/hooks/useDrag.ts","../../src/devtools/styles/tokens.ts","../../src/devtools/assets/logo-data.ts","../../src/devtools/components/TheoLogo.tsx","../../src/devtools/components/Indicator.tsx","../../src/devtools/components/Tabs/ActionsTab.tsx","../../src/devtools/format/pii-mask.ts","../../src/devtools/state/actions-row-state.ts","../../src/devtools/components/Tabs/AgentsTab.tsx","../../src/devtools/components/Tabs/CsrfReadinessTab.tsx","../../src/devtools/format/csrf-readiness-classify.ts","../../src/devtools/components/ErrorRow.tsx","../../src/devtools/components/Tabs/ErrorsTab.tsx","../../src/devtools/components/RequestRow.tsx","../../src/devtools/components/JSONExplorer.tsx","../../src/devtools/components/Tabs/RequestsTab.tsx","../../src/devtools/components/Tabs/RoutesTab.tsx","../../src/devtools/components/Tabs/SettingsTab.tsx","../../src/devtools/components/Panel.tsx","../../src/devtools/hooks/useActiveRoute.ts","../../src/devtools/hooks/useResolvedTheme.ts","../../src/devtools/hooks/useShortcuts.ts","../../src/devtools/state/persistence.ts","../../src/devtools/state/reducer.ts","../../src/devtools/styles/styles.ts","../../src/devtools/dom/shadow-portal.tsx"],"sourcesContent":["/**\n * Devtools entry — runs in the browser, in DEV only.\n *\n * - EC-1: wrapper element has `position: absolute` so parent `body { display: flex }`\n * does not skew the overlay layout.\n * - EC-12: custom element name namespaced as `theo-devtools-portal` to avoid collision.\n * Guarded by `customElements.get` so HMR re-execution doesn't re-define.\n * - EC-16: singleton flag on `window.__theoDevtoolsMounted` prevents double-mount\n * on HMR module re-run.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\n\nimport { Overlay } from './Overlay.js'\n\ndeclare global {\n interface Window {\n __theoDevtoolsMounted?: boolean\n }\n}\n\nconst PORTAL_TAG = 'theo-devtools-portal'\n\nfunction definePortalElement(): void {\n if (typeof customElements === 'undefined') return\n if (customElements.get(PORTAL_TAG)) return\n customElements.define(PORTAL_TAG, class TheoDevtoolsPortal extends HTMLElement {})\n}\n\nfunction mount(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n if (window.__theoDevtoolsMounted) return\n window.__theoDevtoolsMounted = true\n\n definePortalElement()\n\n // EC-1: wrapper script-tag with position: absolute removes the wrapper from\n // a flexbox parent's layout — chip+panel float free of user app layout.\n const wrapper = document.createElement('script')\n wrapper.style.display = 'block'\n wrapper.style.position = 'absolute'\n wrapper.setAttribute('data-theo-devtools', 'true')\n wrapper.setAttribute('type', 'application/json')\n\n const host = document.createElement(PORTAL_TAG)\n wrapper.appendChild(host)\n document.body.appendChild(wrapper)\n\n const shadowRoot = host.attachShadow({ mode: 'open' })\n\n const reactRootHost = document.createElement('div')\n reactRootHost.setAttribute('data-theo-devtools-root', '')\n shadowRoot.appendChild(reactRootHost)\n\n const root = createRoot(reactRootHost)\n root.render(\n <StrictMode>\n <Overlay shadowRoot={shadowRoot} />\n </StrictMode>,\n )\n}\n\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mount, { once: true })\n } else {\n mount()\n }\n}\n","/**\n * Devtools root component.\n *\n * Phase 1: shell (chip + panel).\n * Phase 2: dispatcher wiring via useInsertionEffect + HMR subscription.\n *\n * EC-24: setDispatch is idempotent (NULL → non-null only). React.StrictMode\n * double-effect safe — second mount sets the same dispatch fn; no double-flush.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect, useInsertionEffect, useMemo, useReducer } from 'react'\n\nimport { dispatcher } from '../bridge/dispatcher.js'\nimport { subscribeToServerEvents } from '../bridge/hmr-bridge.js'\nimport { installDispatcherGlobal } from '../bridge/install-global.js'\nimport { Indicator } from '../components/Indicator.js'\nimport { Panel } from '../components/Panel.js'\nimport { useActiveRoute } from '../hooks/useActiveRoute.js'\nimport { DevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport { useResolvedTheme } from '../hooks/useResolvedTheme.js'\nimport { useShortcuts } from '../hooks/useShortcuts.js'\nimport { loadFromStorage, writeToStorage } from '../state/persistence.js'\nimport { devtoolsReducer, initialState } from '../state/reducer.js'\nimport { createStyles } from '../styles/styles.js'\nimport { buildThemeCssVars } from '../styles/tokens.js'\n\nimport { ShadowPortal } from './shadow-portal.js'\n\nfunction ActiveRouteTracker() {\n useActiveRoute()\n return null\n}\n\nfunction ShortcutsTracker() {\n useShortcuts()\n return null\n}\n\n/**\n * Inject CSS custom properties for the resolved theme into the shadow root.\n *\n * `:host` targets the shadow host element (<theo-devtools-portal>), so the\n * vars cascade to EVERY descendant in the shadow tree (chip + panel + all\n * portal-rendered children). Without `:host`, scoping by\n * `[data-theo-devtools-root]` would miss the portal-rendered children that\n * createPortal mounts as direct children of the shadow root (siblings of\n * the React root div, NOT descendants).\n */\nfunction ThemeVars({ resolved }: Readonly<{ resolved: 'light' | 'dark' }>) {\n const css = `:host { color-scheme: ${resolved}; ${buildThemeCssVars(resolved)} }`\n return <style data-theo-devtools-theme={resolved}>{css}</style>\n}\n\nexport function Overlay({ shadowRoot }: Readonly<{ shadowRoot: ShadowRoot }>) {\n const [state, dispatch] = useReducer(\n devtoolsReducer,\n initialState,\n // T4.2 — lazy init merges persisted preferences over defaults\n (initial) => ({ ...initial, ...loadFromStorage() }),\n )\n const styles = useMemo(() => createStyles(shadowRoot), [shadowRoot])\n const resolvedTheme = useResolvedTheme(state.theme)\n\n // T4.2 — persist on every change to preferences (open/position/theme/tab/visible)\n useEffect(() => {\n writeToStorage({\n position: state.position,\n theme: state.theme,\n open: state.open,\n activeTab: state.activeTab,\n visible: state.visible,\n })\n }, [state.position, state.theme, state.open, state.activeTab, state.visible])\n\n // useInsertionEffect runs DURING commit, before any DOM mutations —\n // earliest hook React gives us. Lets queued events (Pattern F) flush\n // before any component reads state.\n //\n // The window global pointer is install-once for the page lifetime\n // (see install-global.ts). Only the React dispatch reference is wired\n // up/down per mount — that one IS lifecycle-bound.\n useInsertionEffect(() => {\n dispatcher.setDispatch(dispatch)\n const uninstall = installDispatcherGlobal()\n return () => {\n dispatcher.setDispatch(null)\n uninstall()\n }\n }, [])\n\n // HMR bridge subscription runs in useEffect (after paint OK — events\n // either queue or dispatch synchronously, both safe paths).\n useEffect(() => {\n const sub = subscribeToServerEvents(dispatcher)\n return () => {\n sub.unsubscribe()\n }\n }, [])\n\n return (\n <DevtoolsContext.Provider value={{ shadowRoot, state, dispatch, styles }}>\n <ShadowPortal>\n <ThemeVars resolved={resolvedTheme} />\n <ActiveRouteTracker />\n <ShortcutsTracker />\n <Indicator />\n <Panel />\n </ShadowPortal>\n </DevtoolsContext.Provider>\n )\n}\n","/**\n * T2.1 — HMR bridge: subscribes the dispatcher to server-side events\n * delivered over Vite's HMR WebSocket (`import.meta.hot.on`).\n *\n * Server-side code calls `server.ws.send({ type: 'custom', event, data })`\n * via `broadcastToDevtools`; this bridge wires the client-side listener.\n *\n * EC-25: each callback wrapped in try/catch — a throwing reducer / type\n * mismatch must NOT propagate to Vite's HMR client (would kill HMR).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport {\n CHANNEL_CSRF_WARN,\n CHANNEL_ERROR,\n CHANNEL_MANIFEST,\n CHANNEL_REQUEST,\n CHANNEL_ROUTE_MATCHED,\n CHANNEL_AGENT_STREAM,\n type CsrfWarnPayload,\n type ErrorRecord,\n type RequestRecord,\n type RouteManifest,\n type AgentStreamRecord,\n} from '../shared.js'\n\nimport type { Dispatcher } from './dispatcher.js'\n\nexport interface ViteHot {\n on(event: string, cb: (data: unknown) => void): void\n off?: (event: string, cb: (data: unknown) => void) => void\n send?: (event: string, data?: unknown) => void\n}\n\nfunction getHot(): ViteHot | null {\n // import.meta.hot is undefined in production / non-Vite contexts.\n try {\n const hot = (import.meta as { hot?: ViteHot }).hot\n if (hot) return hot\n } catch {\n /* fall through */\n }\n // Test escape hatch — allow tests to inject a fake hot via globalThis.\n const g = (globalThis as { __theoViteHotForTests?: ViteHot }).__theoViteHotForTests\n return g ?? null\n}\n\n// `wrap` adapts a typed handler `(data: T) => void` into the untyped\n// Vite HMR contract `(data: unknown) => void`, casting once at the\n// boundary. `T` appears only on the argument by design — the cast IS\n// the value of the helper. ESLint flags this as `unnecessary-type-\n// parameters`, but removing T would force every call site to cast\n// internally, which is worse for readability.\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- T is the documentation; the cast lives here so call sites don't repeat it\nfunction wrap<T>(label: string, fn: (data: T) => void): (data: unknown) => void {\n return (data: unknown): void => {\n try {\n fn(data as T)\n } catch (err) {\n // EC-25: never propagate to HMR\n console.error(`[theo devtools] ${label} callback failed`, err)\n }\n }\n}\n\nexport interface BridgeSubscription {\n unsubscribe(): void\n}\n\n/**\n * Subscribe the dispatcher to all Theo devtools HMR channels.\n * Returns an unsubscribe function. No-op when not in dev / non-Vite context.\n */\nexport function subscribeToServerEvents(dispatcher: Dispatcher): BridgeSubscription {\n const hot = getHot()\n if (!hot) {\n // No HMR client (production, build, or non-Vite). No-op subscription\n // — unsubscribe() is a documented contract that intentionally does\n // nothing in this path.\n return {\n unsubscribe(): void {\n /* no-op: nothing to detach in non-HMR contexts */\n },\n }\n }\n\n const reqHandler = wrap<RequestRecord>('request', (req) => {\n dispatcher.onRequest(req)\n })\n const errHandler = wrap<ErrorRecord>('error', (err) => {\n dispatcher.onError(err)\n })\n const csrfHandler = wrap<CsrfWarnPayload>('csrf.warn', (p) => {\n dispatcher.onCsrfWarn(p)\n })\n const manifestHandler = wrap<RouteManifest>('manifest', (m) => {\n dispatcher.onManifestUpdated(m)\n })\n const routeMatchedHandler = wrap<{ path: string; chain: string[] }>(\n 'route-matched',\n ({ path, chain }) => {\n dispatcher.onRouteMatched(path, chain)\n },\n )\n\n const agentStreamHandler = wrap<AgentStreamRecord>('agent-stream', (event) => {\n dispatcher.onAgentStreamEvent(event)\n })\n\n hot.on(CHANNEL_REQUEST, reqHandler)\n hot.on(CHANNEL_ERROR, errHandler)\n hot.on(CHANNEL_CSRF_WARN, csrfHandler)\n hot.on(CHANNEL_MANIFEST, manifestHandler)\n hot.on(CHANNEL_ROUTE_MATCHED, routeMatchedHandler)\n hot.on(CHANNEL_AGENT_STREAM, agentStreamHandler)\n\n // T3.1 — solicit the latest manifest. The initial manifest broadcast\n // happens during `load()` for the manifest virtual module, which fires\n // BEFORE this bridge subscribes (typical page-load race). By sending a\n // request-manifest message AFTER subscribing, the server replies and\n // the bridge catches it. Fire-and-forget: safe even if server ignores.\n try {\n hot.send?.('theo:devtools:request-manifest', null)\n } catch {\n /* no-op */\n }\n\n return {\n unsubscribe() {\n hot.off?.(CHANNEL_REQUEST, reqHandler)\n hot.off?.(CHANNEL_ERROR, errHandler)\n hot.off?.(CHANNEL_CSRF_WARN, csrfHandler)\n hot.off?.(CHANNEL_MANIFEST, manifestHandler)\n hot.off?.(CHANNEL_ROUTE_MATCHED, routeMatchedHandler)\n },\n }\n}\n","/**\n * Stable global pointer to the devtools dispatcher singleton.\n *\n * Mirrors the React DevTools pattern (`__REACT_DEVTOOLS_GLOBAL_HOOK__`):\n * a synchronously-readable handle on `window` that callers in another\n * package (e.g. the `@theo/actions` virtual module client facade) can\n * use to dispatch telemetry without a cross-package dynamic import.\n *\n * Invariant — INSTALL ONCE, NEVER UNINSTALL:\n * The dispatcher is a module singleton with no lifecycle. The window\n * pointer just exposes that singleton to other realms. Clearing the\n * pointer on React unmount races with sibling mounts (StrictMode\n * double-invoke, HMR module replace) and silently drops telemetry —\n * the call-site reads `window.__theoDevtoolsDispatcher`, sees\n * undefined, and no-ops. This was the c7906fa regression.\n *\n * Returned cleanup is therefore a NO-OP for the global; it exists only\n * to keep the React effect contract honest (effects return cleanups).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { dispatcher } from './dispatcher.js'\n\ninterface WindowWithDispatcher {\n __theoDevtoolsDispatcher?: typeof dispatcher\n}\n\n// NO-OP cleanup. See module header: the global pointer is install-once\n// for the page lifetime. Tearing it down on cleanup races with sibling\n// mounts and was the root cause of the c7906fa Actions-tab silent-drop\n// regression. Caller still gets a function so it conforms to the React\n// effect-cleanup contract.\nfunction noopCleanup(): void {\n // intentional no-op\n}\n\nexport function installDispatcherGlobal(): () => void {\n if (typeof window === 'undefined') return noopCleanup\n const w = window as unknown as WindowWithDispatcher\n w.__theoDevtoolsDispatcher = dispatcher\n return noopCleanup\n}\n","/**\n * Devtools React context — shadow root + state + dispatch.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { createContext, useContext } from 'react'\n\nimport type { DevtoolsAction, DevtoolsState } from '../shared.js'\nimport type { StyleFactory } from '../styles/styles.js'\n\nexport interface DevtoolsContextValue {\n shadowRoot: ShadowRoot\n state: DevtoolsState\n dispatch: (action: DevtoolsAction) => void\n styles: StyleFactory\n}\n\nexport const DevtoolsContext = createContext<DevtoolsContextValue | null>(null)\n\nexport function useDevtoolsContext(): DevtoolsContextValue {\n const ctx = useContext(DevtoolsContext)\n if (!ctx) throw new Error('useDevtoolsContext: must be used inside <Overlay />')\n return ctx\n}\n","/**\n * T4.1 — Draggable state machine + velocity-aware corner snap.\n *\n * State machine: idle → press → drag → drag-end → idle\n *\n * - EC-8: click-after-drag swallow. The 'drag-end' state intercepts the\n * click that follows pointerup and prevents the default (else dragging\n * the chip would also toggle the panel).\n * - EC-9: right-click ignored (e.button !== 0 returns early).\n * - EC-10: transitionend listener removes ITSELF inside its own handler\n * to prevent leaks across many drags.\n * - EC-28: corner positions recomputed on every pointermove (NOT cached\n * at drag start). Window resize during drag would otherwise use stale\n * corners.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { DevtoolsPosition } from '../shared.js'\n\n// Pattern to extract `<x>px <y>px` from `el.style.translate`. The two\n// capture groups carry small numeric literals; the regex has no ambiguous\n// quantifier that could backtrack super-linearly (sonarjs/slow-regex is a\n// false positive here).\n// eslint-disable-next-line security/detect-unsafe-regex, sonarjs/slow-regex -- bounded numeric pattern, no nested quantifiers\nconst TRANSLATE_PATTERN = /(-?\\d+(?:\\.\\d+)?)px\\s+(-?\\d+(?:\\.\\d+)?)px/\n\ntype DragState =\n | { kind: 'idle' }\n | { kind: 'press'; startX: number; startY: number }\n | { kind: 'drag'; pointerId: number; lastX: number; lastY: number }\n | { kind: 'drag-end' }\n\ninterface Point {\n x: number\n y: number\n}\n\ninterface VelocitySample {\n position: Point\n timestamp: number\n}\n\nconst DRAG_THRESHOLD_PX = 5\nconst VELOCITY_SAMPLE_MIN_MS = 10\nconst VELOCITY_SAMPLE_LIMIT = 5\nconst SPRING_TRANSITION = 'translate 491ms cubic-bezier(0.485, -0.050, 0.285, 1.505)'\n\nfunction calcVelocity(history: VelocitySample[]): Point {\n if (history.length < 2) return { x: 0, y: 0 }\n const first = history[0]\n const last = history[history.length - 1]\n const dt = last.timestamp - first.timestamp\n if (dt === 0) return { x: 0, y: 0 }\n return {\n x: ((last.position.x - first.position.x) / dt) * 1000,\n y: ((last.position.y - first.position.y) / dt) * 1000,\n }\n}\n\nfunction projectVelocity(v: number, deceleration = 0.999): number {\n return ((v / 1000) * deceleration) / (1 - deceleration)\n}\n\n/**\n * Compute the 4 corner positions relative to viewport, accounting for\n * scrollbar width and current element size. EC-14: scrollbar offset.\n * EC-28: invoked on every move so window resize during drag is reflected.\n */\nexport function computeCorners(\n elementWidth: number,\n elementHeight: number,\n padding: number,\n): Record<DevtoolsPosition, Point> {\n const w = typeof window !== 'undefined' ? window.innerWidth : 1024\n const h = typeof window !== 'undefined' ? window.innerHeight : 768\n const scrollbarW = typeof document !== 'undefined' ? w - document.documentElement.clientWidth : 0\n\n return {\n 'top-left': { x: padding, y: padding },\n 'top-right': { x: w - elementWidth - padding - scrollbarW, y: padding },\n 'bottom-left': { x: padding, y: h - elementHeight - padding },\n 'bottom-right': {\n x: w - elementWidth - padding - scrollbarW,\n y: h - elementHeight - padding,\n },\n }\n}\n\n/**\n * Pick the nearest corner to a given point (Euclidean).\n * Exported for unit testing.\n */\nexport function nearestCorner(\n point: Point,\n corners: Record<DevtoolsPosition, Point>,\n): DevtoolsPosition {\n let best: DevtoolsPosition = 'bottom-right'\n let bestDist = Infinity\n for (const [k, p] of Object.entries(corners) as [DevtoolsPosition, Point][]) {\n const dx = point.x - p.x\n const dy = point.y - p.y\n const d = Math.sqrt(dx * dx + dy * dy)\n if (d < bestDist) {\n bestDist = d\n best = k\n }\n }\n return best\n}\n\nexport interface UseDragOptions {\n disabled?: boolean\n position: DevtoolsPosition\n padding: number\n onChange: (position: DevtoolsPosition) => void\n}\n\nexport interface UseDragApi {\n ref: React.RefObject<HTMLElement | null>\n onPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n}\n\n/**\n * Build the pointermove handler. Extracted from `useDrag` so the hook\n * fits within the max-lines-per-function ceiling. Captures the same refs\n * the hook owns.\n */\nfunction handlePointerMove(\n machine: React.RefObject<DragState>,\n ref: React.RefObject<HTMLElement | null>,\n velocityHistory: React.RefObject<VelocitySample[]>,\n lastSampleTime: React.RefObject<number>,\n): (ev: PointerEvent) => void {\n return (ev: PointerEvent): void => {\n const m = machine.current\n if (m.kind === 'idle') return\n\n // press → drag transition when threshold exceeded\n if (m.kind === 'press') {\n const dx = ev.clientX - m.startX\n const dy = ev.clientY - m.startY\n if (Math.sqrt(dx * dx + dy * dy) >= DRAG_THRESHOLD_PX) {\n machine.current = {\n kind: 'drag',\n pointerId: ev.pointerId,\n lastX: ev.clientX,\n lastY: ev.clientY,\n }\n try {\n ref.current?.setPointerCapture(ev.pointerId)\n } catch {\n /* setPointerCapture may throw if pointer already captured elsewhere */\n }\n } else {\n return\n }\n }\n\n const drag = machine.current\n if (drag.kind !== 'drag') return\n\n if (ref.current) {\n const el = ref.current\n const tx = ev.clientX - drag.lastX\n const ty = ev.clientY - drag.lastY\n const currentTranslate = el.style.translate\n let curX = 0\n let curY = 0\n if (currentTranslate) {\n const parts = TRANSLATE_PATTERN.exec(currentTranslate)\n if (parts) {\n curX = Number(parts[1])\n curY = Number(parts[2])\n }\n }\n el.style.translate = `${curX + tx}px ${curY + ty}px`\n drag.lastX = ev.clientX\n drag.lastY = ev.clientY\n }\n\n // velocity sampling (10ms apart, last 5 samples)\n const now = Date.now()\n if (now - lastSampleTime.current >= VELOCITY_SAMPLE_MIN_MS) {\n velocityHistory.current.push({ position: { x: ev.clientX, y: ev.clientY }, timestamp: now })\n if (velocityHistory.current.length > VELOCITY_SAMPLE_LIMIT) {\n velocityHistory.current.shift()\n }\n lastSampleTime.current = now\n }\n }\n}\n\n/**\n * useDrag hook. Returns a ref + pointerDown handler. State managed internally.\n *\n * Exported state machine — _machine and _setMachine are internal helpers.\n * Tests exercise via computeCorners + nearestCorner (pure helpers above);\n * full E2E coverage via Playwright (T4.4).\n */\nexport function useDrag(options: UseDragOptions): UseDragApi {\n const ref = useRef<HTMLElement | null>(null)\n const machine = useRef<DragState>({ kind: 'idle' })\n const velocityHistory = useRef<VelocitySample[]>([])\n const lastSampleTime = useRef(0)\n\n // EC-10: cleanup tracker — any move/up listeners attached during press/drag\n // get torn down here. Listener self-removal pattern means a one-off\n // transitionend handler removes itself; this cleanup handles the\n // pointer event pair.\n const cleanup = useRef<(() => void) | null>(null)\n\n // EC-10 transitionend self-removal helper\n function animateToCorner(corner: DevtoolsPosition): void {\n const el = ref.current\n if (!el) {\n options.onChange(corner)\n return\n }\n const corners = computeCorners(el.offsetWidth, el.offsetHeight, options.padding)\n const target = corners[corner]\n const onTransitionEnd = (ev: TransitionEvent) => {\n if (ev.propertyName !== 'translate') return\n el.removeEventListener('transitionend', onTransitionEnd)\n el.style.transition = ''\n el.style.translate = ''\n options.onChange(corner)\n }\n el.style.transition = SPRING_TRANSITION\n el.addEventListener('transitionend', onTransitionEnd)\n el.style.translate = `${target.x}px ${target.y}px`\n }\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent<HTMLElement>) => {\n if (options.disabled) return\n // EC-9: right-click and middle-click never start drag\n if (e.button !== 0) return\n if (machine.current.kind !== 'idle') return\n\n const startX = e.clientX\n const startY = e.clientY\n machine.current = { kind: 'press', startX, startY }\n velocityHistory.current = [{ position: { x: startX, y: startY }, timestamp: Date.now() }]\n lastSampleTime.current = Date.now()\n\n const onMove = handlePointerMove(machine, ref, velocityHistory, lastSampleTime)\n\n const onUp = (_ev: PointerEvent) => {\n const m = machine.current\n if (m.kind === 'drag') {\n // Project + snap\n const v = calcVelocity(velocityHistory.current)\n const el = ref.current\n if (el) {\n const corners = computeCorners(el.offsetWidth, el.offsetHeight, options.padding)\n const currentTranslate = el.style.translate\n let curX = 0\n let curY = 0\n if (currentTranslate) {\n const parts = TRANSLATE_PATTERN.exec(currentTranslate)\n if (parts) {\n curX = Number(parts[1])\n curY = Number(parts[2])\n }\n }\n const base = corners[options.position]\n const projectedPoint: Point = {\n x: base.x + curX + projectVelocity(v.x),\n y: base.y + curY + projectVelocity(v.y),\n }\n const snapTarget = nearestCorner(projectedPoint, corners)\n // EC-8: enter drag-end so the synthetic click that follows is swallowed\n machine.current = { kind: 'drag-end' }\n animateToCorner(snapTarget)\n // Reset drag-end → idle on next tick so future drags work\n setTimeout(() => {\n if (machine.current.kind === 'drag-end') {\n machine.current = { kind: 'idle' }\n }\n }, 0)\n }\n } else {\n // Was just a press (no drag) — that's a click; let it through\n machine.current = { kind: 'idle' }\n }\n velocityHistory.current = []\n cleanup.current?.()\n cleanup.current = null\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n cleanup.current = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n },\n // `animateToCorner` is intentionally not listed: re-binding listeners\n // every render would interrupt an in-flight drag. `animateToCorner`\n // reads only refs (no captured state), so a stale closure is safe.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [options.disabled, options.padding, options.position],\n )\n\n // EC-8: click handler on the element — swallow click that fires right\n // after a drag (browser's synthetic click after pointerup).\n useEffect(() => {\n const el = ref.current\n if (!el) return\n const onClickCapture = (ev: MouseEvent) => {\n if (machine.current.kind === 'drag-end') {\n ev.preventDefault()\n ev.stopPropagation()\n }\n }\n el.addEventListener('click', onClickCapture, true)\n return () => {\n el.removeEventListener('click', onClickCapture, true)\n }\n }, [])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanup.current?.()\n cleanup.current = null\n }\n }, [])\n\n return { ref, onPointerDown }\n}\n","/**\n * Devtools design tokens.\n *\n * Colors are exposed as CSS custom properties at the shadow root so\n * theme changes (light/dark/system) are visually instant — no component\n * re-render needed. Each surface references `var(--theo-...)`.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\ninterface Palette {\n bgPanel: string\n bgPanelHover: string\n bgChip: string\n bgChipHover: string\n border: string\n borderSubtle: string\n text: string\n textMuted: string\n textDim: string\n accent: string\n accentHover: string\n}\n\nconst darkPalette: Palette = {\n bgPanel: '#13151a',\n bgPanelHover: '#1c1f26',\n bgChip: '#13151a',\n bgChipHover: '#2a2d35',\n border: '#343841',\n borderSubtle: '#23262d',\n text: '#e6e6e6',\n textMuted: '#9aa0a6',\n textDim: '#6b7280',\n accent: '#7c3aed',\n accentHover: '#9061f9',\n}\n\nconst lightPalette: Palette = {\n bgPanel: '#ffffff',\n bgPanelHover: '#f5f5f7',\n bgChip: '#ffffff',\n bgChipHover: '#ececef',\n border: '#d4d4d8',\n borderSubtle: '#e4e4e7',\n text: '#1a1a1f',\n textMuted: '#52525b',\n textDim: '#9aa0a6',\n accent: '#6d28d9',\n accentHover: '#5b21b6',\n}\n\n/**\n * Build the CSS custom properties block for a resolved theme.\n * Inject into the shadow root so any `var(--theo-...)` reference\n * updates instantly when the host attribute flips.\n */\nexport function buildThemeCssVars(resolved: 'light' | 'dark'): string {\n const p = resolved === 'light' ? lightPalette : darkPalette\n return `\n --theo-bg-panel: ${p.bgPanel};\n --theo-bg-panel-hover: ${p.bgPanelHover};\n --theo-bg-chip: ${p.bgChip};\n --theo-bg-chip-hover: ${p.bgChipHover};\n --theo-border: ${p.border};\n --theo-border-subtle: ${p.borderSubtle};\n --theo-text: ${p.text};\n --theo-text-muted: ${p.textMuted};\n --theo-text-dim: ${p.textDim};\n --theo-accent: ${p.accent};\n --theo-accent-hover: ${p.accentHover};\n `\n}\n\nexport const tokens = {\n // Backward-compat: hardcoded constants now point at CSS vars.\n // Existing styles using `${tokens.colors.bgPanel}` resolve to\n // `var(--theo-bg-panel)` at render time.\n colors: {\n bgPanel: 'var(--theo-bg-panel)',\n bgPanelHover: 'var(--theo-bg-panel-hover)',\n bgChip: 'var(--theo-bg-chip)',\n bgChipHover: 'var(--theo-bg-chip-hover)',\n border: 'var(--theo-border)',\n borderSubtle: 'var(--theo-border-subtle)',\n text: 'var(--theo-text)',\n textMuted: 'var(--theo-text-muted)',\n textDim: 'var(--theo-text-dim)',\n accent: 'var(--theo-accent)',\n accentHover: 'var(--theo-accent-hover)',\n\n method: {\n GET: '#10b981',\n POST: '#3b82f6',\n PUT: '#f59e0b',\n PATCH: '#f59e0b',\n DELETE: '#ef4444',\n HEAD: '#6b7280',\n OPTIONS: '#6b7280',\n },\n\n status: {\n success: '#10b981',\n redirect: '#3b82f6',\n clientError: '#f59e0b',\n serverError: '#ef4444',\n unknown: '#6b7280',\n },\n\n error: {\n csrf: '#ef4444',\n unhandled: '#ef4444',\n console: '#f59e0b',\n },\n },\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '24px',\n xxl: '32px',\n },\n radius: {\n sm: '4px',\n md: '8px',\n lg: '12px',\n full: '9999px',\n },\n font: {\n family: 'system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif',\n mono: 'ui-monospace, Menlo, Monaco, Consolas, monospace',\n sizeXs: '11px',\n sizeSm: '12px',\n sizeMd: '14px',\n sizeLg: '16px',\n },\n zIndex: {\n chip: 2147483640,\n panel: 2147483641,\n },\n panel: {\n minWidth: 360,\n minHeight: 280,\n defaultWidth: 480,\n defaultHeight: 360,\n chipPadding: 20,\n },\n} as const\n\nexport function statusColor(s: number): string {\n if (s >= 200 && s < 300) return tokens.colors.status.success\n if (s >= 300 && s < 400) return tokens.colors.status.redirect\n if (s >= 400 && s < 500) return tokens.colors.status.clientError\n if (s >= 500) return tokens.colors.status.serverError\n return tokens.colors.status.unknown\n}\n\nexport function methodColor(method: string): string {\n const key = method.toUpperCase()\n const palette = tokens.colors.method as Record<string, string | undefined>\n return palette[key] ?? tokens.colors.status.unknown\n}\n","/**\n * TheoKit brand icon — \"T\" mark on transparent-friendly rounded square.\n * SVG encoded as data URI. Zero external assets. Crisp at any size.\n */\nexport const THEO_LOGO_BASE64 =\n 'data:image/svg+xml,' +\n encodeURIComponent(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\">' +\n '<rect width=\"32\" height=\"32\" rx=\"8\" fill=\"#6366f1\"/>' +\n '<text x=\"16\" y=\"22\" font-family=\"system-ui,-apple-system,sans-serif\" font-size=\"20\" font-weight=\"700\" fill=\"white\" text-anchor=\"middle\">T</text>' +\n '</svg>',\n )\n","/**\n * Theo brand logo — official purple logo from theo-business/arquivos.\n *\n * Embedded as base64 PNG (see ./assets/logo-data.ts) so the devtools UI has\n * zero external asset dependency.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { THEO_LOGO_BASE64 } from '../assets/logo-data.js'\n\nexport interface TheoLogoProps {\n size?: number\n}\n\nexport function TheoLogo({ size = 18 }: Readonly<TheoLogoProps>) {\n return (\n <img\n src={THEO_LOGO_BASE64}\n alt=\"TheoKit\"\n width={size}\n height={size}\n style={{\n display: 'inline-block',\n flexShrink: 0,\n }}\n />\n )\n}\n","/**\n * Devtools floating chip indicator.\n *\n * Phase 1: fixed corner.\n * Phase 4 (T4.1): draggable via useDrag.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport { useDrag } from '../hooks/useDrag.js'\nimport { tokens } from '../styles/tokens.js'\n\nimport { TheoLogo } from './TheoLogo.js'\n\nexport function Indicator() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n const drag = useDrag({\n disabled: state.open, // chip not draggable while panel is open\n position: state.position,\n padding: tokens.panel.chipPadding,\n onChange: (position) => {\n dispatch({ type: 'SET_POSITION', position })\n },\n })\n\n if (!state.visible) return null\n\n const [vertical, horizontal] = state.position.split('-', 2) as [\n 'top' | 'bottom',\n 'left' | 'right',\n ]\n\n // Logo-only chip — compact circular button. Logo at 35px.\n const buttonClass = styles.css`\n position: fixed;\n ${vertical}: ${tokens.panel.chipPadding}px;\n ${horizontal}: ${tokens.panel.chipPadding}px;\n z-index: ${tokens.zIndex.chip};\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm};\n background: ${tokens.colors.bgChip};\n color: ${tokens.colors.text};\n border: 1px solid ${tokens.colors.border};\n border-radius: ${tokens.radius.full};\n cursor: pointer;\n user-select: none;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);\n transition: background 150ms ease;\n &:hover { background: ${tokens.colors.bgChipHover}; }\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n `\n\n return (\n <button\n ref={drag.ref as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n aria-label=\"Open devtools\"\n aria-expanded={state.open}\n title=\"Theo Devtools\"\n className={buttonClass}\n onPointerDown={drag.onPointerDown}\n onClick={() => {\n dispatch({ type: 'TOGGLE_PANEL' })\n }}\n >\n <TheoLogo size={35} />\n </button>\n )\n}\n","/**\n * Actions tab — per-action-call telemetry (timestamp, name, status, duration).\n *\n * G3 plan T5.1 + ADR D7. Consumes `state.actionCalls` populated by\n * `dispatcher.onActionCall()`.\n *\n * UX: row-level inline expand/collapse, mirroring RequestsTab. Each row\n * is a click-to-toggle button; details render inline under the expanded\n * row. Multiple rows can be expanded simultaneously. JSONExplorer is\n * used for input/output bodies (nested collapsibility).\n *\n * EC absorbed:\n * - EC-12 (PII mask heuristic): bodies pass through maskPiiFields when\n * not revealed (password/token/secret/apiKey/credit_card/ssn/cpf/cnpj).\n * Click-to-reveal per-record toggle stores the unmasked view in local\n * component state (NEVER persisted; reset on tab close).\n * - EC-11 (tree-shake prod): the dispatcher emit path is __IS_DEV-guarded;\n * in prod the entire telemetry module is dead-code-eliminated.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { maskPiiFields } from '../../format/pii-mask.js'\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport type { ActionCallRecord } from '../../shared.js'\nimport { toggleExpandedIds } from '../../state/actions-row-state.js'\nimport { tokens } from '../../styles/tokens.js'\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts)\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nfunction formatPayload(value: unknown, reveal: boolean): string {\n const display = reveal ? value : maskPiiFields(value)\n try {\n return JSON.stringify(display, null, 2)\n } catch {\n return '<unserializable>'\n }\n}\n\nfunction buildActionsStyles(styles: ReturnType<typeof useDevtoolsContext>['styles']) {\n return {\n header: styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `,\n clearBtn: styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `,\n rowContainer: styles.css`\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n font-size: ${tokens.font.sizeXs};\n `,\n rowSummary: styles.css`\n display: grid;\n grid-template-columns: 24px 80px 1fr 80px 80px;\n gap: ${tokens.spacing.sm};\n align-items: center;\n width: 100%;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background: transparent;\n border: none;\n color: ${tokens.colors.text};\n text-align: left;\n cursor: pointer;\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeXs};\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n &[aria-expanded='true'] { background: ${tokens.colors.bgPanelHover}; }\n .chev { color: ${tokens.colors.textMuted}; font-family: ${tokens.font.mono}; }\n .name { font-family: ${tokens.font.mono}; }\n .time { color: ${tokens.colors.textMuted}; font-family: ${tokens.font.mono}; }\n .status-success { color: ${tokens.colors.accent}; }\n .status-error { color: #c92a2a; }\n .duration { color: ${tokens.colors.textMuted}; text-align: right; }\n `,\n detail: styles.css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border-top: 1px dashed ${tokens.colors.borderSubtle};\n font-size: ${tokens.font.sizeXs};\n pre {\n margin: 0;\n padding: ${tokens.spacing.xs};\n background: ${tokens.colors.borderSubtle};\n border-radius: ${tokens.radius.sm};\n overflow: auto;\n max-height: 200px;\n font-family: ${tokens.font.mono};\n }\n .reveal-btn {\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 8px;\n margin-bottom: ${tokens.spacing.xs};\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n }\n .reveal-btn:hover { color: ${tokens.colors.text}; }\n .section { margin-top: ${tokens.spacing.sm}; }\n .field-errors { margin-top: ${tokens.spacing.xs}; color: #c92a2a; }\n .field-errors li { margin-left: ${tokens.spacing.md}; }\n `,\n }\n}\n\nfunction ActionsEmptyState() {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No action calls yet. Trigger a server action (via <code>useAction</code> or direct{' '}\n <code>POST /_actions/&lt;name&gt;</code>) to see it here. Production builds tree-shake this\n telemetry path.\n </div>\n )\n}\n\nexport function ActionsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n const [revealedIds, setRevealedIds] = useState<Set<string>>(() => new Set())\n const [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set())\n\n if (state.actionCalls.length === 0) return <ActionsEmptyState />\n\n const cls = buildActionsStyles(styles)\n\n const toggleReveal = (id: string): void => {\n setRevealedIds((prev) => toggleExpandedIds(prev, id))\n }\n const toggleExpand = (id: string): void => {\n setExpandedIds((prev) => toggleExpandedIds(prev, id))\n }\n\n return (\n <div data-testid=\"devtools-actions-tab\">\n <ActionsHeader\n className={cls.header}\n clearBtnClass={cls.clearBtn}\n count={state.actionCalls.length}\n onClear={() => {\n dispatch({ type: 'RESET_ACTION_CALLS' })\n setRevealedIds(new Set())\n setExpandedIds(new Set())\n }}\n />\n <div>\n {state.actionCalls.map((r) => (\n <ActionRow\n key={r.id}\n record={r}\n containerClass={cls.rowContainer}\n summaryClass={cls.rowSummary}\n detailClass={cls.detail}\n expanded={expandedIds.has(r.id)}\n revealed={revealedIds.has(r.id)}\n onToggleExpand={() => {\n toggleExpand(r.id)\n }}\n onToggleReveal={() => {\n toggleReveal(r.id)\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n\nfunction ActionsHeader({\n className,\n clearBtnClass,\n count,\n onClear,\n}: Readonly<{ className: string; clearBtnClass: string; count: number; onClear: () => void }>) {\n return (\n <div className={className}>\n <span>\n {count} call{count === 1 ? '' : 's'}\n </span>\n <button type=\"button\" className={clearBtnClass} onClick={onClear}>\n Clear\n </button>\n </div>\n )\n}\n\nfunction ActionRow({\n record,\n containerClass,\n summaryClass,\n detailClass,\n expanded,\n revealed,\n onToggleExpand,\n onToggleReveal,\n}: Readonly<{\n record: ActionCallRecord\n containerClass: string\n summaryClass: string\n detailClass: string\n expanded: boolean\n revealed: boolean\n onToggleExpand: () => void\n onToggleReveal: () => void\n}>) {\n const statusClass = record.status === 'success' ? 'status-success' : 'status-error'\n return (\n <div className={containerClass} data-testid=\"devtools-action-row\">\n <button\n type=\"button\"\n className={summaryClass}\n onClick={onToggleExpand}\n aria-expanded={expanded}\n title={`${record.name} — click to ${expanded ? 'collapse' : 'expand'} details`}\n >\n <span className=\"chev\">{expanded ? '▼' : '▶'}</span>\n <span className=\"time\">{formatTime(record.timestamp)}</span>\n <span className=\"name\">{record.name}</span>\n <span className={statusClass}>{record.status}</span>\n <span className=\"duration\">{record.durationMs}ms</span>\n </button>\n {expanded && (\n <div className={detailClass}>\n <button type=\"button\" className=\"reveal-btn\" onClick={onToggleReveal}>\n {revealed ? 'Hide values' : 'Reveal values'}\n </button>\n <div className=\"section\">\n <strong>Input</strong>\n <pre>{formatPayload(record.input, revealed)}</pre>\n </div>\n {record.status === 'success' && record.output !== undefined && (\n <div className=\"section\">\n <strong>Output</strong>\n <pre>{formatPayload(record.output, revealed)}</pre>\n </div>\n )}\n {record.status === 'error' && record.error && <ActionDetailError error={record.error} />}\n </div>\n )}\n </div>\n )\n}\n\nfunction ActionDetailError({ error }: Readonly<{ error: NonNullable<ActionCallRecord['error']> }>) {\n return (\n <div className=\"section\">\n <strong>Error: {error.code}</strong>\n <p>{error.message}</p>\n {error.fields && Object.keys(error.fields).length > 0 && (\n <ul className=\"field-errors\">\n {Object.entries(error.fields).map(([field, msgs]) => (\n <li key={field}>\n <strong>{field || '(root)'}:</strong> {msgs.join('; ')}\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n","/**\n * PII masking heuristic for devtools Action Call records.\n *\n * Per plan g3-server-actions-and-useaction v1.2 § Phase 5 / T5.1 + ADR D7.\n * EC absorbed: EC-12 (PII mask heuristic).\n *\n * Heuristic regex matches common sensitive field names. Walks objects and\n * arrays recursively. Documented limitations:\n * - Falses positives (`tokenize` → masked because matches `token`) accepted;\n * click-to-reveal in the Actions tab mitigates.\n * - Falses negatives (PII in custom-named field like `userInput`) NOT detected.\n * Documented in ADR D7 as accepted v1 limitation.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\nconst SENSITIVE_KEY_PATTERN = /(password|token|secret|api_?key|apikey|credit_?card|ssn|cpf|cnpj)/i\n\n/**\n * Check whether a field key matches the sensitive-name heuristic.\n * Case-insensitive; partial-match (e.g., `userPassword` matches).\n */\nexport function isSensitiveKey(key: string): boolean {\n return SENSITIVE_KEY_PATTERN.test(key)\n}\n\n/**\n * Deep-mask sensitive fields in a value. Returns a new object/array with\n * sensitive values replaced by `'***'`. Non-objects pass through unchanged.\n * Walks arrays element-wise.\n */\nexport function maskPiiFields(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (typeof value !== 'object') return value\n if (Array.isArray(value)) {\n return value.map((item) => maskPiiFields(item))\n }\n const out: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n if (isSensitiveKey(key)) {\n out[key] = '***'\n } else {\n out[key] = maskPiiFields(val)\n }\n }\n return out\n}\n","/**\n * Pure state helpers for ActionsTab row-level expand/collapse.\n *\n * Mirrors RequestsTab UX: each row is a click-to-toggle button. State\n * lives in a single `Set<string>` of expanded ids — naturally React-safe\n * via clone-on-toggle and unmount-clean.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\nimport type { ActionCallRecord } from '../shared.js'\n\n/**\n * Toggle `id` membership in the expanded set. Returns a NEW Set (never\n * mutates the input) so React reference-equality detects the change.\n */\nexport function toggleExpandedIds(prev: Set<string>, id: string): Set<string> {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n}\n\n/**\n * Dedupe + sort ids from action records. Sorted order keeps row keys\n * stable across re-renders (otherwise React would tear down + remount\n * expanded rows when records re-arrive out of order).\n */\nexport function computeActionsTabIds(records: readonly ActionCallRecord[]): string[] {\n const seen = new Set<string>()\n for (const r of records) seen.add(r.id)\n return [...seen].sort((a, b) => a.localeCompare(b))\n}\n","/**\n * Agents tab — per-agent-run telemetry (timestamp, model, tokens, cost, duration).\n *\n * theokit-evolution-ci-and-dx Phase 3 (T3.2). Consumes `state.agentRuns`\n * populated by `dispatcher.onAgentRun()` which is called from\n * `server/cost/track-agent-run.ts` in dev mode (tree-shaken in prod).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts)\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nfunction formatCost(usd: number): string {\n if (usd === 0) return '$0.0000'\n if (usd < 0.0001) return `<$0.0001`\n return `$${usd.toFixed(4)}`\n}\n\nexport function AgentsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n if (state.agentRuns.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No agent runs yet. Trigger a request to an endpoint using <code>trackAgentRun</code> to see\n it here. (Wired in the saas template; opt-in elsewhere.)\n </div>\n )\n }\n\n const totalCost = state.agentRuns.reduce((sum, r) => sum + r.costUsd, 0)\n const totalIn = state.agentRuns.reduce((sum, r) => sum + r.tokensInput, 0)\n const totalOut = state.agentRuns.reduce((sum, r) => sum + r.tokensOutput, 0)\n\n const headerClass = styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const clearBtn = styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `\n const tableClass = styles.css`\n width: 100%;\n border-collapse: collapse;\n font-size: ${tokens.font.sizeXs};\n th, td {\n text-align: left;\n padding: 4px 8px;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n }\n th {\n color: ${tokens.colors.textMuted};\n font-weight: 500;\n font-size: ${tokens.font.sizeXs};\n }\n tr.status-error td { color: #c92a2a; }\n tr.status-aborted td { color: ${tokens.colors.textMuted}; }\n `\n\n return (\n <div data-testid=\"devtools-agents-tab\">\n <div className={headerClass}>\n <span>\n {state.agentRuns.length} run{state.agentRuns.length === 1 ? '' : 's'}\n {' · '}\n tokens {totalIn}/{totalOut}\n {' · '}\n {formatCost(totalCost)} total\n </span>\n <button\n type=\"button\"\n className={clearBtn}\n onClick={() => {\n dispatch({ type: 'RESET_AGENT_RUNS' })\n }}\n >\n clear\n </button>\n </div>\n <table className={tableClass}>\n <thead>\n <tr>\n <th>Time</th>\n <th>User</th>\n <th>Model</th>\n <th>Tokens (in/out)</th>\n <th>Cost</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n {state.agentRuns.map((run) => (\n <tr key={run.id} className={`status-${run.status}`}>\n <td>{formatTime(run.timestamp)}</td>\n <td>{run.userId}</td>\n <td>{run.model}</td>\n <td>\n {run.tokensInput}/{run.tokensOutput}\n </td>\n <td>{formatCost(run.costUsd)}</td>\n <td>{run.status}</td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* Live stream events */}\n {state.agentStreamEvents.length > 0 && (\n <>\n <div className={headerClass} style={{ marginTop: 12 }}>\n <span>🔴 Live Stream ({state.agentStreamEvents.length} events)</span>\n <button type=\"button\" className={clearBtn} onClick={() => dispatch({ type: 'RESET_AGENT_STREAM' })}>clear</button>\n </div>\n <div style={{ maxHeight: 200, overflow: 'auto', fontSize: tokens.font.sizeXs, fontFamily: 'monospace' }}>\n {state.agentStreamEvents.slice(-30).map((e, i) => (\n <div key={i} style={{ padding: '2px 4px', borderBottom: `1px solid ${tokens.colors.border}` }}>\n <span style={{ color: tokens.colors.textDim }}>{new Date(e.timestamp).toLocaleTimeString()}</span>\n {' '}\n <span style={{ color: e.type === 'error' ? '#c92a2a' : tokens.colors.accent }}>{e.type}</span>\n {e.content && <span style={{ color: tokens.colors.text }}> {e.content.substring(0, 80)}</span>}\n {e.toolName && <span style={{ color: tokens.colors.textMuted }}> → {e.toolName}</span>}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n )\n}\n","/**\n * CSRF Readiness tab (T2.2) — surfaces csrf.warn events captured by the\n * in-memory `CsrfReadinessStore`. Helps devs see which routes would\n * fail under 0.3.0 strict CSRF WITHOUT grepping stdout.\n *\n * Fetches GET /__theo/csrf-readiness on mount + every 5s while the tab\n * is open. Reset button POSTs /__theo/csrf-readiness/reset with the\n * required X-Theo-Action header.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect, useState, useCallback, type ReactElement } from 'react'\n\nimport {\n classifyCsrfReadinessError,\n type ClassifiedCsrfReadinessError,\n} from '../../format/csrf-readiness-classify.js'\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\n\ninterface ReadinessRoute {\n method: string\n path: string\n reason: string\n count: number\n firstSeen: string\n lastSeen: string\n}\n\ninterface ReadinessSummary {\n generatedAt: string\n totalEvents: number\n routes: ReadinessRoute[]\n}\n\nfunction buildTabStyles(styles: ReturnType<typeof useDevtoolsContext>['styles']) {\n return {\n container: styles.css`\n padding: ${tokens.spacing.md};\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n `,\n headerRow: styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: ${tokens.spacing.md};\n `,\n button: styles.css`\n padding: ${tokens.spacing.xs} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border: 1px solid ${tokens.colors.borderSubtle};\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeXs};\n cursor: pointer;\n border-radius: ${tokens.radius.sm};\n &:hover { background: ${tokens.colors.bgPanel}; }\n &:disabled { opacity: 0.5; cursor: not-allowed; }\n `,\n row: styles.css`\n display: grid;\n grid-template-columns: 60px 1fr auto;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n `,\n }\n}\n\nfunction ReadinessRow({\n rowClass,\n route,\n}: Readonly<{\n rowClass: string\n route: ReadinessRoute\n}>): ReactElement {\n return (\n <div className={rowClass}>\n <span style={{ color: tokens.colors.accent }}>{route.method}</span>\n <span>\n {route.path}\n <span style={{ color: tokens.colors.textMuted, marginLeft: tokens.spacing.sm }}>\n {route.reason}\n </span>\n </span>\n <span style={{ color: tokens.colors.textMuted }}>×{String(route.count)}</span>\n </div>\n )\n}\n\nexport function CsrfReadinessTab(): ReactElement {\n const { styles } = useDevtoolsContext()\n const cls = buildTabStyles(styles)\n const [data, setData] = useState<ReadinessSummary | null>(null)\n const [error, setError] = useState<ClassifiedCsrfReadinessError | null>(null)\n const [busy, setBusy] = useState(false)\n\n const fetchData = useCallback(async () => {\n try {\n const res = await fetch('/__theo/csrf-readiness')\n if (!res.ok) {\n setError(classifyCsrfReadinessError({ kind: 'http', status: res.status }))\n return\n }\n const json = (await res.json()) as ReadinessSummary\n setData(json)\n setError(null)\n } catch (e) {\n const classified = classifyCsrfReadinessError({ kind: 'thrown', error: e })\n // Silently ignore aborts — user navigated away mid-poll.\n if (classified.kind === 'aborted') return\n setError(classified)\n }\n }, [])\n\n useEffect(() => {\n void fetchData()\n const t = setInterval(() => void fetchData(), 5000)\n return () => {\n clearInterval(t)\n }\n }, [fetchData])\n\n const handleReset = useCallback(async () => {\n setBusy(true)\n try {\n await fetch('/__theo/csrf-readiness/reset', {\n method: 'POST',\n headers: { 'X-Theo-Action': '1', Origin: window.location.origin },\n })\n await fetchData()\n } finally {\n setBusy(false)\n }\n }, [fetchData])\n\n if (error) {\n return (\n <div\n className={cls.container}\n data-testid=\"devtools-csrf-readiness-error\"\n data-error-kind={error.kind}\n >\n <div style={{ color: tokens.colors.error.csrf }}>{error.summary}</div>\n {error.hint.length > 0 && (\n <p style={{ color: tokens.colors.textMuted, marginTop: tokens.spacing.sm }}>\n {error.hint}\n </p>\n )}\n </div>\n )\n }\n if (data === null) {\n return (\n <div className={cls.container} data-testid=\"devtools-csrf-readiness-loading\">\n Loading…\n </div>\n )\n }\n\n const isEmpty = data.totalEvents === 0\n const testid = isEmpty ? 'devtools-csrf-readiness-empty' : 'devtools-csrf-readiness'\n\n return (\n <div className={cls.container} data-testid={testid}>\n <div className={cls.headerRow}>\n <strong>\n {isEmpty\n ? 'CSRF Readiness'\n : `CSRF Readiness — ${String(data.totalEvents)} event(s) across ${String(data.routes.length)} route(s)`}\n </strong>\n <button\n type=\"button\"\n className={cls.button}\n disabled={busy}\n onClick={() => {\n void handleReset()\n }}\n >\n Reset\n </button>\n </div>\n {isEmpty ? (\n <div style={{ color: tokens.colors.textMuted }}>\n No csrf.warn events recorded. Endpoints are ready for 0.3.0 strict CSRF.\n </div>\n ) : (\n data.routes.map((r) => (\n <ReadinessRow key={`${r.method} ${r.path} ${r.reason}`} rowClass={cls.row} route={r} />\n ))\n )}\n </div>\n )\n}\n","/**\n * Pure classifier for CSRF Readiness tab fetch failures.\n *\n * Replaces the previous one-size-fits-all \"Failed to fetch — wire\n * csrfReadinessStore\" hint that surfaced regardless of the actual cause.\n * Maps each failure mode to an actionable `{kind, summary, hint}` so the\n * tab can direct the developer at the real problem (server down vs.\n * endpoint missing vs. unauthorized vs. crashed handler).\n *\n * Tested as a pure function (no DOM, no React, no fetch). The tab\n * consumes this via `classifyCsrfReadinessError(input)` and renders\n * `{summary, hint}` plus styles per `kind`.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\nexport type CsrfReadinessErrorKind =\n | 'store-not-wired' // HTTP 404 — endpoint missing (canonical case)\n | 'server-crash' // HTTP 5xx — server-side handler threw\n | 'unauthorized' // HTTP 401/403 — readiness route gated behind auth\n | 'unexpected-status' // Other 4xx — surface the status, no canned hint\n | 'server-unreachable' // TypeError \"Failed to fetch\" — dev server down/restarting\n | 'aborted' // AbortError — user navigated away, silent\n | 'unknown-error' // Fallback — unrecognized throw\n\nexport interface ClassifiedCsrfReadinessError {\n readonly kind: CsrfReadinessErrorKind\n /** Short, dev-facing description of WHAT happened. */\n readonly summary: string\n /** Actionable hint — WHAT TO DO next. Empty string for `aborted`. */\n readonly hint: string\n}\n\nexport type CsrfReadinessFailureInput =\n | { readonly kind: 'http'; readonly status: number }\n | { readonly kind: 'thrown'; readonly error: unknown }\n\nconst NETWORK_ERROR_PATTERN = /failed to fetch|networkerror|network request failed/i\n\nexport function classifyCsrfReadinessError(\n input: CsrfReadinessFailureInput,\n): ClassifiedCsrfReadinessError {\n if (input.kind === 'http') {\n return classifyHttpStatus(input.status)\n }\n return classifyThrown(input.error)\n}\n\nfunction classifyHttpStatus(status: number): ClassifiedCsrfReadinessError {\n if (status === 404) {\n return {\n kind: 'store-not-wired',\n summary: `Endpoint returned 404 — /__theo/csrf-readiness not registered.`,\n hint: 'Wire `csrfReadinessStore` in the api-middleware options to enable this tab.',\n }\n }\n if (status === 401 || status === 403) {\n return {\n kind: 'unauthorized',\n summary: `Endpoint returned ${String(status)} — the readiness route is auth-gated.`,\n hint: 'Authenticate (e.g. via session) before opening this tab, or move the route outside of requireAuth.',\n }\n }\n if (status >= 500 && status < 600) {\n return {\n kind: 'server-crash',\n summary: `Endpoint returned ${String(status)} — the readiness handler threw.`,\n hint: 'Check dev server logs (terminal running `theokit dev`) for the underlying stack trace.',\n }\n }\n return {\n kind: 'unexpected-status',\n summary: `Endpoint returned unexpected status ${String(status)}.`,\n hint: 'This is not a status the readiness route normally emits. Inspect the response body in Network tab.',\n }\n}\n\nfunction classifyThrown(error: unknown): ClassifiedCsrfReadinessError {\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n kind: 'aborted',\n summary: 'Request aborted.',\n hint: '',\n }\n }\n const message = error instanceof Error ? error.message : String(error)\n if (error instanceof TypeError && NETWORK_ERROR_PATTERN.test(message)) {\n return {\n kind: 'server-unreachable',\n summary: 'Dev server unreachable — request failed before any HTTP response.',\n hint: 'Restart the dev server (`theokit dev`) and verify the port matches the browser URL.',\n }\n }\n return {\n kind: 'unknown-error',\n summary: message.length > 0 ? message : 'Unknown error',\n hint: 'Open the browser DevTools Network panel to inspect the failed request.',\n }\n}\n","/**\n * ErrorRow — single error entry in the Errors tab.\n *\n * EC-27: stack truncated to 4KB display (1MB+ stacks would freeze main thread).\n * EC-20: NO dangerouslySetInnerHTML — React auto-escapes.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport type { ErrorRecord } from '../shared.js'\nimport { tokens } from '../styles/tokens.js'\n\nexport const STACK_DISPLAY_LIMIT = 4096\n\n/**\n * EC-27 — pure helper: cap stack trace display at 4KB.\n * Exported for unit testing — 1MB+ stacks would freeze main thread on render.\n */\nexport function truncateStackForDisplay(\n stack: string | undefined,\n limit = STACK_DISPLAY_LIMIT,\n): string | null {\n if (!stack) return null\n if (stack.length <= limit) return stack\n return `${stack.slice(0, limit)}\\n…[truncated ${stack.length - limit} chars]`\n}\n\nfunction typeColor(type: ErrorRecord['type']): string {\n switch (type) {\n case 'csrf.warn':\n return tokens.colors.error.csrf\n case 'unhandled':\n return tokens.colors.error.unhandled\n case 'console':\n default:\n return tokens.colors.error.console\n }\n}\n\nfunction typeIcon(type: ErrorRecord['type']): string {\n switch (type) {\n case 'csrf.warn':\n return '⛨'\n case 'unhandled':\n return '⚠'\n case 'console':\n default:\n return '!'\n }\n}\n\ninterface ErrorRowProps {\n error: ErrorRecord\n}\n\nexport function ErrorRow({ error }: Readonly<ErrorRowProps>) {\n const [expanded, setExpanded] = useState(false)\n const { styles } = useDevtoolsContext()\n\n const containerClass = styles.css`\n display: block;\n width: 100%;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const summaryClass = styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background: transparent;\n border: none;\n width: 100%;\n cursor: pointer;\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n text-align: left;\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n `\n const iconClass = styles.css`\n color: ${typeColor(error.type)};\n font-weight: 700;\n min-width: 16px;\n text-align: center;\n `\n const msgClass = styles.css`\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `\n const docLinkClass = styles.css`\n color: ${tokens.colors.accent};\n font-size: ${tokens.font.sizeXs};\n text-decoration: underline;\n &:hover { color: ${tokens.colors.accentHover}; }\n `\n const detailsClass = styles.css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border-top: 1px solid ${tokens.colors.borderSubtle};\n `\n\n // EC-27: cap stack display length (delegated to pure helper for testability)\n const displayedStack = truncateStackForDisplay(error.stack)\n\n // EC-20: render docsUrl only when present AND non-empty (don't show broken link)\n const showDocsLink = typeof error.docsUrl === 'string' && error.docsUrl.length > 0\n\n return (\n <div className={containerClass} data-testid=\"devtools-error-row\">\n <button\n type=\"button\"\n className={summaryClass}\n onClick={() => {\n setExpanded((e) => !e)\n }}\n aria-expanded={expanded}\n title={error.message}\n >\n <span className={iconClass} aria-hidden=\"true\">\n {typeIcon(error.type)}\n </span>\n <span className={msgClass}>{error.message}</span>\n {error.code && (\n <span\n style={{\n color: tokens.colors.textMuted,\n fontFamily: tokens.font.mono,\n fontSize: tokens.font.sizeXs,\n }}\n >\n {error.code}\n </span>\n )}\n </button>\n {expanded && (\n <div className={detailsClass}>\n {showDocsLink && (\n <div style={{ marginBottom: tokens.spacing.sm }}>\n <a\n href={error.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={docLinkClass}\n >\n Open migration guide\n </a>\n </div>\n )}\n {displayedStack && (\n <pre\n style={{\n margin: 0,\n padding: tokens.spacing.sm,\n background: tokens.colors.bgPanel,\n color: tokens.colors.textMuted,\n fontFamily: tokens.font.mono,\n fontSize: tokens.font.sizeXs,\n borderRadius: tokens.radius.sm,\n overflow: 'auto',\n maxHeight: '200px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {displayedStack}\n </pre>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Errors tab — list of recent errors (console, unhandled, csrf.warn).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\nimport { ErrorRow } from '../ErrorRow.js'\n\nexport function ErrorsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n if (state.errors.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No errors yet. csrf.warn, console.error and unhandled rejections will surface here.\n </div>\n )\n }\n\n const headerClass = styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const clearBtn = styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `\n\n return (\n <div data-testid=\"devtools-errors-tab\">\n <div className={headerClass}>\n <span>\n {state.errors.length} error{state.errors.length === 1 ? '' : 's'}\n </span>\n <button\n type=\"button\"\n className={clearBtn}\n onClick={() => {\n dispatch({ type: 'RESET_ERRORS' })\n }}\n >\n clear\n </button>\n </div>\n {state.errors.map((err) => (\n <ErrorRow key={err.id} error={err} />\n ))}\n </div>\n )\n}\n","/**\n * RequestRow — single request entry in the Requests tab.\n *\n * Renders method badge, path, status code, duration, traceId.\n * Click toggles expanded view (headers + body via JSONExplorer).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport type { RequestRecord } from '../shared.js'\nimport { methodColor, statusColor, tokens } from '../styles/tokens.js'\n\nimport { JSONExplorer } from './JSONExplorer.js'\n\ninterface RequestRowProps {\n request: RequestRecord\n}\n\nfunction buildRequestRowStyles(\n styles: ReturnType<typeof useDevtoolsContext>['styles'],\n request: RequestRecord,\n) {\n return {\n container: styles.css`\n display: block;\n width: 100%;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `,\n summary: styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background: transparent;\n border: none;\n width: 100%;\n cursor: pointer;\n color: ${tokens.colors.text};\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n text-align: left;\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n `,\n methodBadge: styles.css`\n display: inline-block;\n min-width: 44px;\n padding: 1px 6px;\n border-radius: ${tokens.radius.sm};\n background: ${methodColor(request.method)}33;\n color: ${methodColor(request.method)};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n font-weight: 600;\n text-align: center;\n `,\n path: styles.css`\n flex: 1;\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n status: styles.css`\n color: ${statusColor(request.status)};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n font-weight: 600;\n min-width: 36px;\n text-align: right;\n `,\n dur: styles.css`\n color: ${tokens.colors.textMuted};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n min-width: 56px;\n text-align: right;\n `,\n trace: styles.css`\n color: ${tokens.colors.textDim};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n `,\n details: styles.css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background: ${tokens.colors.bgPanelHover};\n border-top: 1px solid ${tokens.colors.borderSubtle};\n `,\n }\n}\n\nfunction formatDuration(ms: number | null | undefined): string {\n if (ms == null || !Number.isFinite(ms)) return '—'\n if (ms < 1) return '<1ms'\n return `${Math.round(ms)}ms`\n}\n\nexport function RequestRow({ request }: Readonly<RequestRowProps>) {\n const [expanded, setExpanded] = useState(false)\n const { styles } = useDevtoolsContext()\n const cls = buildRequestRowStyles(styles, request)\n const containerClass = cls.container\n const summaryClass = cls.summary\n const methodBadge = cls.methodBadge\n const pathClass = cls.path\n const statusClass = cls.status\n const durClass = cls.dur\n const traceClass = cls.trace\n const detailsClass = cls.details\n const displayDuration = formatDuration(request.durationMs)\n const displayStatus = request.status === 0 ? 'failed' : String(request.status)\n\n return (\n <div className={containerClass} data-testid=\"devtools-request-row\">\n <button\n type=\"button\"\n className={summaryClass}\n onClick={() => {\n setExpanded((e) => !e)\n }}\n aria-expanded={expanded}\n title={request.path}\n >\n <span className={methodBadge}>{request.method}</span>\n <span className={pathClass}>{request.path}</span>\n <span className={statusClass}>{displayStatus}</span>\n <span className={durClass}>{displayDuration}</span>\n <span className={traceClass}>{request.traceId.slice(0, 8)}</span>\n </button>\n {expanded && (\n <div className={detailsClass}>\n {request.csrfWarn && (\n <div style={{ color: tokens.colors.error.csrf, marginBottom: tokens.spacing.sm }}>\n CSRF warn:{' '}\n <a\n href={request.csrfWarn.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: tokens.colors.accent }}\n >\n {request.csrfWarn.code}\n </a>\n </div>\n )}\n {request.headers && (\n <JSONExplorer label=\"headers\" value={request.headers} defaultExpanded={false} />\n )}\n {request.bodyPreview !== undefined && request.bodyPreview !== '' && (\n <div\n style={{\n color: tokens.colors.textMuted,\n marginTop: tokens.spacing.sm,\n fontFamily: tokens.font.mono,\n fontSize: tokens.font.sizeXs,\n }}\n >\n body{request.bodyTruncated ? ` (truncated, ${request.bodyLength} bytes)` : ''}:\n <pre style={{ marginTop: 4, whiteSpace: 'pre-wrap', wordBreak: 'break-all' }}>\n {request.bodyPreview}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Recursive JSON walker — collapsible object/array tree.\n *\n * Adapted from TanStack router-devtools Explorer.tsx (pattern §7.2 of\n * .claude/knowledge-base/reference/devtools.md). Pagination at 100 entries.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useState } from 'react'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport { tokens } from '../styles/tokens.js'\n\nconst PAGE_SIZE = 100\nconst MAX_STRING_DISPLAY = 256\n\nfunction describe(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'string') {\n const display =\n value.length > MAX_STRING_DISPLAY ? `${value.slice(0, MAX_STRING_DISPLAY)}…` : value\n return JSON.stringify(display)\n }\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (typeof value === 'bigint') return `${value.toString()}n`\n if (typeof value === 'function') return 'fn()'\n if (Array.isArray(value)) return `Array(${value.length})`\n return 'Object'\n}\n\ninterface ExplorerProps {\n label: string\n value: unknown\n defaultExpanded?: boolean\n depth?: number\n}\n\nexport function JSONExplorer({\n label,\n value,\n defaultExpanded = false,\n depth = 0,\n}: Readonly<ExplorerProps>) {\n const [expanded, setExpanded] = useState(defaultExpanded)\n const [pageIndex, setPageIndex] = useState(0)\n const { styles } = useDevtoolsContext()\n\n const rowClass = styles.css`\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n line-height: 1.5;\n color: ${tokens.colors.text};\n padding-left: ${depth * 12}px;\n `\n const labelBtnClass = styles.css`\n background: transparent;\n border: none;\n color: ${tokens.colors.text};\n padding: 0;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n &:hover { color: ${tokens.colors.accentHover}; }\n `\n const keyClass = styles.css`color: ${tokens.colors.accent};`\n const valClass = styles.css`color: ${tokens.colors.textMuted};`\n\n if (value === null || value === undefined || typeof value !== 'object') {\n return (\n <div className={rowClass}>\n <span className={keyClass}>{label}</span>:{' '}\n <span className={valClass}>{describe(value)}</span>\n </div>\n )\n }\n\n const entries: [string, unknown][] = Array.isArray(value)\n ? value.map((v, i) => [String(i), v] as [string, unknown])\n : Object.entries(value as Record<string, unknown>)\n\n if (entries.length === 0) {\n return (\n <div className={rowClass}>\n <span className={keyClass}>{label}</span>:{' '}\n <span className={valClass}>{Array.isArray(value) ? '[]' : '{}'}</span>\n </div>\n )\n }\n\n const totalPages = Math.ceil(entries.length / PAGE_SIZE)\n const slice = entries.slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE)\n\n return (\n <div className={rowClass}>\n <button\n type=\"button\"\n className={labelBtnClass}\n onClick={() => {\n setExpanded((e) => !e)\n }}\n aria-expanded={expanded}\n >\n <span>{expanded ? '▾' : '▸'}</span>\n <span className={keyClass}>{label}</span>\n <span className={valClass}>{describe(value)}</span>\n </button>\n {expanded && (\n <div>\n {slice.map(([k, v]) => (\n <JSONExplorer key={k} label={k} value={v} depth={depth + 1} />\n ))}\n {totalPages > 1 && (\n <div\n className={styles.css`padding-left: ${(depth + 1) * 12}px; color: ${tokens.colors.textMuted}; font-size: ${tokens.font.sizeXs};`}\n >\n page {pageIndex + 1}/{totalPages}\n {pageIndex > 0 && (\n <button\n type=\"button\"\n className={labelBtnClass}\n onClick={() => {\n setPageIndex(pageIndex - 1)\n }}\n >\n prev\n </button>\n )}\n {pageIndex < totalPages - 1 && (\n <button\n type=\"button\"\n className={labelBtnClass}\n onClick={() => {\n setPageIndex(pageIndex + 1)\n }}\n >\n next\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Requests tab — list of recent HTTP requests.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\nimport { RequestRow } from '../RequestRow.js'\n\nexport function RequestsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n if (state.requests.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n No requests yet. Make a fetch call in your app to see it here.\n </div>\n )\n }\n\n const headerClass = styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.textMuted};\n font-size: ${tokens.font.sizeXs};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n `\n const clearBtn = styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: 1px solid ${tokens.colors.borderSubtle};\n padding: 2px 6px;\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-size: ${tokens.font.sizeXs};\n &:hover { color: ${tokens.colors.text}; }\n `\n\n return (\n <div data-testid=\"devtools-requests-tab\">\n <div className={headerClass}>\n <span>\n {state.requests.length} request{state.requests.length === 1 ? '' : 's'}\n </span>\n <button\n type=\"button\"\n className={clearBtn}\n onClick={() => {\n dispatch({ type: 'RESET_REQUESTS' })\n }}\n >\n clear\n </button>\n </div>\n {state.requests.map((req) => (\n <RequestRow key={req.id} request={req} />\n ))}\n </div>\n )\n}\n","/**\n * Routes tab — file tree of app/** with active highlight (Phase 3 — T3.1).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport { tokens } from '../../styles/tokens.js'\n\nexport function RoutesTab() {\n const { state, styles } = useDevtoolsContext()\n\n if (!state.routeManifest || state.routeManifest.routes.length === 0) {\n return (\n <div style={{ color: tokens.colors.textMuted, padding: tokens.spacing.md }}>\n Routes will appear when the manifest loads.\n </div>\n )\n }\n\n const rowClass = styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n color: ${tokens.colors.text};\n font-family: ${tokens.font.mono};\n font-size: ${tokens.font.sizeXs};\n cursor: pointer;\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n &:hover { background: ${tokens.colors.bgPanelHover}; }\n &[data-active='true'] {\n background: ${tokens.colors.bgPanelHover};\n border-left: 2px solid ${tokens.colors.accent};\n }\n `\n\n function openInEditor(file: string): void {\n fetch(`/__open-in-editor?file=${encodeURIComponent(file)}`)\n .then((res) => {\n if (!res.ok) {\n console.warn(\n '[theo devtools] Editor not configured — set VITE_EDITOR=code (or your editor) in your env',\n )\n }\n })\n .catch(() => {\n console.warn('[theo devtools] Editor not configured')\n })\n }\n\n return (\n <div data-testid=\"devtools-routes-tab\">\n <a\n href=\"/__theo/openapi/docs\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.css`\n display: inline-block;\n margin-bottom: 8px;\n padding: 4px 10px;\n font-size: ${tokens.font.sizeSm};\n color: ${tokens.colors.accent};\n border: 1px solid ${tokens.colors.accent};\n border-radius: 4px;\n text-decoration: none;\n &:hover { background: ${tokens.colors.accent}22; }\n `}\n >\n 📖 View API Docs\n </a>\n {state.routeManifest.routes.map((route) => {\n const active =\n state.activeRoutePath === route.path || state.activeChain.includes(route.absoluteFilePath)\n return (\n <button\n key={route.absoluteFilePath}\n type=\"button\"\n className={rowClass}\n data-active={active}\n onClick={() => {\n openInEditor(route.absoluteFilePath)\n }}\n title={`Open ${route.absoluteFilePath} in editor`}\n >\n <span\n style={{\n color: active ? tokens.colors.accent : tokens.colors.textMuted,\n minWidth: 12,\n }}\n >\n {active ? '▸' : ' '}\n </span>\n <span style={{ flex: 1 }}>{route.path}</span>\n <span style={{ color: tokens.colors.textDim, fontSize: tokens.font.sizeXs }}>\n {route.absoluteFilePath.split('/').slice(-2).join('/')}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n","/**\n * Settings tab — position + theme (Phase 4 T4.3).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../../hooks/useDevtoolsContext.js'\nimport type { DevtoolsPosition, DevtoolsTheme } from '../../shared.js'\nimport { tokens } from '../../styles/tokens.js'\n\nconst POSITIONS: DevtoolsPosition[] = ['top-left', 'top-right', 'bottom-left', 'bottom-right']\nconst THEMES: DevtoolsTheme[] = ['light', 'dark', 'system']\n\nexport function SettingsTab() {\n const { state, dispatch, styles } = useDevtoolsContext()\n\n const sectionClass = styles.css`\n margin-bottom: ${tokens.spacing.md};\n `\n const headingClass = styles.css`\n margin: 0 0 ${tokens.spacing.xs};\n font-size: ${tokens.font.sizeMd};\n color: ${tokens.colors.text};\n `\n const radioRowClass = styles.css`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.xs} 0;\n color: ${tokens.colors.text};\n font-size: ${tokens.font.sizeSm};\n `\n\n return (\n <div data-testid=\"devtools-settings-tab\" style={{ padding: tokens.spacing.md }}>\n <fieldset className={sectionClass} style={{ border: 0, padding: 0, margin: 0 }}>\n <legend className={headingClass}>Position</legend>\n {POSITIONS.map((p) => (\n <label key={p} className={radioRowClass}>\n <input\n type=\"radio\"\n name=\"theo-devtools-position\"\n value={p}\n checked={state.position === p}\n onChange={() => {\n dispatch({ type: 'SET_POSITION', position: p })\n }}\n />\n <span>{p}</span>\n </label>\n ))}\n </fieldset>\n\n <fieldset className={sectionClass} style={{ border: 0, padding: 0, margin: 0 }}>\n <legend className={headingClass}>Theme</legend>\n {THEMES.map((t) => (\n <label key={t} className={radioRowClass}>\n <input\n type=\"radio\"\n name=\"theo-devtools-theme\"\n value={t}\n checked={state.theme === t}\n onChange={() => {\n dispatch({ type: 'SET_THEME', theme: t })\n }}\n />\n <span>{t}</span>\n </label>\n ))}\n </fieldset>\n </div>\n )\n}\n","/**\n * Devtools expandable panel.\n *\n * Renders header (tab buttons + close) + body (active tab content).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\nimport type { DevtoolsTab } from '../shared.js'\nimport { tokens } from '../styles/tokens.js'\n\nimport { ActionsTab } from './Tabs/ActionsTab.js'\nimport { AgentsTab } from './Tabs/AgentsTab.js'\nimport { CsrfReadinessTab } from './Tabs/CsrfReadinessTab.js'\nimport { ErrorsTab } from './Tabs/ErrorsTab.js'\nimport { RequestsTab } from './Tabs/RequestsTab.js'\nimport { RoutesTab } from './Tabs/RoutesTab.js'\nimport { SettingsTab } from './Tabs/SettingsTab.js'\nimport { TheoLogo } from './TheoLogo.js'\n\nconst TABS: DevtoolsTab[] = [\n 'requests',\n 'routes',\n 'agents',\n 'actions',\n 'errors',\n 'csrf-readiness',\n 'settings',\n]\n\n// Style builder extracted to keep Panel's body under the line ceiling.\nfunction buildPanelStyles(\n styles: ReturnType<typeof useDevtoolsContext>['styles'],\n vertical: 'top' | 'bottom',\n horizontal: 'left' | 'right',\n verticalOffset: number,\n) {\n return {\n panel: styles.css`\n position: fixed;\n ${vertical}: ${verticalOffset}px;\n ${horizontal}: ${tokens.panel.chipPadding}px;\n z-index: ${tokens.zIndex.panel};\n width: ${tokens.panel.defaultWidth}px;\n height: ${tokens.panel.defaultHeight}px;\n background: ${tokens.colors.bgPanel};\n color: ${tokens.colors.text};\n border: 1px solid ${tokens.colors.border};\n border-radius: ${tokens.radius.md};\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5);\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n display: flex;\n flex-direction: column;\n overflow: hidden;\n `,\n header: styles.css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n border-bottom: 1px solid ${tokens.colors.borderSubtle};\n flex-shrink: 0;\n `,\n tabs: styles.css`\n display: flex;\n gap: ${tokens.spacing.xs};\n `,\n tabBtn: styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: none;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n border-radius: ${tokens.radius.sm};\n cursor: pointer;\n font-family: ${tokens.font.family};\n font-size: ${tokens.font.sizeSm};\n text-transform: capitalize;\n &:hover {\n background: ${tokens.colors.bgPanelHover};\n color: ${tokens.colors.text};\n }\n &[data-active='true'] {\n background: ${tokens.colors.bgPanelHover};\n color: ${tokens.colors.text};\n }\n `,\n closeBtn: styles.css`\n appearance: none;\n background: transparent;\n color: ${tokens.colors.textMuted};\n border: none;\n cursor: pointer;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n border-radius: ${tokens.radius.sm};\n font-size: 16px;\n &:hover {\n background: ${tokens.colors.bgPanelHover};\n color: ${tokens.colors.text};\n }\n `,\n body: styles.css`\n flex: 1;\n overflow: auto;\n `,\n }\n}\n\nexport function Panel() {\n const { state, dispatch, styles } = useDevtoolsContext()\n if (!state.open) return null\n\n const [vertical, horizontal] = state.position.split('-', 2) as [\n 'top' | 'bottom',\n 'left' | 'right',\n ]\n const verticalOffset = tokens.panel.chipPadding + 56\n const cls = buildPanelStyles(styles, vertical, horizontal, verticalOffset)\n const panelClass = cls.panel\n const headerClass = cls.header\n const tabsClass = cls.tabs\n const tabBtnClass = cls.tabBtn\n const closeBtnClass = cls.closeBtn\n const bodyClass = cls.body\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Theo Devtools panel\"\n data-theo-devtools-panel=\"\"\n className={panelClass}\n >\n <div className={headerClass}>\n <div className={tabsClass} role=\"tablist\">\n <span\n className={styles.css`\n display: inline-flex;\n align-items: center;\n padding: 0 ${tokens.spacing.xs};\n opacity: 0.9;\n `}\n aria-hidden=\"true\"\n >\n <TheoLogo size={16} />\n </span>\n {TABS.map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n data-active={state.activeTab === t}\n aria-selected={state.activeTab === t}\n className={tabBtnClass}\n onClick={() => {\n dispatch({ type: 'SET_TAB', tab: t })\n }}\n >\n {t}\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n aria-label=\"Close devtools panel\"\n className={closeBtnClass}\n onClick={() => {\n dispatch({ type: 'TOGGLE_PANEL' })\n }}\n >\n ×\n </button>\n </div>\n <div className={bodyClass} data-testid=\"devtools-tab-body\">\n {state.activeTab === 'requests' && <RequestsTab />}\n {state.activeTab === 'routes' && <RoutesTab />}\n {state.activeTab === 'agents' && <AgentsTab />}\n {state.activeTab === 'actions' && <ActionsTab />}\n {state.activeTab === 'errors' && <ErrorsTab />}\n {state.activeTab === 'csrf-readiness' && <CsrfReadinessTab />}\n {state.activeTab === 'settings' && <SettingsTab />}\n </div>\n </div>\n )\n}\n","/**\n * T3.1 — Track the current pathname and dispatch ROUTE_MATCHED\n * with the matching route's layoutChain + leaf.\n *\n * Subscribes to `popstate` events; also patches history.pushState/replaceState\n * to fire a synthetic 'theo:devtools:locationchange' event so SPA navigation\n * is captured.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect } from 'react'\n\nimport type { RouteManifest } from '../shared.js'\n\nimport { useDevtoolsContext } from './useDevtoolsContext.js'\n\nconst LOCATION_CHANGE_EVENT = 'theo:devtools:locationchange'\n\nlet _historyPatched = false\n\nfunction patchHistoryOnce(): void {\n if (_historyPatched || typeof history === 'undefined') return\n _historyPatched = true\n const originalPush = history.pushState.bind(history)\n const originalReplace = history.replaceState.bind(history)\n history.pushState = function patchedPush(...args) {\n originalPush(...args)\n window.dispatchEvent(new Event(LOCATION_CHANGE_EVENT))\n }\n history.replaceState = function patchedReplace(...args) {\n originalReplace(...args)\n window.dispatchEvent(new Event(LOCATION_CHANGE_EVENT))\n }\n}\n\n/**\n * Match a runtime pathname against the manifest's route patterns.\n *\n * The route's `path` may contain `:slug` / `:slug?` / `*` style params\n * (the framework lifts react-router-style patterns). For v0 we do an\n * exact-or-prefix match: if the pathname equals the pattern after\n * normalizing trailing slash, return that route; otherwise pick the\n * longest-prefix match.\n *\n * Exported for unit testing.\n */\nexport function matchActiveRoute(\n pathname: string,\n manifest: RouteManifest,\n): { path: string; chain: string[] } | null {\n const norm = (s: string) => (s.length > 1 && s.endsWith('/') ? s.slice(0, -1) : s)\n const target = norm(pathname)\n\n // Exact match wins\n for (const route of manifest.routes) {\n if (norm(route.path) === target) {\n return { path: route.path, chain: [...route.layoutChain, route.absoluteFilePath] }\n }\n }\n\n // Otherwise longest-prefix match (for nested routes)\n let best: { path: string; chain: string[] } | null = null\n let bestLen = -1\n for (const route of manifest.routes) {\n const rp = norm(route.path)\n if (rp === '/' || target.startsWith(`${rp}/`)) {\n const len = rp.length\n if (len > bestLen) {\n bestLen = len\n best = { path: route.path, chain: [...route.layoutChain, route.absoluteFilePath] }\n }\n }\n }\n return best\n}\n\nexport function useActiveRoute(): void {\n const { state, dispatch } = useDevtoolsContext()\n const manifest = state.routeManifest\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n patchHistoryOnce()\n\n function update(): void {\n if (!manifest) return\n const match = matchActiveRoute(window.location.pathname, manifest)\n if (match) {\n dispatch({ type: 'ROUTE_MATCHED', path: match.path, chain: match.chain })\n }\n }\n\n // Initial match\n update()\n\n window.addEventListener('popstate', update)\n window.addEventListener(LOCATION_CHANGE_EVENT, update)\n\n return () => {\n window.removeEventListener('popstate', update)\n window.removeEventListener(LOCATION_CHANGE_EVENT, update)\n }\n }, [dispatch, manifest])\n}\n","/**\n * useResolvedTheme — resolves `'system'` to `'light'` / `'dark'` via\n * `prefers-color-scheme`. Tracks media query changes so flipping the\n * OS theme while devtools is open updates the UI immediately.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect, useState } from 'react'\n\nimport type { DevtoolsTheme } from '../shared.js'\n\n/**\n * Read `prefers-color-scheme`. `matchMedia` exists in every supported\n * browser, but `window` itself is absent in SSR and Node test runs — we\n * default to `'dark'` there. The `window`/`matchMedia` access is wrapped\n * in `typeof` checks rather than property dereferences so SSR never hits\n * a ReferenceError.\n */\nfunction getSystemTheme(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'\n}\n\nexport function useResolvedTheme(theme: DevtoolsTheme): 'light' | 'dark' {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => getSystemTheme())\n\n useEffect(() => {\n if (theme !== 'system') return\n if (typeof window === 'undefined') return\n const mq = window.matchMedia('(prefers-color-scheme: light)')\n const onChange = () => {\n setSystemTheme(mq.matches ? 'light' : 'dark')\n }\n onChange() // initial sync\n mq.addEventListener('change', onChange)\n return () => {\n mq.removeEventListener('change', onChange)\n }\n }, [theme])\n\n if (theme === 'light') return 'light'\n if (theme === 'dark') return 'dark'\n return systemTheme\n}\n","/**\n * T4.3 — Devtools keyboard shortcuts.\n *\n * - Escape: close panel (no-op when already closed)\n * - Cmd+Shift+D (Mac) / Ctrl+Shift+D (other): toggle chip visibility\n *\n * Pure helpers exported for testing (no DOM required).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { useEffect } from 'react'\n\nimport { useDevtoolsContext } from './useDevtoolsContext.js'\n\nexport interface ShortcutEvent {\n key: string\n shiftKey: boolean\n metaKey: boolean\n ctrlKey: boolean\n}\n\nfunction isMacPlatform(): boolean {\n if (typeof navigator === 'undefined') return false\n // `navigator.platform` is deprecated in favor of `navigator.userAgentData`,\n // but the modern API is still gated by an origin trial on most browsers\n // (2026). Falling back to `userAgent` covers Safari and older Firefox,\n // where the data API is absent. The combined check is intentional.\n const ua = navigator.userAgent\n // eslint-disable-next-line @typescript-eslint/no-deprecated, sonarjs/deprecation -- userAgentData not widely available yet\n const platform = navigator.platform\n return /Mac|iPhone|iPad/.test(platform) || /Macintosh|iPhone|iPad/.test(ua)\n}\n\nexport function isToggleVisibleShortcut(\n e: ShortcutEvent,\n isMac: boolean = isMacPlatform(),\n): boolean {\n if (!e.shiftKey) return false\n if (e.key !== 'd' && e.key !== 'D') return false\n return isMac ? e.metaKey : e.ctrlKey\n}\n\nexport function isCloseShortcut(e: ShortcutEvent): boolean {\n return e.key === 'Escape'\n}\n\nexport function useShortcuts(): void {\n const { state, dispatch } = useDevtoolsContext()\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n function onKeyUp(ev: KeyboardEvent) {\n if (isToggleVisibleShortcut(ev)) {\n ev.preventDefault()\n dispatch({ type: 'TOGGLE_VISIBLE' })\n return\n }\n if (isCloseShortcut(ev) && state.open) {\n ev.preventDefault()\n dispatch({ type: 'TOGGLE_PANEL' })\n }\n }\n\n window.addEventListener('keyup', onKeyUp)\n return () => {\n window.removeEventListener('keyup', onKeyUp)\n }\n }, [dispatch, state.open])\n}\n","/**\n * T4.2 — localStorage round-trip for devtools preferences.\n *\n * - EC-21: STORAGE_VERSION key shipped from day 0. Version mismatch\n * returns empty (defaults used) — protects against future schema drift.\n * - EC-29: per-key try/catch. Corrupt JSON in ONE key falls back to default\n * for THAT key; other valid keys remain restored.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport {\n type DevtoolsPosition,\n type DevtoolsState,\n type DevtoolsTab,\n type DevtoolsTheme,\n STORAGE_VERSION,\n} from '../shared.js'\n\nexport const STORAGE_KEYS = {\n version: 'theo-devtools-storage-version',\n position: 'theo-devtools-position',\n theme: 'theo-devtools-theme',\n open: 'theo-devtools-open',\n activeTab: 'theo-devtools-active-tab',\n visible: 'theo-devtools-visible',\n} as const\n\nfunction getLocalStorage(): Storage | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage\n } catch {\n return null\n }\n}\n\n/**\n * EC-29 — per-key read with isolated try/catch.\n * Corrupt JSON or missing key → fallback. Never throws.\n */\nfunction readKey<T>(key: string, fallback: T): T {\n const ls = getLocalStorage()\n if (!ls) return fallback\n try {\n const raw = ls.getItem(key)\n if (raw === null) return fallback\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nfunction writeKey(key: string, value: unknown): void {\n const ls = getLocalStorage()\n if (!ls) return\n try {\n ls.setItem(key, JSON.stringify(value))\n } catch {\n // Quota exceeded, private browsing, etc. — silently skip.\n }\n}\n\nexport type PersistedState = Pick<\n DevtoolsState,\n 'position' | 'theme' | 'open' | 'activeTab' | 'visible'\n>\n\nconst VALID_POSITIONS = new Set<DevtoolsPosition>([\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n])\nconst VALID_THEMES = new Set<DevtoolsTheme>(['light', 'dark', 'system'])\nconst VALID_TABS = new Set<DevtoolsTab>([\n 'requests',\n 'routes',\n 'errors',\n 'csrf-readiness',\n 'settings',\n])\n\nfunction asPosition(v: unknown): DevtoolsPosition | null {\n return typeof v === 'string' && VALID_POSITIONS.has(v as DevtoolsPosition)\n ? (v as DevtoolsPosition)\n : null\n}\nfunction asTheme(v: unknown): DevtoolsTheme | null {\n return typeof v === 'string' && VALID_THEMES.has(v as DevtoolsTheme) ? (v as DevtoolsTheme) : null\n}\nfunction asTab(v: unknown): DevtoolsTab | null {\n return typeof v === 'string' && VALID_TABS.has(v as DevtoolsTab) ? (v as DevtoolsTab) : null\n}\nfunction asBool(v: unknown): boolean | null {\n return typeof v === 'boolean' ? v : null\n}\n\n/**\n * Load persisted preferences from localStorage.\n *\n * EC-21: Returns {} if STORAGE_VERSION key does not match the current\n * version — defaults are used at the Overlay level. Any future major\n * version bump simply clears the slate without an explicit migration.\n *\n * EC-29: each field is read independently. Corrupt 'position' key does\n * NOT cause 'theme' to also reset.\n */\nexport function loadFromStorage(): Partial<PersistedState> {\n const storedVersion = readKey<number>(STORAGE_KEYS.version, 0)\n if (storedVersion !== STORAGE_VERSION) return {}\n\n const out: Partial<PersistedState> = {}\n\n const pos = asPosition(readKey<unknown>(STORAGE_KEYS.position, null))\n if (pos) out.position = pos\n\n const theme = asTheme(readKey<unknown>(STORAGE_KEYS.theme, null))\n if (theme) out.theme = theme\n\n const tab = asTab(readKey<unknown>(STORAGE_KEYS.activeTab, null))\n if (tab) out.activeTab = tab\n\n const open = asBool(readKey<unknown>(STORAGE_KEYS.open, null))\n if (open !== null) out.open = open\n\n const visible = asBool(readKey<unknown>(STORAGE_KEYS.visible, null))\n if (visible !== null) out.visible = visible\n\n return out\n}\n\n/**\n * Persist the current preferences. Always writes the version key first\n * so future loads can detect this schema.\n */\nexport function writeToStorage(s: PersistedState): void {\n writeKey(STORAGE_KEYS.version, STORAGE_VERSION)\n writeKey(STORAGE_KEYS.position, s.position)\n writeKey(STORAGE_KEYS.theme, s.theme)\n writeKey(STORAGE_KEYS.open, s.open)\n writeKey(STORAGE_KEYS.activeTab, s.activeTab)\n writeKey(STORAGE_KEYS.visible, s.visible)\n}\n","/**\n * Devtools reducer.\n *\n * EC-23 ring buffer cap 50 — requests/errors capped at RING_BUFFER_CAP.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport {\n type DevtoolsAction,\n type DevtoolsState,\n type ErrorRecord,\n RING_BUFFER_CAP,\n initialState,\n} from '../shared.js'\n\nfunction appendCapped<T>(arr: T[], item: T, cap = RING_BUFFER_CAP): T[] {\n return [item, ...arr].slice(0, cap)\n}\n\nfunction reduceAppend(state: DevtoolsState, action: DevtoolsAction): DevtoolsState | null {\n switch (action.type) {\n case 'REQUEST_ADD':\n return { ...state, requests: appendCapped(state.requests, action.request) }\n case 'ERROR_ADD':\n return { ...state, errors: appendCapped(state.errors, action.error) }\n case 'AGENT_RUN_ADD':\n return { ...state, agentRuns: appendCapped(state.agentRuns, action.run) }\n case 'ACTION_CALL_ADD':\n return { ...state, actionCalls: appendCapped(state.actionCalls, action.record) }\n case 'AGENT_STREAM_EVENT':\n return { ...state, agentStreamEvents: appendCapped(state.agentStreamEvents, action.event) }\n default:\n return null\n }\n}\n\nfunction reduceReset(state: DevtoolsState, action: DevtoolsAction): DevtoolsState | null {\n switch (action.type) {\n case 'RESET_REQUESTS':\n return { ...state, requests: [] }\n case 'RESET_ERRORS':\n return { ...state, errors: [] }\n case 'RESET_AGENT_RUNS':\n return { ...state, agentRuns: [] }\n case 'RESET_ACTION_CALLS':\n return { ...state, actionCalls: [] }\n case 'RESET_AGENT_STREAM':\n return { ...state, agentStreamEvents: [] }\n default:\n return null\n }\n}\n\nfunction csrfWarnToErrorRecord(payload: {\n method: string\n path: string\n reason: string\n code?: string\n docsUrl?: string\n}): ErrorRecord {\n return {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-secret correlation id for devtools UI\n id: `csrf-${String(Date.now())}-${Math.random().toString(36).slice(2, 8)}`,\n type: 'csrf.warn',\n message: `CSRF warn: ${payload.method} ${payload.path} — ${payload.reason}`,\n code: payload.code,\n docsUrl: payload.docsUrl,\n timestamp: Date.now(),\n }\n}\n\nexport function devtoolsReducer(state: DevtoolsState, action: DevtoolsAction): DevtoolsState {\n switch (action.type) {\n case 'TOGGLE_PANEL':\n return { ...state, open: !state.open }\n case 'TOGGLE_VISIBLE':\n return { ...state, visible: !state.visible }\n case 'SET_TAB':\n return { ...state, activeTab: action.tab }\n case 'SET_POSITION':\n return { ...state, position: action.position }\n case 'SET_THEME':\n return { ...state, theme: action.theme }\n case 'CSRF_WARN':\n return { ...state, errors: appendCapped(state.errors, csrfWarnToErrorRecord(action.payload)) }\n case 'MANIFEST_UPDATED':\n return { ...state, routeManifest: action.manifest }\n case 'ROUTE_MATCHED':\n return { ...state, activeRoutePath: action.path, activeChain: action.chain }\n default:\n return reduceAppend(state, action) ?? reduceReset(state, action) ?? state\n }\n}\n\nexport { initialState }\n","/**\n * Goober-based CSS factory scoped to a Shadow DOM target.\n *\n * Devtools UI lives inside an open shadow root. Global stylesheets\n * (Tailwind, user app CSS) do not reach into shadow roots; goober's\n * `css.bind({ target })` injects styles INSIDE the shadow root so\n * our UI renders correctly while the user's app stays untouched.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport { css as gooberCss, setup as gooberSetup } from 'goober'\n\nlet _initialized: WeakSet<ShadowRoot> | null = null\n\nfunction getInitialized(): WeakSet<ShadowRoot> {\n _initialized ??= new WeakSet()\n return _initialized\n}\n\nexport interface StyleFactory {\n css: typeof gooberCss\n}\n\n/**\n * Create a goober css tag bound to a specific Shadow DOM target.\n *\n * Subsequent calls with the same shadowRoot return cached factory.\n * EC-23 / EC-25 unrelated; this just ensures we don't re-bind goober per render.\n */\nexport function createStyles(shadowRoot: ShadowRoot): StyleFactory {\n const initialized = getInitialized()\n if (!initialized.has(shadowRoot)) {\n // goober's setup() registers the global `css` tag's target.\n // We pass a no-op pragma since we use bind() per shadow root.\n gooberSetup(null as never)\n initialized.add(shadowRoot)\n }\n\n // goober.css.bind({ target }) returns a new tagged template fn whose\n // emitted styles land inside shadowRoot, not document.head.\n const bound = (\n gooberCss as unknown as { bind: (ctx: { target: ShadowRoot }) => typeof gooberCss }\n ).bind({\n target: shadowRoot,\n })\n\n return { css: bound }\n}\n","/**\n * Render React children inside the devtools Shadow Root via createPortal.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useDevtoolsContext } from '../hooks/useDevtoolsContext.js'\n\nexport function ShadowPortal({ children }: { children: ReactNode }) {\n const { shadowRoot } = useDevtoolsContext()\n return createPortal(children, shadowRoot)\n}\n"],"mappings":"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","names":["useEffect","dispatcher","history","jsx","jsx","jsx","jsxs","formatTime","useEffect","useState","useCallback","jsx","jsxs","useState","useCallback","useEffect","useState","jsx","jsxs","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useEffect","useEffect","useEffect","useState","useEffect","useEffect","jsx","jsxs","useEffect","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "theokit",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "Apache-2.0",