state-surgeon 1.0.0 → 1.1.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","useCallback","React","useState"],"mappings":"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","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 /** Custom class name */\n className?: string;\n}\n\n/**\n * Viewer for comparing before/after state with highlighting\n */\nexport function StateDiffViewer({\n previousState,\n nextState,\n diff: preDiff,\n defaultExpandDepth = 3,\n className = '',\n}: StateDiffViewerProps) {\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 return (\n <div className={`state-diff-viewer ${className}`}>\n <div className=\"state-diff-viewer__panels\">\n <div className=\"state-diff-viewer__panel\">\n <h3 className=\"state-diff-viewer__title\">Before</h3>\n <div className=\"state-diff-viewer__content\">\n <StateTree\n value={previousState}\n path=\"\"\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n changeType=\"before\"\n />\n </div>\n </div>\n\n <div className=\"state-diff-viewer__panel\">\n <h3 className=\"state-diff-viewer__title\">After</h3>\n <div className=\"state-diff-viewer__content\">\n <StateTree\n value={nextState}\n path=\"\"\n changedPaths={changedPaths}\n defaultExpandDepth={defaultExpandDepth}\n changeType=\"after\"\n />\n </div>\n </div>\n </div>\n\n {diff.length > 0 && (\n <div className=\"state-diff-viewer__summary\">\n <h4>Changes ({diff.length})</h4>\n <ul className=\"state-diff-viewer__changes\">\n {diff.map((change, index) => (\n <li\n key={index}\n className={`state-diff-viewer__change state-diff-viewer__change--${change.operation.toLowerCase()}`}\n >\n <code>{change.path}</code>\n <span className=\"state-diff-viewer__change-type\">\n {change.operation}\n </span>\n {change.operation === 'UPDATE' && (\n <>\n <span className=\"state-diff-viewer__value state-diff-viewer__value--old\">\n {formatValue(change.oldValue)}\n </span>\n <span className=\"state-diff-viewer__arrow\">→</span>\n <span className=\"state-diff-viewer__value state-diff-viewer__value--new\">\n {formatValue(change.newValue)}\n </span>\n </>\n )}\n {change.operation === 'ADD' && (\n <span className=\"state-diff-viewer__value state-diff-viewer__value--new\">\n {formatValue(change.newValue)}\n </span>\n )}\n {change.operation === 'REMOVE' && (\n <span className=\"state-diff-viewer__value state-diff-viewer__value--old\">\n {formatValue(change.oldValue)}\n </span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <style>{`\n .state-diff-viewer {\n font-family: monospace;\n font-size: 0.875rem;\n color: #e0e0e0;\n }\n\n .state-diff-viewer__panels {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n }\n\n .state-diff-viewer__panel {\n background: #16213e;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .state-diff-viewer__title {\n margin: 0;\n padding: 0.75rem 1rem;\n background: #1a1a2e;\n font-size: 0.875rem;\n font-weight: 600;\n color: #00d9ff;\n }\n\n .state-diff-viewer__content {\n padding: 1rem;\n max-height: 400px;\n overflow: auto;\n }\n\n .state-diff-viewer__summary {\n margin-top: 1rem;\n padding: 1rem;\n background: #16213e;\n border-radius: 8px;\n }\n\n .state-diff-viewer__summary h4 {\n margin: 0 0 0.5rem 0;\n color: #00d9ff;\n }\n\n .state-diff-viewer__changes {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n\n .state-diff-viewer__change {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem;\n border-radius: 4px;\n margin-bottom: 0.25rem;\n }\n\n .state-diff-viewer__change--add {\n background: rgba(34, 197, 94, 0.1);\n border-left: 3px solid #22c55e;\n }\n\n .state-diff-viewer__change--update {\n background: rgba(251, 191, 36, 0.1);\n border-left: 3px solid #fbbf24;\n }\n\n .state-diff-viewer__change--remove {\n background: rgba(239, 68, 68, 0.1);\n border-left: 3px solid #ef4444;\n }\n\n .state-diff-viewer__change-type {\n font-size: 0.7rem;\n padding: 0.125rem 0.375rem;\n border-radius: 3px;\n background: #333;\n color: #888;\n }\n\n .state-diff-viewer__value {\n padding: 0.125rem 0.375rem;\n border-radius: 3px;\n }\n\n .state-diff-viewer__value--old {\n background: rgba(239, 68, 68, 0.2);\n color: #fca5a5;\n text-decoration: line-through;\n }\n\n .state-diff-viewer__value--new {\n background: rgba(34, 197, 94, 0.2);\n color: #86efac;\n }\n\n .state-diff-viewer__arrow {\n color: #666;\n }\n `}</style>\n </div>\n );\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\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 <span className=\"state-tree__undefined\">undefined</span>;\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 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 </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 <div key={key} className=\"state-tree__item\">\n <span className=\"state-tree__key\">{key}:</span>\n <StateTree\n value={val}\n path={path ? `${path}.${key}` : key}\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 return <span>{String(value)}</span>;\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'object') {\n try {\n const str = JSON.stringify(value);\n return str.length > 50 ? str.slice(0, 50) + '...' : str;\n } catch {\n return '[Object]';\n }\n }\n return String(value);\n}\n","import React, { useCallback } 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 /** 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\n/**\n * Timeline scrubber component for navigating through mutations\n */\nexport function TimelineScrubber({\n mutations,\n selectedIndex,\n onSelect,\n isPlaying = false,\n onPlay,\n onPause,\n onStepForward,\n onStepBackward,\n className = '',\n}: TimelineScrubberProps) {\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 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 fractionalSecondDigits: 3,\n });\n };\n\n if (mutations.length === 0) {\n return (\n <div className={`timeline-scrubber timeline-scrubber--empty ${className}`}>\n <p>No mutations recorded yet</p>\n </div>\n );\n }\n\n const selectedMutation = mutations[selectedIndex];\n\n return (\n <div className={`timeline-scrubber ${className}`}>\n <div className=\"timeline-scrubber__header\">\n <span className=\"timeline-scrubber__count\">\n {selectedIndex + 1} / {mutations.length} mutations\n </span>\n {selectedMutation && (\n <span className=\"timeline-scrubber__time\">\n {formatTime(selectedMutation.timestamp)}\n </span>\n )}\n </div>\n\n <div className=\"timeline-scrubber__track\">\n {mutations.map((mutation, index) => (\n <div\n key={mutation.id}\n className={`timeline-scrubber__marker ${\n index === selectedIndex ? 'timeline-scrubber__marker--selected' : ''\n }`}\n style={{\n left: `${(index / (mutations.length - 1 || 1)) * 100}%`,\n backgroundColor: sourceColors[mutation.source] || sourceColors.custom,\n }}\n onClick={() => handleMarkerClick(index)}\n title={`${mutation.source}: ${mutation.actionType}${\n mutation.component ? ` @ ${mutation.component}` : ''\n }`}\n />\n ))}\n\n <div\n className=\"timeline-scrubber__position\"\n style={{\n left: `${(selectedIndex / (mutations.length - 1 || 1)) * 100}%`,\n }}\n />\n </div>\n\n <input\n type=\"range\"\n min={0}\n max={mutations.length - 1}\n value={selectedIndex}\n onChange={handleSliderChange}\n className=\"timeline-scrubber__slider\"\n />\n\n <div className=\"timeline-scrubber__controls\">\n <button\n onClick={onStepBackward}\n disabled={selectedIndex === 0}\n className=\"timeline-scrubber__button\"\n title=\"Step Backward\"\n >\n ⏮\n </button>\n\n {isPlaying ? (\n <button\n onClick={onPause}\n className=\"timeline-scrubber__button timeline-scrubber__button--primary\"\n title=\"Pause\"\n >\n ⏸\n </button>\n ) : (\n <button\n onClick={onPlay}\n disabled={selectedIndex === mutations.length - 1}\n className=\"timeline-scrubber__button timeline-scrubber__button--primary\"\n title=\"Play\"\n >\n ▶\n </button>\n )}\n\n <button\n onClick={onStepForward}\n disabled={selectedIndex === mutations.length - 1}\n className=\"timeline-scrubber__button\"\n title=\"Step Forward\"\n >\n ⏭\n </button>\n </div>\n\n <div className=\"timeline-scrubber__legend\">\n {Object.entries(sourceColors).map(([source, color]) => (\n <span key={source} className=\"timeline-scrubber__legend-item\">\n <span\n className=\"timeline-scrubber__legend-dot\"\n style={{ backgroundColor: color }}\n />\n {source}\n </span>\n ))}\n </div>\n\n <style>{`\n .timeline-scrubber {\n padding: 1rem;\n background: #1a1a2e;\n border-radius: 8px;\n color: #fff;\n }\n\n .timeline-scrubber--empty {\n text-align: center;\n color: #888;\n }\n\n .timeline-scrubber__header {\n display: flex;\n justify-content: space-between;\n margin-bottom: 0.5rem;\n font-size: 0.875rem;\n }\n\n .timeline-scrubber__count {\n color: #00d9ff;\n font-weight: 600;\n }\n\n .timeline-scrubber__time {\n color: #888;\n font-family: monospace;\n }\n\n .timeline-scrubber__track {\n position: relative;\n height: 24px;\n background: #16213e;\n border-radius: 4px;\n margin-bottom: 0.5rem;\n }\n\n .timeline-scrubber__marker {\n position: absolute;\n width: 4px;\n height: 16px;\n top: 4px;\n border-radius: 2px;\n cursor: pointer;\n transition: transform 0.1s, opacity 0.1s;\n opacity: 0.7;\n }\n\n .timeline-scrubber__marker:hover {\n transform: scaleY(1.2);\n opacity: 1;\n }\n\n .timeline-scrubber__marker--selected {\n opacity: 1;\n box-shadow: 0 0 8px currentColor;\n }\n\n .timeline-scrubber__position {\n position: absolute;\n width: 2px;\n height: 24px;\n top: 0;\n background: #fff;\n border-radius: 1px;\n pointer-events: none;\n }\n\n .timeline-scrubber__slider {\n width: 100%;\n margin: 0.5rem 0;\n cursor: pointer;\n }\n\n .timeline-scrubber__controls {\n display: flex;\n justify-content: center;\n gap: 0.5rem;\n margin: 0.5rem 0;\n }\n\n .timeline-scrubber__button {\n padding: 0.5rem 1rem;\n border: none;\n border-radius: 4px;\n background: #16213e;\n color: #fff;\n cursor: pointer;\n font-size: 1rem;\n transition: background 0.2s;\n }\n\n .timeline-scrubber__button:hover:not(:disabled) {\n background: #1f2b4d;\n }\n\n .timeline-scrubber__button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .timeline-scrubber__button--primary {\n background: #00d9ff;\n color: #000;\n }\n\n .timeline-scrubber__button--primary:hover:not(:disabled) {\n background: #00b8e6;\n }\n\n .timeline-scrubber__legend {\n display: flex;\n flex-wrap: wrap;\n gap: 1rem;\n margin-top: 0.5rem;\n font-size: 0.75rem;\n }\n\n .timeline-scrubber__legend-item {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n color: #888;\n }\n\n .timeline-scrubber__legend-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\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 React 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\n // Sync playback with selected mutation\n React.useEffect(() => {\n if (playback.currentMutation) {\n selectMutation(playback.currentMutation);\n }\n }, [playback.currentMutation, selectMutation]);\n\n return (\n <div className=\"surgeon-dashboard\">\n <header className=\"surgeon-dashboard__header\">\n <h1 className=\"surgeon-dashboard__logo\">🔬 State Surgeon</h1>\n <div className=\"surgeon-dashboard__session-select\">\n <select\n value={currentSession?.id || ''}\n onChange={(e) => selectSession(e.target.value)}\n disabled={isLoading}\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, 16)}... ({session.mutationCount} mutations)\n </option>\n ))}\n </select>\n <button onClick={loadSessions} disabled={isLoading}>\n 🔄\n </button>\n </div>\n </header>\n\n {error && (\n <div className=\"surgeon-dashboard__error\">\n <p>Error: {error}</p>\n </div>\n )}\n\n {isLoading && (\n <div className=\"surgeon-dashboard__loading\">\n <p>Loading...</p>\n </div>\n )}\n\n {currentSession && !isLoading && (\n <div className=\"surgeon-dashboard__main\">\n <section className=\"surgeon-dashboard__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 />\n </section>\n\n <div className=\"surgeon-dashboard__content\">\n <section className=\"surgeon-dashboard__diff\">\n {selectedMutation && (\n <StateDiffViewer\n previousState={selectedMutation.previousState}\n nextState={selectedMutation.nextState}\n diff={selectedMutation.diff}\n />\n )}\n </section>\n\n <section className=\"surgeon-dashboard__inspector\">\n <MutationInspector mutation={selectedMutation} />\n </section>\n </div>\n </div>\n )}\n\n {!currentSession && !isLoading && sessions.length === 0 && (\n <div className=\"surgeon-dashboard__empty\">\n <h2>No Sessions Yet</h2>\n <p>Connect your application to start capturing mutations.</p>\n <pre>\n{`import { StateSurgeonClient, instrumentReact } from 'state-surgeon/instrument';\n\n// Initialize the client\nconst client = new StateSurgeonClient({\n serverUrl: 'ws://localhost:8081',\n appId: 'my-app',\n});\n\n// Instrument React\ninstrumentReact(React);`}\n </pre>\n </div>\n )}\n\n <style>{`\n .surgeon-dashboard {\n min-height: 100vh;\n background: #0f0f23;\n color: #e0e0e0;\n font-family: system-ui, -apple-system, sans-serif;\n }\n\n .surgeon-dashboard__header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 2rem;\n background: #1a1a2e;\n border-bottom: 1px solid #333;\n }\n\n .surgeon-dashboard__logo {\n margin: 0;\n font-size: 1.5rem;\n color: #00d9ff;\n }\n\n .surgeon-dashboard__session-select {\n display: flex;\n gap: 0.5rem;\n }\n\n .surgeon-dashboard__session-select select {\n padding: 0.5rem 1rem;\n border: 1px solid #333;\n border-radius: 4px;\n background: #16213e;\n color: #e0e0e0;\n min-width: 300px;\n }\n\n .surgeon-dashboard__session-select button {\n padding: 0.5rem 1rem;\n border: 1px solid #333;\n border-radius: 4px;\n background: #16213e;\n color: #e0e0e0;\n cursor: pointer;\n }\n\n .surgeon-dashboard__session-select button:hover {\n background: #1f2b4d;\n }\n\n .surgeon-dashboard__error {\n padding: 1rem 2rem;\n background: rgba(239, 68, 68, 0.1);\n border-bottom: 1px solid #ef4444;\n color: #fca5a5;\n }\n\n .surgeon-dashboard__loading {\n padding: 2rem;\n text-align: center;\n color: #888;\n }\n\n .surgeon-dashboard__main {\n padding: 1rem 2rem;\n }\n\n .surgeon-dashboard__timeline {\n margin-bottom: 1rem;\n }\n\n .surgeon-dashboard__content {\n display: grid;\n grid-template-columns: 2fr 1fr;\n gap: 1rem;\n }\n\n .surgeon-dashboard__empty {\n padding: 4rem 2rem;\n text-align: center;\n }\n\n .surgeon-dashboard__empty h2 {\n color: #888;\n margin-bottom: 1rem;\n }\n\n .surgeon-dashboard__empty pre {\n display: inline-block;\n text-align: left;\n padding: 1.5rem;\n background: #16213e;\n border-radius: 8px;\n font-size: 0.875rem;\n }\n\n @media (max-width: 1024px) {\n .surgeon-dashboard__content {\n grid-template-columns: 1fr;\n }\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/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "state-surgeon",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Time-travel debugging platform that records every state mutation across full-stack JavaScript applications and provides interactive forensic tools to investigate bugs",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",