theokit 0.1.0-alpha.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/add-2ZFFGGE4.js +0 -0
  2. package/dist/aws-lambda-PONVF3UX.js +0 -0
  3. package/dist/broadcast-QOQGUNNK.js +0 -0
  4. package/dist/build-IQQYCA3B.js +0 -0
  5. package/dist/bun-DITMZMKL.js +0 -0
  6. package/dist/check-PZR67OY5.js +0 -0
  7. package/dist/chunk-3Q36SEDK.js +0 -0
  8. package/dist/chunk-5ODOE6EF.js +0 -0
  9. package/dist/chunk-GQSTRXXB.js +0 -0
  10. package/dist/{chunk-MCP6Y5BA.js → chunk-JBC7PFV4.js} +25 -1
  11. package/dist/chunk-JBC7PFV4.js.map +1 -0
  12. package/dist/chunk-JZ5WEG3S.js +0 -0
  13. package/dist/chunk-KT3MWNZG.js +0 -0
  14. package/dist/chunk-O7335ZGH.js +0 -0
  15. package/dist/chunk-OK2PJOLK.js +105 -0
  16. package/dist/chunk-OK2PJOLK.js.map +1 -0
  17. package/dist/chunk-S3JBIFKS.js +0 -0
  18. package/dist/chunk-WQCPKA2L.js +0 -0
  19. package/dist/chunk-WZ7CPVQB.js +0 -0
  20. package/dist/chunk-XMS5VRIK.js +0 -0
  21. package/dist/chunk-Y5KE6YFP.js +0 -0
  22. package/dist/chunk-ZK5JCE5J.js +0 -0
  23. package/dist/cli/index.js +1 -1
  24. package/dist/cloudflare-RBANU3SE.js +0 -0
  25. package/dist/configure-agent-registry-6YGTJYBC.js +0 -0
  26. package/dist/deno-deploy-J7LI6HNL.js +0 -0
  27. package/dist/dev-VN6WS3CM.js +0 -0
  28. package/dist/devtools/entry.js +249 -203
  29. package/dist/devtools/entry.js.map +1 -1
  30. package/dist/dispatcher-IK3FVMX5.js +8 -0
  31. package/dist/dispatcher-IK3FVMX5.js.map +1 -0
  32. package/dist/{dist-UZV7J3YI.js → dist-Q5VBFWVL.js} +251 -89
  33. package/dist/dist-Q5VBFWVL.js.map +1 -0
  34. package/dist/docker-EZDA5FT7.js +0 -0
  35. package/dist/generate-SIO4JSKJ.js +0 -0
  36. package/dist/info-B3UOXFUF.js +0 -0
  37. package/dist/lib-NST3PNZX.js +0 -0
  38. package/dist/netlify-IFY6ZGFV.js +0 -0
  39. package/dist/node-KWZI3CKV.js +0 -0
  40. package/dist/proper-lockfile-MVKMQGFK.js +0 -0
  41. package/dist/registry-BB3UYAOG.js +0 -0
  42. package/dist/routes-CAGFZKUK.js +0 -0
  43. package/dist/scan-C2BOKLSY.js +0 -0
  44. package/dist/schema-MVB2FVK6.js +0 -0
  45. package/dist/server/cost/index.d.ts +7 -0
  46. package/dist/server/cost/index.js +1 -1
  47. package/dist/server/index.js +70 -2
  48. package/dist/server/index.js.map +1 -1
  49. package/dist/services-typed-client-ZX5JUHH3.js +0 -0
  50. package/dist/sqlite-vec-54KB4RD3.js +0 -0
  51. package/dist/{start-CSLJQXV3.js → start-ZGWW5MOL.js} +3 -3
  52. package/dist/static-BH6JQNM2.js +0 -0
  53. package/dist/storage-manager-D5KBXXKB.js +0 -0
  54. package/dist/theo-cloud-3K4DGB3S.js +0 -0
  55. package/dist/upgrade-readiness-OHL36FQL.js +0 -0
  56. package/dist/vercel-RHADE5IP.js +0 -0
  57. package/dist/vite-plugin-WA3G45YY.js +0 -0
  58. package/package.json +7 -7
  59. package/LICENSE +0 -201
  60. package/dist/chunk-MCP6Y5BA.js.map +0 -1
  61. package/dist/dist-UZV7J3YI.js.map +0 -1
  62. /package/dist/{start-CSLJQXV3.js.map → start-ZGWW5MOL.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/devtools/entry.tsx","../../src/devtools/Overlay.tsx","../../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/CsrfReadinessTab.tsx","../../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/shared.ts","../../src/devtools/dispatcher.ts","../../src/devtools/hmr-bridge.ts","../../src/devtools/hooks/useActiveRoute.ts","../../src/devtools/hooks/useResolvedTheme.ts","../../src/devtools/hooks/useShortcuts.ts","../../src/devtools/persistence.ts","../../src/devtools/reducer.ts","../../src/devtools/shadow-portal.tsx","../../src/devtools/styles/styles.ts"],"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 { Indicator } from './components/Indicator.js'\nimport { Panel } from './components/Panel.js'\nimport { dispatcher } from './dispatcher.js'\nimport { subscribeToServerEvents } from './hmr-bridge.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 './persistence.js'\nimport { devtoolsReducer, initialState } from './reducer.js'\nimport { ShadowPortal } from './shadow-portal.js'\nimport { createStyles } from './styles/styles.js'\nimport { buildThemeCssVars } from './styles/tokens.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 useInsertionEffect(() => {\n dispatcher.setDispatch(dispatch)\n return () => {\n dispatcher.setDispatch(null)\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 * 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 mark — embedded as base64 PNG so the devtools surface\n * has zero external asset dependency. Sourced from\n * theo-website/public/logo-128.png (128×128, 5.9KB raw, ~8KB base64).\n *\n * Browsers scale this cleanly to any size we render at. For sharper\n * rendering at small sizes use the CSS image-rendering: pixelated hint.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nexport const THEO_LOGO_BASE64 =\n 'data:image/png;base64,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'\n","/**\n * Theo brand mark — the canonical pixel-art mascot from theo-website/public/logo.png.\n *\n * Embedded as base64 PNG (see ./assets/logo-data.ts) so the devtools UI has\n * zero external asset dependency. `image-rendering: pixelated` preserves the\n * crisp pixel-art look at small sizes.\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=\"Theo\"\n width={size}\n height={size}\n style={{\n display: 'inline-block',\n flexShrink: 0,\n imageRendering: 'pixelated',\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 * 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 { 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<string | 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(`Endpoint returned ${String(res.status)} — is csrfReadinessStore wired?`)\n return\n }\n const json = (await res.json()) as ReadinessSummary\n setData(json)\n setError(null)\n } catch (e) {\n setError(e instanceof Error ? e.message : 'fetch failed')\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 className={cls.container} data-testid=\"devtools-csrf-readiness-error\">\n <div style={{ color: tokens.colors.error.csrf }}>{error}</div>\n <p style={{ color: tokens.colors.textMuted, marginTop: tokens.spacing.sm }}>\n Wire <code>csrfReadinessStore</code> in the api-middleware options to enable this tab.\n </p>\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 * 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 {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 { 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[] = ['requests', 'routes', 'errors', 'csrf-readiness', 'settings']\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 === 'errors' && <ErrorsTab />}\n {state.activeTab === 'csrf-readiness' && <CsrfReadinessTab />}\n {state.activeTab === 'settings' && <SettingsTab />}\n </div>\n </div>\n )\n}\n","/**\n * Devtools — shared types.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\n\nexport type DevtoolsPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\nexport type DevtoolsTab = 'requests' | 'routes' | 'errors' | 'csrf-readiness' | 'settings'\nexport type DevtoolsTheme = 'light' | 'dark' | 'system'\n\nexport interface RequestRecord {\n id: string\n traceId: string\n method: string\n path: string\n status: number\n durationMs: number\n startedAt: number\n csrfWarn?: { code: string; docsUrl: string }\n headers?: Record<string, string>\n bodyPreview?: string\n bodyLength?: number\n bodyTruncated?: boolean\n}\n\nexport interface ErrorRecord {\n id: string\n type: 'console' | 'unhandled' | 'csrf.warn'\n message: string\n stack?: string\n code?: string\n docsUrl?: string\n timestamp: number\n}\n\nexport interface CsrfWarnPayload {\n event: 'csrf.warn'\n code: string\n docsUrl: string\n method: string\n path: string\n reason: string\n}\n\nexport interface RouteInfo {\n path: string\n absoluteFilePath: string\n layoutChain: string[]\n hasLoading: boolean\n hasError: boolean\n hasNotFound: boolean\n}\n\nexport interface RouteManifest {\n routes: RouteInfo[]\n}\n\nexport interface DevtoolsState {\n open: boolean\n visible: boolean\n position: DevtoolsPosition\n theme: DevtoolsTheme\n activeTab: DevtoolsTab\n requests: RequestRecord[]\n errors: ErrorRecord[]\n routeManifest: RouteManifest | null\n activeRoutePath: string | null\n activeChain: string[]\n}\n\nexport type DevtoolsAction =\n | { type: 'TOGGLE_PANEL' }\n | { type: 'TOGGLE_VISIBLE' }\n | { type: 'SET_TAB'; tab: DevtoolsTab }\n | { type: 'SET_POSITION'; position: DevtoolsPosition }\n | { type: 'SET_THEME'; theme: DevtoolsTheme }\n | { type: 'REQUEST_ADD'; request: RequestRecord }\n | { type: 'ERROR_ADD'; error: ErrorRecord }\n | { type: 'CSRF_WARN'; payload: CsrfWarnPayload }\n | { type: 'MANIFEST_UPDATED'; manifest: RouteManifest }\n | { type: 'ROUTE_MATCHED'; path: string; chain: string[] }\n | { type: 'RESET_REQUESTS' }\n | { type: 'RESET_ERRORS' }\n\nexport const RING_BUFFER_CAP = 50\nexport const MAX_QUEUE_SIZE = 100\nexport const STORAGE_VERSION = 1\n\nexport const initialState: DevtoolsState = {\n open: false,\n visible: true,\n position: 'bottom-right',\n theme: 'system',\n activeTab: 'requests',\n requests: [],\n errors: [],\n routeManifest: null,\n activeRoutePath: null,\n activeChain: [],\n}\n\nexport const CHANNEL_REQUEST = 'theo:devtools:request' as const\nexport const CHANNEL_ERROR = 'theo:devtools:error' as const\nexport const CHANNEL_CSRF_WARN = 'theo:devtools:csrf.warn' as const\nexport const CHANNEL_MANIFEST = 'theo:devtools:manifest' as const\nexport const CHANNEL_ROUTE_MATCHED = 'theo:devtools:route-matched' as const\n","/**\n * T2.1 — Devtools dispatcher with pre-mount event queue.\n *\n * Pattern: events emitted from anywhere (server WS, browser console.error,\n * dispatcher.onCsrfWarn) can fire BEFORE the React tree mounts. Each call\n * either dispatches immediately (when `setDispatch` registered a dispatch\n * fn) or queues until React is ready, then flushes on first mount.\n *\n * EC-23: queue capped at MAX_QUEUE_SIZE (FIFO eviction).\n * EC-24: setDispatch is idempotent — flush only on NULL → non-null\n * transition (StrictMode re-mount safe).\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nimport {\n type CsrfWarnPayload,\n type DevtoolsAction,\n type ErrorRecord,\n MAX_QUEUE_SIZE,\n type RequestRecord,\n type RouteManifest,\n} from './shared.js'\n\ntype Dispatch = (action: DevtoolsAction) => void\ntype QueuedItem = (d: Dispatch) => void\n\nlet _dispatch: Dispatch | null = null\nconst _queue: QueuedItem[] = []\n\nfunction queuable<Args extends unknown[]>(\n fn: (d: Dispatch, ...args: Args) => void,\n): (...args: Args) => void {\n return (...args: Args) => {\n if (_dispatch) {\n try {\n fn(_dispatch, ...args)\n } catch (err) {\n // EC-25: an error inside reducer-bound dispatch path MUST NOT bubble\n // to the original event source (e.g. logger / HMR callback / global\n // error handler). Log and continue.\n\n console.error('[theo devtools] dispatch failed', err)\n }\n } else {\n // EC-23: cap queue, FIFO-evict if full\n if (_queue.length >= MAX_QUEUE_SIZE) _queue.shift()\n _queue.push((d) => {\n fn(d, ...args)\n })\n }\n }\n}\n\nfunction flushQueue(): void {\n while (_queue.length) {\n const fn = _queue.shift()\n if (!fn || !_dispatch) break\n try {\n fn(_dispatch)\n } catch (err) {\n console.error('[theo devtools] queued event failed', err)\n }\n }\n}\n\nexport const dispatcher = {\n onRequest: queuable((d: Dispatch, req: RequestRecord) => {\n d({ type: 'REQUEST_ADD', request: req })\n }),\n onError: queuable((d: Dispatch, err: ErrorRecord) => {\n d({ type: 'ERROR_ADD', error: err })\n }),\n onCsrfWarn: queuable((d: Dispatch, payload: CsrfWarnPayload) => {\n d({ type: 'CSRF_WARN', payload })\n }),\n onManifestUpdated: queuable((d: Dispatch, manifest: RouteManifest) => {\n d({ type: 'MANIFEST_UPDATED', manifest })\n }),\n onRouteMatched: queuable((d: Dispatch, path: string, chain: string[]) => {\n d({ type: 'ROUTE_MATCHED', path, chain })\n }),\n\n /**\n * Wire React's dispatch function in. Idempotent (EC-24): only the\n * NULL → non-null transition flushes the queue; subsequent non-null\n * sets just replace the reference (used for StrictMode re-mount).\n */\n setDispatch(d: Dispatch | null): void {\n const prev = _dispatch\n _dispatch = d\n if (d && !prev) flushQueue()\n },\n\n /** Testing helper — clear queue + dispatch reference between tests. */\n _reset(): void {\n _dispatch = null\n _queue.length = 0\n },\n\n /** Testing helper — observe queue length. */\n _queueLength(): number {\n return _queue.length\n },\n}\n\nexport type Dispatcher = typeof dispatcher\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 type { Dispatcher } from './dispatcher.js'\nimport {\n CHANNEL_CSRF_WARN,\n CHANNEL_ERROR,\n CHANNEL_MANIFEST,\n CHANNEL_REQUEST,\n CHANNEL_ROUTE_MATCHED,\n type CsrfWarnPayload,\n type ErrorRecord,\n type RequestRecord,\n type RouteManifest,\n} from './shared.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 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\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 * 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\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 '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 'CSRF_WARN': {\n const errorRecord: ErrorRecord = {\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: ${action.payload.method} ${action.payload.path} — ${action.payload.reason}`,\n code: action.payload.code,\n docsUrl: action.payload.docsUrl,\n timestamp: Date.now(),\n }\n return { ...state, errors: appendCapped(state.errors, errorRecord) }\n }\n case 'MANIFEST_UPDATED':\n return { ...state, routeManifest: action.manifest }\n case 'ROUTE_MATCHED':\n return { ...state, activeRoutePath: action.path, activeChain: action.chain }\n case 'RESET_REQUESTS':\n return { ...state, requests: [] }\n case 'RESET_ERRORS':\n return { ...state, errors: [] }\n default:\n return state\n }\n}\n\nexport { initialState }\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","/**\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"],"mappings":"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","names":["useEffect","history","jsx","useEffect","useCallback","jsx","useCallback","useEffect","useState","jsx","jsxs","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","dispatcher","useEffect","useEffect","useEffect","useState","useEffect","useEffect","jsx","jsxs","useEffect","jsx"]}
1
+ {"version":3,"sources":["../../src/devtools/entry.tsx","../../src/devtools/Overlay.tsx","../../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/AgentsTab.tsx","../../src/devtools/components/Tabs/CsrfReadinessTab.tsx","../../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/hmr-bridge.ts","../../src/devtools/hooks/useActiveRoute.ts","../../src/devtools/hooks/useResolvedTheme.ts","../../src/devtools/hooks/useShortcuts.ts","../../src/devtools/persistence.ts","../../src/devtools/reducer.ts","../../src/devtools/shadow-portal.tsx","../../src/devtools/styles/styles.ts"],"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 { Indicator } from './components/Indicator.js'\nimport { Panel } from './components/Panel.js'\nimport { dispatcher } from './dispatcher.js'\nimport { subscribeToServerEvents } from './hmr-bridge.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 './persistence.js'\nimport { devtoolsReducer, initialState } from './reducer.js'\nimport { ShadowPortal } from './shadow-portal.js'\nimport { createStyles } from './styles/styles.js'\nimport { buildThemeCssVars } from './styles/tokens.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 useInsertionEffect(() => {\n dispatcher.setDispatch(dispatch)\n return () => {\n dispatcher.setDispatch(null)\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 * 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 mark — embedded as base64 PNG so the devtools surface\n * has zero external asset dependency. Sourced from\n * theo-website/public/logo-128.png (128×128, 5.9KB raw, ~8KB base64).\n *\n * Browsers scale this cleanly to any size we render at. For sharper\n * rendering at small sizes use the CSS image-rendering: pixelated hint.\n *\n * NEVER use dangerouslySetInnerHTML in any devtools component — see plan EC-20.\n */\nexport const THEO_LOGO_BASE64 =\n 'data:image/png;base64,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'\n","/**\n * Theo brand mark — the canonical pixel-art mascot from theo-website/public/logo.png.\n *\n * Embedded as base64 PNG (see ./assets/logo-data.ts) so the devtools UI has\n * zero external asset dependency. `image-rendering: pixelated` preserves the\n * crisp pixel-art look at small sizes.\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=\"Theo\"\n width={size}\n height={size}\n style={{\n display: 'inline-block',\n flexShrink: 0,\n imageRendering: 'pixelated',\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 * 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\n see 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 </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 { 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<string | 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(`Endpoint returned ${String(res.status)} — is csrfReadinessStore wired?`)\n return\n }\n const json = (await res.json()) as ReadinessSummary\n setData(json)\n setError(null)\n } catch (e) {\n setError(e instanceof Error ? e.message : 'fetch failed')\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 className={cls.container} data-testid=\"devtools-csrf-readiness-error\">\n <div style={{ color: tokens.colors.error.csrf }}>{error}</div>\n <p style={{ color: tokens.colors.textMuted, marginTop: tokens.spacing.sm }}>\n Wire <code>csrfReadinessStore</code> in the api-middleware options to enable this tab.\n </p>\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 * 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 {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 { 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 '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 === 'errors' && <ErrorsTab />}\n {state.activeTab === 'csrf-readiness' && <CsrfReadinessTab />}\n {state.activeTab === 'settings' && <SettingsTab />}\n </div>\n </div>\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 type { Dispatcher } from './dispatcher.js'\nimport {\n CHANNEL_CSRF_WARN,\n CHANNEL_ERROR,\n CHANNEL_MANIFEST,\n CHANNEL_REQUEST,\n CHANNEL_ROUTE_MATCHED,\n type CsrfWarnPayload,\n type ErrorRecord,\n type RequestRecord,\n type RouteManifest,\n} from './shared.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 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\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 * 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\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 '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 'CSRF_WARN': {\n const errorRecord: ErrorRecord = {\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: ${action.payload.method} ${action.payload.path} — ${action.payload.reason}`,\n code: action.payload.code,\n docsUrl: action.payload.docsUrl,\n timestamp: Date.now(),\n }\n return { ...state, errors: appendCapped(state.errors, errorRecord) }\n }\n case 'MANIFEST_UPDATED':\n return { ...state, routeManifest: action.manifest }\n case 'ROUTE_MATCHED':\n return { ...state, activeRoutePath: action.path, activeChain: action.chain }\n case 'AGENT_RUN_ADD':\n return { ...state, agentRuns: appendCapped(state.agentRuns, action.run) }\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 default:\n return state\n }\n}\n\nexport { initialState }\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","/**\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"],"mappings":"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","names":["useEffect","history","jsx","jsx","useEffect","useCallback","jsx","jsxs","useCallback","useEffect","useState","jsx","jsxs","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","dispatcher","useEffect","useEffect","useEffect","useState","useEffect","useEffect","jsx","jsxs","useEffect","jsx"]}