state-surgeon 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/dashboard/components/MutationInspector.tsx","../../src/core/diff.ts","../../src/dashboard/components/StateDiffViewer.tsx","../../src/dashboard/components/TimelineScrubber.tsx","../../src/dashboard/hooks/useDashboard.tsx","../../src/dashboard/Dashboard.tsx"],"names":["jsxs","jsx","Fragment","useState","useCallback","useMemo","React","useEffect"],"mappings":"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A;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAqUN;AAAA,GAAA,EACJ,CAAA;AAEJ","file":"index.mjs","sourcesContent":["import type { Mutation } from '../../core/mutation';\n\nexport interface MutationInspectorProps {\n /** The mutation to inspect */\n mutation: Mutation | null;\n\n /** Custom class name */\n className?: string;\n}\n\n/**\n * Detailed inspector for a single mutation\n */\nexport function MutationInspector({\n mutation,\n className = '',\n}: MutationInspectorProps) {\n if (!mutation) {\n return (\n <div className={`mutation-inspector mutation-inspector--empty ${className}`}>\n <p>Select a mutation to inspect</p>\n </div>\n );\n }\n\n const formatDuration = (ms?: number) => {\n if (ms === undefined) return 'N/A';\n if (ms < 1) return `${(ms * 1000).toFixed(2)}μs`;\n if (ms < 1000) return `${ms.toFixed(2)}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n };\n\n const formatTimestamp = (ts: number) => {\n const date = new Date(ts);\n return date.toLocaleString();\n };\n\n return (\n <div className={`mutation-inspector ${className}`}>\n <div className=\"mutation-inspector__header\">\n <h3 className=\"mutation-inspector__title\">\n <span\n className=\"mutation-inspector__source-badge\"\n data-source={mutation.source}\n >\n {mutation.source}\n </span>\n {mutation.actionType}\n </h3>\n <span className=\"mutation-inspector__id\">{mutation.id}</span>\n </div>\n\n <div className=\"mutation-inspector__grid\">\n <div className=\"mutation-inspector__section\">\n <h4>Location</h4>\n <dl className=\"mutation-inspector__details\">\n {mutation.component && (\n <>\n <dt>Component</dt>\n <dd>{mutation.component}</dd>\n </>\n )}\n {mutation.function && (\n <>\n <dt>Function</dt>\n <dd><code>{mutation.function}</code></dd>\n </>\n )}\n {mutation.file && (\n <>\n <dt>File</dt>\n <dd>\n <code>\n {mutation.file}\n {mutation.line && `:${mutation.line}`}\n {mutation.column && `:${mutation.column}`}\n </code>\n </dd>\n </>\n )}\n </dl>\n </div>\n\n <div className=\"mutation-inspector__section\">\n <h4>Timing</h4>\n <dl className=\"mutation-inspector__details\">\n <dt>Timestamp</dt>\n <dd>{formatTimestamp(mutation.timestamp)}</dd>\n <dt>Logical Clock</dt>\n <dd>{mutation.logicalClock}</dd>\n {mutation.duration !== undefined && (\n <>\n <dt>Duration</dt>\n <dd>{formatDuration(mutation.duration)}</dd>\n </>\n )}\n </dl>\n </div>\n </div>\n\n {mutation.actionPayload && (\n <div className=\"mutation-inspector__section\">\n <h4>Action Payload</h4>\n <pre className=\"mutation-inspector__code\">\n {JSON.stringify(mutation.actionPayload, null, 2)}\n </pre>\n </div>\n )}\n\n {mutation.diff && mutation.diff.length > 0 && (\n <div className=\"mutation-inspector__section\">\n <h4>State Changes ({mutation.diff.length})</h4>\n <ul className=\"mutation-inspector__changes\">\n {mutation.diff.map((change, index) => (\n <li key={index} className={`mutation-inspector__change mutation-inspector__change--${change.operation.toLowerCase()}`}>\n <code>{change.path}</code>\n <span className=\"mutation-inspector__op\">{change.operation}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {mutation.callStack && mutation.callStack.length > 0 && (\n <div className=\"mutation-inspector__section\">\n <h4>Call Stack</h4>\n <ul className=\"mutation-inspector__stack\">\n {mutation.callStack.map((frame, index) => (\n <li key={index} className=\"mutation-inspector__frame\">\n <code>{frame}</code>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {mutation.causes && mutation.causes.length > 0 && (\n <div className=\"mutation-inspector__section\">\n <h4>Caused By</h4>\n <ul className=\"mutation-inspector__causes\">\n {mutation.causes.map((causeId, index) => (\n <li key={index}>\n <code>{causeId}</code>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <style>{`\n .mutation-inspector {\n padding: 1rem;\n background: #1a1a2e;\n border-radius: 8px;\n color: #e0e0e0;\n font-size: 0.875rem;\n }\n\n .mutation-inspector--empty {\n text-align: center;\n color: #666;\n padding: 2rem;\n }\n\n .mutation-inspector__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid #333;\n }\n\n .mutation-inspector__title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n font-size: 1rem;\n color: #fff;\n }\n\n .mutation-inspector__source-badge {\n padding: 0.125rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .mutation-inspector__source-badge[data-source=\"react\"] {\n background: #61dafb;\n color: #000;\n }\n\n .mutation-inspector__source-badge[data-source=\"redux\"] {\n background: #764abc;\n color: #fff;\n }\n\n .mutation-inspector__source-badge[data-source=\"zustand\"] {\n background: #f59e0b;\n color: #000;\n }\n\n .mutation-inspector__source-badge[data-source=\"api\"] {\n background: #3b82f6;\n color: #fff;\n }\n\n .mutation-inspector__id {\n color: #666;\n font-family: monospace;\n font-size: 0.75rem;\n }\n\n .mutation-inspector__grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n margin-bottom: 1rem;\n }\n\n .mutation-inspector__section {\n margin-bottom: 1rem;\n }\n\n .mutation-inspector__section h4 {\n margin: 0 0 0.5rem 0;\n color: #00d9ff;\n font-size: 0.875rem;\n }\n\n .mutation-inspector__details {\n margin: 0;\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 0.25rem 0.5rem;\n }\n\n .mutation-inspector__details dt {\n color: #888;\n }\n\n .mutation-inspector__details dd {\n margin: 0;\n color: #e0e0e0;\n }\n\n .mutation-inspector__code {\n margin: 0;\n padding: 0.75rem;\n background: #0f0f23;\n border-radius: 4px;\n overflow: auto;\n max-height: 200px;\n font-size: 0.8rem;\n }\n\n .mutation-inspector__changes,\n .mutation-inspector__stack,\n .mutation-inspector__causes {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .mutation-inspector__change {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n margin-bottom: 0.25rem;\n }\n\n .mutation-inspector__change--add {\n background: rgba(34, 197, 94, 0.1);\n }\n\n .mutation-inspector__change--update {\n background: rgba(251, 191, 36, 0.1);\n }\n\n .mutation-inspector__change--remove {\n background: rgba(239, 68, 68, 0.1);\n }\n\n .mutation-inspector__op {\n font-size: 0.7rem;\n padding: 0.125rem 0.375rem;\n border-radius: 3px;\n background: #333;\n color: #888;\n }\n\n .mutation-inspector__frame {\n padding: 0.25rem 0;\n border-bottom: 1px solid #222;\n }\n\n .mutation-inspector__frame:last-child {\n border-bottom: none;\n }\n\n code {\n font-family: 'Fira Code', 'Monaco', monospace;\n }\n `}</style>\n </div>\n );\n}\n","import type { StateDiff } from './mutation';\n\n/**\n * Deep clones an object\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as unknown as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (obj instanceof Map) {\n const clonedMap = new Map();\n obj.forEach((value, key) => {\n clonedMap.set(deepClone(key), deepClone(value));\n });\n return clonedMap as unknown as T;\n }\n\n if (obj instanceof Set) {\n const clonedSet = new Set();\n obj.forEach(value => {\n clonedSet.add(deepClone(value));\n });\n return clonedSet as unknown as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n\n return cloned as T;\n}\n\n/**\n * Calculates the difference between two objects\n */\nexport function calculateDiff(before: unknown, after: unknown, path: string = ''): StateDiff[] {\n const diffs: StateDiff[] = [];\n\n // Handle primitives and null\n if (before === after) {\n return diffs;\n }\n\n if (before === null || before === undefined || typeof before !== 'object') {\n if (after === null || after === undefined || typeof after !== 'object') {\n // Both are primitives\n if (before !== after) {\n if (before === undefined) {\n diffs.push({ path: path || 'root', operation: 'ADD', newValue: after });\n } else if (after === undefined) {\n diffs.push({ path: path || 'root', operation: 'REMOVE', oldValue: before });\n } else {\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n }\n }\n return diffs;\n }\n // before is primitive, after is object\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n return diffs;\n }\n\n if (after === null || after === undefined || typeof after !== 'object') {\n // before is object, after is primitive\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n return diffs;\n }\n\n // Handle arrays\n if (Array.isArray(before) || Array.isArray(after)) {\n if (!Array.isArray(before) || !Array.isArray(after)) {\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n return diffs;\n }\n\n const maxLength = Math.max(before.length, after.length);\n for (let i = 0; i < maxLength; i++) {\n const itemPath = path ? `${path}[${i}]` : `[${i}]`;\n if (i >= before.length) {\n diffs.push({ path: itemPath, operation: 'ADD', newValue: after[i] });\n } else if (i >= after.length) {\n diffs.push({ path: itemPath, operation: 'REMOVE', oldValue: before[i] });\n } else {\n diffs.push(...calculateDiff(before[i], after[i], itemPath));\n }\n }\n return diffs;\n }\n\n // Handle objects\n const beforeObj = before as Record<string, unknown>;\n const afterObj = after as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(beforeObj), ...Object.keys(afterObj)]);\n\n for (const key of allKeys) {\n const keyPath = path ? `${path}.${key}` : key;\n const beforeValue = beforeObj[key];\n const afterValue = afterObj[key];\n\n if (!(key in beforeObj)) {\n diffs.push({ path: keyPath, operation: 'ADD', newValue: afterValue });\n } else if (!(key in afterObj)) {\n diffs.push({ path: keyPath, operation: 'REMOVE', oldValue: beforeValue });\n } else {\n diffs.push(...calculateDiff(beforeValue, afterValue, keyPath));\n }\n }\n\n return diffs;\n}\n\n/**\n * Applies a diff to a state object\n */\nexport function applyDiff<T>(state: T, diffs: StateDiff[]): T {\n const result = deepClone(state);\n\n for (const diff of diffs) {\n setValueAtPath(result, diff.path, diff.operation === 'REMOVE' ? undefined : diff.newValue);\n }\n\n return result;\n}\n\n/**\n * Gets a value at a path in an object\n */\nexport function getValueAtPath(obj: unknown, path: string): unknown {\n if (!path || path === 'root') return obj;\n\n const parts = parsePath(path);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Sets a value at a path in an object\n */\nexport function setValueAtPath(obj: unknown, path: string, value: unknown): void {\n if (!path || path === 'root') return;\n\n const parts = parsePath(path);\n let current = obj as Record<string, unknown>;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (current[part] === undefined) {\n // Create intermediate object or array based on next part\n const nextPart = parts[i + 1];\n current[part] = /^\\d+$/.test(nextPart) ? [] : {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (value === undefined) {\n delete current[lastPart];\n } else {\n current[lastPart] = value;\n }\n}\n\n/**\n * Parses a path string into parts\n */\nfunction parsePath(path: string): string[] {\n const parts: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '.' && !inBracket) {\n if (current) parts.push(current);\n current = '';\n } else if (char === '[') {\n if (current) parts.push(current);\n current = '';\n inBracket = true;\n } else if (char === ']') {\n if (current) parts.push(current);\n current = '';\n inBracket = false;\n } else {\n current += char;\n }\n }\n\n if (current) parts.push(current);\n return parts;\n}\n\n/**\n * Checks if two values are deeply equal\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n\n if (typeof a !== typeof b) return false;\n\n if (a === null || b === null) return a === b;\n\n if (typeof a !== 'object') return a === b;\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => deepEqual(item, b[index]));\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n return aKeys.every(key => deepEqual(aObj[key], bObj[key]));\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { calculateDiff } from '../../core/diff';\nimport type { StateDiff } from '../../core/mutation';\n\nexport interface StateDiffViewerProps {\n /** State before the mutation */\n previousState: unknown;\n\n /** State after the mutation */\n nextState: unknown;\n\n /** Pre-computed diff (optional) */\n diff?: StateDiff[];\n\n /** Maximum depth to expand by default */\n defaultExpandDepth?: number;\n\n /** Show side-by-side or unified view */\n viewMode?: 'split' | 'unified';\n\n /** Custom class name */\n className?: string;\n}\n\n// Anomaly types for detection\ntype AnomalyType = 'nan' | 'undefined' | 'null' | 'type-change' | 'empty-string' | 'negative' | null;\n\nfunction detectAnomaly(value: unknown): AnomalyType {\n if (typeof value === 'number' && isNaN(value)) return 'nan';\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (value === '') return 'empty-string';\n if (typeof value === 'number' && value < 0) return 'negative';\n return null;\n}\n\nfunction getAnomalyBadge(anomaly: AnomalyType): string {\n switch (anomaly) {\n case 'nan': return '⚠️ NaN';\n case 'undefined': return '⚠️ undefined';\n case 'null': return '⚡ null';\n case 'empty-string': return '📭 empty';\n case 'negative': return '➖ negative';\n default: return '';\n }\n}\n\n/**\n * Enhanced viewer for comparing before/after state with visual highlighting\n */\nexport function StateDiffViewer({\n previousState,\n nextState,\n diff: preDiff,\n defaultExpandDepth = 3,\n viewMode = 'split',\n className = '',\n}: StateDiffViewerProps) {\n const [activeTab, setActiveTab] = useState<'diff' | 'before' | 'after' | 'raw'>('diff');\n const [searchQuery, setSearchQuery] = useState('');\n const [copiedPath, setCopiedPath] = useState<string | null>(null);\n\n const diff = useMemo(\n () => preDiff || calculateDiff(previousState, nextState),\n [previousState, nextState, preDiff]\n );\n\n const changedPaths = useMemo(\n () => new Set(diff.map(d => d.path)),\n [diff]\n );\n\n // Group diffs by operation type\n const groupedDiffs = useMemo(() => {\n const adds = diff.filter(d => d.operation === 'ADD');\n const updates = diff.filter(d => d.operation === 'UPDATE');\n const removes = diff.filter(d => d.operation === 'REMOVE');\n return { adds, updates, removes };\n }, [diff]);\n\n // Detect anomalies\n const anomalies = useMemo(() => {\n const result: { path: string; type: AnomalyType; value: unknown }[] = [];\n\n for (const d of diff) {\n if (d.operation !== 'REMOVE') {\n const anomaly = detectAnomaly(d.newValue);\n if (anomaly) {\n result.push({ path: d.path, type: anomaly, value: d.newValue });\n }\n }\n }\n\n return result;\n }, [diff]);\n\n const copyToClipboard = useCallback((value: unknown, path: string) => {\n const text = typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value);\n navigator.clipboard.writeText(text);\n setCopiedPath(path);\n setTimeout(() => setCopiedPath(null), 2000);\n }, []);\n\n const copyFullState = useCallback((state: unknown, label: string) => {\n navigator.clipboard.writeText(JSON.stringify(state, null, 2));\n setCopiedPath(label);\n setTimeout(() => setCopiedPath(null), 2000);\n }, []);\n\n return (\n <div className={`state-diff-viewer-enhanced ${className}`}>\n {/* Header with tabs and actions */}\n <div className=\"sdv-header\">\n <div className=\"sdv-tabs\">\n <button\n className={`sdv-tab ${activeTab === 'diff' ? 'active' : ''}`}\n onClick={() => setActiveTab('diff')}\n >\n 📊 Changes ({diff.length})\n </button>\n <button\n className={`sdv-tab ${activeTab === 'before' ? 'active' : ''}`}\n onClick={() => setActiveTab('before')}\n >\n ⏪ Before\n </button>\n <button\n className={`sdv-tab ${activeTab === 'after' ? 'active' : ''}`}\n onClick={() => setActiveTab('after')}\n >\n ⏩ After\n </button>\n <button\n className={`sdv-tab ${activeTab === 'raw' ? 'active' : ''}`}\n onClick={() => setActiveTab('raw')}\n >\n 📝 Raw JSON\n </button>\n </div>\n\n <div className=\"sdv-actions\">\n <input\n type=\"text\"\n placeholder=\"🔍 Search paths...\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n className=\"sdv-search\"\n />\n </div>\n </div>\n\n {/* Anomaly alerts */}\n {anomalies.length > 0 && (\n <div className=\"sdv-anomalies\">\n <div className=\"sdv-anomaly-header\">\n <span className=\"sdv-anomaly-icon\">🚨</span>\n <span>Potential Issues Detected ({anomalies.length})</span>\n </div>\n <div className=\"sdv-anomaly-list\">\n {anomalies.map((a, i) => (\n <div key={i} className={`sdv-anomaly-item sdv-anomaly-${a.type}`}>\n <code>{a.path}</code>\n <span className=\"sdv-anomaly-badge\">{getAnomalyBadge(a.type)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Summary bar */}\n {activeTab === 'diff' && (\n <div className=\"sdv-summary\">\n <span className=\"sdv-summary-item sdv-add\">\n <span className=\"sdv-dot\"></span>\n {groupedDiffs.adds.length} added\n </span>\n <span className=\"sdv-summary-item sdv-update\">\n <span className=\"sdv-dot\"></span>\n {groupedDiffs.updates.length} changed\n </span>\n <span className=\"sdv-summary-item sdv-remove\">\n <span className=\"sdv-dot\"></span>\n {groupedDiffs.removes.length} removed\n </span>\n </div>\n )}\n\n {/* Content area */}\n <div className=\"sdv-content\">\n {activeTab === 'diff' && (\n <div className=\"sdv-diff-list\">\n {diff.length === 0 ? (\n <div className=\"sdv-empty\">No changes detected</div>\n ) : (\n diff\n .filter(d => !searchQuery || d.path.toLowerCase().includes(searchQuery.toLowerCase()))\n .map((change, index) => (\n <div\n key={index}\n className={`sdv-diff-item sdv-diff-${change.operation.toLowerCase()}`}\n >\n <div className=\"sdv-diff-header\">\n <span className=\"sdv-diff-op\">{change.operation}</span>\n <code className=\"sdv-diff-path\">{change.path}</code>\n <button\n className=\"sdv-copy-btn\"\n onClick={() => copyToClipboard(change.newValue ?? change.oldValue, change.path)}\n title=\"Copy value\"\n >\n {copiedPath === change.path ? '✓' : '📋'}\n </button>\n </div>\n <div className=\"sdv-diff-values\">\n {change.operation === 'UPDATE' && (\n <>\n <div className=\"sdv-value sdv-value-old\">\n <span className=\"sdv-value-label\">Before:</span>\n <ValueDisplay value={change.oldValue} />\n </div>\n <span className=\"sdv-arrow\">→</span>\n <div className=\"sdv-value sdv-value-new\">\n <span className=\"sdv-value-label\">After:</span>\n <ValueDisplay value={change.newValue} />\n </div>\n </>\n )}\n {change.operation === 'ADD' && (\n <div className=\"sdv-value sdv-value-new\">\n <ValueDisplay value={change.newValue} />\n </div>\n )}\n {change.operation === 'REMOVE' && (\n <div className=\"sdv-value sdv-value-old\">\n <ValueDisplay value={change.oldValue} />\n </div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n\n {activeTab === 'before' && (\n <div className=\"sdv-state-view\">\n <div className=\"sdv-state-actions\">\n <button\n onClick={() => copyFullState(previousState, 'before')}\n className=\"sdv-copy-full\"\n >\n {copiedPath === 'before' ? '✓ Copied!' : '📋 Copy State'}\n </button>\n </div>\n <StateTree\n value={previousState}\n path=\"\"\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n changeType=\"before\"\n />\n </div>\n )}\n\n {activeTab === 'after' && (\n <div className=\"sdv-state-view\">\n <div className=\"sdv-state-actions\">\n <button\n onClick={() => copyFullState(nextState, 'after')}\n className=\"sdv-copy-full\"\n >\n {copiedPath === 'after' ? '✓ Copied!' : '📋 Copy State'}\n </button>\n </div>\n <StateTree\n value={nextState}\n path=\"\"\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n changeType=\"after\"\n />\n </div>\n )}\n\n {activeTab === 'raw' && (\n <div className=\"sdv-raw-view\">\n <div className=\"sdv-raw-panels\">\n <div className=\"sdv-raw-panel\">\n <h4>Before</h4>\n <pre>{JSON.stringify(previousState, null, 2)}</pre>\n </div>\n <div className=\"sdv-raw-panel\">\n <h4>After</h4>\n <pre>{JSON.stringify(nextState, null, 2)}</pre>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <style>{`\n .state-diff-viewer-enhanced {\n background: #1a1a2e;\n border-radius: 12px;\n overflow: hidden;\n font-family: system-ui, sans-serif;\n color: #e0e0e0;\n }\n\n .sdv-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 1rem;\n background: #16213e;\n border-bottom: 1px solid #333;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .sdv-tabs {\n display: flex;\n gap: 0.25rem;\n }\n\n .sdv-tab {\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: #888;\n cursor: pointer;\n border-radius: 6px;\n font-size: 0.875rem;\n transition: all 0.2s;\n }\n\n .sdv-tab:hover {\n background: #1f2b4d;\n color: #ccc;\n }\n\n .sdv-tab.active {\n background: #00d9ff20;\n color: #00d9ff;\n }\n\n .sdv-search {\n padding: 0.5rem 1rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: #0f0f23;\n color: #e0e0e0;\n font-size: 0.875rem;\n width: 200px;\n }\n\n .sdv-anomalies {\n margin: 1rem;\n padding: 1rem;\n background: #ef444420;\n border: 1px solid #ef4444;\n border-radius: 8px;\n }\n\n .sdv-anomaly-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n color: #fca5a5;\n }\n\n .sdv-anomaly-icon {\n font-size: 1.25rem;\n }\n\n .sdv-anomaly-list {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .sdv-anomaly-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n background: #0f0f23;\n border-radius: 4px;\n font-size: 0.875rem;\n }\n\n .sdv-anomaly-item code {\n color: #f472b6;\n }\n\n .sdv-anomaly-badge {\n font-size: 0.75rem;\n padding: 0.125rem 0.375rem;\n background: #ef444440;\n border-radius: 3px;\n }\n\n .sdv-summary {\n display: flex;\n gap: 1.5rem;\n padding: 0.75rem 1rem;\n background: #0f0f23;\n border-bottom: 1px solid #333;\n }\n\n .sdv-summary-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n }\n\n .sdv-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n\n .sdv-add .sdv-dot { background: #22c55e; }\n .sdv-update .sdv-dot { background: #fbbf24; }\n .sdv-remove .sdv-dot { background: #ef4444; }\n\n .sdv-content {\n max-height: 500px;\n overflow: auto;\n }\n\n .sdv-empty {\n padding: 2rem;\n text-align: center;\n color: #666;\n }\n\n .sdv-diff-list {\n padding: 1rem;\n }\n\n .sdv-diff-item {\n margin-bottom: 0.75rem;\n padding: 1rem;\n background: #16213e;\n border-radius: 8px;\n border-left: 4px solid;\n }\n\n .sdv-diff-add { border-left-color: #22c55e; }\n .sdv-diff-update { border-left-color: #fbbf24; }\n .sdv-diff-remove { border-left-color: #ef4444; }\n\n .sdv-diff-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n }\n\n .sdv-diff-op {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n text-transform: uppercase;\n }\n\n .sdv-diff-add .sdv-diff-op { background: #22c55e30; color: #22c55e; }\n .sdv-diff-update .sdv-diff-op { background: #fbbf2430; color: #fbbf24; }\n .sdv-diff-remove .sdv-diff-op { background: #ef444430; color: #ef4444; }\n\n .sdv-diff-path {\n flex: 1;\n font-family: 'Fira Code', monospace;\n color: #a78bfa;\n }\n\n .sdv-copy-btn {\n padding: 0.25rem 0.5rem;\n border: none;\n background: transparent;\n color: #888;\n cursor: pointer;\n border-radius: 4px;\n font-size: 0.875rem;\n }\n\n .sdv-copy-btn:hover {\n background: #333;\n color: #fff;\n }\n\n .sdv-diff-values {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex-wrap: wrap;\n }\n\n .sdv-value {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n font-family: 'Fira Code', monospace;\n font-size: 0.875rem;\n max-width: 300px;\n overflow: auto;\n }\n\n .sdv-value-label {\n display: block;\n font-size: 0.7rem;\n color: #666;\n margin-bottom: 0.25rem;\n font-family: system-ui;\n }\n\n .sdv-value-old {\n background: #ef444420;\n color: #fca5a5;\n }\n\n .sdv-value-new {\n background: #22c55e20;\n color: #86efac;\n }\n\n .sdv-arrow {\n color: #666;\n font-size: 1.25rem;\n }\n\n .sdv-state-view {\n padding: 1rem;\n }\n\n .sdv-state-actions {\n margin-bottom: 1rem;\n }\n\n .sdv-copy-full {\n padding: 0.5rem 1rem;\n border: 1px solid #333;\n background: #16213e;\n color: #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.875rem;\n }\n\n .sdv-copy-full:hover {\n background: #1f2b4d;\n }\n\n .sdv-raw-view {\n padding: 1rem;\n }\n\n .sdv-raw-panels {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n\n .sdv-raw-panel {\n background: #0f0f23;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .sdv-raw-panel h4 {\n margin: 0;\n padding: 0.75rem 1rem;\n background: #16213e;\n color: #00d9ff;\n font-size: 0.875rem;\n }\n\n .sdv-raw-panel pre {\n margin: 0;\n padding: 1rem;\n font-size: 0.8rem;\n overflow: auto;\n max-height: 300px;\n }\n\n /* State tree styles */\n .state-tree__toggle {\n cursor: pointer;\n color: #888;\n user-select: none;\n }\n\n .state-tree__toggle:hover {\n color: #00d9ff;\n }\n\n .state-tree__children {\n margin-left: 1.5rem;\n border-left: 1px solid #333;\n padding-left: 0.75rem;\n }\n\n .state-tree__item {\n padding: 0.25rem 0;\n }\n\n .state-tree__key {\n color: #a78bfa;\n margin-right: 0.5rem;\n }\n\n .state-tree__null { color: #f472b6; font-style: italic; }\n .state-tree__undefined { color: #ef4444; font-style: italic; }\n .state-tree__boolean { color: #fb923c; }\n .state-tree__number { color: #22c55e; }\n .state-tree__string { color: #fbbf24; }\n .state-tree__empty { color: #666; }\n .state-tree--changed {\n background: #fbbf2430;\n padding: 0 0.25rem;\n border-radius: 3px;\n }\n\n .state-tree__anomaly {\n display: inline-block;\n margin-left: 0.5rem;\n padding: 0.125rem 0.375rem;\n background: #ef444440;\n border-radius: 3px;\n font-size: 0.7rem;\n color: #fca5a5;\n }\n `}</style>\n </div>\n );\n}\n\n// Value display component with type-based styling\nfunction ValueDisplay({ value }: { value: unknown }) {\n const anomaly = detectAnomaly(value);\n\n if (value === null) {\n return <span className=\"state-tree__null\">null</span>;\n }\n if (value === undefined) {\n return (\n <span className=\"state-tree__undefined\">\n undefined\n <span className=\"state-tree__anomaly\">⚠️</span>\n </span>\n );\n }\n if (typeof value === 'boolean') {\n return <span className=\"state-tree__boolean\">{String(value)}</span>;\n }\n if (typeof value === 'number') {\n if (isNaN(value)) {\n return (\n <span className=\"state-tree__undefined\">\n NaN\n <span className=\"state-tree__anomaly\">⚠️ Bug!</span>\n </span>\n );\n }\n return <span className=\"state-tree__number\">{String(value)}</span>;\n }\n if (typeof value === 'string') {\n if (value === '') {\n return <span className=\"state-tree__empty\">\"\"</span>;\n }\n const display = value.length > 50 ? value.slice(0, 50) + '...' : value;\n return <span className=\"state-tree__string\">\"{display}\"</span>;\n }\n if (Array.isArray(value)) {\n return <span className=\"state-tree__empty\">[{value.length} items]</span>;\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n return <span className=\"state-tree__empty\">{'{' + keys.length + ' keys}'}</span>;\n }\n return <span>{String(value)}</span>;\n}\n\ninterface StateTreeProps {\n value: unknown;\n path: string;\n changedPaths: Set<string>;\n defaultExpandDepth: number;\n depth?: number;\n changeType: 'before' | 'after';\n}\n\nfunction StateTree({\n value,\n path,\n changedPaths,\n defaultExpandDepth,\n depth = 0,\n changeType,\n}: StateTreeProps) {\n const [isExpanded, setIsExpanded] = useState(depth < defaultExpandDepth);\n const isChanged = path ? changedPaths.has(path) : false;\n const anomaly = detectAnomaly(value);\n\n const toggle = useCallback(() => setIsExpanded(e => !e), []);\n\n if (value === null) {\n return <span className=\"state-tree__null\">null</span>;\n }\n\n if (value === undefined) {\n return (\n <span className=\"state-tree__undefined\">\n undefined\n <span className=\"state-tree__anomaly\">⚠️</span>\n </span>\n );\n }\n\n if (typeof value === 'boolean') {\n return <span className=\"state-tree__boolean\">{String(value)}</span>;\n }\n\n if (typeof value === 'number') {\n if (isNaN(value)) {\n return (\n <span className={`state-tree__undefined ${isChanged ? 'state-tree--changed' : ''}`}>\n NaN\n <span className=\"state-tree__anomaly\">⚠️ BUG!</span>\n </span>\n );\n }\n return (\n <span className={`state-tree__number ${isChanged ? 'state-tree--changed' : ''}`}>\n {String(value)}\n </span>\n );\n }\n\n if (typeof value === 'string') {\n return (\n <span className={`state-tree__string ${isChanged ? 'state-tree--changed' : ''}`}>\n \"{value}\"\n {value === '' && <span className=\"state-tree__anomaly\">empty</span>}\n </span>\n );\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return <span className=\"state-tree__empty\">[]</span>;\n }\n\n return (\n <span className=\"state-tree__array\">\n <span className=\"state-tree__toggle\" onClick={toggle}>\n {isExpanded ? '▼' : '▶'} Array({value.length})\n </span>\n {isExpanded && (\n <div className=\"state-tree__children\">\n {value.map((item, index) => (\n <div key={index} className=\"state-tree__item\">\n <span className=\"state-tree__key\">{index}:</span>\n <StateTree\n value={item}\n path={path ? `${path}[${index}]` : `[${index}]`}\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n depth={depth + 1}\n changeType={changeType}\n />\n </div>\n ))}\n </div>\n )}\n </span>\n );\n }\n\n if (typeof value === 'object') {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n return <span className=\"state-tree__empty\">{'{}'}</span>;\n }\n\n return (\n <span className=\"state-tree__object\">\n <span className=\"state-tree__toggle\" onClick={toggle}>\n {isExpanded ? '▼' : '▶'} Object({entries.length})\n </span>\n {isExpanded && (\n <div className=\"state-tree__children\">\n {entries.map(([key, val]) => {\n const childPath = path ? `${path}.${key}` : key;\n const childChanged = changedPaths.has(childPath);\n return (\n <div key={key} className=\"state-tree__item\">\n <span className={`state-tree__key ${childChanged ? 'state-tree--changed' : ''}`}>\n {key}:\n </span>\n <StateTree\n value={val}\n path={childPath}\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n depth={depth + 1}\n changeType={changeType}\n />\n </div>\n );\n })}\n </div>\n )}\n </span>\n );\n }\n\n return <span>{String(value)}</span>;\n}\n","import React, { useCallback, useMemo, useState } from 'react';\nimport type { Mutation, MutationSource } from '../../core/mutation';\n\nexport interface TimelineScrubberProps {\n /** Array of mutations in the timeline */\n mutations: Mutation[];\n\n /** Currently selected mutation index */\n selectedIndex: number;\n\n /** Callback when a mutation is selected */\n onSelect: (index: number, mutation: Mutation) => void;\n\n /** Whether playback is active */\n isPlaying?: boolean;\n\n /** Callback for play button */\n onPlay?: () => void;\n\n /** Callback for pause button */\n onPause?: () => void;\n\n /** Callback for step forward */\n onStepForward?: () => void;\n\n /** Callback for step backward */\n onStepBackward?: () => void;\n\n /** Playback speed */\n playbackSpeed?: number;\n\n /** Callback for speed change */\n onSpeedChange?: (speed: number) => void;\n\n /** Custom class name */\n className?: string;\n}\n\n// Color mapping for different sources\nconst sourceColors: Record<MutationSource, string> = {\n react: '#61dafb',\n redux: '#764abc',\n zustand: '#f59e0b',\n express: '#68a063',\n websocket: '#8b5cf6',\n api: '#3b82f6',\n custom: '#6b7280',\n};\n\nconst sourceEmojis: Record<MutationSource, string> = {\n react: '⚛️',\n redux: '🔄',\n zustand: '🐻',\n express: '🚂',\n websocket: '🔌',\n api: '🌐',\n custom: '⚙️',\n};\n\n/**\n * Enhanced timeline scrubber with visual chart and mutation preview\n */\nexport function TimelineScrubber({\n mutations,\n selectedIndex,\n onSelect,\n isPlaying = false,\n onPlay,\n onPause,\n onStepForward,\n onStepBackward,\n playbackSpeed = 1,\n onSpeedChange,\n className = '',\n}: TimelineScrubberProps) {\n const [filter, setFilter] = useState<MutationSource | 'all'>('all');\n const [hoverIndex, setHoverIndex] = useState<number | null>(null);\n\n const handleSliderChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const index = parseInt(e.target.value, 10);\n if (mutations[index]) {\n onSelect(index, mutations[index]);\n }\n },\n [mutations, onSelect]\n );\n\n const handleMarkerClick = useCallback(\n (index: number) => {\n if (mutations[index]) {\n onSelect(index, mutations[index]);\n }\n },\n [mutations, onSelect]\n );\n\n // Group mutations by source for the chart\n const sourceStats = useMemo(() => {\n const stats: Record<string, number> = {};\n for (const m of mutations) {\n stats[m.source] = (stats[m.source] || 0) + 1;\n }\n return stats;\n }, [mutations]);\n\n // Filter mutations for display\n const filteredMutations = useMemo(() => {\n if (filter === 'all') return mutations;\n return mutations.filter(m => m.source === filter);\n }, [mutations, filter]);\n\n // Detect anomalies in timeline\n const anomalyCount = useMemo(() => {\n let count = 0;\n for (const m of mutations) {\n if (m.diff) {\n for (const d of m.diff) {\n if (d.newValue === undefined ||\n (typeof d.newValue === 'number' && isNaN(d.newValue))) {\n count++;\n break;\n }\n }\n }\n }\n return count;\n }, [mutations]);\n\n const formatTime = (timestamp: number) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n const formatDuration = (ms?: number) => {\n if (!ms) return '';\n if (ms < 1) return `${(ms * 1000).toFixed(0)}μs`;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n };\n\n if (mutations.length === 0) {\n return (\n <div className={`timeline-scrubber timeline-scrubber--empty ${className}`}>\n <div className=\"ts-empty-state\">\n <span className=\"ts-empty-icon\">📭</span>\n <h3>No Mutations Yet</h3>\n <p>Start interacting with your app to capture state changes</p>\n </div>\n </div>\n );\n }\n\n const selectedMutation = mutations[selectedIndex];\n const previewMutation = hoverIndex !== null ? mutations[hoverIndex] : selectedMutation;\n\n return (\n <div className={`timeline-scrubber ${className}`}>\n {/* Stats bar */}\n <div className=\"ts-stats\">\n <div className=\"ts-stat-main\">\n <span className=\"ts-stat-value\">{mutations.length}</span>\n <span className=\"ts-stat-label\">mutations</span>\n </div>\n\n <div className=\"ts-stat-sources\">\n {Object.entries(sourceStats).map(([source, count]) => (\n <button\n key={source}\n className={`ts-source-badge ${filter === source ? 'active' : ''}`}\n style={{ '--source-color': sourceColors[source as MutationSource] } as React.CSSProperties}\n onClick={() => setFilter(filter === source ? 'all' : source as MutationSource)}\n title={`${source}: ${count} mutations`}\n >\n <span className=\"ts-source-emoji\">{sourceEmojis[source as MutationSource]}</span>\n <span className=\"ts-source-count\">{count}</span>\n </button>\n ))}\n </div>\n\n {anomalyCount > 0 && (\n <div className=\"ts-anomaly-badge\">\n ⚠️ {anomalyCount} issue{anomalyCount > 1 ? 's' : ''}\n </div>\n )}\n\n <div className=\"ts-position\">\n <span className=\"ts-current\">{selectedIndex + 1}</span>\n <span className=\"ts-separator\">/</span>\n <span className=\"ts-total\">{mutations.length}</span>\n </div>\n </div>\n\n {/* Visual timeline chart */}\n <div className=\"ts-chart\">\n <div className=\"ts-chart-track\">\n {mutations.map((mutation, index) => {\n const isSelected = index === selectedIndex;\n const isHovered = index === hoverIndex;\n const hasAnomaly = mutation.diff?.some(d =>\n d.newValue === undefined ||\n (typeof d.newValue === 'number' && isNaN(d.newValue))\n );\n\n return (\n <div\n key={mutation.id}\n className={`ts-marker ${isSelected ? 'selected' : ''} ${isHovered ? 'hovered' : ''} ${hasAnomaly ? 'anomaly' : ''}`}\n style={{\n left: `${(index / Math.max(mutations.length - 1, 1)) * 100}%`,\n backgroundColor: sourceColors[mutation.source] || sourceColors.custom,\n }}\n onClick={() => handleMarkerClick(index)}\n onMouseEnter={() => setHoverIndex(index)}\n onMouseLeave={() => setHoverIndex(null)}\n />\n );\n })}\n\n {/* Progress indicator */}\n <div\n className=\"ts-progress\"\n style={{\n width: `${(selectedIndex / Math.max(mutations.length - 1, 1)) * 100}%`\n }}\n />\n\n {/* Current position indicator */}\n <div\n className=\"ts-cursor\"\n style={{\n left: `${(selectedIndex / Math.max(mutations.length - 1, 1)) * 100}%`\n }}\n />\n </div>\n </div>\n\n {/* Slider input */}\n <input\n type=\"range\"\n min={0}\n max={mutations.length - 1}\n value={selectedIndex}\n onChange={handleSliderChange}\n className=\"ts-slider\"\n />\n\n {/* Preview card */}\n {previewMutation && (\n <div className=\"ts-preview\">\n <div className=\"ts-preview-header\">\n <span\n className=\"ts-preview-source\"\n style={{ backgroundColor: sourceColors[previewMutation.source] }}\n >\n {sourceEmojis[previewMutation.source]} {previewMutation.source}\n </span>\n <span className=\"ts-preview-action\">{previewMutation.actionType}</span>\n {previewMutation.duration && (\n <span className=\"ts-preview-duration\">{formatDuration(previewMutation.duration)}</span>\n )}\n </div>\n <div className=\"ts-preview-details\">\n {previewMutation.component && (\n <span className=\"ts-preview-component\">{previewMutation.component}</span>\n )}\n <span className=\"ts-preview-time\">{formatTime(previewMutation.timestamp)}</span>\n </div>\n {previewMutation.diff && previewMutation.diff.length > 0 && (\n <div className=\"ts-preview-changes\">\n {previewMutation.diff.slice(0, 3).map((d, i) => (\n <code key={i} className={`ts-preview-path ts-preview-${d.operation.toLowerCase()}`}>\n {d.path}\n </code>\n ))}\n {previewMutation.diff.length > 3 && (\n <span className=\"ts-preview-more\">+{previewMutation.diff.length - 3} more</span>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Playback controls */}\n <div className=\"ts-controls\">\n <div className=\"ts-control-group\">\n <button\n onClick={onStepBackward}\n disabled={selectedIndex === 0}\n className=\"ts-btn\"\n title=\"Previous mutation (←)\"\n >\n ⏮️\n </button>\n\n {isPlaying ? (\n <button onClick={onPause} className=\"ts-btn ts-btn-primary\" title=\"Pause\">\n ⏸️\n </button>\n ) : (\n <button\n onClick={onPlay}\n disabled={selectedIndex === mutations.length - 1}\n className=\"ts-btn ts-btn-primary\"\n title=\"Play through timeline\"\n >\n ▶️\n </button>\n )}\n\n <button\n onClick={onStepForward}\n disabled={selectedIndex === mutations.length - 1}\n className=\"ts-btn\"\n title=\"Next mutation (→)\"\n >\n ⏭️\n </button>\n </div>\n\n <div className=\"ts-control-group\">\n <label className=\"ts-speed-label\">Speed:</label>\n <select\n value={playbackSpeed}\n onChange={e => onSpeedChange?.(Number(e.target.value))}\n className=\"ts-speed-select\"\n >\n <option value={0.5}>0.5x</option>\n <option value={1}>1x</option>\n <option value={2}>2x</option>\n <option value={4}>4x</option>\n </select>\n </div>\n\n <div className=\"ts-control-group\">\n <button\n className=\"ts-btn ts-btn-text\"\n onClick={() => onSelect(0, mutations[0])}\n disabled={selectedIndex === 0}\n >\n ⏪ Start\n </button>\n <button\n className=\"ts-btn ts-btn-text\"\n onClick={() => onSelect(mutations.length - 1, mutations[mutations.length - 1])}\n disabled={selectedIndex === mutations.length - 1}\n >\n End ⏩\n </button>\n </div>\n </div>\n\n <style>{`\n .timeline-scrubber {\n background: #1a1a2e;\n border-radius: 12px;\n padding: 1.25rem;\n color: #fff;\n }\n\n .timeline-scrubber--empty {\n padding: 3rem;\n }\n\n .ts-empty-state {\n text-align: center;\n }\n\n .ts-empty-icon {\n font-size: 3rem;\n display: block;\n margin-bottom: 1rem;\n }\n\n .ts-empty-state h3 {\n margin: 0 0 0.5rem;\n color: #888;\n }\n\n .ts-empty-state p {\n margin: 0;\n color: #666;\n font-size: 0.875rem;\n }\n\n .ts-stats {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin-bottom: 1rem;\n flex-wrap: wrap;\n }\n\n .ts-stat-main {\n display: flex;\n align-items: baseline;\n gap: 0.5rem;\n }\n\n .ts-stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: #00d9ff;\n }\n\n .ts-stat-label {\n font-size: 0.875rem;\n color: #888;\n }\n\n .ts-stat-sources {\n display: flex;\n gap: 0.5rem;\n }\n\n .ts-source-badge {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.625rem;\n border: 1px solid transparent;\n border-radius: 20px;\n background: var(--source-color, #666)20;\n color: var(--source-color, #888);\n cursor: pointer;\n font-size: 0.75rem;\n transition: all 0.2s;\n }\n\n .ts-source-badge:hover, .ts-source-badge.active {\n background: var(--source-color, #666)40;\n border-color: var(--source-color, #666);\n }\n\n .ts-source-emoji {\n font-size: 0.875rem;\n }\n\n .ts-anomaly-badge {\n padding: 0.375rem 0.75rem;\n background: #ef444430;\n color: #fca5a5;\n border-radius: 20px;\n font-size: 0.75rem;\n font-weight: 600;\n }\n\n .ts-position {\n margin-left: auto;\n font-family: 'Fira Code', monospace;\n font-size: 0.875rem;\n }\n\n .ts-current {\n color: #00d9ff;\n font-weight: 600;\n }\n\n .ts-separator {\n color: #444;\n margin: 0 0.25rem;\n }\n\n .ts-total {\n color: #666;\n }\n\n .ts-chart {\n margin-bottom: 0.5rem;\n }\n\n .ts-chart-track {\n position: relative;\n height: 32px;\n background: #16213e;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .ts-progress {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: linear-gradient(90deg, #00d9ff20, #00d9ff10);\n pointer-events: none;\n }\n\n .ts-cursor {\n position: absolute;\n top: 0;\n width: 3px;\n height: 100%;\n background: #00d9ff;\n border-radius: 1.5px;\n pointer-events: none;\n box-shadow: 0 0 10px #00d9ff80;\n }\n\n .ts-marker {\n position: absolute;\n width: 6px;\n height: 16px;\n top: 8px;\n margin-left: -3px;\n border-radius: 3px;\n cursor: pointer;\n opacity: 0.6;\n transition: all 0.15s;\n }\n\n .ts-marker:hover, .ts-marker.hovered {\n opacity: 1;\n transform: scaleY(1.3);\n }\n\n .ts-marker.selected {\n opacity: 1;\n box-shadow: 0 0 8px currentColor;\n transform: scaleY(1.4);\n }\n\n .ts-marker.anomaly {\n border: 2px solid #ef4444;\n }\n\n .ts-slider {\n width: 100%;\n height: 4px;\n margin: 0.5rem 0;\n cursor: pointer;\n -webkit-appearance: none;\n background: transparent;\n }\n\n .ts-slider::-webkit-slider-runnable-track {\n height: 4px;\n background: #333;\n border-radius: 2px;\n }\n\n .ts-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 16px;\n height: 16px;\n margin-top: -6px;\n background: #00d9ff;\n border-radius: 50%;\n cursor: pointer;\n }\n\n .ts-preview {\n margin: 1rem 0;\n padding: 1rem;\n background: #16213e;\n border-radius: 8px;\n border-left: 3px solid #00d9ff;\n }\n\n .ts-preview-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.5rem;\n }\n\n .ts-preview-source {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 600;\n color: #000;\n }\n\n .ts-preview-action {\n font-weight: 600;\n color: #e0e0e0;\n }\n\n .ts-preview-duration {\n margin-left: auto;\n font-size: 0.75rem;\n color: #888;\n font-family: 'Fira Code', monospace;\n }\n\n .ts-preview-details {\n display: flex;\n gap: 1rem;\n font-size: 0.875rem;\n color: #888;\n }\n\n .ts-preview-component {\n color: #a78bfa;\n }\n\n .ts-preview-changes {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 0.75rem;\n }\n\n .ts-preview-path {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n }\n\n .ts-preview-add { background: #22c55e20; color: #86efac; }\n .ts-preview-update { background: #fbbf2420; color: #fcd34d; }\n .ts-preview-remove { background: #ef444420; color: #fca5a5; }\n\n .ts-preview-more {\n font-size: 0.75rem;\n color: #666;\n padding: 0.25rem;\n }\n\n .ts-controls {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 1.5rem;\n padding-top: 0.5rem;\n flex-wrap: wrap;\n }\n\n .ts-control-group {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .ts-btn {\n padding: 0.5rem 0.75rem;\n border: none;\n border-radius: 8px;\n background: #16213e;\n color: #fff;\n cursor: pointer;\n font-size: 1rem;\n transition: all 0.2s;\n }\n\n .ts-btn:hover:not(:disabled) {\n background: #1f2b4d;\n }\n\n .ts-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .ts-btn-primary {\n background: #00d9ff;\n color: #000;\n }\n\n .ts-btn-primary:hover:not(:disabled) {\n background: #00b8e6;\n }\n\n .ts-btn-text {\n background: transparent;\n color: #888;\n font-size: 0.875rem;\n }\n\n .ts-btn-text:hover:not(:disabled) {\n color: #fff;\n background: transparent;\n }\n\n .ts-speed-label {\n font-size: 0.875rem;\n color: #888;\n }\n\n .ts-speed-select {\n padding: 0.375rem 0.5rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: #16213e;\n color: #e0e0e0;\n font-size: 0.875rem;\n cursor: pointer;\n }\n `}</style>\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type { Mutation } from '../core/mutation';\n\n/**\n * Dashboard context for sharing state\n */\ninterface DashboardState {\n serverUrl: string;\n sessions: Session[];\n currentSession: Session | null;\n timeline: Mutation[];\n selectedMutation: Mutation | null;\n isLoading: boolean;\n error: string | null;\n}\n\ninterface Session {\n id: string;\n appId: string;\n startTime: string;\n endTime?: string;\n mutationCount: number;\n}\n\ninterface DashboardActions {\n loadSessions: () => Promise<void>;\n selectSession: (sessionId: string) => Promise<void>;\n selectMutation: (mutation: Mutation | null) => void;\n refreshTimeline: () => Promise<void>;\n}\n\ntype DashboardContextValue = DashboardState & DashboardActions;\n\nconst DashboardContext = React.createContext<DashboardContextValue | null>(null);\n\n/**\n * Dashboard provider component\n */\nexport function DashboardProvider({\n serverUrl = 'http://localhost:8080',\n children,\n}: {\n serverUrl?: string;\n children: React.ReactNode;\n}) {\n const [state, setState] = useState<DashboardState>({\n serverUrl,\n sessions: [],\n currentSession: null,\n timeline: [],\n selectedMutation: null,\n isLoading: false,\n error: null,\n });\n\n const loadSessions = async () => {\n setState(s => ({ ...s, isLoading: true, error: null }));\n try {\n const res = await fetch(`${serverUrl}/api/sessions`);\n const data = await res.json();\n setState(s => ({ ...s, sessions: data.sessions, isLoading: false }));\n } catch (error) {\n setState(s => ({ ...s, error: String(error), isLoading: false }));\n }\n };\n\n const selectSession = async (sessionId: string) => {\n const session = state.sessions.find(s => s.id === sessionId);\n if (!session) return;\n\n setState(s => ({ ...s, currentSession: session, isLoading: true }));\n\n try {\n const res = await fetch(`${serverUrl}/api/sessions/${sessionId}/timeline`);\n const data = await res.json();\n setState(s => ({\n ...s,\n timeline: data.timeline,\n selectedMutation: data.timeline[0] || null,\n isLoading: false\n }));\n } catch (error) {\n setState(s => ({ ...s, error: String(error), isLoading: false }));\n }\n };\n\n const selectMutation = (mutation: Mutation | null) => {\n setState(s => ({ ...s, selectedMutation: mutation }));\n };\n\n const refreshTimeline = async () => {\n if (!state.currentSession) return;\n await selectSession(state.currentSession.id);\n };\n\n useEffect(() => {\n loadSessions();\n }, [serverUrl]);\n\n const value: DashboardContextValue = {\n ...state,\n loadSessions,\n selectSession,\n selectMutation,\n refreshTimeline,\n };\n\n return (\n <DashboardContext.Provider value={value}>\n {children}\n </DashboardContext.Provider>\n );\n}\n\n/**\n * Hook to access dashboard state and actions\n */\nexport function useDashboard(): DashboardContextValue {\n const context = React.useContext(DashboardContext);\n if (!context) {\n throw new Error('useDashboard must be used within a DashboardProvider');\n }\n return context;\n}\n\n/**\n * Hook for timeline playback\n */\nexport function usePlayback(timeline: Mutation[]) {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isPlaying, setIsPlaying] = useState(false);\n const [playbackSpeed, setPlaybackSpeed] = useState(1);\n\n useEffect(() => {\n if (!isPlaying || timeline.length === 0) return;\n\n const interval = setInterval(() => {\n setCurrentIndex(i => {\n if (i >= timeline.length - 1) {\n setIsPlaying(false);\n return i;\n }\n return i + 1;\n });\n }, 500 / playbackSpeed);\n\n return () => clearInterval(interval);\n }, [isPlaying, timeline.length, playbackSpeed]);\n\n return {\n currentIndex,\n currentMutation: timeline[currentIndex] || null,\n isPlaying,\n play: () => setIsPlaying(true),\n pause: () => setIsPlaying(false),\n stepForward: () => setCurrentIndex(i => Math.min(i + 1, timeline.length - 1)),\n stepBackward: () => setCurrentIndex(i => Math.max(i - 1, 0)),\n goTo: (index: number) => setCurrentIndex(Math.max(0, Math.min(index, timeline.length - 1))),\n setSpeed: setPlaybackSpeed,\n playbackSpeed,\n };\n}\n\n/**\n * Hook for fetching mutation details\n */\nexport function useMutationDetails(mutationId: string | null, serverUrl: string) {\n const [state, setState] = useState<{\n previousState: unknown;\n nextState: unknown;\n isLoading: boolean;\n error: string | null;\n }>({\n previousState: null,\n nextState: null,\n isLoading: false,\n error: null,\n });\n\n useEffect(() => {\n if (!mutationId) return;\n\n setState(s => ({ ...s, isLoading: true }));\n\n fetch(`${serverUrl}/api/mutations/${mutationId}`)\n .then(res => res.json())\n .then(data => {\n setState({\n previousState: data.mutation.previousState,\n nextState: data.mutation.nextState,\n isLoading: false,\n error: null,\n });\n })\n .catch(error => {\n setState(s => ({ ...s, error: String(error), isLoading: false }));\n });\n }, [mutationId, serverUrl]);\n\n return state;\n}\n","import { useEffect, useState } from 'react';\nimport { MutationInspector } from './components/MutationInspector';\nimport { StateDiffViewer } from './components/StateDiffViewer';\nimport { TimelineScrubber } from './components/TimelineScrubber';\nimport { DashboardProvider, useDashboard, usePlayback } from './hooks/useDashboard';\n\nexport interface DashboardProps {\n /** Server URL (default: http://localhost:8080) */\n serverUrl?: string;\n}\n\n/**\n * Main State Surgeon Dashboard component\n */\nexport function StateSurgeonDashboard({ serverUrl = 'http://localhost:8080' }: DashboardProps) {\n return (\n <DashboardProvider serverUrl={serverUrl}>\n <DashboardContent />\n </DashboardProvider>\n );\n}\n\nfunction DashboardContent() {\n const {\n sessions,\n currentSession,\n timeline,\n selectedMutation,\n isLoading,\n error,\n selectSession,\n selectMutation,\n loadSessions,\n } = useDashboard();\n\n const playback = usePlayback(timeline);\n const [activePanel, setActivePanel] = useState<'diff' | 'inspector'>('diff');\n const [autoRefresh, setAutoRefresh] = useState(true);\n\n // Sync playback with selected mutation\n useEffect(() => {\n if (playback.currentMutation) {\n selectMutation(playback.currentMutation);\n }\n }, [playback.currentMutation, selectMutation]);\n\n // Auto refresh sessions\n useEffect(() => {\n if (!autoRefresh) return;\n const interval = setInterval(loadSessions, 5000);\n return () => clearInterval(interval);\n }, [autoRefresh, loadSessions]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement) return;\n\n switch (e.key) {\n case 'ArrowLeft':\n playback.stepBackward();\n break;\n case 'ArrowRight':\n playback.stepForward();\n break;\n case ' ':\n e.preventDefault();\n playback.isPlaying ? playback.pause() : playback.play();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [playback]);\n\n return (\n <div className=\"surgeon-dashboard\">\n <header className=\"sd-header\">\n <div className=\"sd-header-left\">\n <h1 className=\"sd-logo\">\n <span className=\"sd-logo-icon\">🔬</span>\n <span className=\"sd-logo-text\">State Surgeon</span>\n <span className=\"sd-version\">v1.1.0</span>\n </h1>\n </div>\n\n <div className=\"sd-header-center\">\n <select\n value={currentSession?.id || ''}\n onChange={(e) => selectSession(e.target.value)}\n disabled={isLoading}\n className=\"sd-session-select\"\n >\n <option value=\"\">Select a session...</option>\n {sessions.map((session) => (\n <option key={session.id} value={session.id}>\n {session.appId} • {session.id.slice(0, 8)}... • {session.mutationCount} mutations\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"sd-header-right\">\n <label className=\"sd-auto-refresh\">\n <input\n type=\"checkbox\"\n checked={autoRefresh}\n onChange={e => setAutoRefresh(e.target.checked)}\n />\n Auto-refresh\n </label>\n <button onClick={loadSessions} disabled={isLoading} className=\"sd-refresh-btn\">\n {isLoading ? '⏳' : '🔄'}\n </button>\n </div>\n </header>\n\n {error && (\n <div className=\"sd-error\">\n <span className=\"sd-error-icon\">❌</span>\n <p>{error}</p>\n </div>\n )}\n\n {!currentSession && !isLoading && (\n <div className=\"sd-welcome\">\n <div className=\"sd-welcome-content\">\n <div className=\"sd-welcome-icon\">🔬</div>\n <h2>Welcome to State Surgeon</h2>\n <p>A forensic debugging platform for JavaScript applications</p>\n\n {sessions.length === 0 ? (\n <div className=\"sd-welcome-steps\">\n <h3>Getting Started</h3>\n <ol>\n <li>\n <strong>Install the client in your app:</strong>\n <pre>{`import { StateSurgeonClient, instrumentReact } from 'state-surgeon/instrument';\n\nconst client = new StateSurgeonClient({ appId: 'my-app' });\ninstrumentReact(React);`}</pre>\n </li>\n <li>\n <strong>Interact with your application</strong> to generate state mutations\n </li>\n <li>\n <strong>Select a session above</strong> to start debugging\n </li>\n </ol>\n </div>\n ) : (\n <div className=\"sd-welcome-sessions\">\n <h3>Available Sessions ({sessions.length})</h3>\n <div className=\"sd-session-list\">\n {sessions.map(session => (\n <button\n key={session.id}\n className=\"sd-session-card\"\n onClick={() => selectSession(session.id)}\n >\n <span className=\"sd-session-app\">{session.appId}</span>\n <span className=\"sd-session-id\">{session.id.slice(0, 16)}...</span>\n <span className=\"sd-session-count\">{session.mutationCount} mutations</span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n\n {isLoading && !currentSession && (\n <div className=\"sd-loading\">\n <div className=\"sd-spinner\"></div>\n <p>Loading sessions...</p>\n </div>\n )}\n\n {currentSession && (\n <div className=\"sd-main\">\n <section className=\"sd-timeline\">\n <TimelineScrubber\n mutations={timeline}\n selectedIndex={playback.currentIndex}\n onSelect={(index, mutation) => {\n playback.goTo(index);\n selectMutation(mutation);\n }}\n isPlaying={playback.isPlaying}\n onPlay={playback.play}\n onPause={playback.pause}\n onStepForward={playback.stepForward}\n onStepBackward={playback.stepBackward}\n playbackSpeed={playback.playbackSpeed}\n onSpeedChange={playback.setSpeed}\n />\n </section>\n\n <div className=\"sd-panels\">\n <div className=\"sd-panel-tabs\">\n <button\n className={`sd-panel-tab ${activePanel === 'diff' ? 'active' : ''}`}\n onClick={() => setActivePanel('diff')}\n >\n 📊 State Changes\n </button>\n <button\n className={`sd-panel-tab ${activePanel === 'inspector' ? 'active' : ''}`}\n onClick={() => setActivePanel('inspector')}\n >\n 🔍 Mutation Details\n </button>\n </div>\n\n <div className=\"sd-panel-content\">\n {activePanel === 'diff' && selectedMutation && (\n <StateDiffViewer\n previousState={selectedMutation.previousState}\n nextState={selectedMutation.nextState}\n diff={selectedMutation.diff}\n />\n )}\n\n {activePanel === 'inspector' && (\n <MutationInspector mutation={selectedMutation} />\n )}\n\n {!selectedMutation && (\n <div className=\"sd-panel-empty\">\n <p>Select a mutation from the timeline to view details</p>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n <footer className=\"sd-footer\">\n <span>State Surgeon v1.1.0</span>\n <span className=\"sd-footer-sep\">•</span>\n <span>Press ← → to navigate, Space to play/pause</span>\n </footer>\n\n <style>{`\n .surgeon-dashboard {\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n background: linear-gradient(135deg, #0f0f23 0%, #1a1a2e 100%);\n color: #e0e0e0;\n font-family: system-ui, -apple-system, sans-serif;\n }\n\n .sd-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 2rem;\n background: rgba(22, 33, 62, 0.8);\n backdrop-filter: blur(10px);\n border-bottom: 1px solid #333;\n position: sticky;\n top: 0;\n z-index: 100;\n }\n\n .sd-header-left, .sd-header-right {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n\n .sd-logo {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n font-size: 1.25rem;\n }\n\n .sd-logo-icon {\n font-size: 1.5rem;\n }\n\n .sd-logo-text {\n background: linear-gradient(135deg, #00d9ff, #a78bfa);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n font-weight: 700;\n }\n\n .sd-version {\n font-size: 0.7rem;\n padding: 0.2rem 0.4rem;\n background: #333;\n border-radius: 4px;\n color: #888;\n }\n\n .sd-session-select {\n padding: 0.625rem 1.25rem;\n min-width: 350px;\n border: 1px solid #333;\n border-radius: 8px;\n background: #0f0f23;\n color: #e0e0e0;\n font-size: 0.875rem;\n cursor: pointer;\n }\n\n .sd-session-select:focus {\n outline: none;\n border-color: #00d9ff;\n }\n\n .sd-auto-refresh {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n color: #888;\n cursor: pointer;\n }\n\n .sd-refresh-btn {\n padding: 0.5rem;\n border: 1px solid #333;\n border-radius: 8px;\n background: transparent;\n color: #e0e0e0;\n cursor: pointer;\n font-size: 1rem;\n }\n\n .sd-refresh-btn:hover {\n background: #16213e;\n }\n\n .sd-error {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 1rem 2rem;\n background: rgba(239, 68, 68, 0.1);\n border-bottom: 1px solid #ef4444;\n }\n\n .sd-error-icon {\n font-size: 1.25rem;\n }\n\n .sd-error p {\n margin: 0;\n color: #fca5a5;\n }\n\n .sd-welcome {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n }\n\n .sd-welcome-content {\n text-align: center;\n max-width: 600px;\n }\n\n .sd-welcome-icon {\n font-size: 5rem;\n margin-bottom: 1rem;\n animation: float 3s ease-in-out infinite;\n }\n\n @keyframes float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n }\n\n .sd-welcome h2 {\n margin: 0 0 0.5rem;\n font-size: 2rem;\n background: linear-gradient(135deg, #00d9ff, #a78bfa);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n\n .sd-welcome > p {\n margin: 0 0 2rem;\n color: #888;\n }\n\n .sd-welcome-steps {\n text-align: left;\n background: #16213e;\n border-radius: 12px;\n padding: 1.5rem;\n }\n\n .sd-welcome-steps h3 {\n margin: 0 0 1rem;\n color: #00d9ff;\n font-size: 1rem;\n }\n\n .sd-welcome-steps ol {\n margin: 0;\n padding-left: 1.25rem;\n }\n\n .sd-welcome-steps li {\n margin-bottom: 1rem;\n color: #ccc;\n }\n\n .sd-welcome-steps pre {\n margin: 0.5rem 0 0;\n padding: 1rem;\n background: #0f0f23;\n border-radius: 8px;\n font-size: 0.8rem;\n overflow-x: auto;\n }\n\n .sd-welcome-sessions h3 {\n margin: 0 0 1rem;\n color: #00d9ff;\n }\n\n .sd-session-list {\n display: grid;\n gap: 0.75rem;\n }\n\n .sd-session-card {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n background: #16213e;\n border: 1px solid #333;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n text-align: left;\n color: inherit;\n }\n\n .sd-session-card:hover {\n border-color: #00d9ff;\n background: #1a2744;\n }\n\n .sd-session-app {\n font-weight: 600;\n color: #a78bfa;\n }\n\n .sd-session-id {\n font-family: monospace;\n font-size: 0.8rem;\n color: #666;\n }\n\n .sd-session-count {\n font-size: 0.875rem;\n color: #00d9ff;\n }\n\n .sd-loading {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n }\n\n .sd-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid #333;\n border-top-color: #00d9ff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .sd-main {\n flex: 1;\n padding: 1.5rem 2rem;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n\n .sd-timeline {\n flex-shrink: 0;\n }\n\n .sd-panels {\n flex: 1;\n background: #1a1a2e;\n border-radius: 12px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-height: 400px;\n }\n\n .sd-panel-tabs {\n display: flex;\n background: #16213e;\n border-bottom: 1px solid #333;\n }\n\n .sd-panel-tab {\n padding: 1rem 1.5rem;\n border: none;\n background: transparent;\n color: #888;\n cursor: pointer;\n font-size: 0.875rem;\n transition: all 0.2s;\n }\n\n .sd-panel-tab:hover {\n color: #ccc;\n background: #1a2744;\n }\n\n .sd-panel-tab.active {\n color: #00d9ff;\n background: #1a1a2e;\n border-bottom: 2px solid #00d9ff;\n }\n\n .sd-panel-content {\n flex: 1;\n overflow: auto;\n }\n\n .sd-panel-empty {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n }\n\n .sd-footer {\n padding: 0.75rem 2rem;\n background: rgba(22, 33, 62, 0.5);\n border-top: 1px solid #333;\n font-size: 0.75rem;\n color: #666;\n text-align: center;\n }\n\n .sd-footer-sep {\n margin: 0 0.5rem;\n }\n `}</style>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/dashboard/components/MutationInspector.tsx","../../src/core/diff.ts","../../src/dashboard/components/StateDiffViewer.tsx","../../src/dashboard/components/TimelineScrubber.tsx","../../src/core/analyzer.ts","../../src/dashboard/components/DependencyGraph.tsx","../../src/dashboard/components/IssuesPanel.tsx","../../src/dashboard/components/StateTreeViewer.tsx","../../src/dashboard/hooks/useDashboard.tsx","../../src/dashboard/Dashboard.tsx"],"names":["jsxs","jsx","Fragment","useState","useCallback","useMemo","styles","React","analyzer","useEffect"],"mappings":"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A;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA","file":"index.mjs","sourcesContent":["import type { Mutation } from '../../core/mutation';\n\nexport interface MutationInspectorProps {\n /** The mutation to inspect */\n mutation: Mutation | null;\n\n /** Custom class name */\n className?: string;\n}\n\n/**\n * Detailed inspector for a single mutation\n */\nexport function MutationInspector({\n mutation,\n className = '',\n}: MutationInspectorProps) {\n if (!mutation) {\n return (\n <div className={`mutation-inspector mutation-inspector--empty ${className}`}>\n <p>Select a mutation to inspect</p>\n </div>\n );\n }\n\n const formatDuration = (ms?: number) => {\n if (ms === undefined) return 'N/A';\n if (ms < 1) return `${(ms * 1000).toFixed(2)}μs`;\n if (ms < 1000) return `${ms.toFixed(2)}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n };\n\n const formatTimestamp = (ts: number) => {\n const date = new Date(ts);\n return date.toLocaleString();\n };\n\n return (\n <div className={`mutation-inspector ${className}`}>\n <div className=\"mutation-inspector__header\">\n <h3 className=\"mutation-inspector__title\">\n <span\n className=\"mutation-inspector__source-badge\"\n data-source={mutation.source}\n >\n {mutation.source}\n </span>\n {mutation.actionType}\n </h3>\n <span className=\"mutation-inspector__id\">{mutation.id}</span>\n </div>\n\n <div className=\"mutation-inspector__grid\">\n <div className=\"mutation-inspector__section\">\n <h4>Location</h4>\n <dl className=\"mutation-inspector__details\">\n {mutation.component && (\n <>\n <dt>Component</dt>\n <dd>{mutation.component}</dd>\n </>\n )}\n {mutation.function && (\n <>\n <dt>Function</dt>\n <dd><code>{mutation.function}</code></dd>\n </>\n )}\n {mutation.file && (\n <>\n <dt>File</dt>\n <dd>\n <code>\n {mutation.file}\n {mutation.line && `:${mutation.line}`}\n {mutation.column && `:${mutation.column}`}\n </code>\n </dd>\n </>\n )}\n </dl>\n </div>\n\n <div className=\"mutation-inspector__section\">\n <h4>Timing</h4>\n <dl className=\"mutation-inspector__details\">\n <dt>Timestamp</dt>\n <dd>{formatTimestamp(mutation.timestamp)}</dd>\n <dt>Logical Clock</dt>\n <dd>{mutation.logicalClock}</dd>\n {mutation.duration !== undefined && (\n <>\n <dt>Duration</dt>\n <dd>{formatDuration(mutation.duration)}</dd>\n </>\n )}\n </dl>\n </div>\n </div>\n\n {mutation.actionPayload && (\n <div className=\"mutation-inspector__section\">\n <h4>Action Payload</h4>\n <pre className=\"mutation-inspector__code\">\n {JSON.stringify(mutation.actionPayload, null, 2)}\n </pre>\n </div>\n )}\n\n {mutation.diff && mutation.diff.length > 0 && (\n <div className=\"mutation-inspector__section\">\n <h4>State Changes ({mutation.diff.length})</h4>\n <ul className=\"mutation-inspector__changes\">\n {mutation.diff.map((change, index) => (\n <li key={index} className={`mutation-inspector__change mutation-inspector__change--${change.operation.toLowerCase()}`}>\n <code>{change.path}</code>\n <span className=\"mutation-inspector__op\">{change.operation}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {mutation.callStack && mutation.callStack.length > 0 && (\n <div className=\"mutation-inspector__section\">\n <h4>Call Stack</h4>\n <ul className=\"mutation-inspector__stack\">\n {mutation.callStack.map((frame, index) => (\n <li key={index} className=\"mutation-inspector__frame\">\n <code>{frame}</code>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {mutation.causes && mutation.causes.length > 0 && (\n <div className=\"mutation-inspector__section\">\n <h4>Caused By</h4>\n <ul className=\"mutation-inspector__causes\">\n {mutation.causes.map((causeId, index) => (\n <li key={index}>\n <code>{causeId}</code>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <style>{`\n .mutation-inspector {\n padding: 1rem;\n background: #1a1a2e;\n border-radius: 8px;\n color: #e0e0e0;\n font-size: 0.875rem;\n }\n\n .mutation-inspector--empty {\n text-align: center;\n color: #666;\n padding: 2rem;\n }\n\n .mutation-inspector__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid #333;\n }\n\n .mutation-inspector__title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n font-size: 1rem;\n color: #fff;\n }\n\n .mutation-inspector__source-badge {\n padding: 0.125rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n }\n\n .mutation-inspector__source-badge[data-source=\"react\"] {\n background: #61dafb;\n color: #000;\n }\n\n .mutation-inspector__source-badge[data-source=\"redux\"] {\n background: #764abc;\n color: #fff;\n }\n\n .mutation-inspector__source-badge[data-source=\"zustand\"] {\n background: #f59e0b;\n color: #000;\n }\n\n .mutation-inspector__source-badge[data-source=\"api\"] {\n background: #3b82f6;\n color: #fff;\n }\n\n .mutation-inspector__id {\n color: #666;\n font-family: monospace;\n font-size: 0.75rem;\n }\n\n .mutation-inspector__grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n margin-bottom: 1rem;\n }\n\n .mutation-inspector__section {\n margin-bottom: 1rem;\n }\n\n .mutation-inspector__section h4 {\n margin: 0 0 0.5rem 0;\n color: #00d9ff;\n font-size: 0.875rem;\n }\n\n .mutation-inspector__details {\n margin: 0;\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 0.25rem 0.5rem;\n }\n\n .mutation-inspector__details dt {\n color: #888;\n }\n\n .mutation-inspector__details dd {\n margin: 0;\n color: #e0e0e0;\n }\n\n .mutation-inspector__code {\n margin: 0;\n padding: 0.75rem;\n background: #0f0f23;\n border-radius: 4px;\n overflow: auto;\n max-height: 200px;\n font-size: 0.8rem;\n }\n\n .mutation-inspector__changes,\n .mutation-inspector__stack,\n .mutation-inspector__causes {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .mutation-inspector__change {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n margin-bottom: 0.25rem;\n }\n\n .mutation-inspector__change--add {\n background: rgba(34, 197, 94, 0.1);\n }\n\n .mutation-inspector__change--update {\n background: rgba(251, 191, 36, 0.1);\n }\n\n .mutation-inspector__change--remove {\n background: rgba(239, 68, 68, 0.1);\n }\n\n .mutation-inspector__op {\n font-size: 0.7rem;\n padding: 0.125rem 0.375rem;\n border-radius: 3px;\n background: #333;\n color: #888;\n }\n\n .mutation-inspector__frame {\n padding: 0.25rem 0;\n border-bottom: 1px solid #222;\n }\n\n .mutation-inspector__frame:last-child {\n border-bottom: none;\n }\n\n code {\n font-family: 'Fira Code', 'Monaco', monospace;\n }\n `}</style>\n </div>\n );\n}\n","import type { StateDiff } from './mutation';\n\n/**\n * Deep clones an object\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as unknown as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (obj instanceof Map) {\n const clonedMap = new Map();\n obj.forEach((value, key) => {\n clonedMap.set(deepClone(key), deepClone(value));\n });\n return clonedMap as unknown as T;\n }\n\n if (obj instanceof Set) {\n const clonedSet = new Set();\n obj.forEach(value => {\n clonedSet.add(deepClone(value));\n });\n return clonedSet as unknown as T;\n }\n\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n\n return cloned as T;\n}\n\n/**\n * Calculates the difference between two objects\n */\nexport function calculateDiff(before: unknown, after: unknown, path: string = ''): StateDiff[] {\n const diffs: StateDiff[] = [];\n\n // Handle primitives and null\n if (before === after) {\n return diffs;\n }\n\n if (before === null || before === undefined || typeof before !== 'object') {\n if (after === null || after === undefined || typeof after !== 'object') {\n // Both are primitives\n if (before !== after) {\n if (before === undefined) {\n diffs.push({ path: path || 'root', operation: 'ADD', newValue: after });\n } else if (after === undefined) {\n diffs.push({ path: path || 'root', operation: 'REMOVE', oldValue: before });\n } else {\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n }\n }\n return diffs;\n }\n // before is primitive, after is object\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n return diffs;\n }\n\n if (after === null || after === undefined || typeof after !== 'object') {\n // before is object, after is primitive\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n return diffs;\n }\n\n // Handle arrays\n if (Array.isArray(before) || Array.isArray(after)) {\n if (!Array.isArray(before) || !Array.isArray(after)) {\n diffs.push({ path: path || 'root', operation: 'UPDATE', oldValue: before, newValue: after });\n return diffs;\n }\n\n const maxLength = Math.max(before.length, after.length);\n for (let i = 0; i < maxLength; i++) {\n const itemPath = path ? `${path}[${i}]` : `[${i}]`;\n if (i >= before.length) {\n diffs.push({ path: itemPath, operation: 'ADD', newValue: after[i] });\n } else if (i >= after.length) {\n diffs.push({ path: itemPath, operation: 'REMOVE', oldValue: before[i] });\n } else {\n diffs.push(...calculateDiff(before[i], after[i], itemPath));\n }\n }\n return diffs;\n }\n\n // Handle objects\n const beforeObj = before as Record<string, unknown>;\n const afterObj = after as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(beforeObj), ...Object.keys(afterObj)]);\n\n for (const key of allKeys) {\n const keyPath = path ? `${path}.${key}` : key;\n const beforeValue = beforeObj[key];\n const afterValue = afterObj[key];\n\n if (!(key in beforeObj)) {\n diffs.push({ path: keyPath, operation: 'ADD', newValue: afterValue });\n } else if (!(key in afterObj)) {\n diffs.push({ path: keyPath, operation: 'REMOVE', oldValue: beforeValue });\n } else {\n diffs.push(...calculateDiff(beforeValue, afterValue, keyPath));\n }\n }\n\n return diffs;\n}\n\n/**\n * Applies a diff to a state object\n */\nexport function applyDiff<T>(state: T, diffs: StateDiff[]): T {\n const result = deepClone(state);\n\n for (const diff of diffs) {\n setValueAtPath(result, diff.path, diff.operation === 'REMOVE' ? undefined : diff.newValue);\n }\n\n return result;\n}\n\n/**\n * Gets a value at a path in an object\n */\nexport function getValueAtPath(obj: unknown, path: string): unknown {\n if (!path || path === 'root') return obj;\n\n const parts = parsePath(path);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Sets a value at a path in an object\n */\nexport function setValueAtPath(obj: unknown, path: string, value: unknown): void {\n if (!path || path === 'root') return;\n\n const parts = parsePath(path);\n let current = obj as Record<string, unknown>;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (current[part] === undefined) {\n // Create intermediate object or array based on next part\n const nextPart = parts[i + 1];\n current[part] = /^\\d+$/.test(nextPart) ? [] : {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const lastPart = parts[parts.length - 1];\n if (value === undefined) {\n delete current[lastPart];\n } else {\n current[lastPart] = value;\n }\n}\n\n/**\n * Parses a path string into parts\n */\nfunction parsePath(path: string): string[] {\n const parts: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '.' && !inBracket) {\n if (current) parts.push(current);\n current = '';\n } else if (char === '[') {\n if (current) parts.push(current);\n current = '';\n inBracket = true;\n } else if (char === ']') {\n if (current) parts.push(current);\n current = '';\n inBracket = false;\n } else {\n current += char;\n }\n }\n\n if (current) parts.push(current);\n return parts;\n}\n\n/**\n * Checks if two values are deeply equal\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n\n if (typeof a !== typeof b) return false;\n\n if (a === null || b === null) return a === b;\n\n if (typeof a !== 'object') return a === b;\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => deepEqual(item, b[index]));\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n return aKeys.every(key => deepEqual(aObj[key], bObj[key]));\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { calculateDiff } from '../../core/diff';\nimport type { StateDiff } from '../../core/mutation';\n\nexport interface StateDiffViewerProps {\n /** State before the mutation */\n previousState: unknown;\n\n /** State after the mutation */\n nextState: unknown;\n\n /** Pre-computed diff (optional) */\n diff?: StateDiff[];\n\n /** Maximum depth to expand by default */\n defaultExpandDepth?: number;\n\n /** Show side-by-side or unified view */\n viewMode?: 'split' | 'unified';\n\n /** Custom class name */\n className?: string;\n}\n\n// Anomaly types for detection\ntype AnomalyType = 'nan' | 'undefined' | 'null' | 'type-change' | 'empty-string' | 'negative' | null;\n\nfunction detectAnomaly(value: unknown): AnomalyType {\n if (typeof value === 'number' && isNaN(value)) return 'nan';\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (value === '') return 'empty-string';\n if (typeof value === 'number' && value < 0) return 'negative';\n return null;\n}\n\nfunction getAnomalyBadge(anomaly: AnomalyType): string {\n switch (anomaly) {\n case 'nan': return '⚠️ NaN';\n case 'undefined': return '⚠️ undefined';\n case 'null': return '⚡ null';\n case 'empty-string': return '📭 empty';\n case 'negative': return '➖ negative';\n default: return '';\n }\n}\n\n/**\n * Enhanced viewer for comparing before/after state with visual highlighting\n */\nexport function StateDiffViewer({\n previousState,\n nextState,\n diff: preDiff,\n defaultExpandDepth = 3,\n viewMode = 'split',\n className = '',\n}: StateDiffViewerProps) {\n const [activeTab, setActiveTab] = useState<'diff' | 'before' | 'after' | 'raw'>('diff');\n const [searchQuery, setSearchQuery] = useState('');\n const [copiedPath, setCopiedPath] = useState<string | null>(null);\n\n const diff = useMemo(\n () => preDiff || calculateDiff(previousState, nextState),\n [previousState, nextState, preDiff]\n );\n\n const changedPaths = useMemo(\n () => new Set(diff.map(d => d.path)),\n [diff]\n );\n\n // Group diffs by operation type\n const groupedDiffs = useMemo(() => {\n const adds = diff.filter(d => d.operation === 'ADD');\n const updates = diff.filter(d => d.operation === 'UPDATE');\n const removes = diff.filter(d => d.operation === 'REMOVE');\n return { adds, updates, removes };\n }, [diff]);\n\n // Detect anomalies\n const anomalies = useMemo(() => {\n const result: { path: string; type: AnomalyType; value: unknown }[] = [];\n\n for (const d of diff) {\n if (d.operation !== 'REMOVE') {\n const anomaly = detectAnomaly(d.newValue);\n if (anomaly) {\n result.push({ path: d.path, type: anomaly, value: d.newValue });\n }\n }\n }\n\n return result;\n }, [diff]);\n\n const copyToClipboard = useCallback((value: unknown, path: string) => {\n const text = typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value);\n navigator.clipboard.writeText(text);\n setCopiedPath(path);\n setTimeout(() => setCopiedPath(null), 2000);\n }, []);\n\n const copyFullState = useCallback((state: unknown, label: string) => {\n navigator.clipboard.writeText(JSON.stringify(state, null, 2));\n setCopiedPath(label);\n setTimeout(() => setCopiedPath(null), 2000);\n }, []);\n\n return (\n <div className={`state-diff-viewer-enhanced ${className}`}>\n {/* Header with tabs and actions */}\n <div className=\"sdv-header\">\n <div className=\"sdv-tabs\">\n <button\n className={`sdv-tab ${activeTab === 'diff' ? 'active' : ''}`}\n onClick={() => setActiveTab('diff')}\n >\n 📊 Changes ({diff.length})\n </button>\n <button\n className={`sdv-tab ${activeTab === 'before' ? 'active' : ''}`}\n onClick={() => setActiveTab('before')}\n >\n ⏪ Before\n </button>\n <button\n className={`sdv-tab ${activeTab === 'after' ? 'active' : ''}`}\n onClick={() => setActiveTab('after')}\n >\n ⏩ After\n </button>\n <button\n className={`sdv-tab ${activeTab === 'raw' ? 'active' : ''}`}\n onClick={() => setActiveTab('raw')}\n >\n 📝 Raw JSON\n </button>\n </div>\n\n <div className=\"sdv-actions\">\n <input\n type=\"text\"\n placeholder=\"🔍 Search paths...\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n className=\"sdv-search\"\n />\n </div>\n </div>\n\n {/* Anomaly alerts */}\n {anomalies.length > 0 && (\n <div className=\"sdv-anomalies\">\n <div className=\"sdv-anomaly-header\">\n <span className=\"sdv-anomaly-icon\">🚨</span>\n <span>Potential Issues Detected ({anomalies.length})</span>\n </div>\n <div className=\"sdv-anomaly-list\">\n {anomalies.map((a, i) => (\n <div key={i} className={`sdv-anomaly-item sdv-anomaly-${a.type}`}>\n <code>{a.path}</code>\n <span className=\"sdv-anomaly-badge\">{getAnomalyBadge(a.type)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Summary bar */}\n {activeTab === 'diff' && (\n <div className=\"sdv-summary\">\n <span className=\"sdv-summary-item sdv-add\">\n <span className=\"sdv-dot\"></span>\n {groupedDiffs.adds.length} added\n </span>\n <span className=\"sdv-summary-item sdv-update\">\n <span className=\"sdv-dot\"></span>\n {groupedDiffs.updates.length} changed\n </span>\n <span className=\"sdv-summary-item sdv-remove\">\n <span className=\"sdv-dot\"></span>\n {groupedDiffs.removes.length} removed\n </span>\n </div>\n )}\n\n {/* Content area */}\n <div className=\"sdv-content\">\n {activeTab === 'diff' && (\n <div className=\"sdv-diff-list\">\n {diff.length === 0 ? (\n <div className=\"sdv-empty\">No changes detected</div>\n ) : (\n diff\n .filter(d => !searchQuery || d.path.toLowerCase().includes(searchQuery.toLowerCase()))\n .map((change, index) => (\n <div\n key={index}\n className={`sdv-diff-item sdv-diff-${change.operation.toLowerCase()}`}\n >\n <div className=\"sdv-diff-header\">\n <span className=\"sdv-diff-op\">{change.operation}</span>\n <code className=\"sdv-diff-path\">{change.path}</code>\n <button\n className=\"sdv-copy-btn\"\n onClick={() => copyToClipboard(change.newValue ?? change.oldValue, change.path)}\n title=\"Copy value\"\n >\n {copiedPath === change.path ? '✓' : '📋'}\n </button>\n </div>\n <div className=\"sdv-diff-values\">\n {change.operation === 'UPDATE' && (\n <>\n <div className=\"sdv-value sdv-value-old\">\n <span className=\"sdv-value-label\">Before:</span>\n <ValueDisplay value={change.oldValue} />\n </div>\n <span className=\"sdv-arrow\">→</span>\n <div className=\"sdv-value sdv-value-new\">\n <span className=\"sdv-value-label\">After:</span>\n <ValueDisplay value={change.newValue} />\n </div>\n </>\n )}\n {change.operation === 'ADD' && (\n <div className=\"sdv-value sdv-value-new\">\n <ValueDisplay value={change.newValue} />\n </div>\n )}\n {change.operation === 'REMOVE' && (\n <div className=\"sdv-value sdv-value-old\">\n <ValueDisplay value={change.oldValue} />\n </div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n\n {activeTab === 'before' && (\n <div className=\"sdv-state-view\">\n <div className=\"sdv-state-actions\">\n <button\n onClick={() => copyFullState(previousState, 'before')}\n className=\"sdv-copy-full\"\n >\n {copiedPath === 'before' ? '✓ Copied!' : '📋 Copy State'}\n </button>\n </div>\n <StateTree\n value={previousState}\n path=\"\"\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n changeType=\"before\"\n />\n </div>\n )}\n\n {activeTab === 'after' && (\n <div className=\"sdv-state-view\">\n <div className=\"sdv-state-actions\">\n <button\n onClick={() => copyFullState(nextState, 'after')}\n className=\"sdv-copy-full\"\n >\n {copiedPath === 'after' ? '✓ Copied!' : '📋 Copy State'}\n </button>\n </div>\n <StateTree\n value={nextState}\n path=\"\"\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n changeType=\"after\"\n />\n </div>\n )}\n\n {activeTab === 'raw' && (\n <div className=\"sdv-raw-view\">\n <div className=\"sdv-raw-panels\">\n <div className=\"sdv-raw-panel\">\n <h4>Before</h4>\n <pre>{JSON.stringify(previousState, null, 2)}</pre>\n </div>\n <div className=\"sdv-raw-panel\">\n <h4>After</h4>\n <pre>{JSON.stringify(nextState, null, 2)}</pre>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <style>{`\n .state-diff-viewer-enhanced {\n background: #1a1a2e;\n border-radius: 12px;\n overflow: hidden;\n font-family: system-ui, sans-serif;\n color: #e0e0e0;\n }\n\n .sdv-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 1rem;\n background: #16213e;\n border-bottom: 1px solid #333;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .sdv-tabs {\n display: flex;\n gap: 0.25rem;\n }\n\n .sdv-tab {\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: #888;\n cursor: pointer;\n border-radius: 6px;\n font-size: 0.875rem;\n transition: all 0.2s;\n }\n\n .sdv-tab:hover {\n background: #1f2b4d;\n color: #ccc;\n }\n\n .sdv-tab.active {\n background: #00d9ff20;\n color: #00d9ff;\n }\n\n .sdv-search {\n padding: 0.5rem 1rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: #0f0f23;\n color: #e0e0e0;\n font-size: 0.875rem;\n width: 200px;\n }\n\n .sdv-anomalies {\n margin: 1rem;\n padding: 1rem;\n background: #ef444420;\n border: 1px solid #ef4444;\n border-radius: 8px;\n }\n\n .sdv-anomaly-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n margin-bottom: 0.75rem;\n color: #fca5a5;\n }\n\n .sdv-anomaly-icon {\n font-size: 1.25rem;\n }\n\n .sdv-anomaly-list {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .sdv-anomaly-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.75rem;\n background: #0f0f23;\n border-radius: 4px;\n font-size: 0.875rem;\n }\n\n .sdv-anomaly-item code {\n color: #f472b6;\n }\n\n .sdv-anomaly-badge {\n font-size: 0.75rem;\n padding: 0.125rem 0.375rem;\n background: #ef444440;\n border-radius: 3px;\n }\n\n .sdv-summary {\n display: flex;\n gap: 1.5rem;\n padding: 0.75rem 1rem;\n background: #0f0f23;\n border-bottom: 1px solid #333;\n }\n\n .sdv-summary-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n }\n\n .sdv-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n\n .sdv-add .sdv-dot { background: #22c55e; }\n .sdv-update .sdv-dot { background: #fbbf24; }\n .sdv-remove .sdv-dot { background: #ef4444; }\n\n .sdv-content {\n max-height: 500px;\n overflow: auto;\n }\n\n .sdv-empty {\n padding: 2rem;\n text-align: center;\n color: #666;\n }\n\n .sdv-diff-list {\n padding: 1rem;\n }\n\n .sdv-diff-item {\n margin-bottom: 0.75rem;\n padding: 1rem;\n background: #16213e;\n border-radius: 8px;\n border-left: 4px solid;\n }\n\n .sdv-diff-add { border-left-color: #22c55e; }\n .sdv-diff-update { border-left-color: #fbbf24; }\n .sdv-diff-remove { border-left-color: #ef4444; }\n\n .sdv-diff-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n }\n\n .sdv-diff-op {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n text-transform: uppercase;\n }\n\n .sdv-diff-add .sdv-diff-op { background: #22c55e30; color: #22c55e; }\n .sdv-diff-update .sdv-diff-op { background: #fbbf2430; color: #fbbf24; }\n .sdv-diff-remove .sdv-diff-op { background: #ef444430; color: #ef4444; }\n\n .sdv-diff-path {\n flex: 1;\n font-family: 'Fira Code', monospace;\n color: #a78bfa;\n }\n\n .sdv-copy-btn {\n padding: 0.25rem 0.5rem;\n border: none;\n background: transparent;\n color: #888;\n cursor: pointer;\n border-radius: 4px;\n font-size: 0.875rem;\n }\n\n .sdv-copy-btn:hover {\n background: #333;\n color: #fff;\n }\n\n .sdv-diff-values {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n flex-wrap: wrap;\n }\n\n .sdv-value {\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n font-family: 'Fira Code', monospace;\n font-size: 0.875rem;\n max-width: 300px;\n overflow: auto;\n }\n\n .sdv-value-label {\n display: block;\n font-size: 0.7rem;\n color: #666;\n margin-bottom: 0.25rem;\n font-family: system-ui;\n }\n\n .sdv-value-old {\n background: #ef444420;\n color: #fca5a5;\n }\n\n .sdv-value-new {\n background: #22c55e20;\n color: #86efac;\n }\n\n .sdv-arrow {\n color: #666;\n font-size: 1.25rem;\n }\n\n .sdv-state-view {\n padding: 1rem;\n }\n\n .sdv-state-actions {\n margin-bottom: 1rem;\n }\n\n .sdv-copy-full {\n padding: 0.5rem 1rem;\n border: 1px solid #333;\n background: #16213e;\n color: #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 0.875rem;\n }\n\n .sdv-copy-full:hover {\n background: #1f2b4d;\n }\n\n .sdv-raw-view {\n padding: 1rem;\n }\n\n .sdv-raw-panels {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n\n .sdv-raw-panel {\n background: #0f0f23;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .sdv-raw-panel h4 {\n margin: 0;\n padding: 0.75rem 1rem;\n background: #16213e;\n color: #00d9ff;\n font-size: 0.875rem;\n }\n\n .sdv-raw-panel pre {\n margin: 0;\n padding: 1rem;\n font-size: 0.8rem;\n overflow: auto;\n max-height: 300px;\n }\n\n /* State tree styles */\n .state-tree__toggle {\n cursor: pointer;\n color: #888;\n user-select: none;\n }\n\n .state-tree__toggle:hover {\n color: #00d9ff;\n }\n\n .state-tree__children {\n margin-left: 1.5rem;\n border-left: 1px solid #333;\n padding-left: 0.75rem;\n }\n\n .state-tree__item {\n padding: 0.25rem 0;\n }\n\n .state-tree__key {\n color: #a78bfa;\n margin-right: 0.5rem;\n }\n\n .state-tree__null { color: #f472b6; font-style: italic; }\n .state-tree__undefined { color: #ef4444; font-style: italic; }\n .state-tree__boolean { color: #fb923c; }\n .state-tree__number { color: #22c55e; }\n .state-tree__string { color: #fbbf24; }\n .state-tree__empty { color: #666; }\n .state-tree--changed {\n background: #fbbf2430;\n padding: 0 0.25rem;\n border-radius: 3px;\n }\n\n .state-tree__anomaly {\n display: inline-block;\n margin-left: 0.5rem;\n padding: 0.125rem 0.375rem;\n background: #ef444440;\n border-radius: 3px;\n font-size: 0.7rem;\n color: #fca5a5;\n }\n `}</style>\n </div>\n );\n}\n\n// Value display component with type-based styling\nfunction ValueDisplay({ value }: { value: unknown }) {\n const anomaly = detectAnomaly(value);\n\n if (value === null) {\n return <span className=\"state-tree__null\">null</span>;\n }\n if (value === undefined) {\n return (\n <span className=\"state-tree__undefined\">\n undefined\n <span className=\"state-tree__anomaly\">⚠️</span>\n </span>\n );\n }\n if (typeof value === 'boolean') {\n return <span className=\"state-tree__boolean\">{String(value)}</span>;\n }\n if (typeof value === 'number') {\n if (isNaN(value)) {\n return (\n <span className=\"state-tree__undefined\">\n NaN\n <span className=\"state-tree__anomaly\">⚠️ Bug!</span>\n </span>\n );\n }\n return <span className=\"state-tree__number\">{String(value)}</span>;\n }\n if (typeof value === 'string') {\n if (value === '') {\n return <span className=\"state-tree__empty\">\"\"</span>;\n }\n const display = value.length > 50 ? value.slice(0, 50) + '...' : value;\n return <span className=\"state-tree__string\">\"{display}\"</span>;\n }\n if (Array.isArray(value)) {\n return <span className=\"state-tree__empty\">[{value.length} items]</span>;\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n return <span className=\"state-tree__empty\">{'{' + keys.length + ' keys}'}</span>;\n }\n return <span>{String(value)}</span>;\n}\n\ninterface StateTreeProps {\n value: unknown;\n path: string;\n changedPaths: Set<string>;\n defaultExpandDepth: number;\n depth?: number;\n changeType: 'before' | 'after';\n}\n\nfunction StateTree({\n value,\n path,\n changedPaths,\n defaultExpandDepth,\n depth = 0,\n changeType,\n}: StateTreeProps) {\n const [isExpanded, setIsExpanded] = useState(depth < defaultExpandDepth);\n const isChanged = path ? changedPaths.has(path) : false;\n const anomaly = detectAnomaly(value);\n\n const toggle = useCallback(() => setIsExpanded(e => !e), []);\n\n if (value === null) {\n return <span className=\"state-tree__null\">null</span>;\n }\n\n if (value === undefined) {\n return (\n <span className=\"state-tree__undefined\">\n undefined\n <span className=\"state-tree__anomaly\">⚠️</span>\n </span>\n );\n }\n\n if (typeof value === 'boolean') {\n return <span className=\"state-tree__boolean\">{String(value)}</span>;\n }\n\n if (typeof value === 'number') {\n if (isNaN(value)) {\n return (\n <span className={`state-tree__undefined ${isChanged ? 'state-tree--changed' : ''}`}>\n NaN\n <span className=\"state-tree__anomaly\">⚠️ BUG!</span>\n </span>\n );\n }\n return (\n <span className={`state-tree__number ${isChanged ? 'state-tree--changed' : ''}`}>\n {String(value)}\n </span>\n );\n }\n\n if (typeof value === 'string') {\n return (\n <span className={`state-tree__string ${isChanged ? 'state-tree--changed' : ''}`}>\n \"{value}\"\n {value === '' && <span className=\"state-tree__anomaly\">empty</span>}\n </span>\n );\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return <span className=\"state-tree__empty\">[]</span>;\n }\n\n return (\n <span className=\"state-tree__array\">\n <span className=\"state-tree__toggle\" onClick={toggle}>\n {isExpanded ? '▼' : '▶'} Array({value.length})\n </span>\n {isExpanded && (\n <div className=\"state-tree__children\">\n {value.map((item, index) => (\n <div key={index} className=\"state-tree__item\">\n <span className=\"state-tree__key\">{index}:</span>\n <StateTree\n value={item}\n path={path ? `${path}[${index}]` : `[${index}]`}\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n depth={depth + 1}\n changeType={changeType}\n />\n </div>\n ))}\n </div>\n )}\n </span>\n );\n }\n\n if (typeof value === 'object') {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n return <span className=\"state-tree__empty\">{'{}'}</span>;\n }\n\n return (\n <span className=\"state-tree__object\">\n <span className=\"state-tree__toggle\" onClick={toggle}>\n {isExpanded ? '▼' : '▶'} Object({entries.length})\n </span>\n {isExpanded && (\n <div className=\"state-tree__children\">\n {entries.map(([key, val]) => {\n const childPath = path ? `${path}.${key}` : key;\n const childChanged = changedPaths.has(childPath);\n return (\n <div key={key} className=\"state-tree__item\">\n <span className={`state-tree__key ${childChanged ? 'state-tree--changed' : ''}`}>\n {key}:\n </span>\n <StateTree\n value={val}\n path={childPath}\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n depth={depth + 1}\n changeType={changeType}\n />\n </div>\n );\n })}\n </div>\n )}\n </span>\n );\n }\n\n return <span>{String(value)}</span>;\n}\n","import React, { useCallback, useMemo, useState } from 'react';\nimport type { Mutation, MutationSource } from '../../core/mutation';\n\nexport interface TimelineScrubberProps {\n /** Array of mutations in the timeline */\n mutations: Mutation[];\n\n /** Currently selected mutation index */\n selectedIndex: number;\n\n /** Callback when a mutation is selected */\n onSelect: (index: number, mutation: Mutation) => void;\n\n /** Whether playback is active */\n isPlaying?: boolean;\n\n /** Callback for play button */\n onPlay?: () => void;\n\n /** Callback for pause button */\n onPause?: () => void;\n\n /** Callback for step forward */\n onStepForward?: () => void;\n\n /** Callback for step backward */\n onStepBackward?: () => void;\n\n /** Playback speed */\n playbackSpeed?: number;\n\n /** Callback for speed change */\n onSpeedChange?: (speed: number) => void;\n\n /** Custom class name */\n className?: string;\n}\n\n// Color mapping for different sources\nconst sourceColors: Record<MutationSource, string> = {\n react: '#61dafb',\n redux: '#764abc',\n zustand: '#f59e0b',\n express: '#68a063',\n websocket: '#8b5cf6',\n api: '#3b82f6',\n custom: '#6b7280',\n};\n\nconst sourceEmojis: Record<MutationSource, string> = {\n react: '⚛️',\n redux: '🔄',\n zustand: '🐻',\n express: '🚂',\n websocket: '🔌',\n api: '🌐',\n custom: '⚙️',\n};\n\n/**\n * Enhanced timeline scrubber with visual chart and mutation preview\n */\nexport function TimelineScrubber({\n mutations,\n selectedIndex,\n onSelect,\n isPlaying = false,\n onPlay,\n onPause,\n onStepForward,\n onStepBackward,\n playbackSpeed = 1,\n onSpeedChange,\n className = '',\n}: TimelineScrubberProps) {\n const [filter, setFilter] = useState<MutationSource | 'all'>('all');\n const [hoverIndex, setHoverIndex] = useState<number | null>(null);\n\n const handleSliderChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const index = parseInt(e.target.value, 10);\n if (mutations[index]) {\n onSelect(index, mutations[index]);\n }\n },\n [mutations, onSelect]\n );\n\n const handleMarkerClick = useCallback(\n (index: number) => {\n if (mutations[index]) {\n onSelect(index, mutations[index]);\n }\n },\n [mutations, onSelect]\n );\n\n // Group mutations by source for the chart\n const sourceStats = useMemo(() => {\n const stats: Record<string, number> = {};\n for (const m of mutations) {\n stats[m.source] = (stats[m.source] || 0) + 1;\n }\n return stats;\n }, [mutations]);\n\n // Filter mutations for display\n const filteredMutations = useMemo(() => {\n if (filter === 'all') return mutations;\n return mutations.filter(m => m.source === filter);\n }, [mutations, filter]);\n\n // Detect anomalies in timeline\n const anomalyCount = useMemo(() => {\n let count = 0;\n for (const m of mutations) {\n if (m.diff) {\n for (const d of m.diff) {\n if (d.newValue === undefined ||\n (typeof d.newValue === 'number' && isNaN(d.newValue))) {\n count++;\n break;\n }\n }\n }\n }\n return count;\n }, [mutations]);\n\n const formatTime = (timestamp: number) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n const formatDuration = (ms?: number) => {\n if (!ms) return '';\n if (ms < 1) return `${(ms * 1000).toFixed(0)}μs`;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n };\n\n if (mutations.length === 0) {\n return (\n <div className={`timeline-scrubber timeline-scrubber--empty ${className}`}>\n <div className=\"ts-empty-state\">\n <span className=\"ts-empty-icon\">📭</span>\n <h3>No Mutations Yet</h3>\n <p>Start interacting with your app to capture state changes</p>\n </div>\n </div>\n );\n }\n\n const selectedMutation = mutations[selectedIndex];\n const previewMutation = hoverIndex !== null ? mutations[hoverIndex] : selectedMutation;\n\n return (\n <div className={`timeline-scrubber ${className}`}>\n {/* Stats bar */}\n <div className=\"ts-stats\">\n <div className=\"ts-stat-main\">\n <span className=\"ts-stat-value\">{mutations.length}</span>\n <span className=\"ts-stat-label\">mutations</span>\n </div>\n\n <div className=\"ts-stat-sources\">\n {Object.entries(sourceStats).map(([source, count]) => (\n <button\n key={source}\n className={`ts-source-badge ${filter === source ? 'active' : ''}`}\n style={{ '--source-color': sourceColors[source as MutationSource] } as React.CSSProperties}\n onClick={() => setFilter(filter === source ? 'all' : source as MutationSource)}\n title={`${source}: ${count} mutations`}\n >\n <span className=\"ts-source-emoji\">{sourceEmojis[source as MutationSource]}</span>\n <span className=\"ts-source-count\">{count}</span>\n </button>\n ))}\n </div>\n\n {anomalyCount > 0 && (\n <div className=\"ts-anomaly-badge\">\n ⚠️ {anomalyCount} issue{anomalyCount > 1 ? 's' : ''}\n </div>\n )}\n\n <div className=\"ts-position\">\n <span className=\"ts-current\">{selectedIndex + 1}</span>\n <span className=\"ts-separator\">/</span>\n <span className=\"ts-total\">{mutations.length}</span>\n </div>\n </div>\n\n {/* Visual timeline chart */}\n <div className=\"ts-chart\">\n <div className=\"ts-chart-track\">\n {mutations.map((mutation, index) => {\n const isSelected = index === selectedIndex;\n const isHovered = index === hoverIndex;\n const hasAnomaly = mutation.diff?.some(d =>\n d.newValue === undefined ||\n (typeof d.newValue === 'number' && isNaN(d.newValue))\n );\n\n return (\n <div\n key={mutation.id}\n className={`ts-marker ${isSelected ? 'selected' : ''} ${isHovered ? 'hovered' : ''} ${hasAnomaly ? 'anomaly' : ''}`}\n style={{\n left: `${(index / Math.max(mutations.length - 1, 1)) * 100}%`,\n backgroundColor: sourceColors[mutation.source] || sourceColors.custom,\n }}\n onClick={() => handleMarkerClick(index)}\n onMouseEnter={() => setHoverIndex(index)}\n onMouseLeave={() => setHoverIndex(null)}\n />\n );\n })}\n\n {/* Progress indicator */}\n <div\n className=\"ts-progress\"\n style={{\n width: `${(selectedIndex / Math.max(mutations.length - 1, 1)) * 100}%`\n }}\n />\n\n {/* Current position indicator */}\n <div\n className=\"ts-cursor\"\n style={{\n left: `${(selectedIndex / Math.max(mutations.length - 1, 1)) * 100}%`\n }}\n />\n </div>\n </div>\n\n {/* Slider input */}\n <input\n type=\"range\"\n min={0}\n max={mutations.length - 1}\n value={selectedIndex}\n onChange={handleSliderChange}\n className=\"ts-slider\"\n />\n\n {/* Preview card */}\n {previewMutation && (\n <div className=\"ts-preview\">\n <div className=\"ts-preview-header\">\n <span\n className=\"ts-preview-source\"\n style={{ backgroundColor: sourceColors[previewMutation.source] }}\n >\n {sourceEmojis[previewMutation.source]} {previewMutation.source}\n </span>\n <span className=\"ts-preview-action\">{previewMutation.actionType}</span>\n {previewMutation.duration && (\n <span className=\"ts-preview-duration\">{formatDuration(previewMutation.duration)}</span>\n )}\n </div>\n <div className=\"ts-preview-details\">\n {previewMutation.component && (\n <span className=\"ts-preview-component\">{previewMutation.component}</span>\n )}\n <span className=\"ts-preview-time\">{formatTime(previewMutation.timestamp)}</span>\n </div>\n {previewMutation.diff && previewMutation.diff.length > 0 && (\n <div className=\"ts-preview-changes\">\n {previewMutation.diff.slice(0, 3).map((d, i) => (\n <code key={i} className={`ts-preview-path ts-preview-${d.operation.toLowerCase()}`}>\n {d.path}\n </code>\n ))}\n {previewMutation.diff.length > 3 && (\n <span className=\"ts-preview-more\">+{previewMutation.diff.length - 3} more</span>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Playback controls */}\n <div className=\"ts-controls\">\n <div className=\"ts-control-group\">\n <button\n onClick={onStepBackward}\n disabled={selectedIndex === 0}\n className=\"ts-btn\"\n title=\"Previous mutation (←)\"\n >\n ⏮️\n </button>\n\n {isPlaying ? (\n <button onClick={onPause} className=\"ts-btn ts-btn-primary\" title=\"Pause\">\n ⏸️\n </button>\n ) : (\n <button\n onClick={onPlay}\n disabled={selectedIndex === mutations.length - 1}\n className=\"ts-btn ts-btn-primary\"\n title=\"Play through timeline\"\n >\n ▶️\n </button>\n )}\n\n <button\n onClick={onStepForward}\n disabled={selectedIndex === mutations.length - 1}\n className=\"ts-btn\"\n title=\"Next mutation (→)\"\n >\n ⏭️\n </button>\n </div>\n\n <div className=\"ts-control-group\">\n <label className=\"ts-speed-label\">Speed:</label>\n <select\n value={playbackSpeed}\n onChange={e => onSpeedChange?.(Number(e.target.value))}\n className=\"ts-speed-select\"\n >\n <option value={0.5}>0.5x</option>\n <option value={1}>1x</option>\n <option value={2}>2x</option>\n <option value={4}>4x</option>\n </select>\n </div>\n\n <div className=\"ts-control-group\">\n <button\n className=\"ts-btn ts-btn-text\"\n onClick={() => onSelect(0, mutations[0])}\n disabled={selectedIndex === 0}\n >\n ⏪ Start\n </button>\n <button\n className=\"ts-btn ts-btn-text\"\n onClick={() => onSelect(mutations.length - 1, mutations[mutations.length - 1])}\n disabled={selectedIndex === mutations.length - 1}\n >\n End ⏩\n </button>\n </div>\n </div>\n\n <style>{`\n .timeline-scrubber {\n background: #1a1a2e;\n border-radius: 12px;\n padding: 1.25rem;\n color: #fff;\n }\n\n .timeline-scrubber--empty {\n padding: 3rem;\n }\n\n .ts-empty-state {\n text-align: center;\n }\n\n .ts-empty-icon {\n font-size: 3rem;\n display: block;\n margin-bottom: 1rem;\n }\n\n .ts-empty-state h3 {\n margin: 0 0 0.5rem;\n color: #888;\n }\n\n .ts-empty-state p {\n margin: 0;\n color: #666;\n font-size: 0.875rem;\n }\n\n .ts-stats {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin-bottom: 1rem;\n flex-wrap: wrap;\n }\n\n .ts-stat-main {\n display: flex;\n align-items: baseline;\n gap: 0.5rem;\n }\n\n .ts-stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: #00d9ff;\n }\n\n .ts-stat-label {\n font-size: 0.875rem;\n color: #888;\n }\n\n .ts-stat-sources {\n display: flex;\n gap: 0.5rem;\n }\n\n .ts-source-badge {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.375rem 0.625rem;\n border: 1px solid transparent;\n border-radius: 20px;\n background: var(--source-color, #666)20;\n color: var(--source-color, #888);\n cursor: pointer;\n font-size: 0.75rem;\n transition: all 0.2s;\n }\n\n .ts-source-badge:hover, .ts-source-badge.active {\n background: var(--source-color, #666)40;\n border-color: var(--source-color, #666);\n }\n\n .ts-source-emoji {\n font-size: 0.875rem;\n }\n\n .ts-anomaly-badge {\n padding: 0.375rem 0.75rem;\n background: #ef444430;\n color: #fca5a5;\n border-radius: 20px;\n font-size: 0.75rem;\n font-weight: 600;\n }\n\n .ts-position {\n margin-left: auto;\n font-family: 'Fira Code', monospace;\n font-size: 0.875rem;\n }\n\n .ts-current {\n color: #00d9ff;\n font-weight: 600;\n }\n\n .ts-separator {\n color: #444;\n margin: 0 0.25rem;\n }\n\n .ts-total {\n color: #666;\n }\n\n .ts-chart {\n margin-bottom: 0.5rem;\n }\n\n .ts-chart-track {\n position: relative;\n height: 32px;\n background: #16213e;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .ts-progress {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: linear-gradient(90deg, #00d9ff20, #00d9ff10);\n pointer-events: none;\n }\n\n .ts-cursor {\n position: absolute;\n top: 0;\n width: 3px;\n height: 100%;\n background: #00d9ff;\n border-radius: 1.5px;\n pointer-events: none;\n box-shadow: 0 0 10px #00d9ff80;\n }\n\n .ts-marker {\n position: absolute;\n width: 6px;\n height: 16px;\n top: 8px;\n margin-left: -3px;\n border-radius: 3px;\n cursor: pointer;\n opacity: 0.6;\n transition: all 0.15s;\n }\n\n .ts-marker:hover, .ts-marker.hovered {\n opacity: 1;\n transform: scaleY(1.3);\n }\n\n .ts-marker.selected {\n opacity: 1;\n box-shadow: 0 0 8px currentColor;\n transform: scaleY(1.4);\n }\n\n .ts-marker.anomaly {\n border: 2px solid #ef4444;\n }\n\n .ts-slider {\n width: 100%;\n height: 4px;\n margin: 0.5rem 0;\n cursor: pointer;\n -webkit-appearance: none;\n background: transparent;\n }\n\n .ts-slider::-webkit-slider-runnable-track {\n height: 4px;\n background: #333;\n border-radius: 2px;\n }\n\n .ts-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 16px;\n height: 16px;\n margin-top: -6px;\n background: #00d9ff;\n border-radius: 50%;\n cursor: pointer;\n }\n\n .ts-preview {\n margin: 1rem 0;\n padding: 1rem;\n background: #16213e;\n border-radius: 8px;\n border-left: 3px solid #00d9ff;\n }\n\n .ts-preview-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin-bottom: 0.5rem;\n }\n\n .ts-preview-source {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 600;\n color: #000;\n }\n\n .ts-preview-action {\n font-weight: 600;\n color: #e0e0e0;\n }\n\n .ts-preview-duration {\n margin-left: auto;\n font-size: 0.75rem;\n color: #888;\n font-family: 'Fira Code', monospace;\n }\n\n .ts-preview-details {\n display: flex;\n gap: 1rem;\n font-size: 0.875rem;\n color: #888;\n }\n\n .ts-preview-component {\n color: #a78bfa;\n }\n\n .ts-preview-changes {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 0.75rem;\n }\n\n .ts-preview-path {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n }\n\n .ts-preview-add { background: #22c55e20; color: #86efac; }\n .ts-preview-update { background: #fbbf2420; color: #fcd34d; }\n .ts-preview-remove { background: #ef444420; color: #fca5a5; }\n\n .ts-preview-more {\n font-size: 0.75rem;\n color: #666;\n padding: 0.25rem;\n }\n\n .ts-controls {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 1.5rem;\n padding-top: 0.5rem;\n flex-wrap: wrap;\n }\n\n .ts-control-group {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .ts-btn {\n padding: 0.5rem 0.75rem;\n border: none;\n border-radius: 8px;\n background: #16213e;\n color: #fff;\n cursor: pointer;\n font-size: 1rem;\n transition: all 0.2s;\n }\n\n .ts-btn:hover:not(:disabled) {\n background: #1f2b4d;\n }\n\n .ts-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .ts-btn-primary {\n background: #00d9ff;\n color: #000;\n }\n\n .ts-btn-primary:hover:not(:disabled) {\n background: #00b8e6;\n }\n\n .ts-btn-text {\n background: transparent;\n color: #888;\n font-size: 0.875rem;\n }\n\n .ts-btn-text:hover:not(:disabled) {\n color: #fff;\n background: transparent;\n }\n\n .ts-speed-label {\n font-size: 0.875rem;\n color: #888;\n }\n\n .ts-speed-select {\n padding: 0.375rem 0.5rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: #16213e;\n color: #e0e0e0;\n font-size: 0.875rem;\n cursor: pointer;\n }\n `}</style>\n </div>\n );\n}\n","/**\n * State Surgeon Analyzer\n *\n * Core analysis engine for detecting state issues.\n */\n\nimport type { Mutation, StateDiff } from './mutation';\n\n// Issue severity levels\nexport type IssueSeverity = 'critical' | 'warning' | 'info';\n\n// Issue categories matching the 10 problem types\nexport type IssueCategory =\n | 'state-loss' // Fields removed (overwrites vs merges)\n | 'invalid-value' // NaN, undefined in wrong place\n | 'type-change' // Type changed unexpectedly\n | 'no-op-update' // Update that changed nothing\n | 'excessive-updates' // Too many updates in short time\n | 'broken-invariant' // User-defined rule violated\n | 'hidden-coupling' // Multiple components touch same state\n | 'temporal-anomaly' // Suspicious timing pattern\n | 'state-corruption'; // State became invalid\n\nexport interface Issue {\n id: string;\n category: IssueCategory;\n severity: IssueSeverity;\n title: string;\n description: string;\n mutationId: string;\n mutationIndex: number;\n path?: string;\n previousValue?: unknown;\n currentValue?: unknown;\n relatedMutations?: string[];\n suggestion?: string;\n timestamp: number;\n}\n\nexport interface DependencyNode {\n path: string;\n components: Set<string>;\n mutationCount: number;\n lastMutationId: string;\n}\n\nexport interface DependencyGraph {\n nodes: Map<string, DependencyNode>;\n couplings: Array<{\n path: string;\n components: string[];\n severity: IssueSeverity;\n }>;\n}\n\nexport interface CausalChain {\n rootMutation: Mutation;\n effects: Array<{\n mutation: Mutation;\n causedBy: string;\n reason: string;\n }>;\n}\n\nexport interface Invariant {\n name: string;\n path: string;\n rule: (value: unknown) => boolean;\n message: string;\n}\n\n/**\n * Main analyzer class\n */\nexport class StateAnalyzer {\n private invariants: Invariant[] = [];\n private updateTimestamps: Map<string, number[]> = new Map();\n\n constructor() {}\n\n /**\n * Register custom invariant rules\n */\n addInvariant(invariant: Invariant): void {\n this.invariants.push(invariant);\n }\n\n /**\n * Analyze a single mutation for issues\n */\n analyzeMutation(\n mutation: Mutation,\n index: number,\n timeline: Mutation[]\n ): Issue[] {\n const issues: Issue[] = [];\n\n // Check for state loss (removed fields)\n if (mutation.diff) {\n for (const diff of mutation.diff) {\n // State Loss Detection\n if (diff.operation === 'REMOVE') {\n issues.push({\n id: `issue_${mutation.id}_${diff.path}_loss`,\n category: 'state-loss',\n severity: 'critical',\n title: `State field removed: ${diff.path}`,\n description: `The field \"${diff.path}\" was removed from state. This may indicate an overwrite instead of a merge.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: undefined,\n suggestion: 'Use spread operator to preserve existing fields: setState(prev => ({ ...prev, newField }))',\n timestamp: mutation.timestamp,\n });\n }\n\n // Invalid Value Detection\n if (diff.operation !== 'REMOVE') {\n const invalidIssue = this.checkInvalidValue(diff, mutation, index);\n if (invalidIssue) {\n issues.push(invalidIssue);\n }\n }\n\n // Type Change Detection\n if (diff.operation === 'UPDATE') {\n const typeIssue = this.checkTypeChange(diff, mutation, index);\n if (typeIssue) {\n issues.push(typeIssue);\n }\n }\n }\n }\n\n // No-op Update Detection\n if (this.isNoOpUpdate(mutation)) {\n issues.push({\n id: `issue_${mutation.id}_noop`,\n category: 'no-op-update',\n severity: 'info',\n title: 'Redundant state update',\n description: 'This mutation did not change any values. Consider memoizing or adding conditions.',\n mutationId: mutation.id,\n mutationIndex: index,\n suggestion: 'Add a condition before updating: if (newValue !== currentValue) setState(newValue)',\n timestamp: mutation.timestamp,\n });\n }\n\n // Excessive Updates Detection\n const excessiveIssue = this.checkExcessiveUpdates(mutation, index);\n if (excessiveIssue) {\n issues.push(excessiveIssue);\n }\n\n // Invariant Violations\n for (const invariant of this.invariants) {\n const violation = this.checkInvariant(invariant, mutation, index);\n if (violation) {\n issues.push(violation);\n }\n }\n\n return issues;\n }\n\n /**\n * Check for invalid values (NaN, unexpected undefined/null)\n */\n private checkInvalidValue(\n diff: StateDiff,\n mutation: Mutation,\n index: number\n ): Issue | null {\n const value = diff.newValue;\n\n // NaN detection\n if (typeof value === 'number' && isNaN(value)) {\n return {\n id: `issue_${mutation.id}_${diff.path}_nan`,\n category: 'invalid-value',\n severity: 'critical',\n title: `NaN value at: ${diff.path}`,\n description: `The value at \"${diff.path}\" became NaN. This usually indicates a calculation with undefined/null.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: value,\n suggestion: 'Check for undefined/null values before calculation. Use default values: (value ?? 0)',\n timestamp: mutation.timestamp,\n };\n }\n\n // Unexpected undefined (if previous was defined)\n if (value === undefined && diff.oldValue !== undefined && diff.operation === 'UPDATE') {\n return {\n id: `issue_${mutation.id}_${diff.path}_undefined`,\n category: 'invalid-value',\n severity: 'critical',\n title: `Value became undefined: ${diff.path}`,\n description: `The field \"${diff.path}\" changed from a defined value to undefined.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: undefined,\n suggestion: 'Ensure the value is always defined or explicitly handle undefined cases.',\n timestamp: mutation.timestamp,\n };\n }\n\n return null;\n }\n\n /**\n * Check for unexpected type changes\n */\n private checkTypeChange(\n diff: StateDiff,\n mutation: Mutation,\n index: number\n ): Issue | null {\n if (diff.oldValue === undefined || diff.oldValue === null) return null;\n if (diff.newValue === undefined || diff.newValue === null) return null;\n\n const oldType = typeof diff.oldValue;\n const newType = typeof diff.newValue;\n\n if (oldType !== newType) {\n return {\n id: `issue_${mutation.id}_${diff.path}_type`,\n category: 'type-change',\n severity: 'warning',\n title: `Type changed: ${diff.path}`,\n description: `The type of \"${diff.path}\" changed from ${oldType} to ${newType}.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: diff.newValue,\n suggestion: 'Ensure consistent types. Use TypeScript or runtime validation.',\n timestamp: mutation.timestamp,\n };\n }\n\n return null;\n }\n\n /**\n * Check if mutation is a no-op (no actual changes)\n */\n private isNoOpUpdate(mutation: Mutation): boolean {\n if (!mutation.diff || mutation.diff.length === 0) {\n // No diff means no change\n return true;\n }\n\n // Check if all diffs are identity updates\n return mutation.diff.every(d => {\n if (d.operation !== 'UPDATE') return false;\n return JSON.stringify(d.oldValue) === JSON.stringify(d.newValue);\n });\n }\n\n /**\n * Check for excessive updates in short time period\n */\n private checkExcessiveUpdates(\n mutation: Mutation,\n index: number\n ): Issue | null {\n const key = mutation.component || mutation.source;\n const timestamps = this.updateTimestamps.get(key) || [];\n\n // Add current timestamp\n timestamps.push(mutation.timestamp);\n\n // Keep only last 100ms of timestamps\n const cutoff = mutation.timestamp - 100;\n const recentTimestamps = timestamps.filter(t => t >= cutoff);\n this.updateTimestamps.set(key, recentTimestamps);\n\n // Too many updates in 100ms\n if (recentTimestamps.length > 5) {\n return {\n id: `issue_${mutation.id}_excessive`,\n category: 'excessive-updates',\n severity: 'warning',\n title: `Excessive updates from: ${key}`,\n description: `${recentTimestamps.length} mutations in 100ms from \"${key}\". This may cause performance issues.`,\n mutationId: mutation.id,\n mutationIndex: index,\n suggestion: 'Use debouncing, batching, or memoization to reduce update frequency.',\n timestamp: mutation.timestamp,\n };\n }\n\n return null;\n }\n\n /**\n * Check custom invariant rule\n */\n private checkInvariant(\n invariant: Invariant,\n mutation: Mutation,\n index: number\n ): Issue | null {\n if (!mutation.nextState) return null;\n\n // Get value at path\n const value = getValueAtPath(mutation.nextState, invariant.path);\n\n try {\n const isValid = invariant.rule(value);\n if (!isValid) {\n return {\n id: `issue_${mutation.id}_invariant_${invariant.name}`,\n category: 'broken-invariant',\n severity: 'critical',\n title: `Invariant violated: ${invariant.name}`,\n description: invariant.message,\n mutationId: mutation.id,\n mutationIndex: index,\n path: invariant.path,\n currentValue: value,\n suggestion: `Ensure the invariant \"${invariant.name}\" is always maintained.`,\n timestamp: mutation.timestamp,\n };\n }\n } catch (e) {\n // Rule threw an error\n return null;\n }\n\n return null;\n }\n\n /**\n * Analyze entire timeline for issues\n */\n analyzeTimeline(timeline: Mutation[]): Issue[] {\n const allIssues: Issue[] = [];\n this.updateTimestamps.clear();\n\n for (let i = 0; i < timeline.length; i++) {\n const issues = this.analyzeMutation(timeline[i], i, timeline);\n allIssues.push(...issues);\n }\n\n return allIssues;\n }\n\n /**\n * Build dependency graph showing which components touch which state paths\n */\n buildDependencyGraph(timeline: Mutation[]): DependencyGraph {\n const nodes = new Map<string, DependencyNode>();\n\n for (const mutation of timeline) {\n if (!mutation.diff) continue;\n\n const component = mutation.component || mutation.source || 'unknown';\n\n for (const diff of mutation.diff) {\n const existing = nodes.get(diff.path);\n\n if (existing) {\n existing.components.add(component);\n existing.mutationCount++;\n existing.lastMutationId = mutation.id;\n } else {\n nodes.set(diff.path, {\n path: diff.path,\n components: new Set([component]),\n mutationCount: 1,\n lastMutationId: mutation.id,\n });\n }\n }\n }\n\n // Find couplings (paths touched by multiple components)\n const couplings: DependencyGraph['couplings'] = [];\n\n for (const [path, node] of nodes) {\n if (node.components.size > 1) {\n couplings.push({\n path,\n components: Array.from(node.components),\n severity: node.components.size > 2 ? 'critical' : 'warning',\n });\n }\n }\n\n return { nodes, couplings };\n }\n\n /**\n * Find causal chain - which mutations caused downstream effects\n */\n findCausalChain(mutationId: string, timeline: Mutation[]): CausalChain | null {\n const rootIndex = timeline.findIndex(m => m.id === mutationId);\n if (rootIndex === -1) return null;\n\n const root = timeline[rootIndex];\n const effects: CausalChain['effects'] = [];\n\n // Find mutations that follow and depend on changed paths\n if (!root.diff) return { rootMutation: root, effects };\n\n const changedPaths = new Set(root.diff.map(d => d.path));\n\n for (let i = rootIndex + 1; i < timeline.length; i++) {\n const mutation = timeline[i];\n if (!mutation.diff) continue;\n\n // Check if this mutation reads from paths that root changed\n for (const diff of mutation.diff) {\n // Check if path overlaps with changed paths\n for (const changedPath of changedPaths) {\n if (diff.path.startsWith(changedPath) || changedPath.startsWith(diff.path)) {\n effects.push({\n mutation,\n causedBy: root.id,\n reason: `Uses path \"${diff.path}\" which was affected by \"${changedPath}\"`,\n });\n break;\n }\n }\n }\n }\n\n return { rootMutation: root, effects };\n }\n\n /**\n * Find the first mutation that corrupted state\n * Uses binary search for efficiency\n */\n findCorruptionPoint(\n timeline: Mutation[],\n validator: (state: unknown) => boolean\n ): { mutation: Mutation; index: number } | null {\n let left = 0;\n let right = timeline.length - 1;\n let result: { mutation: Mutation; index: number } | null = null;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const mutation = timeline[mid];\n\n if (mutation.nextState && !validator(mutation.nextState)) {\n // State is invalid here, corruption is at or before this point\n result = { mutation, index: mid };\n right = mid - 1;\n } else {\n // State is valid, corruption is after this point\n left = mid + 1;\n }\n }\n\n return result;\n }\n}\n\n/**\n * Helper to get value at a dot-path\n */\nfunction getValueAtPath(obj: unknown, path: string): unknown {\n if (!path) return obj;\n\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n// Export singleton instance\nexport const analyzer = new StateAnalyzer();\n","import React, { useCallback, useMemo, useState } from 'react';\nimport type { DependencyGraph as DG } from '../../core/analyzer';\n\nexport interface DependencyGraphProps {\n graph: DG;\n onPathSelect?: (path: string) => void;\n selectedPath?: string;\n className?: string;\n}\n\n/**\n * Dependency Graph - visual representation of state coupling\n */\nexport function DependencyGraph({\n graph,\n onPathSelect,\n selectedPath,\n className = '',\n}: DependencyGraphProps) {\n const [viewMode, setViewMode] = useState<'couplings' | 'all'>('couplings');\n const [hoveredPath, setHoveredPath] = useState<string | null>(null);\n\n // Sort nodes by mutation count\n const sortedNodes = useMemo(() => {\n const nodes = Array.from(graph.nodes.values());\n return nodes.sort((a, b) => b.mutationCount - a.mutationCount);\n }, [graph.nodes]);\n\n // Get unique components\n const allComponents = useMemo(() => {\n const components = new Set<string>();\n for (const node of graph.nodes.values()) {\n for (const c of node.components) {\n components.add(c);\n }\n }\n return Array.from(components);\n }, [graph.nodes]);\n\n // Component colors\n const componentColors = useMemo(() => {\n const colors: Record<string, string> = {};\n const palette = [\n '#61dafb', '#764abc', '#f59e0b', '#22c55e', '#ef4444',\n '#a78bfa', '#f472b6', '#06b6d4', '#84cc16', '#f97316',\n ];\n allComponents.forEach((comp, i) => {\n colors[comp] = palette[i % palette.length];\n });\n return colors;\n }, [allComponents]);\n\n const handlePathClick = useCallback((path: string) => {\n onPathSelect?.(path);\n }, [onPathSelect]);\n\n const displayNodes = viewMode === 'couplings'\n ? sortedNodes.filter(n => n.components.size > 1)\n : sortedNodes;\n\n return (\n <div className={`dependency-graph ${className}`}>\n <div className=\"dg-header\">\n <span className=\"dg-title\">🔗 State Dependencies</span>\n <div className=\"dg-controls\">\n <button\n className={`dg-view-btn ${viewMode === 'couplings' ? 'active' : ''}`}\n onClick={() => setViewMode('couplings')}\n >\n ⚠️ Couplings Only ({graph.couplings.length})\n </button>\n <button\n className={`dg-view-btn ${viewMode === 'all' ? 'active' : ''}`}\n onClick={() => setViewMode('all')}\n >\n 📊 All Paths ({graph.nodes.size})\n </button>\n </div>\n </div>\n\n {/* Component legend */}\n <div className=\"dg-legend\">\n {allComponents.map(comp => (\n <span\n key={comp}\n className=\"dg-legend-item\"\n style={{ '--comp-color': componentColors[comp] } as React.CSSProperties}\n >\n <span className=\"dg-legend-dot\"></span>\n {comp}\n </span>\n ))}\n </div>\n\n {/* Couplings alert */}\n {graph.couplings.length > 0 && viewMode === 'couplings' && (\n <div className=\"dg-alert\">\n <span className=\"dg-alert-icon\">⚠️</span>\n <div className=\"dg-alert-content\">\n <strong>Hidden State Coupling Detected</strong>\n <p>\n {graph.couplings.length} state path{graph.couplings.length > 1 ? 's are' : ' is'} accessed by multiple components.\n This can cause unexpected state conflicts.\n </p>\n </div>\n </div>\n )}\n\n {displayNodes.length === 0 && (\n <div className=\"dg-empty\">\n <span className=\"dg-empty-icon\">✅</span>\n <p>No state coupling detected</p>\n </div>\n )}\n\n {/* Paths list */}\n <div className=\"dg-paths\">\n {displayNodes.map(node => {\n const isCoupled = node.components.size > 1;\n const coupling = graph.couplings.find(c => c.path === node.path);\n\n return (\n <div\n key={node.path}\n className={`dg-path ${isCoupled ? 'dg-path--coupled' : ''} ${\n selectedPath === node.path ? 'selected' : ''\n } ${hoveredPath === node.path ? 'hovered' : ''}`}\n onClick={() => handlePathClick(node.path)}\n onMouseEnter={() => setHoveredPath(node.path)}\n onMouseLeave={() => setHoveredPath(null)}\n >\n <div className=\"dg-path-header\">\n <code className=\"dg-path-name\">{node.path}</code>\n <span className=\"dg-path-count\">\n {node.mutationCount} mutation{node.mutationCount > 1 ? 's' : ''}\n </span>\n </div>\n\n <div className=\"dg-path-components\">\n {Array.from(node.components).map(comp => (\n <span\n key={comp}\n className=\"dg-component-tag\"\n style={{\n backgroundColor: componentColors[comp] + '30',\n borderColor: componentColors[comp],\n color: componentColors[comp],\n }}\n >\n {comp}\n </span>\n ))}\n </div>\n\n {isCoupled && coupling && (\n <div className={`dg-coupling-warning dg-coupling-${coupling.severity}`}>\n <span className=\"dg-warning-icon\">\n {coupling.severity === 'critical' ? '🔴' : '🟡'}\n </span>\n <span className=\"dg-warning-text\">\n {coupling.components.length} components access this path\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Visual graph */}\n {displayNodes.length > 0 && displayNodes.length <= 20 && (\n <div className=\"dg-visual\">\n <div className=\"dg-visual-title\">Dependency Visualization</div>\n <svg className=\"dg-svg\" viewBox=\"0 0 400 300\">\n {/* Components as top row */}\n {allComponents.map((comp, i) => {\n const x = 50 + (i * (350 / Math.max(allComponents.length, 1)));\n return (\n <g key={comp}>\n <circle\n cx={x}\n cy={40}\n r={20}\n fill={componentColors[comp]}\n opacity={0.8}\n />\n <text\n x={x}\n y={75}\n textAnchor=\"middle\"\n fill=\"#888\"\n fontSize=\"10\"\n >\n {comp.length > 10 ? comp.slice(0, 10) + '...' : comp}\n </text>\n </g>\n );\n })}\n\n {/* State paths as bottom row */}\n {displayNodes.slice(0, 8).map((node, i) => {\n const x = 50 + (i * (350 / Math.max(displayNodes.length, 1)));\n const isCoupled = node.components.size > 1;\n\n return (\n <g key={node.path}>\n {/* Lines to components */}\n {Array.from(node.components).map(comp => {\n const compIndex = allComponents.indexOf(comp);\n const compX = 50 + (compIndex * (350 / Math.max(allComponents.length, 1)));\n return (\n <line\n key={comp}\n x1={compX}\n y1={60}\n x2={x}\n y2={180}\n stroke={componentColors[comp]}\n strokeWidth={isCoupled ? 2 : 1}\n opacity={isCoupled ? 0.8 : 0.3}\n />\n );\n })}\n\n <rect\n x={x - 25}\n y={180}\n width={50}\n height={24}\n rx={4}\n fill={isCoupled ? '#ef444430' : '#16213e'}\n stroke={isCoupled ? '#ef4444' : '#333'}\n />\n <text\n x={x}\n y={196}\n textAnchor=\"middle\"\n fill={isCoupled ? '#fca5a5' : '#888'}\n fontSize=\"8\"\n >\n {node.path.length > 8 ? node.path.slice(-8) : node.path}\n </text>\n </g>\n );\n })}\n\n {displayNodes.length > 8 && (\n <text x={200} y={250} textAnchor=\"middle\" fill=\"#666\" fontSize=\"12\">\n +{displayNodes.length - 8} more paths...\n </text>\n )}\n </svg>\n </div>\n )}\n\n <style>{styles}</style>\n </div>\n );\n}\n\nconst styles = `\n .dependency-graph {\n background: #1a1a2e;\n color: #e0e0e0;\n font-family: system-ui, sans-serif;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .dg-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 1rem;\n background: #16213e;\n border-bottom: 1px solid #333;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .dg-title {\n font-weight: 600;\n color: #00d9ff;\n }\n\n .dg-controls {\n display: flex;\n gap: 0.5rem;\n }\n\n .dg-view-btn {\n padding: 0.375rem 0.75rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: transparent;\n color: #888;\n font-size: 0.8rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .dg-view-btn:hover {\n background: #16213e;\n color: #ccc;\n }\n\n .dg-view-btn.active {\n background: #00d9ff20;\n border-color: #00d9ff;\n color: #00d9ff;\n }\n\n .dg-legend {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n padding: 0.75rem 1rem;\n background: #0f0f23;\n border-bottom: 1px solid #333;\n }\n\n .dg-legend-item {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.8rem;\n color: #888;\n }\n\n .dg-legend-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--comp-color);\n }\n\n .dg-alert {\n display: flex;\n gap: 0.75rem;\n padding: 1rem;\n margin: 0.75rem;\n background: #ef444420;\n border: 1px solid #ef4444;\n border-radius: 8px;\n }\n\n .dg-alert-icon {\n font-size: 1.25rem;\n }\n\n .dg-alert-content strong {\n color: #fca5a5;\n display: block;\n margin-bottom: 0.25rem;\n }\n\n .dg-alert-content p {\n margin: 0;\n font-size: 0.875rem;\n color: #ccc;\n }\n\n .dg-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #888;\n }\n\n .dg-empty-icon {\n font-size: 2.5rem;\n margin-bottom: 0.5rem;\n }\n\n .dg-paths {\n flex: 1;\n overflow: auto;\n padding: 0.75rem;\n }\n\n .dg-path {\n background: #16213e;\n border-radius: 8px;\n padding: 0.875rem 1rem;\n margin-bottom: 0.625rem;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.2s;\n }\n\n .dg-path:hover, .dg-path.hovered {\n border-color: #333;\n background: #1a2744;\n }\n\n .dg-path.selected {\n border-color: #00d9ff;\n box-shadow: 0 0 0 2px #00d9ff30;\n }\n\n .dg-path--coupled {\n border-left: 3px solid #ef4444;\n }\n\n .dg-path-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n }\n\n .dg-path-name {\n font-family: 'Fira Code', monospace;\n color: #a78bfa;\n font-size: 0.875rem;\n }\n\n .dg-path-count {\n font-size: 0.75rem;\n color: #666;\n }\n\n .dg-path-components {\n display: flex;\n flex-wrap: wrap;\n gap: 0.375rem;\n }\n\n .dg-component-tag {\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n border: 1px solid;\n }\n\n .dg-coupling-warning {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n margin-top: 0.625rem;\n padding: 0.375rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n }\n\n .dg-coupling-critical {\n background: #ef444420;\n color: #fca5a5;\n }\n\n .dg-coupling-warning {\n background: #fbbf2420;\n color: #fcd34d;\n }\n\n .dg-visual {\n padding: 1rem;\n border-top: 1px solid #333;\n }\n\n .dg-visual-title {\n font-size: 0.8rem;\n color: #888;\n margin-bottom: 0.5rem;\n }\n\n .dg-svg {\n width: 100%;\n max-height: 200px;\n background: #0f0f23;\n border-radius: 8px;\n }\n`;\n","import { useMemo, useState } from 'react';\nimport type { Issue, IssueCategory, IssueSeverity } from '../../core/analyzer';\n\nexport interface IssuesPanelProps {\n issues: Issue[];\n onJumpToMutation: (mutationId: string, index: number) => void;\n onSelectIssue?: (issue: Issue) => void;\n selectedIssueId?: string;\n className?: string;\n}\n\nconst severityIcons: Record<IssueSeverity, string> = {\n critical: '🔴',\n warning: '🟡',\n info: '🟢',\n};\n\nconst severityColors: Record<IssueSeverity, string> = {\n critical: '#ef4444',\n warning: '#fbbf24',\n info: '#22c55e',\n};\n\nconst categoryIcons: Record<IssueCategory, string> = {\n 'state-loss': '📤',\n 'invalid-value': '⚠️',\n 'type-change': '🔄',\n 'no-op-update': '♻️',\n 'excessive-updates': '⚡',\n 'broken-invariant': '🚫',\n 'hidden-coupling': '🔗',\n 'temporal-anomaly': '⏰',\n 'state-corruption': '💥',\n};\n\nconst categoryLabels: Record<IssueCategory, string> = {\n 'state-loss': 'State Loss',\n 'invalid-value': 'Invalid Value',\n 'type-change': 'Type Change',\n 'no-op-update': 'Redundant Update',\n 'excessive-updates': 'Excessive Updates',\n 'broken-invariant': 'Broken Invariant',\n 'hidden-coupling': 'Hidden Coupling',\n 'temporal-anomaly': 'Temporal Anomaly',\n 'state-corruption': 'State Corruption',\n};\n\n/**\n * Issues Panel - displays categorized list of detected issues\n */\nexport function IssuesPanel({\n issues,\n onJumpToMutation,\n onSelectIssue,\n selectedIssueId,\n className = '',\n}: IssuesPanelProps) {\n const [severityFilter, setSeverityFilter] = useState<IssueSeverity | 'all'>('all');\n const [categoryFilter, setCategoryFilter] = useState<IssueCategory | 'all'>('all');\n const [expandedIssue, setExpandedIssue] = useState<string | null>(null);\n\n // Filter issues\n const filteredIssues = useMemo(() => {\n return issues.filter(issue => {\n if (severityFilter !== 'all' && issue.severity !== severityFilter) return false;\n if (categoryFilter !== 'all' && issue.category !== categoryFilter) return false;\n return true;\n });\n }, [issues, severityFilter, categoryFilter]);\n\n // Group by category for summary\n const issueSummary = useMemo(() => {\n const summary: Record<IssueSeverity, number> = { critical: 0, warning: 0, info: 0 };\n for (const issue of issues) {\n summary[issue.severity]++;\n }\n return summary;\n }, [issues]);\n\n // Get unique categories in current issues\n const availableCategories = useMemo(() => {\n return Array.from(new Set(issues.map(i => i.category)));\n }, [issues]);\n\n const handleIssueClick = (issue: Issue) => {\n if (expandedIssue === issue.id) {\n setExpandedIssue(null);\n } else {\n setExpandedIssue(issue.id);\n onSelectIssue?.(issue);\n }\n };\n\n if (issues.length === 0) {\n return (\n <div className={`issues-panel issues-panel--empty ${className}`}>\n <div className=\"ip-empty\">\n <span className=\"ip-empty-icon\">✅</span>\n <h3>No Issues Detected</h3>\n <p>Your state timeline looks clean!</p>\n </div>\n <style>{styles}</style>\n </div>\n );\n }\n\n return (\n <div className={`issues-panel ${className}`}>\n {/* Summary bar */}\n <div className=\"ip-summary\">\n <div className=\"ip-summary-title\">\n <span className=\"ip-summary-icon\">🚨</span>\n <span>{issues.length} Issue{issues.length !== 1 ? 's' : ''} Detected</span>\n </div>\n <div className=\"ip-summary-counts\">\n {issueSummary.critical > 0 && (\n <span className=\"ip-count ip-count--critical\">\n {severityIcons.critical} {issueSummary.critical}\n </span>\n )}\n {issueSummary.warning > 0 && (\n <span className=\"ip-count ip-count--warning\">\n {severityIcons.warning} {issueSummary.warning}\n </span>\n )}\n {issueSummary.info > 0 && (\n <span className=\"ip-count ip-count--info\">\n {severityIcons.info} {issueSummary.info}\n </span>\n )}\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"ip-filters\">\n <select\n value={severityFilter}\n onChange={e => setSeverityFilter(e.target.value as IssueSeverity | 'all')}\n className=\"ip-filter\"\n >\n <option value=\"all\">All Severities</option>\n <option value=\"critical\">🔴 Critical</option>\n <option value=\"warning\">🟡 Warning</option>\n <option value=\"info\">🟢 Info</option>\n </select>\n\n <select\n value={categoryFilter}\n onChange={e => setCategoryFilter(e.target.value as IssueCategory | 'all')}\n className=\"ip-filter\"\n >\n <option value=\"all\">All Categories</option>\n {availableCategories.map(cat => (\n <option key={cat} value={cat}>\n {categoryIcons[cat]} {categoryLabels[cat]}\n </option>\n ))}\n </select>\n </div>\n\n {/* Issues list */}\n <div className=\"ip-list\">\n {filteredIssues.map(issue => (\n <div\n key={issue.id}\n className={`ip-issue ip-issue--${issue.severity} ${\n selectedIssueId === issue.id ? 'selected' : ''\n } ${expandedIssue === issue.id ? 'expanded' : ''}`}\n onClick={() => handleIssueClick(issue)}\n >\n <div className=\"ip-issue-header\">\n <span className=\"ip-issue-severity\">{severityIcons[issue.severity]}</span>\n <span className=\"ip-issue-category\">{categoryIcons[issue.category]}</span>\n <span className=\"ip-issue-title\">{issue.title}</span>\n <span className=\"ip-issue-index\">#{issue.mutationIndex + 1}</span>\n </div>\n\n {expandedIssue === issue.id && (\n <div className=\"ip-issue-details\">\n <p className=\"ip-issue-description\">{issue.description}</p>\n\n {issue.path && (\n <div className=\"ip-issue-field\">\n <span className=\"ip-field-label\">Path:</span>\n <code className=\"ip-field-value\">{issue.path}</code>\n </div>\n )}\n\n {issue.previousValue !== undefined && (\n <div className=\"ip-issue-field\">\n <span className=\"ip-field-label\">Before:</span>\n <code className=\"ip-field-value ip-value-old\">\n {formatValue(issue.previousValue)}\n </code>\n </div>\n )}\n\n {issue.currentValue !== undefined && (\n <div className=\"ip-issue-field\">\n <span className=\"ip-field-label\">After:</span>\n <code className={`ip-field-value ip-value-new ${\n issue.severity === 'critical' ? 'ip-value-bad' : ''\n }`}>\n {formatValue(issue.currentValue)}\n </code>\n </div>\n )}\n\n {issue.suggestion && (\n <div className=\"ip-issue-suggestion\">\n <span className=\"ip-suggestion-icon\">💡</span>\n <span>{issue.suggestion}</span>\n </div>\n )}\n\n <div className=\"ip-issue-actions\">\n <button\n className=\"ip-action-btn\"\n onClick={(e) => {\n e.stopPropagation();\n onJumpToMutation(issue.mutationId, issue.mutationIndex);\n }}\n >\n 🎯 Jump to Mutation\n </button>\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n\n <style>{styles}</style>\n </div>\n );\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'number' && isNaN(value)) return 'NaN';\n if (typeof value === 'object') {\n const str = JSON.stringify(value);\n return str.length > 50 ? str.slice(0, 50) + '...' : str;\n }\n return String(value);\n}\n\nconst styles = `\n .issues-panel {\n background: #1a1a2e;\n color: #e0e0e0;\n font-family: system-ui, sans-serif;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .issues-panel--empty {\n align-items: center;\n justify-content: center;\n }\n\n .ip-empty {\n text-align: center;\n padding: 3rem;\n }\n\n .ip-empty-icon {\n font-size: 4rem;\n display: block;\n margin-bottom: 1rem;\n }\n\n .ip-empty h3 {\n margin: 0 0 0.5rem;\n color: #22c55e;\n }\n\n .ip-empty p {\n margin: 0;\n color: #888;\n }\n\n .ip-summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n background: linear-gradient(135deg, #ef444420, #fbbf2410);\n border-bottom: 1px solid #333;\n }\n\n .ip-summary-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-weight: 600;\n color: #fca5a5;\n }\n\n .ip-summary-icon {\n font-size: 1.25rem;\n }\n\n .ip-summary-counts {\n display: flex;\n gap: 0.75rem;\n }\n\n .ip-count {\n padding: 0.25rem 0.75rem;\n border-radius: 12px;\n font-size: 0.875rem;\n font-weight: 600;\n }\n\n .ip-count--critical { background: #ef444430; color: #fca5a5; }\n .ip-count--warning { background: #fbbf2430; color: #fcd34d; }\n .ip-count--info { background: #22c55e30; color: #86efac; }\n\n .ip-filters {\n display: flex;\n gap: 0.75rem;\n padding: 0.75rem 1.25rem;\n background: #16213e;\n border-bottom: 1px solid #333;\n }\n\n .ip-filter {\n flex: 1;\n padding: 0.5rem 0.75rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: #0f0f23;\n color: #e0e0e0;\n font-size: 0.875rem;\n cursor: pointer;\n }\n\n .ip-list {\n flex: 1;\n overflow: auto;\n padding: 0.75rem;\n }\n\n .ip-issue {\n background: #16213e;\n border-radius: 8px;\n margin-bottom: 0.75rem;\n border-left: 4px solid;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .ip-issue:hover {\n background: #1a2744;\n }\n\n .ip-issue--critical { border-left-color: #ef4444; }\n .ip-issue--warning { border-left-color: #fbbf24; }\n .ip-issue--info { border-left-color: #22c55e; }\n\n .ip-issue.selected {\n box-shadow: 0 0 0 2px #00d9ff40;\n }\n\n .ip-issue-header {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.875rem 1rem;\n }\n\n .ip-issue-severity {\n font-size: 0.875rem;\n }\n\n .ip-issue-category {\n font-size: 1rem;\n }\n\n .ip-issue-title {\n flex: 1;\n font-size: 0.875rem;\n font-weight: 500;\n }\n\n .ip-issue-index {\n font-size: 0.75rem;\n color: #666;\n font-family: 'Fira Code', monospace;\n }\n\n .ip-issue-details {\n padding: 0 1rem 1rem;\n border-top: 1px solid #333;\n margin-top: 0.5rem;\n padding-top: 0.75rem;\n }\n\n .ip-issue-description {\n margin: 0 0 1rem;\n font-size: 0.875rem;\n color: #ccc;\n line-height: 1.5;\n }\n\n .ip-issue-field {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 0.875rem;\n }\n\n .ip-field-label {\n color: #888;\n min-width: 50px;\n }\n\n .ip-field-value {\n font-family: 'Fira Code', monospace;\n padding: 0.25rem 0.5rem;\n background: #0f0f23;\n border-radius: 4px;\n font-size: 0.8rem;\n }\n\n .ip-value-old {\n color: #fca5a5;\n background: #ef444420;\n }\n\n .ip-value-new {\n color: #86efac;\n background: #22c55e20;\n }\n\n .ip-value-bad {\n color: #fca5a5 !important;\n background: #ef444420 !important;\n }\n\n .ip-issue-suggestion {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-top: 1rem;\n padding: 0.75rem;\n background: #0f0f23;\n border-radius: 6px;\n font-size: 0.8rem;\n color: #a78bfa;\n }\n\n .ip-suggestion-icon {\n flex-shrink: 0;\n }\n\n .ip-issue-actions {\n margin-top: 1rem;\n display: flex;\n gap: 0.5rem;\n }\n\n .ip-action-btn {\n padding: 0.5rem 1rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: #0f0f23;\n color: #e0e0e0;\n font-size: 0.8rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .ip-action-btn:hover {\n background: #16213e;\n border-color: #00d9ff;\n color: #00d9ff;\n }\n`;\n","import React, { useCallback, useMemo, useState } from 'react';\n\nexport interface StateTreeViewerProps {\n /** State object to display */\n state: unknown;\n\n /** Paths that have issues */\n issuePaths?: Set<string>;\n\n /** Paths that changed in current mutation */\n changedPaths?: Set<string>;\n\n /** Paths that were removed */\n removedPaths?: Set<string>;\n\n /** Default expand depth */\n defaultExpandDepth?: number;\n\n /** Search query to filter/highlight */\n searchQuery?: string;\n\n /** Callback when a path is clicked */\n onPathClick?: (path: string, value: unknown) => void;\n\n /** Custom class name */\n className?: string;\n}\n\ntype ValueType = 'null' | 'undefined' | 'boolean' | 'number' | 'string' | 'array' | 'object' | 'nan' | 'function';\n\nfunction getValueType(value: unknown): ValueType {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'number' && isNaN(value)) return 'nan';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'function') return 'function';\n return typeof value as ValueType;\n}\n\nconst typeIcons: Record<ValueType, string> = {\n null: '⊘',\n undefined: '❓',\n boolean: '◉',\n number: '#',\n string: '\"',\n array: '[]',\n object: '{}',\n nan: '⚠️',\n function: 'ƒ',\n};\n\nconst typeColors: Record<ValueType, string> = {\n null: '#f472b6',\n undefined: '#ef4444',\n boolean: '#fb923c',\n number: '#22c55e',\n string: '#fbbf24',\n array: '#a78bfa',\n object: '#60a5fa',\n nan: '#ef4444',\n function: '#888',\n};\n\n/**\n * State Tree Viewer - collapsible tree with inline anomaly badges\n */\nexport function StateTreeViewer({\n state,\n issuePaths = new Set(),\n changedPaths = new Set(),\n removedPaths = new Set(),\n defaultExpandDepth = 3,\n searchQuery = '',\n onPathClick,\n className = '',\n}: StateTreeViewerProps) {\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(new Set());\n const [copiedPath, setCopiedPath] = useState<string | null>(null);\n\n const toggleExpand = useCallback((path: string) => {\n setExpandedPaths(prev => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const copyPath = useCallback((path: string, e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(path);\n setCopiedPath(path);\n setTimeout(() => setCopiedPath(null), 2000);\n }, []);\n\n const copyValue = useCallback((value: unknown, e: React.MouseEvent) => {\n e.stopPropagation();\n const text = typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value);\n navigator.clipboard.writeText(text);\n }, []);\n\n // Expand all paths that match search\n const matchingPaths = useMemo(() => {\n if (!searchQuery) return new Set<string>();\n const matches = new Set<string>();\n\n function traverse(obj: unknown, path: string) {\n if (!obj || typeof obj !== 'object') return;\n\n for (const key of Object.keys(obj)) {\n const fullPath = path ? `${path}.${key}` : key;\n if (fullPath.toLowerCase().includes(searchQuery.toLowerCase())) {\n matches.add(fullPath);\n // Add all parent paths\n const parts = fullPath.split('.');\n for (let i = 1; i < parts.length; i++) {\n matches.add(parts.slice(0, i).join('.'));\n }\n }\n traverse((obj as Record<string, unknown>)[key], fullPath);\n }\n }\n\n traverse(state, '');\n return matches;\n }, [state, searchQuery]);\n\n return (\n <div className={`state-tree-viewer ${className}`}>\n <div className=\"stv-header\">\n <span className=\"stv-title\">🌳 State Tree</span>\n <div className=\"stv-legend\">\n <span className=\"stv-legend-item stv-legend-changed\">● Changed</span>\n <span className=\"stv-legend-item stv-legend-removed\">● Removed</span>\n <span className=\"stv-legend-item stv-legend-issue\">● Issue</span>\n </div>\n </div>\n\n <div className=\"stv-tree\">\n <TreeNode\n value={state}\n path=\"\"\n depth={0}\n issuePaths={issuePaths}\n changedPaths={changedPaths}\n removedPaths={removedPaths}\n expandedPaths={expandedPaths}\n matchingPaths={matchingPaths}\n defaultExpandDepth={defaultExpandDepth}\n searchQuery={searchQuery}\n copiedPath={copiedPath}\n onToggle={toggleExpand}\n onCopyPath={copyPath}\n onCopyValue={copyValue}\n onPathClick={onPathClick}\n />\n </div>\n\n <style>{styles}</style>\n </div>\n );\n}\n\ninterface TreeNodeProps {\n value: unknown;\n path: string;\n depth: number;\n keyName?: string;\n issuePaths: Set<string>;\n changedPaths: Set<string>;\n removedPaths: Set<string>;\n expandedPaths: Set<string>;\n matchingPaths: Set<string>;\n defaultExpandDepth: number;\n searchQuery: string;\n copiedPath: string | null;\n onToggle: (path: string) => void;\n onCopyPath: (path: string, e: React.MouseEvent) => void;\n onCopyValue: (value: unknown, e: React.MouseEvent) => void;\n onPathClick?: (path: string, value: unknown) => void;\n}\n\nfunction TreeNode({\n value,\n path,\n depth,\n keyName,\n issuePaths,\n changedPaths,\n removedPaths,\n expandedPaths,\n matchingPaths,\n defaultExpandDepth,\n searchQuery,\n copiedPath,\n onToggle,\n onCopyPath,\n onCopyValue,\n onPathClick,\n}: TreeNodeProps) {\n const valueType = getValueType(value);\n const hasIssue = path ? issuePaths.has(path) : false;\n const isChanged = path ? changedPaths.has(path) : false;\n const isRemoved = path ? removedPaths.has(path) : false;\n const isMatch = path ? matchingPaths.has(path) : false;\n\n const isExpandable = valueType === 'object' || valueType === 'array';\n const isExpanded = expandedPaths.has(path) ||\n (depth < defaultExpandDepth && !expandedPaths.has(path)) ||\n isMatch;\n\n const entries = isExpandable && value\n ? Object.entries(value as Record<string, unknown>)\n : [];\n\n const handleClick = () => {\n if (isExpandable) {\n onToggle(path);\n } else if (onPathClick) {\n onPathClick(path, value);\n }\n };\n\n // Highlight matching text\n const highlightKey = (key: string) => {\n if (!searchQuery) return key;\n const idx = key.toLowerCase().indexOf(searchQuery.toLowerCase());\n if (idx === -1) return key;\n return (\n <>\n {key.slice(0, idx)}\n <span className=\"stv-highlight\">{key.slice(idx, idx + searchQuery.length)}</span>\n {key.slice(idx + searchQuery.length)}\n </>\n );\n };\n\n return (\n <div className={`stv-node ${depth === 0 ? 'stv-root' : ''}`}>\n <div\n className={`stv-row ${isExpandable ? 'stv-expandable' : ''} ${\n hasIssue ? 'stv-has-issue' : ''\n } ${isChanged ? 'stv-changed' : ''} ${isRemoved ? 'stv-removed' : ''} ${\n isMatch ? 'stv-match' : ''\n }`}\n onClick={handleClick}\n >\n {/* Expand/collapse indicator */}\n {isExpandable ? (\n <span className=\"stv-toggle\">\n {isExpanded ? '▼' : '▶'}\n </span>\n ) : (\n <span className=\"stv-toggle stv-toggle-spacer\"></span>\n )}\n\n {/* Key name */}\n {keyName !== undefined && (\n <span className=\"stv-key\">\n {highlightKey(keyName)}\n <span className=\"stv-colon\">:</span>\n </span>\n )}\n\n {/* Type icon */}\n <span\n className=\"stv-type-icon\"\n style={{ color: typeColors[valueType] }}\n title={valueType}\n >\n {typeIcons[valueType]}\n </span>\n\n {/* Value preview */}\n <span className={`stv-value stv-value-${valueType}`}>\n {renderValue(value, valueType, isExpanded)}\n </span>\n\n {/* Badges */}\n <span className=\"stv-badges\">\n {hasIssue && <span className=\"stv-badge stv-badge-issue\" title=\"Has issue\">⚠️</span>}\n {isChanged && <span className=\"stv-badge stv-badge-changed\" title=\"Changed\">●</span>}\n {isRemoved && <span className=\"stv-badge stv-badge-removed\" title=\"Removed\">✕</span>}\n {valueType === 'nan' && <span className=\"stv-badge stv-badge-nan\">NaN!</span>}\n {valueType === 'undefined' && <span className=\"stv-badge stv-badge-undefined\">undef</span>}\n </span>\n\n {/* Actions */}\n <span className=\"stv-actions\">\n <button\n className=\"stv-action\"\n onClick={(e) => onCopyPath(path, e)}\n title=\"Copy path\"\n >\n {copiedPath === path ? '✓' : '📋'}\n </button>\n <button\n className=\"stv-action\"\n onClick={(e) => onCopyValue(value, e)}\n title=\"Copy value\"\n >\n 📄\n </button>\n </span>\n </div>\n\n {/* Children */}\n {isExpandable && isExpanded && entries.length > 0 && (\n <div className=\"stv-children\">\n {entries.map(([childKey, childValue]) => {\n const childPath = path ? `${path}.${childKey}` : childKey;\n return (\n <TreeNode\n key={childPath}\n value={childValue}\n path={childPath}\n depth={depth + 1}\n keyName={childKey}\n issuePaths={issuePaths}\n changedPaths={changedPaths}\n removedPaths={removedPaths}\n expandedPaths={expandedPaths}\n matchingPaths={matchingPaths}\n defaultExpandDepth={defaultExpandDepth}\n searchQuery={searchQuery}\n copiedPath={copiedPath}\n onToggle={onToggle}\n onCopyPath={onCopyPath}\n onCopyValue={onCopyValue}\n onPathClick={onPathClick}\n />\n );\n })}\n </div>\n )}\n\n {isExpandable && isExpanded && entries.length === 0 && (\n <div className=\"stv-children\">\n <span className=\"stv-empty\">(empty)</span>\n </div>\n )}\n </div>\n );\n}\n\nfunction renderValue(value: unknown, valueType: ValueType, isExpanded: boolean): React.ReactNode {\n switch (valueType) {\n case 'null':\n return 'null';\n case 'undefined':\n return 'undefined';\n case 'nan':\n return 'NaN';\n case 'boolean':\n return String(value);\n case 'number':\n return String(value);\n case 'string':\n const str = value as string;\n const display = str.length > 50 ? str.slice(0, 50) + '...' : str;\n return `\"${display}\"`;\n case 'array':\n if (!isExpanded) {\n const arr = value as unknown[];\n return `Array(${arr.length})`;\n }\n return '';\n case 'object':\n if (!isExpanded) {\n const obj = value as object;\n const keys = Object.keys(obj);\n return `{${keys.length} keys}`;\n }\n return '';\n case 'function':\n return 'function()';\n default:\n return String(value);\n }\n}\n\nconst styles = `\n .state-tree-viewer {\n background: #1a1a2e;\n color: #e0e0e0;\n font-family: system-ui, sans-serif;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .stv-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 1rem;\n background: #16213e;\n border-bottom: 1px solid #333;\n }\n\n .stv-title {\n font-weight: 600;\n color: #00d9ff;\n }\n\n .stv-legend {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n }\n\n .stv-legend-item {\n opacity: 0.7;\n }\n\n .stv-legend-changed { color: #fbbf24; }\n .stv-legend-removed { color: #ef4444; }\n .stv-legend-issue { color: #f472b6; }\n\n .stv-tree {\n flex: 1;\n overflow: auto;\n padding: 0.75rem;\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 0.875rem;\n }\n\n .stv-node {\n line-height: 1.6;\n }\n\n .stv-row {\n display: flex;\n align-items: center;\n padding: 0.125rem 0.25rem;\n border-radius: 4px;\n cursor: default;\n }\n\n .stv-row:hover {\n background: #16213e;\n }\n\n .stv-expandable {\n cursor: pointer;\n }\n\n .stv-toggle {\n width: 1rem;\n font-size: 0.7rem;\n color: #666;\n }\n\n .stv-toggle-spacer {\n visibility: hidden;\n }\n\n .stv-key {\n color: #a78bfa;\n margin-right: 0.375rem;\n }\n\n .stv-colon {\n color: #666;\n }\n\n .stv-type-icon {\n font-size: 0.75rem;\n width: 1.25rem;\n text-align: center;\n opacity: 0.7;\n }\n\n .stv-value {\n flex: 1;\n }\n\n .stv-value-null { color: #f472b6; font-style: italic; }\n .stv-value-undefined { color: #ef4444; font-style: italic; }\n .stv-value-nan { color: #ef4444; font-weight: bold; }\n .stv-value-boolean { color: #fb923c; }\n .stv-value-number { color: #22c55e; }\n .stv-value-string { color: #fbbf24; }\n .stv-value-array { color: #a78bfa; }\n .stv-value-object { color: #60a5fa; }\n .stv-value-function { color: #888; font-style: italic; }\n\n .stv-badges {\n display: flex;\n gap: 0.25rem;\n margin-left: 0.5rem;\n }\n\n .stv-badge {\n font-size: 0.7rem;\n padding: 0 0.25rem;\n border-radius: 3px;\n }\n\n .stv-badge-issue {\n background: #f472b640;\n }\n\n .stv-badge-changed {\n color: #fbbf24;\n }\n\n .stv-badge-removed {\n color: #ef4444;\n background: #ef444430;\n padding: 0 0.375rem;\n }\n\n .stv-badge-nan, .stv-badge-undefined {\n background: #ef444440;\n color: #fca5a5;\n padding: 0.125rem 0.375rem;\n font-weight: 600;\n }\n\n .stv-actions {\n display: none;\n gap: 0.25rem;\n margin-left: 0.5rem;\n }\n\n .stv-row:hover .stv-actions {\n display: flex;\n }\n\n .stv-action {\n padding: 0.125rem 0.375rem;\n border: none;\n background: transparent;\n color: #666;\n cursor: pointer;\n font-size: 0.75rem;\n border-radius: 3px;\n }\n\n .stv-action:hover {\n background: #333;\n color: #fff;\n }\n\n .stv-children {\n margin-left: 1.25rem;\n border-left: 1px solid #333;\n padding-left: 0.5rem;\n }\n\n .stv-empty {\n color: #666;\n font-style: italic;\n font-size: 0.8rem;\n padding: 0.25rem 0;\n }\n\n .stv-has-issue {\n background: #f472b620 !important;\n }\n\n .stv-changed {\n background: #fbbf2420 !important;\n }\n\n .stv-removed {\n background: #ef444420 !important;\n text-decoration: line-through;\n opacity: 0.7;\n }\n\n .stv-match .stv-key {\n background: #fbbf2440;\n padding: 0 0.25rem;\n border-radius: 2px;\n }\n\n .stv-highlight {\n background: #fbbf2480;\n padding: 0 0.125rem;\n border-radius: 2px;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport type { Mutation } from '../core/mutation';\n\n/**\n * Dashboard context for sharing state\n */\ninterface DashboardState {\n serverUrl: string;\n sessions: Session[];\n currentSession: Session | null;\n timeline: Mutation[];\n selectedMutation: Mutation | null;\n isLoading: boolean;\n error: string | null;\n}\n\ninterface Session {\n id: string;\n appId: string;\n startTime: string;\n endTime?: string;\n mutationCount: number;\n}\n\ninterface DashboardActions {\n loadSessions: () => Promise<void>;\n selectSession: (sessionId: string) => Promise<void>;\n selectMutation: (mutation: Mutation | null) => void;\n refreshTimeline: () => Promise<void>;\n}\n\ntype DashboardContextValue = DashboardState & DashboardActions;\n\nconst DashboardContext = React.createContext<DashboardContextValue | null>(null);\n\n/**\n * Dashboard provider component\n */\nexport function DashboardProvider({\n serverUrl = 'http://localhost:8080',\n children,\n}: {\n serverUrl?: string;\n children: React.ReactNode;\n}) {\n const [state, setState] = useState<DashboardState>({\n serverUrl,\n sessions: [],\n currentSession: null,\n timeline: [],\n selectedMutation: null,\n isLoading: false,\n error: null,\n });\n\n const loadSessions = async () => {\n setState(s => ({ ...s, isLoading: true, error: null }));\n try {\n const res = await fetch(`${serverUrl}/api/sessions`);\n const data = await res.json();\n setState(s => ({ ...s, sessions: data.sessions, isLoading: false }));\n } catch (error) {\n setState(s => ({ ...s, error: String(error), isLoading: false }));\n }\n };\n\n const selectSession = async (sessionId: string) => {\n const session = state.sessions.find(s => s.id === sessionId);\n if (!session) return;\n\n setState(s => ({ ...s, currentSession: session, isLoading: true }));\n\n try {\n const res = await fetch(`${serverUrl}/api/sessions/${sessionId}/timeline`);\n const data = await res.json();\n setState(s => ({\n ...s,\n timeline: data.timeline,\n selectedMutation: data.timeline[0] || null,\n isLoading: false\n }));\n } catch (error) {\n setState(s => ({ ...s, error: String(error), isLoading: false }));\n }\n };\n\n const selectMutation = (mutation: Mutation | null) => {\n setState(s => ({ ...s, selectedMutation: mutation }));\n };\n\n const refreshTimeline = async () => {\n if (!state.currentSession) return;\n await selectSession(state.currentSession.id);\n };\n\n useEffect(() => {\n loadSessions();\n }, [serverUrl]);\n\n const value: DashboardContextValue = {\n ...state,\n loadSessions,\n selectSession,\n selectMutation,\n refreshTimeline,\n };\n\n return (\n <DashboardContext.Provider value={value}>\n {children}\n </DashboardContext.Provider>\n );\n}\n\n/**\n * Hook to access dashboard state and actions\n */\nexport function useDashboard(): DashboardContextValue {\n const context = React.useContext(DashboardContext);\n if (!context) {\n throw new Error('useDashboard must be used within a DashboardProvider');\n }\n return context;\n}\n\n/**\n * Hook for timeline playback\n */\nexport function usePlayback(timeline: Mutation[]) {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isPlaying, setIsPlaying] = useState(false);\n const [playbackSpeed, setPlaybackSpeed] = useState(1);\n\n useEffect(() => {\n if (!isPlaying || timeline.length === 0) return;\n\n const interval = setInterval(() => {\n setCurrentIndex(i => {\n if (i >= timeline.length - 1) {\n setIsPlaying(false);\n return i;\n }\n return i + 1;\n });\n }, 500 / playbackSpeed);\n\n return () => clearInterval(interval);\n }, [isPlaying, timeline.length, playbackSpeed]);\n\n return {\n currentIndex,\n currentMutation: timeline[currentIndex] || null,\n isPlaying,\n play: () => setIsPlaying(true),\n pause: () => setIsPlaying(false),\n stepForward: () => setCurrentIndex(i => Math.min(i + 1, timeline.length - 1)),\n stepBackward: () => setCurrentIndex(i => Math.max(i - 1, 0)),\n goTo: (index: number) => setCurrentIndex(Math.max(0, Math.min(index, timeline.length - 1))),\n setSpeed: setPlaybackSpeed,\n playbackSpeed,\n };\n}\n\n/**\n * Hook for fetching mutation details\n */\nexport function useMutationDetails(mutationId: string | null, serverUrl: string) {\n const [state, setState] = useState<{\n previousState: unknown;\n nextState: unknown;\n isLoading: boolean;\n error: string | null;\n }>({\n previousState: null,\n nextState: null,\n isLoading: false,\n error: null,\n });\n\n useEffect(() => {\n if (!mutationId) return;\n\n setState(s => ({ ...s, isLoading: true }));\n\n fetch(`${serverUrl}/api/mutations/${mutationId}`)\n .then(res => res.json())\n .then(data => {\n setState({\n previousState: data.mutation.previousState,\n nextState: data.mutation.nextState,\n isLoading: false,\n error: null,\n });\n })\n .catch(error => {\n setState(s => ({ ...s, error: String(error), isLoading: false }));\n });\n }, [mutationId, serverUrl]);\n\n return state;\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { StateAnalyzer } from '../core/analyzer';\nimport type { StateDiff } from '../core/mutation';\nimport { DependencyGraph } from './components/DependencyGraph';\nimport { IssuesPanel } from './components/IssuesPanel';\nimport { MutationInspector } from './components/MutationInspector';\nimport { StateDiffViewer } from './components/StateDiffViewer';\nimport { StateTreeViewer } from './components/StateTreeViewer';\nimport { TimelineScrubber } from './components/TimelineScrubber';\nimport { DashboardProvider, useDashboard, usePlayback } from './hooks/useDashboard';\n\nexport interface DashboardProps {\n /** Server URL (default: http://localhost:8080) */\n serverUrl?: string;\n}\n\n/**\n * Main State Surgeon Dashboard v2.0 component\n */\nexport function StateSurgeonDashboard({ serverUrl = 'http://localhost:8080' }: DashboardProps) {\n return (\n <DashboardProvider serverUrl={serverUrl}>\n <DashboardContent />\n </DashboardProvider>\n );\n}\n\ntype MainTab = 'issues' | 'timeline' | 'graph';\ntype DetailTab = 'tree' | 'diff' | 'inspector';\n\nfunction DashboardContent() {\n const {\n sessions,\n currentSession,\n timeline,\n selectedMutation,\n isLoading,\n error,\n selectSession,\n selectMutation,\n loadSessions,\n } = useDashboard();\n\n const playback = usePlayback(timeline);\n const [mainTab, setMainTab] = useState<MainTab>('issues');\n const [detailTab, setDetailTab] = useState<DetailTab>('tree');\n const [autoRefresh, setAutoRefresh] = useState(true);\n const [searchQuery, setSearchQuery] = useState('');\n\n // Create analyzer instance\n const analyzer = useMemo(() => new StateAnalyzer(), []);\n\n // Analyze timeline for issues\n const issues = useMemo(() => {\n return analyzer.analyzeTimeline(timeline);\n }, [analyzer, timeline]);\n\n // Build dependency graph\n const dependencyGraph = useMemo(() => {\n return analyzer.buildDependencyGraph(timeline);\n }, [analyzer, timeline]);\n\n // Get issue paths for highlighting\n const issuePaths = useMemo(() => {\n return new Set(issues.filter(i => i.path).map(i => i.path!));\n }, [issues]);\n\n // Get changed paths for current mutation\n const changedPaths = useMemo((): Set<string> => {\n if (!selectedMutation?.diff) return new Set<string>();\n return new Set<string>(selectedMutation.diff.map((d: StateDiff) => d.path));\n }, [selectedMutation]);\n\n // Get removed paths for current mutation\n const removedPaths = useMemo((): Set<string> => {\n if (!selectedMutation?.diff) return new Set<string>();\n return new Set<string>(\n selectedMutation.diff\n .filter((d: StateDiff) => d.operation === 'REMOVE')\n .map((d: StateDiff) => d.path)\n );\n }, [selectedMutation]);\n\n // Issue counts by severity\n const issueCounts = useMemo(() => {\n const counts = { critical: 0, warning: 0, info: 0 };\n for (const issue of issues) {\n counts[issue.severity]++;\n }\n return counts;\n }, [issues]);\n\n // Sync playback with selected mutation\n useEffect(() => {\n if (playback.currentMutation) {\n selectMutation(playback.currentMutation);\n }\n }, [playback.currentMutation, selectMutation]);\n\n // Auto refresh sessions\n useEffect(() => {\n if (!autoRefresh) return;\n const interval = setInterval(loadSessions, 5000);\n return () => clearInterval(interval);\n }, [autoRefresh, loadSessions]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement) return;\n\n switch (e.key) {\n case 'ArrowLeft':\n playback.stepBackward();\n break;\n case 'ArrowRight':\n playback.stepForward();\n break;\n case ' ':\n e.preventDefault();\n playback.isPlaying ? playback.pause() : playback.play();\n break;\n case '1':\n setMainTab('issues');\n break;\n case '2':\n setMainTab('timeline');\n break;\n case '3':\n setMainTab('graph');\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [playback]);\n\n const handleJumpToMutation = (mutationId: string, index: number) => {\n playback.goTo(index);\n const mutation = timeline[index];\n if (mutation) {\n selectMutation(mutation);\n }\n setMainTab('timeline');\n };\n\n return (\n <div className=\"surgeon-dashboard-v2\">\n {/* Header */}\n <header className=\"sd2-header\">\n <div className=\"sd2-header-left\">\n <h1 className=\"sd2-logo\">\n <span className=\"sd2-logo-icon\">🔬</span>\n <span className=\"sd2-logo-text\">State Surgeon</span>\n <span className=\"sd2-version\">v2.0</span>\n </h1>\n\n {/* Issue summary badges */}\n {issues.length > 0 && (\n <div className=\"sd2-issue-badges\">\n {issueCounts.critical > 0 && (\n <span className=\"sd2-badge sd2-badge-critical\">\n 🔴 {issueCounts.critical}\n </span>\n )}\n {issueCounts.warning > 0 && (\n <span className=\"sd2-badge sd2-badge-warning\">\n 🟡 {issueCounts.warning}\n </span>\n )}\n {issueCounts.info > 0 && (\n <span className=\"sd2-badge sd2-badge-info\">\n 🟢 {issueCounts.info}\n </span>\n )}\n </div>\n )}\n </div>\n\n <div className=\"sd2-header-center\">\n <select\n value={currentSession?.id || ''}\n onChange={(e) => selectSession(e.target.value)}\n disabled={isLoading}\n className=\"sd2-session-select\"\n >\n <option value=\"\">Select a session...</option>\n {sessions.map((session) => (\n <option key={session.id} value={session.id}>\n {session.appId} • {session.id.slice(0, 8)}... • {session.mutationCount} mutations\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"sd2-header-right\">\n <input\n type=\"text\"\n placeholder=\"🔍 Search state paths...\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n className=\"sd2-search\"\n />\n <label className=\"sd2-auto-refresh\">\n <input\n type=\"checkbox\"\n checked={autoRefresh}\n onChange={e => setAutoRefresh(e.target.checked)}\n />\n Auto\n </label>\n <button onClick={loadSessions} disabled={isLoading} className=\"sd2-refresh-btn\">\n {isLoading ? '⏳' : '🔄'}\n </button>\n </div>\n </header>\n\n {error && (\n <div className=\"sd2-error\">\n <span>❌</span> {error}\n </div>\n )}\n\n {/* Welcome screen */}\n {!currentSession && !isLoading && (\n <div className=\"sd2-welcome\">\n <div className=\"sd2-welcome-content\">\n <div className=\"sd2-welcome-icon\">🔬</div>\n <h2>State Surgeon v2.0</h2>\n <p>Forensic debugging platform for JavaScript applications</p>\n\n <div className=\"sd2-features\">\n <div className=\"sd2-feature\">\n <span className=\"sd2-feature-icon\">🚨</span>\n <strong>Issue Detection</strong>\n <span>Find state loss, invalid values, broken invariants</span>\n </div>\n <div className=\"sd2-feature\">\n <span className=\"sd2-feature-icon\">🌳</span>\n <strong>State Tree</strong>\n <span>Visual tree with inline anomaly badges</span>\n </div>\n <div className=\"sd2-feature\">\n <span className=\"sd2-feature-icon\">🔗</span>\n <strong>Dependency Graph</strong>\n <span>Detect hidden coupling between components</span>\n </div>\n <div className=\"sd2-feature\">\n <span className=\"sd2-feature-icon\">⏱️</span>\n <strong>Timeline Analysis</strong>\n <span>See exactly what your code did</span>\n </div>\n </div>\n\n {sessions.length > 0 && (\n <div className=\"sd2-session-list\">\n <h3>Sessions ({sessions.length})</h3>\n {sessions.map(session => (\n <button\n key={session.id}\n className=\"sd2-session-card\"\n onClick={() => selectSession(session.id)}\n >\n <span className=\"sd2-session-app\">{session.appId}</span>\n <span className=\"sd2-session-count\">{session.mutationCount} mutations</span>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n\n {isLoading && !currentSession && (\n <div className=\"sd2-loading\">\n <div className=\"sd2-spinner\"></div>\n <p>Loading sessions...</p>\n </div>\n )}\n\n {/* Main content */}\n {currentSession && (\n <div className=\"sd2-main\">\n {/* Left panel - Main tabs */}\n <div className=\"sd2-left-panel\">\n <div className=\"sd2-tabs\">\n <button\n className={`sd2-tab ${mainTab === 'issues' ? 'active' : ''}`}\n onClick={() => setMainTab('issues')}\n >\n 🚨 Issues {issues.length > 0 && `(${issues.length})`}\n </button>\n <button\n className={`sd2-tab ${mainTab === 'timeline' ? 'active' : ''}`}\n onClick={() => setMainTab('timeline')}\n >\n 📊 Timeline\n </button>\n <button\n className={`sd2-tab ${mainTab === 'graph' ? 'active' : ''}`}\n onClick={() => setMainTab('graph')}\n >\n 🔗 Graph {dependencyGraph.couplings.length > 0 && `(${dependencyGraph.couplings.length})`}\n </button>\n </div>\n\n <div className=\"sd2-tab-content\">\n {mainTab === 'issues' && (\n <IssuesPanel\n issues={issues}\n onJumpToMutation={handleJumpToMutation}\n />\n )}\n\n {mainTab === 'timeline' && (\n <div className=\"sd2-timeline-panel\">\n <TimelineScrubber\n mutations={timeline}\n selectedIndex={playback.currentIndex}\n onSelect={(index, mutation) => {\n playback.goTo(index);\n selectMutation(mutation);\n }}\n isPlaying={playback.isPlaying}\n onPlay={playback.play}\n onPause={playback.pause}\n onStepForward={playback.stepForward}\n onStepBackward={playback.stepBackward}\n playbackSpeed={playback.playbackSpeed}\n onSpeedChange={playback.setSpeed}\n />\n </div>\n )}\n\n {mainTab === 'graph' && (\n <DependencyGraph\n graph={dependencyGraph}\n onPathSelect={(path) => setSearchQuery(path)}\n />\n )}\n </div>\n </div>\n\n {/* Right panel - State details */}\n <div className=\"sd2-right-panel\">\n <div className=\"sd2-tabs\">\n <button\n className={`sd2-tab ${detailTab === 'tree' ? 'active' : ''}`}\n onClick={() => setDetailTab('tree')}\n >\n 🌳 Tree\n </button>\n <button\n className={`sd2-tab ${detailTab === 'diff' ? 'active' : ''}`}\n onClick={() => setDetailTab('diff')}\n >\n 📊 Diff\n </button>\n <button\n className={`sd2-tab ${detailTab === 'inspector' ? 'active' : ''}`}\n onClick={() => setDetailTab('inspector')}\n >\n 🔍 Details\n </button>\n </div>\n\n <div className=\"sd2-tab-content\">\n {detailTab === 'tree' && selectedMutation && (\n <StateTreeViewer\n state={selectedMutation.nextState}\n issuePaths={issuePaths}\n changedPaths={changedPaths}\n removedPaths={removedPaths}\n searchQuery={searchQuery}\n />\n )}\n\n {detailTab === 'diff' && selectedMutation && (\n <StateDiffViewer\n previousState={selectedMutation.previousState}\n nextState={selectedMutation.nextState}\n diff={selectedMutation.diff}\n />\n )}\n\n {detailTab === 'inspector' && (\n <MutationInspector mutation={selectedMutation} />\n )}\n\n {!selectedMutation && (\n <div className=\"sd2-panel-empty\">\n <p>Select a mutation to view state details</p>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Footer */}\n <footer className=\"sd2-footer\">\n <span>State Surgeon v2.0</span>\n <span className=\"sd2-sep\">•</span>\n <span>← → navigate • Space play/pause • 1-3 switch tabs</span>\n </footer>\n\n <style>{dashboardStyles}</style>\n </div>\n );\n}\n\nconst dashboardStyles = `\n .surgeon-dashboard-v2 {\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n background: linear-gradient(135deg, #0f0f23 0%, #1a1a2e 100%);\n color: #e0e0e0;\n font-family: system-ui, -apple-system, sans-serif;\n }\n\n /* Header */\n .sd2-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 1.5rem;\n background: rgba(22, 33, 62, 0.95);\n backdrop-filter: blur(10px);\n border-bottom: 1px solid #333;\n position: sticky;\n top: 0;\n z-index: 100;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .sd2-header-left, .sd2-header-right {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n\n .sd2-logo {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n font-size: 1.125rem;\n }\n\n .sd2-logo-icon { font-size: 1.25rem; }\n\n .sd2-logo-text {\n background: linear-gradient(135deg, #00d9ff, #a78bfa);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n font-weight: 700;\n }\n\n .sd2-version {\n font-size: 0.65rem;\n padding: 0.15rem 0.35rem;\n background: linear-gradient(135deg, #22c55e, #06b6d4);\n border-radius: 4px;\n color: #000;\n font-weight: 600;\n }\n\n .sd2-issue-badges {\n display: flex;\n gap: 0.5rem;\n }\n\n .sd2-badge {\n padding: 0.25rem 0.5rem;\n border-radius: 12px;\n font-size: 0.75rem;\n font-weight: 600;\n }\n\n .sd2-badge-critical { background: #ef444430; color: #fca5a5; }\n .sd2-badge-warning { background: #fbbf2430; color: #fcd34d; }\n .sd2-badge-info { background: #22c55e30; color: #86efac; }\n\n .sd2-session-select {\n padding: 0.5rem 1rem;\n min-width: 300px;\n border: 1px solid #333;\n border-radius: 8px;\n background: #0f0f23;\n color: #e0e0e0;\n font-size: 0.875rem;\n cursor: pointer;\n }\n\n .sd2-search {\n padding: 0.5rem 1rem;\n width: 200px;\n border: 1px solid #333;\n border-radius: 8px;\n background: #0f0f23;\n color: #e0e0e0;\n font-size: 0.875rem;\n }\n\n .sd2-auto-refresh {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.8rem;\n color: #888;\n cursor: pointer;\n }\n\n .sd2-refresh-btn {\n padding: 0.375rem 0.625rem;\n border: 1px solid #333;\n border-radius: 6px;\n background: transparent;\n color: #e0e0e0;\n cursor: pointer;\n font-size: 1rem;\n }\n\n .sd2-refresh-btn:hover { background: #16213e; }\n\n .sd2-error {\n padding: 0.75rem 1.5rem;\n background: rgba(239, 68, 68, 0.1);\n border-bottom: 1px solid #ef4444;\n color: #fca5a5;\n }\n\n /* Welcome */\n .sd2-welcome {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n }\n\n .sd2-welcome-content {\n text-align: center;\n max-width: 700px;\n }\n\n .sd2-welcome-icon {\n font-size: 4rem;\n margin-bottom: 1rem;\n animation: float 3s ease-in-out infinite;\n }\n\n @keyframes float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n }\n\n .sd2-welcome h2 {\n margin: 0 0 0.5rem;\n font-size: 1.75rem;\n background: linear-gradient(135deg, #00d9ff, #a78bfa);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n\n .sd2-welcome > div > p {\n color: #888;\n margin-bottom: 2rem;\n }\n\n .sd2-features {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 1rem;\n margin-bottom: 2rem;\n }\n\n .sd2-feature {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 1.25rem;\n background: #16213e;\n border-radius: 12px;\n text-align: center;\n }\n\n .sd2-feature-icon {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n }\n\n .sd2-feature strong {\n color: #00d9ff;\n margin-bottom: 0.25rem;\n }\n\n .sd2-feature span:last-child {\n font-size: 0.8rem;\n color: #888;\n }\n\n .sd2-session-list h3 {\n color: #00d9ff;\n margin-bottom: 0.75rem;\n }\n\n .sd2-session-card {\n display: flex;\n justify-content: space-between;\n width: 100%;\n padding: 0.875rem 1.25rem;\n margin-bottom: 0.5rem;\n background: #16213e;\n border: 1px solid #333;\n border-radius: 8px;\n cursor: pointer;\n color: inherit;\n transition: all 0.2s;\n }\n\n .sd2-session-card:hover {\n border-color: #00d9ff;\n background: #1a2744;\n }\n\n .sd2-session-app { color: #a78bfa; font-weight: 600; }\n .sd2-session-count { color: #00d9ff; }\n\n .sd2-loading {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n }\n\n .sd2-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid #333;\n border-top-color: #00d9ff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin { to { transform: rotate(360deg); } }\n\n /* Main content */\n .sd2-main {\n flex: 1;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n padding: 1rem;\n min-height: 0;\n }\n\n @media (max-width: 1200px) {\n .sd2-main { grid-template-columns: 1fr; }\n }\n\n .sd2-left-panel, .sd2-right-panel {\n display: flex;\n flex-direction: column;\n background: #1a1a2e;\n border-radius: 12px;\n overflow: hidden;\n min-height: 500px;\n }\n\n .sd2-tabs {\n display: flex;\n background: #16213e;\n border-bottom: 1px solid #333;\n }\n\n .sd2-tab {\n flex: 1;\n padding: 0.75rem 1rem;\n border: none;\n background: transparent;\n color: #888;\n cursor: pointer;\n font-size: 0.875rem;\n transition: all 0.2s;\n border-bottom: 2px solid transparent;\n }\n\n .sd2-tab:hover { color: #ccc; background: #1a2744; }\n\n .sd2-tab.active {\n color: #00d9ff;\n background: #1a1a2e;\n border-bottom-color: #00d9ff;\n }\n\n .sd2-tab-content {\n flex: 1;\n overflow: auto;\n }\n\n .sd2-timeline-panel {\n padding: 1rem;\n }\n\n .sd2-panel-empty {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n }\n\n /* Footer */\n .sd2-footer {\n padding: 0.625rem 1.5rem;\n background: rgba(22, 33, 62, 0.5);\n border-top: 1px solid #333;\n font-size: 0.75rem;\n color: #666;\n text-align: center;\n }\n\n .sd2-sep { margin: 0 0.5rem; }\n`;\n"]}