state-surgeon 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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":["jsx","jsxs","Fragment","useMemo","useState","useCallback","React","useEffect"],"mappings":"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","file":"index.js","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"]}