@ibealec/create-zed-bridge 1.0.2 → 1.0.5
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/dist/index.js +214 -82
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/@zed-controller/react-bridge/dist/index.cjs +24 -11
- package/templates/@zed-controller/react-bridge/dist/index.cjs.map +1 -1
- package/templates/@zed-controller/react-bridge/dist/index.js +24 -11
- package/templates/@zed-controller/react-bridge/dist/index.js.map +1 -1
- package/templates/@zed-controller/react-bridge/package.json +16 -0
- package/templates/@zed-controller/shared/package.json +10 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/ClaudeBridgeProvider.tsx","../src/websocket-client.ts","../src/context-capture.ts","../src/screenshot-capture.ts","../src/SelectionOverlay.tsx","../src/PromptDialog.tsx","../src/QuestionDialog.tsx","../src/TaskStatusToast.tsx","../src/ClaudeTerminal.tsx"],"sourcesContent":["// Main exports\nexport { ClaudeBridgeProvider, useClaudeBridge } from './ClaudeBridgeProvider';\nexport { ClaudeTerminal } from './ClaudeTerminal';\nexport type { ClaudeTerminalProps } from './ClaudeTerminal';\nexport { TaskStatusToast } from './TaskStatusToast';\n\n// Types\nexport type {\n ClaudeBridgeConfig,\n ClaudeBridgeState,\n ClaudeBridgeContextValue,\n} from './types';\n\n// Re-export shared types for convenience\nexport type {\n SelectionContext,\n BrowserTask,\n CreateTaskRequest,\n CreateTaskResponse,\n TaskProgressEvent,\n Session,\n} from '@zed-controller/shared';\n\n// Utilities (for advanced usage)\nexport { captureContext, capturePageContext } from './context-capture';\nexport { captureElementScreenshot } from './screenshot-capture';\n","import React, {\n createContext,\n useContext,\n useReducer,\n useEffect,\n useCallback,\n useRef,\n type ReactNode,\n} from 'react';\nimport type {\n ClaudeBridgeConfig,\n ClaudeBridgeState,\n ClaudeBridgeAction,\n ClaudeBridgeContextValue,\n BridgeWebSocketMessage,\n} from './types';\nimport type { BrowserTask } from '@zed-controller/shared';\nimport { BridgeWebSocketClient } from './websocket-client';\nimport { captureContext, capturePageContext } from './context-capture';\nimport { captureElementScreenshot } from './screenshot-capture';\nimport { SelectionOverlay } from './SelectionOverlay';\nimport { PromptDialog } from './PromptDialog';\nimport { QuestionDialog } from './QuestionDialog';\nimport { TaskStatusToast } from './TaskStatusToast';\n\nconst initialState: ClaudeBridgeState = {\n connected: false,\n selectionMode: false,\n questionMode: false,\n selectedElement: null,\n activeTask: null,\n tasks: [],\n};\n\nfunction reducer(state: ClaudeBridgeState, action: ClaudeBridgeAction): ClaudeBridgeState {\n switch (action.type) {\n case 'SET_CONNECTED':\n return { ...state, connected: action.connected };\n case 'SET_SELECTION_MODE':\n return {\n ...state,\n selectionMode: action.enabled,\n questionMode: action.enabled ? false : state.questionMode, // Turn off question mode when entering selection mode\n selectedElement: action.enabled ? state.selectedElement : null,\n };\n case 'SET_QUESTION_MODE':\n return {\n ...state,\n questionMode: action.enabled,\n selectionMode: action.enabled ? false : state.selectionMode, // Turn off selection mode when entering question mode\n };\n case 'SET_SELECTED_ELEMENT':\n return { ...state, selectedElement: action.element };\n case 'SET_ACTIVE_TASK':\n return { ...state, activeTask: action.task };\n case 'ADD_TASK':\n return { ...state, tasks: [...state.tasks, action.task] };\n case 'UPDATE_TASK':\n return {\n ...state,\n tasks: state.tasks.map((t) =>\n t.id === action.taskId ? { ...t, ...action.updates } : t\n ),\n activeTask:\n state.activeTask?.id === action.taskId\n ? { ...state.activeTask, ...action.updates }\n : state.activeTask,\n };\n case 'CLEAR_TASKS':\n return { ...state, tasks: [], activeTask: null };\n default:\n return state;\n }\n}\n\nconst ClaudeBridgeContext = createContext<ClaudeBridgeContextValue | null>(null);\n\nexport interface ClaudeBridgeProviderProps {\n children: ReactNode;\n serverUrl: string;\n token: string;\n enabled?: boolean;\n projectRoot?: string;\n shortcut?: string;\n questionShortcut?: string; // Default: 'Meta+Shift+/' for question mode\n onTaskCreated?: (taskId: string) => void;\n onTaskProgress?: (taskId: string, output: string) => void;\n onTaskCompleted?: (taskId: string) => void;\n onTaskFailed?: (taskId: string, error: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport function ClaudeBridgeProvider({\n children,\n serverUrl,\n token,\n enabled = true,\n projectRoot,\n shortcut = 'Meta+Shift+K',\n questionShortcut = 'Meta+Shift+?',\n onTaskCreated,\n onTaskProgress,\n onTaskCompleted,\n onTaskFailed,\n onError,\n}: ClaudeBridgeProviderProps) {\n const [state, dispatch] = useReducer(reducer, initialState);\n const wsClientRef = useRef<BridgeWebSocketClient | null>(null);\n const pendingTaskResolveRef = useRef<((taskId: string | null) => void) | null>(null);\n\n const config: ClaudeBridgeConfig = {\n serverUrl,\n token,\n enabled,\n projectRoot,\n shortcut,\n questionShortcut,\n onTaskCreated,\n onTaskProgress,\n onTaskCompleted,\n onTaskFailed,\n onError,\n };\n\n // Initialize WebSocket client\n useEffect(() => {\n if (!enabled) return;\n\n const client = new BridgeWebSocketClient(config);\n wsClientRef.current = client;\n\n // Handle connection state\n const unsubConnection = client.onConnection((connected) => {\n dispatch({ type: 'SET_CONNECTED', connected });\n });\n\n // Handle messages\n const unsubMessage = client.onMessage((message: BridgeWebSocketMessage) => {\n handleMessage(message);\n });\n\n // Connect\n client.connect();\n\n return () => {\n unsubConnection();\n unsubMessage();\n client.disconnect();\n wsClientRef.current = null;\n };\n }, [enabled, serverUrl, token]);\n\n // Handle incoming WebSocket messages\n const handleMessage = useCallback((message: BridgeWebSocketMessage) => {\n switch (message.type) {\n case 'task_created':\n if (message.task) {\n dispatch({ type: 'ADD_TASK', task: message.task });\n dispatch({ type: 'SET_ACTIVE_TASK', task: message.task });\n onTaskCreated?.(message.task.id);\n pendingTaskResolveRef.current?.(message.task.id);\n pendingTaskResolveRef.current = null;\n }\n break;\n\n case 'task_progress':\n if (message.taskId && message.output) {\n dispatch({\n type: 'UPDATE_TASK',\n taskId: message.taskId,\n updates: { status: 'running' },\n });\n onTaskProgress?.(message.taskId, message.output);\n }\n break;\n\n case 'task_completed':\n if (message.taskId) {\n dispatch({\n type: 'UPDATE_TASK',\n taskId: message.taskId,\n updates: {\n status: 'completed',\n completedAt: new Date().toISOString(),\n },\n });\n onTaskCompleted?.(message.taskId);\n }\n break;\n\n case 'task_failed':\n if (message.taskId) {\n dispatch({\n type: 'UPDATE_TASK',\n taskId: message.taskId,\n updates: {\n status: 'failed',\n error: message.error,\n completedAt: new Date().toISOString(),\n },\n });\n onTaskFailed?.(message.taskId, message.error || 'Unknown error');\n pendingTaskResolveRef.current?.(null);\n pendingTaskResolveRef.current = null;\n }\n break;\n\n case 'pong':\n // Keep-alive response, ignore\n break;\n\n default:\n console.log('[ClaudeBridge] Unknown message type:', message.type);\n }\n }, [onTaskCreated, onTaskProgress, onTaskCompleted, onTaskFailed]);\n\n // Helper to check if a shortcut matches a keyboard event\n const matchesShortcut = useCallback((e: KeyboardEvent, shortcutStr: string): boolean => {\n const keys = shortcutStr.split('+');\n const requiresMeta = keys.includes('Meta');\n const requiresCtrl = keys.includes('Ctrl');\n const requiresShift = keys.includes('Shift');\n const requiresAlt = keys.includes('Alt');\n const key = keys.find((k) => !['Meta', 'Ctrl', 'Shift', 'Alt'].includes(k));\n\n return (\n (requiresMeta ? e.metaKey : true) &&\n (requiresCtrl ? e.ctrlKey : true) &&\n (requiresShift ? e.shiftKey : true) &&\n (requiresAlt ? e.altKey : true) &&\n e.key.toUpperCase() === key?.toUpperCase()\n );\n }, []);\n\n // Keyboard shortcut handler\n useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Check for selection mode shortcut (Meta+Shift+K)\n if (matchesShortcut(e, shortcut)) {\n e.preventDefault();\n if (!state.selectionMode) {\n // Entering selection mode - clear any previous active task\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n }\n dispatch({ type: 'SET_SELECTION_MODE', enabled: !state.selectionMode });\n return;\n }\n\n // Check for question mode shortcut (Meta+Shift+/)\n if (matchesShortcut(e, questionShortcut)) {\n e.preventDefault();\n if (!state.questionMode) {\n // Entering question mode - clear any previous active task\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n }\n dispatch({ type: 'SET_QUESTION_MODE', enabled: !state.questionMode });\n return;\n }\n\n // Escape to cancel any mode\n if (e.key === 'Escape') {\n if (state.selectionMode) {\n dispatch({ type: 'SET_SELECTION_MODE', enabled: false });\n }\n if (state.questionMode) {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [enabled, shortcut, questionShortcut, state.selectionMode, state.questionMode, matchesShortcut]);\n\n const enableSelectionMode = useCallback(() => {\n // Clear any previous active task when entering selection mode\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n dispatch({ type: 'SET_SELECTION_MODE', enabled: true });\n }, []);\n\n const disableSelectionMode = useCallback(() => {\n dispatch({ type: 'SET_SELECTION_MODE', enabled: false });\n }, []);\n\n const enableQuestionMode = useCallback(() => {\n // Clear any previous active task when entering question mode\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n dispatch({ type: 'SET_QUESTION_MODE', enabled: true });\n }, []);\n\n const disableQuestionMode = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n }, []);\n\n const submitTask = useCallback(async (prompt: string): Promise<string | null> => {\n if (!state.selectedElement || !wsClientRef.current?.isConnected) {\n return null;\n }\n\n // Capture context\n const context = captureContext(state.selectedElement);\n console.log('[ClaudeBridge] submitTask captured context:', {\n sourceFile: context.sourceFile,\n sourceLine: context.sourceLine,\n componentName: context.componentName,\n element: state.selectedElement.tagName,\n });\n\n // Capture screenshot\n const screenshot = await captureElementScreenshot(state.selectedElement);\n\n const fullContext = {\n ...context,\n screenshot,\n };\n\n // Create promise to wait for task creation response\n const taskIdPromise = new Promise<string | null>((resolve) => {\n pendingTaskResolveRef.current = resolve;\n // Timeout after 10 seconds\n setTimeout(() => {\n if (pendingTaskResolveRef.current === resolve) {\n pendingTaskResolveRef.current = null;\n resolve(null);\n }\n }, 10000);\n });\n\n // Send task creation request\n const sent = wsClientRef.current.createTask(prompt, fullContext);\n if (!sent) {\n pendingTaskResolveRef.current = null;\n return null;\n }\n\n // Clear selection mode\n dispatch({ type: 'SET_SELECTION_MODE', enabled: false });\n\n return taskIdPromise;\n }, [state.selectedElement]);\n\n const continueTask = useCallback(async (taskId: string, prompt: string): Promise<void> => {\n if (!wsClientRef.current?.isConnected) {\n throw new Error('Not connected');\n }\n\n // If there's a selected element, include its context\n let context = undefined;\n if (state.selectedElement) {\n const baseContext = captureContext(state.selectedElement);\n const screenshot = await captureElementScreenshot(state.selectedElement);\n context = { ...baseContext, screenshot };\n }\n\n const sent = wsClientRef.current.continueTask(taskId, prompt, context);\n if (!sent) {\n throw new Error('Failed to send continue task message');\n }\n }, [state.selectedElement]);\n\n // Submit a question (doesn't require element selection)\n const submitQuestion = useCallback(async (prompt: string, includeSelectedElement: boolean = false): Promise<string | null> => {\n if (!wsClientRef.current?.isConnected) {\n return null;\n }\n\n // Use page context or element context based on flag\n let context;\n if (includeSelectedElement && state.selectedElement) {\n const baseContext = captureContext(state.selectedElement);\n const screenshot = await captureElementScreenshot(state.selectedElement);\n context = { ...baseContext, screenshot };\n } else {\n // Use page-level context\n context = capturePageContext();\n }\n\n // Prefix the prompt to indicate this is a question (no changes expected)\n const questionPrompt = `[QUESTION - No code changes expected, just provide information]\\n\\n${prompt}`;\n\n // Create promise to wait for task creation response\n const taskIdPromise = new Promise<string | null>((resolve) => {\n pendingTaskResolveRef.current = resolve;\n // Timeout after 10 seconds\n setTimeout(() => {\n if (pendingTaskResolveRef.current === resolve) {\n pendingTaskResolveRef.current = null;\n resolve(null);\n }\n }, 10000);\n });\n\n // Send task creation request\n const sent = wsClientRef.current.createTask(questionPrompt, context);\n if (!sent) {\n pendingTaskResolveRef.current = null;\n return null;\n }\n\n // Clear question mode\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n\n return taskIdPromise;\n }, [state.selectedElement]);\n\n const handleElementSelect = useCallback((element: HTMLElement) => {\n dispatch({ type: 'SET_SELECTED_ELEMENT', element });\n }, []);\n\n const handlePromptSubmit = useCallback(async (prompt: string) => {\n await submitTask(prompt);\n }, [submitTask]);\n\n const handlePromptClose = useCallback(() => {\n dispatch({ type: 'SET_SELECTED_ELEMENT', element: null });\n }, []);\n\n const handleQuestionSubmit = useCallback(async (prompt: string, includeElement: boolean) => {\n await submitQuestion(prompt, includeElement);\n }, [submitQuestion]);\n\n const handleQuestionClose = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n }, []);\n\n // Switch from task mode to question mode (keeps selected element)\n const handleSwitchToQuestionMode = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: true });\n }, []);\n\n // Switch from question mode to task mode (if element is selected, shows prompt dialog)\n const handleSwitchToTaskMode = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n // If there's a selected element, the PromptDialog will automatically show\n // If not, we need to enable selection mode\n if (!state.selectedElement) {\n dispatch({ type: 'SET_SELECTION_MODE', enabled: true });\n }\n }, [state.selectedElement]);\n\n const handleToastDismiss = useCallback(() => {\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n }, []);\n\n const contextValue: ClaudeBridgeContextValue = {\n state,\n config,\n enableSelectionMode,\n disableSelectionMode,\n enableQuestionMode,\n disableQuestionMode,\n submitTask,\n submitQuestion,\n continueTask,\n };\n\n return (\n <ClaudeBridgeContext.Provider value={contextValue}>\n {children}\n {enabled && (\n <>\n <SelectionOverlay\n active={state.selectionMode}\n onElementSelect={handleElementSelect}\n selectedElement={state.selectedElement}\n />\n <PromptDialog\n open={state.selectedElement !== null && !state.questionMode}\n element={state.selectedElement}\n onSubmit={handlePromptSubmit}\n onClose={handlePromptClose}\n onSwitchToQuestionMode={handleSwitchToQuestionMode}\n isSubmitting={state.activeTask?.status === 'starting' || state.activeTask?.status === 'running'}\n />\n <QuestionDialog\n open={state.questionMode}\n selectedElement={state.selectedElement}\n onSubmit={handleQuestionSubmit}\n onClose={handleQuestionClose}\n onSwitchToTaskMode={handleSwitchToTaskMode}\n isSubmitting={state.activeTask?.status === 'starting' || state.activeTask?.status === 'running'}\n />\n <TaskStatusToast\n task={state.activeTask}\n serverUrl={serverUrl}\n token={token}\n onDismiss={handleToastDismiss}\n />\n </>\n )}\n </ClaudeBridgeContext.Provider>\n );\n}\n\nexport function useClaudeBridge(): ClaudeBridgeContextValue {\n const context = useContext(ClaudeBridgeContext);\n if (!context) {\n throw new Error('useClaudeBridge must be used within a ClaudeBridgeProvider');\n }\n return context;\n}\n","import type { BridgeWebSocketMessage, ClaudeBridgeConfig } from './types';\nimport type { CreateTaskRequest, SelectionContext } from '@zed-controller/shared';\n\ntype MessageHandler = (message: BridgeWebSocketMessage) => void;\ntype ConnectionHandler = (connected: boolean) => void;\n\nexport class BridgeWebSocketClient {\n private ws: WebSocket | null = null;\n private config: ClaudeBridgeConfig;\n private messageHandlers: Set<MessageHandler> = new Set();\n private connectionHandlers: Set<ConnectionHandler> = new Set();\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectDelay = 1000;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: ClaudeBridgeConfig) {\n this.config = config;\n }\n\n connect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n return;\n }\n\n try {\n // Connect to the bridge-specific WebSocket endpoint\n const wsUrl = this.config.serverUrl\n .replace(/^http/, 'ws')\n .replace(/\\/$/, '');\n\n this.ws = new WebSocket(`${wsUrl}/ws/bridge?token=${encodeURIComponent(this.config.token)}`);\n\n this.ws.onopen = () => {\n console.log('[ClaudeBridge] WebSocket connected');\n this.reconnectAttempts = 0;\n this.notifyConnectionHandlers(true);\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message: BridgeWebSocketMessage = JSON.parse(event.data);\n this.notifyMessageHandlers(message);\n } catch (error) {\n console.error('[ClaudeBridge] Failed to parse message:', error);\n }\n };\n\n this.ws.onclose = () => {\n console.log('[ClaudeBridge] WebSocket disconnected');\n this.notifyConnectionHandlers(false);\n this.stopPingInterval();\n this.scheduleReconnect();\n };\n\n this.ws.onerror = (error) => {\n console.error('[ClaudeBridge] WebSocket error:', error);\n this.config.onError?.(new Error('WebSocket connection error'));\n };\n } catch (error) {\n console.error('[ClaudeBridge] Failed to connect:', error);\n this.scheduleReconnect();\n }\n }\n\n disconnect(): void {\n this.stopPingInterval();\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.log('[ClaudeBridge] Max reconnect attempts reached');\n return;\n }\n\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n\n console.log(`[ClaudeBridge] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);\n this.reconnectTimeout = setTimeout(() => this.connect(), delay);\n }\n\n private startPingInterval(): void {\n this.pingInterval = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.send({ type: 'ping' });\n }\n }, 30000);\n }\n\n private stopPingInterval(): void {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n }\n\n send(message: Record<string, unknown>): boolean {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n console.warn('[ClaudeBridge] Cannot send message: not connected');\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error('[ClaudeBridge] Failed to send message:', error);\n return false;\n }\n }\n\n createTask(prompt: string, context: SelectionContext): boolean {\n console.log('[ClaudeBridge] createTask context:', {\n sourceFile: context.sourceFile,\n sourceLine: context.sourceLine,\n componentName: context.componentName,\n });\n\n const request: CreateTaskRequest = {\n prompt,\n context,\n projectPath: this.config.projectRoot,\n };\n\n return this.send({\n type: 'create_task',\n ...request,\n });\n }\n\n continueTask(taskId: string, prompt: string, context?: SelectionContext): boolean {\n return this.send({\n type: 'continue_task',\n taskId,\n prompt,\n context,\n });\n }\n\n onMessage(handler: MessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n onConnection(handler: ConnectionHandler): () => void {\n this.connectionHandlers.add(handler);\n return () => this.connectionHandlers.delete(handler);\n }\n\n private notifyMessageHandlers(message: BridgeWebSocketMessage): void {\n for (const handler of this.messageHandlers) {\n try {\n handler(message);\n } catch (error) {\n console.error('[ClaudeBridge] Message handler error:', error);\n }\n }\n }\n\n private notifyConnectionHandlers(connected: boolean): void {\n for (const handler of this.connectionHandlers) {\n try {\n handler(connected);\n } catch (error) {\n console.error('[ClaudeBridge] Connection handler error:', error);\n }\n }\n }\n\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n}\n","import type { SelectionContext } from '@zed-controller/shared';\n\n/**\n * Captures context about a selected DOM element for Claude.\n * Uses multiple strategies to identify source location:\n * 1. LocatorJS data attributes (data-locatorjs-id)\n * 2. Custom data attributes (data-source-file, data-source-line)\n * 3. React fiber inspection for component names\n */\nexport function captureContext(element: HTMLElement): Omit<SelectionContext, 'screenshot'> {\n return {\n selectedText: getSelectedText(),\n selectedElement: {\n tagName: element.tagName.toLowerCase(),\n className: element.className,\n id: element.id || undefined,\n innerText: truncateText(element.innerText, 200),\n },\n sourceFile: getSourceFile(element),\n sourceLine: getSourceLine(element),\n sourceColumn: getSourceColumn(element),\n componentName: getComponentName(element),\n domPath: getDomPath(element),\n parentComponents: getParentComponents(element),\n currentUrl: window.location.href,\n pageTitle: document.title,\n };\n}\n\nfunction getSelectedText(): string | undefined {\n const selection = window.getSelection();\n if (selection && selection.toString().trim()) {\n return selection.toString().trim();\n }\n return undefined;\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n const cleaned = text.replace(/\\s+/g, ' ').trim();\n if (cleaned.length <= maxLength) {\n return cleaned;\n }\n return cleaned.slice(0, maxLength) + '...';\n}\n\n/**\n * Get source file from element or its ancestors.\n * Checks for LocatorJS attributes first, then custom attributes.\n */\nfunction getSourceFile(element: HTMLElement): string | undefined {\n let current: HTMLElement | null = element;\n\n while (current) {\n // LocatorJS format: \"path/to/file.tsx:line:column\"\n const locatorId = current.getAttribute('data-locatorjs-id');\n if (locatorId) {\n const [filePath] = locatorId.split(':');\n return filePath;\n }\n\n // Custom attribute\n const sourceFile = current.getAttribute('data-source-file');\n if (sourceFile) {\n return sourceFile;\n }\n\n current = current.parentElement;\n }\n\n return undefined;\n}\n\nfunction getSourceLine(element: HTMLElement): number | undefined {\n let current: HTMLElement | null = element;\n\n while (current) {\n // LocatorJS format: \"path/to/file.tsx:line:column\"\n const locatorId = current.getAttribute('data-locatorjs-id');\n if (locatorId) {\n const parts = locatorId.split(':');\n if (parts.length >= 2) {\n const line = parseInt(parts[1], 10);\n if (!isNaN(line)) return line;\n }\n }\n\n // Custom attribute\n const sourceLine = current.getAttribute('data-source-line');\n if (sourceLine) {\n const line = parseInt(sourceLine, 10);\n if (!isNaN(line)) return line;\n }\n\n current = current.parentElement;\n }\n\n return undefined;\n}\n\nfunction getSourceColumn(element: HTMLElement): number | undefined {\n let current: HTMLElement | null = element;\n\n while (current) {\n // LocatorJS format: \"path/to/file.tsx:line:column\"\n const locatorId = current.getAttribute('data-locatorjs-id');\n if (locatorId) {\n const parts = locatorId.split(':');\n if (parts.length >= 3) {\n const col = parseInt(parts[2], 10);\n if (!isNaN(col)) return col;\n }\n }\n\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Get React component name from fiber.\n * Uses React DevTools hook if available.\n */\nfunction getComponentName(element: HTMLElement): string | undefined {\n // Try to get from React fiber\n const fiber = getReactFiber(element);\n if (fiber) {\n const name = getFiberComponentName(fiber);\n if (name) return name;\n }\n\n // Fallback: check for data attribute\n let current: HTMLElement | null = element;\n while (current) {\n const componentName = current.getAttribute('data-component');\n if (componentName) return componentName;\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Get the React fiber node for an element.\n */\nfunction getReactFiber(element: HTMLElement): any | null {\n // React 18+ uses __reactFiber$ prefix\n // React 17 uses __reactInternalInstance$ prefix\n const keys = Object.keys(element);\n\n for (const key of keys) {\n if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) {\n return (element as any)[key];\n }\n }\n\n return null;\n}\n\n/**\n * Extract component name from React fiber.\n */\nfunction getFiberComponentName(fiber: any): string | undefined {\n if (!fiber) return undefined;\n\n // Function components have a type that is the function itself\n // Class components have a type that is the class\n if (fiber.type) {\n if (typeof fiber.type === 'function') {\n return fiber.type.displayName || fiber.type.name || undefined;\n }\n if (typeof fiber.type === 'string') {\n // Native element, not a component\n return undefined;\n }\n // Forward ref, memo, etc.\n if (fiber.type.displayName) {\n return fiber.type.displayName;\n }\n if (fiber.type.render?.displayName || fiber.type.render?.name) {\n return fiber.type.render.displayName || fiber.type.render.name;\n }\n }\n\n // Walk up to find the nearest component\n if (fiber.return) {\n return getFiberComponentName(fiber.return);\n }\n\n return undefined;\n}\n\n/**\n * Build a CSS selector path to the element.\n */\nfunction getDomPath(element: HTMLElement): string {\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className) {\n const classes = current.className\n .split(/\\s+/)\n .filter((c) => c && !c.startsWith('__'))\n .slice(0, 2)\n .join('.');\n if (classes) {\n selector += `.${classes}`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n path.unshift('body');\n return path.join(' > ');\n}\n\n/**\n * Get parent React component names.\n */\nfunction getParentComponents(element: HTMLElement): string[] {\n const components: string[] = [];\n const seen = new Set<string>();\n\n let fiber = getReactFiber(element);\n\n while (fiber) {\n const name = getFiberComponentName(fiber);\n if (name && !seen.has(name) && !isBuiltInComponent(name)) {\n seen.add(name);\n components.push(name);\n }\n fiber = fiber.return;\n }\n\n // Reverse so it goes from root to leaf\n return components.reverse().slice(0, 10);\n}\n\n/**\n * Check if a component name is a built-in React component we should skip.\n */\nfunction isBuiltInComponent(name: string): boolean {\n const builtIns = [\n 'Fragment',\n 'Suspense',\n 'StrictMode',\n 'Profiler',\n 'Provider',\n 'Consumer',\n 'Context',\n ];\n return builtIns.some((b) => name.includes(b));\n}\n\n/**\n * Captures page-level context without requiring a specific element selection.\n * Useful for asking general questions about the page.\n */\nexport function capturePageContext(): Omit<SelectionContext, 'screenshot'> {\n // Get visible page structure by finding major landmark elements\n const mainContent = document.querySelector('main') || document.querySelector('[role=\"main\"]');\n const pageStructure = getPageStructure();\n\n return {\n selectedText: getSelectedText(),\n selectedElement: {\n tagName: 'body',\n className: document.body.className || '',\n id: document.body.id || undefined,\n innerText: truncateText(getVisibleTextContent(), 500),\n },\n componentName: mainContent ? getComponentName(mainContent as HTMLElement) : undefined,\n domPath: 'body',\n parentComponents: getRootComponents(),\n currentUrl: window.location.href,\n pageTitle: document.title,\n // Include page structure info in the innerText\n };\n}\n\n/**\n * Get a summary of the page structure for context.\n */\nfunction getPageStructure(): string {\n const parts: string[] = [];\n\n // Check for common landmark elements\n const landmarks = [\n { selector: 'header, [role=\"banner\"]', name: 'header' },\n { selector: 'nav, [role=\"navigation\"]', name: 'navigation' },\n { selector: 'main, [role=\"main\"]', name: 'main content' },\n { selector: 'aside, [role=\"complementary\"]', name: 'sidebar' },\n { selector: 'footer, [role=\"contentinfo\"]', name: 'footer' },\n ];\n\n for (const { selector, name } of landmarks) {\n if (document.querySelector(selector)) {\n parts.push(name);\n }\n }\n\n // Count interactive elements\n const buttons = document.querySelectorAll('button, [role=\"button\"]').length;\n const links = document.querySelectorAll('a[href]').length;\n const forms = document.querySelectorAll('form').length;\n const inputs = document.querySelectorAll('input, textarea, select').length;\n\n if (buttons > 0) parts.push(`${buttons} buttons`);\n if (links > 0) parts.push(`${links} links`);\n if (forms > 0) parts.push(`${forms} forms`);\n if (inputs > 0) parts.push(`${inputs} inputs`);\n\n return parts.join(', ');\n}\n\n/**\n * Get visible text content from the page (excluding scripts, styles, etc.)\n */\nfunction getVisibleTextContent(): string {\n const clone = document.body.cloneNode(true) as HTMLElement;\n\n // Remove script, style, and hidden elements\n const toRemove = clone.querySelectorAll('script, style, noscript, [hidden], [aria-hidden=\"true\"]');\n toRemove.forEach((el) => el.remove());\n\n // Get text content\n const text = clone.innerText || clone.textContent || '';\n\n // Clean up whitespace\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Get root-level React components on the page.\n */\nfunction getRootComponents(): string[] {\n const components: string[] = [];\n const seen = new Set<string>();\n\n // Try to find React root\n const root = document.getElementById('root') || document.getElementById('app') || document.querySelector('[data-reactroot]');\n\n if (root) {\n const fiber = getReactFiber(root as HTMLElement);\n if (fiber) {\n let current = fiber;\n let depth = 0;\n while (current && depth < 5) {\n const name = getFiberComponentName(current);\n if (name && !seen.has(name) && !isBuiltInComponent(name)) {\n seen.add(name);\n components.push(name);\n }\n current = current.child;\n depth++;\n }\n }\n }\n\n return components;\n}\n","import html2canvas from 'html2canvas';\n\n/**\n * Capture a screenshot of an element with some padding.\n * Returns a base64-encoded PNG.\n */\nexport async function captureElementScreenshot(\n element: HTMLElement,\n options: {\n padding?: number;\n maxWidth?: number;\n maxHeight?: number;\n } = {}\n): Promise<string | undefined> {\n const { padding = 20, maxWidth = 800, maxHeight = 600 } = options;\n\n try {\n // Get element bounds\n const rect = element.getBoundingClientRect();\n\n // Calculate capture area with padding\n const x = Math.max(0, rect.left - padding + window.scrollX);\n const y = Math.max(0, rect.top - padding + window.scrollY);\n const width = Math.min(rect.width + padding * 2, maxWidth);\n const height = Math.min(rect.height + padding * 2, maxHeight);\n\n // Capture using html2canvas\n const canvas = await html2canvas(document.body, {\n x,\n y,\n width,\n height,\n scrollX: -window.scrollX,\n scrollY: -window.scrollY,\n windowWidth: document.documentElement.scrollWidth,\n windowHeight: document.documentElement.scrollHeight,\n useCORS: true,\n allowTaint: true,\n backgroundColor: null,\n logging: false,\n });\n\n // Convert to base64\n return canvas.toDataURL('image/png');\n } catch (error) {\n console.error('[ClaudeBridge] Screenshot capture failed:', error);\n return undefined;\n }\n}\n\n/**\n * Highlight an element visually during selection.\n */\nexport function createHighlightOverlay(): {\n show: (element: HTMLElement) => void;\n hide: () => void;\n destroy: () => void;\n} {\n const overlay = document.createElement('div');\n overlay.id = 'claude-bridge-highlight';\n overlay.style.cssText = `\n position: fixed;\n pointer-events: none;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n z-index: 999998;\n transition: all 0.1s ease-out;\n display: none;\n `;\n document.body.appendChild(overlay);\n\n const label = document.createElement('div');\n label.style.cssText = `\n position: absolute;\n top: -24px;\n left: 0;\n background: #6366f1;\n color: white;\n font-size: 11px;\n font-family: ui-monospace, monospace;\n padding: 2px 6px;\n border-radius: 3px;\n white-space: nowrap;\n `;\n overlay.appendChild(label);\n\n return {\n show: (element: HTMLElement) => {\n const rect = element.getBoundingClientRect();\n overlay.style.display = 'block';\n overlay.style.top = `${rect.top}px`;\n overlay.style.left = `${rect.left}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n\n // Show element info in label\n let labelText = element.tagName.toLowerCase();\n if (element.id) {\n labelText += `#${element.id}`;\n } else if (element.className) {\n const firstClass = element.className.split(/\\s+/)[0];\n if (firstClass && !firstClass.startsWith('__')) {\n labelText += `.${firstClass}`;\n }\n }\n label.textContent = labelText;\n },\n hide: () => {\n overlay.style.display = 'none';\n },\n destroy: () => {\n overlay.remove();\n },\n };\n}\n","import React, { useEffect, useRef, useCallback } from 'react';\nimport { createHighlightOverlay } from './screenshot-capture';\n\ninterface SelectionOverlayProps {\n active: boolean;\n onElementSelect: (element: HTMLElement) => void;\n selectedElement: HTMLElement | null;\n}\n\nexport function SelectionOverlay({\n active,\n onElementSelect,\n selectedElement,\n}: SelectionOverlayProps) {\n const highlightRef = useRef<ReturnType<typeof createHighlightOverlay> | null>(null);\n const hoveredElementRef = useRef<HTMLElement | null>(null);\n\n // Initialize highlight overlay\n useEffect(() => {\n highlightRef.current = createHighlightOverlay();\n return () => {\n highlightRef.current?.destroy();\n highlightRef.current = null;\n };\n }, []);\n\n // Update highlight when selected element changes\n useEffect(() => {\n if (selectedElement) {\n highlightRef.current?.show(selectedElement);\n } else if (!active) {\n highlightRef.current?.hide();\n }\n }, [selectedElement, active]);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!active || selectedElement) return;\n\n const target = e.target as HTMLElement;\n\n // Skip our own overlay elements\n if (\n target.id === 'claude-bridge-highlight' ||\n target.id === 'claude-bridge-overlay' ||\n target.closest('#claude-bridge-prompt-dialog')\n ) {\n return;\n }\n\n // Skip if same element\n if (target === hoveredElementRef.current) return;\n\n hoveredElementRef.current = target;\n highlightRef.current?.show(target);\n },\n [active, selectedElement]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!active) return;\n\n const target = e.target as HTMLElement;\n\n // Skip our own overlay elements\n if (\n target.id === 'claude-bridge-highlight' ||\n target.id === 'claude-bridge-overlay' ||\n target.closest('#claude-bridge-prompt-dialog')\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n onElementSelect(target);\n },\n [active, onElementSelect]\n );\n\n // Attach event listeners when active\n useEffect(() => {\n if (!active) {\n highlightRef.current?.hide();\n return;\n }\n\n // Use capture phase to intercept before other handlers\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, handleMouseMove, handleClick]);\n\n if (!active) return null;\n\n return (\n <>\n {/* Full-screen overlay to indicate selection mode */}\n <div\n id=\"claude-bridge-overlay\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 999997,\n pointerEvents: 'none',\n background: 'rgba(0, 0, 0, 0.02)',\n }}\n />\n\n {/* Status indicator */}\n <div\n style={{\n position: 'fixed',\n top: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 999999,\n background: '#6366f1',\n color: 'white',\n padding: '8px 16px',\n borderRadius: 8,\n fontSize: 14,\n fontFamily: 'system-ui, -apple-system, sans-serif',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: '#22c55e',\n animation: 'claude-bridge-pulse 1.5s infinite',\n }}\n />\n Click an element to select it\n <span\n style={{\n opacity: 0.7,\n fontSize: 12,\n marginLeft: 4,\n }}\n >\n (ESC to cancel)\n </span>\n </div>\n\n {/* Pulse animation */}\n <style>\n {`\n @keyframes claude-bridge-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}\n </style>\n </>\n );\n}\n","import React, { useState, useRef, useEffect, type KeyboardEvent } from 'react';\nimport { captureContext } from './context-capture';\n\ninterface PromptDialogProps {\n open: boolean;\n element: HTMLElement | null;\n onSubmit: (prompt: string) => void;\n onClose: () => void;\n onSwitchToQuestionMode?: () => void;\n isSubmitting?: boolean;\n}\n\nexport function PromptDialog({\n open,\n element,\n onSubmit,\n onClose,\n onSwitchToQuestionMode,\n isSubmitting = false,\n}: PromptDialogProps) {\n const [prompt, setPrompt] = useState('');\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n // Focus input when dialog opens\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n }\n }, [open]);\n\n // Clear prompt when dialog closes\n useEffect(() => {\n if (!open) {\n setPrompt('');\n }\n }, [open]);\n\n const handleSubmit = () => {\n if (!prompt.trim() || isSubmitting) return;\n onSubmit(prompt.trim());\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Cmd/Ctrl + Enter\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n // Close on Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n };\n\n if (!open || !element) return null;\n\n const context = captureContext(element);\n\n return (\n <div\n id=\"claude-bridge-prompt-dialog\"\n style={{\n position: 'fixed',\n bottom: 24,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 1000000,\n width: '100%',\n maxWidth: 600,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden',\n }}\n >\n {/* Header with element info */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: '#6366f1',\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 13,\n fontWeight: 500,\n }}\n >\n {context.componentName || context.selectedElement.tagName}\n </span>\n {context.sourceFile && (\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.5)',\n fontSize: 12,\n fontFamily: 'ui-monospace, monospace',\n }}\n >\n {context.sourceFile}\n {context.sourceLine ? `:${context.sourceLine}` : ''}\n </span>\n )}\n <div style={{ flex: 1 }} />\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n borderRadius: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Input area */}\n <div style={{ padding: 16 }}>\n <textarea\n ref={inputRef}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"What would you like Claude to change?\"\n disabled={isSubmitting}\n style={{\n width: '100%',\n minHeight: 80,\n maxHeight: 200,\n padding: 12,\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 8,\n color: 'white',\n fontSize: 14,\n fontFamily: 'inherit',\n resize: 'vertical',\n outline: 'none',\n }}\n />\n\n {/* Suggestions for common tasks */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 12,\n }}\n >\n {['Make this bigger', 'Change the color', 'Add padding', 'Hide this element'].map(\n (suggestion) => (\n <button\n key={suggestion}\n onClick={() => setPrompt(suggestion)}\n disabled={isSubmitting}\n style={{\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 4,\n padding: '4px 8px',\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 12,\n cursor: 'pointer',\n }}\n >\n {suggestion}\n </button>\n )\n )}\n </div>\n </div>\n\n {/* Footer with submit button */}\n <div\n style={{\n padding: '12px 16px',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.4)',\n fontSize: 12,\n }}\n >\n {navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+Enter to submit\n </span>\n {onSwitchToQuestionMode && (\n <button\n onClick={onSwitchToQuestionMode}\n disabled={isSubmitting}\n style={{\n background: 'transparent',\n border: 'none',\n color: '#22c55e',\n fontSize: 12,\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n >\n Just ask a question instead\n </button>\n )}\n </div>\n <button\n onClick={handleSubmit}\n disabled={!prompt.trim() || isSubmitting}\n style={{\n background: prompt.trim() && !isSubmitting ? '#6366f1' : 'rgba(99, 102, 241, 0.3)',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 14,\n fontWeight: 500,\n cursor: prompt.trim() && !isSubmitting ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n {isSubmitting ? (\n <>\n <span\n style={{\n width: 14,\n height: 14,\n border: '2px solid rgba(255, 255, 255, 0.3)',\n borderTopColor: 'white',\n borderRadius: '50%',\n animation: 'claude-bridge-spin 0.8s linear infinite',\n }}\n />\n Sending...\n </>\n ) : (\n 'Send to Claude'\n )}\n </button>\n </div>\n\n {/* Spinner animation */}\n <style>\n {`\n @keyframes claude-bridge-spin {\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n </div>\n );\n}\n","import React, { useState, useRef, useEffect, type KeyboardEvent } from 'react';\nimport { captureContext, capturePageContext } from './context-capture';\n\ninterface QuestionDialogProps {\n open: boolean;\n selectedElement: HTMLElement | null; // Optional - user may have selected an element\n onSubmit: (prompt: string, includeElement: boolean) => void;\n onClose: () => void;\n onSwitchToTaskMode?: () => void;\n isSubmitting?: boolean;\n}\n\nexport function QuestionDialog({\n open,\n selectedElement,\n onSubmit,\n onClose,\n onSwitchToTaskMode,\n isSubmitting = false,\n}: QuestionDialogProps) {\n const [prompt, setPrompt] = useState('');\n const [includeElement, setIncludeElement] = useState(true);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n // Focus input when dialog opens\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n }\n }, [open]);\n\n // Clear prompt when dialog closes\n useEffect(() => {\n if (!open) {\n setPrompt('');\n }\n }, [open]);\n\n // Reset includeElement when element changes\n useEffect(() => {\n setIncludeElement(!!selectedElement);\n }, [selectedElement]);\n\n const handleSubmit = () => {\n if (!prompt.trim() || isSubmitting) return;\n onSubmit(prompt.trim(), includeElement && !!selectedElement);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Cmd/Ctrl + Enter\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n // Close on Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n };\n\n if (!open) return null;\n\n const pageContext = capturePageContext();\n const elementContext = selectedElement ? captureContext(selectedElement) : null;\n\n return (\n <div\n id=\"claude-bridge-question-dialog\"\n style={{\n position: 'fixed',\n bottom: 24,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 1000000,\n width: '100%',\n maxWidth: 600,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden',\n }}\n >\n {/* Header with page/element info */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: '#22c55e', // Green to differentiate from task dialog\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 13,\n fontWeight: 500,\n }}\n >\n Ask a Question\n </span>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.5)',\n fontSize: 12,\n }}\n >\n {pageContext.pageTitle}\n </span>\n <div style={{ flex: 1 }} />\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n borderRadius: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Element selection indicator */}\n {selectedElement && (\n <div\n style={{\n padding: '8px 16px',\n background: 'rgba(34, 197, 94, 0.1)',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n cursor: 'pointer',\n flex: 1,\n }}\n >\n <input\n type=\"checkbox\"\n checked={includeElement}\n onChange={(e) => setIncludeElement(e.target.checked)}\n style={{ cursor: 'pointer' }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 12,\n }}\n >\n Include selected element:\n </span>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 12,\n fontFamily: 'ui-monospace, monospace',\n }}\n >\n {elementContext?.componentName || elementContext?.selectedElement.tagName}\n {elementContext?.sourceFile && (\n <span style={{ color: 'rgba(255, 255, 255, 0.5)', marginLeft: 4 }}>\n ({elementContext.sourceFile}\n {elementContext.sourceLine ? `:${elementContext.sourceLine}` : ''})\n </span>\n )}\n </span>\n </label>\n </div>\n )}\n\n {/* Input area */}\n <div style={{ padding: 16 }}>\n <textarea\n ref={inputRef}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Ask a question about this page or codebase...\"\n disabled={isSubmitting}\n style={{\n width: '100%',\n minHeight: 80,\n maxHeight: 200,\n padding: 12,\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 8,\n color: 'white',\n fontSize: 14,\n fontFamily: 'inherit',\n resize: 'vertical',\n outline: 'none',\n }}\n />\n\n {/* Suggestions for common questions */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 12,\n }}\n >\n {[\n 'What does this page do?',\n 'Where are the backend routes?',\n 'How does this component work?',\n 'What API calls does this make?',\n ].map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => setPrompt(suggestion)}\n disabled={isSubmitting}\n style={{\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 4,\n padding: '4px 8px',\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 12,\n cursor: 'pointer',\n }}\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n\n {/* Footer with submit button */}\n <div\n style={{\n padding: '12px 16px',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.4)',\n fontSize: 12,\n }}\n >\n {navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+Enter to submit\n </span>\n {onSwitchToTaskMode && (\n <button\n onClick={onSwitchToTaskMode}\n disabled={isSubmitting}\n style={{\n background: 'transparent',\n border: 'none',\n color: '#6366f1',\n fontSize: 12,\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n >\n Make changes instead\n </button>\n )}\n </div>\n <button\n onClick={handleSubmit}\n disabled={!prompt.trim() || isSubmitting}\n style={{\n background: prompt.trim() && !isSubmitting ? '#22c55e' : 'rgba(34, 197, 94, 0.3)',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 14,\n fontWeight: 500,\n cursor: prompt.trim() && !isSubmitting ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n {isSubmitting ? (\n <>\n <span\n style={{\n width: 14,\n height: 14,\n border: '2px solid rgba(255, 255, 255, 0.3)',\n borderTopColor: 'white',\n borderRadius: '50%',\n animation: 'claude-bridge-spin 0.8s linear infinite',\n }}\n />\n Asking...\n </>\n ) : (\n 'Ask Claude'\n )}\n </button>\n </div>\n\n {/* Spinner animation */}\n <style>\n {`\n @keyframes claude-bridge-spin {\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n </div>\n );\n}\n","import React, { useEffect, useState, useRef, useCallback } from 'react';\nimport type { BrowserTask } from '@zed-controller/shared';\nimport { ClaudeTerminal } from './ClaudeTerminal';\n\ninterface TaskStatusToastProps {\n task: BrowserTask | null;\n serverUrl: string;\n token: string;\n onDismiss: () => void;\n /** If true, clicking X will kill the session. Default: true */\n killOnClose?: boolean;\n}\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 300;\nconst DEFAULT_WIDTH = 700;\nconst DEFAULT_HEIGHT = 500;\n\nexport function TaskStatusToast({\n task,\n serverUrl,\n token,\n onDismiss,\n killOnClose = true,\n}: TaskStatusToastProps) {\n const [visible, setVisible] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [size, setSize] = useState({ width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT });\n const [isResizing, setIsResizing] = useState(false);\n const resizeRef = useRef<{ startX: number; startY: number; startWidth: number; startHeight: number } | null>(null);\n\n useEffect(() => {\n if (task) {\n setVisible(true);\n // Auto-expand when task starts running and has a sessionId\n if (task.sessionId && (task.status === 'running' || task.status === 'starting')) {\n setExpanded(true);\n }\n }\n }, [task, task?.sessionId, task?.status]);\n\n useEffect(() => {\n // Auto-hide after 30 seconds for completed/failed tasks (only when collapsed)\n if (task && !expanded && (task.status === 'completed' || task.status === 'failed')) {\n const timer = setTimeout(() => {\n setVisible(false);\n setTimeout(onDismiss, 300);\n }, 10000);\n return () => clearTimeout(timer);\n }\n }, [task?.status, expanded, onDismiss]);\n\n // Handle resize\n const handleResizeStart = useCallback((e: React.MouseEvent, direction: string) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startWidth: size.width,\n startHeight: size.height,\n };\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n if (!resizeRef.current) return;\n\n let newWidth = resizeRef.current.startWidth;\n let newHeight = resizeRef.current.startHeight;\n\n if (direction.includes('w')) {\n newWidth = resizeRef.current.startWidth - (moveEvent.clientX - resizeRef.current.startX);\n }\n if (direction.includes('n')) {\n newHeight = resizeRef.current.startHeight - (moveEvent.clientY - resizeRef.current.startY);\n }\n\n setSize({\n width: Math.max(MIN_WIDTH, newWidth),\n height: Math.max(MIN_HEIGHT, newHeight),\n });\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n resizeRef.current = null;\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [size]);\n\n // Kill the session via WebSocket\n const killSession = useCallback((sessionId: string) => {\n return new Promise<void>((resolve) => {\n const wsUrl = serverUrl.replace(/^http/, 'ws').replace(/\\/$/, '');\n const ws = new WebSocket(`${wsUrl}/ws/bridge?token=${encodeURIComponent(token)}`);\n\n ws.onopen = () => {\n ws.send(JSON.stringify({\n type: 'kill_session',\n sessionId,\n }));\n // Give it a moment to process, then close\n setTimeout(() => {\n ws.close();\n resolve();\n }, 100);\n };\n\n ws.onerror = () => {\n ws.close();\n resolve(); // Resolve anyway to not block dismiss\n };\n\n // Timeout fallback\n setTimeout(() => {\n if (ws.readyState !== WebSocket.CLOSED) {\n ws.close();\n }\n resolve();\n }, 2000);\n });\n }, [serverUrl, token]);\n\n const handleDismiss = useCallback(async () => {\n // Kill the session if killOnClose is true and we have a session\n if (killOnClose && task?.sessionId) {\n await killSession(task.sessionId);\n }\n\n setVisible(false);\n setExpanded(false);\n setTimeout(onDismiss, 300);\n }, [killOnClose, task?.sessionId, killSession, onDismiss]);\n\n const handleToggleExpand = useCallback(() => {\n setExpanded(!expanded);\n }, [expanded]);\n\n // Early return after all hooks\n if (!task || !visible) return null;\n\n const statusColors: Record<string, { bg: string; text: string }> = {\n queued: { bg: '#6366f1', text: 'Queued' },\n starting: { bg: '#f59e0b', text: 'Starting...' },\n running: { bg: '#22c55e', text: 'Running' },\n completed: { bg: '#22c55e', text: 'Completed' },\n failed: { bg: '#ef4444', text: 'Failed' },\n };\n\n const status = statusColors[task.status] || statusColors.queued;\n\n const zedUrl = task.sessionId\n ? `${serverUrl}?token=${encodeURIComponent(token)}&session=${task.sessionId}`\n : `${serverUrl}?token=${encodeURIComponent(token)}`;\n\n const handleOpenZed = () => {\n window.open(zedUrl, '_blank');\n };\n\n // Collapsed view (mini toast)\n if (!expanded) {\n return (\n <div\n style={{\n position: 'fixed',\n bottom: 24,\n right: 24,\n zIndex: 1000001,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n minWidth: 320,\n maxWidth: 400,\n opacity: visible ? 1 : 0,\n transform: visible ? 'translateY(0)' : 'translateY(20px)',\n transition: 'opacity 0.3s, transform 0.3s',\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n }}\n >\n <div\n style={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n background: status.bg,\n animation: task.status === 'running' || task.status === 'starting'\n ? 'claude-bridge-pulse 1.5s infinite'\n : 'none',\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 14,\n fontWeight: 500,\n flex: 1,\n }}\n >\n Claude Task: {status.text}\n </span>\n <button\n onClick={handleDismiss}\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '12px 16px' }}>\n <p\n style={{\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 13,\n margin: 0,\n lineHeight: 1.5,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {task.prompt}\n </p>\n\n {task.error && (\n <p\n style={{\n color: '#ef4444',\n fontSize: 12,\n margin: '8px 0 0',\n }}\n >\n Error: {task.error}\n </p>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '12px 16px',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 8,\n }}\n >\n {task.sessionId && (\n <button\n onClick={handleToggleExpand}\n style={{\n background: '#374151',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 13,\n fontWeight: 500,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n Show Terminal\n </button>\n )}\n <button\n onClick={handleOpenZed}\n style={{\n background: '#6366f1',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 13,\n fontWeight: 500,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n Open in Zed Controller\n <span style={{ fontSize: 11 }}>↗</span>\n </button>\n </div>\n\n <style>\n {`\n @keyframes claude-bridge-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}\n </style>\n </div>\n );\n }\n\n // Expanded view with terminal\n return (\n <div\n style={{\n position: 'fixed',\n bottom: 24,\n right: 24,\n zIndex: 1000001,\n width: size.width,\n height: size.height,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.4)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n display: 'flex',\n flexDirection: 'column',\n opacity: visible ? 1 : 0,\n transition: isResizing ? 'none' : 'opacity 0.3s',\n overflow: 'hidden',\n }}\n >\n {/* Resize handles */}\n <div\n onMouseDown={(e) => handleResizeStart(e, 'n')}\n style={{\n position: 'absolute',\n top: 0,\n left: 20,\n right: 20,\n height: 6,\n cursor: 'ns-resize',\n zIndex: 10,\n }}\n />\n <div\n onMouseDown={(e) => handleResizeStart(e, 'w')}\n style={{\n position: 'absolute',\n left: 0,\n top: 20,\n bottom: 20,\n width: 6,\n cursor: 'ew-resize',\n zIndex: 10,\n }}\n />\n <div\n onMouseDown={(e) => handleResizeStart(e, 'nw')}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: 20,\n height: 20,\n cursor: 'nwse-resize',\n zIndex: 11,\n }}\n />\n\n {/* Header */}\n <div\n style={{\n padding: '10px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n background: status.bg,\n animation: task.status === 'running' || task.status === 'starting'\n ? 'claude-bridge-pulse 1.5s infinite'\n : 'none',\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 14,\n fontWeight: 500,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={task.prompt}\n >\n {status.text}: {task.prompt.slice(0, 50)}{task.prompt.length > 50 ? '...' : ''}\n </span>\n <button\n onClick={handleToggleExpand}\n title=\"Minimize\"\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 14,\n lineHeight: 1,\n }}\n >\n −\n </button>\n <button\n onClick={handleOpenZed}\n title=\"Open in Zed Controller\"\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 14,\n lineHeight: 1,\n }}\n >\n ↗\n </button>\n <button\n onClick={handleDismiss}\n title=\"Close\"\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Terminal */}\n <div style={{ flex: 1, minHeight: 0 }}>\n {task.sessionId ? (\n <ClaudeTerminal\n serverUrl={serverUrl}\n token={token}\n sessionId={task.sessionId}\n style={{ width: '100%', height: '100%' }}\n />\n ) : (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: 'rgba(255, 255, 255, 0.5)',\n }}\n >\n Waiting for session...\n </div>\n )}\n </div>\n\n {/* Error banner if any */}\n {task.error && (\n <div\n style={{\n padding: '8px 16px',\n background: 'rgba(239, 68, 68, 0.2)',\n borderTop: '1px solid rgba(239, 68, 68, 0.3)',\n color: '#ef4444',\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n Error: {task.error}\n </div>\n )}\n\n <style>\n {`\n @keyframes claude-bridge-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}\n </style>\n </div>\n );\n}\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport { WebglAddon } from '@xterm/addon-webgl';\nimport type { Session } from '@zed-controller/shared';\n\n// Import xterm CSS - consumers will need to include this\nimport '@xterm/xterm/css/xterm.css';\n\n// Critical xterm CSS for interactivity - ensures terminal works even if CSS import fails\nconst XTERM_CRITICAL_CSS = `\n.xterm {\n cursor: text;\n position: relative;\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n}\n.xterm.focus,\n.xterm:focus {\n outline: none;\n}\n.xterm .xterm-helpers {\n position: absolute;\n top: 0;\n z-index: 5;\n}\n.xterm .xterm-helper-textarea {\n padding: 0;\n border: 0;\n margin: 0;\n position: absolute;\n opacity: 0;\n left: -9999em;\n top: 0;\n width: 0;\n height: 0;\n z-index: -5;\n white-space: nowrap;\n overflow: hidden;\n resize: none;\n}\n.xterm .xterm-helper-textarea:focus {\n outline: none;\n}\n.xterm .composition-view {\n background: #000;\n color: #FFF;\n display: none;\n position: absolute;\n white-space: nowrap;\n z-index: 1;\n}\n.xterm .composition-view.active {\n display: block;\n}\n.xterm .xterm-viewport {\n background-color: #000;\n overflow-y: scroll;\n cursor: default;\n position: absolute;\n right: 0;\n left: 0;\n top: 0;\n bottom: 0;\n}\n.xterm .xterm-screen {\n position: relative;\n}\n.xterm .xterm-screen canvas {\n position: absolute;\n left: 0;\n top: 0;\n}\n.xterm-char-measure-element {\n display: inline-block;\n visibility: hidden;\n position: absolute;\n top: 0;\n left: -9999em;\n line-height: normal;\n}\n.xterm.enable-mouse-events {\n cursor: default;\n}\n.xterm .xterm-cursor-pointer {\n cursor: pointer;\n}\n.xterm.xterm-cursor-style-block .xterm-cursor:not(.xterm-cursor-blink),\n.xterm.xterm-cursor-style-bar .xterm-cursor:not(.xterm-cursor-blink),\n.xterm.xterm-cursor-style-underline .xterm-cursor:not(.xterm-cursor-blink) {\n visibility: visible;\n}\n`;\n\nexport interface ClaudeTerminalProps {\n /** The WebSocket server URL (e.g., \"https://localhost:3456\") */\n serverUrl: string;\n /** Authentication token */\n token: string;\n /** Session ID to attach to, or undefined to show session picker */\n sessionId?: string;\n /** Called when a session is selected (when sessionId is not provided) */\n onSessionSelect?: (session: Session) => void;\n /** Called when connection status changes */\n onConnectionChange?: (connected: boolean) => void;\n /** Called when sessions list updates */\n onSessionsUpdate?: (sessions: Session[]) => void;\n /** Custom terminal options */\n terminalOptions?: {\n fontSize?: number;\n fontFamily?: string;\n theme?: {\n background?: string;\n foreground?: string;\n cursor?: string;\n };\n };\n /** Custom styles for the container */\n style?: React.CSSProperties;\n /** Custom class name */\n className?: string;\n}\n\ninterface TerminalMessage {\n type: string;\n sessionId?: string;\n scrollback?: string;\n data?: string;\n sessions?: Session[];\n error?: string;\n}\n\nexport function ClaudeTerminal({\n serverUrl,\n token,\n sessionId,\n onSessionSelect,\n onConnectionChange,\n onSessionsUpdate,\n terminalOptions = {},\n style,\n className,\n}: ClaudeTerminalProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const terminalRef = useRef<Terminal | null>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const wsRef = useRef<WebSocket | null>(null);\n const handleMessageRef = useRef<((event: MessageEvent) => void) | null>(null);\n const [connected, setConnected] = useState(false);\n const [sessions, setSessions] = useState<Session[]>([]);\n const [attachedSessionId, setAttachedSessionId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Initialize terminal\n useEffect(() => {\n if (!containerRef.current) return;\n\n const terminal = new Terminal({\n cursorBlink: true,\n cursorStyle: 'block',\n fontSize: terminalOptions.fontSize ?? 14,\n fontFamily: terminalOptions.fontFamily ?? 'Menlo, Monaco, \"Courier New\", monospace',\n theme: {\n background: terminalOptions.theme?.background ?? '#1a1a1a',\n foreground: terminalOptions.theme?.foreground ?? '#f0f0f0',\n cursor: terminalOptions.theme?.cursor ?? '#f0f0f0',\n cursorAccent: '#1a1a1a',\n black: '#1a1a1a',\n red: '#ff5555',\n green: '#50fa7b',\n yellow: '#f1fa8c',\n blue: '#6272a4',\n magenta: '#ff79c6',\n cyan: '#8be9fd',\n white: '#f8f8f2',\n brightBlack: '#6272a4',\n brightRed: '#ff6e6e',\n brightGreen: '#69ff94',\n brightYellow: '#ffffa5',\n brightBlue: '#d6acff',\n brightMagenta: '#ff92df',\n brightCyan: '#a4ffff',\n brightWhite: '#ffffff',\n },\n allowProposedApi: true,\n scrollback: 10000,\n disableStdin: false,\n allowTransparency: true,\n });\n\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n\n terminal.open(containerRef.current);\n\n // Try to load WebGL addon\n try {\n const webglAddon = new WebglAddon();\n webglAddon.onContextLoss(() => {\n webglAddon.dispose();\n });\n terminal.loadAddon(webglAddon);\n } catch (e) {\n console.warn('[ClaudeTerminal] WebGL addon could not be loaded:', e);\n }\n\n terminalRef.current = terminal;\n fitAddonRef.current = fitAddon;\n\n // Fit terminal\n requestAnimationFrame(() => {\n fitAddon.fit();\n });\n\n // Setup resize observer\n const resizeObserver = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n fitAddon.fit();\n // Send resize to server\n if (wsRef.current?.readyState === WebSocket.OPEN && attachedSessionId) {\n wsRef.current.send(JSON.stringify({\n type: 'terminal_resize',\n sessionId: attachedSessionId,\n cols: terminal.cols,\n rows: terminal.rows,\n }));\n }\n });\n });\n resizeObserver.observe(containerRef.current);\n\n return () => {\n resizeObserver.disconnect();\n terminal.dispose();\n terminalRef.current = null;\n fitAddonRef.current = null;\n };\n }, [terminalOptions.fontSize, terminalOptions.fontFamily, terminalOptions.theme]);\n\n // Handle terminal input\n useEffect(() => {\n const terminal = terminalRef.current;\n if (!terminal) return;\n\n const disposable = terminal.onData((data) => {\n if (wsRef.current?.readyState === WebSocket.OPEN && attachedSessionId) {\n wsRef.current.send(JSON.stringify({\n type: 'terminal_input',\n sessionId: attachedSessionId,\n data,\n }));\n }\n });\n\n return () => disposable.dispose();\n }, [attachedSessionId]);\n\n // Handle WebSocket messages - use ref to avoid recreating WebSocket on handler change\n // Store attached session ID in a ref for the message handler to avoid dependency issues\n const attachedSessionIdRef = useRef<string | null>(null);\n attachedSessionIdRef.current = attachedSessionId;\n\n // Keep the callback stable by using refs for changing values\n useEffect(() => {\n handleMessageRef.current = (event: MessageEvent) => {\n try {\n const message: TerminalMessage = JSON.parse(event.data);\n\n switch (message.type) {\n case 'connected':\n // Request sessions list\n wsRef.current?.send(JSON.stringify({ type: 'get_sessions' }));\n break;\n\n case 'sessions_list':\n if (message.sessions) {\n setSessions(message.sessions);\n onSessionsUpdate?.(message.sessions);\n }\n break;\n\n case 'terminal_attached':\n if (message.sessionId) {\n setAttachedSessionId(message.sessionId);\n setError(null);\n // Write scrollback to terminal\n if (message.scrollback && terminalRef.current) {\n terminalRef.current.write(message.scrollback);\n }\n // Fit and send resize\n if (fitAddonRef.current && terminalRef.current) {\n fitAddonRef.current.fit();\n wsRef.current?.send(JSON.stringify({\n type: 'terminal_resize',\n sessionId: message.sessionId,\n cols: terminalRef.current.cols,\n rows: terminalRef.current.rows,\n }));\n }\n }\n break;\n\n case 'terminal_output':\n if (message.data && terminalRef.current && message.sessionId === attachedSessionIdRef.current) {\n terminalRef.current.write(message.data);\n }\n break;\n\n case 'terminal_detached':\n if (message.sessionId === attachedSessionIdRef.current) {\n setAttachedSessionId(null);\n }\n break;\n\n case 'error':\n setError(message.error || 'Unknown error');\n console.error('[ClaudeTerminal] Error:', message.error);\n break;\n\n case 'pong':\n // Keep-alive response\n break;\n }\n } catch (e) {\n console.error('[ClaudeTerminal] Failed to parse message:', e);\n }\n };\n }, [onSessionsUpdate]);\n\n // Connect WebSocket - use stable dependencies to avoid reconnection loops\n useEffect(() => {\n const wsUrl = serverUrl.replace(/^http/, 'ws').replace(/\\/$/, '');\n const ws = new WebSocket(`${wsUrl}/ws/bridge?token=${encodeURIComponent(token)}`);\n\n ws.onopen = () => {\n setConnected(true);\n setError(null);\n onConnectionChange?.(true);\n };\n\n // Use ref to call the current message handler without creating dependency\n ws.onmessage = (event) => {\n handleMessageRef.current?.(event);\n };\n\n ws.onclose = () => {\n setConnected(false);\n setAttachedSessionId(null);\n onConnectionChange?.(false);\n };\n\n ws.onerror = () => {\n setError('WebSocket connection error');\n };\n\n wsRef.current = ws;\n\n // Ping interval\n const pingInterval = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'ping' }));\n }\n }, 30000);\n\n return () => {\n clearInterval(pingInterval);\n ws.close();\n wsRef.current = null;\n };\n }, [serverUrl, token, onConnectionChange]);\n\n // Auto-attach when sessionId is provided and we're connected\n useEffect(() => {\n if (sessionId && connected && !attachedSessionId) {\n wsRef.current?.send(JSON.stringify({\n type: 'attach_terminal',\n sessionId,\n }));\n }\n }, [sessionId, connected, attachedSessionId]);\n\n // Focus terminal when attached to a session\n useEffect(() => {\n if (attachedSessionId && terminalRef.current && fitAddonRef.current) {\n // Small delay to ensure terminal is ready and sized\n const timer = setTimeout(() => {\n fitAddonRef.current?.fit();\n terminalRef.current?.focus();\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [attachedSessionId]);\n\n // Handle container click to focus terminal\n const handleContainerClick = useCallback(() => {\n terminalRef.current?.focus();\n }, []);\n\n // Handle session selection\n const handleSelectSession = useCallback((session: Session) => {\n // Clear terminal\n terminalRef.current?.clear();\n\n // Detach from current session if any\n if (attachedSessionId) {\n wsRef.current?.send(JSON.stringify({\n type: 'detach_terminal',\n sessionId: attachedSessionId,\n }));\n }\n\n // Attach to new session\n wsRef.current?.send(JSON.stringify({\n type: 'attach_terminal',\n sessionId: session.id,\n }));\n\n onSessionSelect?.(session);\n }, [attachedSessionId, onSessionSelect]);\n\n // If no sessionId provided, show session picker\n if (!sessionId && !attachedSessionId) {\n return (\n <div\n className={className}\n style={{\n background: '#1a1a1a',\n color: '#f0f0f0',\n padding: '20px',\n fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n ...style,\n }}\n >\n {!connected ? (\n <div>Connecting to server...</div>\n ) : error ? (\n <div style={{ color: '#ff5555' }}>Error: {error}</div>\n ) : sessions.length === 0 ? (\n <div>No Claude sessions available</div>\n ) : (\n <div>\n <div style={{ marginBottom: '10px', fontSize: '14px' }}>\n Select a Claude session:\n </div>\n {sessions.map((session) => (\n <div\n key={session.id}\n onClick={() => handleSelectSession(session)}\n style={{\n padding: '10px',\n margin: '5px 0',\n background: '#2a2a2a',\n borderRadius: '4px',\n cursor: 'pointer',\n border: '1px solid #3a3a3a',\n }}\n onMouseOver={(e) => {\n e.currentTarget.style.background = '#3a3a3a';\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.background = '#2a2a2a';\n }}\n >\n <div style={{ fontWeight: 'bold' }}>\n {session.displayName || session.name}\n </div>\n <div style={{ fontSize: '12px', color: '#888', marginTop: '4px' }}>\n {session.workingDir}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <>\n <style>\n {XTERM_CRITICAL_CSS}\n </style>\n <div\n ref={containerRef}\n className={className}\n onClick={handleContainerClick}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n />\n </>\n );\n}\n\nexport default ClaudeTerminal;\n"],"mappings":"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","names":["import_react","html2canvas","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react","import_xterm","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/ClaudeBridgeProvider.tsx","../src/websocket-client.ts","../src/context-capture.ts","../src/screenshot-capture.ts","../src/SelectionOverlay.tsx","../src/PromptDialog.tsx","../src/QuestionDialog.tsx","../src/TaskStatusToast.tsx","../src/ClaudeTerminal.tsx"],"sourcesContent":["// Main exports\nexport { ClaudeBridgeProvider, useClaudeBridge } from './ClaudeBridgeProvider';\nexport { ClaudeTerminal } from './ClaudeTerminal';\nexport type { ClaudeTerminalProps } from './ClaudeTerminal';\nexport { TaskStatusToast } from './TaskStatusToast';\n\n// Types\nexport type {\n ClaudeBridgeConfig,\n ClaudeBridgeState,\n ClaudeBridgeContextValue,\n} from './types';\n\n// Re-export shared types for convenience\nexport type {\n SelectionContext,\n BrowserTask,\n CreateTaskRequest,\n CreateTaskResponse,\n TaskProgressEvent,\n Session,\n} from '@zed-controller/shared';\n\n// Utilities (for advanced usage)\nexport { captureContext, capturePageContext } from './context-capture';\nexport { captureElementScreenshot } from './screenshot-capture';\n","import React, {\n createContext,\n useContext,\n useReducer,\n useEffect,\n useCallback,\n useRef,\n type ReactNode,\n} from 'react';\nimport type {\n ClaudeBridgeConfig,\n ClaudeBridgeState,\n ClaudeBridgeAction,\n ClaudeBridgeContextValue,\n BridgeWebSocketMessage,\n} from './types';\nimport type { BrowserTask } from '@zed-controller/shared';\nimport { BridgeWebSocketClient } from './websocket-client';\nimport { captureContext, capturePageContext } from './context-capture';\nimport { captureElementScreenshot } from './screenshot-capture';\nimport { SelectionOverlay } from './SelectionOverlay';\nimport { PromptDialog } from './PromptDialog';\nimport { QuestionDialog } from './QuestionDialog';\nimport { TaskStatusToast } from './TaskStatusToast';\n\nconst initialState: ClaudeBridgeState = {\n connected: false,\n selectionMode: false,\n questionMode: false,\n selectedElement: null,\n activeTask: null,\n tasks: [],\n};\n\nfunction reducer(state: ClaudeBridgeState, action: ClaudeBridgeAction): ClaudeBridgeState {\n switch (action.type) {\n case 'SET_CONNECTED':\n return { ...state, connected: action.connected };\n case 'SET_SELECTION_MODE':\n return {\n ...state,\n selectionMode: action.enabled,\n questionMode: action.enabled ? false : state.questionMode, // Turn off question mode when entering selection mode\n selectedElement: action.enabled ? state.selectedElement : null,\n };\n case 'SET_QUESTION_MODE':\n return {\n ...state,\n questionMode: action.enabled,\n selectionMode: action.enabled ? false : state.selectionMode, // Turn off selection mode when entering question mode\n };\n case 'SET_SELECTED_ELEMENT':\n return { ...state, selectedElement: action.element };\n case 'SET_ACTIVE_TASK':\n return { ...state, activeTask: action.task };\n case 'ADD_TASK':\n return { ...state, tasks: [...state.tasks, action.task] };\n case 'UPDATE_TASK':\n return {\n ...state,\n tasks: state.tasks.map((t) =>\n t.id === action.taskId ? { ...t, ...action.updates } : t\n ),\n activeTask:\n state.activeTask?.id === action.taskId\n ? { ...state.activeTask, ...action.updates }\n : state.activeTask,\n };\n case 'CLEAR_TASKS':\n return { ...state, tasks: [], activeTask: null };\n default:\n return state;\n }\n}\n\nconst ClaudeBridgeContext = createContext<ClaudeBridgeContextValue | null>(null);\n\nexport interface ClaudeBridgeProviderProps {\n children: ReactNode;\n serverUrl: string;\n token: string;\n enabled?: boolean;\n projectRoot?: string;\n shortcut?: string;\n questionShortcut?: string; // Default: 'Meta+Shift+/' for question mode\n onTaskCreated?: (taskId: string) => void;\n onTaskProgress?: (taskId: string, output: string) => void;\n onTaskCompleted?: (taskId: string) => void;\n onTaskFailed?: (taskId: string, error: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport function ClaudeBridgeProvider({\n children,\n serverUrl,\n token,\n enabled = true,\n projectRoot,\n shortcut = 'Meta+Shift+K',\n questionShortcut = 'Meta+Shift+?',\n onTaskCreated,\n onTaskProgress,\n onTaskCompleted,\n onTaskFailed,\n onError,\n}: ClaudeBridgeProviderProps) {\n const [state, dispatch] = useReducer(reducer, initialState);\n const wsClientRef = useRef<BridgeWebSocketClient | null>(null);\n const pendingTaskResolveRef = useRef<((taskId: string | null) => void) | null>(null);\n\n const config: ClaudeBridgeConfig = {\n serverUrl,\n token,\n enabled,\n projectRoot,\n shortcut,\n questionShortcut,\n onTaskCreated,\n onTaskProgress,\n onTaskCompleted,\n onTaskFailed,\n onError,\n };\n\n // Initialize WebSocket client\n useEffect(() => {\n if (!enabled) return;\n\n const client = new BridgeWebSocketClient(config);\n wsClientRef.current = client;\n\n // Handle connection state\n const unsubConnection = client.onConnection((connected) => {\n dispatch({ type: 'SET_CONNECTED', connected });\n });\n\n // Handle messages\n const unsubMessage = client.onMessage((message: BridgeWebSocketMessage) => {\n handleMessage(message);\n });\n\n // Connect\n client.connect();\n\n return () => {\n unsubConnection();\n unsubMessage();\n client.disconnect();\n wsClientRef.current = null;\n };\n }, [enabled, serverUrl, token]);\n\n // Handle incoming WebSocket messages\n const handleMessage = useCallback((message: BridgeWebSocketMessage) => {\n switch (message.type) {\n case 'task_created':\n if (message.task) {\n dispatch({ type: 'ADD_TASK', task: message.task });\n dispatch({ type: 'SET_ACTIVE_TASK', task: message.task });\n onTaskCreated?.(message.task.id);\n pendingTaskResolveRef.current?.(message.task.id);\n pendingTaskResolveRef.current = null;\n }\n break;\n\n case 'task_progress':\n if (message.taskId && message.output) {\n dispatch({\n type: 'UPDATE_TASK',\n taskId: message.taskId,\n updates: { status: 'running' },\n });\n onTaskProgress?.(message.taskId, message.output);\n }\n break;\n\n case 'task_completed':\n if (message.taskId) {\n dispatch({\n type: 'UPDATE_TASK',\n taskId: message.taskId,\n updates: {\n status: 'completed',\n completedAt: new Date().toISOString(),\n },\n });\n onTaskCompleted?.(message.taskId);\n }\n break;\n\n case 'task_failed':\n if (message.taskId) {\n dispatch({\n type: 'UPDATE_TASK',\n taskId: message.taskId,\n updates: {\n status: 'failed',\n error: message.error,\n completedAt: new Date().toISOString(),\n },\n });\n onTaskFailed?.(message.taskId, message.error || 'Unknown error');\n pendingTaskResolveRef.current?.(null);\n pendingTaskResolveRef.current = null;\n }\n break;\n\n case 'pong':\n // Keep-alive response, ignore\n break;\n\n default:\n console.log('[ClaudeBridge] Unknown message type:', message.type);\n }\n }, [onTaskCreated, onTaskProgress, onTaskCompleted, onTaskFailed]);\n\n // Helper to check if a shortcut matches a keyboard event\n const matchesShortcut = useCallback((e: KeyboardEvent, shortcutStr: string): boolean => {\n const keys = shortcutStr.split('+');\n const requiresMeta = keys.includes('Meta');\n const requiresCtrl = keys.includes('Ctrl');\n const requiresShift = keys.includes('Shift');\n const requiresAlt = keys.includes('Alt');\n const key = keys.find((k) => !['Meta', 'Ctrl', 'Shift', 'Alt'].includes(k));\n\n return (\n (requiresMeta ? e.metaKey : true) &&\n (requiresCtrl ? e.ctrlKey : true) &&\n (requiresShift ? e.shiftKey : true) &&\n (requiresAlt ? e.altKey : true) &&\n e.key.toUpperCase() === key?.toUpperCase()\n );\n }, []);\n\n // Keyboard shortcut handler\n useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Check for selection mode shortcut (Meta+Shift+K)\n if (matchesShortcut(e, shortcut)) {\n e.preventDefault();\n if (!state.selectionMode) {\n // Entering selection mode - clear any previous active task\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n }\n dispatch({ type: 'SET_SELECTION_MODE', enabled: !state.selectionMode });\n return;\n }\n\n // Check for question mode shortcut (Meta+Shift+/)\n if (matchesShortcut(e, questionShortcut)) {\n e.preventDefault();\n if (!state.questionMode) {\n // Entering question mode - clear any previous active task\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n }\n dispatch({ type: 'SET_QUESTION_MODE', enabled: !state.questionMode });\n return;\n }\n\n // Escape to cancel any mode\n if (e.key === 'Escape') {\n if (state.selectionMode) {\n dispatch({ type: 'SET_SELECTION_MODE', enabled: false });\n }\n if (state.questionMode) {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [enabled, shortcut, questionShortcut, state.selectionMode, state.questionMode, matchesShortcut]);\n\n const enableSelectionMode = useCallback(() => {\n // Clear any previous active task when entering selection mode\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n dispatch({ type: 'SET_SELECTION_MODE', enabled: true });\n }, []);\n\n const disableSelectionMode = useCallback(() => {\n dispatch({ type: 'SET_SELECTION_MODE', enabled: false });\n }, []);\n\n const enableQuestionMode = useCallback(() => {\n // Clear any previous active task when entering question mode\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n dispatch({ type: 'SET_QUESTION_MODE', enabled: true });\n }, []);\n\n const disableQuestionMode = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n }, []);\n\n const submitTask = useCallback(async (prompt: string): Promise<string | null> => {\n if (!state.selectedElement || !wsClientRef.current?.isConnected) {\n return null;\n }\n\n // Capture context\n const context = captureContext(state.selectedElement);\n console.log('[ClaudeBridge] submitTask captured context:', {\n sourceFile: context.sourceFile,\n sourceLine: context.sourceLine,\n componentName: context.componentName,\n element: state.selectedElement.tagName,\n });\n\n // Capture screenshot\n const screenshot = await captureElementScreenshot(state.selectedElement);\n\n const fullContext = {\n ...context,\n screenshot,\n };\n\n // Create promise to wait for task creation response\n const taskIdPromise = new Promise<string | null>((resolve) => {\n pendingTaskResolveRef.current = resolve;\n // Timeout after 10 seconds\n setTimeout(() => {\n if (pendingTaskResolveRef.current === resolve) {\n pendingTaskResolveRef.current = null;\n resolve(null);\n }\n }, 10000);\n });\n\n // Send task creation request\n const sent = wsClientRef.current.createTask(prompt, fullContext);\n if (!sent) {\n pendingTaskResolveRef.current = null;\n return null;\n }\n\n // Clear selection mode\n dispatch({ type: 'SET_SELECTION_MODE', enabled: false });\n\n return taskIdPromise;\n }, [state.selectedElement]);\n\n const continueTask = useCallback(async (taskId: string, prompt: string): Promise<void> => {\n if (!wsClientRef.current?.isConnected) {\n throw new Error('Not connected');\n }\n\n // If there's a selected element, include its context\n let context = undefined;\n if (state.selectedElement) {\n const baseContext = captureContext(state.selectedElement);\n const screenshot = await captureElementScreenshot(state.selectedElement);\n context = { ...baseContext, screenshot };\n }\n\n const sent = wsClientRef.current.continueTask(taskId, prompt, context);\n if (!sent) {\n throw new Error('Failed to send continue task message');\n }\n }, [state.selectedElement]);\n\n // Submit a question (doesn't require element selection)\n const submitQuestion = useCallback(async (prompt: string, includeSelectedElement: boolean = false): Promise<string | null> => {\n if (!wsClientRef.current?.isConnected) {\n return null;\n }\n\n // Use page context or element context based on flag\n let context;\n if (includeSelectedElement && state.selectedElement) {\n const baseContext = captureContext(state.selectedElement);\n const screenshot = await captureElementScreenshot(state.selectedElement);\n context = { ...baseContext, screenshot };\n } else {\n // Use page-level context\n context = capturePageContext();\n }\n\n // Prefix the prompt to indicate this is a question (no changes expected)\n const questionPrompt = `[QUESTION - No code changes expected, just provide information]\\n\\n${prompt}`;\n\n // Create promise to wait for task creation response\n const taskIdPromise = new Promise<string | null>((resolve) => {\n pendingTaskResolveRef.current = resolve;\n // Timeout after 10 seconds\n setTimeout(() => {\n if (pendingTaskResolveRef.current === resolve) {\n pendingTaskResolveRef.current = null;\n resolve(null);\n }\n }, 10000);\n });\n\n // Send task creation request\n const sent = wsClientRef.current.createTask(questionPrompt, context);\n if (!sent) {\n pendingTaskResolveRef.current = null;\n return null;\n }\n\n // Clear question mode\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n\n return taskIdPromise;\n }, [state.selectedElement]);\n\n const handleElementSelect = useCallback((element: HTMLElement) => {\n dispatch({ type: 'SET_SELECTED_ELEMENT', element });\n }, []);\n\n const handlePromptSubmit = useCallback(async (prompt: string) => {\n await submitTask(prompt);\n }, [submitTask]);\n\n const handlePromptClose = useCallback(() => {\n dispatch({ type: 'SET_SELECTED_ELEMENT', element: null });\n }, []);\n\n const handleQuestionSubmit = useCallback(async (prompt: string, includeElement: boolean) => {\n await submitQuestion(prompt, includeElement);\n }, [submitQuestion]);\n\n const handleQuestionClose = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n }, []);\n\n // Switch from task mode to question mode (keeps selected element)\n const handleSwitchToQuestionMode = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: true });\n }, []);\n\n // Switch from question mode to task mode (if element is selected, shows prompt dialog)\n const handleSwitchToTaskMode = useCallback(() => {\n dispatch({ type: 'SET_QUESTION_MODE', enabled: false });\n // If there's a selected element, the PromptDialog will automatically show\n // If not, we need to enable selection mode\n if (!state.selectedElement) {\n dispatch({ type: 'SET_SELECTION_MODE', enabled: true });\n }\n }, [state.selectedElement]);\n\n const handleToastDismiss = useCallback(() => {\n dispatch({ type: 'SET_ACTIVE_TASK', task: null });\n }, []);\n\n const contextValue: ClaudeBridgeContextValue = {\n state,\n config,\n enableSelectionMode,\n disableSelectionMode,\n enableQuestionMode,\n disableQuestionMode,\n submitTask,\n submitQuestion,\n continueTask,\n };\n\n return (\n <ClaudeBridgeContext.Provider value={contextValue}>\n {children}\n {enabled && (\n <>\n <SelectionOverlay\n active={state.selectionMode}\n onElementSelect={handleElementSelect}\n selectedElement={state.selectedElement}\n />\n <PromptDialog\n open={state.selectedElement !== null && !state.questionMode}\n element={state.selectedElement}\n onSubmit={handlePromptSubmit}\n onClose={handlePromptClose}\n onSwitchToQuestionMode={handleSwitchToQuestionMode}\n isSubmitting={state.activeTask?.status === 'starting' || state.activeTask?.status === 'running'}\n />\n <QuestionDialog\n open={state.questionMode}\n selectedElement={state.selectedElement}\n onSubmit={handleQuestionSubmit}\n onClose={handleQuestionClose}\n onSwitchToTaskMode={handleSwitchToTaskMode}\n isSubmitting={state.activeTask?.status === 'starting' || state.activeTask?.status === 'running'}\n />\n <TaskStatusToast\n task={state.activeTask}\n serverUrl={serverUrl}\n token={token}\n onDismiss={handleToastDismiss}\n />\n </>\n )}\n </ClaudeBridgeContext.Provider>\n );\n}\n\nexport function useClaudeBridge(): ClaudeBridgeContextValue {\n const context = useContext(ClaudeBridgeContext);\n if (!context) {\n throw new Error('useClaudeBridge must be used within a ClaudeBridgeProvider');\n }\n return context;\n}\n","import type { BridgeWebSocketMessage, ClaudeBridgeConfig } from './types';\nimport type { CreateTaskRequest, SelectionContext } from '@zed-controller/shared';\n\ntype MessageHandler = (message: BridgeWebSocketMessage) => void;\ntype ConnectionHandler = (connected: boolean) => void;\n\nexport class BridgeWebSocketClient {\n private ws: WebSocket | null = null;\n private config: ClaudeBridgeConfig;\n private messageHandlers: Set<MessageHandler> = new Set();\n private connectionHandlers: Set<ConnectionHandler> = new Set();\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectDelay = 1000;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: ClaudeBridgeConfig) {\n this.config = config;\n }\n\n connect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n return;\n }\n\n try {\n // Connect to the bridge-specific WebSocket endpoint\n const wsUrl = this.config.serverUrl\n .replace(/^http/, 'ws')\n .replace(/\\/$/, '');\n\n this.ws = new WebSocket(`${wsUrl}/ws/bridge?token=${encodeURIComponent(this.config.token)}`);\n\n this.ws.onopen = () => {\n console.log('[ClaudeBridge] WebSocket connected');\n this.reconnectAttempts = 0;\n this.notifyConnectionHandlers(true);\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message: BridgeWebSocketMessage = JSON.parse(event.data);\n this.notifyMessageHandlers(message);\n } catch (error) {\n console.error('[ClaudeBridge] Failed to parse message:', error);\n }\n };\n\n this.ws.onclose = () => {\n console.log('[ClaudeBridge] WebSocket disconnected');\n this.notifyConnectionHandlers(false);\n this.stopPingInterval();\n this.scheduleReconnect();\n };\n\n this.ws.onerror = (error) => {\n console.error('[ClaudeBridge] WebSocket error:', error);\n this.config.onError?.(new Error('WebSocket connection error'));\n };\n } catch (error) {\n console.error('[ClaudeBridge] Failed to connect:', error);\n this.scheduleReconnect();\n }\n }\n\n disconnect(): void {\n this.stopPingInterval();\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.log('[ClaudeBridge] Max reconnect attempts reached');\n return;\n }\n\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n\n console.log(`[ClaudeBridge] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);\n this.reconnectTimeout = setTimeout(() => this.connect(), delay);\n }\n\n private startPingInterval(): void {\n this.pingInterval = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.send({ type: 'ping' });\n }\n }, 30000);\n }\n\n private stopPingInterval(): void {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n }\n\n send(message: Record<string, unknown>): boolean {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n console.warn('[ClaudeBridge] Cannot send message: not connected');\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error('[ClaudeBridge] Failed to send message:', error);\n return false;\n }\n }\n\n createTask(prompt: string, context: SelectionContext): boolean {\n console.log('[ClaudeBridge] createTask context:', {\n sourceFile: context.sourceFile,\n sourceLine: context.sourceLine,\n componentName: context.componentName,\n });\n\n const request: CreateTaskRequest = {\n prompt,\n context,\n projectPath: this.config.projectRoot,\n };\n\n return this.send({\n type: 'create_task',\n ...request,\n });\n }\n\n continueTask(taskId: string, prompt: string, context?: SelectionContext): boolean {\n return this.send({\n type: 'continue_task',\n taskId,\n prompt,\n context,\n });\n }\n\n onMessage(handler: MessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n onConnection(handler: ConnectionHandler): () => void {\n this.connectionHandlers.add(handler);\n return () => this.connectionHandlers.delete(handler);\n }\n\n private notifyMessageHandlers(message: BridgeWebSocketMessage): void {\n for (const handler of this.messageHandlers) {\n try {\n handler(message);\n } catch (error) {\n console.error('[ClaudeBridge] Message handler error:', error);\n }\n }\n }\n\n private notifyConnectionHandlers(connected: boolean): void {\n for (const handler of this.connectionHandlers) {\n try {\n handler(connected);\n } catch (error) {\n console.error('[ClaudeBridge] Connection handler error:', error);\n }\n }\n }\n\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n}\n","import type { SelectionContext } from '@zed-controller/shared';\n\n/**\n * Captures context about a selected DOM element for Claude.\n * Uses multiple strategies to identify source location:\n * 1. LocatorJS data attributes (data-locatorjs-id)\n * 2. Custom data attributes (data-source-file, data-source-line)\n * 3. React fiber inspection for component names\n */\nexport function captureContext(element: HTMLElement): Omit<SelectionContext, 'screenshot'> {\n return {\n selectedText: getSelectedText(),\n selectedElement: {\n tagName: element.tagName.toLowerCase(),\n className: element.className,\n id: element.id || undefined,\n innerText: truncateText(element.innerText, 200),\n },\n sourceFile: getSourceFile(element),\n sourceLine: getSourceLine(element),\n sourceColumn: getSourceColumn(element),\n componentName: getComponentName(element),\n domPath: getDomPath(element),\n parentComponents: getParentComponents(element),\n currentUrl: window.location.href,\n pageTitle: document.title,\n };\n}\n\nfunction getSelectedText(): string | undefined {\n const selection = window.getSelection();\n if (selection && selection.toString().trim()) {\n return selection.toString().trim();\n }\n return undefined;\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n const cleaned = text.replace(/\\s+/g, ' ').trim();\n if (cleaned.length <= maxLength) {\n return cleaned;\n }\n return cleaned.slice(0, maxLength) + '...';\n}\n\n/**\n * Get source file from element or its ancestors.\n * Checks for LocatorJS attributes first, then custom attributes.\n */\nfunction getSourceFile(element: HTMLElement): string | undefined {\n let current: HTMLElement | null = element;\n\n while (current) {\n // LocatorJS format: \"path/to/file.tsx:line:column\"\n const locatorId = current.getAttribute('data-locatorjs-id');\n if (locatorId) {\n const [filePath] = locatorId.split(':');\n return filePath;\n }\n\n // Custom attribute\n const sourceFile = current.getAttribute('data-source-file');\n if (sourceFile) {\n return sourceFile;\n }\n\n current = current.parentElement;\n }\n\n return undefined;\n}\n\nfunction getSourceLine(element: HTMLElement): number | undefined {\n let current: HTMLElement | null = element;\n\n while (current) {\n // LocatorJS format: \"path/to/file.tsx:line:column\"\n const locatorId = current.getAttribute('data-locatorjs-id');\n if (locatorId) {\n const parts = locatorId.split(':');\n if (parts.length >= 2) {\n const line = parseInt(parts[1], 10);\n if (!isNaN(line)) return line;\n }\n }\n\n // Custom attribute\n const sourceLine = current.getAttribute('data-source-line');\n if (sourceLine) {\n const line = parseInt(sourceLine, 10);\n if (!isNaN(line)) return line;\n }\n\n current = current.parentElement;\n }\n\n return undefined;\n}\n\nfunction getSourceColumn(element: HTMLElement): number | undefined {\n let current: HTMLElement | null = element;\n\n while (current) {\n // LocatorJS format: \"path/to/file.tsx:line:column\"\n const locatorId = current.getAttribute('data-locatorjs-id');\n if (locatorId) {\n const parts = locatorId.split(':');\n if (parts.length >= 3) {\n const col = parseInt(parts[2], 10);\n if (!isNaN(col)) return col;\n }\n }\n\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Get React component name from fiber.\n * Uses React DevTools hook if available.\n */\nfunction getComponentName(element: HTMLElement): string | undefined {\n // Try to get from React fiber\n const fiber = getReactFiber(element);\n if (fiber) {\n const name = getFiberComponentName(fiber);\n if (name) return name;\n }\n\n // Fallback: check for data attribute\n let current: HTMLElement | null = element;\n while (current) {\n const componentName = current.getAttribute('data-component');\n if (componentName) return componentName;\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Get the React fiber node for an element.\n */\nfunction getReactFiber(element: HTMLElement): any | null {\n // React 18+ uses __reactFiber$ prefix\n // React 17 uses __reactInternalInstance$ prefix\n const keys = Object.keys(element);\n\n for (const key of keys) {\n if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) {\n return (element as any)[key];\n }\n }\n\n return null;\n}\n\n/**\n * Extract component name from React fiber.\n */\nfunction getFiberComponentName(fiber: any): string | undefined {\n if (!fiber) return undefined;\n\n // Function components have a type that is the function itself\n // Class components have a type that is the class\n if (fiber.type) {\n if (typeof fiber.type === 'function') {\n return fiber.type.displayName || fiber.type.name || undefined;\n }\n if (typeof fiber.type === 'string') {\n // Native element, not a component\n return undefined;\n }\n // Forward ref, memo, etc.\n if (fiber.type.displayName) {\n return fiber.type.displayName;\n }\n if (fiber.type.render?.displayName || fiber.type.render?.name) {\n return fiber.type.render.displayName || fiber.type.render.name;\n }\n }\n\n // Walk up to find the nearest component\n if (fiber.return) {\n return getFiberComponentName(fiber.return);\n }\n\n return undefined;\n}\n\n/**\n * Build a CSS selector path to the element.\n */\nfunction getDomPath(element: HTMLElement): string {\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className) {\n const classes = current.className\n .split(/\\s+/)\n .filter((c) => c && !c.startsWith('__'))\n .slice(0, 2)\n .join('.');\n if (classes) {\n selector += `.${classes}`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n path.unshift('body');\n return path.join(' > ');\n}\n\n/**\n * Get parent React component names.\n */\nfunction getParentComponents(element: HTMLElement): string[] {\n const components: string[] = [];\n const seen = new Set<string>();\n\n let fiber = getReactFiber(element);\n\n while (fiber) {\n const name = getFiberComponentName(fiber);\n if (name && !seen.has(name) && !isBuiltInComponent(name)) {\n seen.add(name);\n components.push(name);\n }\n fiber = fiber.return;\n }\n\n // Reverse so it goes from root to leaf\n return components.reverse().slice(0, 10);\n}\n\n/**\n * Check if a component name is a built-in React component we should skip.\n */\nfunction isBuiltInComponent(name: string): boolean {\n const builtIns = [\n 'Fragment',\n 'Suspense',\n 'StrictMode',\n 'Profiler',\n 'Provider',\n 'Consumer',\n 'Context',\n ];\n return builtIns.some((b) => name.includes(b));\n}\n\n/**\n * Captures page-level context without requiring a specific element selection.\n * Useful for asking general questions about the page.\n */\nexport function capturePageContext(): Omit<SelectionContext, 'screenshot'> {\n // Get visible page structure by finding major landmark elements\n const mainContent = document.querySelector('main') || document.querySelector('[role=\"main\"]');\n const pageStructure = getPageStructure();\n\n return {\n selectedText: getSelectedText(),\n selectedElement: {\n tagName: 'body',\n className: document.body.className || '',\n id: document.body.id || undefined,\n innerText: truncateText(getVisibleTextContent(), 500),\n },\n componentName: mainContent ? getComponentName(mainContent as HTMLElement) : undefined,\n domPath: 'body',\n parentComponents: getRootComponents(),\n currentUrl: window.location.href,\n pageTitle: document.title,\n // Include page structure info in the innerText\n };\n}\n\n/**\n * Get a summary of the page structure for context.\n */\nfunction getPageStructure(): string {\n const parts: string[] = [];\n\n // Check for common landmark elements\n const landmarks = [\n { selector: 'header, [role=\"banner\"]', name: 'header' },\n { selector: 'nav, [role=\"navigation\"]', name: 'navigation' },\n { selector: 'main, [role=\"main\"]', name: 'main content' },\n { selector: 'aside, [role=\"complementary\"]', name: 'sidebar' },\n { selector: 'footer, [role=\"contentinfo\"]', name: 'footer' },\n ];\n\n for (const { selector, name } of landmarks) {\n if (document.querySelector(selector)) {\n parts.push(name);\n }\n }\n\n // Count interactive elements\n const buttons = document.querySelectorAll('button, [role=\"button\"]').length;\n const links = document.querySelectorAll('a[href]').length;\n const forms = document.querySelectorAll('form').length;\n const inputs = document.querySelectorAll('input, textarea, select').length;\n\n if (buttons > 0) parts.push(`${buttons} buttons`);\n if (links > 0) parts.push(`${links} links`);\n if (forms > 0) parts.push(`${forms} forms`);\n if (inputs > 0) parts.push(`${inputs} inputs`);\n\n return parts.join(', ');\n}\n\n/**\n * Get visible text content from the page (excluding scripts, styles, etc.)\n */\nfunction getVisibleTextContent(): string {\n const clone = document.body.cloneNode(true) as HTMLElement;\n\n // Remove script, style, and hidden elements\n const toRemove = clone.querySelectorAll('script, style, noscript, [hidden], [aria-hidden=\"true\"]');\n toRemove.forEach((el) => el.remove());\n\n // Get text content\n const text = clone.innerText || clone.textContent || '';\n\n // Clean up whitespace\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Get root-level React components on the page.\n */\nfunction getRootComponents(): string[] {\n const components: string[] = [];\n const seen = new Set<string>();\n\n // Try to find React root\n const root = document.getElementById('root') || document.getElementById('app') || document.querySelector('[data-reactroot]');\n\n if (root) {\n const fiber = getReactFiber(root as HTMLElement);\n if (fiber) {\n let current = fiber;\n let depth = 0;\n while (current && depth < 5) {\n const name = getFiberComponentName(current);\n if (name && !seen.has(name) && !isBuiltInComponent(name)) {\n seen.add(name);\n components.push(name);\n }\n current = current.child;\n depth++;\n }\n }\n }\n\n return components;\n}\n","import html2canvas from 'html2canvas';\n\n/**\n * Capture a screenshot of an element with some padding.\n * Returns a base64-encoded PNG.\n */\nexport async function captureElementScreenshot(\n element: HTMLElement,\n options: {\n padding?: number;\n maxWidth?: number;\n maxHeight?: number;\n } = {}\n): Promise<string | undefined> {\n const { padding = 20, maxWidth = 800, maxHeight = 600 } = options;\n\n try {\n // Get element bounds\n const rect = element.getBoundingClientRect();\n\n // Calculate capture area with padding\n const x = Math.max(0, rect.left - padding + window.scrollX);\n const y = Math.max(0, rect.top - padding + window.scrollY);\n const width = Math.min(rect.width + padding * 2, maxWidth);\n const height = Math.min(rect.height + padding * 2, maxHeight);\n\n // Capture using html2canvas\n const canvas = await html2canvas(document.body, {\n x,\n y,\n width,\n height,\n scrollX: -window.scrollX,\n scrollY: -window.scrollY,\n windowWidth: document.documentElement.scrollWidth,\n windowHeight: document.documentElement.scrollHeight,\n useCORS: true,\n allowTaint: true,\n backgroundColor: null,\n logging: false,\n });\n\n // Convert to base64\n return canvas.toDataURL('image/png');\n } catch (error) {\n console.error('[ClaudeBridge] Screenshot capture failed:', error);\n return undefined;\n }\n}\n\n/**\n * Highlight an element visually during selection.\n */\nexport function createHighlightOverlay(): {\n show: (element: HTMLElement) => void;\n hide: () => void;\n destroy: () => void;\n} {\n const overlay = document.createElement('div');\n overlay.id = 'claude-bridge-highlight';\n overlay.style.cssText = `\n position: fixed;\n pointer-events: none;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n z-index: 999998;\n transition: all 0.1s ease-out;\n display: none;\n `;\n document.body.appendChild(overlay);\n\n const label = document.createElement('div');\n label.style.cssText = `\n position: absolute;\n top: -24px;\n left: 0;\n background: #6366f1;\n color: white;\n font-size: 11px;\n font-family: ui-monospace, monospace;\n padding: 2px 6px;\n border-radius: 3px;\n white-space: nowrap;\n `;\n overlay.appendChild(label);\n\n return {\n show: (element: HTMLElement) => {\n const rect = element.getBoundingClientRect();\n overlay.style.display = 'block';\n overlay.style.top = `${rect.top}px`;\n overlay.style.left = `${rect.left}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n\n // Show element info in label\n let labelText = element.tagName.toLowerCase();\n if (element.id) {\n labelText += `#${element.id}`;\n } else if (element.className) {\n const firstClass = element.className.split(/\\s+/)[0];\n if (firstClass && !firstClass.startsWith('__')) {\n labelText += `.${firstClass}`;\n }\n }\n label.textContent = labelText;\n },\n hide: () => {\n overlay.style.display = 'none';\n },\n destroy: () => {\n overlay.remove();\n },\n };\n}\n","import React, { useEffect, useRef, useCallback } from 'react';\nimport { createHighlightOverlay } from './screenshot-capture';\n\ninterface SelectionOverlayProps {\n active: boolean;\n onElementSelect: (element: HTMLElement) => void;\n selectedElement: HTMLElement | null;\n}\n\nexport function SelectionOverlay({\n active,\n onElementSelect,\n selectedElement,\n}: SelectionOverlayProps) {\n const highlightRef = useRef<ReturnType<typeof createHighlightOverlay> | null>(null);\n const hoveredElementRef = useRef<HTMLElement | null>(null);\n\n // Initialize highlight overlay\n useEffect(() => {\n highlightRef.current = createHighlightOverlay();\n return () => {\n highlightRef.current?.destroy();\n highlightRef.current = null;\n };\n }, []);\n\n // Update highlight when selected element changes\n useEffect(() => {\n if (selectedElement) {\n highlightRef.current?.show(selectedElement);\n } else if (!active) {\n highlightRef.current?.hide();\n }\n }, [selectedElement, active]);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!active || selectedElement) return;\n\n const target = e.target as HTMLElement;\n\n // Skip our own overlay elements\n if (\n target.id === 'claude-bridge-highlight' ||\n target.id === 'claude-bridge-overlay' ||\n target.closest('#claude-bridge-prompt-dialog')\n ) {\n return;\n }\n\n // Skip if same element\n if (target === hoveredElementRef.current) return;\n\n hoveredElementRef.current = target;\n highlightRef.current?.show(target);\n },\n [active, selectedElement]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!active) return;\n\n const target = e.target as HTMLElement;\n\n // Skip our own overlay elements\n if (\n target.id === 'claude-bridge-highlight' ||\n target.id === 'claude-bridge-overlay' ||\n target.closest('#claude-bridge-prompt-dialog')\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n onElementSelect(target);\n },\n [active, onElementSelect]\n );\n\n // Attach event listeners when active\n useEffect(() => {\n if (!active) {\n highlightRef.current?.hide();\n return;\n }\n\n // Use capture phase to intercept before other handlers\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, handleMouseMove, handleClick]);\n\n if (!active) return null;\n\n return (\n <>\n {/* Full-screen overlay to indicate selection mode */}\n <div\n id=\"claude-bridge-overlay\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 999997,\n pointerEvents: 'none',\n background: 'rgba(0, 0, 0, 0.02)',\n }}\n />\n\n {/* Status indicator */}\n <div\n style={{\n position: 'fixed',\n top: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 999999,\n background: '#6366f1',\n color: 'white',\n padding: '8px 16px',\n borderRadius: 8,\n fontSize: 14,\n fontFamily: 'system-ui, -apple-system, sans-serif',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: '#22c55e',\n animation: 'claude-bridge-pulse 1.5s infinite',\n }}\n />\n Click an element to select it\n <span\n style={{\n opacity: 0.7,\n fontSize: 12,\n marginLeft: 4,\n }}\n >\n (ESC to cancel)\n </span>\n </div>\n\n {/* Pulse animation */}\n <style>\n {`\n @keyframes claude-bridge-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}\n </style>\n </>\n );\n}\n","import React, { useState, useRef, useEffect, type KeyboardEvent } from 'react';\nimport { captureContext } from './context-capture';\n\ninterface PromptDialogProps {\n open: boolean;\n element: HTMLElement | null;\n onSubmit: (prompt: string) => void;\n onClose: () => void;\n onSwitchToQuestionMode?: () => void;\n isSubmitting?: boolean;\n}\n\nexport function PromptDialog({\n open,\n element,\n onSubmit,\n onClose,\n onSwitchToQuestionMode,\n isSubmitting = false,\n}: PromptDialogProps) {\n const [prompt, setPrompt] = useState('');\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n // Focus input when dialog opens\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n }\n }, [open]);\n\n // Clear prompt when dialog closes\n useEffect(() => {\n if (!open) {\n setPrompt('');\n }\n }, [open]);\n\n const handleSubmit = () => {\n if (!prompt.trim() || isSubmitting) return;\n onSubmit(prompt.trim());\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Cmd/Ctrl + Enter\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n // Close on Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n };\n\n if (!open || !element) return null;\n\n const context = captureContext(element);\n\n return (\n <div\n id=\"claude-bridge-prompt-dialog\"\n style={{\n position: 'fixed',\n bottom: 24,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 1000000,\n width: '100%',\n maxWidth: 600,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden',\n }}\n >\n {/* Header with element info */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: '#6366f1',\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 13,\n fontWeight: 500,\n }}\n >\n {context.componentName || context.selectedElement.tagName}\n </span>\n {context.sourceFile && (\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.5)',\n fontSize: 12,\n fontFamily: 'ui-monospace, monospace',\n }}\n >\n {context.sourceFile}\n {context.sourceLine ? `:${context.sourceLine}` : ''}\n </span>\n )}\n <div style={{ flex: 1 }} />\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n borderRadius: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Input area */}\n <div style={{ padding: 16 }}>\n <textarea\n ref={inputRef}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"What would you like Claude to change?\"\n disabled={isSubmitting}\n style={{\n width: '100%',\n minHeight: 80,\n maxHeight: 200,\n padding: 12,\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 8,\n color: 'white',\n fontSize: 14,\n fontFamily: 'inherit',\n resize: 'vertical',\n outline: 'none',\n }}\n />\n\n {/* Suggestions for common tasks */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 12,\n }}\n >\n {['Make this bigger', 'Change the color', 'Add padding', 'Hide this element'].map(\n (suggestion) => (\n <button\n key={suggestion}\n onClick={() => setPrompt(suggestion)}\n disabled={isSubmitting}\n style={{\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 4,\n padding: '4px 8px',\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 12,\n cursor: 'pointer',\n }}\n >\n {suggestion}\n </button>\n )\n )}\n </div>\n </div>\n\n {/* Footer with submit button */}\n <div\n style={{\n padding: '12px 16px',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.4)',\n fontSize: 12,\n }}\n >\n {navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+Enter to submit\n </span>\n {onSwitchToQuestionMode && (\n <button\n onClick={onSwitchToQuestionMode}\n disabled={isSubmitting}\n style={{\n background: 'transparent',\n border: 'none',\n color: '#22c55e',\n fontSize: 12,\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n >\n Just ask a question instead\n </button>\n )}\n </div>\n <button\n onClick={handleSubmit}\n disabled={!prompt.trim() || isSubmitting}\n style={{\n background: prompt.trim() && !isSubmitting ? '#6366f1' : 'rgba(99, 102, 241, 0.3)',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 14,\n fontWeight: 500,\n cursor: prompt.trim() && !isSubmitting ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n {isSubmitting ? (\n <>\n <span\n style={{\n width: 14,\n height: 14,\n border: '2px solid rgba(255, 255, 255, 0.3)',\n borderTopColor: 'white',\n borderRadius: '50%',\n animation: 'claude-bridge-spin 0.8s linear infinite',\n }}\n />\n Sending...\n </>\n ) : (\n 'Send to Claude'\n )}\n </button>\n </div>\n\n {/* Spinner animation */}\n <style>\n {`\n @keyframes claude-bridge-spin {\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n </div>\n );\n}\n","import React, { useState, useRef, useEffect, type KeyboardEvent } from 'react';\nimport { captureContext, capturePageContext } from './context-capture';\n\ninterface QuestionDialogProps {\n open: boolean;\n selectedElement: HTMLElement | null; // Optional - user may have selected an element\n onSubmit: (prompt: string, includeElement: boolean) => void;\n onClose: () => void;\n onSwitchToTaskMode?: () => void;\n isSubmitting?: boolean;\n}\n\nexport function QuestionDialog({\n open,\n selectedElement,\n onSubmit,\n onClose,\n onSwitchToTaskMode,\n isSubmitting = false,\n}: QuestionDialogProps) {\n const [prompt, setPrompt] = useState('');\n const [includeElement, setIncludeElement] = useState(true);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n // Focus input when dialog opens\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n }\n }, [open]);\n\n // Clear prompt when dialog closes\n useEffect(() => {\n if (!open) {\n setPrompt('');\n }\n }, [open]);\n\n // Reset includeElement when element changes\n useEffect(() => {\n setIncludeElement(!!selectedElement);\n }, [selectedElement]);\n\n const handleSubmit = () => {\n if (!prompt.trim() || isSubmitting) return;\n onSubmit(prompt.trim(), includeElement && !!selectedElement);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Cmd/Ctrl + Enter\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n // Close on Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n };\n\n if (!open) return null;\n\n const pageContext = capturePageContext();\n const elementContext = selectedElement ? captureContext(selectedElement) : null;\n\n return (\n <div\n id=\"claude-bridge-question-dialog\"\n style={{\n position: 'fixed',\n bottom: 24,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 1000000,\n width: '100%',\n maxWidth: 600,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden',\n }}\n >\n {/* Header with page/element info */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: '#22c55e', // Green to differentiate from task dialog\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 13,\n fontWeight: 500,\n }}\n >\n Ask a Question\n </span>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.5)',\n fontSize: 12,\n }}\n >\n {pageContext.pageTitle}\n </span>\n <div style={{ flex: 1 }} />\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n borderRadius: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Element selection indicator */}\n {selectedElement && (\n <div\n style={{\n padding: '8px 16px',\n background: 'rgba(34, 197, 94, 0.1)',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n cursor: 'pointer',\n flex: 1,\n }}\n >\n <input\n type=\"checkbox\"\n checked={includeElement}\n onChange={(e) => setIncludeElement(e.target.checked)}\n style={{ cursor: 'pointer' }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 12,\n }}\n >\n Include selected element:\n </span>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 12,\n fontFamily: 'ui-monospace, monospace',\n }}\n >\n {elementContext?.componentName || elementContext?.selectedElement.tagName}\n {elementContext?.sourceFile && (\n <span style={{ color: 'rgba(255, 255, 255, 0.5)', marginLeft: 4 }}>\n ({elementContext.sourceFile}\n {elementContext.sourceLine ? `:${elementContext.sourceLine}` : ''})\n </span>\n )}\n </span>\n </label>\n </div>\n )}\n\n {/* Input area */}\n <div style={{ padding: 16 }}>\n <textarea\n ref={inputRef}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Ask a question about this page or codebase...\"\n disabled={isSubmitting}\n style={{\n width: '100%',\n minHeight: 80,\n maxHeight: 200,\n padding: 12,\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 8,\n color: 'white',\n fontSize: 14,\n fontFamily: 'inherit',\n resize: 'vertical',\n outline: 'none',\n }}\n />\n\n {/* Suggestions for common questions */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginTop: 12,\n }}\n >\n {[\n 'What does this page do?',\n 'Where are the backend routes?',\n 'How does this component work?',\n 'What API calls does this make?',\n ].map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => setPrompt(suggestion)}\n disabled={isSubmitting}\n style={{\n background: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n borderRadius: 4,\n padding: '4px 8px',\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 12,\n cursor: 'pointer',\n }}\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n\n {/* Footer with submit button */}\n <div\n style={{\n padding: '12px 16px',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.4)',\n fontSize: 12,\n }}\n >\n {navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+Enter to submit\n </span>\n {onSwitchToTaskMode && (\n <button\n onClick={onSwitchToTaskMode}\n disabled={isSubmitting}\n style={{\n background: 'transparent',\n border: 'none',\n color: '#6366f1',\n fontSize: 12,\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n >\n Make changes instead\n </button>\n )}\n </div>\n <button\n onClick={handleSubmit}\n disabled={!prompt.trim() || isSubmitting}\n style={{\n background: prompt.trim() && !isSubmitting ? '#22c55e' : 'rgba(34, 197, 94, 0.3)',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 14,\n fontWeight: 500,\n cursor: prompt.trim() && !isSubmitting ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n {isSubmitting ? (\n <>\n <span\n style={{\n width: 14,\n height: 14,\n border: '2px solid rgba(255, 255, 255, 0.3)',\n borderTopColor: 'white',\n borderRadius: '50%',\n animation: 'claude-bridge-spin 0.8s linear infinite',\n }}\n />\n Asking...\n </>\n ) : (\n 'Ask Claude'\n )}\n </button>\n </div>\n\n {/* Spinner animation */}\n <style>\n {`\n @keyframes claude-bridge-spin {\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n </div>\n );\n}\n","import React, { useEffect, useState, useRef, useCallback } from 'react';\nimport type { BrowserTask } from '@zed-controller/shared';\nimport { ClaudeTerminal } from './ClaudeTerminal';\n\ninterface TaskStatusToastProps {\n task: BrowserTask | null;\n serverUrl: string;\n token: string;\n onDismiss: () => void;\n /** If true, clicking X will kill the session. Default: true */\n killOnClose?: boolean;\n}\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 300;\nconst DEFAULT_WIDTH = 700;\nconst DEFAULT_HEIGHT = 500;\n\nexport function TaskStatusToast({\n task,\n serverUrl,\n token,\n onDismiss,\n killOnClose = true,\n}: TaskStatusToastProps) {\n const [visible, setVisible] = useState(false);\n const [expanded, setExpanded] = useState(false);\n const [size, setSize] = useState({ width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT });\n const [isResizing, setIsResizing] = useState(false);\n const resizeRef = useRef<{ startX: number; startY: number; startWidth: number; startHeight: number } | null>(null);\n\n useEffect(() => {\n if (task) {\n setVisible(true);\n // Auto-expand when task starts running and has a sessionId\n if (task.sessionId && (task.status === 'running' || task.status === 'starting')) {\n setExpanded(true);\n }\n }\n }, [task, task?.sessionId, task?.status]);\n\n useEffect(() => {\n // Auto-hide after 30 seconds for completed/failed tasks (only when collapsed)\n if (task && !expanded && (task.status === 'completed' || task.status === 'failed')) {\n const timer = setTimeout(() => {\n setVisible(false);\n setTimeout(onDismiss, 300);\n }, 10000);\n return () => clearTimeout(timer);\n }\n }, [task?.status, expanded, onDismiss]);\n\n // Handle resize\n const handleResizeStart = useCallback((e: React.MouseEvent, direction: string) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startWidth: size.width,\n startHeight: size.height,\n };\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n if (!resizeRef.current) return;\n\n let newWidth = resizeRef.current.startWidth;\n let newHeight = resizeRef.current.startHeight;\n\n if (direction.includes('w')) {\n newWidth = resizeRef.current.startWidth - (moveEvent.clientX - resizeRef.current.startX);\n }\n if (direction.includes('n')) {\n newHeight = resizeRef.current.startHeight - (moveEvent.clientY - resizeRef.current.startY);\n }\n\n setSize({\n width: Math.max(MIN_WIDTH, newWidth),\n height: Math.max(MIN_HEIGHT, newHeight),\n });\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n resizeRef.current = null;\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [size]);\n\n // Kill the session via WebSocket\n const killSession = useCallback((sessionId: string) => {\n return new Promise<void>((resolve) => {\n const wsUrl = serverUrl.replace(/^http/, 'ws').replace(/\\/$/, '');\n const ws = new WebSocket(`${wsUrl}/ws/bridge?token=${encodeURIComponent(token)}`);\n let resolved = false;\n\n const cleanup = () => {\n if (!resolved) {\n resolved = true;\n ws.close();\n resolve();\n }\n };\n\n ws.onopen = () => {\n ws.send(JSON.stringify({\n type: 'kill_session',\n sessionId,\n }));\n };\n\n ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data);\n // Wait for confirmation that the session was killed\n if (message.type === 'session_killed' || message.type === 'error') {\n cleanup();\n }\n } catch {\n // Ignore parse errors\n }\n };\n\n ws.onerror = () => {\n cleanup();\n };\n\n ws.onclose = () => {\n if (!resolved) {\n resolved = true;\n resolve();\n }\n };\n\n // Timeout fallback - give server time to kill tmux session\n setTimeout(cleanup, 3000);\n });\n }, [serverUrl, token]);\n\n const handleDismiss = useCallback(async () => {\n // Kill the session if killOnClose is true and we have a session\n if (killOnClose && task?.sessionId) {\n await killSession(task.sessionId);\n }\n\n setVisible(false);\n setExpanded(false);\n setTimeout(onDismiss, 300);\n }, [killOnClose, task?.sessionId, killSession, onDismiss]);\n\n const handleToggleExpand = useCallback(() => {\n setExpanded(!expanded);\n }, [expanded]);\n\n // Early return after all hooks\n if (!task || !visible) return null;\n\n const statusColors: Record<string, { bg: string; text: string }> = {\n queued: { bg: '#6366f1', text: 'Queued' },\n starting: { bg: '#f59e0b', text: 'Starting...' },\n running: { bg: '#22c55e', text: 'Running' },\n completed: { bg: '#22c55e', text: 'Completed' },\n failed: { bg: '#ef4444', text: 'Failed' },\n };\n\n const status = statusColors[task.status] || statusColors.queued;\n\n const zedUrl = task.sessionId\n ? `${serverUrl}?token=${encodeURIComponent(token)}&session=${task.sessionId}`\n : `${serverUrl}?token=${encodeURIComponent(token)}`;\n\n const handleOpenZed = () => {\n window.open(zedUrl, '_blank');\n };\n\n // Collapsed view (mini toast)\n if (!expanded) {\n return (\n <div\n style={{\n position: 'fixed',\n bottom: 24,\n right: 24,\n zIndex: 1000001,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n minWidth: 320,\n maxWidth: 400,\n opacity: visible ? 1 : 0,\n transform: visible ? 'translateY(0)' : 'translateY(20px)',\n transition: 'opacity 0.3s, transform 0.3s',\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n }}\n >\n <div\n style={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n background: status.bg,\n animation: task.status === 'running' || task.status === 'starting'\n ? 'claude-bridge-pulse 1.5s infinite'\n : 'none',\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 14,\n fontWeight: 500,\n flex: 1,\n }}\n >\n Claude Task: {status.text}\n </span>\n <button\n onClick={handleDismiss}\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '12px 16px' }}>\n <p\n style={{\n color: 'rgba(255, 255, 255, 0.7)',\n fontSize: 13,\n margin: 0,\n lineHeight: 1.5,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {task.prompt}\n </p>\n\n {task.error && (\n <p\n style={{\n color: '#ef4444',\n fontSize: 12,\n margin: '8px 0 0',\n }}\n >\n Error: {task.error}\n </p>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '12px 16px',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 8,\n }}\n >\n {task.sessionId && (\n <button\n onClick={handleToggleExpand}\n style={{\n background: '#374151',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 13,\n fontWeight: 500,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n Show Terminal\n </button>\n )}\n <button\n onClick={handleOpenZed}\n style={{\n background: '#6366f1',\n border: 'none',\n borderRadius: 6,\n padding: '8px 16px',\n color: 'white',\n fontSize: 13,\n fontWeight: 500,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n Open in Zed Controller\n <span style={{ fontSize: 11 }}>↗</span>\n </button>\n </div>\n\n <style>\n {`\n @keyframes claude-bridge-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}\n </style>\n </div>\n );\n }\n\n // Expanded view with terminal\n return (\n <div\n style={{\n position: 'fixed',\n bottom: 24,\n right: 24,\n zIndex: 1000001,\n width: size.width,\n height: size.height,\n background: '#1e1e2e',\n borderRadius: 12,\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.4)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n display: 'flex',\n flexDirection: 'column',\n opacity: visible ? 1 : 0,\n transition: isResizing ? 'none' : 'opacity 0.3s',\n overflow: 'hidden',\n }}\n >\n {/* Resize handles */}\n <div\n onMouseDown={(e) => handleResizeStart(e, 'n')}\n style={{\n position: 'absolute',\n top: 0,\n left: 20,\n right: 20,\n height: 6,\n cursor: 'ns-resize',\n zIndex: 10,\n }}\n />\n <div\n onMouseDown={(e) => handleResizeStart(e, 'w')}\n style={{\n position: 'absolute',\n left: 0,\n top: 20,\n bottom: 20,\n width: 6,\n cursor: 'ew-resize',\n zIndex: 10,\n }}\n />\n <div\n onMouseDown={(e) => handleResizeStart(e, 'nw')}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: 20,\n height: 20,\n cursor: 'nwse-resize',\n zIndex: 11,\n }}\n />\n\n {/* Header */}\n <div\n style={{\n padding: '10px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n background: status.bg,\n animation: task.status === 'running' || task.status === 'starting'\n ? 'claude-bridge-pulse 1.5s infinite'\n : 'none',\n }}\n />\n <span\n style={{\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: 14,\n fontWeight: 500,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={task.prompt}\n >\n {status.text}: {task.prompt.slice(0, 50)}{task.prompt.length > 50 ? '...' : ''}\n </span>\n <button\n onClick={handleToggleExpand}\n title=\"Minimize\"\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 14,\n lineHeight: 1,\n }}\n >\n −\n </button>\n <button\n onClick={handleOpenZed}\n title=\"Open in Zed Controller\"\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 14,\n lineHeight: 1,\n }}\n >\n ↗\n </button>\n <button\n onClick={handleDismiss}\n title=\"Close\"\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255, 255, 255, 0.5)',\n cursor: 'pointer',\n padding: 4,\n fontSize: 18,\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Terminal */}\n <div style={{ flex: 1, minHeight: 0 }}>\n {task.sessionId ? (\n <ClaudeTerminal\n serverUrl={serverUrl}\n token={token}\n sessionId={task.sessionId}\n style={{ width: '100%', height: '100%' }}\n />\n ) : (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: 'rgba(255, 255, 255, 0.5)',\n }}\n >\n Waiting for session...\n </div>\n )}\n </div>\n\n {/* Error banner if any */}\n {task.error && (\n <div\n style={{\n padding: '8px 16px',\n background: 'rgba(239, 68, 68, 0.2)',\n borderTop: '1px solid rgba(239, 68, 68, 0.3)',\n color: '#ef4444',\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n Error: {task.error}\n </div>\n )}\n\n <style>\n {`\n @keyframes claude-bridge-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}\n </style>\n </div>\n );\n}\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport { WebglAddon } from '@xterm/addon-webgl';\nimport type { Session } from '@zed-controller/shared';\n\n// Import xterm CSS - consumers will need to include this\nimport '@xterm/xterm/css/xterm.css';\n\n// Critical xterm CSS for interactivity - ensures terminal works even if CSS import fails\nconst XTERM_CRITICAL_CSS = `\n.xterm {\n cursor: text;\n position: relative;\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n}\n.xterm.focus,\n.xterm:focus {\n outline: none;\n}\n.xterm .xterm-helpers {\n position: absolute;\n top: 0;\n z-index: 5;\n}\n.xterm .xterm-helper-textarea {\n padding: 0;\n border: 0;\n margin: 0;\n position: absolute;\n opacity: 0;\n left: -9999em;\n top: 0;\n width: 0;\n height: 0;\n z-index: -5;\n white-space: nowrap;\n overflow: hidden;\n resize: none;\n}\n.xterm .xterm-helper-textarea:focus {\n outline: none;\n}\n.xterm .composition-view {\n background: #000;\n color: #FFF;\n display: none;\n position: absolute;\n white-space: nowrap;\n z-index: 1;\n}\n.xterm .composition-view.active {\n display: block;\n}\n.xterm .xterm-viewport {\n background-color: #000;\n overflow-y: scroll;\n cursor: default;\n position: absolute;\n right: 0;\n left: 0;\n top: 0;\n bottom: 0;\n}\n.xterm .xterm-screen {\n position: relative;\n}\n.xterm .xterm-screen canvas {\n position: absolute;\n left: 0;\n top: 0;\n}\n.xterm-char-measure-element {\n display: inline-block;\n visibility: hidden;\n position: absolute;\n top: 0;\n left: -9999em;\n line-height: normal;\n}\n.xterm.enable-mouse-events {\n cursor: default;\n}\n.xterm .xterm-cursor-pointer {\n cursor: pointer;\n}\n.xterm.xterm-cursor-style-block .xterm-cursor:not(.xterm-cursor-blink),\n.xterm.xterm-cursor-style-bar .xterm-cursor:not(.xterm-cursor-blink),\n.xterm.xterm-cursor-style-underline .xterm-cursor:not(.xterm-cursor-blink) {\n visibility: visible;\n}\n`;\n\nexport interface ClaudeTerminalProps {\n /** The WebSocket server URL (e.g., \"https://localhost:3456\") */\n serverUrl: string;\n /** Authentication token */\n token: string;\n /** Session ID to attach to, or undefined to show session picker */\n sessionId?: string;\n /** Called when a session is selected (when sessionId is not provided) */\n onSessionSelect?: (session: Session) => void;\n /** Called when connection status changes */\n onConnectionChange?: (connected: boolean) => void;\n /** Called when sessions list updates */\n onSessionsUpdate?: (sessions: Session[]) => void;\n /** Custom terminal options */\n terminalOptions?: {\n fontSize?: number;\n fontFamily?: string;\n theme?: {\n background?: string;\n foreground?: string;\n cursor?: string;\n };\n };\n /** Custom styles for the container */\n style?: React.CSSProperties;\n /** Custom class name */\n className?: string;\n}\n\ninterface TerminalMessage {\n type: string;\n sessionId?: string;\n scrollback?: string;\n data?: string;\n sessions?: Session[];\n error?: string;\n}\n\nexport function ClaudeTerminal({\n serverUrl,\n token,\n sessionId,\n onSessionSelect,\n onConnectionChange,\n onSessionsUpdate,\n terminalOptions = {},\n style,\n className,\n}: ClaudeTerminalProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const terminalRef = useRef<Terminal | null>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const wsRef = useRef<WebSocket | null>(null);\n const handleMessageRef = useRef<((event: MessageEvent) => void) | null>(null);\n const [connected, setConnected] = useState(false);\n const [sessions, setSessions] = useState<Session[]>([]);\n const [attachedSessionId, setAttachedSessionId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Initialize terminal\n useEffect(() => {\n if (!containerRef.current) return;\n\n const terminal = new Terminal({\n cursorBlink: true,\n cursorStyle: 'block',\n fontSize: terminalOptions.fontSize ?? 14,\n fontFamily: terminalOptions.fontFamily ?? 'Menlo, Monaco, \"Courier New\", monospace',\n theme: {\n background: terminalOptions.theme?.background ?? '#1a1a1a',\n foreground: terminalOptions.theme?.foreground ?? '#f0f0f0',\n cursor: terminalOptions.theme?.cursor ?? '#f0f0f0',\n cursorAccent: '#1a1a1a',\n black: '#1a1a1a',\n red: '#ff5555',\n green: '#50fa7b',\n yellow: '#f1fa8c',\n blue: '#6272a4',\n magenta: '#ff79c6',\n cyan: '#8be9fd',\n white: '#f8f8f2',\n brightBlack: '#6272a4',\n brightRed: '#ff6e6e',\n brightGreen: '#69ff94',\n brightYellow: '#ffffa5',\n brightBlue: '#d6acff',\n brightMagenta: '#ff92df',\n brightCyan: '#a4ffff',\n brightWhite: '#ffffff',\n },\n allowProposedApi: true,\n scrollback: 10000,\n disableStdin: false,\n allowTransparency: true,\n });\n\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n\n terminal.open(containerRef.current);\n\n // Try to load WebGL addon\n try {\n const webglAddon = new WebglAddon();\n webglAddon.onContextLoss(() => {\n webglAddon.dispose();\n });\n terminal.loadAddon(webglAddon);\n } catch (e) {\n console.warn('[ClaudeTerminal] WebGL addon could not be loaded:', e);\n }\n\n terminalRef.current = terminal;\n fitAddonRef.current = fitAddon;\n\n // Fit terminal\n requestAnimationFrame(() => {\n fitAddon.fit();\n });\n\n // Setup resize observer\n const resizeObserver = new ResizeObserver(() => {\n requestAnimationFrame(() => {\n fitAddon.fit();\n // Send resize to server\n if (wsRef.current?.readyState === WebSocket.OPEN && attachedSessionId) {\n wsRef.current.send(JSON.stringify({\n type: 'terminal_resize',\n sessionId: attachedSessionId,\n cols: terminal.cols,\n rows: terminal.rows,\n }));\n }\n });\n });\n resizeObserver.observe(containerRef.current);\n\n return () => {\n resizeObserver.disconnect();\n terminal.dispose();\n terminalRef.current = null;\n fitAddonRef.current = null;\n };\n }, [terminalOptions.fontSize, terminalOptions.fontFamily, terminalOptions.theme]);\n\n // Handle terminal input\n useEffect(() => {\n const terminal = terminalRef.current;\n if (!terminal) return;\n\n const disposable = terminal.onData((data) => {\n if (wsRef.current?.readyState === WebSocket.OPEN && attachedSessionId) {\n wsRef.current.send(JSON.stringify({\n type: 'terminal_input',\n sessionId: attachedSessionId,\n data,\n }));\n }\n });\n\n return () => disposable.dispose();\n }, [attachedSessionId]);\n\n // Handle WebSocket messages - use ref to avoid recreating WebSocket on handler change\n // Store attached session ID in a ref for the message handler to avoid dependency issues\n const attachedSessionIdRef = useRef<string | null>(null);\n attachedSessionIdRef.current = attachedSessionId;\n\n // Keep the callback stable by using refs for changing values\n useEffect(() => {\n handleMessageRef.current = (event: MessageEvent) => {\n try {\n const message: TerminalMessage = JSON.parse(event.data);\n\n switch (message.type) {\n case 'connected':\n // Request sessions list\n wsRef.current?.send(JSON.stringify({ type: 'get_sessions' }));\n break;\n\n case 'sessions_list':\n if (message.sessions) {\n setSessions(message.sessions);\n onSessionsUpdate?.(message.sessions);\n }\n break;\n\n case 'terminal_attached':\n if (message.sessionId) {\n setAttachedSessionId(message.sessionId);\n setError(null);\n // Write scrollback to terminal\n if (message.scrollback && terminalRef.current) {\n terminalRef.current.write(message.scrollback);\n }\n // Fit and send resize\n if (fitAddonRef.current && terminalRef.current) {\n fitAddonRef.current.fit();\n wsRef.current?.send(JSON.stringify({\n type: 'terminal_resize',\n sessionId: message.sessionId,\n cols: terminalRef.current.cols,\n rows: terminalRef.current.rows,\n }));\n }\n }\n break;\n\n case 'terminal_output':\n if (message.data && terminalRef.current && message.sessionId === attachedSessionIdRef.current) {\n terminalRef.current.write(message.data);\n }\n break;\n\n case 'terminal_detached':\n if (message.sessionId === attachedSessionIdRef.current) {\n setAttachedSessionId(null);\n }\n break;\n\n case 'error':\n setError(message.error || 'Unknown error');\n console.error('[ClaudeTerminal] Error:', message.error);\n break;\n\n case 'pong':\n // Keep-alive response\n break;\n }\n } catch (e) {\n console.error('[ClaudeTerminal] Failed to parse message:', e);\n }\n };\n }, [onSessionsUpdate]);\n\n // Connect WebSocket - use stable dependencies to avoid reconnection loops\n useEffect(() => {\n const wsUrl = serverUrl.replace(/^http/, 'ws').replace(/\\/$/, '');\n const ws = new WebSocket(`${wsUrl}/ws/bridge?token=${encodeURIComponent(token)}`);\n\n ws.onopen = () => {\n setConnected(true);\n setError(null);\n onConnectionChange?.(true);\n };\n\n // Use ref to call the current message handler without creating dependency\n ws.onmessage = (event) => {\n handleMessageRef.current?.(event);\n };\n\n ws.onclose = () => {\n setConnected(false);\n setAttachedSessionId(null);\n onConnectionChange?.(false);\n };\n\n ws.onerror = () => {\n setError('WebSocket connection error');\n };\n\n wsRef.current = ws;\n\n // Ping interval\n const pingInterval = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'ping' }));\n }\n }, 30000);\n\n return () => {\n clearInterval(pingInterval);\n ws.close();\n wsRef.current = null;\n };\n }, [serverUrl, token, onConnectionChange]);\n\n // Auto-attach when sessionId is provided and we're connected\n useEffect(() => {\n if (sessionId && connected && !attachedSessionId) {\n wsRef.current?.send(JSON.stringify({\n type: 'attach_terminal',\n sessionId,\n }));\n }\n }, [sessionId, connected, attachedSessionId]);\n\n // Focus terminal when attached to a session\n useEffect(() => {\n if (attachedSessionId && terminalRef.current && fitAddonRef.current) {\n // Small delay to ensure terminal is ready and sized\n const timer = setTimeout(() => {\n fitAddonRef.current?.fit();\n terminalRef.current?.focus();\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [attachedSessionId]);\n\n // Handle container click to focus terminal\n const handleContainerClick = useCallback(() => {\n terminalRef.current?.focus();\n }, []);\n\n // Handle session selection\n const handleSelectSession = useCallback((session: Session) => {\n // Clear terminal\n terminalRef.current?.clear();\n\n // Detach from current session if any\n if (attachedSessionId) {\n wsRef.current?.send(JSON.stringify({\n type: 'detach_terminal',\n sessionId: attachedSessionId,\n }));\n }\n\n // Attach to new session\n wsRef.current?.send(JSON.stringify({\n type: 'attach_terminal',\n sessionId: session.id,\n }));\n\n onSessionSelect?.(session);\n }, [attachedSessionId, onSessionSelect]);\n\n // If no sessionId provided, show session picker\n if (!sessionId && !attachedSessionId) {\n return (\n <div\n className={className}\n style={{\n background: '#1a1a1a',\n color: '#f0f0f0',\n padding: '20px',\n fontFamily: 'Menlo, Monaco, \"Courier New\", monospace',\n ...style,\n }}\n >\n {!connected ? (\n <div>Connecting to server...</div>\n ) : error ? (\n <div style={{ color: '#ff5555' }}>Error: {error}</div>\n ) : sessions.length === 0 ? (\n <div>No Claude sessions available</div>\n ) : (\n <div>\n <div style={{ marginBottom: '10px', fontSize: '14px' }}>\n Select a Claude session:\n </div>\n {sessions.map((session) => (\n <div\n key={session.id}\n onClick={() => handleSelectSession(session)}\n style={{\n padding: '10px',\n margin: '5px 0',\n background: '#2a2a2a',\n borderRadius: '4px',\n cursor: 'pointer',\n border: '1px solid #3a3a3a',\n }}\n onMouseOver={(e) => {\n e.currentTarget.style.background = '#3a3a3a';\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.background = '#2a2a2a';\n }}\n >\n <div style={{ fontWeight: 'bold' }}>\n {session.displayName || session.name}\n </div>\n <div style={{ fontSize: '12px', color: '#888', marginTop: '4px' }}>\n {session.workingDir}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <>\n <style>\n {XTERM_CRITICAL_CSS}\n </style>\n <div\n ref={containerRef}\n className={className}\n onClick={handleContainerClick}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n />\n </>\n );\n}\n\nexport default ClaudeTerminal;\n"],"mappings":"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","names":["import_react","html2canvas","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react","import_xterm","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|