state-surgeon 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/diff.ts","../src/core/mutation.ts","../src/core/utils.ts","../src/instrument/index.ts","../src/instrument/transport.ts","../src/instrument/client.ts","../src/instrument/api.ts","../src/instrument/react.ts","../src/instrument/redux.ts","../src/instrument/zustand.ts","../src/recorder/index.ts","../src/recorder/api.ts","../src/recorder/reconstructor.ts","../src/recorder/store.ts","../src/recorder/server.ts"],"names":["uuidv4"],"mappings":"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","file":"index.mjs","sourcesContent":["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 { v4 as uuidv4 } from 'uuid';\n\n/**\n * Source of the state mutation\n */\nexport type MutationSource = 'react' | 'redux' | 'zustand' | 'express' | 'websocket' | 'api' | 'custom';\n\n/**\n * Type of action that triggered the mutation\n */\nexport type ActionType = 'USER_CLICK' | 'API_RESPONSE' | 'TIMEOUT' | 'WEBHOOK' | 'INIT' | 'DISPATCH' | 'SET_STATE' | 'CUSTOM';\n\n/**\n * Represents a single state mutation captured by State Surgeon\n */\nexport interface Mutation {\n /** Unique identifier for this mutation */\n id: string;\n\n /** High-resolution timestamp (performance.now() or Date.now()) */\n timestamp: number;\n\n /** Lamport timestamp for causal ordering */\n logicalClock: number;\n\n /** Session this mutation belongs to */\n sessionId: string;\n\n /** Source of the mutation */\n source: MutationSource;\n\n /** Component or module name */\n component?: string;\n\n /** Function name that triggered the mutation */\n function?: string;\n\n /** Source file path */\n file?: string;\n\n /** Line number in source file */\n line?: number;\n\n /** Column number in source file */\n column?: number;\n\n /** Type of action that triggered this mutation */\n actionType: ActionType;\n\n /** Action payload (for Redux actions, etc.) */\n actionPayload?: unknown;\n\n /** State before the mutation */\n previousState: unknown;\n\n /** State after the mutation */\n nextState: unknown;\n\n /** Computed diff between states */\n diff?: StateDiff[];\n\n /** Call stack at time of mutation */\n callStack?: string[];\n\n /** Request ID for correlating with backend */\n requestId?: string;\n\n /** Duration of the mutation in milliseconds */\n duration?: number;\n\n /** Parent mutation ID for causal chains */\n parentMutationId?: string;\n\n /** IDs of events that caused this mutation */\n causes?: string[];\n\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a single change in state\n */\nexport interface StateDiff {\n /** JSON path to the changed value */\n path: string;\n\n /** Type of change */\n operation: 'ADD' | 'UPDATE' | 'REMOVE';\n\n /** Previous value (for UPDATE and REMOVE) */\n oldValue?: unknown;\n\n /** New value (for ADD and UPDATE) */\n newValue?: unknown;\n}\n\n/**\n * Options for creating a mutation\n */\nexport interface CreateMutationOptions {\n source: MutationSource;\n sessionId: string;\n previousState: unknown;\n nextState: unknown;\n actionType?: ActionType;\n actionPayload?: unknown;\n component?: string;\n function?: string;\n captureStack?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n// Global logical clock for this client\nlet logicalClock = 0;\n\n/**\n * Creates a new mutation record\n */\nexport function createMutation(options: CreateMutationOptions): Mutation {\n const {\n source,\n sessionId,\n previousState,\n nextState,\n actionType = 'CUSTOM',\n actionPayload,\n component,\n function: funcName,\n captureStack = true,\n metadata,\n } = options;\n\n logicalClock++;\n\n const mutation: Mutation = {\n id: `mut_${Date.now()}_${uuidv4().slice(0, 8)}`,\n timestamp: typeof performance !== 'undefined' ? performance.now() : Date.now(),\n logicalClock,\n sessionId,\n source,\n component,\n function: funcName,\n actionType,\n actionPayload,\n previousState,\n nextState,\n metadata,\n };\n\n // Capture call stack if enabled\n if (captureStack) {\n mutation.callStack = parseCallStack(new Error().stack);\n }\n\n return mutation;\n}\n\n/**\n * Parses an error stack trace into clean function names\n */\nexport function parseCallStack(stack?: string): string[] {\n if (!stack) return [];\n\n return stack\n .split('\\n')\n .slice(2) // Skip 'Error' and 'createMutation' lines\n .map(line => line.trim())\n .filter(line => line.startsWith('at '))\n .map(line => {\n // Extract function name and location\n const match = line.match(/at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)/);\n if (match) {\n return `${match[1]} (${match[2].split('/').pop()}:${match[3]})`;\n }\n // Anonymous function or simpler format\n const simpleMatch = line.match(/at\\s+(.+):(\\d+):(\\d+)/);\n if (simpleMatch) {\n return `anonymous (${simpleMatch[1].split('/').pop()}:${simpleMatch[2]})`;\n }\n return line.replace('at ', '');\n })\n .slice(0, 10); // Limit stack depth\n}\n\n/**\n * Gets the current logical clock value\n */\nexport function getLogicalClock(): number {\n return logicalClock;\n}\n\n/**\n * Resets the logical clock (for testing)\n */\nexport function resetLogicalClock(): void {\n logicalClock = 0;\n}\n\n/**\n * Generates a new session ID\n */\nexport function generateSessionId(): string {\n return `session_${Date.now()}_${uuidv4().slice(0, 8)}`;\n}\n","/**\n * Utility functions for State Surgeon\n */\n\n/**\n * Deep merges source into target\n */\nexport function deepMerge<T extends object>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = (target as Record<string, unknown>)[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n (result as Record<string, unknown>)[key] = deepMerge(\n targetValue as object,\n sourceValue as object\n );\n } else {\n (result as Record<string, unknown>)[key] = sourceValue;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Debounces a function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n return function (this: unknown, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn.apply(this, args);\n }, ms);\n };\n}\n\n/**\n * Throttles a function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n return function (this: unknown, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = ms - (now - lastCall);\n\n if (remaining <= 0) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n lastCall = now;\n fn.apply(this, args);\n } else if (!timeoutId) {\n timeoutId = setTimeout(() => {\n lastCall = Date.now();\n timeoutId = undefined;\n fn.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * Compresses a string using basic run-length encoding\n * For production, use proper compression like pako/gzip\n */\nexport function compress(data: string): string {\n // Simple JSON stringify for now\n // Could add proper compression in production\n return data;\n}\n\n/**\n * Decompresses a string\n */\nexport function decompress(data: string): string {\n return data;\n}\n\n/**\n * Formats bytes to human readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\n/**\n * Formats a duration in milliseconds\n */\nexport function formatDuration(ms: number): string {\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/**\n * Creates a simple hash of a string\n */\nexport function simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16);\n}\n\n/**\n * Checks if running in browser environment\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Checks if running in Node.js environment\n */\nexport function isNode(): boolean {\n return typeof process !== 'undefined' && process.versions?.node !== undefined;\n}\n\n/**\n * Safe JSON stringify that handles circular references\n */\nexport function safeStringify(obj: unknown, space?: number): string {\n const seen = new WeakSet();\n\n return JSON.stringify(obj, (_, value) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n\n // Handle special types\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n if (typeof value === 'symbol') {\n return value.toString();\n }\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n if (value instanceof Map) {\n return { __type: 'Map', entries: Array.from(value.entries()) };\n }\n if (value instanceof Set) {\n return { __type: 'Set', values: Array.from(value.values()) };\n }\n\n return value;\n }, space);\n}\n\n/**\n * Safe JSON parse with reviver for special types\n */\nexport function safeParse(json: string): unknown {\n return JSON.parse(json, (_, value) => {\n if (value && typeof value === 'object') {\n if (value.__type === 'Map') {\n return new Map(value.entries);\n }\n if (value.__type === 'Set') {\n return new Set(value.values);\n }\n }\n return value;\n });\n}\n","/**\n * Instrumentation Layer for State Surgeon\n *\n * Provides utilities to instrument various state management systems\n * and capture mutations automatically.\n */\n\nexport { instrumentFetch, instrumentXHR, type APIInstrumentationOptions } from './api';\nexport { StateSurgeonClient, type ClientOptions } from './client';\nexport { instrumentReact, type ReactInstrumentationOptions } from './react';\nexport { createReduxMiddleware, instrumentReduxStore, type ReduxInstrumentationOptions } from './redux';\nexport { MutationTransport, type TransportOptions } from './transport';\nexport { instrumentZustand, type ZustandInstrumentationOptions } from './zustand';\n\n","/**\n * WebSocket transport for sending mutations to the recorder\n */\n\nexport interface TransportMessage {\n type: string;\n payload: unknown;\n}\n\nexport interface TransportOptions {\n /** Maximum mutations to batch before sending */\n batchSize?: number;\n\n /** Interval in ms to flush batched mutations */\n flushInterval?: number;\n\n /** Reconnection delay in ms */\n reconnectDelay?: number;\n\n /** Maximum reconnection attempts */\n maxReconnectAttempts?: number;\n\n /** Callback when connected */\n onConnect?: () => void;\n\n /** Callback when disconnected */\n onDisconnect?: () => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n\n /** Callback for received messages */\n onMessage?: (message: TransportMessage) => void;\n}\n\n/**\n * WebSocket transport layer for State Surgeon\n */\nexport class MutationTransport {\n private url: string;\n private options: Required<TransportOptions>;\n private ws: WebSocket | null = null;\n private buffer: TransportMessage[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempts = 0;\n private isConnecting = false;\n private shouldReconnect = true;\n\n constructor(url: string, options: TransportOptions = {}) {\n this.url = url;\n this.options = {\n batchSize: options.batchSize ?? 50,\n flushInterval: options.flushInterval ?? 100,\n reconnectDelay: options.reconnectDelay ?? 1000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n onConnect: options.onConnect ?? (() => {}),\n onDisconnect: options.onDisconnect ?? (() => {}),\n onError: options.onError ?? (() => {}),\n onMessage: options.onMessage ?? (() => {}),\n };\n }\n\n /**\n * Establishes WebSocket connection\n */\n connect(): void {\n if (this.ws || this.isConnecting) {\n return;\n }\n\n this.isConnecting = true;\n this.shouldReconnect = true;\n\n try {\n // Use WebSocket from global scope (browser) or ws package (Node.js)\n const WebSocketImpl = typeof WebSocket !== 'undefined'\n ? WebSocket\n : require('ws');\n\n this.ws = new WebSocketImpl(this.url);\n\n this.ws.onopen = () => {\n this.isConnecting = false;\n this.reconnectAttempts = 0;\n this.startFlushTimer();\n this.options.onConnect();\n };\n\n this.ws.onclose = () => {\n this.isConnecting = false;\n this.stopFlushTimer();\n this.ws = null;\n this.options.onDisconnect();\n this.attemptReconnect();\n };\n\n this.ws.onerror = (event: Event) => {\n this.isConnecting = false;\n const error = new Error('WebSocket error');\n this.options.onError(error);\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const message = JSON.parse(event.data) as TransportMessage;\n this.options.onMessage(message);\n } catch (e) {\n // Ignore parse errors\n }\n };\n } catch (error) {\n this.isConnecting = false;\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n this.attemptReconnect();\n }\n }\n\n /**\n * Closes the WebSocket connection\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopFlushTimer();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Sends a message (adds to buffer)\n */\n send(message: TransportMessage): void {\n this.buffer.push(message);\n\n if (this.buffer.length >= this.options.batchSize) {\n this.flush();\n }\n }\n\n /**\n * Flushes the buffer immediately\n */\n flush(): void {\n if (this.buffer.length === 0) {\n return;\n }\n\n if (this.ws && this.ws.readyState === 1) { // WebSocket.OPEN = 1\n try {\n // Send as batch\n const batch = {\n type: 'MUTATION_BATCH',\n payload: {\n mutations: this.buffer.map(m => m.payload),\n timestamp: Date.now(),\n },\n };\n\n this.ws.send(JSON.stringify(batch));\n this.buffer = [];\n } catch (error) {\n this.options.onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n\n /**\n * Checks if transport is connected\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === 1;\n }\n\n /**\n * Gets the current buffer size\n */\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.options.flushInterval);\n }\n\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private attemptReconnect(): void {\n if (!this.shouldReconnect) {\n return;\n }\n\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n this.options.onError(new Error('Max reconnection attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.options.reconnectDelay * Math.pow(1.5, this.reconnectAttempts - 1);\n\n setTimeout(() => {\n if (this.shouldReconnect) {\n this.connect();\n }\n }, Math.min(delay, 30000)); // Cap at 30 seconds\n }\n}\n","import { calculateDiff, deepClone } from '../core/diff';\nimport { createMutation, generateSessionId, type Mutation } from '../core/mutation';\nimport { MutationTransport, type TransportOptions } from './transport';\n\n/**\n * Options for the State Surgeon client\n */\nexport interface ClientOptions {\n /** Server URL for the recorder (default: 'ws://localhost:8081') */\n serverUrl?: string;\n\n /** Application ID for grouping sessions */\n appId?: string;\n\n /** Session ID (auto-generated if not provided) */\n sessionId?: string;\n\n /** Enable automatic connection on creation */\n autoConnect?: boolean;\n\n /** Batch size before flushing mutations */\n batchSize?: number;\n\n /** Flush interval in milliseconds */\n flushInterval?: number;\n\n /** Enable console logging for debugging */\n debug?: boolean;\n\n /** Transport options */\n transport?: TransportOptions;\n}\n\n/**\n * Mutation listener callback\n */\nexport type MutationListener = (mutation: Mutation) => void;\n\n/**\n * Main client for State Surgeon\n * Manages the connection to the recorder and handles mutation recording\n */\nexport class StateSurgeonClient {\n private sessionId: string;\n private appId: string;\n private transport: MutationTransport | null = null;\n private listeners: Set<MutationListener> = new Set();\n private isConnected = false;\n private debug: boolean;\n private serverUrl: string;\n private transportOptions: TransportOptions;\n\n // Track mutations locally for offline support\n private localMutations: Mutation[] = [];\n private maxLocalMutations = 10000;\n\n constructor(options: ClientOptions = {}) {\n this.sessionId = options.sessionId || generateSessionId();\n this.appId = options.appId || 'default';\n this.debug = options.debug || false;\n this.serverUrl = options.serverUrl || 'ws://localhost:8081';\n this.transportOptions = {\n batchSize: options.batchSize || 50,\n flushInterval: options.flushInterval || 100,\n ...options.transport,\n };\n\n if (options.autoConnect !== false) {\n this.connect();\n }\n\n this.log('State Surgeon Client initialized', { sessionId: this.sessionId, appId: this.appId });\n }\n\n /**\n * Connects to the recorder server\n */\n connect(): void {\n if (this.transport) {\n return;\n }\n\n this.transport = new MutationTransport(this.serverUrl, {\n ...this.transportOptions,\n onConnect: () => {\n this.isConnected = true;\n this.log('Connected to State Surgeon recorder');\n this.sendHandshake();\n },\n onDisconnect: () => {\n this.isConnected = false;\n this.log('Disconnected from State Surgeon recorder');\n },\n onError: (error) => {\n this.log('Transport error:', error);\n },\n });\n\n this.transport.connect();\n }\n\n /**\n * Disconnects from the recorder server\n */\n disconnect(): void {\n if (this.transport) {\n this.transport.disconnect();\n this.transport = null;\n }\n this.isConnected = false;\n }\n\n /**\n * Sends the initial handshake to register the session\n */\n private sendHandshake(): void {\n if (this.transport) {\n this.transport.send({\n type: 'REGISTER_SESSION',\n payload: {\n appId: this.appId,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'node',\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n },\n });\n }\n }\n\n /**\n * Records a mutation\n */\n recordMutation(mutation: Mutation): void {\n // Add to local storage\n this.localMutations.push(mutation);\n if (this.localMutations.length > this.maxLocalMutations) {\n this.localMutations.shift();\n }\n\n // Notify listeners\n for (const listener of this.listeners) {\n try {\n listener(mutation);\n } catch (error) {\n this.log('Listener error:', error);\n }\n }\n\n // Send to server\n if (this.transport && this.isConnected) {\n this.transport.send({\n type: 'MUTATION_RECORDED',\n payload: mutation,\n });\n }\n\n this.log('Mutation recorded:', mutation.id, mutation.source);\n }\n\n /**\n * Creates and records a mutation from state change\n */\n captureStateChange(\n source: Mutation['source'],\n previousState: unknown,\n nextState: unknown,\n options: {\n actionType?: Mutation['actionType'];\n actionPayload?: unknown;\n component?: string;\n function?: string;\n } = {}\n ): Mutation {\n const mutation = createMutation({\n source,\n sessionId: this.sessionId,\n previousState: deepClone(previousState),\n nextState: deepClone(nextState),\n actionType: options.actionType || 'CUSTOM',\n actionPayload: options.actionPayload,\n component: options.component,\n function: options.function,\n captureStack: true,\n });\n\n // Calculate diff\n mutation.diff = calculateDiff(mutation.previousState, mutation.nextState);\n\n this.recordMutation(mutation);\n return mutation;\n }\n\n /**\n * Adds a mutation listener\n */\n addListener(listener: MutationListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Gets the current session ID\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Gets all local mutations\n */\n getMutations(): Mutation[] {\n return [...this.localMutations];\n }\n\n /**\n * Clears local mutations\n */\n clearMutations(): void {\n this.localMutations = [];\n }\n\n /**\n * Checks if connected to server\n */\n isServerConnected(): boolean {\n return this.isConnected;\n }\n\n /**\n * Flushes any pending mutations\n */\n flush(): void {\n if (this.transport) {\n this.transport.flush();\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[State Surgeon]', ...args);\n }\n }\n}\n\n// Global client instance for convenience\nlet globalClient: StateSurgeonClient | null = null;\n\n/**\n * Gets or creates the global State Surgeon client\n */\nexport function getClient(options?: ClientOptions): StateSurgeonClient {\n if (!globalClient) {\n globalClient = new StateSurgeonClient(options);\n }\n return globalClient;\n}\n\n/**\n * Sets the global client instance\n */\nexport function setClient(client: StateSurgeonClient): void {\n globalClient = client;\n}\n\n/**\n * Resets the global client (for testing)\n */\nexport function resetClient(): void {\n if (globalClient) {\n globalClient.disconnect();\n globalClient = null;\n }\n}\n","import { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Options for API instrumentation\n */\nexport interface APIInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** URLs to ignore (substring match) */\n ignoreUrls?: string[];\n\n /** Whether to capture request bodies */\n captureRequestBody?: boolean;\n\n /** Whether to capture response bodies */\n captureResponseBody?: boolean;\n\n /** Maximum body size to capture (in characters) */\n maxBodySize?: number;\n}\n\n// Store original fetch\nlet originalFetch: typeof fetch | null = null;\nlet fetchInstrumented = false;\n\n// Store original XMLHttpRequest methods\nlet originalXHROpen: typeof XMLHttpRequest.prototype.open | null = null;\nlet originalXHRSend: typeof XMLHttpRequest.prototype.send | null = null;\nlet xhrInstrumented = false;\n\n/**\n * Instruments the global fetch function to track API calls\n *\n * @example\n * ```tsx\n * import { instrumentFetch } from 'state-surgeon/instrument';\n *\n * const cleanup = instrumentFetch({\n * captureResponseBody: true,\n * ignoreUrls: ['/health', '/metrics'],\n * });\n * ```\n */\nexport function instrumentFetch(options: APIInstrumentationOptions = {}): () => void {\n if (fetchInstrumented) {\n console.warn('[State Surgeon] Fetch already instrumented');\n return () => {};\n }\n\n if (typeof fetch === 'undefined') {\n console.warn('[State Surgeon] Fetch not available in this environment');\n return () => {};\n }\n\n const client = options.client || getClient();\n const ignoreUrls = options.ignoreUrls || [];\n const captureRequestBody = options.captureRequestBody !== false;\n const captureResponseBody = options.captureResponseBody !== false;\n const maxBodySize = options.maxBodySize || 10000;\n\n originalFetch = fetch;\n\n (globalThis as any).fetch = async function instrumentedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n\n // Check if URL should be ignored\n if (ignoreUrls.some(ignore => url.includes(ignore))) {\n return originalFetch!(input, init);\n }\n\n const startTime = Date.now();\n const requestId = `req_${startTime}_${Math.random().toString(36).slice(2, 8)}`;\n\n // Capture request info\n const requestInfo: Record<string, unknown> = {\n url,\n method: init?.method || 'GET',\n headers: init?.headers,\n };\n\n if (captureRequestBody && init?.body) {\n requestInfo.body = truncateBody(init.body, maxBodySize);\n }\n\n try {\n const response = await originalFetch!(input, init);\n const duration = Date.now() - startTime;\n\n // Clone response to read body without consuming it\n const clonedResponse = response.clone();\n\n // Capture response info\n const responseInfo: Record<string, unknown> = {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n\n if (captureResponseBody) {\n try {\n const text = await clonedResponse.text();\n responseInfo.body = truncateBody(text, maxBodySize);\n } catch {\n responseInfo.body = '[Unable to read response body]';\n }\n }\n\n // Record mutation\n client.captureStateChange('api', requestInfo, responseInfo, {\n actionType: 'API_RESPONSE',\n actionPayload: {\n requestId,\n url,\n method: requestInfo.method,\n status: response.status,\n duration,\n },\n function: 'fetch',\n });\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n // Record error\n client.captureStateChange('api', requestInfo, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n }, {\n actionType: 'API_RESPONSE',\n actionPayload: {\n requestId,\n url,\n method: requestInfo.method,\n status: 0,\n error: true,\n duration,\n },\n function: 'fetch',\n });\n\n throw error;\n }\n };\n\n fetchInstrumented = true;\n\n return () => {\n if (originalFetch) {\n (globalThis as any).fetch = originalFetch;\n originalFetch = null;\n }\n fetchInstrumented = false;\n };\n}\n\n/**\n * Instruments XMLHttpRequest to track AJAX calls\n *\n * @example\n * ```tsx\n * import { instrumentXHR } from 'state-surgeon/instrument';\n *\n * const cleanup = instrumentXHR();\n * ```\n */\nexport function instrumentXHR(options: APIInstrumentationOptions = {}): () => void {\n if (xhrInstrumented) {\n console.warn('[State Surgeon] XHR already instrumented');\n return () => {};\n }\n\n if (typeof XMLHttpRequest === 'undefined') {\n console.warn('[State Surgeon] XMLHttpRequest not available in this environment');\n return () => {};\n }\n\n const client = options.client || getClient();\n const ignoreUrls = options.ignoreUrls || [];\n const captureResponseBody = options.captureResponseBody !== false;\n const maxBodySize = options.maxBodySize || 10000;\n\n originalXHROpen = XMLHttpRequest.prototype.open;\n originalXHRSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ) {\n (this as any)._stateSurgeon = {\n method,\n url: url.toString(),\n startTime: 0,\n };\n\n return originalXHROpen!.call(this, method, url, async, username, password);\n };\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const info = (this as any)._stateSurgeon;\n\n if (!info || ignoreUrls.some(ignore => info.url.includes(ignore))) {\n return originalXHRSend!.call(this, body);\n }\n\n info.startTime = Date.now();\n const requestId = `xhr_${info.startTime}_${Math.random().toString(36).slice(2, 8)}`;\n\n const requestInfo: Record<string, unknown> = {\n url: info.url,\n method: info.method,\n };\n\n this.addEventListener('loadend', () => {\n const duration = Date.now() - info.startTime;\n\n const responseInfo: Record<string, unknown> = {\n status: this.status,\n statusText: this.statusText,\n };\n\n if (captureResponseBody && this.responseText) {\n responseInfo.body = truncateBody(this.responseText, maxBodySize);\n }\n\n client.captureStateChange('api', requestInfo, responseInfo, {\n actionType: 'API_RESPONSE',\n actionPayload: {\n requestId,\n url: info.url,\n method: info.method,\n status: this.status,\n duration,\n },\n function: 'XMLHttpRequest',\n });\n });\n\n return originalXHRSend!.call(this, body);\n };\n\n xhrInstrumented = true;\n\n return () => {\n if (originalXHROpen) {\n XMLHttpRequest.prototype.open = originalXHROpen;\n originalXHROpen = null;\n }\n if (originalXHRSend) {\n XMLHttpRequest.prototype.send = originalXHRSend;\n originalXHRSend = null;\n }\n xhrInstrumented = false;\n };\n}\n\n/**\n * Truncates body data to maximum size\n */\nfunction truncateBody(body: unknown, maxSize: number): string {\n let str: string;\n\n if (typeof body === 'string') {\n str = body;\n } else if (body instanceof FormData) {\n str = '[FormData]';\n } else if (body instanceof Blob) {\n str = `[Blob: ${body.size} bytes]`;\n } else if (body instanceof ArrayBuffer) {\n str = `[ArrayBuffer: ${body.byteLength} bytes]`;\n } else {\n try {\n str = JSON.stringify(body);\n } catch {\n str = String(body);\n }\n }\n\n if (str.length > maxSize) {\n return str.slice(0, maxSize) + '... [truncated]';\n }\n\n return str;\n}\n","import { deepClone } from '../core/diff';\nimport { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Options for React instrumentation\n */\nexport interface ReactInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** Whether to capture component name from stack trace */\n captureComponentName?: boolean;\n\n /** Custom name for this instrumentation */\n name?: string;\n}\n\n// Store original React methods\nlet originalUseState: typeof import('react').useState | null = null;\nlet originalUseReducer: typeof import('react').useReducer | null = null;\nlet isInstrumented = false;\n\n/**\n * Instruments React hooks to capture state mutations\n *\n * @example\n * ```tsx\n * import React from 'react';\n * import { instrumentReact } from 'state-surgeon/instrument';\n *\n * // Call once at app initialization\n * const cleanup = instrumentReact(React);\n *\n * // Later, to restore original React\n * cleanup();\n * ```\n */\nexport function instrumentReact(\n React: typeof import('react'),\n options: ReactInstrumentationOptions = {}\n): () => void {\n if (isInstrumented) {\n console.warn('[State Surgeon] React already instrumented');\n return () => {};\n }\n\n const client = options.client || getClient();\n const captureComponentName = options.captureComponentName !== false;\n\n // Store originals\n originalUseState = React.useState;\n originalUseReducer = React.useReducer;\n\n // Patch useState\n (React as any).useState = function <T>(initialState: T | (() => T)) {\n const [state, originalSetState] = originalUseState!(initialState);\n\n const instrumentedSetState = (\n newStateOrUpdater: T | ((prevState: T) => T)\n ) => {\n const previousState = deepClone(state);\n\n // Calculate new state\n const newState = typeof newStateOrUpdater === 'function'\n ? (newStateOrUpdater as (prev: T) => T)(state)\n : newStateOrUpdater;\n\n // Record mutation\n client.captureStateChange('react', previousState, newState, {\n actionType: 'SET_STATE',\n component: captureComponentName ? getComponentName() : undefined,\n function: 'useState',\n });\n\n // Call original\n return originalSetState(newStateOrUpdater);\n };\n\n return [state, instrumentedSetState];\n };\n\n // Patch useReducer\n (React as any).useReducer = function <R extends React.Reducer<any, any>>(\n reducer: R,\n initialArg: React.ReducerState<R>,\n init?: (arg: React.ReducerState<R>) => React.ReducerState<R>\n ) {\n // Wrap the reducer to capture mutations\n const instrumentedReducer: R = ((state: React.ReducerState<R>, action: React.ReducerAction<R>) => {\n const previousState = deepClone(state);\n const newState = reducer(state, action);\n\n // Record mutation\n client.captureStateChange('react', previousState, newState, {\n actionType: 'DISPATCH',\n actionPayload: action,\n component: captureComponentName ? getComponentName() : undefined,\n function: 'useReducer',\n });\n\n return newState;\n }) as R;\n\n return originalUseReducer!(instrumentedReducer, initialArg, init);\n };\n\n isInstrumented = true;\n\n // Return cleanup function\n return () => {\n if (originalUseState) {\n (React as any).useState = originalUseState;\n }\n if (originalUseReducer) {\n (React as any).useReducer = originalUseReducer;\n }\n isInstrumented = false;\n originalUseState = null;\n originalUseReducer = null;\n };\n}\n\n/**\n * Attempts to extract component name from stack trace\n */\nfunction getComponentName(): string | undefined {\n const stack = new Error().stack;\n if (!stack) return undefined;\n\n const lines = stack.split('\\n');\n\n // Look for component-like function names\n for (const line of lines) {\n // Skip internal React and State Surgeon frames\n if (\n line.includes('instrumentedSetState') ||\n line.includes('instrumentedReducer') ||\n line.includes('useState') ||\n line.includes('useReducer') ||\n line.includes('react-dom') ||\n line.includes('react.development')\n ) {\n continue;\n }\n\n // Extract function name\n const match = line.match(/at\\s+([A-Z][A-Za-z0-9_]*)/);\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * Creates a manual state tracker for class components or custom state\n *\n * @example\n * ```tsx\n * const tracker = createStateTracker('MyComponent');\n *\n * function updateState(newValue) {\n * const oldValue = state.value;\n * state.value = newValue;\n * tracker.track(oldValue, newValue, 'value update');\n * }\n * ```\n */\nexport function createStateTracker(componentName: string, options: ReactInstrumentationOptions = {}) {\n const client = options.client || getClient();\n\n return {\n track(previousState: unknown, nextState: unknown, action?: string) {\n client.captureStateChange('react', previousState, nextState, {\n actionType: 'SET_STATE',\n component: componentName,\n actionPayload: action ? { description: action } : undefined,\n });\n },\n };\n}\n","import { deepClone } from '../core/diff';\nimport { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Redux store interface (minimal)\n */\ninterface ReduxStore {\n getState: () => unknown;\n dispatch: (action: unknown) => unknown;\n subscribe: (listener: () => void) => () => void;\n replaceReducer?: (reducer: unknown) => void;\n}\n\n/**\n * Redux middleware API\n */\ninterface MiddlewareAPI {\n getState: () => unknown;\n dispatch: (action: unknown) => unknown;\n}\n\n/**\n * Options for Redux instrumentation\n */\nexport interface ReduxInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** Whether to capture full state or just the diff */\n captureFullState?: boolean;\n\n /** Actions to ignore (by type) */\n ignoreActions?: string[];\n\n /** Custom name for this store */\n storeName?: string;\n}\n\n/**\n * Creates a Redux middleware that captures all actions and state changes\n *\n * @example\n * ```tsx\n * import { createStore, applyMiddleware } from 'redux';\n * import { createReduxMiddleware } from 'state-surgeon/instrument';\n *\n * const stateSurgeonMiddleware = createReduxMiddleware();\n * const store = createStore(rootReducer, applyMiddleware(stateSurgeonMiddleware));\n * ```\n */\nexport function createReduxMiddleware(options: ReduxInstrumentationOptions = {}) {\n const client = options.client || getClient();\n const ignoreActions = new Set(options.ignoreActions || []);\n const storeName = options.storeName || 'redux';\n\n return (storeAPI: MiddlewareAPI) => (next: (action: unknown) => unknown) => (action: unknown) => {\n const actionType = (action as { type?: string })?.type;\n\n // Skip ignored actions\n if (actionType && ignoreActions.has(actionType)) {\n return next(action);\n }\n\n // Capture state before\n const previousState = deepClone(storeAPI.getState());\n const startTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n // Execute action\n const result = next(action);\n\n // Capture state after\n const nextState = deepClone(storeAPI.getState());\n const duration = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - startTime;\n\n // Record mutation\n const mutation = client.captureStateChange('redux', previousState, nextState, {\n actionType: 'DISPATCH',\n actionPayload: action,\n component: storeName,\n function: actionType || 'dispatch',\n });\n\n // Add duration\n mutation.duration = duration;\n\n return result;\n };\n}\n\n/**\n * Instruments an existing Redux store by wrapping its dispatch method\n *\n * @example\n * ```tsx\n * import { createStore } from 'redux';\n * import { instrumentReduxStore } from 'state-surgeon/instrument';\n *\n * const store = createStore(rootReducer);\n * const cleanup = instrumentReduxStore(store);\n * ```\n */\nexport function instrumentReduxStore(\n store: ReduxStore,\n options: ReduxInstrumentationOptions = {}\n): () => void {\n const client = options.client || getClient();\n const ignoreActions = new Set(options.ignoreActions || []);\n const storeName = options.storeName || 'redux';\n\n const originalDispatch = store.dispatch;\n\n store.dispatch = function instrumentedDispatch(action: unknown) {\n const actionType = (action as { type?: string })?.type;\n\n // Skip ignored actions\n if (actionType && ignoreActions.has(actionType)) {\n return originalDispatch(action);\n }\n\n // Capture state before\n const previousState = deepClone(store.getState());\n const startTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n // Execute action\n const result = originalDispatch(action);\n\n // Capture state after\n const nextState = deepClone(store.getState());\n const duration = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - startTime;\n\n // Record mutation\n const mutation = client.captureStateChange('redux', previousState, nextState, {\n actionType: 'DISPATCH',\n actionPayload: action,\n component: storeName,\n function: actionType || 'dispatch',\n });\n\n mutation.duration = duration;\n\n return result;\n };\n\n // Return cleanup function\n return () => {\n store.dispatch = originalDispatch;\n };\n}\n\n/**\n * Creates a simple action logger that doesn't require Redux\n * Useful for debugging action flow without full instrumentation\n */\nexport function createActionLogger(options: ReduxInstrumentationOptions = {}) {\n const client = options.client || getClient();\n const storeName = options.storeName || 'action-log';\n\n return {\n log(actionType: string, payload?: unknown, previousState?: unknown, nextState?: unknown) {\n if (previousState !== undefined && nextState !== undefined) {\n client.captureStateChange('redux', previousState, nextState, {\n actionType: 'DISPATCH',\n actionPayload: { type: actionType, payload },\n component: storeName,\n function: actionType,\n });\n }\n },\n };\n}\n","import { deepClone } from '../core/diff';\nimport { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Options for Zustand instrumentation\n */\nexport interface ZustandInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** Custom name for this store */\n storeName?: string;\n}\n\n/**\n * Zustand's StateCreator type (simplified)\n */\ntype StateCreator<T> = (\n set: (partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean) => void,\n get: () => T,\n api: unknown\n) => T;\n\n/**\n * Instruments a Zustand store creator to capture state mutations\n *\n * @example\n * ```tsx\n * import { create } from 'zustand';\n * import { instrumentZustand } from 'state-surgeon/instrument';\n *\n * const useStore = create(\n * instrumentZustand((set) => ({\n * count: 0,\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * }))\n * );\n * ```\n */\nexport function instrumentZustand<T extends object>(\n stateCreator: StateCreator<T>,\n options: ZustandInstrumentationOptions = {}\n): StateCreator<T> {\n const client = options.client || getClient();\n const storeName = options.storeName || 'zustand';\n\n return (set, get, api) => {\n // Wrap the set function\n const instrumentedSet: typeof set = (partial, replace) => {\n const previousState = deepClone(get());\n\n // Call original set\n set(partial, replace);\n\n const nextState = deepClone(get());\n\n // Record mutation\n client.captureStateChange('zustand', previousState, nextState, {\n actionType: 'SET_STATE',\n actionPayload: typeof partial === 'function' ? 'updater function' : partial,\n component: storeName,\n function: 'set',\n });\n };\n\n // Create the store with instrumented set\n return stateCreator(instrumentedSet, get, api);\n };\n}\n\n/**\n * Creates a Zustand middleware for more granular control\n *\n * @example\n * ```tsx\n * import { create } from 'zustand';\n * import { stateSurgeonMiddleware } from 'state-surgeon/instrument';\n *\n * const useStore = create(\n * stateSurgeonMiddleware(\n * (set) => ({\n * count: 0,\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * }),\n * { storeName: 'counterStore' }\n * )\n * );\n * ```\n */\nexport function stateSurgeonMiddleware<T extends object>(\n stateCreator: StateCreator<T>,\n options: ZustandInstrumentationOptions = {}\n): StateCreator<T> {\n return instrumentZustand(stateCreator, options);\n}\n\n/**\n * Higher-order function to wrap individual actions for tracking\n *\n * @example\n * ```tsx\n * const useStore = create((set, get) => ({\n * count: 0,\n * increment: trackAction('increment', () => {\n * set((state) => ({ count: state.count + 1 }));\n * }),\n * }));\n * ```\n */\nexport function trackAction<T extends (...args: any[]) => any>(\n actionName: string,\n action: T,\n options: ZustandInstrumentationOptions = {}\n): T {\n const client = options.client || getClient();\n const storeName = options.storeName || 'zustand';\n\n return ((...args: Parameters<T>) => {\n const startTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const result = action(...args);\n const duration = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - startTime;\n\n // Log action execution (state changes captured separately via set wrapper)\n // This is useful for tracking async actions\n if (result instanceof Promise) {\n result.then(() => {\n // Async action completed\n }).catch(() => {\n // Async action failed\n });\n }\n\n return result;\n }) as T;\n}\n\n/**\n * Creates a subscribe-based tracker for Zustand stores\n * Useful when you can't modify the store creation\n *\n * @example\n * ```tsx\n * import { useStore } from './store';\n * import { subscribeToStore } from 'state-surgeon/instrument';\n *\n * // Subscribe to track all changes\n * const unsubscribe = subscribeToStore(useStore, 'myStore');\n * ```\n */\nexport function subscribeToStore<T extends object>(\n useStore: { getState: () => T; subscribe: (listener: (state: T, prevState: T) => void) => () => void },\n storeName: string,\n options: ZustandInstrumentationOptions = {}\n): () => void {\n const client = options.client || getClient();\n\n return useStore.subscribe((state, prevState) => {\n client.captureStateChange('zustand', prevState, state, {\n actionType: 'SET_STATE',\n component: storeName,\n function: 'subscribe',\n });\n });\n}\n","/**\n * Recorder Module for State Surgeon\n *\n * Express server with WebSocket support for receiving and storing mutations.\n */\n\nexport { createAPIRoutes } from './api';\nexport { TimelineReconstructor } from './reconstructor';\nexport { createRecorderServer, type RecorderServer, type RecorderServerOptions } from './server';\nexport { MutationStore, type MutationStoreOptions } from './store';\n\n","import { Router, type Request, type Response } from 'express';\nimport type { TimelineReconstructor } from './reconstructor';\nimport type { MutationStore } from './store';\n\n/**\n * Creates Express API routes for the recorder\n */\nexport function createAPIRoutes(\n store: MutationStore,\n reconstructor: TimelineReconstructor\n): Router {\n const router = Router();\n\n // Health check\n router.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: Date.now() });\n });\n\n // Get all sessions\n router.get('/sessions', (req: Request, res: Response) => {\n try {\n const appId = req.query.appId as string | undefined;\n const sessions = store.getSessions(appId);\n res.json({ sessions });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get a specific session\n router.get('/sessions/:sessionId', (req: Request, res: Response) => {\n try {\n const session = store.getSession(req.params.sessionId);\n if (!session) {\n return res.status(404).json({ error: 'Session not found' });\n }\n res.json({ session });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Delete a session\n router.delete('/sessions/:sessionId', (req: Request, res: Response) => {\n try {\n const deleted = store.deleteSession(req.params.sessionId);\n res.json({ deleted });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get timeline for a session\n router.get('/sessions/:sessionId/timeline', (req: Request, res: Response) => {\n try {\n const timeline = store.getTimeline(req.params.sessionId);\n res.json({ timeline, count: timeline.length });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Query mutations\n router.get('/mutations', (req: Request, res: Response) => {\n try {\n const options = {\n sessionId: req.query.sessionId as string | undefined,\n startTime: req.query.startTime ? Number(req.query.startTime) : undefined,\n endTime: req.query.endTime ? Number(req.query.endTime) : undefined,\n source: req.query.source as string | undefined,\n component: req.query.component as string | undefined,\n limit: req.query.limit ? Number(req.query.limit) : 100,\n offset: req.query.offset ? Number(req.query.offset) : 0,\n sortOrder: (req.query.sortOrder as 'asc' | 'desc') || 'asc',\n };\n\n const mutations = store.queryMutations(options);\n res.json({ mutations, count: mutations.length });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get a specific mutation\n router.get('/mutations/:mutationId', (req: Request, res: Response) => {\n try {\n const mutation = store.getMutation(req.params.mutationId);\n if (!mutation) {\n return res.status(404).json({ error: 'Mutation not found' });\n }\n res.json({ mutation });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get state at mutation\n router.get('/mutations/:mutationId/state', async (req: Request, res: Response) => {\n try {\n const state = await reconstructor.getStateAtMutation(req.params.mutationId);\n res.json({ state });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get causal chain\n router.get('/mutations/:mutationId/chain', async (req: Request, res: Response) => {\n try {\n const maxDepth = req.query.maxDepth ? Number(req.query.maxDepth) : 100;\n const chain = await reconstructor.findCausalChain(req.params.mutationId, maxDepth);\n res.json({ chain });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Find mutations for a path\n router.get('/sessions/:sessionId/path', async (req: Request, res: Response) => {\n try {\n const path = req.query.path as string;\n if (!path) {\n return res.status(400).json({ error: 'Path is required' });\n }\n const mutations = await reconstructor.findMutationsForPath(req.params.sessionId, path);\n res.json({ mutations, count: mutations.length });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Summarize time range\n router.get('/sessions/:sessionId/summary', async (req: Request, res: Response) => {\n try {\n const startTime = Number(req.query.startTime);\n const endTime = Number(req.query.endTime);\n\n if (isNaN(startTime) || isNaN(endTime)) {\n return res.status(400).json({ error: 'startTime and endTime are required' });\n }\n\n const summary = await reconstructor.summarizeTimeRange(\n req.params.sessionId,\n startTime,\n endTime\n );\n res.json({ summary });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get store statistics\n router.get('/stats', (_req: Request, res: Response) => {\n try {\n const stats = store.getStats();\n res.json({ stats });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Clear all data\n router.delete('/clear', (_req: Request, res: Response) => {\n try {\n store.clear();\n reconstructor.clearCache();\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n return router;\n}\n","import { deepClone, getValueAtPath } from '../core/diff';\nimport type { Mutation } from '../core/mutation';\nimport type { MutationStore } from './store';\n\n/**\n * Validation function for state corruption detection\n */\nexport type StateValidator = (state: unknown) => boolean;\n\n/**\n * Result of causal chain analysis\n */\nexport interface CausalChain {\n mutations: Mutation[];\n rootCause?: Mutation;\n corrupted?: Mutation;\n}\n\n/**\n * Timeline reconstruction engine\n * Provides tools for investigating state history\n */\nexport class TimelineReconstructor {\n private store: MutationStore;\n private stateCache: Map<string, unknown> = new Map();\n private maxCacheSize = 1000;\n\n constructor(store: MutationStore) {\n this.store = store;\n }\n\n /**\n * Reconstructs the state at a specific mutation\n */\n async getStateAtMutation(mutationId: string): Promise<unknown> {\n // Check cache\n const cached = this.stateCache.get(mutationId);\n if (cached !== undefined) {\n return deepClone(cached);\n }\n\n // Find the mutation\n const targetMutation = this.store.getMutation(mutationId);\n if (!targetMutation) {\n throw new Error(`Mutation not found: ${mutationId}`);\n }\n\n // Get all mutations up to this point\n const timeline = this.store.getTimeline(targetMutation.sessionId);\n const targetIndex = timeline.findIndex(m => m.id === mutationId);\n\n if (targetIndex === -1) {\n throw new Error(`Mutation not in timeline: ${mutationId}`);\n }\n\n // Build state by applying mutations in order\n let state: unknown = {};\n\n for (let i = 0; i <= targetIndex; i++) {\n const mutation = timeline[i];\n state = mutation.nextState;\n\n // Cache each state along the way\n this.cacheState(mutation.id, state);\n }\n\n return deepClone(state);\n }\n\n /**\n * Reconstructs the state at a specific timestamp\n */\n async getStateAtTime(sessionId: string, timestamp: number): Promise<unknown> {\n const timeline = this.store.getTimeline(sessionId);\n\n // Find the last mutation before or at the timestamp\n let lastMutation: Mutation | null = null;\n\n for (const mutation of timeline) {\n if (mutation.timestamp <= timestamp) {\n lastMutation = mutation;\n } else {\n break;\n }\n }\n\n if (!lastMutation) {\n return {}; // No mutations yet, return empty state\n }\n\n return this.getStateAtMutation(lastMutation.id);\n }\n\n /**\n * Finds the causal chain leading to a mutation\n */\n async findCausalChain(\n mutationId: string,\n maxDepth: number = 100\n ): Promise<CausalChain> {\n const chain: Mutation[] = [];\n let currentId: string | undefined = mutationId;\n let depth = 0;\n\n while (currentId && depth < maxDepth) {\n const mutation = this.store.getMutation(currentId);\n if (!mutation) break;\n\n chain.push(mutation);\n\n // Follow parent or causes\n if (mutation.parentMutationId) {\n currentId = mutation.parentMutationId;\n } else if (mutation.causes && mutation.causes.length > 0) {\n currentId = mutation.causes[0];\n } else {\n break;\n }\n\n depth++;\n }\n\n return {\n mutations: chain.reverse(),\n rootCause: chain[0],\n };\n }\n\n /**\n * Binary search to find when state became invalid\n */\n async findStateCorruption(\n sessionId: string,\n validator: StateValidator\n ): Promise<Mutation | null> {\n const timeline = this.store.getTimeline(sessionId);\n\n if (timeline.length === 0) {\n return null;\n }\n\n let left = 0;\n let right = timeline.length - 1;\n let firstBad: number | null = null;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const state = await this.getStateAtMutation(timeline[mid].id);\n const isValid = validator(state);\n\n if (isValid) {\n // State is valid at this point, corruption is after\n left = mid + 1;\n } else {\n // State is invalid, corruption is at or before\n firstBad = mid;\n right = mid - 1;\n }\n }\n\n return firstBad !== null ? timeline[firstBad] : null;\n }\n\n /**\n * Finds all mutations that touched a specific path\n */\n async findMutationsForPath(\n sessionId: string,\n path: string\n ): Promise<Mutation[]> {\n const timeline = this.store.getTimeline(sessionId);\n const result: Mutation[] = [];\n\n for (const mutation of timeline) {\n // Check if the diff touches this path\n if (mutation.diff) {\n for (const diff of mutation.diff) {\n if (diff.path === path || diff.path.startsWith(path + '.') || diff.path.startsWith(path + '[')) {\n result.push(mutation);\n break;\n }\n }\n } else {\n // No diff, compare values directly\n const prevValue = getValueAtPath(mutation.previousState, path);\n const nextValue = getValueAtPath(mutation.nextState, path);\n\n if (prevValue !== nextValue) {\n result.push(mutation);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Compares two sessions to find divergence points\n */\n async compareSessions(\n sessionId1: string,\n sessionId2: string\n ): Promise<{\n divergencePoint?: number;\n session1Only: Mutation[];\n session2Only: Mutation[];\n }> {\n const timeline1 = this.store.getTimeline(sessionId1);\n const timeline2 = this.store.getTimeline(sessionId2);\n\n let divergencePoint: number | undefined;\n\n // Find first point of divergence\n const minLength = Math.min(timeline1.length, timeline2.length);\n\n for (let i = 0; i < minLength; i++) {\n const state1 = await this.getStateAtMutation(timeline1[i].id);\n const state2 = await this.getStateAtMutation(timeline2[i].id);\n\n if (JSON.stringify(state1) !== JSON.stringify(state2)) {\n divergencePoint = i;\n break;\n }\n }\n\n // Find unique actions\n const actions1 = new Set(timeline1.map(m => `${m.actionType}:${JSON.stringify(m.actionPayload)}`));\n const actions2 = new Set(timeline2.map(m => `${m.actionType}:${JSON.stringify(m.actionPayload)}`));\n\n const session1Only = timeline1.filter(m =>\n !actions2.has(`${m.actionType}:${JSON.stringify(m.actionPayload)}`)\n );\n const session2Only = timeline2.filter(m =>\n !actions1.has(`${m.actionType}:${JSON.stringify(m.actionPayload)}`)\n );\n\n return {\n divergencePoint,\n session1Only,\n session2Only,\n };\n }\n\n /**\n * Generates a summary of what happened in a time range\n */\n async summarizeTimeRange(\n sessionId: string,\n startTime: number,\n endTime: number\n ): Promise<{\n mutationCount: number;\n componentBreakdown: Record<string, number>;\n sourceBreakdown: Record<string, number>;\n pathsChanged: string[];\n }> {\n const mutations = this.store.queryMutations({\n sessionId,\n startTime,\n endTime,\n });\n\n const componentBreakdown: Record<string, number> = {};\n const sourceBreakdown: Record<string, number> = {};\n const pathsSet = new Set<string>();\n\n for (const mutation of mutations) {\n // Count by component\n const component = mutation.component || 'unknown';\n componentBreakdown[component] = (componentBreakdown[component] || 0) + 1;\n\n // Count by source\n sourceBreakdown[mutation.source] = (sourceBreakdown[mutation.source] || 0) + 1;\n\n // Collect changed paths\n if (mutation.diff) {\n for (const diff of mutation.diff) {\n pathsSet.add(diff.path);\n }\n }\n }\n\n return {\n mutationCount: mutations.length,\n componentBreakdown,\n sourceBreakdown,\n pathsChanged: Array.from(pathsSet),\n };\n }\n\n /**\n * Clears the state cache\n */\n clearCache(): void {\n this.stateCache.clear();\n }\n\n private cacheState(mutationId: string, state: unknown): void {\n if (this.stateCache.size >= this.maxCacheSize) {\n // Remove oldest entry\n const firstKey = this.stateCache.keys().next().value;\n if (firstKey) {\n this.stateCache.delete(firstKey);\n }\n }\n this.stateCache.set(mutationId, deepClone(state));\n }\n}\n","import { calculateDiff } from '../core/diff';\nimport type { Mutation } from '../core/mutation';\n\n/**\n * Session metadata\n */\nexport interface Session {\n id: string;\n appId: string;\n startTime: Date;\n endTime?: Date;\n userAgent?: string;\n url?: string;\n metadata?: Record<string, unknown>;\n mutationCount: number;\n}\n\n/**\n * Query options for fetching mutations\n */\nexport interface MutationQueryOptions {\n sessionId?: string;\n startTime?: number;\n endTime?: number;\n source?: Mutation['source'];\n component?: string;\n limit?: number;\n offset?: number;\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Options for the mutation store\n */\nexport interface MutationStoreOptions {\n /** Maximum mutations to keep per session */\n maxMutationsPerSession?: number;\n\n /** Maximum total mutations across all sessions */\n maxTotalMutations?: number;\n\n /** Session timeout in milliseconds */\n sessionTimeout?: number;\n\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * In-memory mutation store\n * Can be extended to support MongoDB or other persistent storage\n */\nexport class MutationStore {\n private sessions: Map<string, Session> = new Map();\n private mutations: Map<string, Mutation[]> = new Map();\n private options: Required<MutationStoreOptions>;\n private totalMutationCount = 0;\n\n constructor(options: MutationStoreOptions = {}) {\n this.options = {\n maxMutationsPerSession: options.maxMutationsPerSession ?? 10000,\n maxTotalMutations: options.maxTotalMutations ?? 100000,\n sessionTimeout: options.sessionTimeout ?? 30 * 60 * 1000, // 30 minutes\n debug: options.debug ?? false,\n };\n }\n\n /**\n * Creates or updates a session\n */\n registerSession(\n sessionId: string,\n appId: string,\n metadata?: Record<string, unknown>\n ): Session {\n let session = this.sessions.get(sessionId);\n\n if (!session) {\n session = {\n id: sessionId,\n appId,\n startTime: new Date(),\n metadata,\n mutationCount: 0,\n };\n this.sessions.set(sessionId, session);\n this.mutations.set(sessionId, []);\n this.log('Session registered:', sessionId);\n }\n\n return session;\n }\n\n /**\n * Ends a session\n */\n endSession(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.endTime = new Date();\n this.log('Session ended:', sessionId);\n }\n }\n\n /**\n * Stores a mutation\n */\n storeMutation(mutation: Mutation): void {\n const sessionId = mutation.sessionId;\n\n // Ensure session exists\n if (!this.sessions.has(sessionId)) {\n this.registerSession(sessionId, 'unknown');\n }\n\n // Get or create mutation array\n let sessionMutations = this.mutations.get(sessionId);\n if (!sessionMutations) {\n sessionMutations = [];\n this.mutations.set(sessionId, sessionMutations);\n }\n\n // Add diff if not present\n if (!mutation.diff && mutation.previousState !== undefined && mutation.nextState !== undefined) {\n mutation.diff = calculateDiff(mutation.previousState, mutation.nextState);\n }\n\n // Enforce limits\n if (sessionMutations.length >= this.options.maxMutationsPerSession) {\n sessionMutations.shift();\n this.totalMutationCount--;\n }\n\n if (this.totalMutationCount >= this.options.maxTotalMutations) {\n this.evictOldestMutations();\n }\n\n // Store mutation\n sessionMutations.push(mutation);\n this.totalMutationCount++;\n\n // Update session\n const session = this.sessions.get(sessionId)!;\n session.mutationCount++;\n\n this.log('Mutation stored:', mutation.id);\n }\n\n /**\n * Stores multiple mutations at once\n */\n storeMutations(mutations: Mutation[]): void {\n for (const mutation of mutations) {\n this.storeMutation(mutation);\n }\n }\n\n /**\n * Gets a session by ID\n */\n getSession(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Gets all sessions\n */\n getSessions(appId?: string): Session[] {\n const sessions = Array.from(this.sessions.values());\n if (appId) {\n return sessions.filter(s => s.appId === appId);\n }\n return sessions;\n }\n\n /**\n * Gets a specific mutation by ID\n */\n getMutation(mutationId: string): Mutation | undefined {\n for (const sessionMutations of this.mutations.values()) {\n const mutation = sessionMutations.find(m => m.id === mutationId);\n if (mutation) return mutation;\n }\n return undefined;\n }\n\n /**\n * Queries mutations with filters\n */\n queryMutations(options: MutationQueryOptions = {}): Mutation[] {\n let results: Mutation[] = [];\n\n // Get mutations from specific session or all sessions\n if (options.sessionId) {\n const sessionMutations = this.mutations.get(options.sessionId);\n if (sessionMutations) {\n results = [...sessionMutations];\n }\n } else {\n for (const sessionMutations of this.mutations.values()) {\n results.push(...sessionMutations);\n }\n }\n\n // Filter by time range\n if (options.startTime !== undefined) {\n results = results.filter(m => m.timestamp >= options.startTime!);\n }\n if (options.endTime !== undefined) {\n results = results.filter(m => m.timestamp <= options.endTime!);\n }\n\n // Filter by source\n if (options.source) {\n results = results.filter(m => m.source === options.source);\n }\n\n // Filter by component\n if (options.component) {\n results = results.filter(m => m.component === options.component);\n }\n\n // Sort\n results.sort((a, b) => {\n const order = options.sortOrder === 'desc' ? -1 : 1;\n return (a.logicalClock - b.logicalClock) * order;\n });\n\n // Apply pagination\n if (options.offset !== undefined) {\n results = results.slice(options.offset);\n }\n if (options.limit !== undefined) {\n results = results.slice(0, options.limit);\n }\n\n return results;\n }\n\n /**\n * Gets the timeline for a session\n */\n getTimeline(sessionId: string): Mutation[] {\n const mutations = this.mutations.get(sessionId) || [];\n return [...mutations].sort((a, b) => a.logicalClock - b.logicalClock);\n }\n\n /**\n * Deletes a session and its mutations\n */\n deleteSession(sessionId: string): boolean {\n const sessionMutations = this.mutations.get(sessionId);\n if (sessionMutations) {\n this.totalMutationCount -= sessionMutations.length;\n }\n\n this.mutations.delete(sessionId);\n return this.sessions.delete(sessionId);\n }\n\n /**\n * Clears all data\n */\n clear(): void {\n this.sessions.clear();\n this.mutations.clear();\n this.totalMutationCount = 0;\n this.log('Store cleared');\n }\n\n /**\n * Gets store statistics\n */\n getStats(): {\n sessionCount: number;\n totalMutations: number;\n mutationsPerSession: Record<string, number>;\n } {\n const mutationsPerSession: Record<string, number> = {};\n for (const [sessionId, mutations] of this.mutations.entries()) {\n mutationsPerSession[sessionId] = mutations.length;\n }\n\n return {\n sessionCount: this.sessions.size,\n totalMutations: this.totalMutationCount,\n mutationsPerSession,\n };\n }\n\n /**\n * Evicts oldest mutations when capacity is exceeded\n */\n private evictOldestMutations(): void {\n // Find session with oldest mutations\n let oldestSession: string | null = null;\n let oldestTime = Infinity;\n\n for (const [sessionId, session] of this.sessions.entries()) {\n if (session.startTime.getTime() < oldestTime) {\n oldestTime = session.startTime.getTime();\n oldestSession = sessionId;\n }\n }\n\n if (oldestSession) {\n const mutations = this.mutations.get(oldestSession);\n if (mutations && mutations.length > 0) {\n mutations.shift();\n this.totalMutationCount--;\n this.log('Evicted oldest mutation from:', oldestSession);\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[MutationStore]', ...args);\n }\n }\n}\n","import express, { type Express } from 'express';\nimport type { Server } from 'http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { Mutation } from '../core/mutation';\nimport { createAPIRoutes } from './api';\nimport { TimelineReconstructor } from './reconstructor';\nimport { MutationStore, type MutationStoreOptions } from './store';\n\n/**\n * Options for the recorder server\n */\nexport interface RecorderServerOptions {\n /** HTTP port (default: 8080) */\n port?: number;\n\n /** WebSocket port (default: 8081) */\n wsPort?: number;\n\n /** Enable CORS (default: true) */\n cors?: boolean;\n\n /** API base path (default: '/api') */\n apiPath?: string;\n\n /** Mutation store options */\n storeOptions?: MutationStoreOptions;\n\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Recorder server instance\n */\nexport interface RecorderServer {\n /** Express application */\n app: Express;\n\n /** HTTP server */\n httpServer: Server;\n\n /** WebSocket server */\n wss: WebSocketServer;\n\n /** Mutation store */\n store: MutationStore;\n\n /** Timeline reconstructor */\n reconstructor: TimelineReconstructor;\n\n /** Start the server */\n start: () => Promise<void>;\n\n /** Stop the server */\n stop: () => Promise<void>;\n}\n\ninterface WSMessage {\n type: string;\n payload: unknown;\n}\n\n/**\n * Creates a State Surgeon recorder server\n *\n * @example\n * ```ts\n * import { createRecorderServer } from 'state-surgeon/recorder';\n *\n * const server = createRecorderServer({ port: 8080 });\n * await server.start();\n *\n * console.log('State Surgeon Recorder running on http://localhost:8080');\n * ```\n */\nexport function createRecorderServer(options: RecorderServerOptions = {}): RecorderServer {\n const port = options.port ?? 8080;\n const wsPort = options.wsPort ?? 8081;\n const apiPath = options.apiPath ?? '/api';\n const debug = options.debug ?? false;\n\n // Create store and reconstructor\n const store = new MutationStore(options.storeOptions);\n const reconstructor = new TimelineReconstructor(store);\n\n // Create Express app\n const app = express();\n\n // Middleware\n app.use(express.json({ limit: '10mb' }));\n\n // CORS\n if (options.cors !== false) {\n app.use((_req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');\n next();\n });\n }\n\n // API routes\n app.use(apiPath, createAPIRoutes(store, reconstructor));\n\n // Dashboard route placeholder\n app.get('/_surgeon', (_req, res) => {\n res.send(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>State Surgeon Dashboard</title>\n <style>\n body { font-family: system-ui, sans-serif; padding: 2rem; background: #1a1a2e; color: #eee; }\n h1 { color: #00d9ff; }\n .stats { background: #16213e; padding: 1rem; border-radius: 8px; margin: 1rem 0; }\n pre { background: #0f0f23; padding: 1rem; border-radius: 4px; overflow: auto; }\n </style>\n </head>\n <body>\n <h1>🔬 State Surgeon Dashboard</h1>\n <p>Recorder is running. Connect your application to start capturing mutations.</p>\n <div class=\"stats\">\n <h3>Quick Stats</h3>\n <div id=\"stats\">Loading...</div>\n </div>\n <h3>Recent Sessions</h3>\n <pre id=\"sessions\">Loading...</pre>\n <script>\n async function loadData() {\n try {\n const statsRes = await fetch('${apiPath}/stats');\n const stats = await statsRes.json();\n document.getElementById('stats').innerHTML =\n '<pre>' + JSON.stringify(stats, null, 2) + '</pre>';\n\n const sessionsRes = await fetch('${apiPath}/sessions');\n const sessions = await sessionsRes.json();\n document.getElementById('sessions').textContent =\n JSON.stringify(sessions, null, 2);\n } catch (e) {\n document.getElementById('stats').textContent = 'Error loading stats';\n }\n }\n loadData();\n setInterval(loadData, 5000);\n </script>\n </body>\n </html>\n `);\n });\n\n // Create HTTP server\n const httpServer = app.listen(0); // Will bind to actual port in start()\n httpServer.close();\n\n // Create WebSocket server\n let wss: WebSocketServer;\n\n // Connected clients\n const clients = new Map<WebSocket, { sessionId?: string }>();\n\n function log(...args: unknown[]) {\n if (debug) {\n console.log('[State Surgeon Recorder]', ...args);\n }\n }\n\n function handleMessage(ws: WebSocket, message: WSMessage) {\n log('Received message:', message.type);\n\n switch (message.type) {\n case 'REGISTER_SESSION': {\n const payload = message.payload as {\n sessionId: string;\n appId: string;\n userAgent?: string;\n url?: string;\n };\n\n store.registerSession(payload.sessionId, payload.appId, {\n userAgent: payload.userAgent,\n url: payload.url,\n });\n\n clients.set(ws, { sessionId: payload.sessionId });\n\n ws.send(JSON.stringify({\n type: 'SESSION_CONFIRMED',\n payload: { sessionId: payload.sessionId },\n }));\n\n log('Session registered:', payload.sessionId);\n break;\n }\n\n case 'MUTATION_RECORDED': {\n const mutation = message.payload as Mutation;\n store.storeMutation(mutation);\n\n ws.send(JSON.stringify({\n type: 'MUTATION_ACKNOWLEDGED',\n payload: { mutationId: mutation.id, receivedAt: Date.now() },\n }));\n break;\n }\n\n case 'MUTATION_BATCH': {\n const payload = message.payload as { mutations: Mutation[] };\n store.storeMutations(payload.mutations);\n\n ws.send(JSON.stringify({\n type: 'BATCH_ACKNOWLEDGED',\n payload: { count: payload.mutations.length, receivedAt: Date.now() },\n }));\n\n log('Batch received:', payload.mutations.length, 'mutations');\n break;\n }\n\n case 'END_SESSION': {\n const clientInfo = clients.get(ws);\n if (clientInfo?.sessionId) {\n store.endSession(clientInfo.sessionId);\n log('Session ended:', clientInfo.sessionId);\n }\n break;\n }\n\n default:\n log('Unknown message type:', message.type);\n }\n }\n\n const server: RecorderServer = {\n app,\n httpServer: null as unknown as Server,\n wss: null as unknown as WebSocketServer,\n store,\n reconstructor,\n\n async start() {\n return new Promise((resolve) => {\n // Start HTTP server\n server.httpServer = app.listen(port, () => {\n log(`HTTP server listening on port ${port}`);\n });\n\n // Start WebSocket server\n wss = new WebSocketServer({ port: wsPort });\n server.wss = wss;\n\n wss.on('connection', (ws) => {\n log('Client connected');\n clients.set(ws, {});\n\n ws.on('message', (data) => {\n try {\n const message = JSON.parse(data.toString()) as WSMessage;\n handleMessage(ws, message);\n } catch (error) {\n log('Error parsing message:', error);\n }\n });\n\n ws.on('close', () => {\n const clientInfo = clients.get(ws);\n if (clientInfo?.sessionId) {\n store.endSession(clientInfo.sessionId);\n }\n clients.delete(ws);\n log('Client disconnected');\n });\n\n ws.on('error', (error) => {\n log('WebSocket error:', error);\n });\n });\n\n wss.on('listening', () => {\n log(`WebSocket server listening on port ${wsPort}`);\n resolve();\n });\n });\n },\n\n async stop() {\n return new Promise((resolve) => {\n // Close all WebSocket connections\n for (const ws of clients.keys()) {\n ws.close();\n }\n clients.clear();\n\n // Close WebSocket server\n if (wss) {\n wss.close(() => {\n log('WebSocket server closed');\n });\n }\n\n // Close HTTP server\n if (server.httpServer) {\n server.httpServer.close(() => {\n log('HTTP server closed');\n resolve();\n });\n } else {\n resolve();\n }\n });\n },\n };\n\n return server;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/analyzer.ts","../src/core/diff.ts","../src/core/mutation.ts","../src/core/utils.ts","../src/instrument/index.ts","../src/instrument/transport.ts","../src/instrument/client.ts","../src/instrument/api.ts","../src/instrument/react.ts","../src/instrument/redux.ts","../src/instrument/zustand.ts","../src/recorder/index.ts","../src/recorder/api.ts","../src/recorder/reconstructor.ts","../src/recorder/store.ts","../src/recorder/server.ts"],"names":["getValueAtPath","uuidv4"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * State Surgeon Analyzer\n *\n * Core analysis engine for detecting state issues.\n */\n\nimport type { Mutation, StateDiff } from './mutation';\n\n// Issue severity levels\nexport type IssueSeverity = 'critical' | 'warning' | 'info';\n\n// Issue categories matching the 10 problem types\nexport type IssueCategory =\n | 'state-loss' // Fields removed (overwrites vs merges)\n | 'invalid-value' // NaN, undefined in wrong place\n | 'type-change' // Type changed unexpectedly\n | 'no-op-update' // Update that changed nothing\n | 'excessive-updates' // Too many updates in short time\n | 'broken-invariant' // User-defined rule violated\n | 'hidden-coupling' // Multiple components touch same state\n | 'temporal-anomaly' // Suspicious timing pattern\n | 'state-corruption'; // State became invalid\n\nexport interface Issue {\n id: string;\n category: IssueCategory;\n severity: IssueSeverity;\n title: string;\n description: string;\n mutationId: string;\n mutationIndex: number;\n path?: string;\n previousValue?: unknown;\n currentValue?: unknown;\n relatedMutations?: string[];\n suggestion?: string;\n timestamp: number;\n}\n\nexport interface DependencyNode {\n path: string;\n components: Set<string>;\n mutationCount: number;\n lastMutationId: string;\n}\n\nexport interface DependencyGraph {\n nodes: Map<string, DependencyNode>;\n couplings: Array<{\n path: string;\n components: string[];\n severity: IssueSeverity;\n }>;\n}\n\nexport interface CausalChain {\n rootMutation: Mutation;\n effects: Array<{\n mutation: Mutation;\n causedBy: string;\n reason: string;\n }>;\n}\n\nexport interface Invariant {\n name: string;\n path: string;\n rule: (value: unknown) => boolean;\n message: string;\n}\n\n/**\n * Main analyzer class\n */\nexport class StateAnalyzer {\n private invariants: Invariant[] = [];\n private updateTimestamps: Map<string, number[]> = new Map();\n\n constructor() {}\n\n /**\n * Register custom invariant rules\n */\n addInvariant(invariant: Invariant): void {\n this.invariants.push(invariant);\n }\n\n /**\n * Analyze a single mutation for issues\n */\n analyzeMutation(\n mutation: Mutation,\n index: number,\n timeline: Mutation[]\n ): Issue[] {\n const issues: Issue[] = [];\n\n // Check for state loss (removed fields)\n if (mutation.diff) {\n for (const diff of mutation.diff) {\n // State Loss Detection\n if (diff.operation === 'REMOVE') {\n issues.push({\n id: `issue_${mutation.id}_${diff.path}_loss`,\n category: 'state-loss',\n severity: 'critical',\n title: `State field removed: ${diff.path}`,\n description: `The field \"${diff.path}\" was removed from state. This may indicate an overwrite instead of a merge.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: undefined,\n suggestion: 'Use spread operator to preserve existing fields: setState(prev => ({ ...prev, newField }))',\n timestamp: mutation.timestamp,\n });\n }\n\n // Invalid Value Detection\n if (diff.operation !== 'REMOVE') {\n const invalidIssue = this.checkInvalidValue(diff, mutation, index);\n if (invalidIssue) {\n issues.push(invalidIssue);\n }\n }\n\n // Type Change Detection\n if (diff.operation === 'UPDATE') {\n const typeIssue = this.checkTypeChange(diff, mutation, index);\n if (typeIssue) {\n issues.push(typeIssue);\n }\n }\n }\n }\n\n // No-op Update Detection\n if (this.isNoOpUpdate(mutation)) {\n issues.push({\n id: `issue_${mutation.id}_noop`,\n category: 'no-op-update',\n severity: 'info',\n title: 'Redundant state update',\n description: 'This mutation did not change any values. Consider memoizing or adding conditions.',\n mutationId: mutation.id,\n mutationIndex: index,\n suggestion: 'Add a condition before updating: if (newValue !== currentValue) setState(newValue)',\n timestamp: mutation.timestamp,\n });\n }\n\n // Excessive Updates Detection\n const excessiveIssue = this.checkExcessiveUpdates(mutation, index);\n if (excessiveIssue) {\n issues.push(excessiveIssue);\n }\n\n // Invariant Violations\n for (const invariant of this.invariants) {\n const violation = this.checkInvariant(invariant, mutation, index);\n if (violation) {\n issues.push(violation);\n }\n }\n\n return issues;\n }\n\n /**\n * Check for invalid values (NaN, unexpected undefined/null)\n */\n private checkInvalidValue(\n diff: StateDiff,\n mutation: Mutation,\n index: number\n ): Issue | null {\n const value = diff.newValue;\n\n // NaN detection\n if (typeof value === 'number' && isNaN(value)) {\n return {\n id: `issue_${mutation.id}_${diff.path}_nan`,\n category: 'invalid-value',\n severity: 'critical',\n title: `NaN value at: ${diff.path}`,\n description: `The value at \"${diff.path}\" became NaN. This usually indicates a calculation with undefined/null.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: value,\n suggestion: 'Check for undefined/null values before calculation. Use default values: (value ?? 0)',\n timestamp: mutation.timestamp,\n };\n }\n\n // Unexpected undefined (if previous was defined)\n if (value === undefined && diff.oldValue !== undefined && diff.operation === 'UPDATE') {\n return {\n id: `issue_${mutation.id}_${diff.path}_undefined`,\n category: 'invalid-value',\n severity: 'critical',\n title: `Value became undefined: ${diff.path}`,\n description: `The field \"${diff.path}\" changed from a defined value to undefined.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: undefined,\n suggestion: 'Ensure the value is always defined or explicitly handle undefined cases.',\n timestamp: mutation.timestamp,\n };\n }\n\n return null;\n }\n\n /**\n * Check for unexpected type changes\n */\n private checkTypeChange(\n diff: StateDiff,\n mutation: Mutation,\n index: number\n ): Issue | null {\n if (diff.oldValue === undefined || diff.oldValue === null) return null;\n if (diff.newValue === undefined || diff.newValue === null) return null;\n\n const oldType = typeof diff.oldValue;\n const newType = typeof diff.newValue;\n\n if (oldType !== newType) {\n return {\n id: `issue_${mutation.id}_${diff.path}_type`,\n category: 'type-change',\n severity: 'warning',\n title: `Type changed: ${diff.path}`,\n description: `The type of \"${diff.path}\" changed from ${oldType} to ${newType}.`,\n mutationId: mutation.id,\n mutationIndex: index,\n path: diff.path,\n previousValue: diff.oldValue,\n currentValue: diff.newValue,\n suggestion: 'Ensure consistent types. Use TypeScript or runtime validation.',\n timestamp: mutation.timestamp,\n };\n }\n\n return null;\n }\n\n /**\n * Check if mutation is a no-op (no actual changes)\n */\n private isNoOpUpdate(mutation: Mutation): boolean {\n if (!mutation.diff || mutation.diff.length === 0) {\n // No diff means no change\n return true;\n }\n\n // Check if all diffs are identity updates\n return mutation.diff.every(d => {\n if (d.operation !== 'UPDATE') return false;\n return JSON.stringify(d.oldValue) === JSON.stringify(d.newValue);\n });\n }\n\n /**\n * Check for excessive updates in short time period\n */\n private checkExcessiveUpdates(\n mutation: Mutation,\n index: number\n ): Issue | null {\n const key = mutation.component || mutation.source;\n const timestamps = this.updateTimestamps.get(key) || [];\n\n // Add current timestamp\n timestamps.push(mutation.timestamp);\n\n // Keep only last 100ms of timestamps\n const cutoff = mutation.timestamp - 100;\n const recentTimestamps = timestamps.filter(t => t >= cutoff);\n this.updateTimestamps.set(key, recentTimestamps);\n\n // Too many updates in 100ms\n if (recentTimestamps.length > 5) {\n return {\n id: `issue_${mutation.id}_excessive`,\n category: 'excessive-updates',\n severity: 'warning',\n title: `Excessive updates from: ${key}`,\n description: `${recentTimestamps.length} mutations in 100ms from \"${key}\". This may cause performance issues.`,\n mutationId: mutation.id,\n mutationIndex: index,\n suggestion: 'Use debouncing, batching, or memoization to reduce update frequency.',\n timestamp: mutation.timestamp,\n };\n }\n\n return null;\n }\n\n /**\n * Check custom invariant rule\n */\n private checkInvariant(\n invariant: Invariant,\n mutation: Mutation,\n index: number\n ): Issue | null {\n if (!mutation.nextState) return null;\n\n // Get value at path\n const value = getValueAtPath(mutation.nextState, invariant.path);\n\n try {\n const isValid = invariant.rule(value);\n if (!isValid) {\n return {\n id: `issue_${mutation.id}_invariant_${invariant.name}`,\n category: 'broken-invariant',\n severity: 'critical',\n title: `Invariant violated: ${invariant.name}`,\n description: invariant.message,\n mutationId: mutation.id,\n mutationIndex: index,\n path: invariant.path,\n currentValue: value,\n suggestion: `Ensure the invariant \"${invariant.name}\" is always maintained.`,\n timestamp: mutation.timestamp,\n };\n }\n } catch (e) {\n // Rule threw an error\n return null;\n }\n\n return null;\n }\n\n /**\n * Analyze entire timeline for issues\n */\n analyzeTimeline(timeline: Mutation[]): Issue[] {\n const allIssues: Issue[] = [];\n this.updateTimestamps.clear();\n\n for (let i = 0; i < timeline.length; i++) {\n const issues = this.analyzeMutation(timeline[i], i, timeline);\n allIssues.push(...issues);\n }\n\n return allIssues;\n }\n\n /**\n * Build dependency graph showing which components touch which state paths\n */\n buildDependencyGraph(timeline: Mutation[]): DependencyGraph {\n const nodes = new Map<string, DependencyNode>();\n\n for (const mutation of timeline) {\n if (!mutation.diff) continue;\n\n const component = mutation.component || mutation.source || 'unknown';\n\n for (const diff of mutation.diff) {\n const existing = nodes.get(diff.path);\n\n if (existing) {\n existing.components.add(component);\n existing.mutationCount++;\n existing.lastMutationId = mutation.id;\n } else {\n nodes.set(diff.path, {\n path: diff.path,\n components: new Set([component]),\n mutationCount: 1,\n lastMutationId: mutation.id,\n });\n }\n }\n }\n\n // Find couplings (paths touched by multiple components)\n const couplings: DependencyGraph['couplings'] = [];\n\n for (const [path, node] of nodes) {\n if (node.components.size > 1) {\n couplings.push({\n path,\n components: Array.from(node.components),\n severity: node.components.size > 2 ? 'critical' : 'warning',\n });\n }\n }\n\n return { nodes, couplings };\n }\n\n /**\n * Find causal chain - which mutations caused downstream effects\n */\n findCausalChain(mutationId: string, timeline: Mutation[]): CausalChain | null {\n const rootIndex = timeline.findIndex(m => m.id === mutationId);\n if (rootIndex === -1) return null;\n\n const root = timeline[rootIndex];\n const effects: CausalChain['effects'] = [];\n\n // Find mutations that follow and depend on changed paths\n if (!root.diff) return { rootMutation: root, effects };\n\n const changedPaths = new Set(root.diff.map(d => d.path));\n\n for (let i = rootIndex + 1; i < timeline.length; i++) {\n const mutation = timeline[i];\n if (!mutation.diff) continue;\n\n // Check if this mutation reads from paths that root changed\n for (const diff of mutation.diff) {\n // Check if path overlaps with changed paths\n for (const changedPath of changedPaths) {\n if (diff.path.startsWith(changedPath) || changedPath.startsWith(diff.path)) {\n effects.push({\n mutation,\n causedBy: root.id,\n reason: `Uses path \"${diff.path}\" which was affected by \"${changedPath}\"`,\n });\n break;\n }\n }\n }\n }\n\n return { rootMutation: root, effects };\n }\n\n /**\n * Find the first mutation that corrupted state\n * Uses binary search for efficiency\n */\n findCorruptionPoint(\n timeline: Mutation[],\n validator: (state: unknown) => boolean\n ): { mutation: Mutation; index: number } | null {\n let left = 0;\n let right = timeline.length - 1;\n let result: { mutation: Mutation; index: number } | null = null;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const mutation = timeline[mid];\n\n if (mutation.nextState && !validator(mutation.nextState)) {\n // State is invalid here, corruption is at or before this point\n result = { mutation, index: mid };\n right = mid - 1;\n } else {\n // State is valid, corruption is after this point\n left = mid + 1;\n }\n }\n\n return result;\n }\n}\n\n/**\n * Helper to get value at a dot-path\n */\nfunction getValueAtPath(obj: unknown, path: string): unknown {\n if (!path) return obj;\n\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n// Export singleton instance\nexport const analyzer = new StateAnalyzer();\n","import 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 { v4 as uuidv4 } from 'uuid';\n\n/**\n * Source of the state mutation\n */\nexport type MutationSource = 'react' | 'redux' | 'zustand' | 'express' | 'websocket' | 'api' | 'custom';\n\n/**\n * Type of action that triggered the mutation\n */\nexport type ActionType = 'USER_CLICK' | 'API_RESPONSE' | 'TIMEOUT' | 'WEBHOOK' | 'INIT' | 'DISPATCH' | 'SET_STATE' | 'CUSTOM';\n\n/**\n * Represents a single state mutation captured by State Surgeon\n */\nexport interface Mutation {\n /** Unique identifier for this mutation */\n id: string;\n\n /** High-resolution timestamp (performance.now() or Date.now()) */\n timestamp: number;\n\n /** Lamport timestamp for causal ordering */\n logicalClock: number;\n\n /** Session this mutation belongs to */\n sessionId: string;\n\n /** Source of the mutation */\n source: MutationSource;\n\n /** Component or module name */\n component?: string;\n\n /** Function name that triggered the mutation */\n function?: string;\n\n /** Source file path */\n file?: string;\n\n /** Line number in source file */\n line?: number;\n\n /** Column number in source file */\n column?: number;\n\n /** Type of action that triggered this mutation */\n actionType: ActionType;\n\n /** Action payload (for Redux actions, etc.) */\n actionPayload?: unknown;\n\n /** State before the mutation */\n previousState: unknown;\n\n /** State after the mutation */\n nextState: unknown;\n\n /** Computed diff between states */\n diff?: StateDiff[];\n\n /** Call stack at time of mutation */\n callStack?: string[];\n\n /** Request ID for correlating with backend */\n requestId?: string;\n\n /** Duration of the mutation in milliseconds */\n duration?: number;\n\n /** Parent mutation ID for causal chains */\n parentMutationId?: string;\n\n /** IDs of events that caused this mutation */\n causes?: string[];\n\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a single change in state\n */\nexport interface StateDiff {\n /** JSON path to the changed value */\n path: string;\n\n /** Type of change */\n operation: 'ADD' | 'UPDATE' | 'REMOVE';\n\n /** Previous value (for UPDATE and REMOVE) */\n oldValue?: unknown;\n\n /** New value (for ADD and UPDATE) */\n newValue?: unknown;\n}\n\n/**\n * Options for creating a mutation\n */\nexport interface CreateMutationOptions {\n source: MutationSource;\n sessionId: string;\n previousState: unknown;\n nextState: unknown;\n actionType?: ActionType;\n actionPayload?: unknown;\n component?: string;\n function?: string;\n captureStack?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n// Global logical clock for this client\nlet logicalClock = 0;\n\n/**\n * Creates a new mutation record\n */\nexport function createMutation(options: CreateMutationOptions): Mutation {\n const {\n source,\n sessionId,\n previousState,\n nextState,\n actionType = 'CUSTOM',\n actionPayload,\n component,\n function: funcName,\n captureStack = true,\n metadata,\n } = options;\n\n logicalClock++;\n\n const mutation: Mutation = {\n id: `mut_${Date.now()}_${uuidv4().slice(0, 8)}`,\n timestamp: typeof performance !== 'undefined' ? performance.now() : Date.now(),\n logicalClock,\n sessionId,\n source,\n component,\n function: funcName,\n actionType,\n actionPayload,\n previousState,\n nextState,\n metadata,\n };\n\n // Capture call stack if enabled\n if (captureStack) {\n mutation.callStack = parseCallStack(new Error().stack);\n }\n\n return mutation;\n}\n\n/**\n * Parses an error stack trace into clean function names\n */\nexport function parseCallStack(stack?: string): string[] {\n if (!stack) return [];\n\n return stack\n .split('\\n')\n .slice(2) // Skip 'Error' and 'createMutation' lines\n .map(line => line.trim())\n .filter(line => line.startsWith('at '))\n .map(line => {\n // Extract function name and location\n const match = line.match(/at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)/);\n if (match) {\n return `${match[1]} (${match[2].split('/').pop()}:${match[3]})`;\n }\n // Anonymous function or simpler format\n const simpleMatch = line.match(/at\\s+(.+):(\\d+):(\\d+)/);\n if (simpleMatch) {\n return `anonymous (${simpleMatch[1].split('/').pop()}:${simpleMatch[2]})`;\n }\n return line.replace('at ', '');\n })\n .slice(0, 10); // Limit stack depth\n}\n\n/**\n * Gets the current logical clock value\n */\nexport function getLogicalClock(): number {\n return logicalClock;\n}\n\n/**\n * Resets the logical clock (for testing)\n */\nexport function resetLogicalClock(): void {\n logicalClock = 0;\n}\n\n/**\n * Generates a new session ID\n */\nexport function generateSessionId(): string {\n return `session_${Date.now()}_${uuidv4().slice(0, 8)}`;\n}\n","/**\n * Utility functions for State Surgeon\n */\n\n/**\n * Deep merges source into target\n */\nexport function deepMerge<T extends object>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = (target as Record<string, unknown>)[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n (result as Record<string, unknown>)[key] = deepMerge(\n targetValue as object,\n sourceValue as object\n );\n } else {\n (result as Record<string, unknown>)[key] = sourceValue;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Debounces a function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n return function (this: unknown, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn.apply(this, args);\n }, ms);\n };\n}\n\n/**\n * Throttles a function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n return function (this: unknown, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = ms - (now - lastCall);\n\n if (remaining <= 0) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n lastCall = now;\n fn.apply(this, args);\n } else if (!timeoutId) {\n timeoutId = setTimeout(() => {\n lastCall = Date.now();\n timeoutId = undefined;\n fn.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * Compresses a string using basic run-length encoding\n * For production, use proper compression like pako/gzip\n */\nexport function compress(data: string): string {\n // Simple JSON stringify for now\n // Could add proper compression in production\n return data;\n}\n\n/**\n * Decompresses a string\n */\nexport function decompress(data: string): string {\n return data;\n}\n\n/**\n * Formats bytes to human readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\n/**\n * Formats a duration in milliseconds\n */\nexport function formatDuration(ms: number): string {\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/**\n * Creates a simple hash of a string\n */\nexport function simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16);\n}\n\n/**\n * Checks if running in browser environment\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Checks if running in Node.js environment\n */\nexport function isNode(): boolean {\n return typeof process !== 'undefined' && process.versions?.node !== undefined;\n}\n\n/**\n * Safe JSON stringify that handles circular references\n */\nexport function safeStringify(obj: unknown, space?: number): string {\n const seen = new WeakSet();\n\n return JSON.stringify(obj, (_, value) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n\n // Handle special types\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n if (typeof value === 'symbol') {\n return value.toString();\n }\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n if (value instanceof Map) {\n return { __type: 'Map', entries: Array.from(value.entries()) };\n }\n if (value instanceof Set) {\n return { __type: 'Set', values: Array.from(value.values()) };\n }\n\n return value;\n }, space);\n}\n\n/**\n * Safe JSON parse with reviver for special types\n */\nexport function safeParse(json: string): unknown {\n return JSON.parse(json, (_, value) => {\n if (value && typeof value === 'object') {\n if (value.__type === 'Map') {\n return new Map(value.entries);\n }\n if (value.__type === 'Set') {\n return new Set(value.values);\n }\n }\n return value;\n });\n}\n","/**\n * Instrumentation Layer for State Surgeon\n *\n * Provides utilities to instrument various state management systems\n * and capture mutations automatically.\n */\n\nexport { instrumentFetch, instrumentXHR, type APIInstrumentationOptions } from './api';\nexport { StateSurgeonClient, type ClientOptions } from './client';\nexport { instrumentReact, type ReactInstrumentationOptions } from './react';\nexport { createReduxMiddleware, instrumentReduxStore, type ReduxInstrumentationOptions } from './redux';\nexport { MutationTransport, type TransportOptions } from './transport';\nexport { instrumentZustand, type ZustandInstrumentationOptions } from './zustand';\n\n","/**\n * WebSocket transport for sending mutations to the recorder\n */\n\nexport interface TransportMessage {\n type: string;\n payload: unknown;\n}\n\nexport interface TransportOptions {\n /** Maximum mutations to batch before sending */\n batchSize?: number;\n\n /** Interval in ms to flush batched mutations */\n flushInterval?: number;\n\n /** Reconnection delay in ms */\n reconnectDelay?: number;\n\n /** Maximum reconnection attempts */\n maxReconnectAttempts?: number;\n\n /** Callback when connected */\n onConnect?: () => void;\n\n /** Callback when disconnected */\n onDisconnect?: () => void;\n\n /** Callback on error */\n onError?: (error: Error) => void;\n\n /** Callback for received messages */\n onMessage?: (message: TransportMessage) => void;\n}\n\n/**\n * WebSocket transport layer for State Surgeon\n */\nexport class MutationTransport {\n private url: string;\n private options: Required<TransportOptions>;\n private ws: WebSocket | null = null;\n private buffer: TransportMessage[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempts = 0;\n private isConnecting = false;\n private shouldReconnect = true;\n\n constructor(url: string, options: TransportOptions = {}) {\n this.url = url;\n this.options = {\n batchSize: options.batchSize ?? 50,\n flushInterval: options.flushInterval ?? 100,\n reconnectDelay: options.reconnectDelay ?? 1000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n onConnect: options.onConnect ?? (() => {}),\n onDisconnect: options.onDisconnect ?? (() => {}),\n onError: options.onError ?? (() => {}),\n onMessage: options.onMessage ?? (() => {}),\n };\n }\n\n /**\n * Establishes WebSocket connection\n */\n connect(): void {\n if (this.ws || this.isConnecting) {\n return;\n }\n\n this.isConnecting = true;\n this.shouldReconnect = true;\n\n try {\n // Use WebSocket from global scope (browser) or ws package (Node.js)\n const WebSocketImpl = typeof WebSocket !== 'undefined'\n ? WebSocket\n : require('ws');\n\n this.ws = new WebSocketImpl(this.url);\n\n this.ws.onopen = () => {\n this.isConnecting = false;\n this.reconnectAttempts = 0;\n this.startFlushTimer();\n this.options.onConnect();\n };\n\n this.ws.onclose = () => {\n this.isConnecting = false;\n this.stopFlushTimer();\n this.ws = null;\n this.options.onDisconnect();\n this.attemptReconnect();\n };\n\n this.ws.onerror = (event: Event) => {\n this.isConnecting = false;\n const error = new Error('WebSocket error');\n this.options.onError(error);\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const message = JSON.parse(event.data) as TransportMessage;\n this.options.onMessage(message);\n } catch (e) {\n // Ignore parse errors\n }\n };\n } catch (error) {\n this.isConnecting = false;\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n this.attemptReconnect();\n }\n }\n\n /**\n * Closes the WebSocket connection\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopFlushTimer();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Sends a message (adds to buffer)\n */\n send(message: TransportMessage): void {\n this.buffer.push(message);\n\n if (this.buffer.length >= this.options.batchSize) {\n this.flush();\n }\n }\n\n /**\n * Flushes the buffer immediately\n */\n flush(): void {\n if (this.buffer.length === 0) {\n return;\n }\n\n if (this.ws && this.ws.readyState === 1) { // WebSocket.OPEN = 1\n try {\n // Send as batch\n const batch = {\n type: 'MUTATION_BATCH',\n payload: {\n mutations: this.buffer.map(m => m.payload),\n timestamp: Date.now(),\n },\n };\n\n this.ws.send(JSON.stringify(batch));\n this.buffer = [];\n } catch (error) {\n this.options.onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n\n /**\n * Checks if transport is connected\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === 1;\n }\n\n /**\n * Gets the current buffer size\n */\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n private startFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = setInterval(() => {\n this.flush();\n }, this.options.flushInterval);\n }\n\n private stopFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private attemptReconnect(): void {\n if (!this.shouldReconnect) {\n return;\n }\n\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n this.options.onError(new Error('Max reconnection attempts reached'));\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.options.reconnectDelay * Math.pow(1.5, this.reconnectAttempts - 1);\n\n setTimeout(() => {\n if (this.shouldReconnect) {\n this.connect();\n }\n }, Math.min(delay, 30000)); // Cap at 30 seconds\n }\n}\n","import { calculateDiff, deepClone } from '../core/diff';\nimport { createMutation, generateSessionId, type Mutation } from '../core/mutation';\nimport { MutationTransport, type TransportOptions } from './transport';\n\n/**\n * Options for the State Surgeon client\n */\nexport interface ClientOptions {\n /** Server URL for the recorder (default: 'ws://localhost:8081') */\n serverUrl?: string;\n\n /** Application ID for grouping sessions */\n appId?: string;\n\n /** Session ID (auto-generated if not provided) */\n sessionId?: string;\n\n /** Enable automatic connection on creation */\n autoConnect?: boolean;\n\n /** Batch size before flushing mutations */\n batchSize?: number;\n\n /** Flush interval in milliseconds */\n flushInterval?: number;\n\n /** Enable console logging for debugging */\n debug?: boolean;\n\n /** Transport options */\n transport?: TransportOptions;\n}\n\n/**\n * Mutation listener callback\n */\nexport type MutationListener = (mutation: Mutation) => void;\n\n/**\n * Main client for State Surgeon\n * Manages the connection to the recorder and handles mutation recording\n */\nexport class StateSurgeonClient {\n private sessionId: string;\n private appId: string;\n private transport: MutationTransport | null = null;\n private listeners: Set<MutationListener> = new Set();\n private isConnected = false;\n private debug: boolean;\n private serverUrl: string;\n private transportOptions: TransportOptions;\n\n // Track mutations locally for offline support\n private localMutations: Mutation[] = [];\n private maxLocalMutations = 10000;\n\n constructor(options: ClientOptions = {}) {\n this.sessionId = options.sessionId || generateSessionId();\n this.appId = options.appId || 'default';\n this.debug = options.debug || false;\n this.serverUrl = options.serverUrl || 'ws://localhost:8081';\n this.transportOptions = {\n batchSize: options.batchSize || 50,\n flushInterval: options.flushInterval || 100,\n ...options.transport,\n };\n\n if (options.autoConnect !== false) {\n this.connect();\n }\n\n this.log('State Surgeon Client initialized', { sessionId: this.sessionId, appId: this.appId });\n }\n\n /**\n * Connects to the recorder server\n */\n connect(): void {\n if (this.transport) {\n return;\n }\n\n this.transport = new MutationTransport(this.serverUrl, {\n ...this.transportOptions,\n onConnect: () => {\n this.isConnected = true;\n this.log('Connected to State Surgeon recorder');\n this.sendHandshake();\n },\n onDisconnect: () => {\n this.isConnected = false;\n this.log('Disconnected from State Surgeon recorder');\n },\n onError: (error) => {\n this.log('Transport error:', error);\n },\n });\n\n this.transport.connect();\n }\n\n /**\n * Disconnects from the recorder server\n */\n disconnect(): void {\n if (this.transport) {\n this.transport.disconnect();\n this.transport = null;\n }\n this.isConnected = false;\n }\n\n /**\n * Sends the initial handshake to register the session\n */\n private sendHandshake(): void {\n if (this.transport) {\n this.transport.send({\n type: 'REGISTER_SESSION',\n payload: {\n appId: this.appId,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'node',\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n },\n });\n }\n }\n\n /**\n * Records a mutation\n */\n recordMutation(mutation: Mutation): void {\n // Add to local storage\n this.localMutations.push(mutation);\n if (this.localMutations.length > this.maxLocalMutations) {\n this.localMutations.shift();\n }\n\n // Notify listeners\n for (const listener of this.listeners) {\n try {\n listener(mutation);\n } catch (error) {\n this.log('Listener error:', error);\n }\n }\n\n // Send to server\n if (this.transport && this.isConnected) {\n this.transport.send({\n type: 'MUTATION_RECORDED',\n payload: mutation,\n });\n }\n\n this.log('Mutation recorded:', mutation.id, mutation.source);\n }\n\n /**\n * Creates and records a mutation from state change\n */\n captureStateChange(\n source: Mutation['source'],\n previousState: unknown,\n nextState: unknown,\n options: {\n actionType?: Mutation['actionType'];\n actionPayload?: unknown;\n component?: string;\n function?: string;\n } = {}\n ): Mutation {\n const mutation = createMutation({\n source,\n sessionId: this.sessionId,\n previousState: deepClone(previousState),\n nextState: deepClone(nextState),\n actionType: options.actionType || 'CUSTOM',\n actionPayload: options.actionPayload,\n component: options.component,\n function: options.function,\n captureStack: true,\n });\n\n // Calculate diff\n mutation.diff = calculateDiff(mutation.previousState, mutation.nextState);\n\n this.recordMutation(mutation);\n return mutation;\n }\n\n /**\n * Adds a mutation listener\n */\n addListener(listener: MutationListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Gets the current session ID\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Gets all local mutations\n */\n getMutations(): Mutation[] {\n return [...this.localMutations];\n }\n\n /**\n * Clears local mutations\n */\n clearMutations(): void {\n this.localMutations = [];\n }\n\n /**\n * Checks if connected to server\n */\n isServerConnected(): boolean {\n return this.isConnected;\n }\n\n /**\n * Flushes any pending mutations\n */\n flush(): void {\n if (this.transport) {\n this.transport.flush();\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[State Surgeon]', ...args);\n }\n }\n}\n\n// Global client instance for convenience\nlet globalClient: StateSurgeonClient | null = null;\n\n/**\n * Gets or creates the global State Surgeon client\n */\nexport function getClient(options?: ClientOptions): StateSurgeonClient {\n if (!globalClient) {\n globalClient = new StateSurgeonClient(options);\n }\n return globalClient;\n}\n\n/**\n * Sets the global client instance\n */\nexport function setClient(client: StateSurgeonClient): void {\n globalClient = client;\n}\n\n/**\n * Resets the global client (for testing)\n */\nexport function resetClient(): void {\n if (globalClient) {\n globalClient.disconnect();\n globalClient = null;\n }\n}\n","import { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Options for API instrumentation\n */\nexport interface APIInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** URLs to ignore (substring match) */\n ignoreUrls?: string[];\n\n /** Whether to capture request bodies */\n captureRequestBody?: boolean;\n\n /** Whether to capture response bodies */\n captureResponseBody?: boolean;\n\n /** Maximum body size to capture (in characters) */\n maxBodySize?: number;\n}\n\n// Store original fetch\nlet originalFetch: typeof fetch | null = null;\nlet fetchInstrumented = false;\n\n// Store original XMLHttpRequest methods\nlet originalXHROpen: typeof XMLHttpRequest.prototype.open | null = null;\nlet originalXHRSend: typeof XMLHttpRequest.prototype.send | null = null;\nlet xhrInstrumented = false;\n\n/**\n * Instruments the global fetch function to track API calls\n *\n * @example\n * ```tsx\n * import { instrumentFetch } from 'state-surgeon/instrument';\n *\n * const cleanup = instrumentFetch({\n * captureResponseBody: true,\n * ignoreUrls: ['/health', '/metrics'],\n * });\n * ```\n */\nexport function instrumentFetch(options: APIInstrumentationOptions = {}): () => void {\n if (fetchInstrumented) {\n console.warn('[State Surgeon] Fetch already instrumented');\n return () => {};\n }\n\n if (typeof fetch === 'undefined') {\n console.warn('[State Surgeon] Fetch not available in this environment');\n return () => {};\n }\n\n const client = options.client || getClient();\n const ignoreUrls = options.ignoreUrls || [];\n const captureRequestBody = options.captureRequestBody !== false;\n const captureResponseBody = options.captureResponseBody !== false;\n const maxBodySize = options.maxBodySize || 10000;\n\n originalFetch = fetch;\n\n (globalThis as any).fetch = async function instrumentedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n\n // Check if URL should be ignored\n if (ignoreUrls.some(ignore => url.includes(ignore))) {\n return originalFetch!(input, init);\n }\n\n const startTime = Date.now();\n const requestId = `req_${startTime}_${Math.random().toString(36).slice(2, 8)}`;\n\n // Capture request info\n const requestInfo: Record<string, unknown> = {\n url,\n method: init?.method || 'GET',\n headers: init?.headers,\n };\n\n if (captureRequestBody && init?.body) {\n requestInfo.body = truncateBody(init.body, maxBodySize);\n }\n\n try {\n const response = await originalFetch!(input, init);\n const duration = Date.now() - startTime;\n\n // Clone response to read body without consuming it\n const clonedResponse = response.clone();\n\n // Capture response info\n const responseInfo: Record<string, unknown> = {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n\n if (captureResponseBody) {\n try {\n const text = await clonedResponse.text();\n responseInfo.body = truncateBody(text, maxBodySize);\n } catch {\n responseInfo.body = '[Unable to read response body]';\n }\n }\n\n // Record mutation\n client.captureStateChange('api', requestInfo, responseInfo, {\n actionType: 'API_RESPONSE',\n actionPayload: {\n requestId,\n url,\n method: requestInfo.method,\n status: response.status,\n duration,\n },\n function: 'fetch',\n });\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n // Record error\n client.captureStateChange('api', requestInfo, {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n }, {\n actionType: 'API_RESPONSE',\n actionPayload: {\n requestId,\n url,\n method: requestInfo.method,\n status: 0,\n error: true,\n duration,\n },\n function: 'fetch',\n });\n\n throw error;\n }\n };\n\n fetchInstrumented = true;\n\n return () => {\n if (originalFetch) {\n (globalThis as any).fetch = originalFetch;\n originalFetch = null;\n }\n fetchInstrumented = false;\n };\n}\n\n/**\n * Instruments XMLHttpRequest to track AJAX calls\n *\n * @example\n * ```tsx\n * import { instrumentXHR } from 'state-surgeon/instrument';\n *\n * const cleanup = instrumentXHR();\n * ```\n */\nexport function instrumentXHR(options: APIInstrumentationOptions = {}): () => void {\n if (xhrInstrumented) {\n console.warn('[State Surgeon] XHR already instrumented');\n return () => {};\n }\n\n if (typeof XMLHttpRequest === 'undefined') {\n console.warn('[State Surgeon] XMLHttpRequest not available in this environment');\n return () => {};\n }\n\n const client = options.client || getClient();\n const ignoreUrls = options.ignoreUrls || [];\n const captureResponseBody = options.captureResponseBody !== false;\n const maxBodySize = options.maxBodySize || 10000;\n\n originalXHROpen = XMLHttpRequest.prototype.open;\n originalXHRSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ) {\n (this as any)._stateSurgeon = {\n method,\n url: url.toString(),\n startTime: 0,\n };\n\n return originalXHROpen!.call(this, method, url, async, username, password);\n };\n\n XMLHttpRequest.prototype.send = function (body?: Document | XMLHttpRequestBodyInit | null) {\n const info = (this as any)._stateSurgeon;\n\n if (!info || ignoreUrls.some(ignore => info.url.includes(ignore))) {\n return originalXHRSend!.call(this, body);\n }\n\n info.startTime = Date.now();\n const requestId = `xhr_${info.startTime}_${Math.random().toString(36).slice(2, 8)}`;\n\n const requestInfo: Record<string, unknown> = {\n url: info.url,\n method: info.method,\n };\n\n this.addEventListener('loadend', () => {\n const duration = Date.now() - info.startTime;\n\n const responseInfo: Record<string, unknown> = {\n status: this.status,\n statusText: this.statusText,\n };\n\n if (captureResponseBody && this.responseText) {\n responseInfo.body = truncateBody(this.responseText, maxBodySize);\n }\n\n client.captureStateChange('api', requestInfo, responseInfo, {\n actionType: 'API_RESPONSE',\n actionPayload: {\n requestId,\n url: info.url,\n method: info.method,\n status: this.status,\n duration,\n },\n function: 'XMLHttpRequest',\n });\n });\n\n return originalXHRSend!.call(this, body);\n };\n\n xhrInstrumented = true;\n\n return () => {\n if (originalXHROpen) {\n XMLHttpRequest.prototype.open = originalXHROpen;\n originalXHROpen = null;\n }\n if (originalXHRSend) {\n XMLHttpRequest.prototype.send = originalXHRSend;\n originalXHRSend = null;\n }\n xhrInstrumented = false;\n };\n}\n\n/**\n * Truncates body data to maximum size\n */\nfunction truncateBody(body: unknown, maxSize: number): string {\n let str: string;\n\n if (typeof body === 'string') {\n str = body;\n } else if (body instanceof FormData) {\n str = '[FormData]';\n } else if (body instanceof Blob) {\n str = `[Blob: ${body.size} bytes]`;\n } else if (body instanceof ArrayBuffer) {\n str = `[ArrayBuffer: ${body.byteLength} bytes]`;\n } else {\n try {\n str = JSON.stringify(body);\n } catch {\n str = String(body);\n }\n }\n\n if (str.length > maxSize) {\n return str.slice(0, maxSize) + '... [truncated]';\n }\n\n return str;\n}\n","import { deepClone } from '../core/diff';\nimport { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Options for React instrumentation\n */\nexport interface ReactInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** Whether to capture component name from stack trace */\n captureComponentName?: boolean;\n\n /** Custom name for this instrumentation */\n name?: string;\n}\n\n// Store original React methods\nlet originalUseState: typeof import('react').useState | null = null;\nlet originalUseReducer: typeof import('react').useReducer | null = null;\nlet isInstrumented = false;\n\n/**\n * Instruments React hooks to capture state mutations\n *\n * @example\n * ```tsx\n * import React from 'react';\n * import { instrumentReact } from 'state-surgeon/instrument';\n *\n * // Call once at app initialization\n * const cleanup = instrumentReact(React);\n *\n * // Later, to restore original React\n * cleanup();\n * ```\n */\nexport function instrumentReact(\n React: typeof import('react'),\n options: ReactInstrumentationOptions = {}\n): () => void {\n if (isInstrumented) {\n console.warn('[State Surgeon] React already instrumented');\n return () => {};\n }\n\n const client = options.client || getClient();\n const captureComponentName = options.captureComponentName !== false;\n\n // Store originals\n originalUseState = React.useState;\n originalUseReducer = React.useReducer;\n\n // Patch useState\n (React as any).useState = function <T>(initialState: T | (() => T)) {\n const [state, originalSetState] = originalUseState!(initialState);\n\n const instrumentedSetState = (\n newStateOrUpdater: T | ((prevState: T) => T)\n ) => {\n const previousState = deepClone(state);\n\n // Calculate new state\n const newState = typeof newStateOrUpdater === 'function'\n ? (newStateOrUpdater as (prev: T) => T)(state)\n : newStateOrUpdater;\n\n // Record mutation\n client.captureStateChange('react', previousState, newState, {\n actionType: 'SET_STATE',\n component: captureComponentName ? getComponentName() : undefined,\n function: 'useState',\n });\n\n // Call original\n return originalSetState(newStateOrUpdater);\n };\n\n return [state, instrumentedSetState];\n };\n\n // Patch useReducer\n (React as any).useReducer = function <R extends React.Reducer<any, any>>(\n reducer: R,\n initialArg: React.ReducerState<R>,\n init?: (arg: React.ReducerState<R>) => React.ReducerState<R>\n ) {\n // Wrap the reducer to capture mutations\n const instrumentedReducer: R = ((state: React.ReducerState<R>, action: React.ReducerAction<R>) => {\n const previousState = deepClone(state);\n const newState = reducer(state, action);\n\n // Record mutation\n client.captureStateChange('react', previousState, newState, {\n actionType: 'DISPATCH',\n actionPayload: action,\n component: captureComponentName ? getComponentName() : undefined,\n function: 'useReducer',\n });\n\n return newState;\n }) as R;\n\n return originalUseReducer!(instrumentedReducer, initialArg, init);\n };\n\n isInstrumented = true;\n\n // Return cleanup function\n return () => {\n if (originalUseState) {\n (React as any).useState = originalUseState;\n }\n if (originalUseReducer) {\n (React as any).useReducer = originalUseReducer;\n }\n isInstrumented = false;\n originalUseState = null;\n originalUseReducer = null;\n };\n}\n\n/**\n * Attempts to extract component name from stack trace\n */\nfunction getComponentName(): string | undefined {\n const stack = new Error().stack;\n if (!stack) return undefined;\n\n const lines = stack.split('\\n');\n\n // Look for component-like function names\n for (const line of lines) {\n // Skip internal React and State Surgeon frames\n if (\n line.includes('instrumentedSetState') ||\n line.includes('instrumentedReducer') ||\n line.includes('useState') ||\n line.includes('useReducer') ||\n line.includes('react-dom') ||\n line.includes('react.development')\n ) {\n continue;\n }\n\n // Extract function name\n const match = line.match(/at\\s+([A-Z][A-Za-z0-9_]*)/);\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * Creates a manual state tracker for class components or custom state\n *\n * @example\n * ```tsx\n * const tracker = createStateTracker('MyComponent');\n *\n * function updateState(newValue) {\n * const oldValue = state.value;\n * state.value = newValue;\n * tracker.track(oldValue, newValue, 'value update');\n * }\n * ```\n */\nexport function createStateTracker(componentName: string, options: ReactInstrumentationOptions = {}) {\n const client = options.client || getClient();\n\n return {\n track(previousState: unknown, nextState: unknown, action?: string) {\n client.captureStateChange('react', previousState, nextState, {\n actionType: 'SET_STATE',\n component: componentName,\n actionPayload: action ? { description: action } : undefined,\n });\n },\n };\n}\n","import { deepClone } from '../core/diff';\nimport { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Redux store interface (minimal)\n */\ninterface ReduxStore {\n getState: () => unknown;\n dispatch: (action: unknown) => unknown;\n subscribe: (listener: () => void) => () => void;\n replaceReducer?: (reducer: unknown) => void;\n}\n\n/**\n * Redux middleware API\n */\ninterface MiddlewareAPI {\n getState: () => unknown;\n dispatch: (action: unknown) => unknown;\n}\n\n/**\n * Options for Redux instrumentation\n */\nexport interface ReduxInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** Whether to capture full state or just the diff */\n captureFullState?: boolean;\n\n /** Actions to ignore (by type) */\n ignoreActions?: string[];\n\n /** Custom name for this store */\n storeName?: string;\n}\n\n/**\n * Creates a Redux middleware that captures all actions and state changes\n *\n * @example\n * ```tsx\n * import { createStore, applyMiddleware } from 'redux';\n * import { createReduxMiddleware } from 'state-surgeon/instrument';\n *\n * const stateSurgeonMiddleware = createReduxMiddleware();\n * const store = createStore(rootReducer, applyMiddleware(stateSurgeonMiddleware));\n * ```\n */\nexport function createReduxMiddleware(options: ReduxInstrumentationOptions = {}) {\n const client = options.client || getClient();\n const ignoreActions = new Set(options.ignoreActions || []);\n const storeName = options.storeName || 'redux';\n\n return (storeAPI: MiddlewareAPI) => (next: (action: unknown) => unknown) => (action: unknown) => {\n const actionType = (action as { type?: string })?.type;\n\n // Skip ignored actions\n if (actionType && ignoreActions.has(actionType)) {\n return next(action);\n }\n\n // Capture state before\n const previousState = deepClone(storeAPI.getState());\n const startTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n // Execute action\n const result = next(action);\n\n // Capture state after\n const nextState = deepClone(storeAPI.getState());\n const duration = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - startTime;\n\n // Record mutation\n const mutation = client.captureStateChange('redux', previousState, nextState, {\n actionType: 'DISPATCH',\n actionPayload: action,\n component: storeName,\n function: actionType || 'dispatch',\n });\n\n // Add duration\n mutation.duration = duration;\n\n return result;\n };\n}\n\n/**\n * Instruments an existing Redux store by wrapping its dispatch method\n *\n * @example\n * ```tsx\n * import { createStore } from 'redux';\n * import { instrumentReduxStore } from 'state-surgeon/instrument';\n *\n * const store = createStore(rootReducer);\n * const cleanup = instrumentReduxStore(store);\n * ```\n */\nexport function instrumentReduxStore(\n store: ReduxStore,\n options: ReduxInstrumentationOptions = {}\n): () => void {\n const client = options.client || getClient();\n const ignoreActions = new Set(options.ignoreActions || []);\n const storeName = options.storeName || 'redux';\n\n const originalDispatch = store.dispatch;\n\n store.dispatch = function instrumentedDispatch(action: unknown) {\n const actionType = (action as { type?: string })?.type;\n\n // Skip ignored actions\n if (actionType && ignoreActions.has(actionType)) {\n return originalDispatch(action);\n }\n\n // Capture state before\n const previousState = deepClone(store.getState());\n const startTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n // Execute action\n const result = originalDispatch(action);\n\n // Capture state after\n const nextState = deepClone(store.getState());\n const duration = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - startTime;\n\n // Record mutation\n const mutation = client.captureStateChange('redux', previousState, nextState, {\n actionType: 'DISPATCH',\n actionPayload: action,\n component: storeName,\n function: actionType || 'dispatch',\n });\n\n mutation.duration = duration;\n\n return result;\n };\n\n // Return cleanup function\n return () => {\n store.dispatch = originalDispatch;\n };\n}\n\n/**\n * Creates a simple action logger that doesn't require Redux\n * Useful for debugging action flow without full instrumentation\n */\nexport function createActionLogger(options: ReduxInstrumentationOptions = {}) {\n const client = options.client || getClient();\n const storeName = options.storeName || 'action-log';\n\n return {\n log(actionType: string, payload?: unknown, previousState?: unknown, nextState?: unknown) {\n if (previousState !== undefined && nextState !== undefined) {\n client.captureStateChange('redux', previousState, nextState, {\n actionType: 'DISPATCH',\n actionPayload: { type: actionType, payload },\n component: storeName,\n function: actionType,\n });\n }\n },\n };\n}\n","import { deepClone } from '../core/diff';\nimport { getClient, type StateSurgeonClient } from './client';\n\n/**\n * Options for Zustand instrumentation\n */\nexport interface ZustandInstrumentationOptions {\n /** State Surgeon client (uses global if not provided) */\n client?: StateSurgeonClient;\n\n /** Custom name for this store */\n storeName?: string;\n}\n\n/**\n * Zustand's StateCreator type (simplified)\n */\ntype StateCreator<T> = (\n set: (partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean) => void,\n get: () => T,\n api: unknown\n) => T;\n\n/**\n * Instruments a Zustand store creator to capture state mutations\n *\n * @example\n * ```tsx\n * import { create } from 'zustand';\n * import { instrumentZustand } from 'state-surgeon/instrument';\n *\n * const useStore = create(\n * instrumentZustand((set) => ({\n * count: 0,\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * }))\n * );\n * ```\n */\nexport function instrumentZustand<T extends object>(\n stateCreator: StateCreator<T>,\n options: ZustandInstrumentationOptions = {}\n): StateCreator<T> {\n const client = options.client || getClient();\n const storeName = options.storeName || 'zustand';\n\n return (set, get, api) => {\n // Wrap the set function\n const instrumentedSet: typeof set = (partial, replace) => {\n const previousState = deepClone(get());\n\n // Call original set\n set(partial, replace);\n\n const nextState = deepClone(get());\n\n // Record mutation\n client.captureStateChange('zustand', previousState, nextState, {\n actionType: 'SET_STATE',\n actionPayload: typeof partial === 'function' ? 'updater function' : partial,\n component: storeName,\n function: 'set',\n });\n };\n\n // Create the store with instrumented set\n return stateCreator(instrumentedSet, get, api);\n };\n}\n\n/**\n * Creates a Zustand middleware for more granular control\n *\n * @example\n * ```tsx\n * import { create } from 'zustand';\n * import { stateSurgeonMiddleware } from 'state-surgeon/instrument';\n *\n * const useStore = create(\n * stateSurgeonMiddleware(\n * (set) => ({\n * count: 0,\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * }),\n * { storeName: 'counterStore' }\n * )\n * );\n * ```\n */\nexport function stateSurgeonMiddleware<T extends object>(\n stateCreator: StateCreator<T>,\n options: ZustandInstrumentationOptions = {}\n): StateCreator<T> {\n return instrumentZustand(stateCreator, options);\n}\n\n/**\n * Higher-order function to wrap individual actions for tracking\n *\n * @example\n * ```tsx\n * const useStore = create((set, get) => ({\n * count: 0,\n * increment: trackAction('increment', () => {\n * set((state) => ({ count: state.count + 1 }));\n * }),\n * }));\n * ```\n */\nexport function trackAction<T extends (...args: any[]) => any>(\n actionName: string,\n action: T,\n options: ZustandInstrumentationOptions = {}\n): T {\n const client = options.client || getClient();\n const storeName = options.storeName || 'zustand';\n\n return ((...args: Parameters<T>) => {\n const startTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const result = action(...args);\n const duration = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - startTime;\n\n // Log action execution (state changes captured separately via set wrapper)\n // This is useful for tracking async actions\n if (result instanceof Promise) {\n result.then(() => {\n // Async action completed\n }).catch(() => {\n // Async action failed\n });\n }\n\n return result;\n }) as T;\n}\n\n/**\n * Creates a subscribe-based tracker for Zustand stores\n * Useful when you can't modify the store creation\n *\n * @example\n * ```tsx\n * import { useStore } from './store';\n * import { subscribeToStore } from 'state-surgeon/instrument';\n *\n * // Subscribe to track all changes\n * const unsubscribe = subscribeToStore(useStore, 'myStore');\n * ```\n */\nexport function subscribeToStore<T extends object>(\n useStore: { getState: () => T; subscribe: (listener: (state: T, prevState: T) => void) => () => void },\n storeName: string,\n options: ZustandInstrumentationOptions = {}\n): () => void {\n const client = options.client || getClient();\n\n return useStore.subscribe((state, prevState) => {\n client.captureStateChange('zustand', prevState, state, {\n actionType: 'SET_STATE',\n component: storeName,\n function: 'subscribe',\n });\n });\n}\n","/**\n * Recorder Module for State Surgeon\n *\n * Express server with WebSocket support for receiving and storing mutations.\n */\n\nexport { createAPIRoutes } from './api';\nexport { TimelineReconstructor } from './reconstructor';\nexport { createRecorderServer, type RecorderServer, type RecorderServerOptions } from './server';\nexport { MutationStore, type MutationStoreOptions } from './store';\n\n","import type { MutationSource } from '../core/mutation';\nimport type { TimelineReconstructor } from './reconstructor';\nimport type { MutationStore } from './store';\n\n/**\n * Creates Express API routes for the recorder\n */\nexport function createAPIRoutes(\n store: MutationStore,\n reconstructor: TimelineReconstructor\n): Router {\n const router = Router();\n\n // Health check\n router.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: Date.now() });\n });\n\n // Get all sessions\n router.get('/sessions', (req: Request, res: Response) => {\n try {\n const appId = req.query.appId as string | undefined;\n const sessions = store.getSessions(appId);\n res.json({ sessions });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get a specific session\n router.get('/sessions/:sessionId', (req: Request, res: Response) => {\n try {\n const session = store.getSession(req.params.sessionId);\n if (!session) {\n return res.status(404).json({ error: 'Session not found' });\n }\n res.json({ session });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Delete a session\n router.delete('/sessions/:sessionId', (req: Request, res: Response) => {\n try {\n const deleted = store.deleteSession(req.params.sessionId);\n res.json({ deleted });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get timeline for a session\n router.get('/sessions/:sessionId/timeline', (req: Request, res: Response) => {\n try {\n const timeline = store.getTimeline(req.params.sessionId);\n res.json({ timeline, count: timeline.length });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Query mutations\n router.get('/mutations', (req: Request, res: Response) => {\n try {\n const options = {\n sessionId: req.query.sessionId as string | undefined,\n startTime: req.query.startTime ? Number(req.query.startTime) : undefined,\n endTime: req.query.endTime ? Number(req.query.endTime) : undefined,\n source: req.query.source as MutationSource | undefined,\n component: req.query.component as string | undefined,\n limit: req.query.limit ? Number(req.query.limit) : 100,\n offset: req.query.offset ? Number(req.query.offset) : 0,\n sortOrder: (req.query.sortOrder as 'asc' | 'desc') || 'asc',\n };\n\n const mutations = store.queryMutations(options);\n res.json({ mutations, count: mutations.length });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get a specific mutation\n router.get('/mutations/:mutationId', (req: Request, res: Response) => {\n try {\n const mutation = store.getMutation(req.params.mutationId);\n if (!mutation) {\n return res.status(404).json({ error: 'Mutation not found' });\n }\n res.json({ mutation });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get state at mutation\n router.get('/mutations/:mutationId/state', async (req: Request, res: Response) => {\n try {\n const state = await reconstructor.getStateAtMutation(req.params.mutationId);\n res.json({ state });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get causal chain\n router.get('/mutations/:mutationId/chain', async (req: Request, res: Response) => {\n try {\n const maxDepth = req.query.maxDepth ? Number(req.query.maxDepth) : 100;\n const chain = await reconstructor.findCausalChain(req.params.mutationId, maxDepth);\n res.json({ chain });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Find mutations for a path\n router.get('/sessions/:sessionId/path', async (req: Request, res: Response) => {\n try {\n const path = req.query.path as string;\n if (!path) {\n return res.status(400).json({ error: 'Path is required' });\n }\n const mutations = await reconstructor.findMutationsForPath(req.params.sessionId, path);\n res.json({ mutations, count: mutations.length });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Summarize time range\n router.get('/sessions/:sessionId/summary', async (req: Request, res: Response) => {\n try {\n const startTime = Number(req.query.startTime);\n const endTime = Number(req.query.endTime);\n\n if (isNaN(startTime) || isNaN(endTime)) {\n return res.status(400).json({ error: 'startTime and endTime are required' });\n }\n\n const summary = await reconstructor.summarizeTimeRange(\n req.params.sessionId,\n startTime,\n endTime\n );\n res.json({ summary });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Get store statistics\n router.get('/stats', (_req: Request, res: Response) => {\n try {\n const stats = store.getStats();\n res.json({ stats });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // Clear all data\n router.delete('/clear', (_req: Request, res: Response) => {\n try {\n store.clear();\n reconstructor.clearCache();\n res.json({ success: true });\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n return router;\n}\n","import { deepClone, getValueAtPath } from '../core/diff';\nimport type { Mutation } from '../core/mutation';\nimport type { MutationStore } from './store';\n\n/**\n * Validation function for state corruption detection\n */\nexport type StateValidator = (state: unknown) => boolean;\n\n/**\n * Result of causal chain analysis\n */\nexport interface CausalChain {\n mutations: Mutation[];\n rootCause?: Mutation;\n corrupted?: Mutation;\n}\n\n/**\n * Timeline reconstruction engine\n * Provides tools for investigating state history\n */\nexport class TimelineReconstructor {\n private store: MutationStore;\n private stateCache: Map<string, unknown> = new Map();\n private maxCacheSize = 1000;\n\n constructor(store: MutationStore) {\n this.store = store;\n }\n\n /**\n * Reconstructs the state at a specific mutation\n */\n async getStateAtMutation(mutationId: string): Promise<unknown> {\n // Check cache\n const cached = this.stateCache.get(mutationId);\n if (cached !== undefined) {\n return deepClone(cached);\n }\n\n // Find the mutation\n const targetMutation = this.store.getMutation(mutationId);\n if (!targetMutation) {\n throw new Error(`Mutation not found: ${mutationId}`);\n }\n\n // Get all mutations up to this point\n const timeline = this.store.getTimeline(targetMutation.sessionId);\n const targetIndex = timeline.findIndex(m => m.id === mutationId);\n\n if (targetIndex === -1) {\n throw new Error(`Mutation not in timeline: ${mutationId}`);\n }\n\n // Build state by applying mutations in order\n let state: unknown = {};\n\n for (let i = 0; i <= targetIndex; i++) {\n const mutation = timeline[i];\n state = mutation.nextState;\n\n // Cache each state along the way\n this.cacheState(mutation.id, state);\n }\n\n return deepClone(state);\n }\n\n /**\n * Reconstructs the state at a specific timestamp\n */\n async getStateAtTime(sessionId: string, timestamp: number): Promise<unknown> {\n const timeline = this.store.getTimeline(sessionId);\n\n // Find the last mutation before or at the timestamp\n let lastMutation: Mutation | null = null;\n\n for (const mutation of timeline) {\n if (mutation.timestamp <= timestamp) {\n lastMutation = mutation;\n } else {\n break;\n }\n }\n\n if (!lastMutation) {\n return {}; // No mutations yet, return empty state\n }\n\n return this.getStateAtMutation(lastMutation.id);\n }\n\n /**\n * Finds the causal chain leading to a mutation\n */\n async findCausalChain(\n mutationId: string,\n maxDepth: number = 100\n ): Promise<CausalChain> {\n const chain: Mutation[] = [];\n let currentId: string | undefined = mutationId;\n let depth = 0;\n\n while (currentId && depth < maxDepth) {\n const mutation = this.store.getMutation(currentId);\n if (!mutation) break;\n\n chain.push(mutation);\n\n // Follow parent or causes\n if (mutation.parentMutationId) {\n currentId = mutation.parentMutationId;\n } else if (mutation.causes && mutation.causes.length > 0) {\n currentId = mutation.causes[0];\n } else {\n break;\n }\n\n depth++;\n }\n\n return {\n mutations: chain.reverse(),\n rootCause: chain[0],\n };\n }\n\n /**\n * Binary search to find when state became invalid\n */\n async findStateCorruption(\n sessionId: string,\n validator: StateValidator\n ): Promise<Mutation | null> {\n const timeline = this.store.getTimeline(sessionId);\n\n if (timeline.length === 0) {\n return null;\n }\n\n let left = 0;\n let right = timeline.length - 1;\n let firstBad: number | null = null;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const state = await this.getStateAtMutation(timeline[mid].id);\n const isValid = validator(state);\n\n if (isValid) {\n // State is valid at this point, corruption is after\n left = mid + 1;\n } else {\n // State is invalid, corruption is at or before\n firstBad = mid;\n right = mid - 1;\n }\n }\n\n return firstBad !== null ? timeline[firstBad] : null;\n }\n\n /**\n * Finds all mutations that touched a specific path\n */\n async findMutationsForPath(\n sessionId: string,\n path: string\n ): Promise<Mutation[]> {\n const timeline = this.store.getTimeline(sessionId);\n const result: Mutation[] = [];\n\n for (const mutation of timeline) {\n // Check if the diff touches this path\n if (mutation.diff) {\n for (const diff of mutation.diff) {\n if (diff.path === path || diff.path.startsWith(path + '.') || diff.path.startsWith(path + '[')) {\n result.push(mutation);\n break;\n }\n }\n } else {\n // No diff, compare values directly\n const prevValue = getValueAtPath(mutation.previousState, path);\n const nextValue = getValueAtPath(mutation.nextState, path);\n\n if (prevValue !== nextValue) {\n result.push(mutation);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Compares two sessions to find divergence points\n */\n async compareSessions(\n sessionId1: string,\n sessionId2: string\n ): Promise<{\n divergencePoint?: number;\n session1Only: Mutation[];\n session2Only: Mutation[];\n }> {\n const timeline1 = this.store.getTimeline(sessionId1);\n const timeline2 = this.store.getTimeline(sessionId2);\n\n let divergencePoint: number | undefined;\n\n // Find first point of divergence\n const minLength = Math.min(timeline1.length, timeline2.length);\n\n for (let i = 0; i < minLength; i++) {\n const state1 = await this.getStateAtMutation(timeline1[i].id);\n const state2 = await this.getStateAtMutation(timeline2[i].id);\n\n if (JSON.stringify(state1) !== JSON.stringify(state2)) {\n divergencePoint = i;\n break;\n }\n }\n\n // Find unique actions\n const actions1 = new Set(timeline1.map(m => `${m.actionType}:${JSON.stringify(m.actionPayload)}`));\n const actions2 = new Set(timeline2.map(m => `${m.actionType}:${JSON.stringify(m.actionPayload)}`));\n\n const session1Only = timeline1.filter(m =>\n !actions2.has(`${m.actionType}:${JSON.stringify(m.actionPayload)}`)\n );\n const session2Only = timeline2.filter(m =>\n !actions1.has(`${m.actionType}:${JSON.stringify(m.actionPayload)}`)\n );\n\n return {\n divergencePoint,\n session1Only,\n session2Only,\n };\n }\n\n /**\n * Generates a summary of what happened in a time range\n */\n async summarizeTimeRange(\n sessionId: string,\n startTime: number,\n endTime: number\n ): Promise<{\n mutationCount: number;\n componentBreakdown: Record<string, number>;\n sourceBreakdown: Record<string, number>;\n pathsChanged: string[];\n }> {\n const mutations = this.store.queryMutations({\n sessionId,\n startTime,\n endTime,\n });\n\n const componentBreakdown: Record<string, number> = {};\n const sourceBreakdown: Record<string, number> = {};\n const pathsSet = new Set<string>();\n\n for (const mutation of mutations) {\n // Count by component\n const component = mutation.component || 'unknown';\n componentBreakdown[component] = (componentBreakdown[component] || 0) + 1;\n\n // Count by source\n sourceBreakdown[mutation.source] = (sourceBreakdown[mutation.source] || 0) + 1;\n\n // Collect changed paths\n if (mutation.diff) {\n for (const diff of mutation.diff) {\n pathsSet.add(diff.path);\n }\n }\n }\n\n return {\n mutationCount: mutations.length,\n componentBreakdown,\n sourceBreakdown,\n pathsChanged: Array.from(pathsSet),\n };\n }\n\n /**\n * Clears the state cache\n */\n clearCache(): void {\n this.stateCache.clear();\n }\n\n private cacheState(mutationId: string, state: unknown): void {\n if (this.stateCache.size >= this.maxCacheSize) {\n // Remove oldest entry\n const firstKey = this.stateCache.keys().next().value;\n if (firstKey) {\n this.stateCache.delete(firstKey);\n }\n }\n this.stateCache.set(mutationId, deepClone(state));\n }\n}\n","import { calculateDiff } from '../core/diff';\nimport type { Mutation } from '../core/mutation';\n\n/**\n * Session metadata\n */\nexport interface Session {\n id: string;\n appId: string;\n startTime: Date;\n endTime?: Date;\n userAgent?: string;\n url?: string;\n metadata?: Record<string, unknown>;\n mutationCount: number;\n}\n\n/**\n * Query options for fetching mutations\n */\nexport interface MutationQueryOptions {\n sessionId?: string;\n startTime?: number;\n endTime?: number;\n source?: Mutation['source'];\n component?: string;\n limit?: number;\n offset?: number;\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Options for the mutation store\n */\nexport interface MutationStoreOptions {\n /** Maximum mutations to keep per session */\n maxMutationsPerSession?: number;\n\n /** Maximum total mutations across all sessions */\n maxTotalMutations?: number;\n\n /** Session timeout in milliseconds */\n sessionTimeout?: number;\n\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * In-memory mutation store\n * Can be extended to support MongoDB or other persistent storage\n */\nexport class MutationStore {\n private sessions: Map<string, Session> = new Map();\n private mutations: Map<string, Mutation[]> = new Map();\n private options: Required<MutationStoreOptions>;\n private totalMutationCount = 0;\n\n constructor(options: MutationStoreOptions = {}) {\n this.options = {\n maxMutationsPerSession: options.maxMutationsPerSession ?? 10000,\n maxTotalMutations: options.maxTotalMutations ?? 100000,\n sessionTimeout: options.sessionTimeout ?? 30 * 60 * 1000, // 30 minutes\n debug: options.debug ?? false,\n };\n }\n\n /**\n * Creates or updates a session\n */\n registerSession(\n sessionId: string,\n appId: string,\n metadata?: Record<string, unknown>\n ): Session {\n let session = this.sessions.get(sessionId);\n\n if (!session) {\n session = {\n id: sessionId,\n appId,\n startTime: new Date(),\n metadata,\n mutationCount: 0,\n };\n this.sessions.set(sessionId, session);\n this.mutations.set(sessionId, []);\n this.log('Session registered:', sessionId);\n }\n\n return session;\n }\n\n /**\n * Ends a session\n */\n endSession(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.endTime = new Date();\n this.log('Session ended:', sessionId);\n }\n }\n\n /**\n * Stores a mutation\n */\n storeMutation(mutation: Mutation): void {\n const sessionId = mutation.sessionId;\n\n // Ensure session exists\n if (!this.sessions.has(sessionId)) {\n this.registerSession(sessionId, 'unknown');\n }\n\n // Get or create mutation array\n let sessionMutations = this.mutations.get(sessionId);\n if (!sessionMutations) {\n sessionMutations = [];\n this.mutations.set(sessionId, sessionMutations);\n }\n\n // Add diff if not present\n if (!mutation.diff && mutation.previousState !== undefined && mutation.nextState !== undefined) {\n mutation.diff = calculateDiff(mutation.previousState, mutation.nextState);\n }\n\n // Enforce limits\n if (sessionMutations.length >= this.options.maxMutationsPerSession) {\n sessionMutations.shift();\n this.totalMutationCount--;\n }\n\n if (this.totalMutationCount >= this.options.maxTotalMutations) {\n this.evictOldestMutations();\n }\n\n // Store mutation\n sessionMutations.push(mutation);\n this.totalMutationCount++;\n\n // Update session\n const session = this.sessions.get(sessionId)!;\n session.mutationCount++;\n\n this.log('Mutation stored:', mutation.id);\n }\n\n /**\n * Stores multiple mutations at once\n */\n storeMutations(mutations: Mutation[]): void {\n for (const mutation of mutations) {\n this.storeMutation(mutation);\n }\n }\n\n /**\n * Gets a session by ID\n */\n getSession(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Gets all sessions\n */\n getSessions(appId?: string): Session[] {\n const sessions = Array.from(this.sessions.values());\n if (appId) {\n return sessions.filter(s => s.appId === appId);\n }\n return sessions;\n }\n\n /**\n * Gets a specific mutation by ID\n */\n getMutation(mutationId: string): Mutation | undefined {\n for (const sessionMutations of this.mutations.values()) {\n const mutation = sessionMutations.find(m => m.id === mutationId);\n if (mutation) return mutation;\n }\n return undefined;\n }\n\n /**\n * Queries mutations with filters\n */\n queryMutations(options: MutationQueryOptions = {}): Mutation[] {\n let results: Mutation[] = [];\n\n // Get mutations from specific session or all sessions\n if (options.sessionId) {\n const sessionMutations = this.mutations.get(options.sessionId);\n if (sessionMutations) {\n results = [...sessionMutations];\n }\n } else {\n for (const sessionMutations of this.mutations.values()) {\n results.push(...sessionMutations);\n }\n }\n\n // Filter by time range\n if (options.startTime !== undefined) {\n results = results.filter(m => m.timestamp >= options.startTime!);\n }\n if (options.endTime !== undefined) {\n results = results.filter(m => m.timestamp <= options.endTime!);\n }\n\n // Filter by source\n if (options.source) {\n results = results.filter(m => m.source === options.source);\n }\n\n // Filter by component\n if (options.component) {\n results = results.filter(m => m.component === options.component);\n }\n\n // Sort\n results.sort((a, b) => {\n const order = options.sortOrder === 'desc' ? -1 : 1;\n return (a.logicalClock - b.logicalClock) * order;\n });\n\n // Apply pagination\n if (options.offset !== undefined) {\n results = results.slice(options.offset);\n }\n if (options.limit !== undefined) {\n results = results.slice(0, options.limit);\n }\n\n return results;\n }\n\n /**\n * Gets the timeline for a session\n */\n getTimeline(sessionId: string): Mutation[] {\n const mutations = this.mutations.get(sessionId) || [];\n return [...mutations].sort((a, b) => a.logicalClock - b.logicalClock);\n }\n\n /**\n * Deletes a session and its mutations\n */\n deleteSession(sessionId: string): boolean {\n const sessionMutations = this.mutations.get(sessionId);\n if (sessionMutations) {\n this.totalMutationCount -= sessionMutations.length;\n }\n\n this.mutations.delete(sessionId);\n return this.sessions.delete(sessionId);\n }\n\n /**\n * Clears all data\n */\n clear(): void {\n this.sessions.clear();\n this.mutations.clear();\n this.totalMutationCount = 0;\n this.log('Store cleared');\n }\n\n /**\n * Gets store statistics\n */\n getStats(): {\n sessionCount: number;\n totalMutations: number;\n mutationsPerSession: Record<string, number>;\n } {\n const mutationsPerSession: Record<string, number> = {};\n for (const [sessionId, mutations] of this.mutations.entries()) {\n mutationsPerSession[sessionId] = mutations.length;\n }\n\n return {\n sessionCount: this.sessions.size,\n totalMutations: this.totalMutationCount,\n mutationsPerSession,\n };\n }\n\n /**\n * Evicts oldest mutations when capacity is exceeded\n */\n private evictOldestMutations(): void {\n // Find session with oldest mutations\n let oldestSession: string | null = null;\n let oldestTime = Infinity;\n\n for (const [sessionId, session] of this.sessions.entries()) {\n if (session.startTime.getTime() < oldestTime) {\n oldestTime = session.startTime.getTime();\n oldestSession = sessionId;\n }\n }\n\n if (oldestSession) {\n const mutations = this.mutations.get(oldestSession);\n if (mutations && mutations.length > 0) {\n mutations.shift();\n this.totalMutationCount--;\n this.log('Evicted oldest mutation from:', oldestSession);\n }\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[MutationStore]', ...args);\n }\n }\n}\n","import express, { type Express } from 'express';\nimport type { Server } from 'http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { Mutation } from '../core/mutation';\nimport { createAPIRoutes } from './api';\nimport { TimelineReconstructor } from './reconstructor';\nimport { MutationStore, type MutationStoreOptions } from './store';\n\n/**\n * Options for the recorder server\n */\nexport interface RecorderServerOptions {\n /** HTTP port (default: 8080) */\n port?: number;\n\n /** WebSocket port (default: 8081) */\n wsPort?: number;\n\n /** Enable CORS (default: true) */\n cors?: boolean;\n\n /** API base path (default: '/api') */\n apiPath?: string;\n\n /** Mutation store options */\n storeOptions?: MutationStoreOptions;\n\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Recorder server instance\n */\nexport interface RecorderServer {\n /** Express application */\n app: Express;\n\n /** HTTP server */\n httpServer: Server;\n\n /** WebSocket server */\n wss: WebSocketServer;\n\n /** Mutation store */\n store: MutationStore;\n\n /** Timeline reconstructor */\n reconstructor: TimelineReconstructor;\n\n /** Start the server */\n start: () => Promise<void>;\n\n /** Stop the server */\n stop: () => Promise<void>;\n}\n\ninterface WSMessage {\n type: string;\n payload: unknown;\n}\n\n/**\n * Creates a State Surgeon recorder server\n *\n * @example\n * ```ts\n * import { createRecorderServer } from 'state-surgeon/recorder';\n *\n * const server = createRecorderServer({ port: 8080 });\n * await server.start();\n *\n * console.log('State Surgeon Recorder running on http://localhost:8080');\n * ```\n */\nexport function createRecorderServer(options: RecorderServerOptions = {}): RecorderServer {\n const port = options.port ?? 8080;\n const wsPort = options.wsPort ?? 8081;\n const apiPath = options.apiPath ?? '/api';\n const debug = options.debug ?? false;\n\n // Create store and reconstructor\n const store = new MutationStore(options.storeOptions);\n const reconstructor = new TimelineReconstructor(store);\n\n // Create Express app\n const app = express();\n\n // Middleware\n app.use(express.json({ limit: '10mb' }));\n\n // CORS\n if (options.cors !== false) {\n app.use((_req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');\n next();\n });\n }\n\n // API routes\n app.use(apiPath, createAPIRoutes(store, reconstructor));\n\n // Dashboard route placeholder\n app.get('/_surgeon', (_req, res) => {\n res.send(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>State Surgeon Dashboard</title>\n <style>\n body { font-family: system-ui, sans-serif; padding: 2rem; background: #1a1a2e; color: #eee; }\n h1 { color: #00d9ff; }\n .stats { background: #16213e; padding: 1rem; border-radius: 8px; margin: 1rem 0; }\n pre { background: #0f0f23; padding: 1rem; border-radius: 4px; overflow: auto; }\n </style>\n </head>\n <body>\n <h1>🔬 State Surgeon Dashboard</h1>\n <p>Recorder is running. Connect your application to start capturing mutations.</p>\n <div class=\"stats\">\n <h3>Quick Stats</h3>\n <div id=\"stats\">Loading...</div>\n </div>\n <h3>Recent Sessions</h3>\n <pre id=\"sessions\">Loading...</pre>\n <script>\n async function loadData() {\n try {\n const statsRes = await fetch('${apiPath}/stats');\n const stats = await statsRes.json();\n document.getElementById('stats').innerHTML =\n '<pre>' + JSON.stringify(stats, null, 2) + '</pre>';\n\n const sessionsRes = await fetch('${apiPath}/sessions');\n const sessions = await sessionsRes.json();\n document.getElementById('sessions').textContent =\n JSON.stringify(sessions, null, 2);\n } catch (e) {\n document.getElementById('stats').textContent = 'Error loading stats';\n }\n }\n loadData();\n setInterval(loadData, 5000);\n </script>\n </body>\n </html>\n `);\n });\n\n // Create HTTP server\n const httpServer = app.listen(0); // Will bind to actual port in start()\n httpServer.close();\n\n // Create WebSocket server\n let wss: WebSocketServer;\n\n // Connected clients\n const clients = new Map<WebSocket, { sessionId?: string }>();\n\n function log(...args: unknown[]) {\n if (debug) {\n console.log('[State Surgeon Recorder]', ...args);\n }\n }\n\n function handleMessage(ws: WebSocket, message: WSMessage) {\n log('Received message:', message.type);\n\n switch (message.type) {\n case 'REGISTER_SESSION': {\n const payload = message.payload as {\n sessionId: string;\n appId: string;\n userAgent?: string;\n url?: string;\n };\n\n store.registerSession(payload.sessionId, payload.appId, {\n userAgent: payload.userAgent,\n url: payload.url,\n });\n\n clients.set(ws, { sessionId: payload.sessionId });\n\n ws.send(JSON.stringify({\n type: 'SESSION_CONFIRMED',\n payload: { sessionId: payload.sessionId },\n }));\n\n log('Session registered:', payload.sessionId);\n break;\n }\n\n case 'MUTATION_RECORDED': {\n const mutation = message.payload as Mutation;\n store.storeMutation(mutation);\n\n ws.send(JSON.stringify({\n type: 'MUTATION_ACKNOWLEDGED',\n payload: { mutationId: mutation.id, receivedAt: Date.now() },\n }));\n break;\n }\n\n case 'MUTATION_BATCH': {\n const payload = message.payload as { mutations: Mutation[] };\n store.storeMutations(payload.mutations);\n\n ws.send(JSON.stringify({\n type: 'BATCH_ACKNOWLEDGED',\n payload: { count: payload.mutations.length, receivedAt: Date.now() },\n }));\n\n log('Batch received:', payload.mutations.length, 'mutations');\n break;\n }\n\n case 'END_SESSION': {\n const clientInfo = clients.get(ws);\n if (clientInfo?.sessionId) {\n store.endSession(clientInfo.sessionId);\n log('Session ended:', clientInfo.sessionId);\n }\n break;\n }\n\n default:\n log('Unknown message type:', message.type);\n }\n }\n\n const server: RecorderServer = {\n app,\n httpServer: null as unknown as Server,\n wss: null as unknown as WebSocketServer,\n store,\n reconstructor,\n\n async start() {\n return new Promise((resolve) => {\n // Start HTTP server\n server.httpServer = app.listen(port, () => {\n log(`HTTP server listening on port ${port}`);\n });\n\n // Start WebSocket server\n wss = new WebSocketServer({ port: wsPort });\n server.wss = wss;\n\n wss.on('connection', (ws) => {\n log('Client connected');\n clients.set(ws, {});\n\n ws.on('message', (data) => {\n try {\n const message = JSON.parse(data.toString()) as WSMessage;\n handleMessage(ws, message);\n } catch (error) {\n log('Error parsing message:', error);\n }\n });\n\n ws.on('close', () => {\n const clientInfo = clients.get(ws);\n if (clientInfo?.sessionId) {\n store.endSession(clientInfo.sessionId);\n }\n clients.delete(ws);\n log('Client disconnected');\n });\n\n ws.on('error', (error) => {\n log('WebSocket error:', error);\n });\n });\n\n wss.on('listening', () => {\n log(`WebSocket server listening on port ${wsPort}`);\n resolve();\n });\n });\n },\n\n async stop() {\n return new Promise((resolve) => {\n // Close all WebSocket connections\n for (const ws of clients.keys()) {\n ws.close();\n }\n clients.clear();\n\n // Close WebSocket server\n if (wss) {\n wss.close(() => {\n log('WebSocket server closed');\n });\n }\n\n // Close HTTP server\n if (server.httpServer) {\n server.httpServer.close(() => {\n log('HTTP server closed');\n resolve();\n });\n } else {\n resolve();\n }\n });\n },\n };\n\n return server;\n}\n"]}