skema-core 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/server/prompts.ts","../src/server/gemini-cli.ts","../src/server/ai-provider.ts","../src/server/vision.ts","../src/server/annotation-store.ts","../src/server/daemon.ts"],"names":["execSync","spawn","GoogleGenerativeAI","POST","DELETE","annotationSnapshots","createSnapshot","path","fs","exec","WebSocket","ws","WebSocketServer"],"mappings":"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","file":"server.js","sourcesContent":["// =============================================================================\n// Skema Utility Functions\n// =============================================================================\n\n/**\n * Convert a Blob to a base64 string\n */\nexport async function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n}\n\n/**\n * Add a labeled grid overlay to an SVG string\n * Grid uses A/B/C column labels and 0/1/2 row numbers for positioning reference\n * @param svgString - The SVG markup to add grid to\n * @param opts - Grid options (color, cell size, whether to show labels)\n * @returns SVG string with grid overlay added\n */\nexport function addGridToSvg(\n svgString: string,\n opts: { color?: string; size?: number; labels?: boolean } = {}\n): string {\n const { color = '#0066FF', size = 100, labels = true } = opts;\n\n // Parse SVG to get dimensions\n const viewBoxMatch = svgString.match(/viewBox=\"([^\"]+)\"/);\n if (!viewBoxMatch) return svgString;\n\n const [x, y, w, h] = viewBoxMatch[1].split(' ').map(Number);\n\n // Build grid lines and labels\n const gridElements: string[] = [];\n\n // Vertical lines\n for (let i = 0; i <= Math.ceil(w / size); i++) {\n const xPos = i * size;\n if (i > 0) {\n gridElements.push(\n `<line x1=\"${xPos}\" y1=\"0\" x2=\"${xPos}\" y2=\"${h}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n }\n if (labels) {\n // Column labels (A, B, C, ...)\n const colLabel = String.fromCharCode(65 + i); // 65 = 'A'\n gridElements.push(\n `<text x=\"${xPos + size / 2}\" y=\"16\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\" text-anchor=\"middle\">${colLabel}</text>`\n );\n }\n }\n\n // Horizontal lines\n for (let i = 0; i <= Math.ceil(h / size); i++) {\n const yPos = i * size;\n gridElements.push(\n `<line x1=\"0\" y1=\"${yPos}\" x2=\"${w}\" y2=\"${yPos}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n if (labels && i < Math.ceil(h / size)) {\n // Row labels (0, 1, 2, ...)\n gridElements.push(\n `<text x=\"8\" y=\"${yPos + size / 2 + 4}\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\">${i}</text>`\n );\n }\n }\n\n // Create grid group\n const gridGroup = `<g id=\"skema-grid\" transform=\"translate(${x}, ${y})\">${gridElements.join('')}</g>`;\n\n // Insert grid before closing </svg> tag\n return svgString.replace('</svg>', `${gridGroup}</svg>`);\n}\n\n/**\n * Get the grid cell reference (e.g., \"B2\") for a given position\n * @param x - X coordinate in pixels\n * @param y - Y coordinate in pixels\n * @param gridSize - Size of each grid cell (default 100px)\n * @returns Grid cell reference string (e.g., \"B2\")\n */\nexport function getGridCellReference(x: number, y: number, gridSize: number = 100): string {\n const col = Math.floor(x / gridSize);\n const row = Math.floor(y / gridSize);\n const colLabel = String.fromCharCode(65 + col); // 65 = 'A'\n return `${colLabel}${row}`;\n}\n\n/**\n * Extract text content from tldraw shapes\n * @param shapes - Array of tldraw shapes\n * @returns Combined text content from text and note shapes\n */\nexport function extractTextFromShapes(shapes: unknown[]): string {\n const textContent: string[] = [];\n\n for (const shape of shapes) {\n const s = shape as { type?: string; props?: { text?: string; richText?: unknown } };\n\n if (s.type === 'text' || s.type === 'note') {\n // Handle plain text\n if (s.props?.text) {\n textContent.push(s.props.text);\n }\n // Handle rich text (newer tldraw versions)\n if (s.props?.richText && typeof s.props.richText === 'object') {\n const rt = s.props.richText as { content?: Array<{ content?: Array<{ text?: string }> }> };\n if (rt.content) {\n for (const block of rt.content) {\n if (block.content) {\n for (const inline of block.content) {\n if (inline.text) {\n textContent.push(inline.text);\n }\n }\n }\n }\n }\n }\n }\n }\n\n return textContent.filter(Boolean).join('\\n');\n}\n","/**\n * Skema AI Prompts\n *\n * This file contains all AI prompts used by Skema for generating code changes.\n *\n * Prompts:\n * - FAST_DOM_SELECTION_PROMPT: Quick, minimal prompt for DOM element changes\n * - DETAILED_DOM_SELECTION_PROMPT: Full context prompt for complex DOM changes\n * - DRAWING_TO_CODE_PROMPT: Converts wireframe sketches to React components\n * - IMAGE_ANALYSIS_PROMPT: Gemini Vision prompt to analyze drawing images\n */\n\nimport type { ViewportInfo, NearbyElement, ProjectStyleContext } from '../types';\nimport { getGridCellReference } from '../lib/utils';\n\n// =============================================================================\n// System Prompt for Code Generation\n// =============================================================================\n\n/**\n * Base system prompt for AI code generation.\n * Used by direct API providers to set context for code generation tasks.\n */\nexport const CODE_GENERATION_PROMPT = `You are Skema, an AI assistant specialized in frontend web development. You help users modify their React/Next.js applications based on visual annotations and instructions.\n\nYour capabilities:\n- Edit existing code files to implement UI changes\n- Convert wireframe sketches into functional React components\n- Apply styling using Tailwind CSS\n- Follow existing code patterns and conventions\n\nCRITICAL RULES:\n1. Do NOT create new files - only edit existing files\n2. Do NOT run shell commands (no npm, git, lint, build commands)\n3. Ensure all JSX tags are properly closed\n4. Add imports only at the top of files, never in the middle\n5. Make minimal, targeted changes\n6. Stop immediately after making file changes - do not verify or run tests\n\nWhen editing code:\n- Use Tailwind CSS for styling\n- Follow the existing code patterns in the project\n- Write semantic HTML with proper accessibility attributes\n- Integrate changes naturally with existing page flow`;\n\n\n// =============================================================================\n// Prompt Inputs Types\n// =============================================================================\n\nexport interface DomSelectionInput {\n comment: string;\n selector?: string;\n text?: string;\n tagName?: string;\n}\n\nexport interface DetailedDomSelectionInput extends DomSelectionInput {\n elementPath?: string;\n cssClasses?: string;\n attributes?: Record<string, string>;\n elements?: Array<{\n tagName: string;\n selector: string;\n elementPath: string;\n text?: string;\n }>;\n}\n\nexport interface GestureInput {\n comment: string;\n gesture?: string;\n boundingBox?: { x: number; y: number };\n}\n\nexport interface DrawingInput {\n comment: string;\n boundingBox?: { x: number; y: number; width: number; height: number };\n drawingSvg?: string;\n drawingImage?: string;\n extractedText?: string;\n gridConfig?: { color: string; size: number; labels: boolean };\n viewport?: ViewportInfo;\n projectStyles?: ProjectStyleContext;\n nearbyElements?: NearbyElement[];\n visionDescription?: string;\n}\n\n// =============================================================================\n// Shared Rules & Guidelines\n// =============================================================================\n\n/**\n * Critical rules that apply to ALL prompts to prevent common errors\n */\nconst CRITICAL_RULES = `CRITICAL RULES:\n- Do NOT create new files. Only edit existing files.\n- Do NOT modify the Skema overlay component import or the SkemaOverlay component itself.\n- Ensure all JSX tags are properly closed - every <tag> needs a matching </tag>.\n- Do NOT run any shell commands. No npm, no git, no lint, no build commands. Just edit files.\n- STOP immediately after making the file changes. Do not verify, do not run tests, do not check status.`;\n\n/**\n * JSX syntax validation reminder\n */\nconst JSX_VALIDATION_RULE = `JSX SYNTAX: Every opening tag (<div>, <a>, <span>, <button>) MUST have a matching closing tag. Self-closing tags (<img />, <input />, <br />) must end with />.`;\n\n// =============================================================================\n// PROMPT 1: Fast DOM Selection\n// =============================================================================\n\n/**\n * Fast mode prompt for quick DOM element changes.\n * Used when fastMode is enabled for simple, targeted edits.\n *\n * @example\n * // Result: \"Make this button blue (target: \"Submit\"). Make the change directly...\"\n * buildFastDomSelectionPrompt({ comment: \"Make this button blue\", text: \"Submit\" })\n */\nexport function buildFastDomSelectionPrompt(input: DomSelectionInput): string {\n const { comment, selector, text, tagName } = input;\n\n // Build target description with both selector AND text for better context\n const parts: string[] = [];\n\n if (tagName) {\n parts.push(`<${tagName.toLowerCase()}>`);\n }\n if (selector) {\n parts.push(`selector: ${selector}`);\n }\n if (text) {\n parts.push(`text: \"${text.slice(0, 50)}\"`);\n }\n\n const target = parts.length > 0 ? ` (${parts.join(' | ')})` : '';\n\n return `${comment}${target}. Make the change directly, no explanation needed. ${CRITICAL_RULES} ${JSX_VALIDATION_RULE}`;\n}\n\n// =============================================================================\n// PROMPT 2: Detailed DOM Selection\n// =============================================================================\n\n/**\n * Detailed mode prompt for DOM element changes with full context.\n * Used for complex changes that need more information about the target.\n *\n * @example\n * buildDetailedDomSelectionPrompt({\n * comment: \"Add a hover effect\",\n * tagName: \"button\",\n * selector: \"#submit-btn\",\n * text: \"Submit Form\"\n * })\n */\nexport function buildDetailedDomSelectionPrompt(input: DetailedDomSelectionInput): string {\n const { comment, tagName, selector, text, elementPath, cssClasses, attributes, elements } = input;\n\n let prompt = `Make this code change: \"${comment || 'No specific comment provided'}\"\n\n## Target Element\n- Tag: <${tagName?.toLowerCase() || 'unknown'}>`;\n\n if (selector) {\n prompt += `\\n- Selector: ${selector}`;\n }\n\n if (elementPath) {\n prompt += `\\n- DOM Path: ${elementPath}`;\n }\n\n if (cssClasses) {\n prompt += `\\n- CSS Classes: ${cssClasses}`;\n }\n\n if (attributes && Object.keys(attributes).length > 0) {\n const attrStr = Object.entries(attributes)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(', ');\n prompt += `\\n- Attributes: ${attrStr}`;\n }\n\n if (text) {\n prompt += `\\n- Text Content: \"${text.slice(0, 150)}\"`;\n }\n\n if (elements && elements.length > 1) {\n prompt += `\\n\\n## Multi-Selection (${elements.length} elements)`;\n elements.slice(0, 5).forEach((el, i) => {\n prompt += `\\n${i + 1}. <${el.tagName}> ${el.selector}`;\n if (el.text) prompt += ` - \"${el.text.slice(0, 50)}\"`;\n });\n if (elements.length > 5) {\n prompt += `\\n... and ${elements.length - 5} more`;\n }\n }\n\n prompt += `\n\nMake minimal changes. ${CRITICAL_RULES} ${JSX_VALIDATION_RULE}`;\n\n return prompt;\n}\n\n// =============================================================================\n// PROMPT 3: Gesture Annotation\n// =============================================================================\n\n/**\n * Prompt for gesture-based annotations (circles, scribbles, etc.)\n */\nexport function buildGesturePrompt(input: GestureInput): string {\n const { comment, gesture, boundingBox } = input;\n\n return `Make this code change: \"${comment || 'No specific comment provided'}\"\n\nElement: gesture: ${gesture || 'unknown'} at (${boundingBox?.x || 0}, ${boundingBox?.y || 0})\n\nMake minimal changes. ${CRITICAL_RULES} ${JSX_VALIDATION_RULE}`;\n}\n\n// =============================================================================\n// PROMPT 4: Drawing to Code (Main Component Generation)\n// =============================================================================\n\n/**\n * Comprehensive prompt for converting wireframe sketches into React components.\n * This is the most complex prompt, used when users draw UI elements.\n *\n * The prompt instructs the AI to:\n * 1. Analyze the sketch to understand the visual intent\n * 2. Interpret (not transcribe) the low-fidelity drawing\n * 3. Generate high-quality inline JSX with Tailwind CSS\n * 4. Integrate naturally with the existing page flow\n */\nexport function buildDrawingToCodePrompt(input: DrawingInput): string {\n const {\n comment = 'Create a component based on this drawing',\n boundingBox,\n extractedText,\n gridConfig,\n viewport,\n nearbyElements = [],\n visionDescription,\n } = input;\n\n const gridSize = gridConfig?.size || 100;\n\n // Build grid cell reference for positioning\n let gridCellRef = '';\n if (boundingBox) {\n gridCellRef = getGridCellReference(boundingBox.x, boundingBox.y, gridSize);\n }\n\n // Build position context\n const positionContext = buildPositionContext(boundingBox, viewport, gridCellRef);\n\n // Build nearby elements context\n const nearbyContext = buildNearbyElementsContext(nearbyElements);\n\n // Build text extraction context\n const textContext = extractedText?.trim()\n ? `\\n**Text found in drawing (use as reference if hard to read):**\\n${extractedText}`\n : '';\n\n // Build image/vision analysis note\n const imageNote = buildImageNote(!!input.drawingImage, visionDescription);\n\n return `Your task is to interpret a user's sketch/wireframe and turn it into code that is integrated in the codebase.\n\n## User's Request\n\"${comment}\"\n\n## Drawing Context\n${positionContext}${textContext}${nearbyContext}${imageNote}\n\n## Your Process\n1. **Analyze the Sketch:** Understand the visual intent—what UI component does the user want?\n2. **Interpret, Don't Transcribe:** Elevate the low-fidelity drawing into a high-fidelity component. Choose appropriate spacing, colors, and typography that match modern design standards.\n3. **Infer Missing Details:** If something is underspecified, use your expertise to make the best choice. An informed decision is better than an incomplete component.\n\n## Implementation Guidelines\n${DRAWING_IMPLEMENTATION_GUIDELINES}\n\nMake the changes directly. Insert the UI elements inline at the appropriate location in the page. No explanation needed.\n\n## Error Prevention Rules\n${DRAWING_ERROR_PREVENTION_RULES}`;\n}\n\n/**\n * Implementation guidelines for drawing-to-code conversion\n */\nconst DRAWING_IMPLEMENTATION_GUIDELINES = `- **CRITICAL: DO NOT CREATE ANY NEW FILES. NEVER CREATE NEW FILES. You must ONLY edit existing files.**\n- Add your code directly inline within the existing JSX of the page file - do NOT create separate component files.\n- DO NOT run any shell commands (no npm, git, lint, build, or verification commands). Just edit files and STOP.\n- After making your file edits, you are DONE. Do not run any follow-up commands or checks.\n- Write the UI as inline JSX elements (divs, sections, etc.) directly in the return statement - NOT as a separate component definition\n- Use Tailwind CSS classes for styling (the project uses Tailwind)\n- Do NOT use hardcoded pixel positions or absolute coordinates - integrate naturally with existing page flow\n- Use flexbox, grid, or relative positioning to place the component appropriately\n- If the sketch shows:\n - **Rectangle/box:** Card, container, button, or input field depending on context\n - **Text elements:** Headings, paragraphs, or labels with appropriate hierarchy\n - **Form layout:** Input fields with labels, proper spacing\n - **Icons/shapes:** Use appropriate icons from lucide-react or inline SVGs (but DO NOT add new imports mid-file)\n - **Navigation:** Nav links, menus, or breadcrumbs\n - **Lists:** Ordered/unordered lists or grid layouts\n- Make the UI fit naturally with the existing page design\n- Style it nicely and according to the existing codebase\n- Use semantic HTML and ARIA attributes where appropriate\n- **NEVER add import statements inside JSX or in the middle of a file - all imports must be at the very top of the file**\n- If you need a new import, add it at the TOP of the file with the other imports, then use it in the JSX below`;\n\n/**\n * Error prevention rules for drawing-to-code conversion\n */\nconst DRAWING_ERROR_PREVENTION_RULES = `1. **NEVER CREATE NEW FILES** - Do NOT create new component files, utility files, or any other files. Write everything inline in the existing file\n2. You do not need to update package.json or anything, just add / edit the react component.\n3. Do NOT add import statements in the middle of the file or inside JSX - imports go ONLY at the top\n4. Do NOT modify the Skema overlay component import or the SkemaOverlay component itself\n5. If you need something that requires an import and it's not already imported, either use an alternative that doesn't need an import, or add the import at the very TOP of the file with the other imports\n6. DONT MAKE ANY CHANGES THAT WOULD RESULT IN A Build Error\n7. **JSX SYNTAX VALIDATION** - ALWAYS ensure every JSX tag is properly closed. Every opening tag like <div>, <a>, <span>, <button> MUST have a matching closing tag </div>, </a>, </span>, </button>. Self-closing tags like <img />, <input />, <br /> must end with />. Before finishing, mentally verify all tag pairs are balanced.`;\n\n// =============================================================================\n// PROMPT 5: Image Analysis (Gemini Vision)\n// =============================================================================\n\n/**\n * Prompt for Gemini Vision to analyze a wireframe sketch image.\n * This generates a description that is then passed to the main drawing prompt.\n */\nexport const IMAGE_ANALYSIS_PROMPT = `\nAnalyze this UI wireframe sketch in some detail (not too long) for a front-end developer.\n\nDescribe every element, layout, spacing, icons, and text you see.\nFocus on whats apparent, don't overthink it.\nMention relative positions and hierarchy.\nBe distinct about what is drawn vs what might be background.\n\nDo NOT focus on exact pixel coordinates or absolute positions - describe layouts\nin terms of relative positioning (left/right/top/bottom, centered, evenly spaced, etc.).\n\nIt is expected that they will be rough draft's / hand-drawn things. Interpret the drawing and its goals as best as you can.\nDO NOT MENTION THAT THINGS HAVE \"Hand-sketched\" or \"Hand-drawn\" vibes. Make assumptions of what they were trying to do.\nJust FYI, this gets passed onto a generator to generate the actual code of modern UI componenents.\n`.trim();\n\n// =============================================================================\n// Helper Functions for Building Prompt Sections\n// =============================================================================\n\n/**\n * Build position context section for drawing prompt\n */\nfunction buildPositionContext(\n bbox?: { x: number; y: number; width: number; height: number },\n viewport?: ViewportInfo,\n gridCellRef?: string\n): string {\n if (!bbox) return '';\n\n if (viewport) {\n const relX = ((bbox.x / viewport.width) * 100).toFixed(1);\n const relY = ((bbox.y / viewport.height) * 100).toFixed(1);\n let context = `**Drawing Location:** Approximately ${relX}% from left, ${relY}% from top of viewport`;\n if (gridCellRef) {\n context += ` (grid cell ${gridCellRef})`;\n }\n return context;\n }\n\n return `**Drawing Area:** ${Math.round(bbox.width)}×${Math.round(bbox.height)}px`;\n}\n\n/**\n * Build nearby elements context section for drawing prompt\n */\nfunction buildNearbyElementsContext(nearbyElements: NearbyElement[]): string {\n if (nearbyElements.length === 0) return '';\n\n const elementList = nearbyElements\n .slice(0, 5)\n .map((el) => {\n let desc = `- <${el.tagName.toLowerCase()}>`;\n if (el.text) desc += `: \"${el.text.slice(0, 50)}\"`;\n if (el.className) desc += ` (class: ${el.className.slice(0, 50)})`;\n desc += ` (${el.selector})`;\n return desc;\n })\n .join('\\n');\n\n return `\\n**Nearby DOM Elements (for placement reference):**\\n${elementList}`;\n}\n\n/**\n * Build image/vision analysis note section for drawing prompt\n */\nfunction buildImageNote(hasImage: boolean, visionDescription?: string): string {\n let note = hasImage\n ? '\\n**[Drawing image provided as base64 PNG with labeled grid overlay]**'\n : '';\n\n if (visionDescription) {\n note += `\\n\\n## Visual Analysis of Drawing\\n${visionDescription}`;\n }\n\n return note;\n}\n","import { spawn, execSync, type ChildProcess } from 'child_process';\nimport { GoogleGenerativeAI } from '@google/generative-ai';\nimport type { Annotation } from '../types';\n\n// Import prompts from dedicated prompts file\nimport {\n buildFastDomSelectionPrompt,\n buildDetailedDomSelectionPrompt,\n buildGesturePrompt,\n buildDrawingToCodePrompt,\n IMAGE_ANALYSIS_PROMPT,\n} from './prompts';\n\n// Store annotation ID -> git stash ref for undo functionality\nconst annotationSnapshots = new Map<string, string>();\n\n/**\n * Create a git snapshot before making changes (for undo support)\n */\nfunction createSnapshot(annotationId: string, cwd: string): string | null {\n try {\n // Create a stash-like commit object without actually stashing\n // This captures the current working directory state\n const stashRef = execSync('git stash create', { cwd, encoding: 'utf-8' }).trim();\n\n if (stashRef) {\n annotationSnapshots.set(annotationId, stashRef);\n console.log(`[Skema] Created snapshot ${stashRef.slice(0, 7)} for annotation ${annotationId}`);\n return stashRef;\n }\n\n // If stash create returns empty, there are no changes to snapshot\n // Store current HEAD instead\n const headRef = execSync('git rev-parse HEAD', { cwd, encoding: 'utf-8' }).trim();\n annotationSnapshots.set(annotationId, headRef);\n console.log(`[Skema] Using HEAD ${headRef.slice(0, 7)} for annotation ${annotationId}`);\n return headRef;\n } catch (error) {\n console.error('[Skema] Failed to create snapshot:', error);\n return null;\n }\n}\n\n/**\n * Revert changes for an annotation by restoring from snapshot\n */\nexport function revertAnnotation(annotationId: string, cwd: string = process.cwd()): { success: boolean; message: string } {\n const snapshotRef = annotationSnapshots.get(annotationId);\n\n if (!snapshotRef) {\n return { success: false, message: `No snapshot found for annotation ${annotationId}` };\n }\n\n try {\n // Get list of modified files since the snapshot\n const changedFiles = execSync(`git diff --name-only ${snapshotRef}`, { cwd, encoding: 'utf-8' })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (changedFiles.length === 0) {\n annotationSnapshots.delete(annotationId);\n return { success: true, message: 'No changes to revert' };\n }\n\n // Restore each changed file from the snapshot\n for (const file of changedFiles) {\n try {\n execSync(`git checkout ${snapshotRef} -- \"${file}\"`, { cwd, encoding: 'utf-8' });\n console.log(`[Skema] Reverted: ${file}`);\n } catch {\n // File might not exist in snapshot (new file), so delete it\n try {\n execSync(`git checkout HEAD -- \"${file}\"`, { cwd, encoding: 'utf-8' });\n } catch {\n // Ignore if file doesn't exist\n }\n }\n }\n\n annotationSnapshots.delete(annotationId);\n console.log(`[Skema] Reverted ${changedFiles.length} file(s) for annotation ${annotationId}`);\n return { success: true, message: `Reverted ${changedFiles.length} file(s)` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error('[Skema] Failed to revert:', message);\n return { success: false, message };\n }\n}\n\n/**\n * Get all tracked annotation IDs\n */\nexport function getTrackedAnnotations(): string[] {\n return Array.from(annotationSnapshots.keys());\n}\n\nexport interface GeminiCLIOptions {\n /** Working directory for Gemini CLI */\n cwd?: string;\n /** API key (defaults to GEMINI_API_KEY env var) */\n apiKey?: string;\n /** Auto-approve all tool calls (default: true) */\n yolo?: boolean;\n /** Output format (default: 'stream-json') */\n outputFormat?: 'text' | 'json' | 'stream-json';\n /** Model to use (default: 'gemini-2.5-flash' for speed) */\n model?: string;\n /** Use minimal/fast prompt (default: true) */\n fastMode?: boolean;\n}\n\nexport interface ProjectContext {\n pathname?: string;\n viewport?: { width: number; height: number };\n}\n\nexport interface GeminiCLIEvent {\n type: 'init' | 'message' | 'tool_use' | 'tool_result' | 'error' | 'result' | 'done' | 'debug';\n timestamp?: string;\n content?: string;\n role?: 'user' | 'assistant';\n tool_name?: string;\n tool_id?: string;\n status?: 'success' | 'error';\n code?: number;\n [key: string]: unknown;\n}\n\n/**\n * Build a prompt for Gemini CLI from an annotation\n *\n * @see /server/prompts.ts for the actual prompt templates\n */\nexport function buildPromptFromAnnotation(\n annotation: Partial<Annotation> & { comment?: string },\n _projectContext?: ProjectContext,\n options?: { fastMode?: boolean; visionDescription?: string }\n): string {\n const fastMode = options?.fastMode ?? true;\n\n // Handle drawing annotations - uses the comprehensive drawing-to-code prompt\n if (annotation.type === 'drawing') {\n const drawingAnnotation = annotation as {\n boundingBox?: { x: number; y: number; width: number; height: number };\n drawingSvg?: string;\n drawingImage?: string;\n extractedText?: string;\n gridConfig?: { color: string; size: number; labels: boolean };\n viewport?: { width: number; height: number; scrollX: number; scrollY: number };\n projectStyles?: any;\n nearbyElements?: any[];\n comment?: string;\n };\n\n return buildDrawingToCodePrompt({\n comment: drawingAnnotation.comment || 'Create a component based on this drawing',\n boundingBox: drawingAnnotation.boundingBox,\n drawingSvg: drawingAnnotation.drawingSvg,\n drawingImage: drawingAnnotation.drawingImage,\n extractedText: drawingAnnotation.extractedText,\n gridConfig: drawingAnnotation.gridConfig,\n viewport: drawingAnnotation.viewport,\n projectStyles: drawingAnnotation.projectStyles,\n nearbyElements: drawingAnnotation.nearbyElements,\n visionDescription: options?.visionDescription,\n });\n }\n\n // Handle gesture annotations\n if (annotation.type === 'gesture') {\n const gestureAnnotation = annotation as { gesture?: string; boundingBox?: { x: number; y: number } };\n return buildGesturePrompt({\n comment: annotation.comment || 'No specific comment provided',\n gesture: gestureAnnotation.gesture,\n boundingBox: gestureAnnotation.boundingBox,\n });\n }\n\n // Handle DOM selection annotations\n const domAnnotation = annotation as {\n tagName?: string;\n selector?: string;\n elementPath?: string;\n text?: string;\n cssClasses?: string;\n attributes?: Record<string, string>;\n elements?: Array<{\n tagName: string;\n selector: string;\n elementPath: string;\n text?: string;\n }>;\n };\n\n // Fast mode: minimal prompt for quick changes\n if (fastMode) {\n return buildFastDomSelectionPrompt({\n comment: annotation.comment || 'No specific comment provided',\n selector: domAnnotation.selector,\n text: domAnnotation.text,\n tagName: domAnnotation.tagName,\n });\n }\n\n // Detailed mode: full context\n return buildDetailedDomSelectionPrompt({\n comment: annotation.comment || 'No specific comment provided',\n tagName: domAnnotation.tagName,\n selector: domAnnotation.selector,\n text: domAnnotation.text,\n elementPath: domAnnotation.elementPath,\n cssClasses: domAnnotation.cssClasses,\n attributes: domAnnotation.attributes,\n elements: domAnnotation.elements,\n });\n}\n\n\n/**\n * Spawn Gemini CLI and return an async iterator of events\n */\nexport function spawnGeminiCLI(\n prompt: string,\n options: GeminiCLIOptions = {}\n): {\n process: ChildProcess;\n events: AsyncIterable<GeminiCLIEvent>;\n} {\n const {\n cwd = process.cwd(),\n apiKey = process.env.GEMINI_API_KEY,\n yolo = true,\n outputFormat = 'stream-json',\n model = 'gemini-2.5-flash',\n } = options;\n\n const args = ['-p', prompt];\n\n if (yolo) {\n args.push('--yolo');\n }\n\n args.push('--output-format', outputFormat);\n args.push('-m', model);\n\n const gemini = spawn('gemini', args, {\n cwd,\n env: {\n ...process.env,\n ...(apiKey ? { GEMINI_API_KEY: apiKey } : {}),\n },\n });\n\n const events: AsyncIterable<GeminiCLIEvent> = {\n [Symbol.asyncIterator]() {\n let buffer = '';\n let done = false;\n const queue: GeminiCLIEvent[] = [];\n let resolveNext: ((value: IteratorResult<GeminiCLIEvent>) => void) | null = null;\n\n const pushEvent = (event: GeminiCLIEvent) => {\n if (resolveNext) {\n resolveNext({ value: event, done: false });\n resolveNext = null;\n } else {\n queue.push(event);\n }\n };\n\n gemini.stdout.on('data', (data: Buffer) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n const event = JSON.parse(line) as GeminiCLIEvent;\n pushEvent(event);\n } catch {\n // Raw output, wrap it\n pushEvent({ type: 'message', content: line });\n }\n }\n }\n });\n\n gemini.stderr.on('data', (data: Buffer) => {\n pushEvent({ type: 'error', content: data.toString() });\n });\n\n gemini.on('close', (code) => {\n if (buffer.trim()) {\n try {\n const event = JSON.parse(buffer) as GeminiCLIEvent;\n pushEvent(event);\n } catch {\n pushEvent({ type: 'message', content: buffer });\n }\n }\n pushEvent({ type: 'done', code: code ?? 0 });\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as GeminiCLIEvent, done: true });\n }\n });\n\n gemini.on('error', (err) => {\n pushEvent({ type: 'error', content: err.message });\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as GeminiCLIEvent, done: true });\n }\n });\n\n return {\n next(): Promise<IteratorResult<GeminiCLIEvent>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n if (done) {\n return Promise.resolve({ value: undefined as unknown as GeminiCLIEvent, done: true });\n }\n return new Promise((resolve) => {\n resolveNext = resolve;\n });\n },\n };\n },\n };\n\n return { process: gemini, events };\n}\n\n/**\n * Analyze an image using the Google Generative AI SDK (Gemini Vision)\n *\n * @see /server/prompts.ts for IMAGE_ANALYSIS_PROMPT\n */\nasync function analyzeImageWithGemini(apiKey: string, base64Image: string, modelName: string = 'gemini-2.5-flash'): Promise<string> {\n try {\n const genAI = new GoogleGenerativeAI(apiKey);\n const model = genAI.getGenerativeModel({ model: modelName });\n\n // Clean base64 string if needed (remove data URI prefix)\n const imageParts = [\n {\n inlineData: {\n data: base64Image.replace(/^data:image\\/\\w+;base64,/, ''),\n mimeType: 'image/png',\n },\n },\n ];\n\n const result = await model.generateContent([\n IMAGE_ANALYSIS_PROMPT,\n ...imageParts,\n ]);\n\n const response = await result.response;\n const text = response.text();\n return text;\n } catch (error) {\n console.error('Failed to analyze image with Gemini Vision:', error);\n return `[Extension Error] Failed to analyze drawing: ${error instanceof Error ? error.message : String(error)}`;\n }\n}\n\n/**\n * Options for createGeminiCLIStream with abort support\n */\ninterface StreamOptions extends GeminiCLIOptions {\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Callback when cancelled - for cleanup like reverting snapshots */\n onCancel?: () => void;\n}\n\n/**\n * Create a streaming response for use in API routes (Next.js, Express, etc.)\n */\nexport function createGeminiCLIStream(\n annotation: Partial<Annotation> & { comment?: string },\n projectContext?: ProjectContext,\n options?: StreamOptions\n): ReadableStream<Uint8Array> {\n // We need to handle the prompt building inside logic because it might be async now\n // But ReadableStream start controller can be async\n const encoder = new TextEncoder();\n let geminiProcess: ChildProcess | null = null;\n let isCancelled = false;\n\n return new ReadableStream({\n async start(controller) {\n const apiKey = options?.apiKey || process.env.GEMINI_API_KEY;\n let visionDescription = '';\n\n // Set up abort handler\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n isCancelled = true;\n if (geminiProcess && !geminiProcess.killed) {\n console.log('[Skema Server] Killing Gemini CLI process due to client disconnect');\n geminiProcess.kill('SIGTERM');\n }\n // Call the onCancel callback for cleanup (like reverting snapshots)\n options.onCancel?.();\n try {\n controller.close();\n } catch {\n // Controller may already be closed\n }\n });\n }\n\n // Perform Image Analysis if needed for drawing annotations with images\n if (annotation.type === 'drawing' && (annotation as { drawingImage?: string }).drawingImage && apiKey) {\n // Check if cancelled before vision analysis\n if (isCancelled) return;\n\n // Send a \"progress\" event to the client\n const progressEvent: GeminiCLIEvent = {\n type: 'message',\n role: 'assistant',\n content: '[Analyzing] Drawing image with Gemini Vision...',\n timestamp: new Date().toISOString()\n };\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(progressEvent)}\\n\\n`));\n\n visionDescription = await analyzeImageWithGemini(\n apiKey,\n (annotation as { drawingImage: string }).drawingImage,\n options?.model || 'gemini-2.5-flash'\n );\n\n // Check if cancelled after vision analysis\n if (isCancelled) return;\n\n // Log the analysis result\n const analysisEvent: GeminiCLIEvent = {\n type: 'message',\n role: 'assistant',\n content: `[Vision] Visual Analysis:\\n${visionDescription}`,\n timestamp: new Date().toISOString()\n };\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(analysisEvent)}\\n\\n`));\n }\n\n // Check if cancelled before spawning CLI\n if (isCancelled) return;\n\n const prompt = buildPromptFromAnnotation(\n annotation,\n projectContext,\n {\n fastMode: options?.fastMode ?? false,\n visionDescription\n }\n );\n\n // Send the prompt as a debug event so it shows up in browser console\n const promptEvent: GeminiCLIEvent = {\n type: 'debug',\n content: prompt,\n label: 'GEMINI CLI PROMPT',\n timestamp: new Date().toISOString()\n };\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(promptEvent)}\\n\\n`));\n\n const { process: proc, events } = spawnGeminiCLI(prompt, options);\n geminiProcess = proc;\n\n for await (const event of events) {\n // Check if cancelled during processing\n if (isCancelled) break;\n\n const sseData = `data: ${JSON.stringify(event)}\\n\\n`;\n controller.enqueue(encoder.encode(sseData));\n\n if (event.type === 'done') {\n controller.close();\n break;\n }\n }\n },\n cancel() {\n // Called when the stream is cancelled\n isCancelled = true;\n if (geminiProcess && !geminiProcess.killed) {\n geminiProcess.kill('SIGTERM');\n }\n options?.onCancel?.();\n }\n });\n}\n\n/**\n * Run Gemini CLI and wait for completion\n */\nexport async function runGeminiCLI(\n annotation: Partial<Annotation> & { comment?: string },\n projectContext?: ProjectContext,\n options?: GeminiCLIOptions\n): Promise<{\n success: boolean;\n response: string;\n events: GeminiCLIEvent[];\n}> {\n const apiKey = options?.apiKey || process.env.GEMINI_API_KEY;\n let visionDescription = '';\n\n // Perform Image Analysis if needed for drawing annotations with images\n if (annotation.type === 'drawing' && (annotation as { drawingImage?: string }).drawingImage && apiKey) {\n visionDescription = await analyzeImageWithGemini(\n apiKey,\n (annotation as { drawingImage: string }).drawingImage,\n options?.model || 'gemini-2.5-flash'\n );\n }\n\n const prompt = buildPromptFromAnnotation(\n annotation,\n projectContext,\n {\n fastMode: options?.fastMode ?? false,\n visionDescription\n }\n );\n\n // Note: For runGeminiCLI (non-streaming), logs are not sent to browser\n // Use createGeminiCLIStream for browser console logging\n const { events: eventIterator } = spawnGeminiCLI(prompt, options);\n\n const events: GeminiCLIEvent[] = [];\n let response = '';\n let success = true;\n\n for await (const event of eventIterator) {\n events.push(event);\n\n if (event.type === 'message' && event.role === 'assistant' && event.content) {\n response += event.content;\n }\n\n if (event.type === 'done' && event.code !== 0) {\n success = false;\n }\n }\n\n return { success, response, events };\n}\n\n// =============================================================================\n// Next.js Route Handler - can be directly re-exported\n// =============================================================================\n\n/**\n * Next.js App Router POST handler for Gemini CLI\n *\n * Usage in your app/api/gemini/route.ts:\n * ```typescript\n * export { POST, DELETE } from 'skema-core/server';\n * ```\n *\n * Or with custom options:\n * ```typescript\n * import { createGeminiRouteHandler, createRevertRouteHandler } from 'skema-core/server';\n * export const POST = createGeminiRouteHandler({ cwd: '/custom/path' });\n * export const DELETE = createRevertRouteHandler({ cwd: '/custom/path' });\n * ```\n */\nexport function createGeminiRouteHandler(defaultOptions?: GeminiCLIOptions) {\n return async function POST(request: Request): Promise<Response> {\n const { annotation, projectContext } = await request.json();\n const cwd = defaultOptions?.cwd ?? process.cwd();\n\n // Create snapshot for undo support (using annotation.id if available)\n const annotationId = annotation.id || `temp-${Date.now()}`;\n createSnapshot(annotationId, cwd);\n\n const stream = createGeminiCLIStream(annotation, projectContext, {\n cwd,\n ...defaultOptions,\n // Pass abort signal from request for client disconnect detection\n signal: request.signal,\n // Revert snapshot if client cancels/disconnects\n onCancel: () => {\n console.log(`[Skema Server] Client disconnected, reverting snapshot for: ${annotationId}`);\n const result = revertAnnotation(annotationId, cwd);\n if (result.success) {\n console.log(`[Skema Server] Successfully reverted changes for: ${annotationId}`);\n } else {\n console.error(`[Skema Server] Failed to revert changes: ${result.message}`);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'X-Annotation-Id': annotationId,\n },\n });\n };\n}\n\n/**\n * Next.js App Router DELETE handler for reverting Gemini changes\n */\nexport function createRevertRouteHandler(defaultOptions?: { cwd?: string }) {\n return async function DELETE(request: Request): Promise<Response> {\n const { annotationId } = await request.json();\n const cwd = defaultOptions?.cwd ?? process.cwd();\n\n if (!annotationId) {\n return new Response(JSON.stringify({ success: false, message: 'Missing annotationId' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const result = revertAnnotation(annotationId, cwd);\n\n return new Response(JSON.stringify(result), {\n status: result.success ? 200 : 400,\n headers: { 'Content-Type': 'application/json' },\n });\n };\n}\n\n/**\n * Default POST handler - ready to use in Next.js App Router\n *\n * Usage:\n * ```typescript\n * // app/api/gemini/route.ts\n * export { POST, DELETE } from 'skema-core/server';\n * ```\n */\nexport const POST = createGeminiRouteHandler();\nexport const DELETE = createRevertRouteHandler();\n","import { spawn, type ChildProcess } from 'child_process';\n\n// =============================================================================\n// AI Provider Types\n// =============================================================================\n\n// CLI-based providers (legacy mode) - only gemini and claude have CLIs\nexport type AIProvider = 'gemini' | 'claude';\n\n// All provider names (used for events and type narrowing)\nexport type AnyProvider = 'gemini' | 'claude';\n\nexport interface AIProviderConfig {\n provider: AIProvider;\n /** Working directory for CLI commands */\n cwd?: string;\n /** Model override (provider-specific) */\n model?: string;\n}\n\nexport interface AIStreamEvent {\n type: 'init' | 'text' | 'tool_use' | 'tool_result' | 'error' | 'done' | 'debug';\n content?: string;\n timestamp: string;\n provider: AnyProvider;\n /** Raw event from the CLI (provider-specific) */\n raw?: unknown;\n}\n\nexport interface AIRunResult {\n success: boolean;\n output: string;\n events: AIStreamEvent[];\n provider: AIProvider;\n}\n\n// =============================================================================\n// Provider Configurations\n// =============================================================================\n\ninterface ProviderSpec {\n command: string;\n buildArgs: (prompt: string, options?: { model?: string; yolo?: boolean }) => string[];\n parseOutput: (line: string) => AIStreamEvent | null;\n}\n\nconst PROVIDERS: Record<AIProvider, ProviderSpec> = {\n gemini: {\n command: 'gemini',\n buildArgs: (prompt, options) => {\n const args = ['-p', prompt];\n if (options?.yolo !== false) args.push('--yolo');\n args.push('--output-format', 'stream-json');\n if (options?.model) args.push('-m', options.model);\n else args.push('-m', 'gemini-2.5-flash');\n return args;\n },\n parseOutput: (line) => {\n try {\n const parsed = JSON.parse(line);\n return {\n type: mapGeminiEventType(parsed.type),\n content: parsed.content || parsed.message,\n timestamp: new Date().toISOString(),\n provider: 'gemini',\n raw: parsed,\n };\n } catch {\n return {\n type: 'text',\n content: line,\n timestamp: new Date().toISOString(),\n provider: 'gemini',\n };\n }\n },\n },\n\n claude: {\n command: 'claude',\n buildArgs: (prompt, options) => {\n const args = ['-p', prompt, '--output-format', 'stream-json'];\n if (options?.yolo !== false) args.push('--dangerously-skip-permissions');\n if (options?.model) args.push('--model', options.model);\n return args;\n },\n parseOutput: (line) => {\n try {\n const parsed = JSON.parse(line);\n return {\n type: mapClaudeEventType(parsed.type),\n content: parsed.content || extractClaudeContent(parsed),\n timestamp: new Date().toISOString(),\n provider: 'claude',\n raw: parsed,\n };\n } catch {\n return {\n type: 'text',\n content: line,\n timestamp: new Date().toISOString(),\n provider: 'claude',\n };\n }\n },\n },\n};\n\n// =============================================================================\n// Event Type Mappers\n// =============================================================================\n\nfunction mapGeminiEventType(type: string): AIStreamEvent['type'] {\n switch (type) {\n case 'init': return 'init';\n case 'message': return 'text';\n case 'tool_use': return 'tool_use';\n case 'tool_result': return 'tool_result';\n case 'error': return 'error';\n case 'done': case 'result': return 'done';\n default: return 'text';\n }\n}\n\nfunction mapClaudeEventType(type: string): AIStreamEvent['type'] {\n switch (type) {\n case 'system': return 'init';\n case 'assistant': case 'text': return 'text';\n case 'tool_use': return 'tool_use';\n case 'tool_result': return 'tool_result';\n case 'error': return 'error';\n case 'result': return 'done';\n default: return 'text';\n }\n}\n\nfunction extractClaudeContent(parsed: Record<string, unknown>): string | undefined {\n // Claude Code stream-json format can have content in different places\n if (typeof parsed.content === 'string') return parsed.content;\n if (parsed.message && typeof parsed.message === 'object') {\n const msg = parsed.message as Record<string, unknown>;\n if (typeof msg.content === 'string') return msg.content;\n }\n return undefined;\n}\n\n// =============================================================================\n// Core Functions\n// =============================================================================\n\n/**\n * Spawn an AI CLI and return an async iterator of events\n */\nexport function spawnAICLI(\n prompt: string,\n config: AIProviderConfig\n): {\n process: ChildProcess;\n events: AsyncIterable<AIStreamEvent>;\n} {\n const spec = PROVIDERS[config.provider];\n const args = spec.buildArgs(prompt, { model: config.model });\n const cwd = config.cwd || process.cwd();\n\n console.log(`[Skema] Spawning ${config.provider}: ${spec.command} ${args.join(' ')}`);\n\n const child = spawn(spec.command, args, {\n cwd,\n env: process.env,\n });\n\n const events: AsyncIterable<AIStreamEvent> = {\n [Symbol.asyncIterator]() {\n let buffer = '';\n let done = false;\n const queue: AIStreamEvent[] = [];\n let resolveNext: ((value: IteratorResult<AIStreamEvent>) => void) | null = null;\n\n const pushEvent = (event: AIStreamEvent) => {\n if (resolveNext) {\n resolveNext({ value: event, done: false });\n resolveNext = null;\n } else {\n queue.push(event);\n }\n };\n\n child.stdout?.on('data', (data: Buffer) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n const event = spec.parseOutput(line.trim());\n if (event) pushEvent(event);\n }\n }\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n const content = data.toString().trim();\n if (content) {\n pushEvent({\n type: 'error',\n content,\n timestamp: new Date().toISOString(),\n provider: config.provider,\n });\n }\n });\n\n child.on('close', (code) => {\n // Process remaining buffer\n if (buffer.trim()) {\n const event = spec.parseOutput(buffer.trim());\n if (event) pushEvent(event);\n }\n\n pushEvent({\n type: 'done',\n content: `Process exited with code ${code}`,\n timestamp: new Date().toISOString(),\n provider: config.provider,\n });\n\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as AIStreamEvent, done: true });\n }\n });\n\n child.on('error', (err) => {\n pushEvent({\n type: 'error',\n content: `Failed to spawn ${config.provider}: ${err.message}`,\n timestamp: new Date().toISOString(),\n provider: config.provider,\n });\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as AIStreamEvent, done: true });\n }\n });\n\n return {\n next(): Promise<IteratorResult<AIStreamEvent>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n if (done) {\n return Promise.resolve({ value: undefined as unknown as AIStreamEvent, done: true });\n }\n return new Promise((resolve) => {\n resolveNext = resolve;\n });\n },\n };\n },\n };\n\n return { process: child, events };\n}\n\n/**\n * Run an AI CLI and wait for completion (non-streaming)\n */\nexport async function runAICLI(\n prompt: string,\n config: AIProviderConfig\n): Promise<AIRunResult> {\n const { events } = spawnAICLI(prompt, config);\n\n const collectedEvents: AIStreamEvent[] = [];\n let output = '';\n let success = true;\n\n for await (const event of events) {\n collectedEvents.push(event);\n\n if (event.type === 'text' && event.content) {\n output += event.content + '\\n';\n }\n\n if (event.type === 'error') {\n success = false;\n }\n }\n\n return {\n success,\n output: output.trim(),\n events: collectedEvents,\n provider: config.provider,\n };\n}\n\n/**\n * Check if a provider CLI is available\n */\nexport function isProviderAvailable(provider: AIProvider): boolean {\n const spec = PROVIDERS[provider];\n try {\n const { execSync } = require('child_process');\n execSync(`which ${spec.command}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get available providers\n */\nexport function getAvailableProviders(): AIProvider[] {\n return (['gemini', 'claude'] as AIProvider[]).filter(isProviderAvailable);\n}\n\n// =============================================================================\n// Provider Status (installed + authorized)\n// =============================================================================\n\nexport interface ProviderStatus {\n installed: boolean;\n authorized: boolean;\n /** Human-readable status message */\n message: string;\n}\n\n/**\n * Check if a provider CLI is authorized (can actually run).\n * Uses lightweight commands that verify auth without doing real work.\n */\nfunction checkProviderAuthorized(provider: AIProvider): boolean {\n const { execSync } = require('child_process');\n try {\n if (provider === 'gemini') {\n // `gemini --version` succeeds if installed; auth is checked via a quick prompt\n // We use a minimal approach: check if GEMINI_API_KEY is set or if the CLI config exists\n execSync('gemini --version', { stdio: 'ignore', timeout: 5000 });\n return true;\n } else if (provider === 'claude') {\n // claude --version succeeds if installed; auth is checked similarly\n execSync('claude --version', { stdio: 'ignore', timeout: 5000 });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get detailed status for a single provider\n */\nexport function getProviderStatus(provider: AIProvider): ProviderStatus {\n const installed = isProviderAvailable(provider);\n if (!installed) {\n return {\n installed: false,\n authorized: false,\n message: `${provider} CLI not installed`,\n };\n }\n\n const authorized = checkProviderAuthorized(provider);\n if (!authorized) {\n return {\n installed: true,\n authorized: false,\n message: `${provider} CLI installed but not authorized`,\n };\n }\n\n return {\n installed: true,\n authorized: true,\n message: 'Ready',\n };\n}\n\n/**\n * Get status for all providers\n */\nexport function getAllProviderStatuses(): Record<AIProvider, ProviderStatus> {\n return {\n gemini: getProviderStatus('gemini'),\n claude: getProviderStatus('claude'),\n };\n}\n","import { GoogleGenerativeAI } from '@google/generative-ai';\nimport type { AIProvider } from './ai-provider';\nimport { IMAGE_ANALYSIS_PROMPT } from './prompts';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface VisionAnalysisResult {\n success: boolean;\n description: string;\n provider: AIProvider;\n error?: string;\n}\n\nexport interface VisionConfig {\n provider: AIProvider;\n /** API key for vision API (falls back to env vars) */\n apiKey?: string;\n /** Model to use for vision */\n model?: string;\n}\n\n// =============================================================================\n// Gemini Vision\n// =============================================================================\n\nasync function analyzeWithGemini(\n base64Image: string,\n apiKey: string,\n model: string = 'gemini-2.5-flash'\n): Promise<VisionAnalysisResult> {\n try {\n const genAI = new GoogleGenerativeAI(apiKey);\n const visionModel = genAI.getGenerativeModel({ model });\n\n // Clean base64 string if needed (remove data URI prefix)\n const cleanBase64 = base64Image.replace(/^data:image\\/\\w+;base64,/, '');\n\n const result = await visionModel.generateContent([\n IMAGE_ANALYSIS_PROMPT,\n {\n inlineData: {\n data: cleanBase64,\n mimeType: 'image/png',\n },\n },\n ]);\n\n const response = await result.response;\n const text = response.text();\n\n return {\n success: true,\n description: text,\n provider: 'gemini',\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('[Vision] Gemini analysis failed:', message);\n return {\n success: false,\n description: '',\n provider: 'gemini',\n error: message,\n };\n }\n}\n\n// =============================================================================\n// Claude Vision\n// =============================================================================\n\nasync function analyzeWithClaude(\n base64Image: string,\n apiKey: string,\n model: string = 'claude-sonnet-4-20250514'\n): Promise<VisionAnalysisResult> {\n try {\n // Dynamic import to avoid bundling issues if not installed\n const Anthropic = (await import('@anthropic-ai/sdk')).default;\n const client = new Anthropic({ apiKey });\n\n // Clean base64 string\n const cleanBase64 = base64Image.replace(/^data:image\\/\\w+;base64,/, '');\n\n const response = await client.messages.create({\n model,\n max_tokens: 1024,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: 'image/png',\n data: cleanBase64,\n },\n },\n {\n type: 'text',\n text: IMAGE_ANALYSIS_PROMPT,\n },\n ],\n },\n ],\n });\n\n // Extract text from response\n const textContent = response.content.find((c) => c.type === 'text');\n const description = textContent && 'text' in textContent ? textContent.text : '';\n\n return {\n success: true,\n description,\n provider: 'claude',\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('[Vision] Claude analysis failed:', message);\n return {\n success: false,\n description: '',\n provider: 'claude',\n error: message,\n };\n }\n}\n\n// =============================================================================\n// Main Vision Analysis Function\n// =============================================================================\n\n/**\n * Analyze an image using the specified AI provider's vision capabilities\n */\nexport async function analyzeImage(\n base64Image: string,\n config: VisionConfig\n): Promise<VisionAnalysisResult> {\n const { provider } = config;\n\n // Get API key from config or environment\n let apiKey = config.apiKey;\n if (!apiKey) {\n apiKey = provider === 'gemini'\n ? process.env.GEMINI_API_KEY\n : process.env.ANTHROPIC_API_KEY;\n }\n\n if (!apiKey) {\n return {\n success: false,\n description: '',\n provider,\n error: `No API key found for ${provider} vision. Set ${provider === 'gemini' ? 'GEMINI_API_KEY' : 'ANTHROPIC_API_KEY'} environment variable.`,\n };\n }\n\n console.log(`[Vision] Analyzing image with ${provider}...`);\n\n if (provider === 'gemini') {\n return analyzeWithGemini(base64Image, apiKey, config.model);\n } else {\n return analyzeWithClaude(base64Image, apiKey, config.model);\n }\n}\n\n/**\n * Check if vision analysis is available for a provider\n */\nexport function isVisionAvailable(provider: AIProvider): boolean {\n if (provider === 'gemini') {\n return !!process.env.GEMINI_API_KEY;\n } else {\n return !!process.env.ANTHROPIC_API_KEY;\n }\n}\n","// =============================================================================\n// Annotation Store - In-memory store for MCP-mode queued annotations\n// =============================================================================\n//\n// When Skema is in MCP mode, annotations are queued here instead of being\n// processed immediately. The MCP server reads from this store to let AI agents\n// retrieve and act on annotations.\n//\n\nimport type { Annotation } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type AnnotationStatus = 'pending' | 'acknowledged' | 'resolved' | 'dismissed';\n\nexport interface StoredAnnotation {\n /** The original Skema annotation data */\n annotation: Annotation;\n /** User comment describing the desired change */\n comment: string;\n /** Current status in the MCP workflow */\n status: AnnotationStatus;\n /** When it was queued */\n createdAt: string;\n /** When status last changed */\n updatedAt: string;\n /** If resolved/dismissed, who did it */\n resolvedBy?: 'human' | 'agent';\n /** Resolution summary (from agent) */\n resolutionSummary?: string;\n /** Dismissal reason (from agent) */\n dismissalReason?: string;\n}\n\n// =============================================================================\n// Store Implementation\n// =============================================================================\n\nconst storedAnnotations = new Map<string, StoredAnnotation>();\n\n// Event listeners for real-time notifications\ntype StoreListener = (event: string, annotation: StoredAnnotation) => void;\nconst listeners = new Set<StoreListener>();\n\nfunction notify(event: string, annotation: StoredAnnotation) {\n for (const listener of listeners) {\n try {\n listener(event, annotation);\n } catch (e) {\n console.error('[AnnotationStore] Listener error:', e);\n }\n }\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Queue an annotation (called when user submits in MCP mode)\n */\nexport function queueAnnotation(\n annotation: Annotation,\n comment: string\n): StoredAnnotation {\n const id = annotation.id || `ann-${Date.now()}`;\n const now = new Date().toISOString();\n\n const stored: StoredAnnotation = {\n annotation: { ...annotation, id },\n comment,\n status: 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n storedAnnotations.set(id, stored);\n console.log(`[AnnotationStore] Queued annotation ${id}: \"${comment.slice(0, 50)}...\"`);\n notify('annotation.created', stored);\n return stored;\n}\n\n/**\n * Get all pending annotations\n */\nexport function getPendingAnnotations(): StoredAnnotation[] {\n return Array.from(storedAnnotations.values()).filter(a => a.status === 'pending');\n}\n\n/**\n * Get all annotations (any status)\n */\nexport function getAllAnnotations(): StoredAnnotation[] {\n return Array.from(storedAnnotations.values());\n}\n\n/**\n * Get a specific annotation by ID\n */\nexport function getAnnotation(id: string): StoredAnnotation | undefined {\n return storedAnnotations.get(id);\n}\n\n/**\n * Mark an annotation as acknowledged (agent has seen it)\n */\nexport function acknowledgeAnnotation(id: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n stored.status = 'acknowledged';\n stored.updatedAt = new Date().toISOString();\n notify('annotation.updated', stored);\n return stored;\n}\n\n/**\n * Mark an annotation as resolved (agent has implemented the change)\n */\nexport function resolveAnnotation(id: string, summary?: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n stored.status = 'resolved';\n stored.resolvedBy = 'agent';\n stored.resolutionSummary = summary;\n stored.updatedAt = new Date().toISOString();\n notify('annotation.updated', stored);\n return stored;\n}\n\n/**\n * Dismiss an annotation (agent decided not to address it)\n */\nexport function dismissAnnotation(id: string, reason: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n stored.status = 'dismissed';\n stored.resolvedBy = 'agent';\n stored.dismissalReason = reason;\n stored.updatedAt = new Date().toISOString();\n notify('annotation.updated', stored);\n return stored;\n}\n\n/**\n * Remove an annotation from the store\n */\nexport function removeAnnotation(id: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n storedAnnotations.delete(id);\n notify('annotation.deleted', stored);\n return stored;\n}\n\n/**\n * Clear all annotations\n */\nexport function clearAnnotations(): void {\n storedAnnotations.clear();\n}\n\n/**\n * Subscribe to store events\n */\nexport function onStoreEvent(listener: StoreListener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/**\n * Get count of pending annotations\n */\nexport function getPendingCount(): number {\n let count = 0;\n for (const a of storedAnnotations.values()) {\n if (a.status === 'pending') count++;\n }\n return count;\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport { execSync, exec } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n type AIProvider as CLIProvider,\n type AIProviderConfig,\n spawnAICLI,\n isProviderAvailable,\n getAvailableProviders as getCLIProviders,\n getAllProviderStatuses,\n type ProviderStatus,\n} from './ai-provider';\nimport { buildPromptFromAnnotation, type ProjectContext } from './gemini-cli';\nimport { analyzeImage, isVisionAvailable } from './vision';\nimport { type ProviderName, type ExecutionMode } from './providers';\nimport type { Annotation } from '../types';\nimport {\n queueAnnotation,\n getPendingAnnotations,\n getAllAnnotations,\n getAnnotation as getStoredAnnotation,\n acknowledgeAnnotation,\n resolveAnnotation,\n dismissAnnotation,\n removeAnnotation,\n clearAnnotations,\n getPendingCount,\n onStoreEvent,\n type StoredAnnotation,\n} from './annotation-store';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DaemonConfig {\n /** Port for WebSocket server (default: 9999) */\n port?: number;\n /** Working directory for file operations and AI commands */\n cwd?: string;\n /** Default AI provider */\n defaultProvider?: ProviderName;\n /** Default execution mode */\n defaultMode?: ExecutionMode;\n}\n\nexport interface IncomingMessage {\n id: string;\n type: string;\n [key: string]: unknown;\n}\n\nexport interface OutgoingMessage {\n id?: string;\n type: string;\n success?: boolean;\n error?: string;\n [key: string]: unknown;\n}\n\n// =============================================================================\n// Daemon State\n// =============================================================================\n\nlet currentProvider: ProviderName = 'gemini';\nlet workingDirectory: string = process.cwd();\nlet currentMode: ExecutionMode = 'direct-cli';\n\n// Store annotation snapshots for undo (same as gemini-cli.ts)\nconst annotationSnapshots = new Map<string, string>();\n\n// Track MCP server connection (separate from browser clients)\nlet mcpServerClient: WebSocket | null = null;\nlet mcpClientName: string | null = null;\n\nfunction getAnnotationCounts() {\n const all = getAllAnnotations();\n return {\n pending: all.filter((a) => a.status === 'pending').length,\n acknowledged: all.filter((a) => a.status === 'acknowledged').length,\n resolved: all.filter((a) => a.status === 'resolved').length,\n dismissed: all.filter((a) => a.status === 'dismissed').length,\n };\n}\n\n// =============================================================================\n// Git Snapshot Functions (for undo support)\n// =============================================================================\n\nfunction createSnapshot(annotationId: string): string | null {\n try {\n const stashRef = execSync('git stash create', { cwd: workingDirectory, encoding: 'utf-8' }).trim();\n if (stashRef) {\n annotationSnapshots.set(annotationId, stashRef);\n console.log(`[Daemon] Created snapshot ${stashRef.slice(0, 7)} for ${annotationId}`);\n return stashRef;\n }\n const headRef = execSync('git rev-parse HEAD', { cwd: workingDirectory, encoding: 'utf-8' }).trim();\n annotationSnapshots.set(annotationId, headRef);\n return headRef;\n } catch (error) {\n console.error('[Daemon] Failed to create snapshot:', error);\n return null;\n }\n}\n\nfunction revertSnapshot(annotationId: string): { success: boolean; message: string } {\n const snapshotRef = annotationSnapshots.get(annotationId);\n if (!snapshotRef) {\n return { success: false, message: `No snapshot found for ${annotationId}` };\n }\n\n try {\n const changedFiles = execSync(`git diff --name-only ${snapshotRef}`, {\n cwd: workingDirectory,\n encoding: 'utf-8',\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (changedFiles.length === 0) {\n annotationSnapshots.delete(annotationId);\n return { success: true, message: 'No changes to revert' };\n }\n\n for (const file of changedFiles) {\n try {\n execSync(`git checkout ${snapshotRef} -- \"${file}\"`, { cwd: workingDirectory });\n } catch {\n // File might be new, try removing it\n }\n }\n\n annotationSnapshots.delete(annotationId);\n return { success: true, message: `Reverted ${changedFiles.length} file(s)` };\n } catch (error) {\n return { success: false, message: String(error) };\n }\n}\n\n// =============================================================================\n// Message Handlers\n// =============================================================================\n\ntype MessageHandler = (\n msg: IncomingMessage,\n ws: WebSocket\n) => Promise<OutgoingMessage | void>;\n\nconst handlers: Record<string, MessageHandler> = {\n // -------------------------------------------------------------------------\n // Provider Management\n // -------------------------------------------------------------------------\n 'get-provider': async (msg) => {\n return {\n id: msg.id,\n type: 'provider',\n provider: currentProvider,\n available: getCLIProviders(),\n };\n },\n\n 'set-provider': async (msg) => {\n const newProvider = msg.provider as ProviderName;\n if (!['gemini', 'claude'].includes(newProvider)) {\n return { id: msg.id, type: 'error', error: `Invalid provider: ${newProvider}` };\n }\n \n // Check CLI availability in CLI mode\n if (currentMode === 'direct-cli' && !isProviderAvailable(newProvider as CLIProvider)) {\n return {\n id: msg.id,\n type: 'error',\n error: `Provider \"${newProvider}\" CLI is not installed.`,\n };\n }\n \n currentProvider = newProvider;\n console.log(`[Daemon] Switched to provider: ${currentProvider}`);\n return { id: msg.id, type: 'provider-changed', provider: currentProvider };\n },\n\n 'check-providers': async (msg) => {\n const statuses = getAllProviderStatuses();\n return {\n id: msg.id,\n type: 'provider-statuses',\n providerStatus: statuses,\n };\n },\n\n // -------------------------------------------------------------------------\n // Mode Management\n // -------------------------------------------------------------------------\n 'get-mode': async (msg) => {\n return {\n id: msg.id,\n type: 'mode',\n mode: currentMode,\n availableModes: ['direct-cli', 'mcp'] as ExecutionMode[],\n };\n },\n\n 'set-mode': async (msg) => {\n const newMode = msg.mode as ExecutionMode;\n if (!['direct-cli', 'mcp'].includes(newMode)) {\n return { id: msg.id, type: 'error', error: `Invalid mode: ${newMode}` };\n }\n currentMode = newMode;\n console.log(`[Daemon] Switched to mode: ${currentMode}`);\n return { id: msg.id, type: 'mode-changed', mode: currentMode };\n },\n\n // -------------------------------------------------------------------------\n // AI Generation (streaming)\n // -------------------------------------------------------------------------\n generate: async (msg, ws) => {\n const annotation = msg.annotation as Partial<Annotation> & { comment?: string };\n const projectContext = msg.projectContext as ProjectContext | undefined;\n const annotationId = (annotation as { id?: string }).id || `temp-${Date.now()}`;\n \n const requestMode = (msg.mode as ExecutionMode) || currentMode;\n const requestProvider = (msg.provider as ProviderName) || currentProvider;\n\n // MCP mode: queue annotation instead of processing immediately\n if (requestMode === 'mcp') {\n const comment = annotation.comment || '';\n const stored = queueAnnotation(annotation as Annotation, comment);\n const counts = getAnnotationCounts();\n\n sendMessage(ws, {\n id: msg.id,\n type: 'annotation-queued',\n success: true,\n annotationId: stored.annotation.id,\n pendingCount: getPendingCount(),\n annotationCounts: counts,\n });\n // Broadcast updated counts to all browser clients\n broadcastToClients({\n type: 'mcp-annotation-counts',\n counts,\n });\n return;\n }\n\n // Create snapshot for undo\n createSnapshot(annotationId);\n\n // Check if this is a drawing annotation with an image\n let visionDescription = '';\n const drawingAnnotation = annotation as { drawingImage?: string };\n\n if (annotation.type === 'drawing' && drawingAnnotation.drawingImage) {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'text',\n content: `[Analyzing drawing with vision...]`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n\n // Use Gemini vision if available\n if (isVisionAvailable('gemini')) {\n const visionResult = await analyzeImage(drawingAnnotation.drawingImage, {\n provider: 'gemini',\n });\n\n if (visionResult.success) {\n visionDescription = visionResult.description;\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'text',\n content: `[Vision analysis complete]\\n${visionDescription}`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n } else {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'error',\n content: `Vision analysis failed: ${visionResult.error}`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n }\n } else {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'text',\n content: `[Vision not available - set GEMINI_API_KEY for image analysis]`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n }\n }\n\n // Build prompt using existing logic (with vision description if available)\n const prompt = buildPromptFromAnnotation(annotation, projectContext, {\n fastMode: msg.fastMode === true,\n visionDescription,\n });\n\n // Send prompt as debug event\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'debug',\n content: prompt,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n\n // CLI mode - spawn CLI tools\n const cliProvider = requestProvider as CLIProvider;\n if (!isProviderAvailable(cliProvider)) {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'error',\n content: `${requestProvider} CLI is not installed. Run: npm install -g @google/gemini-cli`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n return;\n }\n\n const config: AIProviderConfig = {\n provider: cliProvider,\n cwd: workingDirectory,\n model: msg.model as string | undefined,\n };\n\n const { process: aiProcess, events } = spawnAICLI(prompt, config);\n\n // Stream events back\n for await (const event of events) {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event,\n annotationId,\n });\n\n if (event.type === 'done') {\n sendMessage(ws, {\n id: msg.id,\n type: 'generate-complete',\n success: true,\n annotationId,\n provider: requestProvider,\n mode: requestMode,\n });\n break;\n }\n }\n },\n\n // -------------------------------------------------------------------------\n // Undo/Revert\n // -------------------------------------------------------------------------\n revert: async (msg) => {\n const annotationId = msg.annotationId as string;\n if (!annotationId) {\n return { id: msg.id, type: 'error', error: 'Missing annotationId' };\n }\n const result = revertSnapshot(annotationId);\n return { id: msg.id, type: 'revert-result', ...result };\n },\n\n // -------------------------------------------------------------------------\n // MCP Annotation Queue Management\n // -------------------------------------------------------------------------\n 'get-pending-annotations': async (msg) => {\n const pending = getPendingAnnotations();\n return {\n id: msg.id,\n type: 'pending-annotations',\n count: pending.length,\n annotations: pending.map(serializeStoredAnnotation),\n };\n },\n\n 'get-all-annotations': async (msg) => {\n const all = getAllAnnotations();\n return {\n id: msg.id,\n type: 'all-annotations',\n count: all.length,\n annotations: all.map(serializeStoredAnnotation),\n };\n },\n\n 'get-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const stored = getStoredAnnotation(id);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n return {\n id: msg.id,\n type: 'annotation',\n annotation: serializeStoredAnnotation(stored),\n };\n },\n\n 'acknowledge-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const stored = acknowledgeAnnotation(id);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n // Notify browser clients\n const counts = getAnnotationCounts();\n broadcastToClients({\n type: 'annotation-status-changed',\n annotationId: id,\n status: 'acknowledged',\n });\n broadcastToClients({ type: 'mcp-annotation-counts', counts });\n return {\n id: msg.id,\n type: 'annotation-acknowledged',\n annotationId: id,\n };\n },\n\n 'resolve-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const summary = msg.summary as string | undefined;\n const stored = resolveAnnotation(id, summary);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n // Notify browser clients\n const counts = getAnnotationCounts();\n broadcastToClients({\n type: 'annotation-status-changed',\n annotationId: id,\n status: 'resolved',\n summary,\n });\n broadcastToClients({ type: 'mcp-annotation-counts', counts });\n return {\n id: msg.id,\n type: 'annotation-resolved',\n annotationId: id,\n summary,\n };\n },\n\n 'dismiss-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const reason = msg.reason as string;\n const stored = dismissAnnotation(id, reason);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n // Notify browser clients\n const counts = getAnnotationCounts();\n broadcastToClients({\n type: 'annotation-status-changed',\n annotationId: id,\n status: 'dismissed',\n reason,\n });\n broadcastToClients({ type: 'mcp-annotation-counts', counts });\n return {\n id: msg.id,\n type: 'annotation-dismissed',\n annotationId: id,\n reason,\n };\n },\n\n 'clear-queued-annotations': async (msg) => {\n clearAnnotations();\n return {\n id: msg.id,\n type: 'annotations-cleared',\n };\n },\n\n // -------------------------------------------------------------------------\n // File Operations\n // -------------------------------------------------------------------------\n 'read-file': async (msg) => {\n const filePath = msg.path as string;\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.join(workingDirectory, filePath);\n\n try {\n const content = fs.readFileSync(absolutePath, 'utf-8');\n return { id: msg.id, type: 'file-content', path: filePath, content };\n } catch (error) {\n return { id: msg.id, type: 'error', error: `Failed to read file: ${error}` };\n }\n },\n\n 'write-file': async (msg) => {\n const filePath = msg.path as string;\n const content = msg.content as string;\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.join(workingDirectory, filePath);\n\n try {\n // Ensure directory exists\n fs.mkdirSync(path.dirname(absolutePath), { recursive: true });\n fs.writeFileSync(absolutePath, content, 'utf-8');\n console.log(`[Daemon] Wrote file: ${filePath}`);\n return { id: msg.id, type: 'write-success', path: filePath };\n } catch (error) {\n return { id: msg.id, type: 'error', error: `Failed to write file: ${error}` };\n }\n },\n\n 'list-files': async (msg) => {\n const dirPath = (msg.path as string) || '.';\n const absolutePath = path.isAbsolute(dirPath)\n ? dirPath\n : path.join(workingDirectory, dirPath);\n\n try {\n const entries = fs.readdirSync(absolutePath, { withFileTypes: true });\n const files = entries.map((entry) => ({\n name: entry.name,\n isDirectory: entry.isDirectory(),\n }));\n return { id: msg.id, type: 'file-list', path: dirPath, files };\n } catch (error) {\n return { id: msg.id, type: 'error', error: `Failed to list files: ${error}` };\n }\n },\n\n // -------------------------------------------------------------------------\n // Command Execution\n // -------------------------------------------------------------------------\n 'run-command': async (msg, ws) => {\n const command = msg.command as string;\n if (!command) {\n return { id: msg.id, type: 'error', error: 'Missing command' };\n }\n\n console.log(`[Daemon] Running command: ${command}`);\n\n return new Promise((resolve) => {\n exec(command, { cwd: workingDirectory }, (error, stdout, stderr) => {\n resolve({\n id: msg.id,\n type: 'command-result',\n stdout,\n stderr,\n exitCode: error ? error.code : 0,\n });\n });\n });\n },\n\n // -------------------------------------------------------------------------\n // MCP Server Identification\n // -------------------------------------------------------------------------\n identify: async (msg, ws) => {\n if (msg.client === 'mcp-server') {\n mcpServerClient = ws;\n mcpClientName = null; // Will be set when mcp-client-info arrives\n console.log('[Daemon] MCP server identified and connected');\n // Notify browser clients\n broadcastToClients({\n type: 'mcp-server-status',\n connected: true,\n clientName: null,\n });\n return { id: msg.id, type: 'identified', client: 'mcp-server' };\n }\n return { id: msg.id, type: 'identified', client: 'unknown' };\n },\n\n 'mcp-client-info': async (msg) => {\n mcpClientName = (msg.clientName as string) || null;\n console.log('[Daemon] MCP client identified:', mcpClientName, msg.clientVersion || '');\n // Broadcast updated name to browser clients\n broadcastToClients({\n type: 'mcp-server-status',\n connected: true,\n clientName: mcpClientName,\n });\n return { id: msg.id, type: 'ok' };\n },\n\n // -------------------------------------------------------------------------\n // Status\n // -------------------------------------------------------------------------\n ping: async (msg) => {\n return {\n id: msg.id,\n type: 'pong',\n provider: currentProvider,\n mode: currentMode,\n cwd: workingDirectory,\n availableProviders: getCLIProviders(),\n availableModes: ['direct-cli', 'mcp'] as ExecutionMode[],\n mcpServerConnected: mcpServerClient?.readyState === WebSocket.OPEN,\n mcpClientName,\n };\n },\n};\n\n// =============================================================================\n// WebSocket Helpers\n// =============================================================================\n\n// Track connected browser clients for broadcasting\nconst connectedClients = new Set<WebSocket>();\n\nfunction broadcastToClients(message: OutgoingMessage) {\n for (const client of connectedClients) {\n sendMessage(client, message);\n }\n}\n\nfunction serializeStoredAnnotation(stored: StoredAnnotation) {\n return {\n id: stored.annotation.id,\n type: stored.annotation.type,\n comment: stored.comment,\n status: stored.status,\n createdAt: stored.createdAt,\n updatedAt: stored.updatedAt,\n resolvedBy: stored.resolvedBy,\n resolutionSummary: stored.resolutionSummary,\n dismissalReason: stored.dismissalReason,\n // Include key annotation data the agent needs\n annotation: {\n type: stored.annotation.type,\n selector: (stored.annotation as any).selector,\n tagName: (stored.annotation as any).tagName,\n text: (stored.annotation as any).text,\n elementPath: (stored.annotation as any).elementPath,\n boundingBox: stored.annotation.boundingBox,\n drawingSvg: (stored.annotation as any).drawingSvg,\n drawingImage: (stored.annotation as any).drawingImage,\n extractedText: (stored.annotation as any).extractedText,\n nearbyElements: (stored.annotation as any).nearbyElements,\n viewport: (stored.annotation as any).viewport,\n projectStyles: (stored.annotation as any).projectStyles,\n isMultiSelect: (stored.annotation as any).isMultiSelect,\n elements: (stored.annotation as any).elements,\n },\n };\n}\n\nfunction sendMessage(ws: WebSocket, message: OutgoingMessage) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(message));\n }\n}\n\nfunction handleConnection(ws: WebSocket) {\n console.log('[Daemon] Client connected');\n connectedClients.add(ws);\n\n // Send initial state\n sendMessage(ws, {\n type: 'connected',\n provider: currentProvider,\n mode: currentMode,\n cwd: workingDirectory,\n availableProviders: getCLIProviders(),\n availableModes: ['direct-cli', 'mcp'] as ExecutionMode[],\n pendingAnnotations: currentMode === 'mcp' ? getPendingCount() : 0,\n providerStatus: getAllProviderStatuses(),\n mcpServerConnected: mcpServerClient?.readyState === WebSocket.OPEN,\n mcpClientName,\n });\n\n ws.on('message', async (data) => {\n let msg: IncomingMessage;\n try {\n msg = JSON.parse(data.toString());\n } catch {\n sendMessage(ws, { type: 'error', error: 'Invalid JSON' });\n return;\n }\n\n const handler = handlers[msg.type];\n if (!handler) {\n sendMessage(ws, { id: msg.id, type: 'error', error: `Unknown message type: ${msg.type}` });\n return;\n }\n\n try {\n const response = await handler(msg, ws);\n if (response) {\n sendMessage(ws, response);\n }\n } catch (error) {\n sendMessage(ws, {\n id: msg.id,\n type: 'error',\n error: `Handler error: ${error}`,\n });\n }\n });\n\n ws.on('close', () => {\n console.log('[Daemon] Client disconnected');\n connectedClients.delete(ws);\n\n // If the MCP server disconnected, notify browser clients\n if (ws === mcpServerClient) {\n mcpServerClient = null;\n mcpClientName = null;\n console.log('[Daemon] MCP server disconnected');\n broadcastToClients({\n type: 'mcp-server-status',\n connected: false,\n clientName: null,\n });\n }\n });\n\n ws.on('error', (error) => {\n console.error('[Daemon] WebSocket error:', error);\n });\n}\n\n// =============================================================================\n// Main Daemon Function\n// =============================================================================\n\nexport interface DaemonInstance {\n port: number;\n close: () => void;\n}\n\n/**\n * Start the Skema daemon (WebSocket server)\n */\nexport function startDaemon(config: DaemonConfig = {}): DaemonInstance {\n const port = config.port ?? 9999;\n workingDirectory = config.cwd ?? process.cwd();\n currentProvider = config.defaultProvider ?? 'gemini';\n currentMode = config.defaultMode ?? 'direct-cli';\n\n // Check CLI provider availability\n if (currentMode === 'direct-cli') {\n if (!isProviderAvailable(currentProvider as CLIProvider)) {\n const available = getCLIProviders();\n if (available.length > 0) {\n console.log(`[Daemon] ${currentProvider} CLI not found, falling back to ${available[0]}`);\n currentProvider = available[0];\n } else {\n console.warn('[Daemon] Warning: No CLI providers found. Install gemini or claude CLI.');\n }\n }\n }\n\n const wss = new WebSocketServer({ port });\n\n wss.on('connection', handleConnection);\n\n wss.on('listening', () => {\n const cliProviders = getCLIProviders();\n \n console.log('');\n console.log(' ┌─────────────────────────────────────────────────┐');\n console.log(' │ │');\n console.log(` │ Skema Daemon running on ws://localhost:${port} │`);\n console.log(' │ │');\n console.log(` │ Mode: ${currentMode.padEnd(39)}│`);\n console.log(` │ Provider: ${currentProvider.padEnd(35)}│`);\n console.log(` │ Directory: ${workingDirectory.slice(-33).padEnd(34)}│`);\n console.log(` │ CLI Providers: ${(cliProviders.join(', ') || 'none').padEnd(29)}│`);\n console.log(' │ │');\n console.log(' │ Waiting for browser connections... │');\n console.log(' │ │');\n console.log(' └─────────────────────────────────────────────────┘');\n console.log('');\n });\n\n wss.on('error', (error) => {\n if ((error as NodeJS.ErrnoException).code === 'EADDRINUSE') {\n console.error(`[Daemon] Port ${port} is already in use. Is another Skema daemon running?`);\n } else {\n console.error('[Daemon] Server error:', error);\n }\n });\n\n return {\n port,\n close: () => {\n wss.close();\n console.log('[Daemon] Server stopped');\n },\n };\n}\n\n// =============================================================================\n// Exports for Programmatic Use\n// =============================================================================\n\nexport {\n currentProvider,\n currentMode,\n workingDirectory,\n handlers,\n};\n\nexport type { ExecutionMode, ProviderName } from './providers';\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/server/prompts.ts","../src/server/gemini-cli.ts","../src/server/ai-provider.ts","../src/server/vision.ts","../src/server/annotation-store.ts","../src/server/daemon.ts"],"names":["execSync","spawn","GoogleGenerativeAI","POST","DELETE","google","createGoogleGenerativeAI","anthropic","createAnthropic","openai","createOpenAI","generateText","annotationSnapshots","createSnapshot","path","fs","exec","WebSocket","ws","WebSocketServer"],"mappings":"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","file":"server.js","sourcesContent":["// =============================================================================\n// Skema Utility Functions\n// =============================================================================\n\n/**\n * Convert a Blob to a base64 string\n */\nexport async function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n}\n\n/**\n * Add a labeled grid overlay to an SVG string\n * Grid uses A/B/C column labels and 0/1/2 row numbers for positioning reference\n * @param svgString - The SVG markup to add grid to\n * @param opts - Grid options (color, cell size, whether to show labels)\n * @returns SVG string with grid overlay added\n */\nexport function addGridToSvg(\n svgString: string,\n opts: { color?: string; size?: number; labels?: boolean } = {}\n): string {\n const { color = '#0066FF', size = 100, labels = true } = opts;\n\n // Parse SVG to get dimensions\n const viewBoxMatch = svgString.match(/viewBox=\"([^\"]+)\"/);\n if (!viewBoxMatch) return svgString;\n\n const [x, y, w, h] = viewBoxMatch[1].split(' ').map(Number);\n\n // Build grid lines and labels\n const gridElements: string[] = [];\n\n // Vertical lines\n for (let i = 0; i <= Math.ceil(w / size); i++) {\n const xPos = i * size;\n if (i > 0) {\n gridElements.push(\n `<line x1=\"${xPos}\" y1=\"0\" x2=\"${xPos}\" y2=\"${h}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n }\n if (labels) {\n // Column labels (A, B, C, ...)\n const colLabel = String.fromCharCode(65 + i); // 65 = 'A'\n gridElements.push(\n `<text x=\"${xPos + size / 2}\" y=\"16\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\" text-anchor=\"middle\">${colLabel}</text>`\n );\n }\n }\n\n // Horizontal lines\n for (let i = 0; i <= Math.ceil(h / size); i++) {\n const yPos = i * size;\n gridElements.push(\n `<line x1=\"0\" y1=\"${yPos}\" x2=\"${w}\" y2=\"${yPos}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n if (labels && i < Math.ceil(h / size)) {\n // Row labels (0, 1, 2, ...)\n gridElements.push(\n `<text x=\"8\" y=\"${yPos + size / 2 + 4}\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\">${i}</text>`\n );\n }\n }\n\n // Create grid group\n const gridGroup = `<g id=\"skema-grid\" transform=\"translate(${x}, ${y})\">${gridElements.join('')}</g>`;\n\n // Insert grid before closing </svg> tag\n return svgString.replace('</svg>', `${gridGroup}</svg>`);\n}\n\n/**\n * Get the grid cell reference (e.g., \"B2\") for a given position\n * @param x - X coordinate in pixels\n * @param y - Y coordinate in pixels\n * @param gridSize - Size of each grid cell (default 100px)\n * @returns Grid cell reference string (e.g., \"B2\")\n */\nexport function getGridCellReference(x: number, y: number, gridSize: number = 100): string {\n const col = Math.floor(x / gridSize);\n const row = Math.floor(y / gridSize);\n const colLabel = String.fromCharCode(65 + col); // 65 = 'A'\n return `${colLabel}${row}`;\n}\n\n/**\n * Extract text content from tldraw shapes\n * @param shapes - Array of tldraw shapes\n * @returns Combined text content from text and note shapes\n */\nexport function extractTextFromShapes(shapes: unknown[]): string {\n const textContent: string[] = [];\n\n for (const shape of shapes) {\n const s = shape as { type?: string; props?: { text?: string; richText?: unknown } };\n\n if (s.type === 'text' || s.type === 'note') {\n // Handle plain text\n if (s.props?.text) {\n textContent.push(s.props.text);\n }\n // Handle rich text (newer tldraw versions)\n if (s.props?.richText && typeof s.props.richText === 'object') {\n const rt = s.props.richText as { content?: Array<{ content?: Array<{ text?: string }> }> };\n if (rt.content) {\n for (const block of rt.content) {\n if (block.content) {\n for (const inline of block.content) {\n if (inline.text) {\n textContent.push(inline.text);\n }\n }\n }\n }\n }\n }\n }\n }\n\n return textContent.filter(Boolean).join('\\n');\n}\n","/**\n * Skema AI Prompts\n *\n * This file contains all AI prompts used by Skema for generating code changes.\n *\n * Prompts:\n * - FAST_DOM_SELECTION_PROMPT: Quick, minimal prompt for DOM element changes\n * - DETAILED_DOM_SELECTION_PROMPT: Full context prompt for complex DOM changes\n * - DRAWING_TO_CODE_PROMPT: Converts wireframe sketches to React components\n * - IMAGE_ANALYSIS_PROMPT: Gemini Vision prompt to analyze drawing images\n */\n\nimport type { ViewportInfo, NearbyElement, ProjectStyleContext } from '../types';\nimport { getGridCellReference } from '../lib/utils';\n\n// =============================================================================\n// System Prompt for Code Generation\n// =============================================================================\n\n/**\n * Base system prompt for AI code generation.\n * Used by direct API providers to set context for code generation tasks.\n */\nexport const CODE_GENERATION_PROMPT = `You are Skema, an AI assistant specialized in frontend web development. You help users modify their React/Next.js applications based on visual annotations and instructions.\n\nYour capabilities:\n- Edit existing code files to implement UI changes\n- Convert wireframe sketches into functional React components\n- Apply styling using Tailwind CSS\n- Follow existing code patterns and conventions\n\nCRITICAL RULES:\n1. Do NOT create new files - only edit existing files\n2. Do NOT run shell commands (no npm, git, lint, build commands)\n3. Ensure all JSX tags are properly closed\n4. Add imports only at the top of files, never in the middle\n5. Make minimal, targeted changes\n6. Stop immediately after making file changes - do not verify or run tests\n\nWhen editing code:\n- Use Tailwind CSS for styling\n- Follow the existing code patterns in the project\n- Write semantic HTML with proper accessibility attributes\n- Integrate changes naturally with existing page flow`;\n\n\n// =============================================================================\n// Prompt Inputs Types\n// =============================================================================\n\nexport interface DomSelectionInput {\n comment: string;\n selector?: string;\n text?: string;\n tagName?: string;\n}\n\nexport interface DetailedDomSelectionInput extends DomSelectionInput {\n elementPath?: string;\n cssClasses?: string;\n attributes?: Record<string, string>;\n elements?: Array<{\n tagName: string;\n selector: string;\n elementPath: string;\n text?: string;\n }>;\n}\n\nexport interface GestureInput {\n comment: string;\n gesture?: string;\n boundingBox?: { x: number; y: number };\n}\n\nexport interface DrawingInput {\n comment: string;\n boundingBox?: { x: number; y: number; width: number; height: number };\n drawingSvg?: string;\n drawingImage?: string;\n extractedText?: string;\n gridConfig?: { color: string; size: number; labels: boolean };\n viewport?: ViewportInfo;\n projectStyles?: ProjectStyleContext;\n nearbyElements?: NearbyElement[];\n visionDescription?: string;\n}\n\n// =============================================================================\n// Shared Rules & Guidelines\n// =============================================================================\n\n/**\n * Critical rules that apply to ALL prompts to prevent common errors\n */\nconst CRITICAL_RULES = `CRITICAL RULES:\n- Do NOT create new files. Only edit existing files.\n- Do NOT modify the Skema overlay component import or the SkemaOverlay component itself.\n- Ensure all JSX tags are properly closed - every <tag> needs a matching </tag>.\n- Do NOT run any shell commands. No npm, no git, no lint, no build commands. Just edit files.\n- STOP immediately after making the file changes. Do not verify, do not run tests, do not check status.`;\n\n/**\n * JSX syntax validation reminder\n */\nconst JSX_VALIDATION_RULE = `JSX SYNTAX: Every opening tag (<div>, <a>, <span>, <button>) MUST have a matching closing tag. Self-closing tags (<img />, <input />, <br />) must end with />.`;\n\n// =============================================================================\n// PROMPT 1: Fast DOM Selection\n// =============================================================================\n\n/**\n * Fast mode prompt for quick DOM element changes.\n * Used when fastMode is enabled for simple, targeted edits.\n *\n * @example\n * // Result: \"Make this button blue (target: \"Submit\"). Make the change directly...\"\n * buildFastDomSelectionPrompt({ comment: \"Make this button blue\", text: \"Submit\" })\n */\nexport function buildFastDomSelectionPrompt(input: DomSelectionInput): string {\n const { comment, selector, text, tagName } = input;\n\n // Build target description with both selector AND text for better context\n const parts: string[] = [];\n\n if (tagName) {\n parts.push(`<${tagName.toLowerCase()}>`);\n }\n if (selector) {\n parts.push(`selector: ${selector}`);\n }\n if (text) {\n parts.push(`text: \"${text.slice(0, 50)}\"`);\n }\n\n const target = parts.length > 0 ? ` (${parts.join(' | ')})` : '';\n\n return `${comment}${target}. Make the change directly, no explanation needed. ${CRITICAL_RULES} ${JSX_VALIDATION_RULE}`;\n}\n\n// =============================================================================\n// PROMPT 2: Detailed DOM Selection\n// =============================================================================\n\n/**\n * Detailed mode prompt for DOM element changes with full context.\n * Used for complex changes that need more information about the target.\n *\n * @example\n * buildDetailedDomSelectionPrompt({\n * comment: \"Add a hover effect\",\n * tagName: \"button\",\n * selector: \"#submit-btn\",\n * text: \"Submit Form\"\n * })\n */\nexport function buildDetailedDomSelectionPrompt(input: DetailedDomSelectionInput): string {\n const { comment, tagName, selector, text, elementPath, cssClasses, attributes, elements } = input;\n\n let prompt = `Make this code change: \"${comment || 'No specific comment provided'}\"\n\n## Target Element\n- Tag: <${tagName?.toLowerCase() || 'unknown'}>`;\n\n if (selector) {\n prompt += `\\n- Selector: ${selector}`;\n }\n\n if (elementPath) {\n prompt += `\\n- DOM Path: ${elementPath}`;\n }\n\n if (cssClasses) {\n prompt += `\\n- CSS Classes: ${cssClasses}`;\n }\n\n if (attributes && Object.keys(attributes).length > 0) {\n const attrStr = Object.entries(attributes)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(', ');\n prompt += `\\n- Attributes: ${attrStr}`;\n }\n\n if (text) {\n prompt += `\\n- Text Content: \"${text.slice(0, 150)}\"`;\n }\n\n if (elements && elements.length > 1) {\n prompt += `\\n\\n## Multi-Selection (${elements.length} elements)`;\n elements.slice(0, 5).forEach((el, i) => {\n prompt += `\\n${i + 1}. <${el.tagName}> ${el.selector}`;\n if (el.text) prompt += ` - \"${el.text.slice(0, 50)}\"`;\n });\n if (elements.length > 5) {\n prompt += `\\n... and ${elements.length - 5} more`;\n }\n }\n\n prompt += `\n\nMake minimal changes. ${CRITICAL_RULES} ${JSX_VALIDATION_RULE}`;\n\n return prompt;\n}\n\n// =============================================================================\n// PROMPT 3: Gesture Annotation\n// =============================================================================\n\n/**\n * Prompt for gesture-based annotations (circles, scribbles, etc.)\n */\nexport function buildGesturePrompt(input: GestureInput): string {\n const { comment, gesture, boundingBox } = input;\n\n return `Make this code change: \"${comment || 'No specific comment provided'}\"\n\nElement: gesture: ${gesture || 'unknown'} at (${boundingBox?.x || 0}, ${boundingBox?.y || 0})\n\nMake minimal changes. ${CRITICAL_RULES} ${JSX_VALIDATION_RULE}`;\n}\n\n// =============================================================================\n// PROMPT 4: Drawing to Code (Main Component Generation)\n// =============================================================================\n\n/**\n * Comprehensive prompt for converting wireframe sketches into React components.\n * This is the most complex prompt, used when users draw UI elements.\n *\n * The prompt instructs the AI to:\n * 1. Analyze the sketch to understand the visual intent\n * 2. Interpret (not transcribe) the low-fidelity drawing\n * 3. Generate high-quality inline JSX with Tailwind CSS\n * 4. Integrate naturally with the existing page flow\n */\nexport function buildDrawingToCodePrompt(input: DrawingInput): string {\n const {\n comment = 'Create a component based on this drawing',\n boundingBox,\n extractedText,\n gridConfig,\n viewport,\n nearbyElements = [],\n visionDescription,\n } = input;\n\n const gridSize = gridConfig?.size || 100;\n\n // Build grid cell reference for positioning\n let gridCellRef = '';\n if (boundingBox) {\n gridCellRef = getGridCellReference(boundingBox.x, boundingBox.y, gridSize);\n }\n\n // Build position context\n const positionContext = buildPositionContext(boundingBox, viewport, gridCellRef);\n\n // Build nearby elements context\n const nearbyContext = buildNearbyElementsContext(nearbyElements);\n\n // Build text extraction context\n const textContext = extractedText?.trim()\n ? `\\n**Text found in drawing (use as reference if hard to read):**\\n${extractedText}`\n : '';\n\n // Build image/vision analysis note\n const imageNote = buildImageNote(!!input.drawingImage, visionDescription);\n\n return `Your task is to interpret a user's sketch/wireframe and turn it into code that is integrated in the codebase.\n\n## User's Request\n\"${comment}\"\n\n## Drawing Context\n${positionContext}${textContext}${nearbyContext}${imageNote}\n\n## Your Process\n1. **Analyze the Sketch:** Understand the visual intent—what UI component does the user want?\n2. **Interpret, Don't Transcribe:** Elevate the low-fidelity drawing into a high-fidelity component. Choose appropriate spacing, colors, and typography that match modern design standards.\n3. **Infer Missing Details:** If something is underspecified, use your expertise to make the best choice. An informed decision is better than an incomplete component.\n\n## Implementation Guidelines\n${DRAWING_IMPLEMENTATION_GUIDELINES}\n\nMake the changes directly. Insert the UI elements inline at the appropriate location in the page. No explanation needed.\n\n## Error Prevention Rules\n${DRAWING_ERROR_PREVENTION_RULES}`;\n}\n\n/**\n * Implementation guidelines for drawing-to-code conversion\n */\nconst DRAWING_IMPLEMENTATION_GUIDELINES = `- **CRITICAL: DO NOT CREATE ANY NEW FILES. NEVER CREATE NEW FILES. You must ONLY edit existing files.**\n- Add your code directly inline within the existing JSX of the page file - do NOT create separate component files.\n- DO NOT run any shell commands (no npm, git, lint, build, or verification commands). Just edit files and STOP.\n- After making your file edits, you are DONE. Do not run any follow-up commands or checks.\n- Write the UI as inline JSX elements (divs, sections, etc.) directly in the return statement - NOT as a separate component definition\n- Use Tailwind CSS classes for styling (the project uses Tailwind)\n- Do NOT use hardcoded pixel positions or absolute coordinates - integrate naturally with existing page flow\n- Use flexbox, grid, or relative positioning to place the component appropriately\n- If the sketch shows:\n - **Rectangle/box:** Card, container, button, or input field depending on context\n - **Text elements:** Headings, paragraphs, or labels with appropriate hierarchy\n - **Form layout:** Input fields with labels, proper spacing\n - **Icons/shapes:** Use appropriate icons from lucide-react or inline SVGs (but DO NOT add new imports mid-file)\n - **Navigation:** Nav links, menus, or breadcrumbs\n - **Lists:** Ordered/unordered lists or grid layouts\n- Make the UI fit naturally with the existing page design\n- Style it nicely and according to the existing codebase\n- Use semantic HTML and ARIA attributes where appropriate\n- **NEVER add import statements inside JSX or in the middle of a file - all imports must be at the very top of the file**\n- If you need a new import, add it at the TOP of the file with the other imports, then use it in the JSX below`;\n\n/**\n * Error prevention rules for drawing-to-code conversion\n */\nconst DRAWING_ERROR_PREVENTION_RULES = `1. **NEVER CREATE NEW FILES** - Do NOT create new component files, utility files, or any other files. Write everything inline in the existing file\n2. You do not need to update package.json or anything, just add / edit the react component.\n3. Do NOT add import statements in the middle of the file or inside JSX - imports go ONLY at the top\n4. Do NOT modify the Skema overlay component import or the SkemaOverlay component itself\n5. If you need something that requires an import and it's not already imported, either use an alternative that doesn't need an import, or add the import at the very TOP of the file with the other imports\n6. DONT MAKE ANY CHANGES THAT WOULD RESULT IN A Build Error\n7. **JSX SYNTAX VALIDATION** - ALWAYS ensure every JSX tag is properly closed. Every opening tag like <div>, <a>, <span>, <button> MUST have a matching closing tag </div>, </a>, </span>, </button>. Self-closing tags like <img />, <input />, <br /> must end with />. Before finishing, mentally verify all tag pairs are balanced.`;\n\n// =============================================================================\n// PROMPT 5: Image Analysis (Gemini Vision)\n// =============================================================================\n\n/**\n * Prompt for Gemini Vision to analyze a wireframe sketch image.\n * This generates a description that is then passed to the main drawing prompt.\n */\nexport const IMAGE_ANALYSIS_PROMPT = `\nAnalyze this UI wireframe sketch in some detail (not too long) for a front-end developer.\n\nDescribe every element, layout, spacing, icons, and text you see.\nFocus on whats apparent, don't overthink it.\nMention relative positions and hierarchy.\nBe distinct about what is drawn vs what might be background.\n\nDo NOT focus on exact pixel coordinates or absolute positions - describe layouts\nin terms of relative positioning (left/right/top/bottom, centered, evenly spaced, etc.).\n\nIt is expected that they will be rough draft's / hand-drawn things. Interpret the drawing and its goals as best as you can.\nDO NOT MENTION THAT THINGS HAVE \"Hand-sketched\" or \"Hand-drawn\" vibes. Make assumptions of what they were trying to do.\nJust FYI, this gets passed onto a generator to generate the actual code of modern UI componenents.\n`.trim();\n\n// =============================================================================\n// Helper Functions for Building Prompt Sections\n// =============================================================================\n\n/**\n * Build position context section for drawing prompt\n */\nfunction buildPositionContext(\n bbox?: { x: number; y: number; width: number; height: number },\n viewport?: ViewportInfo,\n gridCellRef?: string\n): string {\n if (!bbox) return '';\n\n if (viewport) {\n const relX = ((bbox.x / viewport.width) * 100).toFixed(1);\n const relY = ((bbox.y / viewport.height) * 100).toFixed(1);\n let context = `**Drawing Location:** Approximately ${relX}% from left, ${relY}% from top of viewport`;\n if (gridCellRef) {\n context += ` (grid cell ${gridCellRef})`;\n }\n return context;\n }\n\n return `**Drawing Area:** ${Math.round(bbox.width)}×${Math.round(bbox.height)}px`;\n}\n\n/**\n * Build nearby elements context section for drawing prompt\n */\nfunction buildNearbyElementsContext(nearbyElements: NearbyElement[]): string {\n if (nearbyElements.length === 0) return '';\n\n const elementList = nearbyElements\n .slice(0, 5)\n .map((el) => {\n let desc = `- <${el.tagName.toLowerCase()}>`;\n if (el.text) desc += `: \"${el.text.slice(0, 50)}\"`;\n if (el.className) desc += ` (class: ${el.className.slice(0, 50)})`;\n desc += ` (${el.selector})`;\n return desc;\n })\n .join('\\n');\n\n return `\\n**Nearby DOM Elements (for placement reference):**\\n${elementList}`;\n}\n\n/**\n * Build image/vision analysis note section for drawing prompt\n */\nfunction buildImageNote(hasImage: boolean, visionDescription?: string): string {\n let note = hasImage\n ? '\\n**[Drawing image provided as base64 PNG with labeled grid overlay]**'\n : '';\n\n if (visionDescription) {\n note += `\\n\\n## Visual Analysis of Drawing\\n${visionDescription}`;\n }\n\n return note;\n}\n","import { spawn, execSync, type ChildProcess } from 'child_process';\nimport { GoogleGenerativeAI } from '@google/generative-ai';\nimport type { Annotation } from '../types';\n\n// Import prompts from dedicated prompts file\nimport {\n buildFastDomSelectionPrompt,\n buildDetailedDomSelectionPrompt,\n buildGesturePrompt,\n buildDrawingToCodePrompt,\n IMAGE_ANALYSIS_PROMPT,\n} from './prompts';\n\n// Store annotation ID -> git stash ref for undo functionality\nconst annotationSnapshots = new Map<string, string>();\n\n/**\n * Create a git snapshot before making changes (for undo support)\n */\nfunction createSnapshot(annotationId: string, cwd: string): string | null {\n try {\n // Create a stash-like commit object without actually stashing\n // This captures the current working directory state\n const stashRef = execSync('git stash create', { cwd, encoding: 'utf-8' }).trim();\n\n if (stashRef) {\n annotationSnapshots.set(annotationId, stashRef);\n console.log(`[Skema] Created snapshot ${stashRef.slice(0, 7)} for annotation ${annotationId}`);\n return stashRef;\n }\n\n // If stash create returns empty, there are no changes to snapshot\n // Store current HEAD instead\n const headRef = execSync('git rev-parse HEAD', { cwd, encoding: 'utf-8' }).trim();\n annotationSnapshots.set(annotationId, headRef);\n console.log(`[Skema] Using HEAD ${headRef.slice(0, 7)} for annotation ${annotationId}`);\n return headRef;\n } catch (error) {\n console.error('[Skema] Failed to create snapshot:', error);\n return null;\n }\n}\n\n/**\n * Revert changes for an annotation by restoring from snapshot\n */\nexport function revertAnnotation(annotationId: string, cwd: string = process.cwd()): { success: boolean; message: string } {\n const snapshotRef = annotationSnapshots.get(annotationId);\n\n if (!snapshotRef) {\n return { success: false, message: `No snapshot found for annotation ${annotationId}` };\n }\n\n try {\n // Get list of modified files since the snapshot\n const changedFiles = execSync(`git diff --name-only ${snapshotRef}`, { cwd, encoding: 'utf-8' })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (changedFiles.length === 0) {\n annotationSnapshots.delete(annotationId);\n return { success: true, message: 'No changes to revert' };\n }\n\n // Restore each changed file from the snapshot\n for (const file of changedFiles) {\n try {\n execSync(`git checkout ${snapshotRef} -- \"${file}\"`, { cwd, encoding: 'utf-8' });\n console.log(`[Skema] Reverted: ${file}`);\n } catch {\n // File might not exist in snapshot (new file), so delete it\n try {\n execSync(`git checkout HEAD -- \"${file}\"`, { cwd, encoding: 'utf-8' });\n } catch {\n // Ignore if file doesn't exist\n }\n }\n }\n\n annotationSnapshots.delete(annotationId);\n console.log(`[Skema] Reverted ${changedFiles.length} file(s) for annotation ${annotationId}`);\n return { success: true, message: `Reverted ${changedFiles.length} file(s)` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error('[Skema] Failed to revert:', message);\n return { success: false, message };\n }\n}\n\n/**\n * Get all tracked annotation IDs\n */\nexport function getTrackedAnnotations(): string[] {\n return Array.from(annotationSnapshots.keys());\n}\n\nexport interface GeminiCLIOptions {\n /** Working directory for Gemini CLI */\n cwd?: string;\n /** API key (defaults to GEMINI_API_KEY env var) */\n apiKey?: string;\n /** Auto-approve all tool calls (default: true) */\n yolo?: boolean;\n /** Output format (default: 'stream-json') */\n outputFormat?: 'text' | 'json' | 'stream-json';\n /** Model to use (default: 'gemini-2.5-flash' for speed) */\n model?: string;\n /** Use minimal/fast prompt (default: true) */\n fastMode?: boolean;\n}\n\nexport interface ProjectContext {\n pathname?: string;\n viewport?: { width: number; height: number };\n}\n\nexport interface GeminiCLIEvent {\n type: 'init' | 'message' | 'tool_use' | 'tool_result' | 'error' | 'result' | 'done' | 'debug';\n timestamp?: string;\n content?: string;\n role?: 'user' | 'assistant';\n tool_name?: string;\n tool_id?: string;\n status?: 'success' | 'error';\n code?: number;\n [key: string]: unknown;\n}\n\n/**\n * Build a prompt for Gemini CLI from an annotation\n *\n * @see /server/prompts.ts for the actual prompt templates\n */\nexport function buildPromptFromAnnotation(\n annotation: Partial<Annotation> & { comment?: string },\n _projectContext?: ProjectContext,\n options?: { fastMode?: boolean; visionDescription?: string }\n): string {\n const fastMode = options?.fastMode ?? true;\n\n // Handle drawing annotations - uses the comprehensive drawing-to-code prompt\n if (annotation.type === 'drawing') {\n const drawingAnnotation = annotation as {\n boundingBox?: { x: number; y: number; width: number; height: number };\n drawingSvg?: string;\n drawingImage?: string;\n extractedText?: string;\n gridConfig?: { color: string; size: number; labels: boolean };\n viewport?: { width: number; height: number; scrollX: number; scrollY: number };\n projectStyles?: any;\n nearbyElements?: any[];\n comment?: string;\n };\n\n return buildDrawingToCodePrompt({\n comment: drawingAnnotation.comment || 'Create a component based on this drawing',\n boundingBox: drawingAnnotation.boundingBox,\n drawingSvg: drawingAnnotation.drawingSvg,\n drawingImage: drawingAnnotation.drawingImage,\n extractedText: drawingAnnotation.extractedText,\n gridConfig: drawingAnnotation.gridConfig,\n viewport: drawingAnnotation.viewport,\n projectStyles: drawingAnnotation.projectStyles,\n nearbyElements: drawingAnnotation.nearbyElements,\n visionDescription: options?.visionDescription,\n });\n }\n\n // Handle gesture annotations\n if (annotation.type === 'gesture') {\n const gestureAnnotation = annotation as { gesture?: string; boundingBox?: { x: number; y: number } };\n return buildGesturePrompt({\n comment: annotation.comment || 'No specific comment provided',\n gesture: gestureAnnotation.gesture,\n boundingBox: gestureAnnotation.boundingBox,\n });\n }\n\n // Handle DOM selection annotations\n const domAnnotation = annotation as {\n tagName?: string;\n selector?: string;\n elementPath?: string;\n text?: string;\n cssClasses?: string;\n attributes?: Record<string, string>;\n elements?: Array<{\n tagName: string;\n selector: string;\n elementPath: string;\n text?: string;\n }>;\n };\n\n // Fast mode: minimal prompt for quick changes\n if (fastMode) {\n return buildFastDomSelectionPrompt({\n comment: annotation.comment || 'No specific comment provided',\n selector: domAnnotation.selector,\n text: domAnnotation.text,\n tagName: domAnnotation.tagName,\n });\n }\n\n // Detailed mode: full context\n return buildDetailedDomSelectionPrompt({\n comment: annotation.comment || 'No specific comment provided',\n tagName: domAnnotation.tagName,\n selector: domAnnotation.selector,\n text: domAnnotation.text,\n elementPath: domAnnotation.elementPath,\n cssClasses: domAnnotation.cssClasses,\n attributes: domAnnotation.attributes,\n elements: domAnnotation.elements,\n });\n}\n\n\n/**\n * Spawn Gemini CLI and return an async iterator of events\n */\nexport function spawnGeminiCLI(\n prompt: string,\n options: GeminiCLIOptions = {}\n): {\n process: ChildProcess;\n events: AsyncIterable<GeminiCLIEvent>;\n} {\n const {\n cwd = process.cwd(),\n apiKey = process.env.GEMINI_API_KEY,\n yolo = true,\n outputFormat = 'stream-json',\n model = 'gemini-2.5-flash',\n } = options;\n\n const args = ['-p', prompt];\n\n if (yolo) {\n args.push('--yolo');\n }\n\n args.push('--output-format', outputFormat);\n args.push('-m', model);\n\n const gemini = spawn('gemini', args, {\n cwd,\n env: {\n ...process.env,\n ...(apiKey ? { GEMINI_API_KEY: apiKey } : {}),\n },\n });\n\n const events: AsyncIterable<GeminiCLIEvent> = {\n [Symbol.asyncIterator]() {\n let buffer = '';\n let done = false;\n const queue: GeminiCLIEvent[] = [];\n let resolveNext: ((value: IteratorResult<GeminiCLIEvent>) => void) | null = null;\n\n const pushEvent = (event: GeminiCLIEvent) => {\n if (resolveNext) {\n resolveNext({ value: event, done: false });\n resolveNext = null;\n } else {\n queue.push(event);\n }\n };\n\n gemini.stdout.on('data', (data: Buffer) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n const event = JSON.parse(line) as GeminiCLIEvent;\n pushEvent(event);\n } catch {\n // Raw output, wrap it\n pushEvent({ type: 'message', content: line });\n }\n }\n }\n });\n\n gemini.stderr.on('data', (data: Buffer) => {\n pushEvent({ type: 'error', content: data.toString() });\n });\n\n gemini.on('close', (code) => {\n if (buffer.trim()) {\n try {\n const event = JSON.parse(buffer) as GeminiCLIEvent;\n pushEvent(event);\n } catch {\n pushEvent({ type: 'message', content: buffer });\n }\n }\n pushEvent({ type: 'done', code: code ?? 0 });\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as GeminiCLIEvent, done: true });\n }\n });\n\n gemini.on('error', (err) => {\n pushEvent({ type: 'error', content: err.message });\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as GeminiCLIEvent, done: true });\n }\n });\n\n return {\n next(): Promise<IteratorResult<GeminiCLIEvent>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n if (done) {\n return Promise.resolve({ value: undefined as unknown as GeminiCLIEvent, done: true });\n }\n return new Promise((resolve) => {\n resolveNext = resolve;\n });\n },\n };\n },\n };\n\n return { process: gemini, events };\n}\n\n/**\n * Analyze an image using the Google Generative AI SDK (Gemini Vision)\n *\n * @see /server/prompts.ts for IMAGE_ANALYSIS_PROMPT\n */\nasync function analyzeImageWithGemini(apiKey: string, base64Image: string, modelName: string = 'gemini-2.5-flash'): Promise<string> {\n try {\n const genAI = new GoogleGenerativeAI(apiKey);\n const model = genAI.getGenerativeModel({ model: modelName });\n\n // Clean base64 string if needed (remove data URI prefix)\n const imageParts = [\n {\n inlineData: {\n data: base64Image.replace(/^data:image\\/\\w+;base64,/, ''),\n mimeType: 'image/png',\n },\n },\n ];\n\n const result = await model.generateContent([\n IMAGE_ANALYSIS_PROMPT,\n ...imageParts,\n ]);\n\n const response = await result.response;\n const text = response.text();\n return text;\n } catch (error) {\n console.error('Failed to analyze image with Gemini Vision:', error);\n return `[Extension Error] Failed to analyze drawing: ${error instanceof Error ? error.message : String(error)}`;\n }\n}\n\n/**\n * Options for createGeminiCLIStream with abort support\n */\ninterface StreamOptions extends GeminiCLIOptions {\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Callback when cancelled - for cleanup like reverting snapshots */\n onCancel?: () => void;\n}\n\n/**\n * Create a streaming response for use in API routes (Next.js, Express, etc.)\n */\nexport function createGeminiCLIStream(\n annotation: Partial<Annotation> & { comment?: string },\n projectContext?: ProjectContext,\n options?: StreamOptions\n): ReadableStream<Uint8Array> {\n // We need to handle the prompt building inside logic because it might be async now\n // But ReadableStream start controller can be async\n const encoder = new TextEncoder();\n let geminiProcess: ChildProcess | null = null;\n let isCancelled = false;\n\n return new ReadableStream({\n async start(controller) {\n const apiKey = options?.apiKey || process.env.GEMINI_API_KEY;\n let visionDescription = '';\n\n // Set up abort handler\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n isCancelled = true;\n if (geminiProcess && !geminiProcess.killed) {\n console.log('[Skema Server] Killing Gemini CLI process due to client disconnect');\n geminiProcess.kill('SIGTERM');\n }\n // Call the onCancel callback for cleanup (like reverting snapshots)\n options.onCancel?.();\n try {\n controller.close();\n } catch {\n // Controller may already be closed\n }\n });\n }\n\n // Perform Image Analysis if needed for drawing annotations with images\n if (annotation.type === 'drawing' && (annotation as { drawingImage?: string }).drawingImage && apiKey) {\n // Check if cancelled before vision analysis\n if (isCancelled) return;\n\n // Send a \"progress\" event to the client\n const progressEvent: GeminiCLIEvent = {\n type: 'message',\n role: 'assistant',\n content: '[Analyzing] Drawing image with Gemini Vision...',\n timestamp: new Date().toISOString()\n };\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(progressEvent)}\\n\\n`));\n\n visionDescription = await analyzeImageWithGemini(\n apiKey,\n (annotation as { drawingImage: string }).drawingImage,\n options?.model || 'gemini-2.5-flash'\n );\n\n // Check if cancelled after vision analysis\n if (isCancelled) return;\n\n // Log the analysis result\n const analysisEvent: GeminiCLIEvent = {\n type: 'message',\n role: 'assistant',\n content: `[Vision] Visual Analysis:\\n${visionDescription}`,\n timestamp: new Date().toISOString()\n };\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(analysisEvent)}\\n\\n`));\n }\n\n // Check if cancelled before spawning CLI\n if (isCancelled) return;\n\n const prompt = buildPromptFromAnnotation(\n annotation,\n projectContext,\n {\n fastMode: options?.fastMode ?? false,\n visionDescription\n }\n );\n\n // Send the prompt as a debug event so it shows up in browser console\n const promptEvent: GeminiCLIEvent = {\n type: 'debug',\n content: prompt,\n label: 'GEMINI CLI PROMPT',\n timestamp: new Date().toISOString()\n };\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(promptEvent)}\\n\\n`));\n\n const { process: proc, events } = spawnGeminiCLI(prompt, options);\n geminiProcess = proc;\n\n for await (const event of events) {\n // Check if cancelled during processing\n if (isCancelled) break;\n\n const sseData = `data: ${JSON.stringify(event)}\\n\\n`;\n controller.enqueue(encoder.encode(sseData));\n\n if (event.type === 'done') {\n controller.close();\n break;\n }\n }\n },\n cancel() {\n // Called when the stream is cancelled\n isCancelled = true;\n if (geminiProcess && !geminiProcess.killed) {\n geminiProcess.kill('SIGTERM');\n }\n options?.onCancel?.();\n }\n });\n}\n\n/**\n * Run Gemini CLI and wait for completion\n */\nexport async function runGeminiCLI(\n annotation: Partial<Annotation> & { comment?: string },\n projectContext?: ProjectContext,\n options?: GeminiCLIOptions\n): Promise<{\n success: boolean;\n response: string;\n events: GeminiCLIEvent[];\n}> {\n const apiKey = options?.apiKey || process.env.GEMINI_API_KEY;\n let visionDescription = '';\n\n // Perform Image Analysis if needed for drawing annotations with images\n if (annotation.type === 'drawing' && (annotation as { drawingImage?: string }).drawingImage && apiKey) {\n visionDescription = await analyzeImageWithGemini(\n apiKey,\n (annotation as { drawingImage: string }).drawingImage,\n options?.model || 'gemini-2.5-flash'\n );\n }\n\n const prompt = buildPromptFromAnnotation(\n annotation,\n projectContext,\n {\n fastMode: options?.fastMode ?? false,\n visionDescription\n }\n );\n\n // Note: For runGeminiCLI (non-streaming), logs are not sent to browser\n // Use createGeminiCLIStream for browser console logging\n const { events: eventIterator } = spawnGeminiCLI(prompt, options);\n\n const events: GeminiCLIEvent[] = [];\n let response = '';\n let success = true;\n\n for await (const event of eventIterator) {\n events.push(event);\n\n if (event.type === 'message' && event.role === 'assistant' && event.content) {\n response += event.content;\n }\n\n if (event.type === 'done' && event.code !== 0) {\n success = false;\n }\n }\n\n return { success, response, events };\n}\n\n// =============================================================================\n// Next.js Route Handler - can be directly re-exported\n// =============================================================================\n\n/**\n * Next.js App Router POST handler for Gemini CLI\n *\n * Usage in your app/api/gemini/route.ts:\n * ```typescript\n * export { POST, DELETE } from 'skema-core/server';\n * ```\n *\n * Or with custom options:\n * ```typescript\n * import { createGeminiRouteHandler, createRevertRouteHandler } from 'skema-core/server';\n * export const POST = createGeminiRouteHandler({ cwd: '/custom/path' });\n * export const DELETE = createRevertRouteHandler({ cwd: '/custom/path' });\n * ```\n */\nexport function createGeminiRouteHandler(defaultOptions?: GeminiCLIOptions) {\n return async function POST(request: Request): Promise<Response> {\n const { annotation, projectContext } = await request.json();\n const cwd = defaultOptions?.cwd ?? process.cwd();\n\n // Create snapshot for undo support (using annotation.id if available)\n const annotationId = annotation.id || `temp-${Date.now()}`;\n createSnapshot(annotationId, cwd);\n\n const stream = createGeminiCLIStream(annotation, projectContext, {\n cwd,\n ...defaultOptions,\n // Pass abort signal from request for client disconnect detection\n signal: request.signal,\n // Revert snapshot if client cancels/disconnects\n onCancel: () => {\n console.log(`[Skema Server] Client disconnected, reverting snapshot for: ${annotationId}`);\n const result = revertAnnotation(annotationId, cwd);\n if (result.success) {\n console.log(`[Skema Server] Successfully reverted changes for: ${annotationId}`);\n } else {\n console.error(`[Skema Server] Failed to revert changes: ${result.message}`);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'X-Annotation-Id': annotationId,\n },\n });\n };\n}\n\n/**\n * Next.js App Router DELETE handler for reverting Gemini changes\n */\nexport function createRevertRouteHandler(defaultOptions?: { cwd?: string }) {\n return async function DELETE(request: Request): Promise<Response> {\n const { annotationId } = await request.json();\n const cwd = defaultOptions?.cwd ?? process.cwd();\n\n if (!annotationId) {\n return new Response(JSON.stringify({ success: false, message: 'Missing annotationId' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const result = revertAnnotation(annotationId, cwd);\n\n return new Response(JSON.stringify(result), {\n status: result.success ? 200 : 400,\n headers: { 'Content-Type': 'application/json' },\n });\n };\n}\n\n/**\n * Default POST handler - ready to use in Next.js App Router\n *\n * Usage:\n * ```typescript\n * // app/api/gemini/route.ts\n * export { POST, DELETE } from 'skema-core/server';\n * ```\n */\nexport const POST = createGeminiRouteHandler();\nexport const DELETE = createRevertRouteHandler();\n","import { spawn, type ChildProcess } from 'child_process';\n\n// =============================================================================\n// AI Provider Types\n// =============================================================================\n\n// CLI-based providers (legacy mode) - only gemini and claude have CLIs\nexport type AIProvider = 'gemini' | 'claude';\n\n// All provider names (used for events and type narrowing)\nexport type AnyProvider = 'gemini' | 'claude';\n\nexport interface AIProviderConfig {\n provider: AIProvider;\n /** Working directory for CLI commands */\n cwd?: string;\n /** Model override (provider-specific) */\n model?: string;\n}\n\nexport interface AIStreamEvent {\n type: 'init' | 'text' | 'tool_use' | 'tool_result' | 'error' | 'done' | 'debug';\n content?: string;\n timestamp: string;\n provider: AnyProvider;\n /** Raw event from the CLI (provider-specific) */\n raw?: unknown;\n}\n\nexport interface AIRunResult {\n success: boolean;\n output: string;\n events: AIStreamEvent[];\n provider: AIProvider;\n}\n\n// =============================================================================\n// Provider Configurations\n// =============================================================================\n\ninterface ProviderSpec {\n command: string;\n buildArgs: (prompt: string, options?: { model?: string; yolo?: boolean }) => string[];\n parseOutput: (line: string) => AIStreamEvent | null;\n}\n\nconst PROVIDERS: Record<AIProvider, ProviderSpec> = {\n gemini: {\n command: 'gemini',\n buildArgs: (prompt, options) => {\n const args = ['-p', prompt];\n if (options?.yolo !== false) args.push('--yolo');\n args.push('--output-format', 'stream-json');\n if (options?.model) args.push('-m', options.model);\n else args.push('-m', 'gemini-2.5-flash');\n return args;\n },\n parseOutput: (line) => {\n try {\n const parsed = JSON.parse(line);\n return {\n type: mapGeminiEventType(parsed.type),\n content: parsed.content || parsed.message,\n timestamp: new Date().toISOString(),\n provider: 'gemini',\n raw: parsed,\n };\n } catch {\n return {\n type: 'text',\n content: line,\n timestamp: new Date().toISOString(),\n provider: 'gemini',\n };\n }\n },\n },\n\n claude: {\n command: 'claude',\n buildArgs: (prompt, options) => {\n const args = ['-p', prompt, '--output-format', 'stream-json'];\n if (options?.yolo !== false) args.push('--dangerously-skip-permissions');\n if (options?.model) args.push('--model', options.model);\n return args;\n },\n parseOutput: (line) => {\n try {\n const parsed = JSON.parse(line);\n return {\n type: mapClaudeEventType(parsed.type),\n content: parsed.content || extractClaudeContent(parsed),\n timestamp: new Date().toISOString(),\n provider: 'claude',\n raw: parsed,\n };\n } catch {\n return {\n type: 'text',\n content: line,\n timestamp: new Date().toISOString(),\n provider: 'claude',\n };\n }\n },\n },\n};\n\n// =============================================================================\n// Event Type Mappers\n// =============================================================================\n\nfunction mapGeminiEventType(type: string): AIStreamEvent['type'] {\n switch (type) {\n case 'init': return 'init';\n case 'message': return 'text';\n case 'tool_use': return 'tool_use';\n case 'tool_result': return 'tool_result';\n case 'error': return 'error';\n case 'done': case 'result': return 'done';\n default: return 'text';\n }\n}\n\nfunction mapClaudeEventType(type: string): AIStreamEvent['type'] {\n switch (type) {\n case 'system': return 'init';\n case 'assistant': case 'text': return 'text';\n case 'tool_use': return 'tool_use';\n case 'tool_result': return 'tool_result';\n case 'error': return 'error';\n case 'result': return 'done';\n default: return 'text';\n }\n}\n\nfunction extractClaudeContent(parsed: Record<string, unknown>): string | undefined {\n // Claude Code stream-json format can have content in different places\n if (typeof parsed.content === 'string') return parsed.content;\n if (parsed.message && typeof parsed.message === 'object') {\n const msg = parsed.message as Record<string, unknown>;\n if (typeof msg.content === 'string') return msg.content;\n }\n return undefined;\n}\n\n// =============================================================================\n// Core Functions\n// =============================================================================\n\n/**\n * Spawn an AI CLI and return an async iterator of events\n */\nexport function spawnAICLI(\n prompt: string,\n config: AIProviderConfig\n): {\n process: ChildProcess;\n events: AsyncIterable<AIStreamEvent>;\n} {\n const spec = PROVIDERS[config.provider];\n const args = spec.buildArgs(prompt, { model: config.model });\n const cwd = config.cwd || process.cwd();\n\n console.log(`[Skema] Spawning ${config.provider}: ${spec.command} ${args.join(' ')}`);\n\n const child = spawn(spec.command, args, {\n cwd,\n env: process.env,\n });\n\n const events: AsyncIterable<AIStreamEvent> = {\n [Symbol.asyncIterator]() {\n let buffer = '';\n let done = false;\n const queue: AIStreamEvent[] = [];\n let resolveNext: ((value: IteratorResult<AIStreamEvent>) => void) | null = null;\n\n const pushEvent = (event: AIStreamEvent) => {\n if (resolveNext) {\n resolveNext({ value: event, done: false });\n resolveNext = null;\n } else {\n queue.push(event);\n }\n };\n\n child.stdout?.on('data', (data: Buffer) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n const event = spec.parseOutput(line.trim());\n if (event) pushEvent(event);\n }\n }\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n const content = data.toString().trim();\n if (content) {\n pushEvent({\n type: 'error',\n content,\n timestamp: new Date().toISOString(),\n provider: config.provider,\n });\n }\n });\n\n child.on('close', (code) => {\n // Process remaining buffer\n if (buffer.trim()) {\n const event = spec.parseOutput(buffer.trim());\n if (event) pushEvent(event);\n }\n\n pushEvent({\n type: 'done',\n content: `Process exited with code ${code}`,\n timestamp: new Date().toISOString(),\n provider: config.provider,\n });\n\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as AIStreamEvent, done: true });\n }\n });\n\n child.on('error', (err) => {\n pushEvent({\n type: 'error',\n content: `Failed to spawn ${config.provider}: ${err.message}`,\n timestamp: new Date().toISOString(),\n provider: config.provider,\n });\n done = true;\n if (resolveNext) {\n resolveNext({ value: undefined as unknown as AIStreamEvent, done: true });\n }\n });\n\n return {\n next(): Promise<IteratorResult<AIStreamEvent>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n if (done) {\n return Promise.resolve({ value: undefined as unknown as AIStreamEvent, done: true });\n }\n return new Promise((resolve) => {\n resolveNext = resolve;\n });\n },\n };\n },\n };\n\n return { process: child, events };\n}\n\n/**\n * Run an AI CLI and wait for completion (non-streaming)\n */\nexport async function runAICLI(\n prompt: string,\n config: AIProviderConfig\n): Promise<AIRunResult> {\n const { events } = spawnAICLI(prompt, config);\n\n const collectedEvents: AIStreamEvent[] = [];\n let output = '';\n let success = true;\n\n for await (const event of events) {\n collectedEvents.push(event);\n\n if (event.type === 'text' && event.content) {\n output += event.content + '\\n';\n }\n\n if (event.type === 'error') {\n success = false;\n }\n }\n\n return {\n success,\n output: output.trim(),\n events: collectedEvents,\n provider: config.provider,\n };\n}\n\n/**\n * Check if a provider CLI is available\n */\nexport function isProviderAvailable(provider: AIProvider): boolean {\n const spec = PROVIDERS[provider];\n try {\n const { execSync } = require('child_process');\n execSync(`which ${spec.command}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get available providers\n */\nexport function getAvailableProviders(): AIProvider[] {\n return (['gemini', 'claude'] as AIProvider[]).filter(isProviderAvailable);\n}\n\n// =============================================================================\n// Provider Status (installed + authorized)\n// =============================================================================\n\nexport interface ProviderStatus {\n installed: boolean;\n authorized: boolean;\n /** Human-readable status message */\n message: string;\n}\n\n/**\n * Check if a provider CLI is authorized (can actually run).\n * Uses lightweight commands that verify auth without doing real work.\n */\nfunction checkProviderAuthorized(provider: AIProvider): boolean {\n const { execSync } = require('child_process');\n try {\n if (provider === 'gemini') {\n // `gemini --version` succeeds if installed; auth is checked via a quick prompt\n // We use a minimal approach: check if GEMINI_API_KEY is set or if the CLI config exists\n execSync('gemini --version', { stdio: 'ignore', timeout: 5000 });\n return true;\n } else if (provider === 'claude') {\n // claude --version succeeds if installed; auth is checked similarly\n execSync('claude --version', { stdio: 'ignore', timeout: 5000 });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get detailed status for a single provider\n */\nexport function getProviderStatus(provider: AIProvider): ProviderStatus {\n const installed = isProviderAvailable(provider);\n if (!installed) {\n return {\n installed: false,\n authorized: false,\n message: `${provider} CLI not installed`,\n };\n }\n\n const authorized = checkProviderAuthorized(provider);\n if (!authorized) {\n return {\n installed: true,\n authorized: false,\n message: `${provider} CLI installed but not authorized`,\n };\n }\n\n return {\n installed: true,\n authorized: true,\n message: 'Ready',\n };\n}\n\n/**\n * Get status for all providers\n */\nexport function getAllProviderStatuses(): Record<AIProvider, ProviderStatus> {\n return {\n gemini: getProviderStatus('gemini'),\n claude: getProviderStatus('claude'),\n };\n}\n","import { generateText } from 'ai';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { IMAGE_ANALYSIS_PROMPT } from './prompts';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type VisionProvider = 'gemini' | 'claude' | 'openai';\n\nexport const VISION_MODELS: Record<VisionProvider, { models: string[]; default: string }> = {\n gemini: {\n models: ['gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-3-flash-preview', 'gemini-3-pro-preview'],\n default: 'gemini-2.5-flash',\n },\n claude: {\n models: ['claude-haiku-4-5-20251001', 'claude-sonnet-4-5-20250929', 'claude-opus-4-6'],\n default: 'claude-haiku-4-5-20251001',\n },\n openai: {\n models: ['gpt-4o-mini', 'gpt-4o', 'gpt-4.1', 'gpt-5.2'],\n default: 'gpt-4o-mini',\n },\n};\n\nexport interface VisionAnalysisResult {\n success: boolean;\n description: string;\n provider: VisionProvider;\n error?: string;\n}\n\nexport interface VisionConfig {\n provider: VisionProvider;\n /** API key for vision API (falls back to env vars) */\n apiKey?: string;\n /** Model to use for vision */\n model?: string;\n}\n\n// =============================================================================\n// Provider Factory\n// =============================================================================\n\nfunction getProviderModel(provider: VisionProvider, apiKey: string, model?: string) {\n const modelId = model || VISION_MODELS[provider].default;\n\n switch (provider) {\n case 'gemini': {\n const google = createGoogleGenerativeAI({ apiKey });\n return google(modelId);\n }\n case 'claude': {\n const anthropic = createAnthropic({ apiKey });\n return anthropic(modelId);\n }\n case 'openai': {\n const openai = createOpenAI({ apiKey });\n return openai(modelId);\n }\n }\n}\n\nfunction getEnvVarForProvider(provider: VisionProvider): string | undefined {\n switch (provider) {\n case 'gemini': return process.env.GEMINI_API_KEY;\n case 'claude': return process.env.ANTHROPIC_API_KEY;\n case 'openai': return process.env.OPENAI_API_KEY;\n }\n}\n\nfunction getEnvVarName(provider: VisionProvider): string {\n switch (provider) {\n case 'gemini': return 'GEMINI_API_KEY';\n case 'claude': return 'ANTHROPIC_API_KEY';\n case 'openai': return 'OPENAI_API_KEY';\n }\n}\n\n// =============================================================================\n// Main Vision Analysis Function\n// =============================================================================\n\n/**\n * Analyze an image using the specified AI provider's vision capabilities\n */\nexport async function analyzeImage(\n base64Image: string,\n config: VisionConfig\n): Promise<VisionAnalysisResult> {\n const { provider } = config;\n\n // Get API key from config or environment\n const apiKey = config.apiKey || getEnvVarForProvider(provider);\n\n if (!apiKey) {\n return {\n success: false,\n description: '',\n provider,\n error: `No API key found for ${provider} vision. Set ${getEnvVarName(provider)} environment variable.`,\n };\n }\n\n console.log(`[Vision] Analyzing image with ${provider}...`);\n\n try {\n // Clean base64 string if needed (remove data URI prefix)\n const cleanBase64 = base64Image.replace(/^data:image\\/\\w+;base64,/, '');\n\n const model = getProviderModel(provider, apiKey, config.model);\n\n const result = await generateText({\n model,\n maxTokens: 1024,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'image',\n image: Buffer.from(cleanBase64, 'base64'),\n mimeType: 'image/png',\n },\n {\n type: 'text',\n text: IMAGE_ANALYSIS_PROMPT,\n },\n ],\n },\n ],\n });\n\n return {\n success: true,\n description: result.text,\n provider,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[Vision] ${provider} analysis failed:`, message);\n return {\n success: false,\n description: '',\n provider,\n error: message,\n };\n }\n}\n\n/**\n * Check if vision analysis is available for a provider\n */\nexport function isVisionAvailable(provider: VisionProvider): boolean {\n return !!getEnvVarForProvider(provider);\n}\n","// =============================================================================\n// Annotation Store - In-memory store for MCP-mode queued annotations\n// =============================================================================\n//\n// When Skema is in MCP mode, annotations are queued here instead of being\n// processed immediately. The MCP server reads from this store to let AI agents\n// retrieve and act on annotations.\n//\n\nimport type { Annotation } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type AnnotationStatus = 'pending' | 'acknowledged' | 'resolved' | 'dismissed';\n\nexport interface StoredAnnotation {\n /** The original Skema annotation data */\n annotation: Annotation;\n /** User comment describing the desired change */\n comment: string;\n /** Current status in the MCP workflow */\n status: AnnotationStatus;\n /** When it was queued */\n createdAt: string;\n /** When status last changed */\n updatedAt: string;\n /** If resolved/dismissed, who did it */\n resolvedBy?: 'human' | 'agent';\n /** Resolution summary (from agent) */\n resolutionSummary?: string;\n /** Dismissal reason (from agent) */\n dismissalReason?: string;\n}\n\n// =============================================================================\n// Store Implementation\n// =============================================================================\n\nconst storedAnnotations = new Map<string, StoredAnnotation>();\n\n// Event listeners for real-time notifications\ntype StoreListener = (event: string, annotation: StoredAnnotation) => void;\nconst listeners = new Set<StoreListener>();\n\nfunction notify(event: string, annotation: StoredAnnotation) {\n for (const listener of listeners) {\n try {\n listener(event, annotation);\n } catch (e) {\n console.error('[AnnotationStore] Listener error:', e);\n }\n }\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Queue an annotation (called when user submits in MCP mode)\n */\nexport function queueAnnotation(\n annotation: Annotation,\n comment: string\n): StoredAnnotation {\n const id = annotation.id || `ann-${Date.now()}`;\n const now = new Date().toISOString();\n\n const stored: StoredAnnotation = {\n annotation: { ...annotation, id },\n comment,\n status: 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n storedAnnotations.set(id, stored);\n console.log(`[AnnotationStore] Queued annotation ${id}: \"${comment.slice(0, 50)}...\"`);\n notify('annotation.created', stored);\n return stored;\n}\n\n/**\n * Get all pending annotations\n */\nexport function getPendingAnnotations(): StoredAnnotation[] {\n return Array.from(storedAnnotations.values()).filter(a => a.status === 'pending');\n}\n\n/**\n * Get all annotations (any status)\n */\nexport function getAllAnnotations(): StoredAnnotation[] {\n return Array.from(storedAnnotations.values());\n}\n\n/**\n * Get a specific annotation by ID\n */\nexport function getAnnotation(id: string): StoredAnnotation | undefined {\n return storedAnnotations.get(id);\n}\n\n/**\n * Mark an annotation as acknowledged (agent has seen it)\n */\nexport function acknowledgeAnnotation(id: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n stored.status = 'acknowledged';\n stored.updatedAt = new Date().toISOString();\n notify('annotation.updated', stored);\n return stored;\n}\n\n/**\n * Mark an annotation as resolved (agent has implemented the change)\n */\nexport function resolveAnnotation(id: string, summary?: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n stored.status = 'resolved';\n stored.resolvedBy = 'agent';\n stored.resolutionSummary = summary;\n stored.updatedAt = new Date().toISOString();\n notify('annotation.updated', stored);\n return stored;\n}\n\n/**\n * Dismiss an annotation (agent decided not to address it)\n */\nexport function dismissAnnotation(id: string, reason: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n stored.status = 'dismissed';\n stored.resolvedBy = 'agent';\n stored.dismissalReason = reason;\n stored.updatedAt = new Date().toISOString();\n notify('annotation.updated', stored);\n return stored;\n}\n\n/**\n * Remove an annotation from the store\n */\nexport function removeAnnotation(id: string): StoredAnnotation | undefined {\n const stored = storedAnnotations.get(id);\n if (!stored) return undefined;\n\n storedAnnotations.delete(id);\n notify('annotation.deleted', stored);\n return stored;\n}\n\n/**\n * Clear all annotations\n */\nexport function clearAnnotations(): void {\n storedAnnotations.clear();\n}\n\n/**\n * Subscribe to store events\n */\nexport function onStoreEvent(listener: StoreListener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/**\n * Get count of pending annotations\n */\nexport function getPendingCount(): number {\n let count = 0;\n for (const a of storedAnnotations.values()) {\n if (a.status === 'pending') count++;\n }\n return count;\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport { execSync, exec } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n type AIProvider as CLIProvider,\n type AIProviderConfig,\n spawnAICLI,\n isProviderAvailable,\n getAvailableProviders as getCLIProviders,\n getAllProviderStatuses,\n type ProviderStatus,\n} from './ai-provider';\nimport { buildPromptFromAnnotation, type ProjectContext } from './gemini-cli';\nimport { analyzeImage } from './vision';\nimport { type ProviderName, type ExecutionMode } from './providers';\nimport type { Annotation } from '../types';\nimport {\n queueAnnotation,\n getPendingAnnotations,\n getAllAnnotations,\n getAnnotation as getStoredAnnotation,\n acknowledgeAnnotation,\n resolveAnnotation,\n dismissAnnotation,\n removeAnnotation,\n clearAnnotations,\n getPendingCount,\n onStoreEvent,\n type StoredAnnotation,\n} from './annotation-store';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DaemonConfig {\n /** Port for WebSocket server (default: 9999) */\n port?: number;\n /** Working directory for file operations and AI commands */\n cwd?: string;\n /** Default AI provider */\n defaultProvider?: ProviderName;\n /** Default execution mode */\n defaultMode?: ExecutionMode;\n}\n\nexport interface IncomingMessage {\n id: string;\n type: string;\n [key: string]: unknown;\n}\n\nexport interface OutgoingMessage {\n id?: string;\n type: string;\n success?: boolean;\n error?: string;\n [key: string]: unknown;\n}\n\n// =============================================================================\n// Daemon State\n// =============================================================================\n\nlet currentProvider: ProviderName = 'gemini';\nlet workingDirectory: string = process.cwd();\nlet currentMode: ExecutionMode = 'direct-cli';\n\n// Store annotation snapshots for undo (same as gemini-cli.ts)\nconst annotationSnapshots = new Map<string, string>();\n\n// Track MCP server connection (separate from browser clients)\nlet mcpServerClient: WebSocket | null = null;\nlet mcpClientName: string | null = null;\n\nfunction getAnnotationCounts() {\n const all = getAllAnnotations();\n return {\n pending: all.filter((a) => a.status === 'pending').length,\n acknowledged: all.filter((a) => a.status === 'acknowledged').length,\n resolved: all.filter((a) => a.status === 'resolved').length,\n dismissed: all.filter((a) => a.status === 'dismissed').length,\n };\n}\n\n// =============================================================================\n// Git Snapshot Functions (for undo support)\n// =============================================================================\n\nfunction createSnapshot(annotationId: string): string | null {\n try {\n const stashRef = execSync('git stash create', { cwd: workingDirectory, encoding: 'utf-8' }).trim();\n if (stashRef) {\n annotationSnapshots.set(annotationId, stashRef);\n console.log(`[Daemon] Created snapshot ${stashRef.slice(0, 7)} for ${annotationId}`);\n return stashRef;\n }\n const headRef = execSync('git rev-parse HEAD', { cwd: workingDirectory, encoding: 'utf-8' }).trim();\n annotationSnapshots.set(annotationId, headRef);\n return headRef;\n } catch (error) {\n console.error('[Daemon] Failed to create snapshot:', error);\n return null;\n }\n}\n\nfunction revertSnapshot(annotationId: string): { success: boolean; message: string } {\n const snapshotRef = annotationSnapshots.get(annotationId);\n if (!snapshotRef) {\n return { success: false, message: `No snapshot found for ${annotationId}` };\n }\n\n try {\n const changedFiles = execSync(`git diff --name-only ${snapshotRef}`, {\n cwd: workingDirectory,\n encoding: 'utf-8',\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (changedFiles.length === 0) {\n annotationSnapshots.delete(annotationId);\n return { success: true, message: 'No changes to revert' };\n }\n\n for (const file of changedFiles) {\n try {\n execSync(`git checkout ${snapshotRef} -- \"${file}\"`, { cwd: workingDirectory });\n } catch {\n // File might be new, try removing it\n }\n }\n\n annotationSnapshots.delete(annotationId);\n return { success: true, message: `Reverted ${changedFiles.length} file(s)` };\n } catch (error) {\n return { success: false, message: String(error) };\n }\n}\n\n// =============================================================================\n// Message Handlers\n// =============================================================================\n\ntype MessageHandler = (\n msg: IncomingMessage,\n ws: WebSocket\n) => Promise<OutgoingMessage | void>;\n\nconst handlers: Record<string, MessageHandler> = {\n // -------------------------------------------------------------------------\n // Provider Management\n // -------------------------------------------------------------------------\n 'get-provider': async (msg) => {\n return {\n id: msg.id,\n type: 'provider',\n provider: currentProvider,\n available: getCLIProviders(),\n };\n },\n\n 'set-provider': async (msg) => {\n const newProvider = msg.provider as ProviderName;\n if (!['gemini', 'claude'].includes(newProvider)) {\n return { id: msg.id, type: 'error', error: `Invalid provider: ${newProvider}` };\n }\n \n // Check CLI availability in CLI mode\n if (currentMode === 'direct-cli' && !isProviderAvailable(newProvider as CLIProvider)) {\n return {\n id: msg.id,\n type: 'error',\n error: `Provider \"${newProvider}\" CLI is not installed.`,\n };\n }\n \n currentProvider = newProvider;\n console.log(`[Daemon] Switched to provider: ${currentProvider}`);\n return { id: msg.id, type: 'provider-changed', provider: currentProvider };\n },\n\n 'check-providers': async (msg) => {\n const statuses = getAllProviderStatuses();\n return {\n id: msg.id,\n type: 'provider-statuses',\n providerStatus: statuses,\n };\n },\n\n // -------------------------------------------------------------------------\n // Mode Management\n // -------------------------------------------------------------------------\n 'get-mode': async (msg) => {\n return {\n id: msg.id,\n type: 'mode',\n mode: currentMode,\n availableModes: ['direct-cli', 'mcp'] as ExecutionMode[],\n };\n },\n\n 'set-mode': async (msg) => {\n const newMode = msg.mode as ExecutionMode;\n if (!['direct-cli', 'mcp'].includes(newMode)) {\n return { id: msg.id, type: 'error', error: `Invalid mode: ${newMode}` };\n }\n currentMode = newMode;\n console.log(`[Daemon] Switched to mode: ${currentMode}`);\n return { id: msg.id, type: 'mode-changed', mode: currentMode };\n },\n\n // -------------------------------------------------------------------------\n // AI Generation (streaming)\n // -------------------------------------------------------------------------\n generate: async (msg, ws) => {\n const annotation = msg.annotation as Partial<Annotation> & { comment?: string };\n const projectContext = msg.projectContext as ProjectContext | undefined;\n const annotationId = (annotation as { id?: string }).id || `temp-${Date.now()}`;\n \n const requestMode = (msg.mode as ExecutionMode) || currentMode;\n const requestProvider = (msg.provider as ProviderName) || currentProvider;\n\n // MCP mode: queue annotation instead of processing immediately\n if (requestMode === 'mcp') {\n const comment = annotation.comment || '';\n const stored = queueAnnotation(annotation as Annotation, comment);\n const counts = getAnnotationCounts();\n\n sendMessage(ws, {\n id: msg.id,\n type: 'annotation-queued',\n success: true,\n annotationId: stored.annotation.id,\n pendingCount: getPendingCount(),\n annotationCounts: counts,\n });\n // Broadcast updated counts to all browser clients\n broadcastToClients({\n type: 'mcp-annotation-counts',\n counts,\n });\n return;\n }\n\n // Create snapshot for undo\n createSnapshot(annotationId);\n\n // Check if this is a drawing annotation with an image\n let visionDescription = '';\n const drawingAnnotation = annotation as { drawingImage?: string };\n\n if (annotation.type === 'drawing' && drawingAnnotation.drawingImage) {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'text',\n content: `[Analyzing drawing with vision...]`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n\n // Use vision provider from request (default: gemini)\n const visionProvider = (msg.visionProvider as string | undefined) || 'gemini';\n const visionModel = msg.visionModel as string | undefined;\n const visionApiKey = (msg.visionApiKey as string | undefined)\n || (visionProvider === 'gemini' ? process.env.GEMINI_API_KEY\n : visionProvider === 'claude' ? process.env.ANTHROPIC_API_KEY\n : process.env.OPENAI_API_KEY);\n\n if (visionApiKey) {\n const visionResult = await analyzeImage(drawingAnnotation.drawingImage, {\n provider: visionProvider as any,\n apiKey: visionApiKey,\n model: visionModel,\n });\n\n if (visionResult.success) {\n visionDescription = visionResult.description;\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'text',\n content: `[Vision analysis complete]\\n${visionDescription}`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n } else {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'error',\n content: `Vision analysis failed: ${visionResult.error}`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n }\n } else {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'text',\n content: `[Vision not available - add your API key in Settings (gear icon)]`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n }\n }\n\n // Build prompt using existing logic (with vision description if available)\n const prompt = buildPromptFromAnnotation(annotation, projectContext, {\n fastMode: msg.fastMode === true,\n visionDescription,\n });\n\n console.log(`[Skema] Prompt:\\n${prompt}`);\n\n // Send prompt as debug event\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'debug',\n content: prompt,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n\n // CLI mode - spawn CLI tools\n const cliProvider = requestProvider as CLIProvider;\n if (!isProviderAvailable(cliProvider)) {\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event: {\n type: 'error',\n content: `${requestProvider} CLI is not installed. Run: npm install -g @google/gemini-cli`,\n timestamp: new Date().toISOString(),\n provider: requestProvider,\n },\n });\n return;\n }\n\n const config: AIProviderConfig = {\n provider: cliProvider,\n cwd: workingDirectory,\n model: msg.model as string | undefined,\n };\n\n const { process: aiProcess, events } = spawnAICLI(prompt, config);\n\n // Stream events back (log CLI output in daemon terminal with colored prefix)\n const prefixGreen = '\\x1b[32m'; // ANSI green (similar to browser #10b981)\n const reset = '\\x1b[0m';\n for await (const event of events) {\n if (event.type === 'text' && event.content) {\n console.log(`${prefixGreen}[Skema ${requestProvider}]${reset} ${event.content}`);\n } else if (event.type === 'error' && event.content) {\n console.error(`${prefixGreen}[Skema ${requestProvider}]${reset} ${event.content}`);\n }\n sendMessage(ws, {\n id: msg.id,\n type: 'ai-event',\n event,\n annotationId,\n });\n\n if (event.type === 'done') {\n sendMessage(ws, {\n id: msg.id,\n type: 'generate-complete',\n success: true,\n annotationId,\n provider: requestProvider,\n mode: requestMode,\n });\n break;\n }\n }\n },\n\n // -------------------------------------------------------------------------\n // Undo/Revert\n // -------------------------------------------------------------------------\n revert: async (msg) => {\n const annotationId = msg.annotationId as string;\n if (!annotationId) {\n return { id: msg.id, type: 'error', error: 'Missing annotationId' };\n }\n const result = revertSnapshot(annotationId);\n return { id: msg.id, type: 'revert-result', ...result };\n },\n\n // -------------------------------------------------------------------------\n // MCP Annotation Queue Management\n // -------------------------------------------------------------------------\n 'get-pending-annotations': async (msg) => {\n const pending = getPendingAnnotations();\n return {\n id: msg.id,\n type: 'pending-annotations',\n count: pending.length,\n annotations: pending.map(serializeStoredAnnotation),\n };\n },\n\n 'get-all-annotations': async (msg) => {\n const all = getAllAnnotations();\n return {\n id: msg.id,\n type: 'all-annotations',\n count: all.length,\n annotations: all.map(serializeStoredAnnotation),\n };\n },\n\n 'get-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const stored = getStoredAnnotation(id);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n return {\n id: msg.id,\n type: 'annotation',\n annotation: serializeStoredAnnotation(stored),\n };\n },\n\n 'acknowledge-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const stored = acknowledgeAnnotation(id);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n // Notify browser clients\n const counts = getAnnotationCounts();\n broadcastToClients({\n type: 'annotation-status-changed',\n annotationId: id,\n status: 'acknowledged',\n });\n broadcastToClients({ type: 'mcp-annotation-counts', counts });\n return {\n id: msg.id,\n type: 'annotation-acknowledged',\n annotationId: id,\n };\n },\n\n 'resolve-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const summary = msg.summary as string | undefined;\n const stored = resolveAnnotation(id, summary);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n // Notify browser clients\n const counts = getAnnotationCounts();\n broadcastToClients({\n type: 'annotation-status-changed',\n annotationId: id,\n status: 'resolved',\n summary,\n });\n broadcastToClients({ type: 'mcp-annotation-counts', counts });\n return {\n id: msg.id,\n type: 'annotation-resolved',\n annotationId: id,\n summary,\n };\n },\n\n 'dismiss-annotation': async (msg) => {\n const id = msg.annotationId as string;\n const reason = msg.reason as string;\n const stored = dismissAnnotation(id, reason);\n if (!stored) {\n return { id: msg.id, type: 'error', error: `Annotation not found: ${id}` };\n }\n // Notify browser clients\n const counts = getAnnotationCounts();\n broadcastToClients({\n type: 'annotation-status-changed',\n annotationId: id,\n status: 'dismissed',\n reason,\n });\n broadcastToClients({ type: 'mcp-annotation-counts', counts });\n return {\n id: msg.id,\n type: 'annotation-dismissed',\n annotationId: id,\n reason,\n };\n },\n\n 'clear-queued-annotations': async (msg) => {\n clearAnnotations();\n return {\n id: msg.id,\n type: 'annotations-cleared',\n };\n },\n\n // -------------------------------------------------------------------------\n // File Operations\n // -------------------------------------------------------------------------\n 'read-file': async (msg) => {\n const filePath = msg.path as string;\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.join(workingDirectory, filePath);\n\n try {\n const content = fs.readFileSync(absolutePath, 'utf-8');\n return { id: msg.id, type: 'file-content', path: filePath, content };\n } catch (error) {\n return { id: msg.id, type: 'error', error: `Failed to read file: ${error}` };\n }\n },\n\n 'write-file': async (msg) => {\n const filePath = msg.path as string;\n const content = msg.content as string;\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.join(workingDirectory, filePath);\n\n try {\n // Ensure directory exists\n fs.mkdirSync(path.dirname(absolutePath), { recursive: true });\n fs.writeFileSync(absolutePath, content, 'utf-8');\n console.log(`[Daemon] Wrote file: ${filePath}`);\n return { id: msg.id, type: 'write-success', path: filePath };\n } catch (error) {\n return { id: msg.id, type: 'error', error: `Failed to write file: ${error}` };\n }\n },\n\n 'list-files': async (msg) => {\n const dirPath = (msg.path as string) || '.';\n const absolutePath = path.isAbsolute(dirPath)\n ? dirPath\n : path.join(workingDirectory, dirPath);\n\n try {\n const entries = fs.readdirSync(absolutePath, { withFileTypes: true });\n const files = entries.map((entry) => ({\n name: entry.name,\n isDirectory: entry.isDirectory(),\n }));\n return { id: msg.id, type: 'file-list', path: dirPath, files };\n } catch (error) {\n return { id: msg.id, type: 'error', error: `Failed to list files: ${error}` };\n }\n },\n\n // -------------------------------------------------------------------------\n // Command Execution\n // -------------------------------------------------------------------------\n 'run-command': async (msg, ws) => {\n const command = msg.command as string;\n if (!command) {\n return { id: msg.id, type: 'error', error: 'Missing command' };\n }\n\n console.log(`[Daemon] Running command: ${command}`);\n\n return new Promise((resolve) => {\n exec(command, { cwd: workingDirectory }, (error, stdout, stderr) => {\n resolve({\n id: msg.id,\n type: 'command-result',\n stdout,\n stderr,\n exitCode: error ? error.code : 0,\n });\n });\n });\n },\n\n // -------------------------------------------------------------------------\n // MCP Server Identification\n // -------------------------------------------------------------------------\n identify: async (msg, ws) => {\n if (msg.client === 'mcp-server') {\n mcpServerClient = ws;\n mcpClientName = null; // Will be set when mcp-client-info arrives\n console.log('[Daemon] MCP server identified and connected');\n // Notify browser clients\n broadcastToClients({\n type: 'mcp-server-status',\n connected: true,\n clientName: null,\n });\n return { id: msg.id, type: 'identified', client: 'mcp-server' };\n }\n return { id: msg.id, type: 'identified', client: 'unknown' };\n },\n\n 'mcp-client-info': async (msg) => {\n mcpClientName = (msg.clientName as string) || null;\n console.log('[Daemon] MCP client identified:', mcpClientName, msg.clientVersion || '');\n // Broadcast updated name to browser clients\n broadcastToClients({\n type: 'mcp-server-status',\n connected: true,\n clientName: mcpClientName,\n });\n return { id: msg.id, type: 'ok' };\n },\n\n // -------------------------------------------------------------------------\n // Status\n // -------------------------------------------------------------------------\n ping: async (msg) => {\n return {\n id: msg.id,\n type: 'pong',\n provider: currentProvider,\n mode: currentMode,\n cwd: workingDirectory,\n availableProviders: getCLIProviders(),\n availableModes: ['direct-cli', 'mcp'] as ExecutionMode[],\n mcpServerConnected: mcpServerClient?.readyState === WebSocket.OPEN,\n mcpClientName,\n };\n },\n};\n\n// =============================================================================\n// WebSocket Helpers\n// =============================================================================\n\n// Track connected browser clients for broadcasting\nconst connectedClients = new Set<WebSocket>();\n\nfunction broadcastToClients(message: OutgoingMessage) {\n for (const client of connectedClients) {\n sendMessage(client, message);\n }\n}\n\nfunction serializeStoredAnnotation(stored: StoredAnnotation) {\n return {\n id: stored.annotation.id,\n type: stored.annotation.type,\n comment: stored.comment,\n status: stored.status,\n createdAt: stored.createdAt,\n updatedAt: stored.updatedAt,\n resolvedBy: stored.resolvedBy,\n resolutionSummary: stored.resolutionSummary,\n dismissalReason: stored.dismissalReason,\n // Include key annotation data the agent needs\n annotation: {\n type: stored.annotation.type,\n selector: (stored.annotation as any).selector,\n tagName: (stored.annotation as any).tagName,\n text: (stored.annotation as any).text,\n elementPath: (stored.annotation as any).elementPath,\n boundingBox: stored.annotation.boundingBox,\n drawingSvg: (stored.annotation as any).drawingSvg,\n drawingImage: (stored.annotation as any).drawingImage,\n extractedText: (stored.annotation as any).extractedText,\n nearbyElements: (stored.annotation as any).nearbyElements,\n viewport: (stored.annotation as any).viewport,\n projectStyles: (stored.annotation as any).projectStyles,\n isMultiSelect: (stored.annotation as any).isMultiSelect,\n elements: (stored.annotation as any).elements,\n },\n };\n}\n\nfunction sendMessage(ws: WebSocket, message: OutgoingMessage) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(message));\n }\n}\n\nfunction handleConnection(ws: WebSocket) {\n console.log('[Daemon] Client connected');\n connectedClients.add(ws);\n\n // Send initial state\n sendMessage(ws, {\n type: 'connected',\n provider: currentProvider,\n mode: currentMode,\n cwd: workingDirectory,\n availableProviders: getCLIProviders(),\n availableModes: ['direct-cli', 'mcp'] as ExecutionMode[],\n pendingAnnotations: currentMode === 'mcp' ? getPendingCount() : 0,\n providerStatus: getAllProviderStatuses(),\n mcpServerConnected: mcpServerClient?.readyState === WebSocket.OPEN,\n mcpClientName,\n });\n\n ws.on('message', async (data) => {\n let msg: IncomingMessage;\n try {\n msg = JSON.parse(data.toString());\n } catch {\n sendMessage(ws, { type: 'error', error: 'Invalid JSON' });\n return;\n }\n\n const handler = handlers[msg.type];\n if (!handler) {\n sendMessage(ws, { id: msg.id, type: 'error', error: `Unknown message type: ${msg.type}` });\n return;\n }\n\n try {\n const response = await handler(msg, ws);\n if (response) {\n sendMessage(ws, response);\n }\n } catch (error) {\n sendMessage(ws, {\n id: msg.id,\n type: 'error',\n error: `Handler error: ${error}`,\n });\n }\n });\n\n ws.on('close', () => {\n console.log('[Daemon] Client disconnected');\n connectedClients.delete(ws);\n\n // If the MCP server disconnected, notify browser clients\n if (ws === mcpServerClient) {\n mcpServerClient = null;\n mcpClientName = null;\n console.log('[Daemon] MCP server disconnected');\n broadcastToClients({\n type: 'mcp-server-status',\n connected: false,\n clientName: null,\n });\n }\n });\n\n ws.on('error', (error) => {\n console.error('[Daemon] WebSocket error:', error);\n });\n}\n\n// =============================================================================\n// Main Daemon Function\n// =============================================================================\n\nexport interface DaemonInstance {\n port: number;\n close: () => void;\n}\n\n/**\n * Start the Skema daemon (WebSocket server)\n */\nexport function startDaemon(config: DaemonConfig = {}): DaemonInstance {\n const port = config.port ?? 9999;\n workingDirectory = config.cwd ?? process.cwd();\n currentProvider = config.defaultProvider ?? 'gemini';\n currentMode = config.defaultMode ?? 'direct-cli';\n\n // Check CLI provider availability\n if (currentMode === 'direct-cli') {\n if (!isProviderAvailable(currentProvider as CLIProvider)) {\n const available = getCLIProviders();\n if (available.length > 0) {\n console.log(`[Daemon] ${currentProvider} CLI not found, falling back to ${available[0]}`);\n currentProvider = available[0];\n } else {\n console.warn('[Daemon] Warning: No CLI providers found. Install gemini or claude CLI.');\n }\n }\n }\n\n const wss = new WebSocketServer({ port });\n\n wss.on('connection', handleConnection);\n\n wss.on('listening', () => {\n const cliProviders = getCLIProviders();\n \n console.log('');\n console.log(' ┌─────────────────────────────────────────────────┐');\n console.log(' │ │');\n console.log(` │ Skema Daemon running on ws://localhost:${port} │`);\n console.log(' │ │');\n console.log(` │ Mode: ${currentMode.padEnd(39)}│`);\n console.log(` │ Provider: ${currentProvider.padEnd(35)}│`);\n console.log(` │ Directory: ${workingDirectory.slice(-33).padEnd(34)}│`);\n console.log(` │ CLI Providers: ${(cliProviders.join(', ') || 'none').padEnd(29)}│`);\n console.log(' │ │');\n console.log(' │ Waiting for browser connections... │');\n console.log(' │ │');\n console.log(' └─────────────────────────────────────────────────┘');\n console.log('');\n });\n\n wss.on('error', (error) => {\n if ((error as NodeJS.ErrnoException).code === 'EADDRINUSE') {\n console.error(`[Daemon] Port ${port} is already in use. Is another Skema daemon running?`);\n } else {\n console.error('[Daemon] Server error:', error);\n }\n });\n\n return {\n port,\n close: () => {\n wss.close();\n console.log('[Daemon] Server stopped');\n },\n };\n}\n\n// =============================================================================\n// Exports for Programmatic Use\n// =============================================================================\n\nexport {\n currentProvider,\n currentMode,\n workingDirectory,\n handlers,\n};\n\nexport type { ExecutionMode, ProviderName } from './providers';\n"]}