react-devtools-bridge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/SKILL.md +96 -0
- package/TOOLS.md +96 -0
- package/dist/cli.js +2806 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1099 -0
- package/dist/index.js +2799 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/bridge.ts","../src/logger.ts","../src/errors.ts","../src/headless-server.ts"],"sourcesContent":["/**\n * React DevTools MCP Server\n *\n * Exposes React DevTools functionality via Model Context Protocol.\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n type Tool,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { DevToolsBridge } from './bridge.js';\nimport { createLogger, getLogLevelFromEnv, type Logger } from './logger.js';\nimport type { ComponentFilter } from './types.js';\nimport { HeadlessDevToolsServer, startHeadlessServer } from './headless-server.js';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TOOL DEFINITIONS\n// ═══════════════════════════════════════════════════════════════════════════\n\nconst TOOLS: Tool[] = [\n // Connection\n {\n name: 'connect',\n description: 'Connect to React DevTools backend via WebSocket',\n inputSchema: {\n type: 'object',\n properties: {\n host: { type: 'string', description: 'Host (default: localhost)' },\n port: { type: 'number', description: 'Port (default: 8097)' },\n timeout: { type: 'number', description: 'Timeout in ms (default: 5000)' },\n },\n },\n },\n {\n name: 'disconnect',\n description: 'Disconnect from React DevTools backend',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'get_connection_status',\n description: 'Get current connection status',\n inputSchema: { type: 'object', properties: {} },\n },\n\n // Component Tree\n {\n name: 'get_component_tree',\n description: 'Get the React component tree for all roots',\n inputSchema: {\n type: 'object',\n properties: {\n rootID: { type: 'number', description: 'Filter by root ID (optional)' },\n maxDepth: { type: 'number', description: 'Maximum depth to return (optional)' },\n },\n },\n },\n {\n name: 'get_element_by_id',\n description: 'Get basic element info by ID',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'search_components',\n description: 'Search for components by name',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query (component name)' },\n caseSensitive: { type: 'boolean', description: 'Case sensitive (default: false)' },\n isRegex: { type: 'boolean', description: 'Regex search (default: false)' },\n },\n required: ['query'],\n },\n },\n\n // Inspection\n {\n name: 'inspect_element',\n description: 'Get full inspection data for a component including props, state, hooks',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID to inspect' },\n paths: {\n type: 'array',\n items: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n },\n description: 'Paths to hydrate for lazy loading',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'get_owners_list',\n description: 'Get the chain of components that rendered this element',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'get_element_source',\n description: 'Get source location for an element',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n\n // Overrides\n {\n name: 'override_props',\n description: 'Override a prop value on a component',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path to the prop',\n },\n value: { description: 'New value' },\n },\n required: ['id', 'path', 'value'],\n },\n },\n {\n name: 'override_state',\n description: 'Override a state value on a class component',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path to state key',\n },\n value: { description: 'New value' },\n },\n required: ['id', 'path', 'value'],\n },\n },\n {\n name: 'override_hooks',\n description: 'Override a hook value on a function component',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n hookIndex: { type: 'number', description: 'Hook index' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path within hook value',\n },\n value: { description: 'New value' },\n },\n required: ['id', 'hookIndex', 'path', 'value'],\n },\n },\n {\n name: 'override_context',\n description: 'Override a context value',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path within context',\n },\n value: { description: 'New value' },\n },\n required: ['id', 'path', 'value'],\n },\n },\n {\n name: 'delete_path',\n description: 'Delete a path from props/state/hooks/context',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n target: { type: 'string', enum: ['props', 'state', 'hooks', 'context'], description: 'Target' },\n hookIndex: { type: 'number', description: 'Hook index (if target is hooks)' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path to delete',\n },\n },\n required: ['id', 'target', 'path'],\n },\n },\n {\n name: 'rename_path',\n description: 'Rename a key in props/state/hooks/context',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n target: { type: 'string', enum: ['props', 'state', 'hooks', 'context'], description: 'Target' },\n hookIndex: { type: 'number', description: 'Hook index (if target is hooks)' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path to the key',\n },\n oldKey: { type: 'string', description: 'Old key name' },\n newKey: { type: 'string', description: 'New key name' },\n },\n required: ['id', 'target', 'path', 'oldKey', 'newKey'],\n },\n },\n\n // Profiling\n {\n name: 'start_profiling',\n description: 'Start profiling React renders',\n inputSchema: {\n type: 'object',\n properties: {\n recordTimeline: { type: 'boolean', description: 'Record timeline data' },\n recordChangeDescriptions: { type: 'boolean', description: 'Record why components rendered' },\n },\n },\n },\n {\n name: 'stop_profiling',\n description: 'Stop profiling and get data',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'get_profiling_data',\n description: 'Get profiling data without stopping',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'get_profiling_status',\n description: 'Check if profiling is active',\n inputSchema: { type: 'object', properties: {} },\n },\n\n // Error & Suspense\n {\n name: 'get_errors_and_warnings',\n description: 'Get all errors and warnings from components',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'clear_errors_and_warnings',\n description: \"Clear all or specific element's errors/warnings\",\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID (optional, clears all if omitted)' },\n clearErrors: { type: 'boolean', description: 'Clear errors' },\n clearWarnings: { type: 'boolean', description: 'Clear warnings' },\n },\n },\n },\n {\n name: 'toggle_error',\n description: 'Toggle error boundary state for testing',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n isErrored: { type: 'boolean', description: 'Force error state' },\n },\n required: ['id', 'isErrored'],\n },\n },\n {\n name: 'toggle_suspense',\n description: 'Toggle suspense state for testing',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n isSuspended: { type: 'boolean', description: 'Force suspended state' },\n },\n required: ['id', 'isSuspended'],\n },\n },\n\n // Debugging\n {\n name: 'highlight_element',\n description: 'Highlight an element in the app UI',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID to highlight' },\n duration: { type: 'number', description: 'Highlight duration in ms (default: 2000)' },\n },\n required: ['id'],\n },\n },\n {\n name: 'clear_highlight',\n description: 'Clear any active element highlight',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'scroll_to_element',\n description: 'Scroll the app to show an element',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'log_to_console',\n description: 'Log an element to the browser/app console as $r',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'store_as_global',\n description: 'Store a value as a global variable for console access',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path to the value',\n },\n globalName: { type: 'string', description: 'Global variable name' },\n },\n required: ['id', 'path', 'globalName'],\n },\n },\n {\n name: 'view_source',\n description: 'Open element source in IDE (if supported)',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n\n // Filters\n {\n name: 'get_component_filters',\n description: 'Get current component filters',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'set_component_filters',\n description: 'Set component filters (hide certain components)',\n inputSchema: {\n type: 'object',\n properties: {\n filters: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n type: { type: 'string', enum: ['name', 'location', 'type', 'hoc'] },\n value: { type: 'string' },\n isEnabled: { type: 'boolean' },\n isRegex: { type: 'boolean' },\n },\n required: ['type', 'value', 'isEnabled'],\n },\n },\n },\n required: ['filters'],\n },\n },\n {\n name: 'set_trace_updates_enabled',\n description: 'Enable/disable visual update highlighting',\n inputSchema: {\n type: 'object',\n properties: {\n enabled: { type: 'boolean', description: 'Enable trace updates' },\n },\n required: ['enabled'],\n },\n },\n\n // React Native\n {\n name: 'get_native_style',\n description: 'Get native style and layout info (React Native only)',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'set_native_style',\n description: 'Set a native style property (React Native only)',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n property: { type: 'string', description: 'Style property name' },\n value: { description: 'New value' },\n },\n required: ['id', 'property', 'value'],\n },\n },\n\n // Health & Monitoring\n {\n name: 'health_check',\n description: 'Get server and connection health status',\n inputSchema: { type: 'object', properties: {} },\n },\n\n // Phase 2: Protocol & Renderer Management\n {\n name: 'get_capabilities',\n description: 'Get negotiated protocol capabilities (features supported by backend)',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'get_renderers',\n description: 'Get all connected React renderers (for multi-renderer apps)',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'get_renderer',\n description: 'Get a specific renderer by ID',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Renderer ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'get_elements_by_renderer',\n description: 'Get all elements for a specific renderer',\n inputSchema: {\n type: 'object',\n properties: {\n rendererID: { type: 'number', description: 'Renderer ID' },\n },\n required: ['rendererID'],\n },\n },\n\n // Phase 2: Native Inspection\n {\n name: 'start_inspecting_native',\n description: 'Start native element inspection mode (tap-to-select)',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'stop_inspecting_native',\n description: 'Stop native element inspection mode',\n inputSchema: {\n type: 'object',\n properties: {\n selectNextElement: { type: 'boolean', description: 'Select element under pointer (default: true)' },\n },\n },\n },\n {\n name: 'get_inspecting_native_status',\n description: 'Check if native inspection mode is active',\n inputSchema: { type: 'object', properties: {} },\n },\n\n // Phase 2: Additional Features\n {\n name: 'capture_screenshot',\n description: 'Capture screenshot of an element (if supported)',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'save_to_clipboard',\n description: 'Save content to system clipboard',\n inputSchema: {\n type: 'object',\n properties: {\n value: { type: 'string', description: 'Content to save' },\n },\n required: ['value'],\n },\n },\n {\n name: 'view_attribute_source',\n description: 'Get source location for a specific attribute path',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Element ID' },\n path: {\n type: 'array',\n items: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n description: 'Path to attribute',\n },\n },\n required: ['id', 'path'],\n },\n },\n];\n\n// ═══════════════════════════════════════════════════════════════════════════\n// SERVER CREATION\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface ServerOptions {\n host?: string;\n port?: number;\n autoConnect?: boolean;\n logger?: Logger;\n /**\n * Run in standalone mode with embedded DevTools server.\n * When true, starts a headless WebSocket server that React apps can connect to directly.\n * No need for external `npx react-devtools` - works fully standalone.\n *\n * Default: true (can be disabled via DEVTOOLS_STANDALONE=false env var)\n */\n standalone?: boolean;\n}\n\nexport function createServer(options: ServerOptions = {}) {\n const logger = options.logger ?? createLogger({\n level: getLogLevelFromEnv(),\n prefix: 'devtools-mcp',\n });\n\n const host = options.host ?? process.env.DEVTOOLS_HOST ?? 'localhost';\n const port = options.port ?? (Number(process.env.DEVTOOLS_PORT) || 8097);\n\n // Standalone mode: run embedded DevTools server (default: true)\n const standalone = options.standalone ?? (process.env.DEVTOOLS_STANDALONE !== 'false');\n let headlessServer: HeadlessDevToolsServer | null = null;\n\n const bridge = new DevToolsBridge({\n host,\n port,\n timeout: Number(process.env.DEVTOOLS_TIMEOUT) || 5000,\n logger: logger.child('bridge'),\n });\n\n const server = new Server(\n {\n name: 'react-devtools-mcp',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n );\n\n // List tools\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS,\n }));\n\n // List resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: 'devtools://components',\n name: 'Component Tree',\n description: 'Live component tree updates',\n mimeType: 'application/json',\n },\n {\n uri: 'devtools://selection',\n name: 'Current Selection',\n description: 'Currently selected element',\n mimeType: 'application/json',\n },\n ],\n }));\n\n // Read resources\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri;\n\n if (uri === 'devtools://components') {\n const tree = bridge.getComponentTree();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(tree, null, 2),\n },\n ],\n };\n }\n\n if (uri === 'devtools://selection') {\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({ selectedElementID: null }),\n },\n ],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n });\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n const result = await handleToolCall(bridge, name, args ?? {});\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ error: message }),\n },\n ],\n isError: true,\n };\n }\n });\n\n // Auto-connect on start if configured\n const autoConnect = options.autoConnect ?? (process.env.DEVTOOLS_AUTO_CONNECT !== 'false');\n\n return {\n server,\n bridge,\n headlessServer: () => headlessServer,\n async start() {\n // Start embedded DevTools server in standalone mode\n if (standalone) {\n try {\n logger.info('Starting standalone mode with embedded DevTools server', { host, port });\n headlessServer = await startHeadlessServer({\n host,\n port,\n logger: logger.child('headless'),\n });\n\n let bridgeHandle: { receiveMessage: (data: string) => void; detach: () => void } | null = null;\n\n // Add message listener BEFORE any connections happen\n // This ensures we don't miss early messages\n headlessServer!.addMessageListener((event, payload) => {\n if (bridgeHandle) {\n // Convert to JSON string for bridge's handleMessage\n const data = JSON.stringify({ event, payload });\n bridgeHandle.receiveMessage(data);\n } else {\n logger.debug('Message received before bridge attached', { event });\n }\n });\n\n // When React app connects, wire up the MCP bridge\n headlessServer.on('connected', () => {\n logger.info('React app connected to embedded DevTools server');\n\n // Attach MCP bridge to receive messages from headless server\n bridgeHandle = bridge.attachToExternal(\n (event, payload) => {\n // Send messages through headless server's WebSocket\n headlessServer!.sendMessage(event, payload);\n },\n () => {\n logger.info('MCP bridge detached from headless server');\n }\n );\n });\n\n headlessServer.on('disconnected', () => {\n logger.info('React app disconnected from embedded DevTools server');\n bridgeHandle?.detach();\n bridgeHandle = null;\n });\n\n headlessServer.on('error', (err: Error) => {\n logger.error('Embedded DevTools server error', { error: err.message });\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n logger.error('Failed to start embedded DevTools server', { error: message });\n // Continue without standalone mode - user can run external devtools\n }\n }\n\n // Connect MCP transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Connect bridge to DevTools (skip if using standalone mode - bridge is attached to headless server)\n if (autoConnect && !standalone) {\n try {\n await bridge.connect();\n } catch {\n // Connection failure is not fatal - tools can connect later\n }\n }\n },\n\n async stop() {\n if (headlessServer) {\n await headlessServer.stop();\n headlessServer = null;\n }\n bridge.disconnect();\n },\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TOOL HANDLERS\n// ═══════════════════════════════════════════════════════════════════════════\n\nasync function handleToolCall(\n bridge: DevToolsBridge,\n name: string,\n args: Record<string, unknown>\n): Promise<unknown> {\n switch (name) {\n // Connection\n case 'connect': {\n const status = await bridge.connect();\n return { success: true, status };\n }\n\n case 'disconnect': {\n bridge.disconnect();\n return { success: true };\n }\n\n case 'get_connection_status': {\n return { status: bridge.getStatus() };\n }\n\n // Component Tree\n case 'get_component_tree': {\n const roots = bridge.getComponentTree(\n args.rootID as number | undefined,\n args.maxDepth as number | undefined\n );\n return { roots };\n }\n\n case 'get_element_by_id': {\n const element = bridge.getElementById(args.id as number);\n return { element };\n }\n\n case 'search_components': {\n const matches = bridge.searchComponents(\n args.query as string,\n args.caseSensitive as boolean,\n args.isRegex as boolean\n );\n return { matches, totalCount: matches.length };\n }\n\n // Inspection\n case 'inspect_element': {\n const result = await bridge.inspectElement(\n args.id as number,\n args.paths as Array<Array<string | number>> | undefined\n );\n\n if (result.type === 'full-data') {\n return { success: true, element: result.element, error: null };\n } else if (result.type === 'not-found') {\n return { success: false, element: null, error: { type: 'not_found', message: 'Element not found' } };\n } else if (result.type === 'error') {\n return { success: false, element: null, error: { type: result.errorType, message: result.message, stack: result.stack } };\n } else {\n return { success: true, element: null, error: null };\n }\n }\n\n case 'get_owners_list': {\n const owners = await bridge.getOwnersList(args.id as number);\n return { owners };\n }\n\n case 'get_element_source': {\n const result = await bridge.inspectElement(args.id as number);\n if (result.type === 'full-data') {\n return { source: result.element.source, stack: result.element.stack };\n }\n return { source: null, stack: null };\n }\n\n // Overrides\n case 'override_props': {\n bridge.overrideValueAtPath(\n 'props',\n args.id as number,\n args.path as Array<string | number>,\n args.value\n );\n return { success: true };\n }\n\n case 'override_state': {\n bridge.overrideValueAtPath(\n 'state',\n args.id as number,\n args.path as Array<string | number>,\n args.value\n );\n return { success: true };\n }\n\n case 'override_hooks': {\n bridge.overrideValueAtPath(\n 'hooks',\n args.id as number,\n args.path as Array<string | number>,\n args.value,\n args.hookIndex as number\n );\n return { success: true };\n }\n\n case 'override_context': {\n bridge.overrideValueAtPath(\n 'context',\n args.id as number,\n args.path as Array<string | number>,\n args.value\n );\n return { success: true };\n }\n\n case 'delete_path': {\n bridge.deletePath(\n args.target as 'props' | 'state' | 'hooks' | 'context',\n args.id as number,\n args.path as Array<string | number>,\n args.hookIndex as number | undefined\n );\n return { success: true };\n }\n\n case 'rename_path': {\n bridge.renamePath(\n args.target as 'props' | 'state' | 'hooks' | 'context',\n args.id as number,\n args.path as Array<string | number>,\n args.oldKey as string,\n args.newKey as string,\n args.hookIndex as number | undefined\n );\n return { success: true };\n }\n\n // Profiling\n case 'start_profiling': {\n bridge.startProfiling(\n args.recordTimeline as boolean | undefined,\n args.recordChangeDescriptions as boolean | undefined\n );\n return { success: true, requiresReload: false };\n }\n\n case 'stop_profiling': {\n bridge.stopProfiling();\n const data = await bridge.getProfilingData();\n return { success: true, data };\n }\n\n case 'get_profiling_data': {\n const status = bridge.getProfilingStatus();\n const data = await bridge.getProfilingData();\n return { isActive: status.isProfiling, data };\n }\n\n case 'get_profiling_status': {\n const status = bridge.getProfilingStatus();\n return {\n isProfiling: status.isProfiling,\n recordTimeline: false,\n recordChangeDescriptions: true,\n };\n }\n\n // Error & Suspense\n case 'get_errors_and_warnings': {\n const { errors, warnings } = bridge.getErrorsAndWarnings();\n return {\n errors: Object.fromEntries(errors),\n warnings: Object.fromEntries(warnings),\n };\n }\n\n case 'clear_errors_and_warnings': {\n bridge.clearErrorsAndWarnings(args.id as number | undefined);\n return { success: true };\n }\n\n case 'toggle_error': {\n bridge.overrideError(args.id as number, args.isErrored as boolean);\n return { success: true };\n }\n\n case 'toggle_suspense': {\n bridge.overrideSuspense(args.id as number, args.isSuspended as boolean);\n return { success: true };\n }\n\n // Debugging\n case 'highlight_element': {\n bridge.highlightElement(args.id as number);\n const duration = (args.duration as number) ?? 2000;\n setTimeout(() => bridge.clearHighlight(), duration);\n return { success: true };\n }\n\n case 'clear_highlight': {\n bridge.clearHighlight();\n return { success: true };\n }\n\n case 'scroll_to_element': {\n bridge.scrollToElement(args.id as number);\n return { success: true };\n }\n\n case 'log_to_console': {\n bridge.logToConsole(args.id as number);\n return { success: true };\n }\n\n case 'store_as_global': {\n bridge.storeAsGlobal(\n args.id as number,\n args.path as Array<string | number>,\n 1 // count\n );\n return { success: true };\n }\n\n case 'view_source': {\n bridge.viewElementSource(args.id as number);\n const result = await bridge.inspectElement(args.id as number);\n if (result.type === 'full-data') {\n return { success: true, source: result.element.source };\n }\n return { success: true, source: null };\n }\n\n // Filters\n case 'get_component_filters': {\n // Filters are managed by DevTools, return empty for now\n return { filters: [] };\n }\n\n case 'set_component_filters': {\n bridge.setComponentFilters(args.filters as ComponentFilter[]);\n return { success: true };\n }\n\n case 'set_trace_updates_enabled': {\n bridge.setTraceUpdatesEnabled(args.enabled as boolean);\n return { success: true };\n }\n\n // React Native\n case 'get_native_style': {\n const result = await bridge.getNativeStyle(args.id as number);\n return result;\n }\n\n case 'set_native_style': {\n bridge.setNativeStyle(\n args.id as number,\n args.property as string,\n args.value\n );\n return { success: true };\n }\n\n // Health & Monitoring\n case 'health_check': {\n const status = bridge.getStatus();\n const lastMessageTime = bridge.getLastMessageTime();\n const pendingRequests = bridge.getPendingRequestCount();\n const now = Date.now();\n\n return {\n connected: status.state === 'connected',\n state: status.state,\n rendererCount: status.rendererCount,\n reactVersion: status.reactVersion,\n error: status.error,\n lastMessageAgo: lastMessageTime > 0 ? now - lastMessageTime : null,\n pendingRequests,\n uptime: process.uptime(),\n };\n }\n\n // Phase 2: Protocol & Renderer Management\n case 'get_capabilities': {\n const capabilities = bridge.getCapabilities();\n const negotiated = bridge.hasNegotiatedCapabilities();\n return { capabilities, negotiated };\n }\n\n case 'get_renderers': {\n const renderers = bridge.getRenderers();\n return {\n renderers: renderers.map((r) => ({\n id: r.id,\n version: r.version,\n packageName: r.packageName,\n rootCount: r.rootIDs.size,\n elementCount: r.elementIDs.size,\n })),\n };\n }\n\n case 'get_renderer': {\n const renderer = bridge.getRenderer(args.id as number);\n if (!renderer) {\n return { renderer: null };\n }\n return {\n renderer: {\n id: renderer.id,\n version: renderer.version,\n packageName: renderer.packageName,\n rootIDs: Array.from(renderer.rootIDs),\n elementCount: renderer.elementIDs.size,\n },\n };\n }\n\n case 'get_elements_by_renderer': {\n const elements = bridge.getElementsByRenderer(args.rendererID as number);\n return { elements, count: elements.length };\n }\n\n // Phase 2: Native Inspection\n case 'start_inspecting_native': {\n bridge.startInspectingNative();\n return { success: true, isInspecting: true };\n }\n\n case 'stop_inspecting_native': {\n const selectNextElement = args.selectNextElement !== false;\n const elementID = await bridge.stopInspectingNative(selectNextElement);\n return { success: true, selectedElementID: elementID };\n }\n\n case 'get_inspecting_native_status': {\n return { isInspecting: bridge.isInspectingNativeMode() };\n }\n\n // Phase 2: Additional Features\n case 'capture_screenshot': {\n const screenshot = await bridge.captureScreenshot(args.id as number);\n return { success: screenshot !== null, screenshot };\n }\n\n case 'save_to_clipboard': {\n const clipResult = await bridge.saveToClipboard(args.value as string);\n return clipResult;\n }\n\n case 'view_attribute_source': {\n const source = await bridge.viewAttributeSource(\n args.id as number,\n args.path as Array<string | number>\n );\n return { source };\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n}\n","/**\n * React DevTools Bridge\n *\n * Manages WebSocket connection to React DevTools backend and maintains\n * component tree state. Translates between MCP requests and DevTools protocol.\n *\n * Phase 1 Fixes Implemented:\n * - Logging infrastructure\n * - Connection race condition fix (deduplication)\n * - Automatic reconnection with exponential backoff\n * - Bounds checking in operations parser\n * - Memory leak fix in request handling\n * - Request/response ID correlation\n */\n\nimport { WebSocket } from 'ws';\nimport { EventEmitter } from 'events';\nimport type {\n ConnectionConfig,\n ConnectionState,\n ConnectionStatus,\n Element,\n ElementType,\n RootTree,\n InspectElementPayload,\n SerializedElement,\n ProfilingData,\n ComponentFilter,\n OverrideTarget,\n ProtocolCapabilities,\n Renderer,\n RendererInterface,\n SourceLocation,\n} from './types.js';\nimport { noopLogger, type Logger } from './logger.js';\nimport { ConnectionError, TimeoutError } from './errors.js';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// CONSTANTS\n// ═══════════════════════════════════════════════════════════════════════════\n\n// DevTools element type constants (from react-devtools-shared)\nconst ELEMENT_TYPE_MAP: Record<number, ElementType> = {\n 1: 'class',\n 2: 'context',\n 5: 'function',\n 6: 'forward_ref',\n 7: 'fragment',\n 8: 'host',\n 9: 'memo',\n 10: 'portal',\n 11: 'root',\n 12: 'profiler',\n 13: 'suspense',\n 14: 'lazy',\n 15: 'cache',\n 16: 'activity',\n 17: 'virtual',\n};\n\n// Tree operation codes\nconst TREE_OP = {\n ADD: 1,\n REMOVE: 2,\n REORDER: 3,\n UPDATE_TREE_BASE_DURATION: 4,\n UPDATE_ERRORS_OR_WARNINGS: 5,\n} as const;\n\n// Default configuration\nconst DEFAULT_CONFIG: ConnectionConfig = {\n host: 'localhost',\n port: 8097,\n timeout: 5000,\n autoReconnect: true,\n};\n\n// Reconnection settings\nconst RECONNECT = {\n MAX_ATTEMPTS: 5,\n BASE_DELAY: 1000,\n MAX_DELAY: 30000,\n} as const;\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TYPES\n// ═══════════════════════════════════════════════════════════════════════════\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n createdAt: number;\n operation: string;\n}\n\n// Default protocol capabilities (Phase 2.2)\nconst DEFAULT_CAPABILITIES: ProtocolCapabilities = {\n bridgeProtocolVersion: 2,\n backendVersion: null,\n supportsInspectElementPaths: false,\n supportsProfilingChangeDescriptions: false,\n supportsTimeline: false,\n supportsNativeStyleEditor: false,\n supportsErrorBoundaryTesting: false,\n supportsTraceUpdates: false,\n isBackendStorageAPISupported: false,\n isSynchronousXHRSupported: false,\n};\n\nexport interface BridgeOptions extends Partial<ConnectionConfig> {\n logger?: Logger;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// BRIDGE CLASS\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport class DevToolsBridge extends EventEmitter {\n private config: ConnectionConfig;\n private logger: Logger;\n private ws: WebSocket | null = null;\n private state: ConnectionState = 'disconnected';\n private error: string | null = null;\n\n // Connection management (Phase 1.2: Race condition fix)\n private connectPromise: Promise<ConnectionStatus> | null = null;\n\n // Reconnection state (Phase 1.3: Auto-reconnection)\n private reconnectAttempts = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private manualDisconnect = false;\n\n // Component tree state\n private elements: Map<number, Element> = new Map();\n private rootIDs: Set<number> = new Set();\n private renderers: Map<number, Renderer> = new Map();\n private elementToRenderer: Map<number, number> = new Map(); // Phase 2.3: Element-to-renderer mapping\n\n // Request tracking (Phase 1.5 & 1.6: Memory leak fix + ID correlation)\n private pendingRequests: Map<string, PendingRequest> = new Map();\n private requestIdCounter = 0;\n private staleRequestCleanupTimer: NodeJS.Timeout | null = null;\n /**\n * Unified fallback key mapping for request/response correlation.\n * Maps element-based keys to requestID-based keys.\n *\n * Flow:\n * 1. Request sent with requestID=123 for elementID=456\n * 2. Store mapping: \"inspect_456\" -> \"inspect_123\"\n * 3. Response arrives with responseID=123 OR just id=456\n * 4. Try \"inspect_123\" first, fall back to mapping[\"inspect_456\"]\n * 5. Clean up mapping after resolving\n *\n * Needed because some React DevTools backends don't echo responseID reliably.\n */\n private responseFallbackKeys: Map<string, string> = new Map();\n\n // Errors/warnings state\n private elementErrors: Map<number, Array<[string, number]>> = new Map();\n private elementWarnings: Map<number, Array<[string, number]>> = new Map();\n\n // Profiling state\n private isProfiling = false;\n private profilingData: ProfilingData | null = null;\n\n // Protocol info (Phase 2.2)\n private backendVersion: string | null = null;\n private capabilities: ProtocolCapabilities = { ...DEFAULT_CAPABILITIES };\n private capabilitiesNegotiated = false;\n private lastMessageAt = 0;\n\n // Native inspection state (Phase 2.1)\n private isInspectingNative = false;\n\n // External communication (for headless server integration)\n private externalSendFn: ((event: string, payload: unknown) => void) | null = null;\n private isExternallyAttached = false;\n\n constructor(options: BridgeOptions = {}) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...options };\n this.logger = options.logger ?? noopLogger;\n }\n\n /**\n * Attach to an external message source (e.g., HeadlessDevToolsServer).\n * When attached, the bridge receives messages from the external source\n * instead of connecting via WebSocket.\n */\n attachToExternal(\n sendFn: (event: string, payload: unknown) => void,\n onDetach?: () => void\n ): { receiveMessage: (data: string) => void; detach: () => void } {\n this.logger.info('Attaching to external message source');\n this.externalSendFn = sendFn;\n this.isExternallyAttached = true;\n\n // Mark as connected\n this.setState('connected');\n this.error = null;\n this.lastMessageAt = Date.now();\n this.startStaleRequestCleanup();\n\n // Send initial handshake\n this.send('bridge', { version: 2 });\n this.negotiateCapabilities();\n this.emit('connected');\n\n return {\n receiveMessage: (data: string) => {\n this.handleMessage(data);\n },\n detach: () => {\n this.logger.info('Detaching from external message source');\n this.externalSendFn = null;\n this.isExternallyAttached = false;\n this.setState('disconnected');\n this.reset();\n onDetach?.();\n },\n };\n }\n\n /**\n * Check if bridge is attached to an external source\n */\n isAttachedExternally(): boolean {\n return this.isExternallyAttached;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // CONNECTION MANAGEMENT\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Connect to DevTools backend.\n * Handles deduplication of concurrent connect calls (Phase 1.2).\n */\n async connect(): Promise<ConnectionStatus> {\n // Already attached externally - no WebSocket connection needed\n if (this.isExternallyAttached) {\n this.logger.debug('Already attached externally, skipping WebSocket connect');\n return this.getStatus();\n }\n\n // Return existing connection attempt (Phase 1.2: Deduplicate)\n if (this.connectPromise) {\n this.logger.debug('Returning existing connection attempt');\n return this.connectPromise;\n }\n\n // Already connected\n if (this.state === 'connected' && this.ws?.readyState === WebSocket.OPEN) {\n this.logger.debug('Already connected');\n return this.getStatus();\n }\n\n // Clean up stale connection\n if (this.ws) {\n this.logger.debug('Cleaning up stale WebSocket');\n this.ws.removeAllListeners();\n this.ws.close();\n this.ws = null;\n }\n\n this.manualDisconnect = false;\n this.connectPromise = this.doConnect();\n\n try {\n return await this.connectPromise;\n } finally {\n this.connectPromise = null;\n }\n }\n\n /**\n * Internal connection logic\n */\n private async doConnect(): Promise<ConnectionStatus> {\n this.setState('connecting');\n const url = `ws://${this.config.host}:${this.config.port}`;\n this.logger.info('Connecting to DevTools', { url });\n\n return new Promise((resolve, reject) => {\n const connectionTimeout = setTimeout(() => {\n this.logger.error('Connection timeout', { url, timeout: this.config.timeout });\n this.ws?.close();\n this.setError('Connection timeout');\n reject(new ConnectionError('Connection timeout', { url, timeout: this.config.timeout }));\n }, this.config.timeout);\n\n try {\n this.ws = new WebSocket(url);\n\n this.ws.on('open', () => {\n clearTimeout(connectionTimeout);\n this.logger.info('Connected to DevTools');\n this.onConnected();\n resolve(this.getStatus());\n });\n\n this.ws.on('message', (data) => {\n this.handleMessage(data.toString());\n });\n\n this.ws.on('close', (code, reason) => {\n this.handleClose(code, reason.toString());\n });\n\n this.ws.on('error', (err) => {\n clearTimeout(connectionTimeout);\n this.logger.error('WebSocket error', { error: err.message });\n this.setError(err.message);\n reject(new ConnectionError(err.message));\n });\n } catch (err) {\n clearTimeout(connectionTimeout);\n const message = err instanceof Error ? err.message : 'Unknown error';\n this.logger.error('Connection failed', { error: message });\n this.setError(message);\n reject(new ConnectionError(message));\n }\n });\n }\n\n /**\n * Called when connection is established\n */\n private onConnected(): void {\n this.setState('connected');\n this.error = null;\n this.reconnectAttempts = 0;\n this.lastMessageAt = Date.now();\n\n // Cancel any pending reconnection\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Start stale request cleanup (Phase 1.5)\n this.startStaleRequestCleanup();\n\n // Send initial handshake\n this.send('bridge', { version: 2 });\n\n // Request protocol capabilities (Phase 2.2)\n this.negotiateCapabilities();\n\n this.emit('connected');\n }\n\n /**\n * Negotiate protocol capabilities with backend (Phase 2.2)\n */\n private negotiateCapabilities(): void {\n this.logger.debug('Negotiating protocol capabilities');\n\n // Request capability detection from backend\n this.send('isBackendStorageAPISupported', {});\n this.send('isSynchronousXHRSupported', {});\n this.send('getSupportedRendererInterfaces', {});\n }\n\n /**\n * Handle WebSocket close event\n */\n private handleClose(code: number, reason: string): void {\n this.logger.info('Connection closed', { code, reason });\n this.setState('disconnected');\n this.emit('disconnected', { code, reason });\n\n // Stop stale request cleanup\n this.stopStaleRequestCleanup();\n\n // Reject all pending requests\n for (const [, req] of this.pendingRequests) {\n clearTimeout(req.timeout);\n req.reject(new ConnectionError('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Auto-reconnect on abnormal closure (Phase 1.3)\n if (!this.manualDisconnect && this.config.autoReconnect && code !== 1000 && code !== 1001) {\n this.scheduleReconnect();\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff (Phase 1.3)\n */\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= RECONNECT.MAX_ATTEMPTS) {\n this.logger.error('Max reconnection attempts reached', { attempts: this.reconnectAttempts });\n this.emit('reconnectFailed', { attempts: this.reconnectAttempts });\n return;\n }\n\n // Exponential backoff with jitter\n const delay = Math.min(\n RECONNECT.BASE_DELAY * Math.pow(2, this.reconnectAttempts) + Math.random() * 1000,\n RECONNECT.MAX_DELAY\n );\n\n this.reconnectAttempts++;\n this.logger.info('Scheduling reconnection', { attempt: this.reconnectAttempts, delay });\n this.emit('reconnecting', { attempt: this.reconnectAttempts, delay });\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((err) => {\n this.logger.warn('Reconnection failed', { error: err.message });\n // Will trigger another scheduleReconnect via handleClose\n });\n }, delay);\n }\n\n /**\n * Disconnect from DevTools backend\n */\n disconnect(): void {\n this.logger.info('Disconnecting');\n this.manualDisconnect = true;\n\n // Cancel any pending reconnection\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n\n this.setState('disconnected');\n this.reset();\n }\n\n /**\n * Get current connection status\n */\n getStatus(): ConnectionStatus {\n return {\n state: this.state,\n rendererCount: this.renderers.size,\n reactVersion: this.backendVersion,\n error: this.error,\n };\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n // Check for external attachment or direct WebSocket connection\n if (this.isExternallyAttached) {\n return this.state === 'connected';\n }\n return this.state === 'connected' && this.ws?.readyState === WebSocket.OPEN;\n }\n\n private setState(state: ConnectionState): void {\n this.state = state;\n this.emit('stateChange', state);\n }\n\n private setError(message: string): void {\n this.error = message;\n this.setState('error');\n }\n\n private reset(): void {\n this.elements.clear();\n this.rootIDs.clear();\n this.renderers.clear();\n this.elementToRenderer.clear();\n this.elementErrors.clear();\n this.elementWarnings.clear();\n this.isProfiling = false;\n this.profilingData = null;\n this.isInspectingNative = false;\n this.capabilities = { ...DEFAULT_CAPABILITIES };\n this.capabilitiesNegotiated = false;\n this.stopStaleRequestCleanup();\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // REQUEST MANAGEMENT (Phase 1.5 & 1.6)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Generate unique request ID (Phase 1.6)\n */\n private nextRequestId(): number {\n return ++this.requestIdCounter;\n }\n\n /**\n * Create a pending request with proper cleanup (Phase 1.5)\n */\n private createPending(key: string, operation: string, timeout?: number): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n const req = this.pendingRequests.get(key);\n if (req) {\n clearTimeout(req.timeout);\n this.pendingRequests.delete(key);\n }\n };\n\n const timeoutMs = timeout ?? this.config.timeout;\n const timeoutId = setTimeout(() => {\n this.logger.warn('Request timeout', { key, operation, timeout: timeoutMs });\n cleanup();\n reject(new TimeoutError(operation, timeoutMs, { key }));\n }, timeoutMs);\n\n this.pendingRequests.set(key, {\n resolve: (value: unknown) => {\n cleanup();\n resolve(value);\n },\n reject: (error: Error) => {\n cleanup();\n reject(error);\n },\n timeout: timeoutId,\n createdAt: Date.now(),\n operation,\n });\n });\n }\n\n /**\n * Resolve a pending request\n */\n private resolvePending(key: string, value: unknown): void {\n const pending = this.pendingRequests.get(key);\n if (pending) {\n this.logger.debug('Resolving request', { key, operation: pending.operation });\n pending.resolve(value);\n }\n }\n\n /**\n * Resolve a correlated request using responseID/requestID/fallback pattern.\n * Handles the common pattern of: responseID -> requestID -> element ID fallback.\n *\n * @param prefix - Key prefix (e.g., 'inspect', 'owners', 'nativeStyle')\n * @param payload - Response payload with optional responseID, requestID, and id\n * @param result - Value to resolve the promise with\n */\n private resolveCorrelatedRequest(\n prefix: string,\n payload: { id?: number; responseID?: number; requestID?: number },\n result: unknown\n ): void {\n // Priority: responseID (official) -> requestID (legacy) -> element id (fallback)\n let key: string;\n\n if (payload.responseID !== undefined) {\n key = `${prefix}_${payload.responseID}`;\n } else if (payload.requestID !== undefined) {\n key = `${prefix}_${payload.requestID}`;\n } else {\n key = `${prefix}_${payload.id ?? 'unknown'}`;\n }\n\n // If key not found directly, check fallback mapping\n if (!this.pendingRequests.has(key) && payload.id !== undefined) {\n const fallbackKey = `${prefix}_${payload.id}`;\n const primaryKey = this.responseFallbackKeys.get(fallbackKey);\n if (primaryKey && this.pendingRequests.has(primaryKey)) {\n key = primaryKey;\n }\n this.responseFallbackKeys.delete(fallbackKey);\n } else if (payload.id !== undefined) {\n // Clean up fallback mapping if we matched directly\n this.responseFallbackKeys.delete(`${prefix}_${payload.id}`);\n }\n\n this.resolvePending(key, result);\n }\n\n /**\n * Store a fallback key mapping for request correlation.\n * Call this when sending a request that uses requestID.\n *\n * @param prefix - Key prefix (e.g., 'inspect', 'owners')\n * @param requestID - The requestID being sent\n * @param elementID - The element ID (used as fallback key)\n */\n private storeFallbackKey(prefix: string, requestID: number, elementID: number): void {\n const fallbackKey = `${prefix}_${elementID}`;\n const primaryKey = `${prefix}_${requestID}`;\n this.responseFallbackKeys.set(fallbackKey, primaryKey);\n }\n\n /**\n * Start periodic cleanup of stale requests (Phase 1.5)\n */\n private startStaleRequestCleanup(): void {\n this.staleRequestCleanupTimer = setInterval(() => {\n const now = Date.now();\n const maxAge = this.config.timeout * 2;\n\n for (const [key, req] of this.pendingRequests) {\n const age = now - req.createdAt;\n if (age > maxAge) {\n this.logger.warn('Cleaning stale request', { key, operation: req.operation, age });\n clearTimeout(req.timeout);\n this.pendingRequests.delete(key);\n req.reject(new TimeoutError(req.operation, age, { key, stale: true }));\n }\n }\n }, 60000); // Every minute\n }\n\n /**\n * Stop stale request cleanup\n */\n private stopStaleRequestCleanup(): void {\n if (this.staleRequestCleanupTimer) {\n clearInterval(this.staleRequestCleanupTimer);\n this.staleRequestCleanupTimer = null;\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // MESSAGE HANDLING\n // ═══════════════════════════════════════════════════════════════════════════\n\n private send(event: string, payload?: unknown): void {\n // Use external send function if attached externally\n if (this.isExternallyAttached && this.externalSendFn) {\n this.logger.debug('Sending message via external', { event });\n this.externalSendFn(event, payload);\n return;\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new ConnectionError('Not connected');\n }\n\n const message = JSON.stringify({ event, payload });\n this.logger.debug('Sending message', { event, payloadSize: message.length });\n this.ws.send(message);\n }\n\n private handleMessage(data: string): void {\n this.lastMessageAt = Date.now();\n\n // Phase 1.1: Don't swallow parse errors\n let parsed: { event?: string; payload?: unknown };\n try {\n parsed = JSON.parse(data);\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Unknown parse error';\n this.logger.error('Failed to parse message', { error, dataPreview: data.substring(0, 100) });\n this.emit('parseError', { data: data.substring(0, 100), error });\n return;\n }\n\n const { event, payload } = parsed;\n\n if (!event) {\n this.logger.warn('Message missing event field', { dataPreview: data.substring(0, 100) });\n return;\n }\n\n this.logger.debug('Received message', { event });\n\n switch (event) {\n case 'operations':\n this.handleOperations(payload as number[]);\n break;\n\n case 'inspectedElement':\n this.handleInspectedElement(payload as InspectElementPayload & { requestID?: number; id?: number });\n break;\n\n case 'ownersList':\n this.handleOwnersList(payload as { id: number; requestID?: number; owners: SerializedElement[] });\n break;\n\n case 'profilingData':\n this.handleProfilingData(payload as ProfilingData);\n break;\n\n case 'profilingStatus':\n this.handleProfilingStatus(payload as { isProfiling: boolean });\n break;\n\n case 'backendVersion':\n this.backendVersion = payload as string;\n this.logger.info('Backend version', { version: this.backendVersion });\n break;\n\n case 'bridge':\n case 'bridgeProtocol':\n this.logger.debug('Bridge protocol', { payload });\n break;\n\n case 'renderer':\n this.handleRenderer(payload as { id: number; rendererPackageName: string; rendererVersion: string });\n break;\n\n case 'unsupportedRendererVersion':\n this.logger.error('Unsupported React version', { version: payload });\n this.setError(`Unsupported React version: ${payload}`);\n break;\n\n case 'shutdown':\n this.logger.info('Backend shutdown received');\n this.disconnect();\n break;\n\n case 'NativeStyleEditor_styleAndLayout':\n this.handleNativeStyleResponse(payload as { id: number; responseID?: number; style: Record<string, unknown>; layout: { x: number; y: number; width: number; height: number } });\n break;\n\n // ═══════════════════════════════════════════════════════════════════════\n // Phase 2.1: Additional Message Handlers\n // ═══════════════════════════════════════════════════════════════════════\n\n case 'isBackendStorageAPISupported':\n this.handleStorageSupport(payload as { isSupported: boolean });\n break;\n\n case 'isSynchronousXHRSupported':\n this.handleXHRSupport(payload as { isSupported: boolean });\n break;\n\n case 'getSupportedRendererInterfaces':\n this.handleRendererInterfaces(payload as { rendererInterfaces: RendererInterface[] });\n break;\n\n case 'updateComponentFilters':\n this.logger.debug('Component filters updated');\n this.emit('filtersUpdated');\n break;\n\n case 'savedToClipboard':\n this.logger.debug('Content saved to clipboard');\n this.handleClipboardResponse(payload as { responseID?: number });\n break;\n\n case 'viewAttributeSourceResult':\n this.handleAttributeSourceResult(payload as { id?: number; responseID?: number; source: SourceLocation | null });\n break;\n\n case 'overrideContextResult':\n this.handleOverrideContextResponse(payload as { id?: number; responseID?: number; success: boolean });\n break;\n\n case 'inspectingNativeStarted':\n this.isInspectingNative = true;\n this.logger.info('Native inspection started');\n this.emit('inspectingNativeStarted');\n break;\n\n case 'inspectingNativeStopped':\n this.isInspectingNative = false;\n this.handleInspectingNativeStopped(payload as { elementID: number | null });\n break;\n\n case 'captureScreenshotResult':\n this.handleScreenshotResponse(payload as { id?: number; responseID?: number; screenshot: string | null });\n break;\n\n default:\n this.logger.debug('Unknown message type', { event });\n this.emit('unknown', { event, payload });\n }\n }\n\n private handleRenderer(payload: { id: number; rendererPackageName: string; rendererVersion: string }): void {\n // Phase 2.3: Enhanced renderer tracking\n const renderer: Renderer = {\n id: payload.id,\n version: payload.rendererVersion,\n packageName: payload.rendererPackageName,\n rootIDs: new Set(),\n elementIDs: new Set(),\n };\n this.renderers.set(payload.id, renderer);\n this.logger.info('Renderer connected', { id: payload.id, version: payload.rendererVersion });\n this.emit('renderer', { id: payload.id, rendererVersion: payload.rendererVersion });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Phase 2.1: Capability Detection Handlers\n // ═══════════════════════════════════════════════════════════════════════════\n\n private handleStorageSupport(payload: { isSupported: boolean }): void {\n this.capabilities.isBackendStorageAPISupported = payload.isSupported;\n this.logger.debug('Storage API support', { isSupported: payload.isSupported });\n this.checkCapabilitiesComplete();\n }\n\n private handleXHRSupport(payload: { isSupported: boolean }): void {\n this.capabilities.isSynchronousXHRSupported = payload.isSupported;\n this.logger.debug('Synchronous XHR support', { isSupported: payload.isSupported });\n this.checkCapabilitiesComplete();\n }\n\n private handleRendererInterfaces(payload: { rendererInterfaces: RendererInterface[] }): void {\n this.logger.debug('Renderer interfaces received', { count: payload.rendererInterfaces?.length ?? 0 });\n\n if (payload.rendererInterfaces) {\n for (const iface of payload.rendererInterfaces) {\n // Update renderer with interface info\n const renderer = this.renderers.get(iface.id);\n if (renderer) {\n renderer.version = iface.version;\n renderer.packageName = iface.renderer;\n }\n\n // Infer capabilities from renderer version\n const versionNum = parseFloat(iface.version);\n if (versionNum >= 18) {\n this.capabilities.supportsProfilingChangeDescriptions = true;\n this.capabilities.supportsTimeline = true;\n this.capabilities.supportsErrorBoundaryTesting = true;\n }\n }\n }\n\n this.checkCapabilitiesComplete();\n }\n\n private checkCapabilitiesComplete(): void {\n // Mark as negotiated once we have basic capability info\n if (!this.capabilitiesNegotiated) {\n this.capabilitiesNegotiated = true;\n this.logger.info('Protocol capabilities negotiated', { capabilities: this.capabilities });\n this.emit('capabilitiesNegotiated', this.capabilities);\n }\n }\n\n private handleAttributeSourceResult(payload: { id?: number; responseID?: number; source: SourceLocation | null }): void {\n this.resolveCorrelatedRequest('attributeSource', payload, payload.source);\n if (payload.source) {\n this.emit('attributeSource', payload.source);\n }\n }\n\n private handleInspectingNativeStopped(payload: { elementID: number | null }): void {\n this.logger.info('Native inspection stopped', { elementID: payload.elementID });\n this.resolvePending('inspectNative', payload.elementID);\n this.emit('inspectingNativeStopped', payload.elementID);\n }\n\n private handleNativeStyleResponse(payload: { id: number; responseID?: number; style: Record<string, unknown>; layout: { x: number; y: number; width: number; height: number } }): void {\n this.resolveCorrelatedRequest('nativeStyle', payload, { style: payload.style, layout: payload.layout });\n }\n\n private handleClipboardResponse(payload: { responseID?: number }): void {\n // Clipboard is special - no element ID. If no responseID, find any pending clipboard request.\n if (payload.responseID !== undefined) {\n this.resolvePending(`clipboard_${payload.responseID}`, { success: true });\n } else {\n // Fallback: find any pending clipboard request\n for (const pendingKey of this.pendingRequests.keys()) {\n if (pendingKey.startsWith('clipboard_')) {\n this.resolvePending(pendingKey, { success: true });\n break;\n }\n }\n }\n }\n\n private handleOverrideContextResponse(payload: { id?: number; responseID?: number; success: boolean }): void {\n this.resolveCorrelatedRequest('overrideContext', payload, payload);\n }\n\n private handleScreenshotResponse(payload: { id?: number; responseID?: number; screenshot: string | null }): void {\n this.resolveCorrelatedRequest('screenshot', payload, payload);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // OPERATIONS PARSING (Phase 1.4: Bounds Checking)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Decode UTF-8 string from operations array\n * Based on react-devtools-shared/src/utils.js utfDecodeStringWithRanges\n */\n private utfDecodeString(operations: number[], start: number, end: number): string {\n let result = '';\n for (let i = start; i <= end; i++) {\n const charCode = operations[i];\n if (typeof charCode === 'number' && charCode >= 0 && charCode <= 0x10FFFF) {\n result += String.fromCodePoint(charCode);\n }\n }\n return result;\n }\n\n private handleOperations(operations: number[]): void {\n if (!Array.isArray(operations)) {\n this.logger.warn('Invalid operations: not an array');\n return;\n }\n\n if (operations.length < 3) {\n this.logger.debug('Empty operations array');\n return;\n }\n\n const rendererID = operations[0];\n const rootID = operations[1];\n\n // Track root\n if (rootID !== 0) {\n this.rootIDs.add(rootID);\n }\n\n // Parse string table (index 2 onwards)\n // Format: [stringTableSize, [len1, ...chars1], [len2, ...chars2], ...]\n let i = 2;\n const stringTableSize = operations[i];\n i++;\n\n // Build string table (index 0 = null)\n const stringTable: Array<string | null> = [null];\n const stringTableEnd = i + stringTableSize;\n\n while (i < stringTableEnd && i < operations.length) {\n const strLength = operations[i];\n i++;\n\n if (strLength > 0 && i + strLength - 1 < operations.length) {\n const str = this.utfDecodeString(operations, i, i + strLength - 1);\n stringTable.push(str);\n i += strLength;\n } else {\n stringTable.push('');\n }\n }\n\n this.logger.debug('Parsed string table', {\n rendererID,\n rootID,\n stringCount: stringTable.length - 1,\n strings: stringTable.slice(1),\n operationsStart: i\n });\n\n // Now parse actual operations (starting at stringTableEnd)\n while (i < operations.length) {\n const op = operations[i];\n\n // Bounds check: need at least the operation code\n if (typeof op !== 'number') {\n this.logger.warn('Invalid operation code', { index: i, value: op });\n break;\n }\n\n switch (op) {\n case TREE_OP.ADD:\n i = this.processAddOperation(operations, i + 1, rendererID, stringTable);\n break;\n\n case TREE_OP.REMOVE:\n i = this.processRemoveOperation(operations, i + 1);\n break;\n\n case TREE_OP.REORDER:\n i = this.processReorderOperation(operations, i + 1);\n break;\n\n case TREE_OP.UPDATE_TREE_BASE_DURATION:\n // Skip: id + baseDuration\n i += 3;\n break;\n\n case TREE_OP.UPDATE_ERRORS_OR_WARNINGS:\n i = this.processErrorsWarningsOperation(operations, i + 1);\n break;\n\n default:\n this.logger.warn('Unknown operation code', { code: op, index: i });\n i++;\n }\n\n // Safety check: ensure we're making progress\n if (i <= 0) {\n this.logger.error('Operations parser stuck', { index: i });\n break;\n }\n }\n\n this.emit('operationsComplete');\n }\n\n /**\n * Process ADD operation with string table lookup\n * Based on react-devtools-shared/src/devtools/store.js onBridgeOperations\n *\n * Root format: [id, type=11, isStrictModeCompliant, profilerFlags, supportsStrictMode, hasOwnerMetadata]\n * Non-root format: [id, type, parentID, ownerID, displayNameStringID, keyStringID, namePropStringID]\n */\n private processAddOperation(ops: number[], i: number, rendererID: number, stringTable: Array<string | null>): number {\n // Need at least id and type\n if (i + 2 > ops.length) {\n this.logger.warn('ADD operation: insufficient data for id/type', { index: i, available: ops.length - i });\n return ops.length;\n }\n\n const id = ops[i++];\n const type = ops[i++];\n\n // ElementTypeRoot (11) has special format\n if (type === 11) { // ElementTypeRoot\n // Root format: [isStrictModeCompliant, profilerFlags, supportsStrictMode, hasOwnerMetadata]\n // Need at least 4 more fields for root\n if (i + 4 > ops.length) {\n this.logger.warn('ADD root: insufficient data', { index: i, available: ops.length - i, needed: 4 });\n return ops.length;\n }\n\n const isStrictModeCompliant = ops[i++] > 0;\n const profilerFlags = ops[i++];\n const supportsStrictMode = ops[i++] > 0;\n const hasOwnerMetadata = ops[i++] > 0;\n\n const element: Element = {\n id,\n parentID: null,\n displayName: 'Root',\n type: 'root',\n key: null,\n depth: 0,\n weight: 1,\n ownerID: null,\n hasChildren: false,\n env: null,\n hocDisplayNames: null,\n };\n\n this.rootIDs.add(id);\n this.elements.set(id, element);\n this.elementToRenderer.set(id, rendererID);\n\n const renderer = this.renderers.get(rendererID);\n if (renderer) {\n renderer.rootIDs.add(id);\n renderer.elementIDs.add(id);\n }\n\n this.logger.debug('Added root element', {\n id,\n rendererID,\n isStrictModeCompliant,\n profilerFlags,\n supportsStrictMode,\n hasOwnerMetadata\n });\n this.emit('elementAdded', element);\n return i;\n }\n\n // Non-root elements: [parentID, ownerID, displayNameStringID, keyStringID, namePropStringID]\n // Need 5 more fields\n if (i + 5 > ops.length) {\n this.logger.warn('ADD operation: insufficient data', { index: i, available: ops.length - i, needed: 5 });\n return ops.length;\n }\n\n const parentID = ops[i++];\n const ownerID = ops[i++];\n const displayNameStringID = ops[i++];\n const keyStringID = ops[i++];\n i++; // Skip namePropStringID - used for server components, not tracked yet\n\n // Look up strings from string table (index 0 = null)\n const displayName = (displayNameStringID > 0 && displayNameStringID < stringTable.length)\n ? (stringTable[displayNameStringID] ?? 'Unknown')\n : 'Unknown';\n const key = (keyStringID > 0 && keyStringID < stringTable.length)\n ? stringTable[keyStringID]\n : null;\n\n const element: Element = {\n id,\n parentID: parentID === 0 ? null : parentID,\n displayName,\n type: ELEMENT_TYPE_MAP[type] ?? 'function',\n key,\n depth: 0,\n weight: 1,\n ownerID: ownerID === 0 ? null : ownerID,\n hasChildren: false,\n env: null,\n hocDisplayNames: null,\n };\n\n // Calculate depth from parent\n if (element.parentID !== null) {\n const parent = this.elements.get(element.parentID);\n if (parent) {\n element.depth = parent.depth + 1;\n parent.hasChildren = true;\n }\n }\n\n this.elements.set(id, element);\n this.elementToRenderer.set(id, rendererID);\n\n const renderer = this.renderers.get(rendererID);\n if (renderer) {\n renderer.elementIDs.add(id);\n }\n\n this.logger.debug('Added element', { id, displayName, type: element.type, parentID });\n this.emit('elementAdded', element);\n\n return i;\n }\n\n /**\n * Process REMOVE operation with bounds checking\n */\n private processRemoveOperation(ops: number[], i: number): number {\n if (i >= ops.length) {\n this.logger.warn('REMOVE operation: missing count');\n return ops.length;\n }\n\n const count = ops[i++];\n\n if (count < 0 || count > 100000) {\n this.logger.warn('REMOVE operation: invalid count', { count });\n return ops.length;\n }\n\n if (i + count > ops.length) {\n this.logger.warn('REMOVE operation: not enough IDs', { count, available: ops.length - i });\n return ops.length;\n }\n\n for (let j = 0; j < count; j++) {\n const id = ops[i++];\n const element = this.elements.get(id);\n\n if (element) {\n // Phase 2.3: Clean up renderer tracking\n const rendererID = this.elementToRenderer.get(id);\n if (rendererID !== undefined) {\n const renderer = this.renderers.get(rendererID);\n if (renderer) {\n renderer.elementIDs.delete(id);\n renderer.rootIDs.delete(id);\n }\n this.elementToRenderer.delete(id);\n }\n\n this.elements.delete(id);\n this.rootIDs.delete(id);\n this.elementErrors.delete(id);\n this.elementWarnings.delete(id);\n this.emit('elementRemoved', element);\n }\n }\n\n return i;\n }\n\n /**\n * Process REORDER operation with bounds checking\n */\n private processReorderOperation(ops: number[], i: number): number {\n if (i + 1 >= ops.length) {\n this.logger.warn('REORDER operation: insufficient data');\n return ops.length;\n }\n\n const id = ops[i++];\n const childCount = ops[i++];\n\n if (childCount < 0 || childCount > 100000) {\n this.logger.warn('REORDER operation: invalid childCount', { childCount });\n return ops.length;\n }\n\n if (i + childCount > ops.length) {\n this.logger.warn('REORDER operation: not enough child IDs', { childCount, available: ops.length - i });\n return ops.length;\n }\n\n // Skip child IDs (reorder doesn't change our flat map)\n i += childCount;\n this.emit('elementReordered', { id, childCount });\n\n return i;\n }\n\n /**\n * Process ERRORS/WARNINGS operation with bounds checking\n */\n private processErrorsWarningsOperation(ops: number[], i: number): number {\n if (i + 2 >= ops.length) {\n this.logger.warn('ERRORS_WARNINGS operation: insufficient data');\n return ops.length;\n }\n\n const id = ops[i++];\n const errorCount = ops[i++];\n const warningCount = ops[i++];\n\n if (errorCount > 0) {\n this.elementErrors.set(id, []);\n } else {\n this.elementErrors.delete(id);\n }\n\n if (warningCount > 0) {\n this.elementWarnings.set(id, []);\n } else {\n this.elementWarnings.delete(id);\n }\n\n return i;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // RESPONSE HANDLERS (Phase 1.6: ID Correlation)\n // ═══════════════════════════════════════════════════════════════════════════\n\n private handleInspectedElement(payload: InspectElementPayload & { responseID?: number; requestID?: number; id?: number }): void {\n this.resolveCorrelatedRequest('inspect', payload, payload);\n }\n\n private handleOwnersList(payload: { id: number; responseID?: number; requestID?: number; owners: SerializedElement[] }): void {\n this.resolveCorrelatedRequest('owners', payload, payload.owners);\n }\n\n private handleProfilingData(payload: ProfilingData): void {\n this.profilingData = payload;\n this.resolvePending('profilingData', payload);\n }\n\n private handleProfilingStatus(payload: { isProfiling: boolean }): void {\n this.isProfiling = payload.isProfiling;\n this.resolvePending('profilingStatus', payload);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PUBLIC API\n // ═══════════════════════════════════════════════════════════════════════════\n\n getComponentTree(rootID?: number, maxDepth?: number): RootTree[] {\n const result: RootTree[] = [];\n const rootsToProcess = rootID ? [rootID] : Array.from(this.rootIDs);\n\n for (const rid of rootsToProcess) {\n const root = this.elements.get(rid);\n if (!root) continue;\n\n const elements: Element[] = [];\n const collectElements = (id: number, depth: number) => {\n const el = this.elements.get(id);\n if (!el) return;\n if (maxDepth !== undefined && depth > maxDepth) return;\n\n elements.push(el);\n\n // Find children\n for (const [, child] of this.elements) {\n if (child.parentID === id) {\n collectElements(child.id, depth + 1);\n }\n }\n };\n\n collectElements(rid, 0);\n\n result.push({\n rootID: rid,\n displayName: root.displayName,\n elements,\n });\n }\n\n return result;\n }\n\n getElementById(id: number): Element | null {\n return this.elements.get(id) ?? null;\n }\n\n searchComponents(query: string, caseSensitive = false, isRegex = false): Element[] {\n const matches: Element[] = [];\n let pattern: RegExp | null = null;\n\n if (isRegex) {\n try {\n pattern = new RegExp(query, caseSensitive ? '' : 'i');\n } catch {\n this.logger.warn('Invalid regex pattern', { query });\n return [];\n }\n }\n\n const searchLower = caseSensitive ? query : query.toLowerCase();\n\n for (const [, element] of this.elements) {\n const name = caseSensitive ? element.displayName : element.displayName.toLowerCase();\n\n if (pattern) {\n if (pattern.test(element.displayName)) {\n matches.push(element);\n }\n } else if (name.includes(searchLower)) {\n matches.push(element);\n }\n }\n\n return matches;\n }\n\n /**\n * Inspect element with request ID correlation (Phase 1.6)\n */\n async inspectElement(id: number, paths?: Array<Array<string | number>>): Promise<InspectElementPayload> {\n this.ensureConnected();\n\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) {\n return { type: 'not-found', id };\n }\n\n const requestID = this.nextRequestId();\n // Create pending with requestID key, but also register element ID as fallback\n const primaryKey = `inspect_${requestID}`;\n const promise = this.createPending(primaryKey, `inspectElement(${id})`);\n\n // Store fallback mapping in case React doesn't echo responseID\n this.storeFallbackKey('inspect', requestID, id);\n\n this.send('inspectElement', {\n id,\n rendererID,\n requestID,\n forceFullData: true,\n path: paths?.[0] ?? null,\n });\n\n return promise as Promise<InspectElementPayload>;\n }\n\n /**\n * Get owners list with request ID correlation (Phase 1.6)\n */\n async getOwnersList(id: number): Promise<SerializedElement[]> {\n this.ensureConnected();\n\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) {\n return [];\n }\n\n const requestID = this.nextRequestId();\n const primaryKey = `owners_${requestID}`;\n const promise = this.createPending(primaryKey, `getOwnersList(${id})`);\n\n // Store fallback mapping in case React doesn't echo responseID\n this.storeFallbackKey('owners', requestID, id);\n\n this.send('getOwnersList', { id, rendererID, requestID });\n\n return promise as Promise<SerializedElement[]>;\n }\n\n highlightElement(id: number): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('highlightNativeElement', { id, rendererID });\n }\n\n clearHighlight(): void {\n if (this.isConnected()) {\n this.send('clearNativeElementHighlight', {});\n }\n }\n\n scrollToElement(id: number): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('scrollToNativeElement', { id, rendererID });\n }\n\n logToConsole(id: number): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('logElementToConsole', { id, rendererID });\n }\n\n storeAsGlobal(id: number, path: Array<string | number>, count: number): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('storeAsGlobal', { id, rendererID, path, count });\n }\n\n viewElementSource(id: number): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('viewElementSource', { id, rendererID });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // OVERRIDES\n // ═══════════════════════════════════════════════════════════════════════════\n\n overrideValueAtPath(\n target: OverrideTarget,\n id: number,\n path: Array<string | number>,\n value: unknown,\n hookIndex?: number\n ): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n\n this.send('overrideValueAtPath', {\n type: target,\n id,\n rendererID,\n path,\n value,\n hookID: hookIndex,\n });\n }\n\n deletePath(target: OverrideTarget, id: number, path: Array<string | number>, hookIndex?: number): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n\n this.send('deletePath', {\n type: target,\n id,\n rendererID,\n path,\n hookID: hookIndex,\n });\n }\n\n renamePath(\n target: OverrideTarget,\n id: number,\n path: Array<string | number>,\n oldKey: string,\n newKey: string,\n hookIndex?: number\n ): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n\n this.send('renamePath', {\n type: target,\n id,\n rendererID,\n path,\n oldKey,\n newKey,\n hookID: hookIndex,\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // ERROR / SUSPENSE\n // ═══════════════════════════════════════════════════════════════════════════\n\n overrideError(id: number, isErrored: boolean): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('overrideError', { id, rendererID, forceError: isErrored });\n }\n\n overrideSuspense(id: number, isSuspended: boolean): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('overrideSuspense', { id, rendererID, forceFallback: isSuspended });\n }\n\n clearErrorsAndWarnings(id?: number): void {\n this.ensureConnected();\n\n if (id !== undefined) {\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('clearErrorsForFiberID', { id, rendererID });\n } else {\n this.send('clearErrorsAndWarnings', {});\n }\n }\n\n getErrorsAndWarnings(): {\n errors: Map<number, Array<[string, number]>>;\n warnings: Map<number, Array<[string, number]>>;\n } {\n return {\n errors: new Map(this.elementErrors),\n warnings: new Map(this.elementWarnings),\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PROFILING\n // ═══════════════════════════════════════════════════════════════════════════\n\n startProfiling(recordTimeline = false, recordChangeDescriptions = true): void {\n this.ensureConnected();\n this.send('startProfiling', { recordTimeline, recordChangeDescriptions });\n this.isProfiling = true;\n this.logger.info('Profiling started', { recordTimeline, recordChangeDescriptions });\n }\n\n stopProfiling(): void {\n this.ensureConnected();\n this.send('stopProfiling', {});\n this.isProfiling = false;\n this.logger.info('Profiling stopped');\n }\n\n async getProfilingData(): Promise<ProfilingData | null> {\n if (!this.isProfiling && this.profilingData) {\n return this.profilingData;\n }\n\n this.ensureConnected();\n const promise = this.createPending('profilingData', 'getProfilingData');\n this.send('getProfilingData', {});\n return promise as Promise<ProfilingData>;\n }\n\n getProfilingStatus(): { isProfiling: boolean } {\n return { isProfiling: this.isProfiling };\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // FILTERS\n // ═══════════════════════════════════════════════════════════════════════════\n\n setComponentFilters(filters: ComponentFilter[]): void {\n this.ensureConnected();\n this.send('updateComponentFilters', { componentFilters: filters });\n }\n\n setTraceUpdatesEnabled(enabled: boolean): void {\n this.ensureConnected();\n this.send('setTraceUpdatesEnabled', { enabled });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // REACT NATIVE SPECIFIC\n // ═══════════════════════════════════════════════════════════════════════════\n\n async getNativeStyle(id: number): Promise<{\n style: Record<string, unknown> | null;\n layout: { x: number; y: number; width: number; height: number } | null;\n }> {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) {\n return { style: null, layout: null };\n }\n\n const requestID = this.nextRequestId();\n const primaryKey = `nativeStyle_${requestID}`;\n const promise = this.createPending(primaryKey, `getNativeStyle(${id})`);\n\n // Store fallback mapping in case backend doesn't echo responseID\n this.storeFallbackKey('nativeStyle', requestID, id);\n\n this.send('NativeStyleEditor_measure', { id, rendererID, requestID });\n return promise as Promise<{ style: Record<string, unknown>; layout: { x: number; y: number; width: number; height: number } }>;\n }\n\n setNativeStyle(id: number, property: string, value: unknown): void {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return;\n this.send('NativeStyleEditor_setValue', { id, rendererID, name: property, value });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PHASE 2.1: ADDITIONAL PUBLIC API\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Save content to clipboard\n */\n async saveToClipboard(value: string): Promise<{ success: boolean }> {\n this.ensureConnected();\n\n const requestID = this.nextRequestId();\n const primaryKey = `clipboard_${requestID}`;\n const promise = this.createPending(primaryKey, 'saveToClipboard');\n\n this.send('saveToClipboard', { value, requestID });\n\n // Timeout fallback - clipboard save doesn't always respond\n return Promise.race([\n promise as Promise<{ success: boolean }>,\n new Promise<{ success: boolean }>((resolve) =>\n setTimeout(() => resolve({ success: true }), 500)\n ),\n ]);\n }\n\n /**\n * View attribute source location\n */\n async viewAttributeSource(id: number, path: Array<string | number>): Promise<SourceLocation | null> {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return null;\n\n const requestID = this.nextRequestId();\n const primaryKey = `attributeSource_${requestID}`;\n const promise = this.createPending(primaryKey, `viewAttributeSource(${id})`);\n\n // Store fallback mapping\n this.storeFallbackKey('attributeSource', requestID, id);\n\n this.send('viewAttributeSource', { id, rendererID, path, requestID });\n return promise as Promise<SourceLocation | null>;\n }\n\n /**\n * Override context value\n */\n async overrideContext(id: number, path: Array<string | number>, value: unknown): Promise<boolean> {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return false;\n\n const requestID = this.nextRequestId();\n const primaryKey = `overrideContext_${requestID}`;\n const promise = this.createPending(primaryKey, `overrideContext(${id})`);\n\n // Store fallback mapping\n this.storeFallbackKey('overrideContext', requestID, id);\n\n this.send('overrideContext', { id, rendererID, path, value, requestID });\n\n try {\n const result = await promise as { success: boolean };\n return result.success;\n } catch {\n return false;\n }\n }\n\n /**\n * Start native element inspection mode\n */\n startInspectingNative(): void {\n this.ensureConnected();\n this.send('startInspectingNative', {});\n }\n\n /**\n * Stop native element inspection mode\n * @param selectNextElement - Whether to select the next element under pointer\n * @returns The ID of the selected element, or null\n */\n async stopInspectingNative(selectNextElement = true): Promise<number | null> {\n this.ensureConnected();\n const promise = this.createPending('inspectNative', 'stopInspectingNative');\n this.send('stopInspectingNative', { selectNextElement });\n return promise as Promise<number | null>;\n }\n\n /**\n * Check if currently in native inspection mode\n */\n isInspectingNativeMode(): boolean {\n return this.isInspectingNative;\n }\n\n /**\n * Capture screenshot of an element\n */\n async captureScreenshot(id: number): Promise<string | null> {\n this.ensureConnected();\n const rendererID = this.getRendererIDForElement(id);\n if (rendererID === null) return null;\n\n const requestID = this.nextRequestId();\n const primaryKey = `screenshot_${requestID}`;\n const promise = this.createPending(primaryKey, `captureScreenshot(${id})`);\n\n // Store fallback mapping\n this.storeFallbackKey('screenshot', requestID, id);\n\n this.send('captureScreenshot', { id, rendererID, requestID });\n\n try {\n const result = await promise as { screenshot: string | null };\n return result.screenshot;\n } catch {\n return null;\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PHASE 2.2: CAPABILITIES API\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get negotiated protocol capabilities\n */\n getCapabilities(): ProtocolCapabilities {\n return { ...this.capabilities };\n }\n\n /**\n * Check if capabilities have been negotiated\n */\n hasNegotiatedCapabilities(): boolean {\n return this.capabilitiesNegotiated;\n }\n\n /**\n * Wait for capabilities negotiation to complete\n */\n async waitForCapabilities(timeout = 5000): Promise<ProtocolCapabilities> {\n if (this.capabilitiesNegotiated) {\n return this.getCapabilities();\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.removeListener('capabilitiesNegotiated', handler);\n reject(new TimeoutError('waitForCapabilities', timeout));\n }, timeout);\n\n const handler = (capabilities: ProtocolCapabilities) => {\n clearTimeout(timer);\n resolve(capabilities);\n };\n\n this.once('capabilitiesNegotiated', handler);\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // PHASE 2.3: RENDERER MANAGEMENT API\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get all connected renderers\n */\n getRenderers(): Renderer[] {\n return Array.from(this.renderers.values()).map((r) => ({\n ...r,\n rootIDs: new Set(r.rootIDs),\n elementIDs: new Set(r.elementIDs),\n }));\n }\n\n /**\n * Get renderer by ID\n */\n getRenderer(id: number): Renderer | null {\n const renderer = this.renderers.get(id);\n if (!renderer) return null;\n return {\n ...renderer,\n rootIDs: new Set(renderer.rootIDs),\n elementIDs: new Set(renderer.elementIDs),\n };\n }\n\n /**\n * Get renderer for a specific element\n */\n getRendererForElement(elementID: number): Renderer | null {\n const rendererID = this.getRendererIDForElement(elementID);\n if (rendererID === null) return null;\n return this.getRenderer(rendererID);\n }\n\n /**\n * Get elements for a specific renderer\n */\n getElementsByRenderer(rendererID: number): Element[] {\n const renderer = this.renderers.get(rendererID);\n if (!renderer) return [];\n\n return Array.from(renderer.elementIDs)\n .map((id) => this.elements.get(id))\n .filter((el): el is Element => el !== undefined);\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // HELPERS\n // ═══════════════════════════════════════════════════════════════════════════\n\n private ensureConnected(): void {\n if (!this.isConnected()) {\n throw new ConnectionError('Not connected to DevTools');\n }\n }\n\n /**\n * Get renderer ID for an element (Phase 2.3: Multi-renderer support)\n */\n private getRendererIDForElement(id: number): number | null {\n // Element must exist in our element map\n if (!this.elements.has(id)) {\n return null;\n }\n\n // Check element-to-renderer mapping first\n const rendererID = this.elementToRenderer.get(id);\n if (rendererID !== undefined) {\n return rendererID;\n }\n\n // Fall back to finding renderer by searching all renderers' element sets\n for (const renderer of this.renderers.values()) {\n if (renderer.elementIDs.has(id) || renderer.rootIDs.has(id)) {\n return renderer.id;\n }\n }\n\n // Element exists but renderer not found - use first renderer or 1\n if (this.renderers.size === 0) {\n return 1;\n }\n return this.renderers.keys().next().value ?? 1;\n }\n\n /**\n * Get last message timestamp (for health monitoring)\n */\n getLastMessageTime(): number {\n return this.lastMessageAt;\n }\n\n /**\n * Get pending request count (for monitoring)\n */\n getPendingRequestCount(): number {\n return this.pendingRequests.size;\n }\n}\n","/**\n * Logging Infrastructure\n *\n * Configurable structured logging for DevTools bridge and MCP server.\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: number;\n prefix?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface Logger {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n child(prefix: string): Logger;\n}\n\nexport interface LoggerOptions {\n level: LogLevel;\n prefix?: string;\n output?: (entry: LogEntry) => void;\n}\n\n/**\n * Default output function - writes to stderr in structured format\n */\nfunction defaultOutput(entry: LogEntry): void {\n const timestamp = new Date(entry.timestamp).toISOString();\n const prefix = entry.prefix ? `[${entry.prefix}]` : '';\n const level = entry.level.toUpperCase().padEnd(5);\n const meta = entry.meta ? ` ${JSON.stringify(entry.meta)}` : '';\n\n // Write to stderr so it doesn't interfere with MCP stdio\n console.error(`${timestamp} ${level} ${prefix} ${entry.message}${meta}`);\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(options: Partial<LoggerOptions> = {}): Logger {\n const level = options.level ?? 'warn';\n const prefix = options.prefix;\n const output = options.output ?? defaultOutput;\n const minLevel = LOG_LEVELS[level];\n\n const log = (logLevel: LogLevel, message: string, meta?: Record<string, unknown>): void => {\n if (LOG_LEVELS[logLevel] < minLevel) return;\n\n output({\n level: logLevel,\n message,\n timestamp: Date.now(),\n prefix,\n meta,\n });\n };\n\n return {\n debug: (message, meta) => log('debug', message, meta),\n info: (message, meta) => log('info', message, meta),\n warn: (message, meta) => log('warn', message, meta),\n error: (message, meta) => log('error', message, meta),\n child: (childPrefix: string) =>\n createLogger({\n level,\n prefix: prefix ? `${prefix}:${childPrefix}` : childPrefix,\n output,\n }),\n };\n}\n\n/**\n * No-op logger for testing or when logging disabled\n */\nexport const noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n child: () => noopLogger,\n};\n\n/**\n * Get log level from environment\n */\nexport function getLogLevelFromEnv(): LogLevel {\n const envLevel = process.env.DEVTOOLS_LOG_LEVEL?.toLowerCase();\n if (envLevel && envLevel in LOG_LEVELS) {\n return envLevel as LogLevel;\n }\n return process.env.DEVTOOLS_DEBUG === 'true' ? 'debug' : 'warn';\n}\n","/**\n * Error Types\n *\n * Typed error classes for DevTools bridge operations.\n */\n\nimport type { ErrorCode } from './types.js';\n\n/**\n * Base error class for all DevTools errors\n */\nexport class DevToolsError extends Error {\n constructor(\n message: string,\n public readonly code: ErrorCode,\n public readonly details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'DevToolsError';\n // Maintains proper stack trace in V8\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n };\n }\n}\n\n/**\n * Connection-related errors\n */\nexport class ConnectionError extends DevToolsError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'NOT_CONNECTED', details);\n this.name = 'ConnectionError';\n }\n}\n\n/**\n * Request timeout errors\n */\nexport class TimeoutError extends DevToolsError {\n constructor(operation: string, timeout: number, details?: Record<string, unknown>) {\n super(`Request timeout after ${timeout}ms: ${operation}`, 'TIMEOUT', {\n operation,\n timeout,\n ...details,\n });\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Element not found errors\n */\nexport class ElementNotFoundError extends DevToolsError {\n constructor(elementId: number, details?: Record<string, unknown>) {\n super(`Element not found: ${elementId}`, 'ELEMENT_NOT_FOUND', {\n elementId,\n ...details,\n });\n this.name = 'ElementNotFoundError';\n }\n}\n\n/**\n * Protocol/parsing errors\n */\nexport class ProtocolError extends DevToolsError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'INTERNAL_ERROR', details);\n this.name = 'ProtocolError';\n }\n}\n\n/**\n * Validation errors for invalid inputs\n */\nexport class ValidationError extends DevToolsError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'SERIALIZATION_ERROR', details);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Operation not supported/editable\n */\nexport class NotEditableError extends DevToolsError {\n constructor(operation: string, elementId: number, details?: Record<string, unknown>) {\n super(`Cannot ${operation} on element ${elementId}`, 'NOT_EDITABLE', {\n operation,\n elementId,\n ...details,\n });\n this.name = 'NotEditableError';\n }\n}\n","/**\n * Headless React DevTools Server\n *\n * Embeds the DevTools server directly into the MCP package, allowing it to work\n * without the Electron DevTools app. Supports both React Native and Web apps.\n *\n * Based on: react-devtools-core/src/standalone.js\n * Key difference: No DOM/UI rendering - purely headless for MCP integration.\n */\n\nimport WebSocket, { WebSocketServer } from 'ws';\nimport { createServer as createHttpServer, type Server as HttpServer, type IncomingMessage, type ServerResponse } from 'http';\nimport { createServer as createHttpsServer } from 'https';\nimport { readFileSync } from 'fs';\nimport { createRequire } from 'module';\nimport { EventEmitter } from 'events';\nimport type { Logger } from './logger.js';\nimport { noopLogger } from './logger.js';\n\n// Create require function for ESM compatibility\nconst require = createRequire(import.meta.url);\n\n// ═══════════════════════════════════════════════════════════════════════════\n// TYPES\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface HeadlessServerOptions {\n port?: number;\n host?: string;\n httpsOptions?: {\n key: string;\n cert: string;\n };\n logger?: Logger;\n}\n\nexport type ServerStatus = 'stopped' | 'starting' | 'listening' | 'connected' | 'error';\n\nexport interface ServerState {\n status: ServerStatus;\n port: number;\n host: string;\n connectedAt: number | null;\n error: string | null;\n}\n\ninterface Message {\n event: string;\n payload: unknown;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// HEADLESS SERVER\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport class HeadlessDevToolsServer extends EventEmitter {\n private _options: Required<Omit<HeadlessServerOptions, 'httpsOptions'>> & { httpsOptions?: HeadlessServerOptions['httpsOptions'] };\n private _httpServer: HttpServer | null = null;\n private _wsServer: WebSocketServer | null = null;\n private _socket: WebSocket | null = null;\n private _state: ServerState;\n private _backendScript: string | null = null;\n\n constructor(options: HeadlessServerOptions = {}) {\n super();\n this._options = {\n port: options.port ?? 8097,\n host: options.host ?? 'localhost',\n httpsOptions: options.httpsOptions,\n logger: options.logger ?? noopLogger,\n };\n\n this._state = {\n status: 'stopped',\n port: this._options.port,\n host: this._options.host,\n connectedAt: null,\n error: null,\n };\n\n // Pre-load backend script\n this._loadBackendScript();\n }\n\n private _loadBackendScript(): void {\n try {\n // Try to load from react-devtools-core package (require is created at module level for ESM)\n const backendPath = require.resolve('react-devtools-core/dist/backend.js');\n this._backendScript = readFileSync(backendPath, 'utf-8');\n this._options.logger.debug('Loaded backend.js from react-devtools-core');\n } catch (err) {\n this._options.logger.warn('Could not load backend.js - web apps will need to include it manually');\n }\n }\n\n get state(): ServerState {\n return { ...this._state };\n }\n\n get isConnected(): boolean {\n return this._socket !== null && this._socket.readyState === WebSocket.OPEN;\n }\n\n // External message listeners (for MCP bridge integration)\n private _externalMessageListeners: Array<(event: string, payload: unknown) => void> = [];\n\n /**\n * Add an external message listener that receives all messages from React app.\n * Used to relay messages to the MCP's DevToolsBridge.\n */\n addMessageListener(fn: (event: string, payload: unknown) => void): () => void {\n this._externalMessageListeners.push(fn);\n return () => {\n const idx = this._externalMessageListeners.indexOf(fn);\n if (idx >= 0) this._externalMessageListeners.splice(idx, 1);\n };\n }\n\n /**\n * Send a message to the React app via WebSocket.\n * Used by the MCP's DevToolsBridge to send messages.\n */\n sendMessage(event: string, payload: unknown): void {\n if (this._socket && this._socket.readyState === WebSocket.OPEN) {\n this._socket.send(JSON.stringify({ event, payload }));\n }\n }\n\n /**\n * Start the headless DevTools server\n */\n async start(): Promise<void> {\n if (this._state.status === 'listening' || this._state.status === 'connected') {\n this._options.logger.debug('Server already running');\n return;\n }\n\n this._setState({ status: 'starting', error: null });\n const { port, host, httpsOptions } = this._options;\n const logger = this._options.logger;\n\n return new Promise((resolve, reject) => {\n try {\n // Create HTTP(S) server\n this._httpServer = httpsOptions\n ? createHttpsServer(httpsOptions)\n : createHttpServer();\n\n // Handle HTTP requests - serve backend.js for web apps\n this._httpServer.on('request', (req, res) => {\n this._handleHttpRequest(req, res);\n });\n\n // Create WebSocket server\n this._wsServer = new WebSocketServer({\n server: this._httpServer,\n maxPayload: 1e9, // 1GB - same as standalone.js\n });\n\n // Handle WebSocket connections\n this._wsServer.on('connection', (socket) => {\n this._handleConnection(socket);\n });\n\n this._wsServer.on('error', (err) => {\n logger.error('WebSocket server error', { error: err.message });\n this._setState({ status: 'error', error: err.message });\n this.emit('error', err);\n });\n\n this._httpServer.on('error', (err: NodeJS.ErrnoException) => {\n logger.error('HTTP server error', { error: err.message, code: err.code });\n if (err.code === 'EADDRINUSE') {\n this._setState({\n status: 'error',\n error: `Port ${port} is already in use. Another DevTools instance may be running.`,\n });\n } else {\n this._setState({ status: 'error', error: err.message });\n }\n this.emit('error', err);\n reject(err);\n });\n\n this._httpServer.listen(port, host, () => {\n logger.info('Headless DevTools server listening', { port, host });\n this._setState({ status: 'listening' });\n this.emit('listening', { port, host });\n resolve();\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n logger.error('Failed to start server', { error: message });\n this._setState({ status: 'error', error: message });\n reject(err);\n }\n });\n }\n\n /**\n * Stop the server\n */\n async stop(): Promise<void> {\n const logger = this._options.logger;\n logger.info('Stopping headless DevTools server');\n\n // Clean up connection\n if (this._socket) {\n this._socket.close();\n this._socket = null;\n }\n\n // Close servers\n if (this._wsServer) {\n this._wsServer.close();\n this._wsServer = null;\n }\n\n if (this._httpServer) {\n this._httpServer.close();\n this._httpServer = null;\n }\n\n this._setState({\n status: 'stopped',\n connectedAt: null,\n error: null,\n });\n\n this.emit('stopped');\n }\n\n /**\n * Handle HTTP requests - serve backend.js for web apps\n */\n private _handleHttpRequest(_req: IncomingMessage, res: ServerResponse): void {\n const { port, host, httpsOptions, logger } = this._options;\n const useHttps = !!httpsOptions;\n\n if (!this._backendScript) {\n logger.warn('Backend script not available');\n res.writeHead(503);\n res.end('Backend script not available. Web apps need to include react-devtools backend manually.');\n return;\n }\n\n logger.debug('Serving backend.js to web client');\n\n // Serve backend.js with auto-connect code (same as standalone.js)\n const responseScript = `${this._backendScript}\n;ReactDevToolsBackend.initialize();\nReactDevToolsBackend.connectToDevTools({port: ${port}, host: '${host}', useHttps: ${useHttps}});\n`;\n\n res.end(responseScript);\n }\n\n /**\n * Handle new WebSocket connection from React app\n */\n private _handleConnection(socket: WebSocket): void {\n const logger = this._options.logger;\n\n // Only allow one connection at a time (same as standalone.js)\n if (this._socket !== null) {\n logger.warn('Only one connection allowed at a time. Closing previous connection.');\n this._socket.close();\n }\n\n logger.info('React app connected');\n this._socket = socket;\n\n socket.on('message', (data) => {\n try {\n const message = JSON.parse(data.toString()) as Message;\n logger.debug('Received message', { event: message.event });\n\n // Notify external listeners (for MCP bridge integration)\n this._externalMessageListeners.forEach((fn) => {\n try {\n fn(message.event, message.payload);\n } catch (err) {\n logger.error('Error in external message listener', { error: err instanceof Error ? err.message : 'Unknown' });\n }\n });\n } catch (err) {\n logger.error('Failed to parse message', { data: data.toString().slice(0, 100) });\n }\n });\n\n socket.on('close', () => {\n logger.info('React app disconnected');\n this._onDisconnected();\n });\n\n socket.on('error', (err) => {\n logger.error('WebSocket connection error', { error: err.message });\n this._onDisconnected();\n });\n\n this._setState({\n status: 'connected',\n connectedAt: Date.now(),\n });\n\n this.emit('connected');\n }\n\n /**\n * Handle disconnection\n */\n private _onDisconnected(): void {\n this._socket = null;\n\n this._setState({\n status: 'listening',\n connectedAt: null,\n });\n\n this.emit('disconnected');\n }\n\n private _setState(updates: Partial<ServerState>): void {\n this._state = { ...this._state, ...updates };\n this.emit('stateChange', this._state);\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// FACTORY FUNCTION\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Create and start a headless DevTools server\n */\nexport async function startHeadlessServer(\n options: HeadlessServerOptions = {}\n): Promise<HeadlessDevToolsServer> {\n const server = new HeadlessDevToolsServer(options);\n await server.start();\n return server;\n}\n\n"],"mappings":"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","names":["element","renderer","WebSocket","EventEmitter","require","EventEmitter","WebSocket"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-devtools-bridge",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server exposing React DevTools functionality to AI agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"react-devtools-bridge": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"TOOLS.md",
|
|
15
|
+
"SKILL.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsup",
|
|
19
|
+
"dev": "tsup --watch",
|
|
20
|
+
"start": "node dist/cli.js",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"lint": "eslint src",
|
|
23
|
+
"test": "vitest",
|
|
24
|
+
"clean": "rm -rf dist"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
28
|
+
"react-devtools-core": "^6.0.0",
|
|
29
|
+
"ws": "^8.18.0",
|
|
30
|
+
"zod": "^3.23.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.0.0",
|
|
34
|
+
"@types/ws": "^8.5.0",
|
|
35
|
+
"puppeteer": "^24.36.1",
|
|
36
|
+
"tsup": "^8.0.0",
|
|
37
|
+
"typescript": "^5.6.0",
|
|
38
|
+
"vitest": "^2.0.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18.0.0"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"mcp",
|
|
45
|
+
"model-context-protocol",
|
|
46
|
+
"react",
|
|
47
|
+
"react-native",
|
|
48
|
+
"devtools",
|
|
49
|
+
"debugging",
|
|
50
|
+
"ai",
|
|
51
|
+
"claude"
|
|
52
|
+
],
|
|
53
|
+
"author": "Skylar Barrera",
|
|
54
|
+
"license": "MIT",
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "https://github.com/skylarbarrera/react-devtools-mcp"
|
|
58
|
+
}
|
|
59
|
+
}
|