@genart-dev/mcp-server 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/state.ts","../src/sidecar.ts","../src/server.ts","../src/tools/workspace.ts","../src/tools/sketch.ts","../src/tools/selection.ts","../src/tools/parameters.ts","../src/tools/arrangement.ts","../src/tools/gallery.ts","../src/tools/merge.ts","../src/tools/snapshot-layout.ts","../src/tools/knowledge.ts","../src/tools/components.ts","../src/tools/capture.ts","../src/capture/headless.ts","../src/tools/export.ts","../src/resources/index.ts","../src/prompts/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * @genart/mcp-server — MCP server for genart.dev\n *\n * Modes:\n * stdio (default) — standard MCP stdio transport for Claude Code / CLI\n * sidecar — stdio transport + IPC mutation bridge for Electron desktop app\n *\n * Usage:\n * genart-mcp # stdio mode\n * genart-mcp --mode sidecar # sidecar mode (launched by Electron)\n */\n\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { EditorState } from \"./state.js\";\nimport { createServer } from \"./server.js\";\nimport { isSidecarMode } from \"./sidecar.js\";\n\nasync function main(): Promise<void> {\n const sidecar = isSidecarMode();\n\n if (sidecar) {\n console.error(\"[genart-mcp] Starting in sidecar mode\");\n } else {\n console.error(\"[genart-mcp] Starting in stdio mode\");\n }\n\n const state = new EditorState();\n const server = createServer(state);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(\"[genart-mcp] Server connected and ready\");\n}\n\nmain().catch((err) => {\n console.error(\"[genart-mcp] Fatal error:\", err);\n process.exit(1);\n});\n","/**\n * EditorState — server-scoped mutable state for the MCP server.\n * Tracks the active workspace, loaded sketches, and current selection.\n * Emits mutation events for real-time state broadcasting.\n */\n\nimport { EventEmitter } from \"events\";\nimport { readFile } from \"fs/promises\";\nimport { dirname, isAbsolute, resolve } from \"path\";\nimport { notifyMutation } from \"./sidecar.js\";\nimport {\n parseGenart,\n parseWorkspace,\n serializeGenart,\n serializeWorkspace,\n type SketchDefinition,\n type WorkspaceDefinition,\n} from \"@genart-dev/core\";\nimport { writeFile } from \"fs/promises\";\n\n/** A loaded sketch with its parsed definition and absolute file path. */\nexport interface LoadedSketch {\n definition: SketchDefinition;\n path: string;\n}\n\n/** Mutation event types emitted by EditorState. */\nexport type EditorMutationType =\n | \"workspace:loaded\"\n | \"workspace:saved\"\n | \"workspace:updated\"\n | \"sketch:loaded\"\n | \"sketch:created\"\n | \"sketch:updated\"\n | \"sketch:saved\"\n | \"sketch:removed\"\n | \"sketch:deleted\"\n | \"selection:changed\";\n\n/** Payload for EditorState mutation events. */\nexport interface EditorMutationEvent {\n type: EditorMutationType;\n payload: unknown;\n}\n\n/** Serializable snapshot of the full editor state. */\nexport interface EditorStateSnapshot {\n workspacePath: string | null;\n workspace: WorkspaceDefinition | null;\n sketches: Array<{ id: string; definition: SketchDefinition; path: string }>;\n selection: string[];\n}\n\n/** Server-scoped mutable state for the MCP server. */\nexport class EditorState extends EventEmitter {\n /** Absolute path to the active .genart-workspace file, or null. */\n workspacePath: string | null = null;\n\n /** Parsed workspace definition, or null if no workspace is open. */\n workspace: WorkspaceDefinition | null = null;\n\n /** Loaded sketches keyed by sketch ID. */\n sketches: Map<string, LoadedSketch> = new Map();\n\n /** Currently selected sketch IDs. */\n selection: Set<string> = new Set();\n\n /**\n * Base directory for all file operations. When set, all paths are\n * resolved relative to this directory and constrained within it.\n * Used by mcp-host for per-session sandboxing.\n */\n basePath: string | null = null;\n\n /**\n * When true, the server is running remotely and cannot access the\n * user's local filesystem. Tools return file content in responses\n * instead of writing to disk. Set by mcp-host for HTTP-based sessions.\n */\n remoteMode = false;\n\n constructor(options?: { basePath?: string; remoteMode?: boolean }) {\n super();\n if (options?.basePath) {\n this.basePath = options.basePath;\n }\n if (options?.remoteMode) {\n this.remoteMode = true;\n }\n }\n\n /** Update the working directory / sandbox base path. */\n setBasePath(dir: string): void {\n this.basePath = dir;\n }\n\n /** Resolve a file path, respecting the sandbox basePath when set. */\n resolvePath(file: string): string {\n if (isAbsolute(file)) {\n if (this.basePath && !file.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${file}`);\n }\n return file;\n }\n // Expand ~ to home directory (only when no sandbox)\n if ((file.startsWith(\"~/\") || file === \"~\") && !this.basePath) {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n return resolve(home, file.slice(2));\n }\n const base = this.basePath ?? process.cwd();\n const resolved = resolve(base, file);\n if (this.basePath && !resolved.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${resolved}`);\n }\n return resolved;\n }\n\n /** Resolve a sketch file reference (relative to workspace dir) to an absolute path. */\n resolveSketchPath(file: string): string {\n if (isAbsolute(file)) {\n if (this.basePath && !file.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${file}`);\n }\n return file;\n }\n if (!this.workspacePath) {\n if (this.basePath) {\n return resolve(this.basePath, file);\n }\n throw new Error(\"No workspace is currently open\");\n }\n const resolved = resolve(dirname(this.workspacePath), file);\n if (this.basePath && !resolved.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${resolved}`);\n }\n return resolved;\n }\n\n /** Load a workspace from disk and all its referenced sketches. */\n async loadWorkspace(absPath: string): Promise<void> {\n if (this.basePath && !absPath.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${absPath}`);\n }\n const raw = await readFile(absPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const ws = parseWorkspace(json);\n\n this.workspacePath = absPath;\n this.workspace = ws;\n this.sketches.clear();\n this.selection.clear();\n\n // Load all referenced sketches\n for (const ref of ws.sketches) {\n const sketchPath = this.resolveSketchPath(ref.file);\n await this.loadSketch(sketchPath);\n }\n\n this.emitMutation(\"workspace:loaded\", { path: absPath, title: ws.title });\n }\n\n /** Load a single sketch from disk and add it to the cache. */\n async loadSketch(absPath: string): Promise<SketchDefinition> {\n if (this.basePath && !absPath.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${absPath}`);\n }\n const raw = await readFile(absPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const definition = parseGenart(json);\n this.sketches.set(definition.id, { definition, path: absPath });\n this.emitMutation(\"sketch:loaded\", { id: definition.id, path: absPath });\n return definition;\n }\n\n /** Get a loaded sketch by ID. */\n getSketch(id: string): LoadedSketch | undefined {\n return this.sketches.get(id);\n }\n\n /** Require a loaded sketch by ID, throwing if not found. */\n requireSketch(id: string): LoadedSketch {\n const sketch = this.sketches.get(id);\n if (!sketch) {\n throw new Error(`Sketch not found: '${id}'`);\n }\n return sketch;\n }\n\n /** Require an open workspace, throwing if none is open. */\n requireWorkspace(): WorkspaceDefinition {\n if (!this.workspace) {\n throw new Error(\"No workspace is currently open\");\n }\n return this.workspace;\n }\n\n /** Remove a sketch from the in-memory cache. */\n removeSketch(id: string): void {\n this.sketches.delete(id);\n this.selection.delete(id);\n this.emitMutation(\"sketch:removed\", { id });\n }\n\n /** Save the active workspace to disk. */\n async saveWorkspace(): Promise<void> {\n if (!this.workspace || !this.workspacePath) {\n throw new Error(\"No workspace is currently open\");\n }\n const json = serializeWorkspace(this.workspace);\n if (!this.remoteMode) {\n await writeFile(this.workspacePath, json, \"utf-8\");\n }\n this.emitMutation(\"workspace:saved\", { path: this.workspacePath });\n }\n\n /** Save a sketch to disk. */\n async saveSketch(id: string): Promise<void> {\n const loaded = this.requireSketch(id);\n const json = serializeGenart(loaded.definition);\n if (!this.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n this.emitMutation(\"sketch:saved\", { id, path: loaded.path });\n }\n\n /** Update the selection and return the new set. */\n setSelection(ids: string[]): void {\n this.selection.clear();\n for (const id of ids) {\n this.selection.add(id);\n }\n this.emitMutation(\"selection:changed\", { ids });\n }\n\n /** Get a serializable snapshot of the full editor state. */\n getSnapshot(): EditorStateSnapshot {\n const sketches: EditorStateSnapshot[\"sketches\"] = [];\n for (const [id, loaded] of this.sketches) {\n sketches.push({ id, definition: loaded.definition, path: loaded.path });\n }\n return {\n workspacePath: this.workspacePath,\n workspace: this.workspace,\n sketches,\n selection: Array.from(this.selection),\n };\n }\n\n /** Emit a mutation event for external listeners (WebSocket broadcast, sidecar IPC). */\n emitMutation(type: EditorMutationType, payload: unknown): void {\n this.emit(\"mutation\", { type, payload } satisfies EditorMutationEvent);\n notifyMutation(type, payload);\n }\n}\n","/**\n * Sidecar mutation bridge.\n * When running as a desktop app sidecar (--mode sidecar), sends IPC\n * messages to the parent Electron process for real-time UI updates.\n */\n\n/** Mutation types sent to the desktop app. */\nexport type MutationType =\n | \"sketch:created\"\n | \"sketch:updated\"\n | \"sketch:deleted\"\n | \"workspace:updated\"\n | \"selection:changed\";\n\n/** Whether the server is running in sidecar mode. */\nexport function isSidecarMode(): boolean {\n const modeIdx = process.argv.indexOf(\"--mode\");\n if (modeIdx !== -1 && process.argv[modeIdx + 1] === \"sidecar\") return true;\n return process.env.GENART_SIDECAR === \"1\";\n}\n\n/**\n * Notify the parent process of a mutation.\n * No-op when not in sidecar mode or when IPC channel is unavailable.\n */\nexport function notifyMutation(type: string, payload: unknown): void {\n if (isSidecarMode() && typeof process.send === \"function\") {\n process.send({ type, payload });\n }\n}\n","/**\n * MCP server creation and tool registration.\n * Creates a McpServer instance with all tools, resources, and prompts.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { EditorState } from \"./state.js\";\nimport {\n createWorkspace,\n openWorkspace,\n addSketchToWorkspace,\n removeSketchFromWorkspace,\n listWorkspaceSketches,\n} from \"./tools/workspace.js\";\nimport {\n createSketch,\n openSketch,\n updateSketch,\n updateAlgorithm,\n saveSketch,\n forkSketch,\n deleteSketch,\n} from \"./tools/sketch.js\";\nimport {\n getSelection,\n selectSketch,\n getEditorState,\n} from \"./tools/selection.js\";\nimport {\n setParameters,\n setColors,\n setSeed,\n setCanvasSize,\n randomizeParameters,\n} from \"./tools/parameters.js\";\nimport {\n arrangeSketches,\n autoArrange,\n groupSketches,\n} from \"./tools/arrangement.js\";\nimport { listSketches, searchSketches } from \"./tools/gallery.js\";\nimport { mergeSketches } from \"./tools/merge.js\";\nimport { snapshotLayout } from \"./tools/snapshot-layout.js\";\nimport { listSkills, loadSkill, getGuidelines } from \"./tools/knowledge.js\";\nimport {\n listComponents,\n addComponent,\n removeComponent,\n} from \"./tools/components.js\";\nimport { captureScreenshot, captureBatch } from \"./tools/capture.js\";\nimport { exportSketch } from \"./tools/export.js\";\nimport { registerResources } from \"./resources/index.js\";\nimport { registerPrompts } from \"./prompts/index.js\";\n\n/** Wrap a tool handler to return MCP-formatted content (text JSON). */\nfunction jsonResult(data: Record<string, unknown>) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n };\n}\n\n/** Wrap a tool handler to return an MCP error. */\nfunction toolError(message: string) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }],\n isError: true as const,\n };\n}\n\n/** Create and configure the MCP server with all tools. */\nexport function createServer(state: EditorState): McpServer {\n const server = new McpServer(\n {\n name: \"@genart/mcp-server\",\n version: \"0.0.1\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n },\n );\n\n registerWorkspaceTools(server, state);\n registerSketchTools(server, state);\n registerComponentTools(server, state);\n registerSelectionTools(server, state);\n registerParameterTools(server, state);\n registerArrangementTools(server, state);\n registerGalleryTools(server, state);\n registerMergeTools(server, state);\n registerSnapshotTools(server, state);\n registerKnowledgeTools(server, state);\n\n registerCaptureTools(server, state);\n registerExportTools(server, state);\n\n registerResources(server, state);\n registerPrompts(server, state);\n\n return server;\n}\n\n// ---------------------------------------------------------------------------\n// Workspace Tools\n// ---------------------------------------------------------------------------\n\nfunction registerWorkspaceTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"create_workspace\",\n \"Create a new .genart-workspace file with optional initial sketches\",\n {\n title: z.string().describe(\"Workspace title\"),\n path: z.string().describe(\"File path (must end in .genart-workspace)\"),\n sketches: z\n .array(z.string())\n .optional()\n .describe(\"Initial sketch file paths to include\"),\n arrangement: z\n .enum([\"grid\", \"row\", \"column\"])\n .optional()\n .describe(\"Auto-arrange initial sketches (default: grid)\"),\n spacing: z\n .number()\n .optional()\n .describe(\"Spacing between arranged sketches in pixels (default: 200)\"),\n },\n async (args) => {\n try {\n const result = await createWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"open_workspace\",\n \"Open an existing .genart-workspace file and load all referenced sketches\",\n {\n path: z.string().describe(\"File path to .genart-workspace file\"),\n },\n async (args) => {\n try {\n const result = await openWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"add_sketch_to_workspace\",\n \"Add an existing .genart sketch file to the active workspace\",\n {\n sketchPath: z.string().describe(\"Path to the .genart file to add\"),\n position: z\n .object({\n x: z.number().describe(\"X position on canvas\"),\n y: z.number().describe(\"Y position on canvas\"),\n })\n .optional()\n .describe(\"Canvas position (default: auto-placed to the right)\"),\n label: z.string().optional().describe(\"Display label override\"),\n },\n async (args) => {\n try {\n const result = await addSketchToWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"remove_sketch_from_workspace\",\n \"Remove a sketch from the active workspace (optionally delete the file)\",\n {\n sketchId: z.string().describe(\"ID of the sketch to remove\"),\n deleteFile: z\n .boolean()\n .optional()\n .describe(\"Also delete the .genart file from disk (default: false)\"),\n },\n async (args) => {\n try {\n const result = await removeSketchFromWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"list_workspace_sketches\",\n \"List all sketches in the active workspace with metadata\",\n {\n includeState: z\n .boolean()\n .optional()\n .describe(\"Include current seed and param values (default: false)\"),\n },\n async (args) => {\n try {\n const result = await listWorkspaceSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Sketch Lifecycle Tools\n// ---------------------------------------------------------------------------\n\nfunction registerSketchTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"create_sketch\",\n \"Create a new .genart sketch file from metadata, parameters, and algorithm. IMPORTANT: Do not embed common utilities (PRNG, noise, easing, color math, vector ops) inline in the algorithm. Instead, declare them as components: { \\\"prng\\\": \\\"^1.0.0\\\", \\\"noise-2d\\\": \\\"^1.0.0\\\" }. Then use the exported functions directly in your algorithm (e.g., mulberry32, fbm2D). Use list_components to see all available components for the current renderer.\",\n {\n id: z.string().describe(\"URL-safe kebab-case identifier\"),\n title: z.string().describe(\"Human-readable title\"),\n path: z.string().describe(\"Relative file path (must end in .genart, e.g. 'my-sketch.genart')\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer type (default: p5)\"),\n canvas: z\n .object({\n preset: z.string().optional().describe(\"Canvas preset name\"),\n width: z.number().optional().describe(\"Width in pixels\"),\n height: z.number().optional().describe(\"Height in pixels\"),\n })\n .optional()\n .describe(\"Canvas dimensions (default: square-1200)\"),\n philosophy: z.string().optional().describe(\"Markdown design philosophy\"),\n parameters: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n min: z.number(),\n max: z.number(),\n step: z.number(),\n default: z.number(),\n }),\n )\n .optional()\n .describe(\"Parameter definitions\"),\n colors: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n default: z.string(),\n }),\n )\n .optional()\n .describe(\"Color definitions\"),\n themes: z\n .array(\n z.object({\n name: z.string(),\n colors: z.array(z.string()),\n }),\n )\n .optional()\n .describe(\"Theme presets\"),\n algorithm: z\n .string()\n .optional()\n .describe(\"Algorithm source code (default: renderer template). For p5: must be `function sketch(p, state) { ... }` in instance mode. State provides: state.WIDTH, state.HEIGHT, state.SEED (number), state.PARAMS (keyed by param key), state.COLORS (keyed by color key, hex strings). Use p5 instance methods (p.createCanvas, p.background, etc).\"),\n seed: z.number().optional().describe(\"Initial random seed (default: random)\"),\n skills: z.array(z.string()).optional().describe(\"Design skill references\"),\n components: z\n .record(\n z.union([\n z.string(),\n z.object({\n version: z.string().optional(),\n code: z.string().optional(),\n exports: z.array(z.string()).optional(),\n }),\n ]),\n )\n .optional()\n .describe(\"Component dependencies. Use list_components to see available. Keys are component names, values are semver ranges (e.g. \\\"^1.0.0\\\") or objects with version/code/exports.\"),\n addToWorkspace: z\n .string()\n .optional()\n .describe(\"Path to workspace to add sketch to after creation\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await createSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"open_sketch\",\n \"Open a sketch by ID to view and edit it (sets selection)\",\n {\n sketchId: z.string().describe(\"ID of the sketch to open\"),\n },\n async (args) => {\n try {\n const result = await openSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"update_sketch\",\n \"Update metadata, parameters, colors, or canvas of an existing sketch\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n title: z.string().optional().describe(\"New title\"),\n philosophy: z.string().optional().describe(\"New philosophy text (markdown)\"),\n canvas: z\n .object({\n preset: z.string().optional().describe(\"Canvas preset name\"),\n width: z.number().optional().describe(\"Width in pixels\"),\n height: z.number().optional().describe(\"Height in pixels\"),\n })\n .optional()\n .describe(\"New canvas dimensions\"),\n parameters: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n min: z.number(),\n max: z.number(),\n step: z.number(),\n default: z.number(),\n }),\n )\n .optional()\n .describe(\"Replace parameter definitions\"),\n colors: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n default: z.string(),\n }),\n )\n .optional()\n .describe(\"Replace color definitions\"),\n themes: z\n .array(\n z.object({\n name: z.string(),\n colors: z.array(z.string()),\n }),\n )\n .optional()\n .describe(\"Replace theme presets\"),\n seed: z.number().optional().describe(\"New random seed\"),\n skills: z.array(z.string()).optional().describe(\"Replace design skill references\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await updateSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"update_algorithm\",\n \"Replace the algorithm source code of a sketch. If adding/changing components, pass them in the components field alongside the algorithm.\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n algorithm: z.string().describe(\"New algorithm source code. For p5: must be `function sketch(p, state) { ... }` in instance mode. State provides: state.WIDTH, state.HEIGHT, state.SEED, state.PARAMS (keyed by param key), state.COLORS (keyed by color key).\"),\n validate: z\n .boolean()\n .optional()\n .describe(\"Run renderer-specific validation before saving (default: true)\"),\n components: z\n .record(\n z.union([\n z.string(),\n z.object({\n version: z.string().optional(),\n code: z.string().optional(),\n exports: z.array(z.string()).optional(),\n }),\n ]),\n )\n .optional()\n .describe(\"Component dependencies to resolve alongside the algorithm update. Use list_components to see available.\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await updateAlgorithm(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"save_sketch\",\n \"Persist the current in-memory state of a sketch to disk\",\n {\n sketchId: z.string().describe(\"ID of the sketch to save\"),\n },\n async (args) => {\n try {\n const result = await saveSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"fork_sketch\",\n \"Create a variant of an existing sketch with a new ID and optional modifications\",\n {\n sourceId: z.string().describe(\"ID of the sketch to fork\"),\n newId: z.string().describe(\"URL-safe kebab-case ID for the forked sketch\"),\n title: z.string().optional().describe(\"Title for the fork (default: '[source title] (fork)')\"),\n position: z\n .object({\n x: z.number().describe(\"X position on canvas\"),\n y: z.number().describe(\"Y position on canvas\"),\n })\n .optional()\n .describe(\"Canvas position (default: auto-placed to the right of source)\"),\n modifications: z\n .object({\n renderer: z.enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"]).optional(),\n canvas: z\n .object({\n preset: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n })\n .optional(),\n parameters: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n min: z.number(),\n max: z.number(),\n step: z.number(),\n default: z.number(),\n }),\n )\n .optional(),\n colors: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n default: z.string(),\n }),\n )\n .optional(),\n algorithm: z.string().optional(),\n philosophy: z.string().optional(),\n })\n .optional()\n .describe(\"Fields to override in the fork\"),\n newSeed: z\n .boolean()\n .optional()\n .describe(\"Generate a new random seed for the fork (default: true)\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await forkSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"delete_sketch\",\n \"Delete a sketch file from disk and remove it from the workspace\",\n {\n sketchId: z.string().describe(\"ID of the sketch to delete\"),\n keepFile: z\n .boolean()\n .optional()\n .describe(\"Keep the .genart file on disk (default: false)\"),\n },\n async (args) => {\n try {\n const result = await deleteSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component Tools\n// ---------------------------------------------------------------------------\n\nfunction registerComponentTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"list_components\",\n \"List available reusable components from the registry, filtered by renderer and/or category. Components provide common utilities (PRNG, noise, easing, color math, etc.) that can be declared as dependencies instead of inlining code in the algorithm.\",\n {\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Filter by renderer compatibility\"),\n category: z\n .enum([\n \"randomness\", \"noise\", \"math\", \"easing\", \"color\", \"vector\",\n \"geometry\", \"grid\", \"particle\", \"physics\", \"distribution\",\n \"pattern\", \"sdf\", \"transform\", \"animation\", \"string\",\n \"data-structure\", \"imaging\",\n ])\n .optional()\n .describe(\"Filter by component category\"),\n },\n async (args) => {\n try {\n const result = await listComponents(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"add_component\",\n \"Add a component dependency to an existing sketch. Resolves the component and any transitive dependencies from the registry, validates renderer compatibility, and writes the resolved form to the sketch file.\",\n {\n sketchId: z.string().describe(\"ID of the sketch to add the component to\"),\n component: z.string().describe(\"Component name (e.g. 'prng', 'noise-2d', 'glsl-noise')\"),\n version: z\n .string()\n .optional()\n .describe(\"Version range (default: '^1.0.0')\"),\n },\n async (args) => {\n try {\n const result = await addComponent(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"remove_component\",\n \"Remove a component dependency from a sketch. Checks for dependent components and warns if the algorithm references the component's exports.\",\n {\n sketchId: z.string().describe(\"ID of the sketch to remove the component from\"),\n component: z.string().describe(\"Component name to remove\"),\n },\n async (args) => {\n try {\n const result = await removeComponent(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Selection & Context Tools\n// ---------------------------------------------------------------------------\n\nfunction registerSelectionTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"get_selection\",\n \"Return full context for the currently selected sketch(es) on the canvas\",\n {\n includeAlgorithm: z\n .boolean()\n .optional()\n .describe(\"Include full algorithm source (default: true)\"),\n includePhilosophy: z\n .boolean()\n .optional()\n .describe(\"Include philosophy markdown (default: true)\"),\n includeNeighbors: z\n .boolean()\n .optional()\n .describe(\"Include summaries of adjacent sketches (default: false)\"),\n },\n async (args) => {\n try {\n const result = await getSelection(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"select_sketch\",\n \"Set the canvas selection to one or more sketches by ID\",\n {\n sketchIds: z\n .array(z.string())\n .describe(\"IDs of sketches to select\"),\n addToSelection: z\n .boolean()\n .optional()\n .describe(\"Add to existing selection instead of replacing (default: false)\"),\n },\n async (args) => {\n try {\n const result = await selectSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"get_editor_state\",\n \"Return a full snapshot of the MCP server's current state\",\n {},\n async () => {\n try {\n const result = await getEditorState(state);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_working_directory\",\n \"Set the working directory for file operations. All paths are resolved relative to this directory.\",\n {\n path: z.string().describe(\"Absolute path to use as the working directory\"),\n },\n async (args) => {\n try {\n const dir = args.path;\n if (!dir.startsWith(\"/\")) {\n return toolError(\"Path must be absolute\");\n }\n state.setBasePath(dir);\n return jsonResult({ success: true, workingDirectory: dir });\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Parameter Tools\n// ---------------------------------------------------------------------------\n\nfunction registerParameterTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"set_parameters\",\n \"Update the runtime parameter values of a sketch's current state\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n params: z\n .record(z.number())\n .describe(\"Parameter key-value pairs to set\"),\n },\n async (args) => {\n try {\n const result = await setParameters(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_colors\",\n \"Update the runtime color palette values of a sketch's current state\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n colors: z\n .record(z.string())\n .describe(\"Color key-value pairs to set (hex strings)\"),\n },\n async (args) => {\n try {\n const result = await setColors(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_seed\",\n \"Set the random seed of a sketch, optionally generating a random value\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n seed: z\n .number()\n .optional()\n .describe(\"Explicit seed value (default: generate random 0–99999)\"),\n },\n async (args) => {\n try {\n const result = await setSeed(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_canvas_size\",\n \"Change the canvas dimensions of a sketch using a preset or explicit width/height\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n preset: z.string().optional().describe(\"Canvas preset name\"),\n width: z.number().optional().describe(\"Explicit width in pixels\"),\n height: z.number().optional().describe(\"Explicit height in pixels\"),\n },\n async (args) => {\n try {\n const result = await setCanvasSize(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"randomize_parameters\",\n \"Generate random values for all or specific parameters within their defined ranges\",\n {\n sketchId: z.string().describe(\"ID of the sketch to randomize\"),\n paramKeys: z\n .array(z.string())\n .optional()\n .describe(\"Specific parameter keys to randomize (default: all)\"),\n newSeed: z\n .boolean()\n .optional()\n .describe(\"Also randomize the seed (default: false)\"),\n },\n async (args) => {\n try {\n const result = await randomizeParameters(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Arrangement Tools\n// ---------------------------------------------------------------------------\n\nfunction registerArrangementTools(\n server: McpServer,\n state: EditorState,\n): void {\n server.tool(\n \"arrange_sketches\",\n \"Move specific sketches to explicit positions on the canvas\",\n {\n positions: z\n .array(\n z.object({\n sketchId: z.string().describe(\"ID of the sketch to move\"),\n x: z.number().describe(\"X position on canvas\"),\n y: z.number().describe(\"Y position on canvas\"),\n }),\n )\n .describe(\"Explicit position assignments\"),\n },\n async (args) => {\n try {\n const result = await arrangeSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"auto_arrange\",\n \"Automatically lay out all or selected sketches using a configurable layout algorithm\",\n {\n layout: z\n .enum([\"grid\", \"row\", \"column\", \"masonry\"])\n .optional()\n .describe(\"Layout algorithm (default: grid)\"),\n sketchIds: z\n .array(z.string())\n .optional()\n .describe(\"Specific sketches to arrange (default: all)\"),\n spacing: z\n .number()\n .optional()\n .describe(\"Gap between sketches in pixels (default: 200)\"),\n sortBy: z\n .enum([\"title\", \"created\", \"modified\", \"renderer\"])\n .optional()\n .describe(\"Sort order before arranging (default: created)\"),\n origin: z\n .object({\n x: z.number().describe(\"X origin\"),\n y: z.number().describe(\"Y origin\"),\n })\n .optional()\n .describe(\"Top-left origin for the arrangement (default: {x:0, y:0})\"),\n },\n async (args) => {\n try {\n const result = await autoArrange(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"group_sketches\",\n \"Create or update a named group of sketches in the workspace\",\n {\n groupId: z.string().describe(\"Unique group identifier\"),\n label: z.string().describe(\"Display label for the group\"),\n sketchIds: z\n .array(z.string())\n .describe(\"IDs of sketches to include in the group\"),\n color: z\n .string()\n .optional()\n .describe(\"Optional group color (hex string)\"),\n },\n async (args) => {\n try {\n const result = await groupSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gallery Tools\n// ---------------------------------------------------------------------------\n\nfunction registerGalleryTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"list_sketches\",\n \"Scan the workspace directory for all .genart files with metadata summaries\",\n {\n directory: z\n .string()\n .optional()\n .describe(\"Directory to scan (default: workspace directory)\"),\n recursive: z\n .boolean()\n .optional()\n .describe(\"Scan subdirectories (default: false)\"),\n includeUnreferenced: z\n .boolean()\n .optional()\n .describe(\n \"Include files not in the active workspace (default: true)\",\n ),\n },\n async (args) => {\n try {\n const result = await listSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"search_sketches\",\n \"Search loaded sketches by title, renderer, parameters, canvas size, or skills\",\n {\n query: z\n .string()\n .optional()\n .describe(\"Substring match against sketch title (case-insensitive)\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Filter by renderer type\"),\n minParameters: z\n .number()\n .optional()\n .describe(\"Minimum number of parameters\"),\n maxParameters: z\n .number()\n .optional()\n .describe(\"Maximum number of parameters\"),\n canvasWidth: z\n .number()\n .optional()\n .describe(\"Exact canvas width match\"),\n canvasHeight: z\n .number()\n .optional()\n .describe(\"Exact canvas height match\"),\n hasPhilosophy: z\n .boolean()\n .optional()\n .describe(\"Filter by presence of philosophy text\"),\n skills: z\n .array(z.string())\n .optional()\n .describe(\"Filter by sketches that use any of these skills\"),\n },\n async (args) => {\n try {\n const result = await searchSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Merge Tools\n// ---------------------------------------------------------------------------\n\nfunction registerMergeTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"merge_sketches\",\n \"Combine parameters, colors, and algorithm from 2+ source sketches into a new sketch\",\n {\n sourceIds: z\n .array(z.string())\n .describe(\"IDs of 2+ source sketches to merge\"),\n newId: z\n .string()\n .describe(\"URL-safe kebab-case ID for the merged sketch\"),\n title: z.string().describe(\"Title for the merged sketch\"),\n strategy: z\n .enum([\"blend\", \"layer\", \"alternate\"])\n .optional()\n .describe(\"Merge strategy (default: blend)\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer for merged sketch (default: first source's renderer)\"),\n canvas: z\n .object({\n width: z.number().optional().describe(\"Canvas width\"),\n height: z.number().optional().describe(\"Canvas height\"),\n })\n .optional()\n .describe(\"Canvas size (default: largest source dimensions)\"),\n },\n async (args) => {\n try {\n const result = await mergeSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Snapshot Layout Tools\n// ---------------------------------------------------------------------------\n\nfunction registerSnapshotTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"snapshot_layout\",\n \"Return a structural summary of the workspace layout for AI spatial reasoning\",\n {\n includeGroups: z\n .boolean()\n .optional()\n .describe(\"Include group information (default: true)\"),\n includeState: z\n .boolean()\n .optional()\n .describe(\"Include current seed and param values (default: false)\"),\n },\n async (args) => {\n try {\n const result = await snapshotLayout(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Capture Tools\n// ---------------------------------------------------------------------------\n\nfunction registerCaptureTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"capture_screenshot\",\n \"Capture a screenshot of a sketch. Returns metadata as text + a small inline JPEG image for visual review. In remote mode, metadata includes previewFileContent (base64 PNG) to Write locally.\",\n {\n target: z\n .enum([\"selected\", \"sketch\"])\n .optional()\n .describe(\"What to capture (default: selected)\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Required when target is 'sketch'\"),\n width: z\n .number()\n .optional()\n .describe(\"Output width in pixels (default: sketch canvas width)\"),\n height: z\n .number()\n .optional()\n .describe(\"Output height in pixels (default: sketch canvas height)\"),\n seed: z\n .number()\n .optional()\n .describe(\"Override seed for this capture only\"),\n params: z\n .record(z.number())\n .optional()\n .describe(\"Override params for this capture only\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for inline preview JPEG (default: 400)\"),\n },\n async (args) => {\n try {\n const result = await captureScreenshot(state, args);\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result.metadata, null, 2) },\n { type: \"image\" as const, data: result.previewJpegBase64, mimeType: \"image/jpeg\" as const },\n ],\n };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"capture_batch\",\n \"Capture screenshots of multiple sketches in parallel. Returns metadata as text + inline JPEG images for visual review.\",\n {\n sketchIds: z\n .array(z.string())\n .optional()\n .describe(\"IDs of sketches to capture (default: all)\"),\n width: z\n .number()\n .optional()\n .describe(\"Override width for all captures\"),\n height: z\n .number()\n .optional()\n .describe(\"Override height for all captures\"),\n seed: z\n .number()\n .optional()\n .describe(\"Override seed for all captures\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for inline preview JPEGs (default: 200 for batch)\"),\n },\n async (args) => {\n try {\n const result = await captureBatch(state, args);\n const content: Array<\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: \"image/jpeg\" }\n > = [\n { type: \"text\", text: JSON.stringify(result.metadata, null, 2) },\n ];\n // Add per-sketch metadata + inline JPEG image blocks\n for (const item of result.items) {\n content.push({\n type: \"text\",\n text: JSON.stringify(item.metadata, null, 2),\n });\n content.push({\n type: \"image\",\n data: item.inlineJpegBase64,\n mimeType: \"image/jpeg\",\n });\n }\n return { content };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Export Tools\n// ---------------------------------------------------------------------------\n\nfunction registerExportTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"export_sketch\",\n \"Export a sketch as standalone HTML, PNG, SVG, raw algorithm, or bundled ZIP\",\n {\n sketchId: z.string().describe(\"ID of the sketch to export\"),\n format: z\n .enum([\"html\", \"png\", \"svg\", \"algorithm\", \"zip\"])\n .describe(\"Export format\"),\n outputPath: z.string().describe(\"File path to write the export\"),\n width: z\n .number()\n .optional()\n .describe(\"Override width for PNG/SVG export\"),\n height: z\n .number()\n .optional()\n .describe(\"Override height for PNG/SVG export\"),\n seed: z\n .number()\n .optional()\n .describe(\"Override seed for this export\"),\n params: z\n .record(z.number())\n .optional()\n .describe(\"Override params for this export\"),\n },\n async (args) => {\n try {\n const result = await exportSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Knowledge Tools (Phase 5 stubs)\n// ---------------------------------------------------------------------------\n\nfunction registerKnowledgeTools(server: McpServer, _state: EditorState): void {\n server.tool(\n \"list_skills\",\n \"List all available design knowledge skills (Phase 5)\",\n {\n category: z\n .string()\n .optional()\n .describe(\"Filter by skill category\"),\n },\n async (args) => {\n try {\n const result = await listSkills(args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"load_skill\",\n \"Load a specific design knowledge skill with full content (Phase 5)\",\n {\n skillId: z.string().describe(\"ID of the skill to load\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer-specific examples (default: p5)\"),\n },\n async (args) => {\n try {\n const result = await loadSkill(args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"get_guidelines\",\n \"Return design guidelines and best practices for a topic (Phase 5)\",\n {\n topic: z\n .enum([\"composition\", \"color\", \"parameters\", \"animation\", \"performance\"])\n .describe(\"Guideline topic\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer-specific guidance\"),\n },\n async (args) => {\n try {\n const result = await getGuidelines(args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n","/**\n * Workspace management tools.\n * create_workspace, open_workspace, add_sketch_to_workspace,\n * remove_sketch_from_workspace, list_workspace_sketches\n */\n\nimport { readFile, writeFile, stat } from \"fs/promises\";\nimport { basename, dirname } from \"path\";\nimport {\n parseGenart,\n parseWorkspace,\n serializeWorkspace,\n type SketchDefinition,\n type WorkspaceDefinition,\n type WorkspaceSketchRef,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nfunction kebabify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\n// resolvePath removed — use state.resolvePath() for sandbox-aware path resolution\n\n/**\n * Arrange sketches in a grid, row, or column layout.\n * Returns position assignments.\n */\nfunction arrangePositions(\n sketches: { file: string; width: number; height: number }[],\n layout: \"grid\" | \"row\" | \"column\",\n spacing: number,\n): { file: string; position: { x: number; y: number } }[] {\n if (sketches.length === 0) return [];\n\n if (layout === \"row\") {\n let x = 0;\n return sketches.map((s) => {\n const pos = { file: s.file, position: { x, y: 0 } };\n x += s.width + spacing;\n return pos;\n });\n }\n\n if (layout === \"column\") {\n let y = 0;\n return sketches.map((s) => {\n const pos = { file: s.file, position: { x: 0, y } };\n y += s.height + spacing;\n return pos;\n });\n }\n\n // grid (default): row-major, cols = ceil(sqrt(n))\n const cols = Math.ceil(Math.sqrt(sketches.length));\n const maxW = Math.max(...sketches.map((s) => s.width));\n const maxH = Math.max(...sketches.map((s) => s.height));\n const cellW = maxW + spacing;\n const cellH = maxH + spacing;\n\n return sketches.map((s, i) => ({\n file: s.file,\n position: {\n x: (i % cols) * cellW,\n y: Math.floor(i / cols) * cellH,\n },\n }));\n}\n\n/**\n * Compute a viewport that fits all sketches.\n */\nfunction computeViewport(\n positions: { position: { x: number; y: number }; width?: number; height?: number }[],\n): { x: number; y: number; zoom: number } {\n if (positions.length === 0) return { x: 0, y: 0, zoom: 1 };\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of positions) {\n const w = p.width ?? 1200;\n const h = p.height ?? 1200;\n if (p.position.x < minX) minX = p.position.x;\n if (p.position.y < minY) minY = p.position.y;\n if (p.position.x + w > maxX) maxX = p.position.x + w;\n if (p.position.y + h > maxY) maxY = p.position.y + h;\n }\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const totalW = maxX - minX;\n const totalH = maxY - minY;\n // Assume ~1920x1080 viewport; fit all sketches with some margin\n const zoom = Math.min(1, Math.min(1920 / (totalW + 200), 1080 / (totalH + 200)));\n return { x: Math.round(centerX), y: Math.round(centerY), zoom: Math.round(zoom * 100) / 100 };\n}\n\n// ---------------------------------------------------------------------------\n// create_workspace\n// ---------------------------------------------------------------------------\n\nexport interface CreateWorkspaceInput {\n title: string;\n path: string;\n sketches?: string[];\n arrangement?: \"grid\" | \"row\" | \"column\";\n spacing?: number;\n}\n\nexport async function createWorkspace(\n state: EditorState,\n input: CreateWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const absPath = state.resolvePath(input.path);\n\n if (!absPath.endsWith(\".genart-workspace\")) {\n throw new Error(\"Path must end with .genart-workspace\");\n }\n\n if (!state.remoteMode) {\n const parentDir = dirname(absPath);\n if (!(await dirExists(parentDir))) {\n throw new Error(`Parent directory does not exist: ${parentDir}`);\n }\n if (await fileExists(absPath)) {\n throw new Error(\n `Workspace already exists at ${absPath}. Use open_workspace to load it.`,\n );\n }\n }\n\n // Load and validate initial sketches\n const sketchRefs: WorkspaceSketchRef[] = [];\n const sketchDefs: { file: string; width: number; height: number }[] = [];\n\n if (input.sketches && input.sketches.length > 0) {\n for (const sketchPath of input.sketches) {\n const absSketchPath = state.resolvePath(sketchPath);\n if (!(await fileExists(absSketchPath))) {\n throw new Error(`Sketch file not found: ${absSketchPath}`);\n }\n try {\n const raw = await readFile(absSketchPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const def = parseGenart(json);\n sketchDefs.push({\n file: basename(absSketchPath),\n width: def.canvas.width,\n height: def.canvas.height,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Invalid .genart file: ${absSketchPath} — ${msg}`);\n }\n }\n\n // Arrange sketches\n const layout = input.arrangement ?? \"grid\";\n const spacing = input.spacing ?? 200;\n const positions = arrangePositions(sketchDefs, layout, spacing);\n\n for (const p of positions) {\n sketchRefs.push({ file: p.file, position: p.position });\n }\n }\n\n const viewport = computeViewport(\n sketchRefs.map((r) => {\n const def = sketchDefs.find((d) => d.file === r.file);\n return { position: r.position, width: def?.width, height: def?.height };\n }),\n );\n\n const ts = now();\n const ws: WorkspaceDefinition = {\n \"genart-workspace\": \"1.0\",\n id: kebabify(input.title),\n title: input.title,\n created: ts,\n modified: ts,\n viewport,\n sketches: sketchRefs,\n };\n\n // Serialize workspace JSON\n const json = serializeWorkspace(ws);\n\n if (state.remoteMode) {\n // Remote mode: can't write to user's filesystem — set state directly,\n // file content is returned in the response for the client to write.\n state.workspacePath = absPath;\n state.workspace = ws;\n state.sketches.clear();\n state.selection.clear();\n state.emitMutation(\"workspace:loaded\", { path: absPath, title: ws.title });\n } else {\n // Local mode: write to disk and load (which also loads referenced sketches)\n await writeFile(absPath, json, \"utf-8\");\n await state.loadWorkspace(absPath);\n }\n state.emitMutation(\"workspace:updated\", { path: absPath });\n\n return {\n success: true,\n path: absPath,\n title: input.title,\n sketchCount: sketchRefs.length,\n viewport,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// open_workspace\n// ---------------------------------------------------------------------------\n\nexport interface OpenWorkspaceInput {\n path: string;\n}\n\nexport async function openWorkspace(\n state: EditorState,\n input: OpenWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const absPath = state.resolvePath(input.path);\n\n if (!absPath.endsWith(\".genart-workspace\")) {\n throw new Error(\"Path must end with .genart-workspace\");\n }\n\n if (!(await fileExists(absPath))) {\n throw new Error(`Workspace not found: ${absPath}`);\n }\n\n // Load workspace (this validates and loads all sketches)\n try {\n await state.loadWorkspace(absPath);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n // Distinguish parse errors from missing sketch files\n if (msg.includes(\"not found\") || msg.includes(\"ENOENT\")) {\n throw e;\n }\n throw new Error(`Invalid workspace file: ${absPath} — ${msg}`);\n }\n\n const ws = state.requireWorkspace();\n\n // Build sketch summaries\n const sketches = ws.sketches.map((ref) => {\n const loaded = state.getSketch(\n // Find by filename match\n [...state.sketches.entries()].find(\n ([, v]) => basename(v.path) === ref.file,\n )?.[0] ?? \"\",\n );\n const def = loaded?.definition;\n return {\n file: ref.file,\n position: ref.position,\n label: ref.label,\n id: def?.id,\n title: def?.title,\n renderer: def?.renderer ? { type: def.renderer.type, version: def.renderer.version } : undefined,\n canvas: def?.canvas ? { width: def.canvas.width, height: def.canvas.height } : undefined,\n locked: ref.locked ?? false,\n visible: ref.visible ?? true,\n };\n });\n\n state.emitMutation(\"workspace:updated\", { path: absPath });\n\n return {\n success: true,\n path: absPath,\n id: ws.id,\n title: ws.title,\n viewport: ws.viewport,\n sketchCount: ws.sketches.length,\n sketches,\n groups: ws.groups ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// add_sketch_to_workspace\n// ---------------------------------------------------------------------------\n\nexport interface AddSketchToWorkspaceInput {\n sketchPath: string;\n position?: { x: number; y: number };\n label?: string;\n}\n\nexport async function addSketchToWorkspace(\n state: EditorState,\n input: AddSketchToWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const absSketchPath = state.resolvePath(input.sketchPath);\n\n if (!(await fileExists(absSketchPath))) {\n throw new Error(`Sketch file not found: ${absSketchPath}`);\n }\n\n const file = basename(absSketchPath);\n\n // Check for duplicate\n if (ws.sketches.some((s) => s.file === file)) {\n throw new Error(\n `Sketch '${file}' is already in the workspace`,\n );\n }\n\n // Validate the sketch\n let def: SketchDefinition;\n try {\n def = await state.loadSketch(absSketchPath);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Invalid .genart file: ${absSketchPath} — ${msg}`);\n }\n\n // Auto-position if not specified: place to the right of the rightmost sketch\n const position = input.position ?? autoPosition(ws, def);\n\n const newRef: WorkspaceSketchRef = {\n file,\n position,\n ...(input.label ? { label: input.label } : {}),\n };\n\n // Update workspace (immutable — create new object)\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: [...ws.sketches, newRef],\n };\n\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { added: file });\n\n return {\n success: true,\n file,\n id: def.id,\n title: def.title,\n position,\n sketchCount: state.workspace.sketches.length,\n };\n}\n\nfunction autoPosition(\n ws: WorkspaceDefinition,\n def: SketchDefinition,\n): { x: number; y: number } {\n if (ws.sketches.length === 0) return { x: 0, y: 0 };\n\n // Place to the right of the rightmost sketch\n let maxRight = -Infinity;\n for (const s of ws.sketches) {\n const right = s.position.x + 1200; // Assume 1200 default width\n if (right > maxRight) maxRight = right;\n }\n return { x: maxRight + 200, y: 0 };\n}\n\n// ---------------------------------------------------------------------------\n// remove_sketch_from_workspace\n// ---------------------------------------------------------------------------\n\nexport interface RemoveSketchFromWorkspaceInput {\n sketchId: string;\n deleteFile?: boolean;\n}\n\nexport async function removeSketchFromWorkspace(\n state: EditorState,\n input: RemoveSketchFromWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n // Find the sketch by ID\n const loaded = state.getSketch(input.sketchId);\n if (!loaded) {\n throw new Error(`Sketch not found: '${input.sketchId}'`);\n }\n\n const file = basename(loaded.path);\n const hadSketch = ws.sketches.some((s) => s.file === file);\n if (!hadSketch) {\n throw new Error(`Sketch '${input.sketchId}' is not in the workspace`);\n }\n\n // Remove from sketches and groups\n const newSketches = ws.sketches.filter((s) => s.file !== file);\n const newGroups = ws.groups?.map((g) => ({\n ...g,\n sketchFiles: g.sketchFiles.filter((f) => f !== file),\n })).filter((g) => g.sketchFiles.length > 0);\n\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: newSketches,\n ...(newGroups && newGroups.length > 0 ? { groups: newGroups } : {}),\n };\n\n // Remove from state cache\n state.sketches.delete(input.sketchId);\n state.selection.delete(input.sketchId);\n\n // Optionally delete the file\n if (input.deleteFile) {\n const { unlink } = await import(\"fs/promises\");\n try {\n await unlink(loaded.path);\n } catch {\n // File may already be deleted\n }\n }\n\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { removed: file });\n\n return {\n success: true,\n removedId: input.sketchId,\n removedFile: file,\n fileDeleted: input.deleteFile ?? false,\n sketchCount: state.workspace.sketches.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// list_workspace_sketches\n// ---------------------------------------------------------------------------\n\nexport interface ListWorkspaceSketchesInput {\n includeState?: boolean;\n}\n\nexport async function listWorkspaceSketches(\n state: EditorState,\n input: ListWorkspaceSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const sketches = ws.sketches.map((ref) => {\n // Find loaded sketch by filename\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === ref.file,\n );\n const def = loaded?.definition;\n\n const entry: Record<string, unknown> = {\n file: ref.file,\n position: ref.position,\n label: ref.label,\n id: def?.id,\n title: def?.title,\n renderer: def?.renderer.type,\n canvas: def ? { width: def.canvas.width, height: def.canvas.height } : undefined,\n parameterCount: def?.parameters.length ?? 0,\n colorCount: def?.colors.length ?? 0,\n locked: ref.locked ?? false,\n visible: ref.visible ?? true,\n };\n\n if (input.includeState && def) {\n entry.state = def.state;\n }\n\n return entry;\n });\n\n return {\n success: true,\n workspace: {\n id: ws.id,\n title: ws.title,\n path: state.workspacePath,\n },\n sketchCount: sketches.length,\n sketches,\n };\n}\n","/**\n * Sketch lifecycle tools.\n * create_sketch, open_sketch, update_sketch, update_algorithm,\n * save_sketch, fork_sketch, delete_sketch\n */\n\nimport { readFile, writeFile, stat, unlink } from \"fs/promises\";\nimport { basename, dirname, resolve } from \"path\";\nimport {\n createDefaultRegistry,\n parseGenart,\n resolveComponents,\n resolvePreset,\n serializeGenart,\n serializeWorkspace,\n type ColorDef,\n type ParamDef,\n type RendererType,\n type SketchComponentDef,\n type SketchComponentValue,\n type SketchDefinition,\n type SketchState,\n type ThemeDef,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Shared constants\n// ---------------------------------------------------------------------------\n\nconst VALID_RENDERERS: readonly RendererType[] = [\n \"p5\",\n \"three\",\n \"glsl\",\n \"canvas2d\",\n \"svg\",\n];\nconst KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\n// resolvePath removed — use state.resolvePath() for sandbox-aware path resolution\n\nfunction validateRendererType(type: string): asserts type is RendererType {\n if (!VALID_RENDERERS.includes(type as RendererType)) {\n throw new Error(\n `Unknown renderer type: '${type}'. Valid types: ${VALID_RENDERERS.join(\", \")}`,\n );\n }\n}\n\nfunction validateKebabId(id: string): void {\n if (!KEBAB_RE.test(id)) {\n throw new Error(\n \"ID must be kebab-case: lowercase letters, numbers, hyphens\",\n );\n }\n}\n\nfunction validateParameters(parameters: ParamDef[]): void {\n const keys = new Set<string>();\n for (const p of parameters) {\n if (keys.has(p.key)) {\n throw new Error(`Duplicate parameter key: '${p.key}'`);\n }\n keys.add(p.key);\n if (p.default < p.min || p.default > p.max) {\n throw new Error(\n `Parameter '${p.key}' default (${p.default}) outside range [${p.min}, ${p.max}]`,\n );\n }\n }\n}\n\nfunction resolveCanvas(\n canvas?: { preset?: string; width?: number; height?: number },\n): { width: number; height: number } {\n if (!canvas) {\n return resolvePreset(\"square-1200\");\n }\n if (canvas.preset) {\n return resolvePreset(canvas.preset);\n }\n return {\n width: canvas.width ?? 1200,\n height: canvas.height ?? 1200,\n };\n}\n\nfunction buildState(\n parameters: readonly ParamDef[],\n colors: readonly ColorDef[],\n seed: number,\n): SketchState {\n const params: Record<string, number> = {};\n for (const p of parameters) {\n params[p.key] = p.default;\n }\n const colorPalette = colors.map((c) => c.default);\n return { seed, params, colorPalette };\n}\n\n// ---------------------------------------------------------------------------\n// create_sketch\n// ---------------------------------------------------------------------------\n\nexport interface CreateSketchInput {\n id: string;\n title: string;\n path: string;\n renderer?: string;\n canvas?: { preset?: string; width?: number; height?: number };\n philosophy?: string;\n parameters?: ParamDef[];\n colors?: ColorDef[];\n themes?: ThemeDef[];\n algorithm?: string;\n seed?: number;\n skills?: string[];\n components?: Record<string, string | { version?: string; code?: string; exports?: string[] }>;\n addToWorkspace?: string;\n agent?: string;\n model?: string;\n}\n\nexport async function createSketch(\n state: EditorState,\n input: CreateSketchInput,\n): Promise<Record<string, unknown>> {\n const absPath = state.resolvePath(input.path);\n\n if (!absPath.endsWith(\".genart\")) {\n throw new Error(\"Path must end with .genart\");\n }\n\n validateKebabId(input.id);\n\n if (!state.remoteMode && await fileExists(absPath)) {\n throw new Error(\n `File already exists at ${absPath}. Use update_sketch or fork_sketch.`,\n );\n }\n\n const rendererType = (input.renderer ?? \"p5\") as string;\n validateRendererType(rendererType);\n\n const canvasDims = resolveCanvas(input.canvas);\n const parameters = input.parameters ?? [];\n const colors = input.colors ?? [];\n\n if (parameters.length > 0) {\n validateParameters(parameters);\n }\n\n // Get algorithm from input or renderer template\n let algorithm = input.algorithm;\n if (!algorithm) {\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(rendererType);\n algorithm = adapter.getAlgorithmTemplate();\n }\n\n // Resolve components if provided\n let resolvedComponents: Record<string, SketchComponentDef> | undefined;\n if (input.components && Object.keys(input.components).length > 0) {\n // Build shorthand map for the resolver\n const shorthand: Record<string, string> = {};\n for (const [name, value] of Object.entries(input.components)) {\n if (typeof value === \"string\") {\n shorthand[name] = value;\n } else if (value.version) {\n shorthand[name] = value.version;\n } else if (value.code) {\n // Inline component — skip resolver, include directly\n if (!resolvedComponents) resolvedComponents = {};\n resolvedComponents[name] = {\n ...(value.version ? { version: value.version } : {}),\n code: value.code,\n ...(value.exports ? { exports: value.exports } : {}),\n };\n }\n }\n\n // Resolve registry components\n if (Object.keys(shorthand).length > 0) {\n const resolved = resolveComponents(shorthand, rendererType as RendererType);\n if (!resolvedComponents) resolvedComponents = {};\n for (const rc of resolved) {\n resolvedComponents[rc.name] = {\n version: rc.version,\n code: rc.code,\n exports: [...rc.exports],\n };\n }\n }\n }\n\n const seed =\n input.seed ?? Math.floor(Math.random() * 100000);\n const ts = now();\n const hasComponents = resolvedComponents && Object.keys(resolvedComponents).length > 0;\n\n const sketch: SketchDefinition = {\n genart: hasComponents ? \"1.2\" : \"1.1\",\n id: input.id,\n title: input.title,\n created: ts,\n modified: ts,\n renderer: { type: rendererType, version: \"1.x\" },\n canvas: canvasDims,\n parameters,\n colors,\n state: buildState(parameters, colors, seed),\n algorithm,\n ...(input.philosophy ? { philosophy: input.philosophy } : {}),\n ...(input.themes && input.themes.length > 0\n ? { themes: input.themes }\n : {}),\n ...(input.skills && input.skills.length > 0\n ? { skills: input.skills }\n : {}),\n ...(hasComponents ? { components: resolvedComponents } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Serialize sketch JSON\n const json = serializeGenart(sketch);\n\n // Write to disk in local mode\n if (!state.remoteMode) {\n await writeFile(absPath, json, \"utf-8\");\n }\n\n // Load into state\n state.sketches.set(input.id, { definition: sketch, path: absPath });\n state.emitMutation(\"sketch:created\", { id: input.id, path: absPath });\n\n // In remote sessions, auto-manage the workspace so every sketch is visible\n // in the editor without requiring explicit workspace tools.\n if (state.remoteMode && !input.addToWorkspace) {\n const file = basename(absPath);\n if (!state.workspace) {\n // Auto-create a workspace for the first sketch in this session\n const ts = now();\n state.workspace = {\n \"genart-workspace\": \"1.0\",\n id: \"session\",\n title: \"genart.dev\",\n created: ts,\n modified: ts,\n viewport: { x: 0, y: 0, zoom: 1 },\n sketches: [{ file, position: { x: 0, y: 0 } }],\n };\n state.workspacePath = state.resolvePath(\"workspace.genart-workspace\");\n state.emitMutation(\"workspace:loaded\", { path: state.workspacePath, title: state.workspace.title });\n } else {\n // Add to the existing auto-created workspace\n let maxRight = 0;\n for (const s of state.workspace.sketches) {\n const right = s.position.x + 1200;\n if (right > maxRight) maxRight = right;\n }\n state.workspace = {\n ...state.workspace,\n modified: now(),\n sketches: [...state.workspace.sketches, { file, position: { x: maxRight + 200, y: 0 } }],\n };\n state.emitMutation(\"workspace:updated\", { added: file });\n }\n }\n\n // Optionally add to a specific workspace (local mode / explicit path)\n let workspaceContent: string | undefined;\n if (input.addToWorkspace) {\n // If workspace is open and matches the requested path, add the sketch ref\n const wsPath = state.resolvePath(input.addToWorkspace);\n if (state.workspace && state.workspacePath === wsPath) {\n const file = basename(absPath);\n const ws = state.requireWorkspace();\n // Auto-position to the right of existing sketches\n let maxRight = 0;\n for (const s of ws.sketches) {\n const right = s.position.x + 1200;\n if (right > maxRight) maxRight = right;\n }\n const position =\n ws.sketches.length === 0\n ? { x: 0, y: 0 }\n : { x: maxRight + 200, y: 0 };\n\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: [...ws.sketches, { file, position }],\n };\n\n workspaceContent = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(wsPath, workspaceContent, \"utf-8\");\n }\n state.emitMutation(\"workspace:updated\", { added: file });\n }\n }\n\n return {\n success: true,\n path: absPath,\n id: input.id,\n title: input.title,\n renderer: rendererType,\n canvas: canvasDims,\n seed,\n fileContent: json,\n ...(workspaceContent ? { workspaceContent } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// open_sketch\n// ---------------------------------------------------------------------------\n\nexport interface OpenSketchInput {\n sketchId: string;\n}\n\nexport async function openSketch(\n state: EditorState,\n input: OpenSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n // Set selection to this sketch\n state.setSelection([input.sketchId]);\n state.emitMutation(\"selection:changed\", { selected: [input.sketchId] });\n\n return {\n success: true,\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n seed: def.state.seed,\n philosophy: def.philosophy ?? null,\n algorithmLength: def.algorithm.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// update_sketch\n// ---------------------------------------------------------------------------\n\nexport interface UpdateSketchInput {\n sketchId: string;\n title?: string;\n philosophy?: string;\n canvas?: { preset?: string; width?: number; height?: number };\n parameters?: ParamDef[];\n colors?: ColorDef[];\n themes?: ThemeDef[];\n seed?: number;\n skills?: string[];\n agent?: string;\n model?: string;\n}\n\nexport async function updateSketch(\n state: EditorState,\n input: UpdateSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const updatableFields = [\n \"title\",\n \"philosophy\",\n \"canvas\",\n \"parameters\",\n \"colors\",\n \"themes\",\n \"seed\",\n \"skills\",\n ] as const;\n\n const updated: string[] = [];\n for (const field of updatableFields) {\n if (input[field] !== undefined) {\n updated.push(field);\n }\n }\n\n if (updated.length === 0) {\n throw new Error(\n \"No fields to update. Provide at least one of: title, philosophy, canvas, parameters, colors, themes, seed, skills\",\n );\n }\n\n // Validate new parameters if provided\n if (input.parameters) {\n validateParameters(input.parameters);\n }\n\n // Resolve canvas if provided\n let canvasDims = { width: def.canvas.width, height: def.canvas.height };\n if (input.canvas) {\n canvasDims = resolveCanvas(input.canvas);\n }\n\n // Build new state\n const newParams = input.parameters ?? def.parameters;\n const newColors = input.colors ?? def.colors;\n const newSeed = input.seed ?? def.state.seed;\n const newState = buildState(newParams, newColors, newSeed);\n\n const newDef: SketchDefinition = {\n ...def,\n modified: now(),\n canvas: canvasDims,\n parameters: newParams,\n colors: newColors,\n state: newState,\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.philosophy !== undefined\n ? { philosophy: input.philosophy }\n : {}),\n ...(input.themes !== undefined ? { themes: input.themes } : {}),\n ...(input.seed !== undefined\n ? { state: { ...newState, seed: input.seed } }\n : {}),\n ...(input.skills !== undefined ? { skills: input.skills } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Update in state and save\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated });\n\n return {\n success: true,\n sketchId: input.sketchId,\n updated,\n canvas: canvasDims,\n parameterCount: newDef.parameters.length,\n colorCount: newDef.colors.length,\n seed: newDef.state.seed,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// update_algorithm\n// ---------------------------------------------------------------------------\n\nexport interface UpdateAlgorithmInput {\n sketchId: string;\n algorithm: string;\n validate?: boolean;\n components?: Record<string, string | { version?: string; code?: string; exports?: string[] }>;\n agent?: string;\n model?: string;\n}\n\nexport async function updateAlgorithm(\n state: EditorState,\n input: UpdateAlgorithmInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n if (!input.algorithm || input.algorithm.trim() === \"\") {\n throw new Error(\"Algorithm cannot be empty\");\n }\n\n const shouldValidate = input.validate !== false;\n let validationPassed = true;\n\n if (shouldValidate) {\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(def.renderer.type);\n const result = adapter.validate(input.algorithm);\n if (!result.valid) {\n throw new Error(\n `Algorithm validation failed: ${result.errors.join(\"; \")}`,\n );\n }\n }\n\n // Resolve components if provided\n let resolvedComponents: Record<string, SketchComponentDef> | undefined;\n if (input.components && Object.keys(input.components).length > 0) {\n const renderer = def.renderer.type;\n const shorthand: Record<string, string> = {};\n for (const [name, value] of Object.entries(input.components)) {\n if (typeof value === \"string\") {\n shorthand[name] = value;\n } else if (value.version) {\n shorthand[name] = value.version;\n } else if (value.code) {\n if (!resolvedComponents) resolvedComponents = {};\n resolvedComponents[name] = {\n ...(value.version ? { version: value.version } : {}),\n code: value.code,\n ...(value.exports ? { exports: value.exports } : {}),\n };\n }\n }\n if (Object.keys(shorthand).length > 0) {\n const resolved = resolveComponents(shorthand, renderer);\n if (!resolvedComponents) resolvedComponents = {};\n for (const rc of resolved) {\n resolvedComponents[rc.name] = {\n version: rc.version,\n code: rc.code,\n exports: [...rc.exports],\n };\n }\n }\n }\n\n const updated: string[] = [\"algorithm\"];\n const hasNewComponents = resolvedComponents && Object.keys(resolvedComponents).length > 0;\n if (hasNewComponents) updated.push(\"components\");\n\n const newDef: SketchDefinition = {\n ...def,\n modified: now(),\n algorithm: input.algorithm,\n ...(hasNewComponents\n ? { genart: \"1.2\" as const, components: resolvedComponents }\n : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", {\n id: input.sketchId,\n updated,\n });\n\n return {\n success: true,\n sketchId: input.sketchId,\n renderer: def.renderer.type,\n algorithmLength: input.algorithm.length,\n validationPassed,\n ...(hasNewComponents ? { componentsUpdated: true } : {}),\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// save_sketch\n// ---------------------------------------------------------------------------\n\nexport interface SaveSketchInput {\n sketchId: string;\n}\n\nexport async function saveSketch(\n state: EditorState,\n input: SaveSketchInput,\n): Promise<Record<string, unknown>> {\n const loaded = state.requireSketch(input.sketchId);\n\n // Update modified timestamp\n const newDef: SketchDefinition = {\n ...loaded.definition,\n modified: now(),\n };\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:saved\", { id: input.sketchId, path: loaded.path });\n\n return {\n success: true,\n sketchId: input.sketchId,\n path: loaded.path,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// fork_sketch\n// ---------------------------------------------------------------------------\n\nexport interface ForkSketchInput {\n sourceId: string;\n newId: string;\n title?: string;\n position?: { x: number; y: number };\n modifications?: {\n renderer?: string;\n canvas?: { preset?: string; width?: number; height?: number };\n parameters?: ParamDef[];\n colors?: ColorDef[];\n algorithm?: string;\n philosophy?: string;\n };\n newSeed?: boolean;\n agent?: string;\n model?: string;\n}\n\nexport async function forkSketch(\n state: EditorState,\n input: ForkSketchInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const source = state.requireSketch(input.sourceId);\n const sourceDef = source.definition;\n\n validateKebabId(input.newId);\n\n // Check if newId already exists in workspace\n if (state.getSketch(input.newId)) {\n throw new Error(\n `Sketch with ID '${input.newId}' already exists in workspace`,\n );\n }\n\n // Determine file path: same directory as source\n const sourceDir = dirname(source.path);\n const newPath = resolve(sourceDir, `${input.newId}.genart`);\n\n if (await fileExists(newPath)) {\n throw new Error(`File already exists at ${newPath}`);\n }\n\n // Apply modifications\n const mods = input.modifications ?? {};\n\n let rendererType = sourceDef.renderer.type as string;\n if (mods.renderer) {\n validateRendererType(mods.renderer);\n rendererType = mods.renderer;\n }\n\n const canvasDims = mods.canvas\n ? resolveCanvas(mods.canvas)\n : { width: sourceDef.canvas.width, height: sourceDef.canvas.height };\n\n const parameters = mods.parameters ?? [...sourceDef.parameters];\n const colors = mods.colors ?? [...sourceDef.colors];\n const algorithm = mods.algorithm ?? sourceDef.algorithm;\n const philosophy = mods.philosophy ?? sourceDef.philosophy;\n\n const generateNewSeed = input.newSeed !== false;\n const seed = generateNewSeed\n ? Math.floor(Math.random() * 100000)\n : sourceDef.state.seed;\n\n const title = input.title ?? `${sourceDef.title} (fork)`;\n const ts = now();\n\n const forkedDef: SketchDefinition = {\n genart: \"1.1\",\n id: input.newId,\n title,\n created: ts,\n modified: ts,\n renderer: { type: rendererType as RendererType, version: \"1.x\" },\n canvas: canvasDims,\n parameters,\n colors,\n state: buildState(parameters, colors, seed),\n algorithm,\n ...(philosophy ? { philosophy } : {}),\n ...(sourceDef.themes ? { themes: [...sourceDef.themes] } : {}),\n ...(sourceDef.skills ? { skills: [...sourceDef.skills] } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Serialize sketch JSON\n const json = serializeGenart(forkedDef);\n\n if (!state.remoteMode) {\n await writeFile(newPath, json, \"utf-8\");\n }\n\n // Load into state\n state.sketches.set(input.newId, { definition: forkedDef, path: newPath });\n\n // Auto-position: to the right of source sketch in workspace\n let position = input.position;\n if (!position) {\n const sourceRef = ws.sketches.find(\n (s) => s.file === basename(source.path),\n );\n if (sourceRef) {\n position = {\n x: sourceRef.position.x + sourceDef.canvas.width + 200,\n y: sourceRef.position.y,\n };\n } else {\n position = { x: 0, y: 0 };\n }\n }\n\n // Add to workspace\n const file = basename(newPath);\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: [...ws.sketches, { file, position }],\n };\n\n const workspaceJson = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(state.workspacePath!, workspaceJson, \"utf-8\");\n }\n\n state.emitMutation(\"sketch:created\", { id: input.newId, path: newPath });\n state.emitMutation(\"workspace:updated\", { added: file });\n\n return {\n success: true,\n sourceId: input.sourceId,\n forkedSketch: {\n id: input.newId,\n title,\n path: newPath,\n renderer: rendererType,\n canvas: canvasDims,\n seed,\n position,\n },\n fileContent: json,\n workspaceContent: workspaceJson,\n };\n}\n\n// ---------------------------------------------------------------------------\n// delete_sketch\n// ---------------------------------------------------------------------------\n\nexport interface DeleteSketchInput {\n sketchId: string;\n keepFile?: boolean;\n}\n\nexport async function deleteSketch(\n state: EditorState,\n input: DeleteSketchInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const file = basename(loaded.path);\n\n // Remove from workspace sketches\n const newSketches = ws.sketches.filter((s) => s.file !== file);\n\n // Clean up groups\n const newGroups = ws.groups\n ?.map((g) => ({\n ...g,\n sketchFiles: g.sketchFiles.filter((f) => f !== file),\n }))\n .filter((g) => g.sketchFiles.length > 0);\n\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: newSketches,\n ...(newGroups && newGroups.length > 0 ? { groups: newGroups } : {}),\n };\n\n // Remove from state cache and selection\n state.sketches.delete(input.sketchId);\n state.selection.delete(input.sketchId);\n\n // Delete file from disk unless keepFile is true\n const shouldDelete = !input.keepFile;\n if (shouldDelete) {\n try {\n await unlink(loaded.path);\n } catch {\n // File may already be deleted\n }\n }\n\n await state.saveWorkspace();\n state.emitMutation(\"sketch:deleted\", { id: input.sketchId });\n state.emitMutation(\"workspace:updated\", { removed: file });\n\n return {\n success: true,\n deletedId: input.sketchId,\n path: loaded.path,\n fileDeleted: shouldDelete,\n sketchCount: state.workspace.sketches.length,\n };\n}\n","/**\n * Selection and context tools.\n * get_selection, select_sketch, get_editor_state\n */\n\nimport { basename } from \"path\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// get_selection\n// ---------------------------------------------------------------------------\n\nexport interface GetSelectionInput {\n includeAlgorithm?: boolean;\n includePhilosophy?: boolean;\n includeNeighbors?: boolean;\n}\n\nexport async function getSelection(\n state: EditorState,\n input: GetSelectionInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const includeAlgorithm = input.includeAlgorithm !== false;\n const includePhilosophy = input.includePhilosophy !== false;\n const includeNeighbors = input.includeNeighbors === true;\n\n const selected: Record<string, unknown>[] = [];\n\n for (const id of state.selection) {\n const loaded = state.getSketch(id);\n if (!loaded) continue;\n\n const def = loaded.definition;\n const ref = ws.sketches.find((s) => s.file === basename(loaded.path));\n\n const entry: Record<string, unknown> = {\n id: def.id,\n title: def.title,\n path: loaded.path,\n renderer: { type: def.renderer.type, version: def.renderer.version },\n canvas: { preset: undefined, width: def.canvas.width, height: def.canvas.height },\n state: def.state,\n parameters: def.parameters,\n colors: def.colors,\n themes: def.themes ?? [],\n skills: def.skills ?? [],\n position: ref?.position ?? { x: 0, y: 0 },\n snapshotCount: def.snapshots?.length ?? 0,\n };\n\n if (includePhilosophy) {\n entry.philosophy = def.philosophy ?? null;\n }\n\n if (includeAlgorithm) {\n entry.algorithm = def.algorithm;\n }\n\n selected.push(entry);\n }\n\n // Compute neighbors if requested\n const neighbors: Record<string, unknown>[] = [];\n if (includeNeighbors && selected.length > 0) {\n const selectedIds = new Set(state.selection);\n\n for (const ref of ws.sketches) {\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === ref.file,\n );\n if (!loaded || selectedIds.has(loaded.definition.id)) continue;\n\n // Check if within 2000px of any selected sketch\n const isNear = selected.some((sel) => {\n const selPos = sel.position as { x: number; y: number };\n const dx = Math.abs(ref.position.x - selPos.x);\n const dy = Math.abs(ref.position.y - selPos.y);\n return dx <= 2000 && dy <= 2000;\n });\n\n if (isNear) {\n neighbors.push({\n id: loaded.definition.id,\n title: loaded.definition.title,\n renderer: loaded.definition.renderer.type,\n position: ref.position,\n });\n }\n }\n }\n\n return {\n selected,\n workspace: {\n id: ws.id,\n title: ws.title,\n sketchCount: ws.sketches.length,\n },\n neighbors,\n };\n}\n\n// ---------------------------------------------------------------------------\n// select_sketch\n// ---------------------------------------------------------------------------\n\nexport interface SelectSketchInput {\n sketchIds: string[];\n addToSelection?: boolean;\n}\n\nexport async function selectSketch(\n state: EditorState,\n input: SelectSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n\n if (!input.sketchIds || input.sketchIds.length === 0) {\n throw new Error(\"At least one sketch ID is required\");\n }\n\n // Validate all IDs exist\n for (const id of input.sketchIds) {\n state.requireSketch(id);\n }\n\n if (input.addToSelection) {\n for (const id of input.sketchIds) {\n state.selection.add(id);\n }\n } else {\n state.setSelection(input.sketchIds);\n }\n\n const selected = [...state.selection];\n state.emitMutation(\"selection:changed\", { selected });\n\n return {\n success: true,\n selected,\n selectionCount: selected.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// get_editor_state\n// ---------------------------------------------------------------------------\n\nexport async function getEditorState(\n state: EditorState,\n): Promise<Record<string, unknown>> {\n if (!state.workspace) {\n return {\n hasWorkspace: false,\n workingDirectory: state.basePath,\n workspace: null,\n selection: [],\n sketches: [],\n };\n }\n\n const ws = state.workspace;\n const sketches = [...state.sketches.values()].map((loaded) => {\n const def = loaded.definition;\n return {\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n seed: def.state.seed,\n };\n });\n\n return {\n hasWorkspace: true,\n workingDirectory: state.basePath,\n workspace: {\n id: ws.id,\n title: ws.title,\n path: state.workspacePath,\n sketchCount: ws.sketches.length,\n viewport: ws.viewport,\n groups: ws.groups ?? [],\n },\n selection: [...state.selection],\n sketches,\n };\n}\n","/**\n * Parameter manipulation tools.\n * set_parameters, set_colors, set_seed, set_canvas_size, randomize_parameters\n */\n\nimport {\n resolvePreset,\n type SketchDefinition,\n type SketchState,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst HEX_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\nfunction updateSketchInState(\n state: EditorState,\n id: string,\n newDef: SketchDefinition,\n): void {\n const loaded = state.requireSketch(id);\n state.sketches.set(id, { definition: newDef, path: loaded.path });\n}\n\n// ---------------------------------------------------------------------------\n// set_parameters\n// ---------------------------------------------------------------------------\n\nexport interface SetParametersInput {\n sketchId: string;\n params: Record<string, number>;\n}\n\nexport async function setParameters(\n state: EditorState,\n input: SetParametersInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const validKeys = new Set(def.parameters.map((p) => p.key));\n const updated: string[] = [];\n\n // Validate all keys and values\n for (const [key, value] of Object.entries(input.params)) {\n if (!validKeys.has(key)) {\n throw new Error(\n `Unknown parameter: '${key}'. Valid keys: ${[...validKeys].join(\", \")}`,\n );\n }\n const paramDef = def.parameters.find((p) => p.key === key)!;\n if (value < paramDef.min || value > paramDef.max) {\n throw new Error(\n `Parameter '${key}' value ${value} outside range [${paramDef.min}, ${paramDef.max}]`,\n );\n }\n updated.push(key);\n }\n\n const newParams = { ...def.state.params, ...input.params };\n const newState: SketchState = { ...def.state, params: newParams };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"params\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n updated,\n state: newState,\n };\n}\n\n// ---------------------------------------------------------------------------\n// set_colors\n// ---------------------------------------------------------------------------\n\nexport interface SetColorsInput {\n sketchId: string;\n colors: Record<string, string>;\n}\n\nexport async function setColors(\n state: EditorState,\n input: SetColorsInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const colorDefs = def.colors;\n const validKeys = new Set(colorDefs.map((c) => c.key));\n const updated: string[] = [];\n\n // Validate all keys and values\n for (const [key, value] of Object.entries(input.colors)) {\n if (!validKeys.has(key)) {\n throw new Error(\n `Unknown color: '${key}'. Valid keys: ${[...validKeys].join(\", \")}`,\n );\n }\n if (!HEX_RE.test(value)) {\n throw new Error(`Invalid hex color for '${key}': '${value}'`);\n }\n updated.push(key);\n }\n\n // Build new colorPalette array preserving order from color definitions\n const newPalette = colorDefs.map((cDef) => {\n if (input.colors[cDef.key] !== undefined) {\n return input.colors[cDef.key];\n }\n // Keep existing value from current palette\n const idx = colorDefs.findIndex((c) => c.key === cDef.key);\n return def.state.colorPalette[idx] ?? cDef.default;\n });\n\n const newState: SketchState = { ...def.state, colorPalette: newPalette };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"colors\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n updated,\n colorPalette: newPalette,\n };\n}\n\n// ---------------------------------------------------------------------------\n// set_seed\n// ---------------------------------------------------------------------------\n\nexport interface SetSeedInput {\n sketchId: string;\n seed?: number;\n}\n\nexport async function setSeed(\n state: EditorState,\n input: SetSeedInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const previousSeed = def.state.seed;\n const newSeed = input.seed ?? Math.floor(Math.random() * 100000);\n\n const newState: SketchState = { ...def.state, seed: newSeed };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"seed\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n seed: newSeed,\n previousSeed,\n };\n}\n\n// ---------------------------------------------------------------------------\n// set_canvas_size\n// ---------------------------------------------------------------------------\n\nexport interface SetCanvasSizeInput {\n sketchId: string;\n preset?: string;\n width?: number;\n height?: number;\n}\n\nexport async function setCanvasSize(\n state: EditorState,\n input: SetCanvasSizeInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const previousCanvas = { width: def.canvas.width, height: def.canvas.height };\n\n let newCanvas: { width: number; height: number };\n if (input.preset) {\n newCanvas = resolvePreset(input.preset);\n } else if (input.width !== undefined && input.height !== undefined) {\n newCanvas = { width: input.width, height: input.height };\n } else {\n throw new Error(\"Provide either a preset or both width and height\");\n }\n\n const newDef: SketchDefinition = { ...def, modified: now(), canvas: newCanvas };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"canvas\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n canvas: newCanvas,\n previousCanvas,\n };\n}\n\n// ---------------------------------------------------------------------------\n// randomize_parameters\n// ---------------------------------------------------------------------------\n\nexport interface RandomizeParametersInput {\n sketchId: string;\n paramKeys?: string[];\n newSeed?: boolean;\n}\n\nexport async function randomizeParameters(\n state: EditorState,\n input: RandomizeParametersInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n if (def.parameters.length === 0) {\n throw new Error(\"Sketch has no parameters to randomize\");\n }\n\n // Determine which parameters to randomize\n let paramsToRandomize = def.parameters;\n if (input.paramKeys && input.paramKeys.length > 0) {\n const validKeys = new Set(def.parameters.map((p) => p.key));\n for (const key of input.paramKeys) {\n if (!validKeys.has(key)) {\n throw new Error(\n `Unknown parameter: '${key}'. Valid keys: ${[...validKeys].join(\", \")}`,\n );\n }\n }\n const keySet = new Set(input.paramKeys);\n paramsToRandomize = def.parameters.filter((p) => keySet.has(p.key));\n }\n\n // Generate random values within each parameter's range, respecting step\n const newParams = { ...def.state.params };\n const randomized: string[] = [];\n for (const paramDef of paramsToRandomize) {\n const steps = Math.round((paramDef.max - paramDef.min) / paramDef.step);\n const randomStep = Math.floor(Math.random() * (steps + 1));\n newParams[paramDef.key] = paramDef.min + randomStep * paramDef.step;\n randomized.push(paramDef.key);\n }\n\n const newSeed = input.newSeed\n ? Math.floor(Math.random() * 100000)\n : def.state.seed;\n\n const newState: SketchState = { ...def.state, params: newParams, seed: newSeed };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"params\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n randomized,\n state: newState,\n };\n}\n","/**\n * Spatial arrangement tools.\n * arrange_sketches, auto_arrange, group_sketches\n */\n\nimport { basename } from \"path\";\nimport type { WorkspaceDefinition, WorkspaceGroup } from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\n/** Get sketch dimensions from the loaded state. */\nfunction getSketchDimensions(\n state: EditorState,\n sketchId: string,\n): { width: number; height: number } {\n const loaded = state.getSketch(sketchId);\n if (!loaded) return { width: 1200, height: 1200 };\n return {\n width: loaded.definition.canvas.width,\n height: loaded.definition.canvas.height,\n };\n}\n\n/** Compute a viewport that fits all positions. */\nfunction computeViewport(\n positions: { position: { x: number; y: number }; width: number; height: number }[],\n): { x: number; y: number; zoom: number } {\n if (positions.length === 0) return { x: 0, y: 0, zoom: 1 };\n\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const p of positions) {\n if (p.position.x < minX) minX = p.position.x;\n if (p.position.y < minY) minY = p.position.y;\n if (p.position.x + p.width > maxX) maxX = p.position.x + p.width;\n if (p.position.y + p.height > maxY) maxY = p.position.y + p.height;\n }\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const totalW = maxX - minX;\n const totalH = maxY - minY;\n const zoom = Math.min(\n 1,\n Math.min(1920 / (totalW + 200), 1080 / (totalH + 200)),\n );\n return {\n x: Math.round(centerX),\n y: Math.round(centerY),\n zoom: Math.round(zoom * 100) / 100,\n };\n}\n\n/** Layout sketches in a grid pattern. */\nfunction layoutGrid(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n if (items.length === 0) return [];\n\n const cols = Math.ceil(Math.sqrt(items.length));\n const maxW = Math.max(...items.map((s) => s.width));\n const maxH = Math.max(...items.map((s) => s.height));\n const cellW = maxW + spacing;\n const cellH = maxH + spacing;\n\n return items.map((s, i) => ({\n id: s.id,\n position: {\n x: origin.x + (i % cols) * cellW,\n y: origin.y + Math.floor(i / cols) * cellH,\n },\n }));\n}\n\n/** Layout sketches in a row. */\nfunction layoutRow(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n let x = origin.x;\n return items.map((s) => {\n const pos = { id: s.id, position: { x, y: origin.y } };\n x += s.width + spacing;\n return pos;\n });\n}\n\n/** Layout sketches in a column. */\nfunction layoutColumn(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n let y = origin.y;\n return items.map((s) => {\n const pos = { id: s.id, position: { x: origin.x, y } };\n y += s.height + spacing;\n return pos;\n });\n}\n\n/** Layout sketches in a masonry pattern (shortest column first). */\nfunction layoutMasonry(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n if (items.length === 0) return [];\n\n const cols = Math.ceil(Math.sqrt(items.length));\n const maxW = Math.max(...items.map((s) => s.width));\n const cellW = maxW + spacing;\n\n // Track the current height of each column\n const columnHeights = new Array(cols).fill(0) as number[];\n const result: { id: string; position: { x: number; y: number } }[] = [];\n\n for (const item of items) {\n // Find the shortest column\n let minCol = 0;\n for (let c = 1; c < cols; c++) {\n if (columnHeights[c]! < columnHeights[minCol]!) minCol = c;\n }\n\n result.push({\n id: item.id,\n position: {\n x: origin.x + minCol * cellW,\n y: origin.y + columnHeights[minCol]!,\n },\n });\n\n columnHeights[minCol]! += item.height + spacing;\n }\n\n return result;\n}\n\nconst VALID_LAYOUTS = [\"grid\", \"row\", \"column\", \"masonry\"] as const;\ntype LayoutType = (typeof VALID_LAYOUTS)[number];\n\nfunction applyLayout(\n items: { id: string; width: number; height: number }[],\n layout: LayoutType,\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n switch (layout) {\n case \"row\":\n return layoutRow(items, spacing, origin);\n case \"column\":\n return layoutColumn(items, spacing, origin);\n case \"masonry\":\n return layoutMasonry(items, spacing, origin);\n case \"grid\":\n default:\n return layoutGrid(items, spacing, origin);\n }\n}\n\n// ---------------------------------------------------------------------------\n// arrange_sketches\n// ---------------------------------------------------------------------------\n\nexport interface ArrangeSketchesInput {\n positions: { sketchId: string; x: number; y: number }[];\n}\n\nexport async function arrangeSketches(\n state: EditorState,\n input: ArrangeSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!input.positions || input.positions.length === 0) {\n throw new Error(\"At least one position is required\");\n }\n\n // Validate all sketch IDs\n for (const pos of input.positions) {\n state.requireSketch(pos.sketchId);\n }\n\n // Build a map of sketchId → file for workspace refs\n const idToFile = new Map<string, string>();\n for (const [id, loaded] of state.sketches) {\n idToFile.set(id, basename(loaded.path));\n }\n\n // Update positions in workspace\n const positionMap = new Map(\n input.positions.map((p) => [idToFile.get(p.sketchId)!, { x: p.x, y: p.y }]),\n );\n\n const newSketches = ws.sketches.map((ref) => {\n const newPos = positionMap.get(ref.file);\n if (newPos) {\n return { ...ref, position: newPos };\n }\n return ref;\n });\n\n // Compute viewport for moved sketches\n const viewportItems = input.positions.map((p) => {\n const dims = getSketchDimensions(state, p.sketchId);\n return { position: { x: p.x, y: p.y }, width: dims.width, height: dims.height };\n });\n const viewport = computeViewport(viewportItems);\n\n state.workspace = { ...ws, modified: now(), sketches: newSketches, viewport };\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { arranged: input.positions.length });\n\n return {\n success: true,\n moved: input.positions.length,\n positions: input.positions.map((p) => ({\n id: p.sketchId,\n position: { x: p.x, y: p.y },\n })),\n viewport,\n };\n}\n\n// ---------------------------------------------------------------------------\n// auto_arrange\n// ---------------------------------------------------------------------------\n\nexport interface AutoArrangeInput {\n layout?: string;\n sketchIds?: string[];\n spacing?: number;\n sortBy?: string;\n origin?: { x: number; y: number };\n}\n\nexport async function autoArrange(\n state: EditorState,\n input: AutoArrangeInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const layout = (input.layout ?? \"grid\") as string;\n if (!VALID_LAYOUTS.includes(layout as LayoutType)) {\n throw new Error(\n `Unknown layout: '${layout}'. Valid layouts: ${VALID_LAYOUTS.join(\", \")}`,\n );\n }\n\n const spacing = input.spacing ?? 200;\n const origin = input.origin ?? { x: 0, y: 0 };\n\n // Determine which sketches to arrange\n let sketchIds: string[];\n if (input.sketchIds && input.sketchIds.length > 0) {\n for (const id of input.sketchIds) {\n state.requireSketch(id);\n }\n sketchIds = input.sketchIds;\n } else {\n // All sketches in workspace\n sketchIds = [...state.sketches.keys()];\n }\n\n if (sketchIds.length === 0) {\n throw new Error(\"No sketches to arrange\");\n }\n\n // Sort sketches\n const sortBy = input.sortBy ?? \"created\";\n const sortedItems = sketchIds\n .map((id) => {\n const loaded = state.requireSketch(id);\n const def = loaded.definition;\n return {\n id,\n title: def.title,\n created: def.created,\n modified: def.modified,\n renderer: def.renderer.type,\n width: def.canvas.width,\n height: def.canvas.height,\n };\n })\n .sort((a, b) => {\n switch (sortBy) {\n case \"title\":\n return a.title.localeCompare(b.title);\n case \"modified\":\n return a.modified.localeCompare(b.modified);\n case \"renderer\":\n return a.renderer.localeCompare(b.renderer);\n case \"created\":\n default:\n return a.created.localeCompare(b.created);\n }\n });\n\n // Apply layout\n const arranged = applyLayout(sortedItems, layout as LayoutType, spacing, origin);\n\n // Build file map and update workspace\n const idToFile = new Map<string, string>();\n for (const [id, loaded] of state.sketches) {\n idToFile.set(id, basename(loaded.path));\n }\n\n const positionMap = new Map(\n arranged.map((a) => [idToFile.get(a.id)!, a.position]),\n );\n\n const newSketches = ws.sketches.map((ref) => {\n const newPos = positionMap.get(ref.file);\n if (newPos) {\n return { ...ref, position: newPos };\n }\n return ref;\n });\n\n // Compute bounding box and viewport\n const viewportItems = arranged.map((a) => {\n const item = sortedItems.find((s) => s.id === a.id)!;\n return { position: a.position, width: item.width, height: item.height };\n });\n\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const item of viewportItems) {\n if (item.position.x < minX) minX = item.position.x;\n if (item.position.y < minY) minY = item.position.y;\n if (item.position.x + item.width > maxX) maxX = item.position.x + item.width;\n if (item.position.y + item.height > maxY) maxY = item.position.y + item.height;\n }\n\n const boundingBox = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n\n const viewport = computeViewport(viewportItems);\n\n state.workspace = { ...ws, modified: now(), sketches: newSketches, viewport };\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { arranged: arranged.length });\n\n return {\n success: true,\n layout,\n arranged: arranged.length,\n positions: arranged.map((a) => ({\n id: a.id,\n position: a.position,\n })),\n boundingBox,\n viewport,\n };\n}\n\n// ---------------------------------------------------------------------------\n// group_sketches\n// ---------------------------------------------------------------------------\n\nexport interface GroupSketchesInput {\n groupId: string;\n label: string;\n sketchIds: string[];\n color?: string;\n}\n\nexport async function groupSketches(\n state: EditorState,\n input: GroupSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!input.sketchIds || input.sketchIds.length === 0) {\n throw new Error(\"At least one sketch ID is required\");\n }\n\n // Validate all sketch IDs and collect their file names\n const sketchFiles: string[] = [];\n for (const id of input.sketchIds) {\n const loaded = state.requireSketch(id);\n sketchFiles.push(basename(loaded.path));\n }\n\n const newGroup: WorkspaceGroup = {\n id: input.groupId,\n label: input.label,\n sketchFiles,\n ...(input.color ? { color: input.color } : {}),\n };\n\n // Replace existing group with same ID, or add new one\n const existingGroups = ws.groups ?? [];\n const filtered = existingGroups.filter((g) => g.id !== input.groupId);\n const newGroups = [...filtered, newGroup];\n\n state.workspace = { ...ws, modified: now(), groups: newGroups };\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { groupUpdated: input.groupId });\n\n return {\n success: true,\n group: newGroup,\n groupCount: newGroups.length,\n };\n}\n","/**\n * Gallery tools.\n * list_sketches, search_sketches\n */\n\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { basename, dirname, join } from \"path\";\nimport { parseGenart } from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Try to parse a .genart file, returning null on failure. */\nasync function tryParseGenart(\n absPath: string,\n): Promise<{ id: string; title: string; renderer: string; canvas: { width: number; height: number }; parameterCount: number; colorCount: number; snapshotCount: number; hasPhilosophy: boolean; skills: readonly string[]; modified: string; path: string } | null> {\n try {\n const raw = await readFile(absPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const def = parseGenart(json);\n return {\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n snapshotCount: def.snapshots?.length ?? 0,\n hasPhilosophy: !!def.philosophy,\n skills: def.skills ?? [],\n modified: def.modified,\n path: absPath,\n };\n } catch {\n return null;\n }\n}\n\n/** Scan a directory for .genart files. */\nasync function scanGenartFiles(\n dir: string,\n recursive: boolean,\n): Promise<string[]> {\n const results: string[] = [];\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".genart\")) {\n results.push(fullPath);\n } else if (recursive && entry.isDirectory()) {\n const sub = await scanGenartFiles(fullPath, true);\n results.push(...sub);\n }\n }\n\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// list_sketches\n// ---------------------------------------------------------------------------\n\nexport interface ListSketchesInput {\n directory?: string;\n recursive?: boolean;\n includeUnreferenced?: boolean;\n}\n\nexport async function listSketches(\n state: EditorState,\n input: ListSketchesInput,\n): Promise<Record<string, unknown>> {\n const dir = input.directory\n ? state.resolvePath(input.directory)\n : state.workspacePath\n ? dirname(state.workspacePath)\n : null;\n if (!dir) {\n throw new Error(\"No workspace is currently open and no directory specified\");\n }\n\n // Verify directory exists\n try {\n const s = await stat(dir);\n if (!s.isDirectory()) {\n throw new Error(`Not a directory: '${dir}'`);\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"Not a directory\")) throw e;\n throw new Error(`Directory does not exist: '${dir}'`);\n }\n\n const recursive = input.recursive ?? false;\n const includeUnreferenced = input.includeUnreferenced !== false;\n\n // Get workspace file set for inWorkspace flag\n const wsFiles = new Set<string>();\n if (state.workspace) {\n for (const ref of state.workspace.sketches) {\n const absPath = state.resolveSketchPath(ref.file);\n wsFiles.add(absPath);\n }\n }\n\n // Scan directory\n const genartFiles = await scanGenartFiles(dir, recursive);\n const sketches: Record<string, unknown>[] = [];\n\n for (const filePath of genartFiles) {\n const inWorkspace = wsFiles.has(filePath);\n if (!includeUnreferenced && !inWorkspace) continue;\n\n const info = await tryParseGenart(filePath);\n if (!info) continue;\n\n sketches.push({\n id: info.id,\n title: info.title,\n renderer: info.renderer,\n canvas: info.canvas,\n parameterCount: info.parameterCount,\n colorCount: info.colorCount,\n path: info.path,\n inWorkspace,\n modified: info.modified,\n });\n }\n\n const inWorkspaceCount = sketches.filter(\n (s) => (s as { inWorkspace: boolean }).inWorkspace,\n ).length;\n\n return {\n success: true,\n directory: dir,\n sketches,\n total: sketches.length,\n inWorkspace: inWorkspaceCount,\n unreferenced: sketches.length - inWorkspaceCount,\n };\n}\n\n// ---------------------------------------------------------------------------\n// search_sketches\n// ---------------------------------------------------------------------------\n\nexport interface SearchSketchesInput {\n query?: string;\n renderer?: string;\n minParameters?: number;\n maxParameters?: number;\n canvasWidth?: number;\n canvasHeight?: number;\n hasPhilosophy?: boolean;\n skills?: string[];\n}\n\nexport async function searchSketches(\n state: EditorState,\n input: SearchSketchesInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n\n // Validate at least one filter\n const hasFilter =\n input.query !== undefined ||\n input.renderer !== undefined ||\n input.minParameters !== undefined ||\n input.maxParameters !== undefined ||\n input.canvasWidth !== undefined ||\n input.canvasHeight !== undefined ||\n input.hasPhilosophy !== undefined ||\n (input.skills !== undefined && input.skills.length > 0);\n\n if (!hasFilter) {\n throw new Error(\"At least one search filter is required\");\n }\n\n const matches: Record<string, unknown>[] = [];\n const filters: Record<string, unknown> = {};\n\n // Track applied filters\n if (input.query !== undefined) filters.query = input.query;\n if (input.renderer !== undefined) filters.renderer = input.renderer;\n if (input.minParameters !== undefined) filters.minParameters = input.minParameters;\n if (input.maxParameters !== undefined) filters.maxParameters = input.maxParameters;\n if (input.canvasWidth !== undefined) filters.canvasWidth = input.canvasWidth;\n if (input.canvasHeight !== undefined) filters.canvasHeight = input.canvasHeight;\n if (input.hasPhilosophy !== undefined) filters.hasPhilosophy = input.hasPhilosophy;\n if (input.skills !== undefined) filters.skills = input.skills;\n\n for (const [, loaded] of state.sketches) {\n const def = loaded.definition;\n\n // Apply filters\n if (input.query !== undefined) {\n if (!def.title.toLowerCase().includes(input.query.toLowerCase())) continue;\n }\n\n if (input.renderer !== undefined) {\n if (def.renderer.type !== input.renderer) continue;\n }\n\n if (input.minParameters !== undefined) {\n if (def.parameters.length < input.minParameters) continue;\n }\n\n if (input.maxParameters !== undefined) {\n if (def.parameters.length > input.maxParameters) continue;\n }\n\n if (input.canvasWidth !== undefined) {\n if (def.canvas.width !== input.canvasWidth) continue;\n }\n\n if (input.canvasHeight !== undefined) {\n if (def.canvas.height !== input.canvasHeight) continue;\n }\n\n if (input.hasPhilosophy !== undefined) {\n const has = !!def.philosophy;\n if (has !== input.hasPhilosophy) continue;\n }\n\n if (input.skills !== undefined && input.skills.length > 0) {\n const sketchSkills = new Set(def.skills ?? []);\n const hasAny = input.skills.some((s) => sketchSkills.has(s));\n if (!hasAny) continue;\n }\n\n matches.push({\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n snapshotCount: def.snapshots?.length ?? 0,\n hasPhilosophy: !!def.philosophy,\n skills: def.skills ?? [],\n });\n }\n\n return {\n success: true,\n matches,\n total: matches.length,\n filters,\n };\n}\n","/**\n * Merge tool.\n * merge_sketches\n */\n\nimport { basename, dirname, join } from \"path\";\nimport { writeFile } from \"fs/promises\";\nimport {\n serializeGenart,\n type SketchDefinition,\n type ParamDef,\n type ColorDef,\n type ThemeDef,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst VALID_STRATEGIES = [\"blend\", \"layer\", \"alternate\"] as const;\ntype MergeStrategy = (typeof VALID_STRATEGIES)[number];\n\n/** Merge parameters using the blend strategy: union with first-wins on conflicts. */\nfunction blendParameters(sources: SketchDefinition[]): ParamDef[] {\n const seen = new Set<string>();\n const result: ParamDef[] = [];\n\n for (const source of sources) {\n for (const param of source.parameters) {\n if (!seen.has(param.key)) {\n seen.add(param.key);\n result.push(param);\n }\n }\n }\n\n return result;\n}\n\n/** Merge parameters using the layer strategy: namespace per source. */\nfunction layerParameters(sources: SketchDefinition[]): ParamDef[] {\n const result: ParamDef[] = [];\n\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i]!;\n const prefix = `source${i + 1}_`;\n for (const param of source.parameters) {\n result.push({\n ...param,\n key: `${prefix}${param.key}`,\n label: `[${i + 1}] ${param.label}`,\n });\n }\n }\n\n return result;\n}\n\n/** Merge parameters using the alternate strategy: odd-indexed sources only. */\nfunction alternateParameters(sources: SketchDefinition[]): ParamDef[] {\n const seen = new Set<string>();\n const result: ParamDef[] = [];\n\n for (let i = 0; i < sources.length; i += 2) {\n const source = sources[i]!;\n for (const param of source.parameters) {\n if (!seen.has(param.key)) {\n seen.add(param.key);\n result.push(param);\n }\n }\n }\n\n return result;\n}\n\n/** Merge colors: union with first-wins on conflicts. */\nfunction mergeColors(sources: SketchDefinition[]): ColorDef[] {\n const seen = new Set<string>();\n const result: ColorDef[] = [];\n\n for (const source of sources) {\n for (const color of source.colors) {\n if (!seen.has(color.key)) {\n seen.add(color.key);\n result.push(color);\n }\n }\n }\n\n return result;\n}\n\n/** Merge colors for alternate strategy: even-indexed sources. */\nfunction alternateColors(sources: SketchDefinition[]): ColorDef[] {\n const seen = new Set<string>();\n const result: ColorDef[] = [];\n\n for (let i = 1; i < sources.length; i += 2) {\n const source = sources[i]!;\n for (const color of source.colors) {\n if (!seen.has(color.key)) {\n seen.add(color.key);\n result.push(color);\n }\n }\n }\n\n // If no even-indexed sources contributed colors, fall back to all sources\n if (result.length === 0) {\n return mergeColors(sources);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// merge_sketches\n// ---------------------------------------------------------------------------\n\nexport interface MergeSketchesInput {\n sourceIds: string[];\n newId: string;\n title: string;\n strategy?: string;\n renderer?: string;\n canvas?: { width?: number; height?: number };\n}\n\nexport async function mergeSketches(\n state: EditorState,\n input: MergeSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!input.sourceIds || input.sourceIds.length < 2) {\n throw new Error(\"At least 2 source sketches are required\");\n }\n\n // Validate strategy\n const strategy = (input.strategy ?? \"blend\") as string;\n if (!VALID_STRATEGIES.includes(strategy as MergeStrategy)) {\n throw new Error(\n `Unknown merge strategy: '${strategy}'. Valid strategies: ${VALID_STRATEGIES.join(\", \")}`,\n );\n }\n\n // Check for duplicate ID\n if (state.getSketch(input.newId)) {\n throw new Error(`Sketch with ID '${input.newId}' already exists`);\n }\n\n // Load all source sketches\n const sources: SketchDefinition[] = [];\n for (const id of input.sourceIds) {\n const loaded = state.requireSketch(id);\n sources.push(loaded.definition);\n }\n\n // Determine renderer and canvas\n const renderer = input.renderer ?? sources[0]!.renderer.type;\n const canvasWidth =\n input.canvas?.width ??\n Math.max(...sources.map((s) => s.canvas.width));\n const canvasHeight =\n input.canvas?.height ??\n Math.max(...sources.map((s) => s.canvas.height));\n\n // Merge parameters based on strategy\n let parameters: ParamDef[];\n let algorithm: string;\n let colors: ColorDef[];\n\n switch (strategy as MergeStrategy) {\n case \"layer\":\n parameters = layerParameters(sources);\n colors = mergeColors(sources);\n break;\n case \"alternate\":\n parameters = alternateParameters(sources);\n colors = alternateColors(sources);\n break;\n case \"blend\":\n default:\n parameters = blendParameters(sources);\n colors = mergeColors(sources);\n break;\n }\n\n // Empty algorithm placeholder for AI synthesis\n algorithm = `// Merged from: ${input.sourceIds.join(\", \")}\\n// Strategy: ${strategy}\\n// TODO: Write a unified algorithm combining the source concepts.\\n`;\n\n // Concatenate philosophies\n const philosophyParts = sources\n .filter((s) => s.philosophy)\n .map((s) => `## ${s.title}\\n\\n${s.philosophy}`);\n const philosophy =\n philosophyParts.length > 0 ? philosophyParts.join(\"\\n\\n---\\n\\n\") : undefined;\n\n // Merge themes (deduplicate by name)\n const themes: ThemeDef[] = [];\n const seenThemeNames = new Set<string>();\n for (const source of sources) {\n for (const theme of source.themes ?? []) {\n if (!seenThemeNames.has(theme.name)) {\n seenThemeNames.add(theme.name);\n themes.push(theme);\n }\n }\n }\n\n // Merge skills (union, deduplicated)\n const skills = [...new Set(sources.flatMap((s) => s.skills ?? []))];\n\n // Build initial state\n const params: Record<string, number> = {};\n for (const p of parameters) {\n params[p.key] = p.default;\n }\n const colorPalette = colors.map((c) => c.default);\n\n const timestamp = now();\n const newDef: SketchDefinition = {\n genart: \"1.1\",\n id: input.newId,\n title: input.title,\n created: timestamp,\n modified: timestamp,\n ...(skills.length > 0 ? { skills } : {}),\n renderer: { type: renderer, version: sources[0]!.renderer.version },\n canvas: { width: canvasWidth, height: canvasHeight },\n ...(philosophy ? { philosophy } : {}),\n parameters,\n colors,\n ...(themes.length > 0 ? { themes } : {}),\n state: {\n seed: Math.floor(Math.random() * 100000),\n params,\n colorPalette,\n },\n algorithm,\n };\n\n // Save to disk\n const wsDir = dirname(state.workspacePath!);\n const fileName = `${input.newId}.genart`;\n const filePath = join(wsDir, fileName);\n const json = serializeGenart(newDef);\n await writeFile(filePath, json, \"utf-8\");\n\n // Add to state\n state.sketches.set(input.newId, { definition: newDef, path: filePath });\n\n // Add to workspace\n const maxX = ws.sketches.reduce(\n (max, ref) => Math.max(max, ref.position.x),\n 0,\n );\n const newRef = {\n file: fileName,\n position: { x: maxX + 1400, y: 0 },\n };\n\n state.workspace = {\n ...ws,\n modified: timestamp,\n sketches: [...ws.sketches, newRef],\n };\n await state.saveWorkspace();\n state.emitMutation(\"sketch:created\", { id: input.newId });\n\n const crossRenderer = sources.some((s) => s.renderer.type !== renderer);\n\n return {\n success: true,\n sketchId: input.newId,\n title: input.title,\n path: filePath,\n renderer,\n strategy,\n sources: input.sourceIds,\n parameterCount: parameters.length,\n colorCount: colors.length,\n ...(crossRenderer\n ? {\n crossRendererNotice: `Source sketches use different renderers. The merged sketch targets '${renderer}' — the algorithm must be written for this renderer.`,\n }\n : {}),\n };\n}\n","/**\n * Snapshot layout tool.\n * snapshot_layout\n */\n\nimport { basename } from \"path\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// snapshot_layout\n// ---------------------------------------------------------------------------\n\nexport interface SnapshotLayoutInput {\n includeGroups?: boolean;\n includeState?: boolean;\n}\n\nexport async function snapshotLayout(\n state: EditorState,\n input: SnapshotLayoutInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const includeGroups = input.includeGroups !== false;\n const includeState = input.includeState === true;\n\n // Build sketch summaries\n const sketches: Record<string, unknown>[] = [];\n const rendererCounts: Record<string, number> = {};\n\n for (const ref of ws.sketches) {\n // Find the loaded sketch by matching file name\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === ref.file,\n );\n if (!loaded) continue;\n\n const def = loaded.definition;\n\n const entry: Record<string, unknown> = {\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n position: ref.position,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n snapshotCount: def.snapshots?.length ?? 0,\n locked: false,\n visible: true,\n };\n\n if (includeState) {\n entry.state = {\n seed: def.state.seed,\n params: def.state.params,\n colorPalette: def.state.colorPalette,\n };\n }\n\n sketches.push(entry);\n\n // Count renderers\n const rt = def.renderer.type;\n rendererCounts[rt] = (rendererCounts[rt] ?? 0) + 1;\n }\n\n // Compute bounding box\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n\n for (const sketch of sketches) {\n const pos = sketch.position as { x: number; y: number };\n const canvas = sketch.canvas as { width: number; height: number };\n if (pos.x < minX) minX = pos.x;\n if (pos.y < minY) minY = pos.y;\n if (pos.x + canvas.width > maxX) maxX = pos.x + canvas.width;\n if (pos.y + canvas.height > maxY) maxY = pos.y + canvas.height;\n }\n\n const boundingBox =\n sketches.length > 0\n ? { x: minX, y: minY, width: maxX - minX, height: maxY - minY }\n : { x: 0, y: 0, width: 0, height: 0 };\n\n // Build groups\n const groups: Record<string, unknown>[] = [];\n if (includeGroups && ws.groups) {\n for (const group of ws.groups) {\n // Map sketchFiles to sketch IDs\n const sketchIds: string[] = [];\n for (const file of group.sketchFiles) {\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === file,\n );\n if (loaded) {\n sketchIds.push(loaded.definition.id);\n }\n }\n\n groups.push({\n id: group.id,\n label: group.label,\n sketchIds,\n ...(group.color ? { color: group.color } : {}),\n });\n }\n }\n\n const result: Record<string, unknown> = {\n success: true,\n workspace: {\n id: ws.id,\n title: ws.title,\n viewport: ws.viewport,\n },\n sketches,\n boundingBox,\n totalSketches: sketches.length,\n rendererBreakdown: rendererCounts,\n };\n\n if (includeGroups) {\n result.groups = groups;\n }\n\n return result;\n}\n","/**\n * Design knowledge tools.\n * list_skills, load_skill, get_guidelines\n */\n\nimport { createDefaultSkillRegistry } from \"@genart-dev/core\";\n\nconst registry = createDefaultSkillRegistry();\n\n// ---------------------------------------------------------------------------\n// list_skills\n// ---------------------------------------------------------------------------\n\nexport interface ListSkillsInput {\n category?: string;\n}\n\nexport async function listSkills(\n input: ListSkillsInput,\n): Promise<Record<string, unknown>> {\n const skills = registry.list(input.category);\n\n return {\n success: true,\n skills: skills.map((s) => ({\n id: s.id,\n name: s.name,\n category: s.category,\n complexity: s.complexity,\n description: s.description,\n })),\n total: skills.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// load_skill\n// ---------------------------------------------------------------------------\n\nexport interface LoadSkillInput {\n skillId: string;\n renderer?: string;\n}\n\nexport async function loadSkill(\n input: LoadSkillInput,\n): Promise<Record<string, unknown>> {\n const skill = registry.get(input.skillId);\n\n if (!skill) {\n return {\n success: false,\n error: `Skill not found: '${input.skillId}'`,\n skill: null,\n };\n }\n\n const skillData: Record<string, unknown> = {\n id: skill.id,\n name: skill.name,\n category: skill.category,\n complexity: skill.complexity,\n description: skill.description,\n theory: skill.theory,\n principles: skill.principles,\n references: skill.references,\n suggestedParameters: skill.suggestedParameters ?? [],\n suggestedColors: skill.suggestedColors ?? [],\n };\n\n // Include renderer-specific example if requested and available\n if (input.renderer && skill.examples) {\n const example =\n skill.examples[input.renderer as keyof typeof skill.examples];\n if (example) {\n skillData[\"example\"] = example;\n }\n }\n\n return {\n success: true,\n skill: skillData,\n };\n}\n\n// ---------------------------------------------------------------------------\n// get_guidelines\n// ---------------------------------------------------------------------------\n\nexport interface GetGuidelinesInput {\n topic: string;\n renderer?: string;\n}\n\n/** Static guidelines for topics that don't map to skill categories. */\nconst STATIC_GUIDELINES: Record<string, string> = {\n parameters: `## Parameter Design Guidelines\n\n- Keep parameter count between 3 and 8 for usability\n- Use intuitive ranges: 0-1 for normalized values, actual units for physical quantities\n- Set defaults that produce an interesting (not extreme) result\n- Group related parameters in tabs for complex sketches\n- Name parameters descriptively: \"noiseScale\" not \"ns\"\n- Step size should match visual sensitivity: fine for color, coarse for counts`,\n\n animation: `## Animation Guidelines\n\n- Use requestAnimationFrame for smooth 60fps animation\n- Separate initialization from per-frame updates\n- Provide pause/resume control for resource management\n- Use time-based animation (not frame-count) for consistent speed\n- Consider using easing functions for natural motion\n- Keep draw loops lightweight — precompute what you can in setup`,\n\n performance: `## Performance Guidelines\n\n- Only the selected artboard should run live; others should pause\n- Use offscreen rendering for thumbnails\n- Dispose WebGL contexts and GPU resources when unmounting\n- Limit particle/element counts with parameters\n- Use spatial data structures (quadtree, grid) for collision/proximity\n- Profile with Chrome DevTools before optimizing`,\n};\n\nexport async function getGuidelines(\n input: GetGuidelinesInput,\n): Promise<Record<string, unknown>> {\n const topic = input.topic;\n\n // Check for static guidelines first\n if (STATIC_GUIDELINES[topic]) {\n return {\n success: true,\n topic,\n guidelines: STATIC_GUIDELINES[topic],\n relatedSkills: [],\n };\n }\n\n // Map topic to skill category\n const categoryMap: Record<string, string> = {\n composition: \"composition\",\n color: \"color\",\n colours: \"color\",\n layout: \"composition\",\n palette: \"color\",\n };\n\n const category = categoryMap[topic];\n if (!category) {\n return {\n success: false,\n topic,\n error: `No guidelines found for topic: '${topic}'. Available topics: composition, color, parameters, animation, performance`,\n guidelines: null,\n relatedSkills: [],\n };\n }\n\n const skills = registry.list(category);\n const guidelines = skills\n .map(\n (s) =>\n `### ${s.name}\\n\\n${s.description}\\n\\n**Principles:**\\n${s.principles.map((p) => `- ${p}`).join(\"\\n\")}`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n success: true,\n topic,\n guidelines: `## ${category.charAt(0).toUpperCase() + category.slice(1)} Guidelines\\n\\n${guidelines}`,\n relatedSkills: skills.map((s) => ({\n id: s.id,\n name: s.name,\n complexity: s.complexity,\n })),\n };\n}\n","/**\n * Component tools.\n * list_components, add_component, remove_component\n */\n\nimport { writeFile } from \"fs/promises\";\nimport {\n COMPONENT_REGISTRY,\n resolveComponents,\n serializeGenart,\n type ComponentCategory,\n type ComponentEntry,\n type RendererType,\n type SketchComponentDef,\n type SketchComponentValue,\n type SketchDefinition,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Shared constants\n// ---------------------------------------------------------------------------\n\nconst VALID_RENDERERS: readonly RendererType[] = [\n \"p5\",\n \"three\",\n \"glsl\",\n \"canvas2d\",\n \"svg\",\n];\n\n/** Maps renderer types to their target (\"js\" or \"glsl\"). */\nconst RENDERER_TARGET: Record<RendererType, \"js\" | \"glsl\"> = {\n p5: \"js\",\n three: \"js\",\n canvas2d: \"js\",\n svg: \"js\",\n glsl: \"glsl\",\n};\n\n// ---------------------------------------------------------------------------\n// list_components\n// ---------------------------------------------------------------------------\n\nexport interface ListComponentsInput {\n renderer?: string;\n category?: string;\n}\n\nexport async function listComponents(\n _state: EditorState,\n input: ListComponentsInput,\n): Promise<Record<string, unknown>> {\n let entries = Object.values(COMPONENT_REGISTRY);\n\n // Filter by renderer compatibility\n if (input.renderer) {\n const renderer = input.renderer as RendererType;\n const target = RENDERER_TARGET[renderer];\n if (!target) {\n throw new Error(\n `Unknown renderer type: '${input.renderer}'. Valid types: ${VALID_RENDERERS.join(\", \")}`,\n );\n }\n entries = entries.filter(\n (e) =>\n e.target === target &&\n (e.renderers.length === 0 || e.renderers.includes(renderer)),\n );\n }\n\n // Filter by category\n if (input.category) {\n const cat = input.category as ComponentCategory;\n entries = entries.filter((e) => e.category === cat);\n }\n\n // Sort by category then name\n entries.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category);\n if (catCmp !== 0) return catCmp;\n return a.name.localeCompare(b.name);\n });\n\n const components = entries.map((e) => ({\n name: e.name,\n version: e.version,\n category: e.category,\n target: e.target,\n exports: [...e.exports],\n dependencies: [...e.dependencies],\n description: e.description,\n }));\n\n return {\n count: components.length,\n components,\n };\n}\n\n// ---------------------------------------------------------------------------\n// add_component\n// ---------------------------------------------------------------------------\n\nexport interface AddComponentInput {\n sketchId: string;\n component: string;\n version?: string;\n}\n\nexport async function addComponent(\n state: EditorState,\n input: AddComponentInput,\n): Promise<Record<string, unknown>> {\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n const renderer = def.renderer.type;\n\n // Validate component exists\n const entry = COMPONENT_REGISTRY[input.component];\n if (!entry) {\n throw new Error(`Unknown component: \"${input.component}\"`);\n }\n\n // Validate renderer compatibility\n const target = RENDERER_TARGET[renderer];\n if (entry.target !== target) {\n throw new Error(\n `Component \"${input.component}\" has target \"${entry.target}\" but renderer \"${renderer}\" requires target \"${target}\"`,\n );\n }\n if (entry.renderers.length > 0 && !entry.renderers.includes(renderer)) {\n throw new Error(\n `Component \"${input.component}\" is not compatible with renderer \"${renderer}\". Compatible: ${entry.renderers.join(\", \")}`,\n );\n }\n\n // Build the component map for resolution: existing + new\n const existingComponents: Record<string, string> = {};\n if (def.components) {\n for (const [name, value] of Object.entries(def.components)) {\n if (typeof value === \"string\") {\n existingComponents[name] = value;\n } else if (value.version) {\n existingComponents[name] = value.version;\n }\n }\n }\n\n // Don't overwrite if already present\n if (existingComponents[input.component]) {\n throw new Error(\n `Component \"${input.component}\" is already present in sketch \"${input.sketchId}\"`,\n );\n }\n\n // Add the new component\n existingComponents[input.component] = input.version ?? \"^1.0.0\";\n\n // Resolve all components (validates and pulls transitive deps)\n const resolved = resolveComponents(existingComponents, renderer);\n\n // Build the resolved components record\n const resolvedRecord: Record<string, SketchComponentDef> = {};\n for (const rc of resolved) {\n resolvedRecord[rc.name] = {\n version: rc.version,\n code: rc.code,\n exports: [...rc.exports],\n };\n }\n\n // Determine which were newly added\n const previousNames = new Set(\n def.components ? Object.keys(def.components) : [],\n );\n const added = resolved\n .map((rc) => rc.name)\n .filter((name) => !previousNames.has(name));\n\n // Update sketch definition\n const newDef: SketchDefinition = {\n ...def,\n genart: \"1.2\",\n modified: new Date().toISOString(),\n components: resolvedRecord,\n };\n\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", {\n id: input.sketchId,\n updated: [\"components\"],\n });\n\n return {\n success: true,\n sketchId: input.sketchId,\n components: resolvedRecord,\n added,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// remove_component\n// ---------------------------------------------------------------------------\n\nexport interface RemoveComponentInput {\n sketchId: string;\n component: string;\n}\n\nexport async function removeComponent(\n state: EditorState,\n input: RemoveComponentInput,\n): Promise<Record<string, unknown>> {\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n if (!def.components || !def.components[input.component]) {\n throw new Error(\n `Component \"${input.component}\" is not present in sketch \"${input.sketchId}\"`,\n );\n }\n\n // Check if any remaining components depend on the one being removed\n const remaining = { ...def.components };\n delete remaining[input.component];\n\n for (const [name, value] of Object.entries(remaining)) {\n // Look up the registry entry to check dependencies\n const entry = COMPONENT_REGISTRY[name];\n if (entry && entry.dependencies.includes(input.component)) {\n throw new Error(\n `Cannot remove \"${input.component}\": component \"${name}\" depends on it`,\n );\n }\n }\n\n // Check if algorithm references any of the component's exports\n let warning: string | undefined;\n const removedValue = def.components[input.component]!;\n const exports: readonly string[] =\n typeof removedValue === \"string\"\n ? COMPONENT_REGISTRY[input.component]?.exports ?? []\n : removedValue.exports ?? [];\n\n const usedExports = exports.filter((exp) => def.algorithm.includes(exp));\n if (usedExports.length > 0) {\n warning = `Algorithm may reference these exports from \"${input.component}\": ${usedExports.join(\", \")}. Review your algorithm after removal.`;\n }\n\n // Also remove any transitive-only deps that were pulled in by this component\n // and are no longer needed by remaining components\n const removed = [input.component];\n const neededDeps = new Set<string>();\n\n // Collect all deps still needed by remaining components\n for (const name of Object.keys(remaining)) {\n const entry = COMPONENT_REGISTRY[name];\n if (entry) {\n collectTransitiveDeps(name, neededDeps);\n }\n }\n\n // Remove orphaned transitive deps\n for (const name of Object.keys(remaining)) {\n if (!neededDeps.has(name) && !isDirectComponent(name, remaining)) {\n // This was a transitive dep only needed by the removed component\n delete remaining[name];\n removed.push(name);\n }\n }\n\n // Update sketch definition\n const hasRemaining = Object.keys(remaining).length > 0;\n const newDef: SketchDefinition = {\n ...def,\n modified: new Date().toISOString(),\n ...(hasRemaining ? { components: remaining } : { components: undefined }),\n };\n\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", {\n id: input.sketchId,\n updated: [\"components\"],\n });\n\n return {\n success: true,\n sketchId: input.sketchId,\n removed,\n ...(warning ? { warning } : {}),\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Recursively collect transitive dependency names for a component. */\nfunction collectTransitiveDeps(name: string, deps: Set<string>): void {\n const entry = COMPONENT_REGISTRY[name];\n if (!entry) return;\n deps.add(name);\n for (const dep of entry.dependencies) {\n if (!deps.has(dep)) {\n collectTransitiveDeps(dep, deps);\n }\n }\n}\n\n/** Check if a component name was directly added (vs. only a transitive dep). */\nfunction isDirectComponent(\n name: string,\n components: Record<string, SketchComponentValue>,\n): boolean {\n // A component is \"direct\" if it was in the original map.\n // Since we only have the current map, treat all remaining as direct\n // unless they only appear as deps of other remaining components.\n // For simplicity in v1, we keep all remaining components.\n return name in components;\n}\n","/**\n * Capture tools.\n * capture_screenshot, capture_batch\n *\n * Two-tier capture: each capture produces a full-res PNG for the preview file\n * and a small JPEG for inline AI viewing via MCP native image blocks.\n */\n\nimport { writeFile } from \"fs/promises\";\nimport {\n createDefaultRegistry,\n type SketchDefinition,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\nimport { captureHtmlMulti, type MultiCaptureResult } from \"../capture/headless.js\";\n\nconst registry = createDefaultRegistry();\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Build a SketchDefinition copy with optional seed/param overrides (no mutation). */\nfunction applyOverrides(\n sketch: SketchDefinition,\n overrides: { seed?: number; params?: Record<string, number> },\n): SketchDefinition {\n if (overrides.seed === undefined && overrides.params === undefined) {\n return sketch;\n }\n\n const newState = {\n seed: overrides.seed ?? sketch.state.seed,\n params: overrides.params\n ? { ...sketch.state.params, ...overrides.params }\n : sketch.state.params,\n colorPalette: sketch.state.colorPalette,\n };\n\n return { ...sketch, state: newState };\n}\n\n/** Generate standalone HTML for a sketch with optional overrides. */\nfunction generateSketchHtml(\n sketch: SketchDefinition,\n opts: { seed?: number; params?: Record<string, number> },\n): string {\n const effective = applyOverrides(sketch, opts);\n const adapter = registry.resolve(effective.renderer.type);\n if (!adapter) {\n throw new Error(\n `Unsupported renderer type: '${effective.renderer.type}'`,\n );\n }\n return adapter.generateStandaloneHTML(effective);\n}\n\n/** Derive the preview PNG path from a sketch file path: foo.genart → foo.png */\nfunction derivePreviewPath(sketchPath: string): string {\n return sketchPath.replace(/\\.genart$/, \".png\");\n}\n\n// ---------------------------------------------------------------------------\n// capture_screenshot\n// ---------------------------------------------------------------------------\n\nexport interface CaptureScreenshotInput {\n target?: \"selected\" | \"sketch\";\n sketchId?: string;\n width?: number;\n height?: number;\n seed?: number;\n params?: Record<string, number>;\n previewSize?: number;\n}\n\n/** Structured result from captureScreenshot. */\nexport interface CaptureScreenshotResult {\n /** JSON-safe metadata for the text content block. */\n metadata: Record<string, unknown>;\n /** Small JPEG as base64 string for the MCP image content block. */\n previewJpegBase64: string;\n}\n\nexport async function captureScreenshot(\n state: EditorState,\n input: CaptureScreenshotInput,\n): Promise<CaptureScreenshotResult> {\n state.requireWorkspace();\n\n const target = input.target ?? \"selected\";\n\n let sketchId: string;\n\n if (target === \"selected\") {\n if (state.selection.size === 0) {\n throw new Error(\"No sketch is currently selected\");\n }\n sketchId = [...state.selection][0]!;\n } else {\n if (!input.sketchId) {\n throw new Error(\"sketchId is required when target is 'sketch'\");\n }\n sketchId = input.sketchId;\n }\n\n const loaded = state.requireSketch(sketchId);\n const sketch = loaded.definition;\n\n try {\n const html = generateSketchHtml(sketch, {\n seed: input.seed,\n params: input.params,\n });\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n const inlineSize = input.previewSize ?? 400;\n\n const multi = await captureHtmlMulti({\n html,\n width,\n height,\n inlineSize,\n });\n\n // Auto-save preview PNG and build metadata\n const previewPath = derivePreviewPath(loaded.path);\n const metadata = await buildScreenshotMetadata(state, multi, {\n target,\n sketchId,\n seed: input.seed ?? sketch.state.seed,\n previewPath,\n });\n\n const previewJpegBase64 = Buffer.from(multi.inlineJpeg).toString(\"base64\");\n\n return { metadata, previewJpegBase64 };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Renderer error for '${sketchId}': ${msg}`);\n }\n}\n\n/** Build metadata object and handle file writing / remoteMode content. */\nasync function buildScreenshotMetadata(\n state: EditorState,\n multi: MultiCaptureResult,\n info: {\n target: string;\n sketchId: string;\n seed: number;\n previewPath: string;\n },\n): Promise<Record<string, unknown>> {\n const metadata: Record<string, unknown> = {\n success: true,\n target: info.target,\n sketchId: info.sketchId,\n width: multi.previewWidth,\n height: multi.previewHeight,\n seed: info.seed,\n previewPath: info.previewPath,\n };\n\n if (!state.remoteMode) {\n // Local mode: write preview PNG directly to disk\n await writeFile(info.previewPath, multi.previewPng);\n metadata.savedPreviewTo = info.previewPath;\n }\n // Remote mode: skip preview file — the inline JPEG image block is sufficient\n // for AI analysis, and shuttling a full PNG as base64 text wastes tokens.\n\n return metadata;\n}\n\n// ---------------------------------------------------------------------------\n// capture_batch\n// ---------------------------------------------------------------------------\n\nexport interface CaptureBatchInput {\n sketchIds?: string[];\n width?: number;\n height?: number;\n seed?: number;\n previewSize?: number;\n}\n\n/** Structured result for a single sketch in a batch capture. */\nexport interface BatchItemResult {\n metadata: Record<string, unknown>;\n inlineJpegBase64: string;\n}\n\nexport interface CaptureBatchResult {\n /** JSON-safe batch metadata for the text content block. */\n metadata: Record<string, unknown>;\n /** Per-sketch inline JPEG base64 strings for MCP image content blocks. */\n items: BatchItemResult[];\n}\n\nexport async function captureBatch(\n state: EditorState,\n input: CaptureBatchInput,\n): Promise<CaptureBatchResult> {\n state.requireWorkspace();\n\n const ids = input.sketchIds ?? [...state.sketches.keys()];\n if (ids.length === 0) {\n throw new Error(\"No sketches to capture\");\n }\n\n // Validate all sketch IDs exist before starting\n for (const id of ids) {\n state.requireSketch(id);\n }\n\n // Use smaller inline size for batches to keep total response manageable\n const inlineSize = input.previewSize ?? 200;\n\n const items: BatchItemResult[] = [];\n const errors: Record<string, unknown>[] = [];\n\n const promises = ids.map(async (id) => {\n const loaded = state.requireSketch(id);\n const sketch = loaded.definition;\n try {\n const html = generateSketchHtml(sketch, { seed: input.seed });\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n const multi = await captureHtmlMulti({\n html,\n width,\n height,\n inlineSize,\n });\n\n const previewPath = derivePreviewPath(loaded.path);\n const itemMetadata = await buildScreenshotMetadata(state, multi, {\n target: \"sketch\",\n sketchId: id,\n seed: input.seed ?? sketch.state.seed,\n previewPath,\n });\n\n items.push({\n metadata: itemMetadata,\n inlineJpegBase64: Buffer.from(multi.inlineJpeg).toString(\"base64\"),\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n errors.push({ sketchId: id, error: msg });\n }\n });\n\n await Promise.all(promises);\n\n return {\n metadata: {\n success: errors.length === 0,\n total: ids.length,\n captured: items.length,\n failed: errors.length,\n errors: errors.length > 0 ? errors : undefined,\n },\n items,\n };\n}\n","/**\n * Headless capture — renders a standalone HTML page to a PNG screenshot\n * using Puppeteer's headless Chrome.\n *\n * Puppeteer is an optional peer dependency. If not installed, capture\n * functions will throw a clear error message.\n */\n\ntype PuppeteerModule = typeof import(\"puppeteer\");\ntype Browser = Awaited<ReturnType<PuppeteerModule[\"launch\"]>>;\n\n/** Cached puppeteer default export (loaded on first use). */\nlet cachedModule: PuppeteerModule | null = null;\n\n/** Dynamically load puppeteer (optional peer dep). */\nasync function loadPuppeteer(): Promise<PuppeteerModule> {\n if (!cachedModule) {\n try {\n // Dynamic import returns { default: puppeteer } for CJS interop\n const mod = await import(\"puppeteer\") as { default?: PuppeteerModule } & PuppeteerModule;\n cachedModule = mod.default ?? mod;\n } catch {\n throw new Error(\n \"Puppeteer is required for screenshot capture. Install it with: npm install puppeteer\",\n );\n }\n }\n return cachedModule;\n}\n\n/** Options for capturing a screenshot of an HTML page. */\nexport interface CaptureOptions {\n /** Full HTML source to render. */\n html: string;\n /** Viewport / output width in pixels. */\n width: number;\n /** Viewport / output height in pixels. */\n height: number;\n /** Time in ms to wait after page load before screenshotting (default: 500). */\n waitMs?: number;\n /** Image format (default: \"png\"). */\n imageType?: \"png\" | \"jpeg\";\n /** JPEG quality 0-100 (only used when imageType is \"jpeg\", default: 80). */\n quality?: number;\n}\n\n/** Result of a headless capture. */\nexport interface CaptureResult {\n /** Raw image bytes. */\n bytes: Uint8Array;\n /** MIME type of the captured image. */\n mimeType: \"image/png\" | \"image/jpeg\";\n /** Width of the captured image. */\n width: number;\n /** Height of the captured image. */\n height: number;\n}\n\n/** Result of a two-tier capture (preview PNG + inline JPEG). */\nexport interface MultiCaptureResult {\n /** Full-resolution PNG for the preview file. */\n previewPng: Uint8Array;\n previewWidth: number;\n previewHeight: number;\n /** Small JPEG for inline AI viewing. */\n inlineJpeg: Uint8Array;\n inlineWidth: number;\n inlineHeight: number;\n}\n\n/** Shared browser instance (lazy singleton). */\nlet browserInstance: Browser | null = null;\n\n/** Get or launch the shared headless browser. */\nasync function getBrowser(): Promise<Browser> {\n if (browserInstance && browserInstance.connected) {\n return browserInstance;\n }\n const puppeteer = await loadPuppeteer();\n browserInstance = await puppeteer.launch({\n headless: true,\n executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || undefined,\n args: [\n \"--no-sandbox\",\n \"--disable-setuid-sandbox\",\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n \"--single-process\",\n ],\n });\n return browserInstance;\n}\n\n/**\n * Render an HTML string to a PNG image using headless Chrome.\n * The page is loaded with the given viewport dimensions, then screenshotted\n * after a brief wait to allow the sketch to render its first frame.\n */\nexport async function captureHtml(options: CaptureOptions): Promise<CaptureResult> {\n const { html, width, height, waitMs = 500, imageType = \"png\", quality } = options;\n\n const browser = await getBrowser();\n const page = await browser.newPage();\n\n try {\n await page.setViewport({ width, height, deviceScaleFactor: 1 });\n await page.setContent(html, { waitUntil: \"domcontentloaded\", timeout: 30_000 });\n\n // Wait for the sketch to render its first frame\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n\n const buffer = await page.screenshot({\n type: imageType,\n clip: { x: 0, y: 0, width, height },\n ...(imageType === \"jpeg\" && quality !== undefined ? { quality } : {}),\n });\n const bytes = new Uint8Array(buffer);\n const mimeType = imageType === \"jpeg\" ? \"image/jpeg\" as const : \"image/png\" as const;\n\n return { bytes, mimeType, width, height };\n } finally {\n await page.close();\n }\n}\n\n/**\n * Two-tier capture: loads the page once and takes two screenshots.\n * 1. Full-res PNG at the given dimensions (for preview file)\n * 2. Resized JPEG at inlineSize (for inline AI viewing, low token cost)\n */\nexport async function captureHtmlMulti(options: {\n html: string;\n width: number;\n height: number;\n waitMs?: number;\n inlineSize?: number;\n jpegQuality?: number;\n}): Promise<MultiCaptureResult> {\n const { html, width, height, waitMs = 500, inlineSize = 400, jpegQuality = 70 } = options;\n\n const browser = await getBrowser();\n const page = await browser.newPage();\n\n try {\n // First capture: full-res PNG at sketch dimensions\n await page.setViewport({ width, height, deviceScaleFactor: 1 });\n await page.setContent(html, { waitUntil: \"domcontentloaded\", timeout: 30_000 });\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n\n const pngBuffer = await page.screenshot({\n type: \"png\",\n clip: { x: 0, y: 0, width, height },\n });\n const previewPng = new Uint8Array(pngBuffer);\n\n // Second capture: small JPEG for inline AI viewing\n // Scale to fit within inlineSize, preserving aspect ratio\n const scale = Math.min(inlineSize / width, inlineSize / height, 1);\n const inlineWidth = Math.round(width * scale);\n const inlineHeight = Math.round(height * scale);\n\n await page.setViewport({ width: inlineWidth, height: inlineHeight, deviceScaleFactor: 1 });\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const jpegBuffer = await page.screenshot({\n type: \"jpeg\",\n quality: jpegQuality,\n clip: { x: 0, y: 0, width: inlineWidth, height: inlineHeight },\n });\n const inlineJpeg = new Uint8Array(jpegBuffer);\n\n return {\n previewPng,\n previewWidth: width,\n previewHeight: height,\n inlineJpeg,\n inlineWidth,\n inlineHeight,\n };\n } finally {\n await page.close();\n }\n}\n\n/** Close the shared browser instance. Call on server shutdown. */\nexport async function closeBrowser(): Promise<void> {\n if (browserInstance) {\n await browserInstance.close();\n browserInstance = null;\n }\n}\n","/**\n * Export tool.\n * export_sketch — exports a sketch as html, png, algorithm, or zip.\n */\n\nimport { createWriteStream } from \"fs\";\nimport { stat, writeFile } from \"fs/promises\";\nimport { dirname, extname } from \"path\";\nimport archiver from \"archiver\";\nimport {\n createDefaultRegistry,\n serializeGenart,\n type SketchDefinition,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\nimport { captureHtml } from \"../capture/headless.js\";\n\nconst registry = createDefaultRegistry();\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Verify the parent directory exists and the output path doesn't already exist. */\nasync function validateOutputPath(outputPath: string): Promise<void> {\n const parentDir = dirname(outputPath);\n try {\n const s = await stat(parentDir);\n if (!s.isDirectory()) {\n throw new Error(`Parent directory does not exist: ${parentDir}`);\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"Parent directory\")) throw e;\n throw new Error(`Parent directory does not exist: ${parentDir}`);\n }\n\n try {\n await stat(outputPath);\n // If stat succeeds, file exists\n throw new Error(\n `File already exists at ${outputPath}. Delete it first or use a different path.`,\n );\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"File already exists\")) throw e;\n // ENOENT is expected — file doesn't exist yet\n }\n}\n\n/** Get the algorithm file extension based on renderer type. */\nfunction algorithmExtension(rendererType: string): string {\n return rendererType === \"glsl\" ? \".glsl\" : \".js\";\n}\n\n/** Build a sketch copy with optional overrides (no mutation). */\nfunction applyOverrides(\n sketch: SketchDefinition,\n overrides: { seed?: number; params?: Record<string, number> },\n): SketchDefinition {\n if (overrides.seed === undefined && overrides.params === undefined) {\n return sketch;\n }\n const newState = {\n seed: overrides.seed ?? sketch.state.seed,\n params: overrides.params\n ? { ...sketch.state.params, ...overrides.params }\n : sketch.state.params,\n colorPalette: sketch.state.colorPalette,\n };\n return { ...sketch, state: newState };\n}\n\n// ---------------------------------------------------------------------------\n// export_sketch\n// ---------------------------------------------------------------------------\n\nexport interface ExportSketchInput {\n sketchId: string;\n format: \"html\" | \"png\" | \"svg\" | \"algorithm\" | \"zip\";\n outputPath: string;\n width?: number;\n height?: number;\n seed?: number;\n params?: Record<string, number>;\n}\n\nexport async function exportSketch(\n state: EditorState,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n\n const loaded = state.requireSketch(input.sketchId);\n const sketch = applyOverrides(loaded.definition, {\n seed: input.seed,\n params: input.params,\n });\n\n await validateOutputPath(input.outputPath);\n\n const adapter = registry.resolve(sketch.renderer.type);\n if (!adapter) {\n throw new Error(\n `Unsupported renderer type: '${sketch.renderer.type}'`,\n );\n }\n\n switch (input.format) {\n case \"html\":\n return await exportHtml(sketch, input.outputPath);\n\n case \"png\":\n return await exportPng(sketch, input);\n\n case \"svg\":\n return await exportSvg(sketch, input);\n\n case \"algorithm\":\n return await exportAlgorithm(sketch, input.outputPath);\n\n case \"zip\":\n return await exportZip(sketch, input);\n\n default:\n throw new Error(`Unsupported export format: '${input.format}'`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Format exporters\n// ---------------------------------------------------------------------------\n\nasync function exportHtml(\n sketch: SketchDefinition,\n outputPath: string,\n): Promise<Record<string, unknown>> {\n const adapter = registry.resolve(sketch.renderer.type)!;\n const html = adapter.generateStandaloneHTML(sketch);\n const content = Buffer.from(html, \"utf-8\");\n await writeFile(outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"html\",\n outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n };\n}\n\nasync function exportPng(\n sketch: SketchDefinition,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n const adapter = registry.resolve(sketch.renderer.type)!;\n const html = adapter.generateStandaloneHTML(sketch);\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n const result = await captureHtml({ html, width, height });\n await writeFile(input.outputPath, result.bytes);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"png\",\n outputPath: input.outputPath,\n fileSize: result.bytes.byteLength,\n renderer: sketch.renderer.type,\n };\n}\n\nasync function exportSvg(\n sketch: SketchDefinition,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n if (sketch.renderer.type === \"svg\") {\n // For SVG renderer, use the algorithm as raw SVG output\n const content = Buffer.from(sketch.algorithm, \"utf-8\");\n await writeFile(input.outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"svg\",\n outputPath: input.outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n notice: null,\n };\n }\n\n // For non-SVG renderers, rasterize to PNG and embed in SVG container\n const adapter = registry.resolve(sketch.renderer.type)!;\n const html = adapter.generateStandaloneHTML(sketch);\n const result = await captureHtml({ html, width, height });\n const b64 = Buffer.from(result.bytes).toString(\"base64\");\n\n const svg = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <image width=\"${width}\" height=\"${height}\"\n href=\"data:image/png;base64,${b64}\"/>\n</svg>`;\n\n const content = Buffer.from(svg, \"utf-8\");\n await writeFile(input.outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"svg\",\n outputPath: input.outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n notice: \"Non-SVG renderer — rasterized PNG embedded in SVG container\",\n };\n}\n\nasync function exportAlgorithm(\n sketch: SketchDefinition,\n outputPath: string,\n): Promise<Record<string, unknown>> {\n const content = Buffer.from(sketch.algorithm, \"utf-8\");\n await writeFile(outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"algorithm\",\n outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n };\n}\n\nasync function exportZip(\n sketch: SketchDefinition,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n const adapter = registry.resolve(sketch.renderer.type)!;\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n // Generate all artifacts\n const html = adapter.generateStandaloneHTML(sketch);\n const genartJson = serializeGenart(sketch);\n const algorithm = sketch.algorithm;\n const algExt = algorithmExtension(sketch.renderer.type);\n\n // Capture PNG\n const captureResult = await captureHtml({ html, width, height });\n\n // Write zip\n const output = createWriteStream(input.outputPath);\n const archive = archiver(\"zip\", { zlib: { level: 9 } });\n\n const finished = new Promise<void>((resolve, reject) => {\n output.on(\"close\", resolve);\n archive.on(\"error\", reject);\n });\n\n archive.pipe(output);\n archive.append(html, { name: `${sketch.id}.html` });\n archive.append(Buffer.from(captureResult.bytes), { name: `${sketch.id}.png` });\n archive.append(algorithm, { name: `${sketch.id}${algExt}` });\n archive.append(genartJson, { name: `${sketch.id}.genart` });\n await archive.finalize();\n await finished;\n\n // Get final file size\n const s = await stat(input.outputPath);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"zip\",\n outputPath: input.outputPath,\n fileSize: s.size,\n renderer: sketch.renderer.type,\n contents: [\n `${sketch.id}.html`,\n `${sketch.id}.png`,\n `${sketch.id}${algExt}`,\n `${sketch.id}.genart`,\n ],\n };\n}\n","/**\n * MCP resource registration.\n * Resources are read-only data endpoints exposed to AI clients.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CANVAS_PRESETS,\n createDefaultRegistry,\n createDefaultSkillRegistry,\n type RendererType,\n} from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\n\n/** Register all MCP resources on the server. */\nexport function registerResources(\n server: McpServer,\n state: EditorState,\n): void {\n registerSkillsResource(server);\n registerCanvasPresetsResource(server);\n registerGalleryResource(server, state);\n registerRenderersResource(server);\n}\n\n// ---------------------------------------------------------------------------\n// genart://skills — design knowledge skills listing\n// ---------------------------------------------------------------------------\n\nfunction registerSkillsResource(server: McpServer): void {\n const skillRegistry = createDefaultSkillRegistry();\n\n server.resource(\n \"skills\",\n \"genart://skills\",\n {\n description:\n \"List available design knowledge skills with id, name, category, complexity, and description.\",\n mimeType: \"application/json\",\n },\n async () => {\n const skills = skillRegistry.list().map((s) => ({\n id: s.id,\n name: s.name,\n category: s.category,\n complexity: s.complexity,\n description: s.description,\n }));\n\n return {\n contents: [\n {\n uri: \"genart://skills\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n skills,\n total: skills.length,\n categories: skillRegistry.categories(),\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// genart://presets/canvas — canvas dimension presets\n// ---------------------------------------------------------------------------\n\nfunction registerCanvasPresetsResource(server: McpServer): void {\n server.resource(\n \"canvas-presets\",\n \"genart://presets/canvas\",\n {\n description:\n \"List all built-in canvas dimension presets with id, label, category, width, and height.\",\n mimeType: \"application/json\",\n },\n async () => ({\n contents: [\n {\n uri: \"genart://presets/canvas\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n presets: CANVAS_PRESETS.map((p) => ({\n id: p.id,\n label: p.label,\n category: p.category,\n width: p.width,\n height: p.height,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n }),\n );\n}\n\n// ---------------------------------------------------------------------------\n// genart://gallery — loaded sketches with metadata summaries\n// ---------------------------------------------------------------------------\n\nfunction registerGalleryResource(\n server: McpServer,\n state: EditorState,\n): void {\n server.resource(\n \"gallery\",\n \"genart://gallery\",\n {\n description:\n \"List all loaded sketches in the active workspace with metadata summaries.\",\n mimeType: \"application/json\",\n },\n async () => {\n const sketches = [...state.sketches.values()].map(({ definition, path }) => ({\n id: definition.id,\n title: definition.title,\n renderer: definition.renderer,\n canvas: definition.canvas,\n parameterCount: definition.parameters?.length ?? 0,\n colorCount: definition.colors?.length ?? 0,\n hasPhilosophy: !!definition.philosophy,\n seed: definition.seed,\n path,\n }));\n\n return {\n contents: [\n {\n uri: \"genart://gallery\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n workspacePath: state.workspacePath,\n sketchCount: sketches.length,\n sketches,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// genart://renderers — available renderers with metadata\n// ---------------------------------------------------------------------------\n\nfunction registerRenderersResource(server: McpServer): void {\n const registry = createDefaultRegistry();\n\n server.resource(\n \"renderers\",\n \"genart://renderers\",\n {\n description:\n \"List all available renderer types with display name, algorithm language, and runtime dependencies.\",\n mimeType: \"application/json\",\n },\n async () => {\n const types = registry.list();\n const renderers = types.map((type: RendererType) => {\n const adapter = registry.resolve(type);\n return {\n type: adapter.type,\n displayName: adapter.displayName,\n algorithmLanguage: adapter.algorithmLanguage,\n dependencies: adapter.getRuntimeDependencies().map((dep) => ({\n name: dep.name,\n version: dep.version,\n cdnUrl: dep.cdnUrl,\n })),\n };\n });\n\n const defaultAdapter = registry.getDefault();\n\n return {\n contents: [\n {\n uri: \"genart://renderers\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n defaultRenderer: defaultAdapter.type,\n renderers,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n","/**\n * MCP prompt registration.\n * Prompts are structured prompt templates exposed to AI clients.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { EditorState } from \"../state.js\";\n\n/** Register all MCP prompts on the server. */\nexport function registerPrompts(\n server: McpServer,\n state: EditorState,\n): void {\n registerCreateGenerativeArt(server);\n registerExploreVariations(server, state);\n registerApplyDesignTheory(server, state);\n}\n\n// ---------------------------------------------------------------------------\n// create-generative-art — structured prompt for creating new generative art\n// ---------------------------------------------------------------------------\n\nfunction registerCreateGenerativeArt(server: McpServer): void {\n server.prompt(\n \"create-generative-art\",\n \"Create a new piece of generative art with structured guidance\",\n {\n concept: z\n .string()\n .describe(\"The artistic concept or visual idea to explore\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer to use (default: p5)\"),\n complexity: z\n .enum([\"simple\", \"moderate\", \"complex\"])\n .optional()\n .describe(\"Desired complexity level (default: moderate)\"),\n canvas: z\n .string()\n .optional()\n .describe(\"Canvas preset name or WxH dimensions (default: square-1200)\"),\n },\n async (args) => {\n const renderer = args.renderer ?? \"p5\";\n const complexity = args.complexity ?? \"moderate\";\n const canvas = args.canvas ?? \"square-1200\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Create a generative art sketch with the following specifications:`,\n ``,\n `## Concept`,\n `${args.concept}`,\n ``,\n `## Technical Specifications`,\n `- **Renderer:** ${renderer}`,\n `- **Complexity:** ${complexity}`,\n `- **Canvas:** ${canvas}`,\n ``,\n `## Steps`,\n `1. Use \\`create_sketch\\` to create a new .genart file with a relative path (e.g. \\`my-sketch.genart\\`)`,\n `2. Design 3–6 parameters that control visual variation (range sliders)`,\n `3. Define 2–4 color parameters for palette control`,\n `4. Write the algorithm that implements the concept`,\n `5. Use \\`update_algorithm\\` to set the algorithm with validation`,\n `6. Use \\`capture_screenshot\\` to verify the visual output`,\n `7. Iterate on parameters and algorithm until the result matches the concept`,\n ``,\n `## Guidelines`,\n `- Parameters should have meaningful ranges that produce visually distinct results`,\n `- The algorithm should be deterministic given the same seed and parameters`,\n `- Include a philosophy field describing the artistic intent`,\n `- Use design principles: balance, contrast, rhythm, harmony`,\n `- Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools that create or modify sketches`,\n complexity === \"simple\"\n ? `- Keep the algorithm under 50 lines with 2–3 parameters`\n : complexity === \"complex\"\n ? `- The algorithm can be extensive; use 5+ parameters and consider animation`\n : `- Aim for 30–80 lines with 3–5 parameters`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// explore-variations — explore parameter/seed variations of an existing sketch\n// ---------------------------------------------------------------------------\n\nfunction registerExploreVariations(\n server: McpServer,\n state: EditorState,\n): void {\n server.prompt(\n \"explore-variations\",\n \"Explore parameter and seed variations of an existing sketch\",\n {\n sketchId: z\n .string()\n .describe(\"ID of the sketch to explore variations of\"),\n strategy: z\n .enum([\"seeds\", \"params\", \"both\", \"extremes\"])\n .optional()\n .describe(\"Variation strategy (default: both)\"),\n count: z\n .string()\n .optional()\n .describe(\"Number of variations to explore (default: 6)\"),\n },\n async (args) => {\n const strategy = args.strategy ?? \"both\";\n const count = args.count ?? \"6\";\n const sketch = state.getSketch(args.sketchId);\n\n let sketchContext = \"\";\n if (sketch) {\n const def = sketch.definition;\n const params = def.parameters\n ?.map(\n (p) =>\n ` - ${p.key} (${p.label}): ${p.min}–${p.max}, step ${p.step}, default ${p.default}`,\n )\n .join(\"\\n\");\n const colors = def.colors\n ?.map((c) => ` - ${c.key} (${c.label}): ${c.default}`)\n .join(\"\\n\");\n\n sketchContext = [\n `## Current Sketch: \"${def.title}\"`,\n `- **ID:** ${def.id}`,\n `- **Renderer:** ${def.renderer}`,\n `- **Canvas:** ${def.canvas.width}×${def.canvas.height}`,\n `- **Seed:** ${def.seed}`,\n params ? `- **Parameters:**\\n${params}` : `- **Parameters:** none`,\n colors ? `- **Colors:**\\n${colors}` : `- **Colors:** none`,\n ].join(\"\\n\");\n } else {\n sketchContext = `## Sketch: ${args.sketchId}\\n*(Not currently loaded — use open_sketch or get_selection to load it first)*`;\n }\n\n const strategyInstructions: Record<string, string> = {\n seeds: [\n `## Strategy: Seed Exploration`,\n `Generate ${count} variations by changing only the seed value.`,\n `1. Use \\`fork_sketch\\` to create each variation with \\`newSeed: true\\``,\n `2. Use \\`capture_batch\\` to capture all variations`,\n `3. Compare the results and identify which seeds produce the most interesting outputs`,\n ].join(\"\\n\"),\n params: [\n `## Strategy: Parameter Exploration`,\n `Generate ${count} variations by systematically varying parameters.`,\n `1. Use \\`fork_sketch\\` for each variation`,\n `2. For each fork, use \\`set_parameters\\` to explore different regions of the parameter space`,\n `3. Try: minimum values, maximum values, center values, and random combinations`,\n `4. Use \\`capture_batch\\` to capture all variations`,\n ].join(\"\\n\"),\n both: [\n `## Strategy: Combined Exploration`,\n `Generate ${count} variations by varying both seeds and parameters.`,\n `1. Create ${count} forks with \\`fork_sketch\\` (newSeed: true)`,\n `2. For half the forks, also adjust parameters to explore different visual territories`,\n `3. Use \\`capture_batch\\` to capture all variations`,\n `4. Identify the most visually interesting combinations`,\n ].join(\"\\n\"),\n extremes: [\n `## Strategy: Extreme Parameter Exploration`,\n `Generate ${count} variations by pushing parameters to their limits.`,\n `1. Create forks with all parameters at minimum, all at maximum, and diagonal extremes`,\n `2. Also create forks with each parameter individually at its min and max`,\n `3. Use \\`capture_batch\\` to capture all variations`,\n `4. This reveals the full range of the parameter space`,\n ].join(\"\\n\"),\n };\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Explore variations of an existing generative art sketch.`,\n ``,\n sketchContext,\n ``,\n strategyInstructions[strategy],\n ``,\n `## After Exploration`,\n `- Use \\`auto_arrange\\` to lay out all variations in a grid`,\n `- Use \\`snapshot_layout\\` to capture the arrangement`,\n `- Summarize which variations are most interesting and why`,\n ``,\n `**Attribution:** Always pass your \\`agent\\` name and \\`model\\` identifier when calling \\`fork_sketch\\` and other tools that create or modify sketches.`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// apply-design-theory — apply design theory concepts to a sketch\n// ---------------------------------------------------------------------------\n\nfunction registerApplyDesignTheory(\n server: McpServer,\n state: EditorState,\n): void {\n server.prompt(\n \"apply-design-theory\",\n \"Apply design theory concepts to improve or evolve a generative art sketch\",\n {\n sketchId: z\n .string()\n .describe(\"ID of the sketch to apply design theory to\"),\n theory: z\n .enum([\n \"gestalt\",\n \"color-theory\",\n \"composition\",\n \"rhythm-repetition\",\n \"negative-space\",\n \"contrast\",\n ])\n .describe(\"Design theory to apply\"),\n },\n async (args) => {\n const sketch = state.getSketch(args.sketchId);\n\n let sketchContext = \"\";\n if (sketch) {\n const def = sketch.definition;\n sketchContext = [\n `## Current Sketch: \"${def.title}\"`,\n `- **Renderer:** ${def.renderer}`,\n `- **Canvas:** ${def.canvas.width}×${def.canvas.height}`,\n `- **Parameters:** ${def.parameters?.length ?? 0} defined`,\n `- **Colors:** ${def.colors?.length ?? 0} defined`,\n def.philosophy\n ? `- **Philosophy:** ${def.philosophy}`\n : `- **Philosophy:** not set`,\n ].join(\"\\n\");\n } else {\n sketchContext = `## Sketch: ${args.sketchId}\\n*(Not currently loaded — use open_sketch first)*`;\n }\n\n const theoryGuides: Record<string, string> = {\n gestalt: [\n `## Theory: Gestalt Principles`,\n `Apply principles of visual perception to the sketch:`,\n `- **Proximity:** Group related elements closer together`,\n `- **Similarity:** Make related elements share visual properties (size, color, shape)`,\n `- **Continuity:** Align elements to create implied lines and flow`,\n `- **Closure:** Allow the viewer's mind to complete partial shapes`,\n `- **Figure-Ground:** Establish clear foreground/background relationships`,\n ``,\n `### Implementation`,\n `1. Analyze the current algorithm for element placement patterns`,\n `2. Add or modify parameters that control grouping, spacing, and alignment`,\n `3. Ensure the seed produces consistent perceptual grouping`,\n ].join(\"\\n\"),\n\n \"color-theory\": [\n `## Theory: Color Theory`,\n `Apply color harmony and contrast principles:`,\n `- **Complementary:** Use colors opposite on the color wheel for high contrast`,\n `- **Analogous:** Use adjacent colors for harmony`,\n `- **Triadic:** Use three evenly-spaced colors for vibrancy`,\n `- **Value contrast:** Ensure sufficient light/dark variation`,\n `- **Saturation:** Control intensity for emphasis and depth`,\n ``,\n `### Implementation`,\n `1. Review the current color definitions and themes`,\n `2. Add color parameters that follow a chosen harmony scheme`,\n `3. Create 2–3 theme presets demonstrating different harmonies`,\n `4. Update the algorithm to use colors intentionally for depth and emphasis`,\n ].join(\"\\n\"),\n\n composition: [\n `## Theory: Composition`,\n `Apply compositional rules for visual impact:`,\n `- **Rule of thirds:** Place key elements at intersection points`,\n `- **Golden ratio:** Use φ (1.618) for proportional divisions`,\n `- **Visual weight:** Balance heavy elements with negative space`,\n `- **Leading lines:** Direct the eye through the composition`,\n `- **Focal point:** Establish a clear center of interest`,\n ``,\n `### Implementation`,\n `1. Analyze element distribution in the current algorithm`,\n `2. Add parameters for compositional control (focal point position, density distribution)`,\n `3. Use mathematical ratios (thirds, golden) for element placement`,\n `4. Test with \\`capture_screenshot\\` and verify visual balance`,\n ].join(\"\\n\"),\n\n \"rhythm-repetition\": [\n `## Theory: Rhythm & Repetition`,\n `Apply rhythmic patterns and controlled repetition:`,\n `- **Regular rhythm:** Equal spacing between repeated elements`,\n `- **Alternating rhythm:** Two or more elements in sequence`,\n `- **Progressive rhythm:** Gradual size, color, or spacing changes`,\n `- **Random rhythm:** Organic, noise-driven variation within structure`,\n `- **Fractal repetition:** Self-similar patterns at different scales`,\n ``,\n `### Implementation`,\n `1. Identify repeating elements in the current algorithm`,\n `2. Add parameters for rhythm type, frequency, and amplitude`,\n `3. Layer multiple rhythmic patterns for visual complexity`,\n `4. Use the seed to introduce controlled randomness within the rhythm`,\n ].join(\"\\n\"),\n\n \"negative-space\": [\n `## Theory: Negative Space`,\n `Use emptiness as a compositional element:`,\n `- **Active negative space:** Intentional empty areas that form shapes`,\n `- **Breathing room:** Prevent visual overcrowding`,\n `- **Figure-ground reversal:** Make negative space as interesting as positive`,\n `- **Density gradients:** Transition from dense to sparse areas`,\n ``,\n `### Implementation`,\n `1. Add a density/coverage parameter to control fill percentage`,\n `2. Create regions of intentional emptiness in the algorithm`,\n `3. Use the canvas edges and margins as compositional anchors`,\n `4. Test at different density levels with \\`capture_screenshot\\``,\n ].join(\"\\n\"),\n\n contrast: [\n `## Theory: Contrast`,\n `Apply contrast principles for visual interest:`,\n `- **Size contrast:** Juxtapose large and small elements`,\n `- **Color contrast:** Use complementary or value differences`,\n `- **Shape contrast:** Mix geometric and organic forms`,\n `- **Texture contrast:** Smooth vs. rough, dense vs. sparse`,\n `- **Movement contrast:** Static vs. dynamic, fast vs. slow`,\n ``,\n `### Implementation`,\n `1. Identify the dominant visual quality in the current algorithm`,\n `2. Introduce its opposite as a secondary element`,\n `3. Add parameters that control the degree of contrast`,\n `4. Use \\`fork_sketch\\` to compare low-contrast and high-contrast versions`,\n ].join(\"\\n\"),\n };\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Apply design theory to improve a generative art sketch.`,\n ``,\n sketchContext,\n ``,\n theoryGuides[args.theory],\n ``,\n `## Workflow`,\n `1. Use \\`get_selection\\` or \\`open_sketch\\` to examine the current sketch`,\n `2. Analyze how the theory applies to the existing algorithm`,\n `3. Use \\`fork_sketch\\` to create a theory-applied variant`,\n `4. Modify the fork's algorithm and parameters using the theory principles above`,\n `5. Use \\`capture_screenshot\\` to compare before and after`,\n `6. Update the philosophy field to document the design rationale`,\n ``,\n `**Attribution:** Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools that create or modify sketches.`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n"],"mappings":"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","names":["import_promises","import_zod","import_promises","import_path","import_core","json","unlink","import_promises","import_path","import_core","now","fileExists","registry","ts","import_path","import_core","now","import_path","now","computeViewport","import_promises","import_path","import_core","import_path","import_promises","import_core","now","import_path","import_core","import_promises","import_core","VALID_RENDERERS","exports","import_promises","import_core","resolve","registry","import_promises","import_path","import_core","registry","applyOverrides","content","archiver","resolve","import_core","registry"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/state.ts","../src/sidecar.ts","../src/server.ts","../src/tools/workspace.ts","../src/tools/sketch.ts","../src/tools/selection.ts","../src/tools/parameters.ts","../src/tools/arrangement.ts","../src/tools/gallery.ts","../src/tools/merge.ts","../src/tools/snapshot-layout.ts","../src/tools/knowledge.ts","../src/tools/components.ts","../src/tools/capture.ts","../src/capture/headless.ts","../src/tools/export.ts","../src/tools/design.ts","../src/tools/design-plugins.ts","../src/resources/index.ts","../src/prompts/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * @genart/mcp-server — MCP server for genart.dev\n *\n * Modes:\n * stdio (default) — standard MCP stdio transport for Claude Code / CLI\n * sidecar — stdio transport + IPC mutation bridge for Electron desktop app\n *\n * Usage:\n * genart-mcp # stdio mode\n * genart-mcp --mode sidecar # sidecar mode (launched by Electron)\n */\n\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { EditorState } from \"./state.js\";\nimport { createServer } from \"./server.js\";\nimport { isSidecarMode } from \"./sidecar.js\";\n\nasync function main(): Promise<void> {\n const sidecar = isSidecarMode();\n\n if (sidecar) {\n console.error(\"[genart-mcp] Starting in sidecar mode\");\n } else {\n console.error(\"[genart-mcp] Starting in stdio mode\");\n }\n\n const state = new EditorState();\n const server = createServer(state);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(\"[genart-mcp] Server connected and ready\");\n}\n\nmain().catch((err) => {\n console.error(\"[genart-mcp] Fatal error:\", err);\n process.exit(1);\n});\n","/**\n * EditorState — server-scoped mutable state for the MCP server.\n * Tracks the active workspace, loaded sketches, and current selection.\n * Emits mutation events for real-time state broadcasting.\n */\n\nimport { EventEmitter } from \"events\";\nimport { readFile } from \"fs/promises\";\nimport { dirname, isAbsolute, resolve } from \"path\";\nimport { notifyMutation } from \"./sidecar.js\";\nimport {\n parseGenart,\n parseWorkspace,\n serializeGenart,\n serializeWorkspace,\n createLayerStack,\n type SketchDefinition,\n type WorkspaceDefinition,\n type PluginRegistry,\n type LayerStackAccessor,\n type McpToolContext,\n type DesignChangeType,\n type SketchStateAccessor,\n type DesignLayer,\n} from \"@genart-dev/core\";\nimport { writeFile } from \"fs/promises\";\n\n/** A loaded sketch with its parsed definition and absolute file path. */\nexport interface LoadedSketch {\n definition: SketchDefinition;\n path: string;\n}\n\n/** Mutation event types emitted by EditorState. */\nexport type EditorMutationType =\n | \"workspace:loaded\"\n | \"workspace:saved\"\n | \"workspace:updated\"\n | \"sketch:loaded\"\n | \"sketch:created\"\n | \"sketch:updated\"\n | \"sketch:saved\"\n | \"sketch:removed\"\n | \"sketch:deleted\"\n | \"selection:changed\"\n | \"design:layer-added\"\n | \"design:layer-removed\"\n | \"design:layer-updated\"\n | \"design:layer-reordered\";\n\n/** Payload for EditorState mutation events. */\nexport interface EditorMutationEvent {\n type: EditorMutationType;\n payload: unknown;\n}\n\n/** Serializable snapshot of the full editor state. */\nexport interface EditorStateSnapshot {\n workspacePath: string | null;\n workspace: WorkspaceDefinition | null;\n sketches: Array<{ id: string; definition: SketchDefinition; path: string }>;\n selection: string[];\n}\n\n/** Server-scoped mutable state for the MCP server. */\nexport class EditorState extends EventEmitter {\n /** Absolute path to the active .genart-workspace file, or null. */\n workspacePath: string | null = null;\n\n /** Parsed workspace definition, or null if no workspace is open. */\n workspace: WorkspaceDefinition | null = null;\n\n /** Loaded sketches keyed by sketch ID. */\n sketches: Map<string, LoadedSketch> = new Map();\n\n /** Currently selected sketch IDs. */\n selection: Set<string> = new Set();\n\n /**\n * Base directory for all file operations. When set, all paths are\n * resolved relative to this directory and constrained within it.\n * Used by mcp-host for per-session sandboxing.\n */\n basePath: string | null = null;\n\n /**\n * When true, the server is running remotely and cannot access the\n * user's local filesystem. Tools return file content in responses\n * instead of writing to disk. Set by mcp-host for HTTP-based sessions.\n */\n remoteMode = false;\n\n /** Plugin registry for design mode. Set during server initialization. */\n pluginRegistry: PluginRegistry | null = null;\n\n /** Layer stacks keyed by sketch ID. Created lazily when design tools are used. */\n layerStacks: Map<string, LayerStackAccessor> = new Map();\n\n constructor(options?: { basePath?: string; remoteMode?: boolean }) {\n super();\n if (options?.basePath) {\n this.basePath = options.basePath;\n }\n if (options?.remoteMode) {\n this.remoteMode = true;\n }\n }\n\n /** Update the working directory / sandbox base path. */\n setBasePath(dir: string): void {\n this.basePath = dir;\n }\n\n /** Resolve a file path, respecting the sandbox basePath when set. */\n resolvePath(file: string): string {\n if (isAbsolute(file)) {\n if (this.basePath && !file.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${file}`);\n }\n return file;\n }\n // Expand ~ to home directory (only when no sandbox)\n if ((file.startsWith(\"~/\") || file === \"~\") && !this.basePath) {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n return resolve(home, file.slice(2));\n }\n const base = this.basePath ?? process.cwd();\n const resolved = resolve(base, file);\n if (this.basePath && !resolved.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${resolved}`);\n }\n return resolved;\n }\n\n /** Resolve a sketch file reference (relative to workspace dir) to an absolute path. */\n resolveSketchPath(file: string): string {\n if (isAbsolute(file)) {\n if (this.basePath && !file.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${file}`);\n }\n return file;\n }\n if (!this.workspacePath) {\n if (this.basePath) {\n return resolve(this.basePath, file);\n }\n throw new Error(\"No workspace is currently open\");\n }\n const resolved = resolve(dirname(this.workspacePath), file);\n if (this.basePath && !resolved.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${resolved}`);\n }\n return resolved;\n }\n\n /** Load a workspace from disk and all its referenced sketches. */\n async loadWorkspace(absPath: string): Promise<void> {\n if (this.basePath && !absPath.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${absPath}`);\n }\n const raw = await readFile(absPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const ws = parseWorkspace(json);\n\n this.workspacePath = absPath;\n this.workspace = ws;\n this.sketches.clear();\n this.selection.clear();\n this.layerStacks.clear();\n\n // Load all referenced sketches\n for (const ref of ws.sketches) {\n const sketchPath = this.resolveSketchPath(ref.file);\n await this.loadSketch(sketchPath);\n }\n\n this.emitMutation(\"workspace:loaded\", { path: absPath, title: ws.title });\n }\n\n /** Load a single sketch from disk and add it to the cache. */\n async loadSketch(absPath: string): Promise<SketchDefinition> {\n if (this.basePath && !absPath.startsWith(this.basePath)) {\n throw new Error(`Path escapes sandbox: ${absPath}`);\n }\n const raw = await readFile(absPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const definition = parseGenart(json);\n this.sketches.set(definition.id, { definition, path: absPath });\n this.emitMutation(\"sketch:loaded\", { id: definition.id, path: absPath });\n return definition;\n }\n\n /** Get a loaded sketch by ID. */\n getSketch(id: string): LoadedSketch | undefined {\n return this.sketches.get(id);\n }\n\n /** Require a loaded sketch by ID, throwing if not found. */\n requireSketch(id: string): LoadedSketch {\n const sketch = this.sketches.get(id);\n if (!sketch) {\n throw new Error(`Sketch not found: '${id}'`);\n }\n return sketch;\n }\n\n /** Require an open workspace, throwing if none is open. */\n requireWorkspace(): WorkspaceDefinition {\n if (!this.workspace) {\n throw new Error(\"No workspace is currently open\");\n }\n return this.workspace;\n }\n\n /** Remove a sketch from the in-memory cache. */\n removeSketch(id: string): void {\n this.sketches.delete(id);\n this.selection.delete(id);\n this.layerStacks.delete(id);\n this.emitMutation(\"sketch:removed\", { id });\n }\n\n /** Save the active workspace to disk. */\n async saveWorkspace(): Promise<void> {\n if (!this.workspace || !this.workspacePath) {\n throw new Error(\"No workspace is currently open\");\n }\n const json = serializeWorkspace(this.workspace);\n if (!this.remoteMode) {\n await writeFile(this.workspacePath, json, \"utf-8\");\n }\n this.emitMutation(\"workspace:saved\", { path: this.workspacePath });\n }\n\n /** Save a sketch to disk. */\n async saveSketch(id: string): Promise<void> {\n const loaded = this.requireSketch(id);\n const json = serializeGenart(loaded.definition);\n if (!this.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n this.emitMutation(\"sketch:saved\", { id, path: loaded.path });\n }\n\n /** Update the selection and return the new set. */\n setSelection(ids: string[]): void {\n this.selection.clear();\n for (const id of ids) {\n this.selection.add(id);\n }\n this.emitMutation(\"selection:changed\", { ids });\n }\n\n /** Get a serializable snapshot of the full editor state. */\n getSnapshot(): EditorStateSnapshot {\n const sketches: EditorStateSnapshot[\"sketches\"] = [];\n for (const [id, loaded] of this.sketches) {\n sketches.push({ id, definition: loaded.definition, path: loaded.path });\n }\n return {\n workspacePath: this.workspacePath,\n workspace: this.workspace,\n sketches,\n selection: Array.from(this.selection),\n };\n }\n\n /**\n * Get or create a LayerStackAccessor for a sketch.\n * Initializes from the sketch's persisted design layers.\n */\n getLayerStack(sketchId: string): LayerStackAccessor {\n let stack = this.layerStacks.get(sketchId);\n if (stack) return stack;\n\n const loaded = this.requireSketch(sketchId);\n const initialLayers = (loaded.definition.layers ?? []) as DesignLayer[];\n\n stack = createLayerStack(initialLayers, (changeType: DesignChangeType) => {\n this.syncLayersToDefinition(sketchId);\n const mutationType = `design:${changeType}` as EditorMutationType;\n this.emitMutation(mutationType, { sketchId, changeType });\n });\n\n this.layerStacks.set(sketchId, stack);\n return stack;\n }\n\n /**\n * Sync the layer stack's current state back to the sketch definition.\n * Called automatically on every layer mutation.\n */\n private syncLayersToDefinition(sketchId: string): void {\n const loaded = this.sketches.get(sketchId);\n const stack = this.layerStacks.get(sketchId);\n if (!loaded || !stack) return;\n\n const layers = stack.getAll();\n loaded.definition = {\n ...loaded.definition,\n layers: layers.length > 0 ? layers : undefined,\n };\n }\n\n /**\n * Create an McpToolContext for a plugin's MCP tool handler.\n * Provides access to the layer stack, sketch state, and change notifications.\n */\n createMcpToolContext(sketchId: string): McpToolContext {\n const loaded = this.requireSketch(sketchId);\n const layerStack = this.getLayerStack(sketchId);\n const def = loaded.definition;\n\n const sketchState: SketchStateAccessor = {\n seed: def.state.seed,\n params: def.state.params,\n colorPalette: def.state.colorPalette,\n canvasWidth: def.canvas.width,\n canvasHeight: def.canvas.height,\n rendererId: def.renderer.type,\n };\n\n return {\n layers: layerStack,\n sketchState,\n canvasWidth: def.canvas.width,\n canvasHeight: def.canvas.height,\n async resolveAsset(_assetId: string): Promise<Buffer | null> {\n return null;\n },\n async captureComposite(_format?: \"png\" | \"jpeg\"): Promise<Buffer> {\n throw new Error(\"captureComposite is not available in headless MCP mode\");\n },\n emitChange(_changeType: DesignChangeType): void {\n // onChange is already handled by the layer stack's callback\n },\n };\n }\n\n /**\n * Get the currently selected sketch ID for design operations.\n * Returns the single selected sketch, or throws if none/multiple selected.\n */\n requireSelectedSketchId(): string {\n if (this.selection.size === 0) {\n throw new Error(\"No sketch is selected. Use select_sketch or open_sketch first.\");\n }\n if (this.selection.size > 1) {\n throw new Error(\"Multiple sketches are selected. Design operations require a single sketch.\");\n }\n return this.selection.values().next().value!;\n }\n\n /** Emit a mutation event for external listeners (WebSocket broadcast, sidecar IPC). */\n emitMutation(type: EditorMutationType, payload: unknown): void {\n this.emit(\"mutation\", { type, payload } satisfies EditorMutationEvent);\n notifyMutation(type, payload);\n }\n}\n","/**\n * Sidecar mutation bridge.\n * When running as a desktop app sidecar (--mode sidecar), sends IPC\n * messages to the parent Electron process for real-time UI updates.\n */\n\n/** Mutation types sent to the desktop app. */\nexport type MutationType =\n | \"sketch:created\"\n | \"sketch:updated\"\n | \"sketch:deleted\"\n | \"workspace:updated\"\n | \"selection:changed\";\n\n/** Whether the server is running in sidecar mode. */\nexport function isSidecarMode(): boolean {\n const modeIdx = process.argv.indexOf(\"--mode\");\n if (modeIdx !== -1 && process.argv[modeIdx + 1] === \"sidecar\") return true;\n return process.env.GENART_SIDECAR === \"1\";\n}\n\n/**\n * Notify the parent process of a mutation.\n * No-op when not in sidecar mode or when IPC channel is unavailable.\n */\nexport function notifyMutation(type: string, payload: unknown): void {\n if (isSidecarMode() && typeof process.send === \"function\") {\n process.send({ type, payload });\n }\n}\n","/**\n * MCP server creation and tool registration.\n * Creates a McpServer instance with all tools, resources, and prompts.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { createPluginRegistry, type PluginRegistry } from \"@genart-dev/core\";\nimport typographyPlugin from \"@genart-dev/plugin-typography\";\nimport filtersPlugin from \"@genart-dev/plugin-filters\";\nimport shapesPlugin from \"@genart-dev/plugin-shapes\";\nimport layoutGuidesPlugin from \"@genart-dev/plugin-layout-guides\";\nimport { EditorState } from \"./state.js\";\nimport {\n createWorkspace,\n openWorkspace,\n addSketchToWorkspace,\n removeSketchFromWorkspace,\n listWorkspaceSketches,\n} from \"./tools/workspace.js\";\nimport {\n createSketch,\n openSketch,\n updateSketch,\n updateAlgorithm,\n saveSketch,\n forkSketch,\n deleteSketch,\n} from \"./tools/sketch.js\";\nimport {\n getSelection,\n selectSketch,\n getEditorState,\n} from \"./tools/selection.js\";\nimport {\n setParameters,\n setColors,\n setSeed,\n setCanvasSize,\n randomizeParameters,\n} from \"./tools/parameters.js\";\nimport {\n arrangeSketches,\n autoArrange,\n groupSketches,\n} from \"./tools/arrangement.js\";\nimport { listSketches, searchSketches } from \"./tools/gallery.js\";\nimport { mergeSketches } from \"./tools/merge.js\";\nimport { snapshotLayout } from \"./tools/snapshot-layout.js\";\nimport { listSkills, loadSkill, getGuidelines } from \"./tools/knowledge.js\";\nimport {\n listComponents,\n addComponent,\n removeComponent,\n} from \"./tools/components.js\";\nimport { captureScreenshot, captureBatch } from \"./tools/capture.js\";\nimport { exportSketch } from \"./tools/export.js\";\nimport {\n designAddLayer,\n designRemoveLayer,\n designListLayers,\n designGetLayer,\n designUpdateLayer,\n designSetTransform,\n designSetBlend,\n designReorderLayers,\n designDuplicateLayer,\n designToggleVisibility,\n designLockLayer,\n designCaptureComposite,\n} from \"./tools/design.js\";\nimport { registerPluginMcpTools } from \"./tools/design-plugins.js\";\nimport { registerResources } from \"./resources/index.js\";\nimport { registerPrompts } from \"./prompts/index.js\";\n\n/** Wrap a tool handler to return MCP-formatted content (text JSON). */\nfunction jsonResult(data: Record<string, unknown>) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n };\n}\n\n/** Wrap a tool handler to return an MCP error. */\nfunction toolError(message: string) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify({ error: message }) }],\n isError: true as const,\n };\n}\n\n/**\n * Initialize the plugin registry with all free design plugins.\n * Called once at server startup. Returns the registry for tool registration.\n */\nasync function initializePluginRegistry(): Promise<PluginRegistry> {\n const registry = createPluginRegistry({\n surface: \"mcp\",\n supportsInteractiveTools: false,\n supportsRendering: false,\n });\n\n // Register free plugins\n await registry.register(typographyPlugin);\n await registry.register(filtersPlugin);\n await registry.register(shapesPlugin);\n await registry.register(layoutGuidesPlugin);\n\n return registry;\n}\n\n/** Create and configure the MCP server with all tools. */\nexport function createServer(state: EditorState): McpServer {\n const server = new McpServer(\n {\n name: \"@genart/mcp-server\",\n version: \"0.3.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n },\n );\n\n // Initialize plugin registry (async, but we register tools synchronously\n // after awaiting inside this wrapper — the tools are registered before\n // the server starts accepting requests because connect() is called after)\n const registryReady = initializePluginRegistry().then((registry) => {\n state.pluginRegistry = registry;\n registerPluginMcpTools(server, registry, state);\n });\n\n // Store the promise so callers can await if needed\n (server as McpServer & { _pluginsReady?: Promise<void> })._pluginsReady =\n registryReady;\n\n registerWorkspaceTools(server, state);\n registerSketchTools(server, state);\n registerComponentTools(server, state);\n registerSelectionTools(server, state);\n registerParameterTools(server, state);\n registerArrangementTools(server, state);\n registerGalleryTools(server, state);\n registerMergeTools(server, state);\n registerSnapshotTools(server, state);\n registerKnowledgeTools(server, state);\n registerDesignTools(server, state);\n\n registerCaptureTools(server, state);\n registerExportTools(server, state);\n\n registerResources(server, state);\n registerPrompts(server, state);\n\n return server;\n}\n\n// ---------------------------------------------------------------------------\n// Workspace Tools\n// ---------------------------------------------------------------------------\n\nfunction registerWorkspaceTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"create_workspace\",\n \"Create a new .genart-workspace file with optional initial sketches\",\n {\n title: z.string().describe(\"Workspace title\"),\n path: z.string().describe(\"File path (must end in .genart-workspace)\"),\n sketches: z\n .array(z.string())\n .optional()\n .describe(\"Initial sketch file paths to include\"),\n arrangement: z\n .enum([\"grid\", \"row\", \"column\"])\n .optional()\n .describe(\"Auto-arrange initial sketches (default: grid)\"),\n spacing: z\n .number()\n .optional()\n .describe(\"Spacing between arranged sketches in pixels (default: 200)\"),\n },\n async (args) => {\n try {\n const result = await createWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"open_workspace\",\n \"Open an existing .genart-workspace file and load all referenced sketches\",\n {\n path: z.string().describe(\"File path to .genart-workspace file\"),\n },\n async (args) => {\n try {\n const result = await openWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"add_sketch_to_workspace\",\n \"Add an existing .genart sketch file to the active workspace\",\n {\n sketchPath: z.string().describe(\"Path to the .genart file to add\"),\n position: z\n .object({\n x: z.number().describe(\"X position on canvas\"),\n y: z.number().describe(\"Y position on canvas\"),\n })\n .optional()\n .describe(\"Canvas position (default: auto-placed to the right)\"),\n label: z.string().optional().describe(\"Display label override\"),\n },\n async (args) => {\n try {\n const result = await addSketchToWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"remove_sketch_from_workspace\",\n \"Remove a sketch from the active workspace (optionally delete the file)\",\n {\n sketchId: z.string().describe(\"ID of the sketch to remove\"),\n deleteFile: z\n .boolean()\n .optional()\n .describe(\"Also delete the .genart file from disk (default: false)\"),\n },\n async (args) => {\n try {\n const result = await removeSketchFromWorkspace(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"list_workspace_sketches\",\n \"List all sketches in the active workspace with metadata\",\n {\n includeState: z\n .boolean()\n .optional()\n .describe(\"Include current seed and param values (default: false)\"),\n },\n async (args) => {\n try {\n const result = await listWorkspaceSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Sketch Lifecycle Tools\n// ---------------------------------------------------------------------------\n\nfunction registerSketchTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"create_sketch\",\n \"Create a new .genart sketch file from metadata, parameters, and algorithm. IMPORTANT: Do not embed common utilities (PRNG, noise, easing, color math, vector ops) inline in the algorithm. Instead, declare them as components: { \\\"prng\\\": \\\"^1.0.0\\\", \\\"noise-2d\\\": \\\"^1.0.0\\\" }. Then use the exported functions directly in your algorithm (e.g., mulberry32, fbm2D). Use list_components to see all available components for the current renderer.\",\n {\n id: z.string().describe(\"URL-safe kebab-case identifier\"),\n title: z.string().describe(\"Human-readable title\"),\n path: z.string().describe(\"Relative file path (must end in .genart, e.g. 'my-sketch.genart')\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer type (default: p5)\"),\n canvas: z\n .object({\n preset: z.string().optional().describe(\"Canvas preset name\"),\n width: z.number().optional().describe(\"Width in pixels\"),\n height: z.number().optional().describe(\"Height in pixels\"),\n })\n .optional()\n .describe(\"Canvas dimensions (default: square-1200)\"),\n philosophy: z.string().optional().describe(\"Markdown design philosophy\"),\n parameters: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n min: z.number(),\n max: z.number(),\n step: z.number(),\n default: z.number(),\n }),\n )\n .optional()\n .describe(\"Parameter definitions\"),\n colors: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n default: z.string(),\n }),\n )\n .optional()\n .describe(\"Color definitions\"),\n themes: z\n .array(\n z.object({\n name: z.string(),\n colors: z.array(z.string()),\n }),\n )\n .optional()\n .describe(\"Theme presets\"),\n algorithm: z\n .string()\n .optional()\n .describe(\"Algorithm source code (default: renderer template). For p5: must be `function sketch(p, state) { ... }` in instance mode. State provides: state.WIDTH, state.HEIGHT, state.SEED (number), state.PARAMS (keyed by param key), state.COLORS (keyed by color key, hex strings). Use p5 instance methods (p.createCanvas, p.background, etc).\"),\n seed: z.number().optional().describe(\"Initial random seed (default: random)\"),\n skills: z.array(z.string()).optional().describe(\"Design skill references\"),\n components: z\n .record(\n z.union([\n z.string(),\n z.object({\n version: z.string().optional(),\n code: z.string().optional(),\n exports: z.array(z.string()).optional(),\n }),\n ]),\n )\n .optional()\n .describe(\"Component dependencies. Use list_components to see available. Keys are component names, values are semver ranges (e.g. \\\"^1.0.0\\\") or objects with version/code/exports.\"),\n addToWorkspace: z\n .string()\n .optional()\n .describe(\"Path to workspace to add sketch to after creation\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await createSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"open_sketch\",\n \"Open a sketch by ID to view and edit it (sets selection)\",\n {\n sketchId: z.string().describe(\"ID of the sketch to open\"),\n },\n async (args) => {\n try {\n const result = await openSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"update_sketch\",\n \"Update metadata, parameters, colors, or canvas of an existing sketch\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n title: z.string().optional().describe(\"New title\"),\n philosophy: z.string().optional().describe(\"New philosophy text (markdown)\"),\n canvas: z\n .object({\n preset: z.string().optional().describe(\"Canvas preset name\"),\n width: z.number().optional().describe(\"Width in pixels\"),\n height: z.number().optional().describe(\"Height in pixels\"),\n })\n .optional()\n .describe(\"New canvas dimensions\"),\n parameters: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n min: z.number(),\n max: z.number(),\n step: z.number(),\n default: z.number(),\n }),\n )\n .optional()\n .describe(\"Replace parameter definitions\"),\n colors: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n default: z.string(),\n }),\n )\n .optional()\n .describe(\"Replace color definitions\"),\n themes: z\n .array(\n z.object({\n name: z.string(),\n colors: z.array(z.string()),\n }),\n )\n .optional()\n .describe(\"Replace theme presets\"),\n seed: z.number().optional().describe(\"New random seed\"),\n skills: z.array(z.string()).optional().describe(\"Replace design skill references\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await updateSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"update_algorithm\",\n \"Replace the algorithm source code of a sketch. If adding/changing components, pass them in the components field alongside the algorithm.\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n algorithm: z.string().describe(\"New algorithm source code. For p5: must be `function sketch(p, state) { ... }` in instance mode. State provides: state.WIDTH, state.HEIGHT, state.SEED, state.PARAMS (keyed by param key), state.COLORS (keyed by color key).\"),\n validate: z\n .boolean()\n .optional()\n .describe(\"Run renderer-specific validation before saving (default: true)\"),\n components: z\n .record(\n z.union([\n z.string(),\n z.object({\n version: z.string().optional(),\n code: z.string().optional(),\n exports: z.array(z.string()).optional(),\n }),\n ]),\n )\n .optional()\n .describe(\"Component dependencies to resolve alongside the algorithm update. Use list_components to see available.\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await updateAlgorithm(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"save_sketch\",\n \"Persist the current in-memory state of a sketch to disk\",\n {\n sketchId: z.string().describe(\"ID of the sketch to save\"),\n },\n async (args) => {\n try {\n const result = await saveSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"fork_sketch\",\n \"Create a variant of an existing sketch with a new ID and optional modifications\",\n {\n sourceId: z.string().describe(\"ID of the sketch to fork\"),\n newId: z.string().describe(\"URL-safe kebab-case ID for the forked sketch\"),\n title: z.string().optional().describe(\"Title for the fork (default: '[source title] (fork)')\"),\n position: z\n .object({\n x: z.number().describe(\"X position on canvas\"),\n y: z.number().describe(\"Y position on canvas\"),\n })\n .optional()\n .describe(\"Canvas position (default: auto-placed to the right of source)\"),\n modifications: z\n .object({\n renderer: z.enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"]).optional(),\n canvas: z\n .object({\n preset: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n })\n .optional(),\n parameters: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n min: z.number(),\n max: z.number(),\n step: z.number(),\n default: z.number(),\n }),\n )\n .optional(),\n colors: z\n .array(\n z.object({\n key: z.string(),\n label: z.string(),\n default: z.string(),\n }),\n )\n .optional(),\n algorithm: z.string().optional(),\n philosophy: z.string().optional(),\n })\n .optional()\n .describe(\"Fields to override in the fork\"),\n newSeed: z\n .boolean()\n .optional()\n .describe(\"Generate a new random seed for the fork (default: true)\"),\n agent: z.string().optional().describe(\"Your CLI agent name (e.g. 'claude-code', 'codex-cli', 'gemini-cli', 'opencode', 'kiro')\"),\n model: z.string().optional().describe(\"Your AI model identifier (e.g. 'claude-opus-4-6', 'gpt-4o', 'gemini-2.5-pro')\"),\n },\n async (args) => {\n try {\n const result = await forkSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"delete_sketch\",\n \"Delete a sketch file from disk and remove it from the workspace\",\n {\n sketchId: z.string().describe(\"ID of the sketch to delete\"),\n keepFile: z\n .boolean()\n .optional()\n .describe(\"Keep the .genart file on disk (default: false)\"),\n },\n async (args) => {\n try {\n const result = await deleteSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component Tools\n// ---------------------------------------------------------------------------\n\nfunction registerComponentTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"list_components\",\n \"List available reusable components from the registry, filtered by renderer and/or category. Components provide common utilities (PRNG, noise, easing, color math, etc.) that can be declared as dependencies instead of inlining code in the algorithm.\",\n {\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Filter by renderer compatibility\"),\n category: z\n .enum([\n \"randomness\", \"noise\", \"math\", \"easing\", \"color\", \"vector\",\n \"geometry\", \"grid\", \"particle\", \"physics\", \"distribution\",\n \"pattern\", \"sdf\", \"transform\", \"animation\", \"string\",\n \"data-structure\", \"imaging\",\n ])\n .optional()\n .describe(\"Filter by component category\"),\n },\n async (args) => {\n try {\n const result = await listComponents(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"add_component\",\n \"Add a component dependency to an existing sketch. Resolves the component and any transitive dependencies from the registry, validates renderer compatibility, and writes the resolved form to the sketch file.\",\n {\n sketchId: z.string().describe(\"ID of the sketch to add the component to\"),\n component: z.string().describe(\"Component name (e.g. 'prng', 'noise-2d', 'glsl-noise')\"),\n version: z\n .string()\n .optional()\n .describe(\"Version range (default: '^1.0.0')\"),\n },\n async (args) => {\n try {\n const result = await addComponent(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"remove_component\",\n \"Remove a component dependency from a sketch. Checks for dependent components and warns if the algorithm references the component's exports.\",\n {\n sketchId: z.string().describe(\"ID of the sketch to remove the component from\"),\n component: z.string().describe(\"Component name to remove\"),\n },\n async (args) => {\n try {\n const result = await removeComponent(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Selection & Context Tools\n// ---------------------------------------------------------------------------\n\nfunction registerSelectionTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"get_selection\",\n \"Return full context for the currently selected sketch(es) on the canvas\",\n {\n includeAlgorithm: z\n .boolean()\n .optional()\n .describe(\"Include full algorithm source (default: true)\"),\n includePhilosophy: z\n .boolean()\n .optional()\n .describe(\"Include philosophy markdown (default: true)\"),\n includeNeighbors: z\n .boolean()\n .optional()\n .describe(\"Include summaries of adjacent sketches (default: false)\"),\n },\n async (args) => {\n try {\n const result = await getSelection(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"select_sketch\",\n \"Set the canvas selection to one or more sketches by ID\",\n {\n sketchIds: z\n .array(z.string())\n .describe(\"IDs of sketches to select\"),\n addToSelection: z\n .boolean()\n .optional()\n .describe(\"Add to existing selection instead of replacing (default: false)\"),\n },\n async (args) => {\n try {\n const result = await selectSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"get_editor_state\",\n \"Return a full snapshot of the MCP server's current state\",\n {},\n async () => {\n try {\n const result = await getEditorState(state);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_working_directory\",\n \"Set the working directory for file operations. All paths are resolved relative to this directory.\",\n {\n path: z.string().describe(\"Absolute path to use as the working directory\"),\n },\n async (args) => {\n try {\n const dir = args.path;\n if (!dir.startsWith(\"/\")) {\n return toolError(\"Path must be absolute\");\n }\n state.setBasePath(dir);\n return jsonResult({ success: true, workingDirectory: dir });\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Parameter Tools\n// ---------------------------------------------------------------------------\n\nfunction registerParameterTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"set_parameters\",\n \"Update the runtime parameter values of a sketch's current state\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n params: z\n .record(z.number())\n .describe(\"Parameter key-value pairs to set\"),\n },\n async (args) => {\n try {\n const result = await setParameters(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_colors\",\n \"Update the runtime color palette values of a sketch's current state\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n colors: z\n .record(z.string())\n .describe(\"Color key-value pairs to set (hex strings)\"),\n },\n async (args) => {\n try {\n const result = await setColors(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_seed\",\n \"Set the random seed of a sketch, optionally generating a random value\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n seed: z\n .number()\n .optional()\n .describe(\"Explicit seed value (default: generate random 0–99999)\"),\n },\n async (args) => {\n try {\n const result = await setSeed(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"set_canvas_size\",\n \"Change the canvas dimensions of a sketch using a preset or explicit width/height\",\n {\n sketchId: z.string().describe(\"ID of the sketch to update\"),\n preset: z.string().optional().describe(\"Canvas preset name\"),\n width: z.number().optional().describe(\"Explicit width in pixels\"),\n height: z.number().optional().describe(\"Explicit height in pixels\"),\n },\n async (args) => {\n try {\n const result = await setCanvasSize(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"randomize_parameters\",\n \"Generate random values for all or specific parameters within their defined ranges\",\n {\n sketchId: z.string().describe(\"ID of the sketch to randomize\"),\n paramKeys: z\n .array(z.string())\n .optional()\n .describe(\"Specific parameter keys to randomize (default: all)\"),\n newSeed: z\n .boolean()\n .optional()\n .describe(\"Also randomize the seed (default: false)\"),\n },\n async (args) => {\n try {\n const result = await randomizeParameters(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Arrangement Tools\n// ---------------------------------------------------------------------------\n\nfunction registerArrangementTools(\n server: McpServer,\n state: EditorState,\n): void {\n server.tool(\n \"arrange_sketches\",\n \"Move specific sketches to explicit positions on the canvas\",\n {\n positions: z\n .array(\n z.object({\n sketchId: z.string().describe(\"ID of the sketch to move\"),\n x: z.number().describe(\"X position on canvas\"),\n y: z.number().describe(\"Y position on canvas\"),\n }),\n )\n .describe(\"Explicit position assignments\"),\n },\n async (args) => {\n try {\n const result = await arrangeSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"auto_arrange\",\n \"Automatically lay out all or selected sketches using a configurable layout algorithm\",\n {\n layout: z\n .enum([\"grid\", \"row\", \"column\", \"masonry\"])\n .optional()\n .describe(\"Layout algorithm (default: grid)\"),\n sketchIds: z\n .array(z.string())\n .optional()\n .describe(\"Specific sketches to arrange (default: all)\"),\n spacing: z\n .number()\n .optional()\n .describe(\"Gap between sketches in pixels (default: 200)\"),\n sortBy: z\n .enum([\"title\", \"created\", \"modified\", \"renderer\"])\n .optional()\n .describe(\"Sort order before arranging (default: created)\"),\n origin: z\n .object({\n x: z.number().describe(\"X origin\"),\n y: z.number().describe(\"Y origin\"),\n })\n .optional()\n .describe(\"Top-left origin for the arrangement (default: {x:0, y:0})\"),\n },\n async (args) => {\n try {\n const result = await autoArrange(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"group_sketches\",\n \"Create or update a named group of sketches in the workspace\",\n {\n groupId: z.string().describe(\"Unique group identifier\"),\n label: z.string().describe(\"Display label for the group\"),\n sketchIds: z\n .array(z.string())\n .describe(\"IDs of sketches to include in the group\"),\n color: z\n .string()\n .optional()\n .describe(\"Optional group color (hex string)\"),\n },\n async (args) => {\n try {\n const result = await groupSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gallery Tools\n// ---------------------------------------------------------------------------\n\nfunction registerGalleryTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"list_sketches\",\n \"Scan the workspace directory for all .genart files with metadata summaries\",\n {\n directory: z\n .string()\n .optional()\n .describe(\"Directory to scan (default: workspace directory)\"),\n recursive: z\n .boolean()\n .optional()\n .describe(\"Scan subdirectories (default: false)\"),\n includeUnreferenced: z\n .boolean()\n .optional()\n .describe(\n \"Include files not in the active workspace (default: true)\",\n ),\n },\n async (args) => {\n try {\n const result = await listSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"search_sketches\",\n \"Search loaded sketches by title, renderer, parameters, canvas size, or skills\",\n {\n query: z\n .string()\n .optional()\n .describe(\"Substring match against sketch title (case-insensitive)\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Filter by renderer type\"),\n minParameters: z\n .number()\n .optional()\n .describe(\"Minimum number of parameters\"),\n maxParameters: z\n .number()\n .optional()\n .describe(\"Maximum number of parameters\"),\n canvasWidth: z\n .number()\n .optional()\n .describe(\"Exact canvas width match\"),\n canvasHeight: z\n .number()\n .optional()\n .describe(\"Exact canvas height match\"),\n hasPhilosophy: z\n .boolean()\n .optional()\n .describe(\"Filter by presence of philosophy text\"),\n skills: z\n .array(z.string())\n .optional()\n .describe(\"Filter by sketches that use any of these skills\"),\n },\n async (args) => {\n try {\n const result = await searchSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Merge Tools\n// ---------------------------------------------------------------------------\n\nfunction registerMergeTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"merge_sketches\",\n \"Combine parameters, colors, and algorithm from 2+ source sketches into a new sketch\",\n {\n sourceIds: z\n .array(z.string())\n .describe(\"IDs of 2+ source sketches to merge\"),\n newId: z\n .string()\n .describe(\"URL-safe kebab-case ID for the merged sketch\"),\n title: z.string().describe(\"Title for the merged sketch\"),\n strategy: z\n .enum([\"blend\", \"layer\", \"alternate\"])\n .optional()\n .describe(\"Merge strategy (default: blend)\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer for merged sketch (default: first source's renderer)\"),\n canvas: z\n .object({\n width: z.number().optional().describe(\"Canvas width\"),\n height: z.number().optional().describe(\"Canvas height\"),\n })\n .optional()\n .describe(\"Canvas size (default: largest source dimensions)\"),\n },\n async (args) => {\n try {\n const result = await mergeSketches(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Snapshot Layout Tools\n// ---------------------------------------------------------------------------\n\nfunction registerSnapshotTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"snapshot_layout\",\n \"Return a structural summary of the workspace layout for AI spatial reasoning\",\n {\n includeGroups: z\n .boolean()\n .optional()\n .describe(\"Include group information (default: true)\"),\n includeState: z\n .boolean()\n .optional()\n .describe(\"Include current seed and param values (default: false)\"),\n },\n async (args) => {\n try {\n const result = await snapshotLayout(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Capture Tools\n// ---------------------------------------------------------------------------\n\nfunction registerCaptureTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"capture_screenshot\",\n \"Capture a screenshot of a sketch. Returns metadata as text + a small inline JPEG image for visual review. In remote mode, metadata includes previewFileContent (base64 PNG) to Write locally.\",\n {\n target: z\n .enum([\"selected\", \"sketch\"])\n .optional()\n .describe(\"What to capture (default: selected)\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Required when target is 'sketch'\"),\n width: z\n .number()\n .optional()\n .describe(\"Output width in pixels (default: sketch canvas width)\"),\n height: z\n .number()\n .optional()\n .describe(\"Output height in pixels (default: sketch canvas height)\"),\n seed: z\n .number()\n .optional()\n .describe(\"Override seed for this capture only\"),\n params: z\n .record(z.number())\n .optional()\n .describe(\"Override params for this capture only\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for inline preview JPEG (default: 400)\"),\n },\n async (args) => {\n try {\n const result = await captureScreenshot(state, args);\n return {\n content: [\n { type: \"text\" as const, text: JSON.stringify(result.metadata, null, 2) },\n { type: \"image\" as const, data: result.previewJpegBase64, mimeType: \"image/jpeg\" as const },\n ],\n };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"capture_batch\",\n \"Capture screenshots of multiple sketches in parallel. Returns metadata as text + inline JPEG images for visual review.\",\n {\n sketchIds: z\n .array(z.string())\n .optional()\n .describe(\"IDs of sketches to capture (default: all)\"),\n width: z\n .number()\n .optional()\n .describe(\"Override width for all captures\"),\n height: z\n .number()\n .optional()\n .describe(\"Override height for all captures\"),\n seed: z\n .number()\n .optional()\n .describe(\"Override seed for all captures\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for inline preview JPEGs (default: 200 for batch)\"),\n },\n async (args) => {\n try {\n const result = await captureBatch(state, args);\n const content: Array<\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: \"image/jpeg\" }\n > = [\n { type: \"text\", text: JSON.stringify(result.metadata, null, 2) },\n ];\n // Add per-sketch metadata + inline JPEG image blocks\n for (const item of result.items) {\n content.push({\n type: \"text\",\n text: JSON.stringify(item.metadata, null, 2),\n });\n content.push({\n type: \"image\",\n data: item.inlineJpegBase64,\n mimeType: \"image/jpeg\",\n });\n }\n return { content };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Export Tools\n// ---------------------------------------------------------------------------\n\nfunction registerExportTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"export_sketch\",\n \"Export a sketch as standalone HTML, PNG, SVG, raw algorithm, or bundled ZIP\",\n {\n sketchId: z.string().describe(\"ID of the sketch to export\"),\n format: z\n .enum([\"html\", \"png\", \"svg\", \"algorithm\", \"zip\"])\n .describe(\"Export format\"),\n outputPath: z.string().describe(\"File path to write the export\"),\n width: z\n .number()\n .optional()\n .describe(\"Override width for PNG/SVG export\"),\n height: z\n .number()\n .optional()\n .describe(\"Override height for PNG/SVG export\"),\n seed: z\n .number()\n .optional()\n .describe(\"Override seed for this export\"),\n params: z\n .record(z.number())\n .optional()\n .describe(\"Override params for this export\"),\n },\n async (args) => {\n try {\n const result = await exportSketch(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Design Layer Tools (12 core tools)\n// ---------------------------------------------------------------------------\n\nfunction registerDesignTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"design_add_layer\",\n \"Add a new design layer of a given type to the active sketch. Layer types come from registered plugins (e.g. 'typography:text', 'filter:grain', 'shapes:rect', 'guides:thirds').\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n type: z.string().describe(\"Layer type ID (e.g. 'typography:text', 'filter:grain', 'shapes:rect')\"),\n name: z.string().optional().describe(\"Layer display name (default: type's display name)\"),\n properties: z\n .record(z.unknown())\n .optional()\n .describe(\"Initial layer properties (merged with type defaults)\"),\n transform: z\n .object({\n x: z.number().optional(),\n y: z.number().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n rotation: z.number().optional(),\n scaleX: z.number().optional(),\n scaleY: z.number().optional(),\n anchorX: z.number().optional(),\n anchorY: z.number().optional(),\n })\n .optional()\n .describe(\"Layer transform (default: full canvas)\"),\n opacity: z.number().optional().describe(\"Layer opacity 0–1 (default: 1)\"),\n blendMode: z.string().optional().describe(\"Blend mode (default: 'normal')\"),\n index: z.number().optional().describe(\"Insert position in layer stack (default: top)\"),\n },\n async (args) => {\n try {\n const result = await designAddLayer(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_remove_layer\",\n \"Remove a design layer from the active sketch\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer to remove\"),\n },\n async (args) => {\n try {\n const result = await designRemoveLayer(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_list_layers\",\n \"List all design layers in the active sketch with their types, visibility, and key properties\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n },\n async (args) => {\n try {\n const result = await designListLayers(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_get_layer\",\n \"Get full details of a single design layer including all properties and transform\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer to inspect\"),\n },\n async (args) => {\n try {\n const result = await designGetLayer(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_update_layer\",\n \"Update properties on a design layer (e.g. text content, filter intensity, shape fill color)\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer to update\"),\n name: z.string().optional().describe(\"New display name\"),\n properties: z\n .record(z.unknown())\n .optional()\n .describe(\"Property key-value pairs to set\"),\n },\n async (args) => {\n try {\n const result = await designUpdateLayer(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_set_transform\",\n \"Set the position, size, rotation, and scale of a design layer\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer to transform\"),\n x: z.number().optional().describe(\"X position\"),\n y: z.number().optional().describe(\"Y position\"),\n width: z.number().optional().describe(\"Width\"),\n height: z.number().optional().describe(\"Height\"),\n rotation: z.number().optional().describe(\"Rotation in degrees\"),\n scaleX: z.number().optional().describe(\"Horizontal scale\"),\n scaleY: z.number().optional().describe(\"Vertical scale\"),\n anchorX: z.number().optional().describe(\"Anchor X (0–1)\"),\n anchorY: z.number().optional().describe(\"Anchor Y (0–1)\"),\n },\n async (args) => {\n try {\n const result = await designSetTransform(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_set_blend\",\n \"Set blend mode and/or opacity on a design layer\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer\"),\n blendMode: z\n .enum([\n \"normal\", \"multiply\", \"screen\", \"overlay\",\n \"darken\", \"lighten\", \"color-dodge\", \"color-burn\",\n \"hard-light\", \"soft-light\", \"difference\", \"exclusion\",\n \"hue\", \"saturation\", \"color\", \"luminosity\",\n ])\n .optional()\n .describe(\"CSS blend mode\"),\n opacity: z.number().optional().describe(\"Layer opacity 0–1\"),\n },\n async (args) => {\n try {\n const result = await designSetBlend(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_reorder_layers\",\n \"Move a design layer to a new position in the z-order stack\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer to move\"),\n newIndex: z.number().describe(\"New position (0 = bottom, n-1 = top)\"),\n },\n async (args) => {\n try {\n const result = await designReorderLayers(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_duplicate_layer\",\n \"Clone a design layer with a new ID, inserted directly above the source\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer to duplicate\"),\n },\n async (args) => {\n try {\n const result = await designDuplicateLayer(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_toggle_visibility\",\n \"Show or hide a design layer\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer\"),\n visible: z.boolean().optional().describe(\"Set visibility (default: toggle)\"),\n },\n async (args) => {\n try {\n const result = await designToggleVisibility(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_lock_layer\",\n \"Lock or unlock a design layer to prevent accidental edits\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n layerId: z.string().describe(\"ID of the layer\"),\n locked: z.boolean().optional().describe(\"Set lock state (default: toggle)\"),\n },\n async (args) => {\n try {\n const result = await designLockLayer(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"design_capture_composite\",\n \"Get info about the design layer composite for a sketch. For full visual capture use capture_screenshot.\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Target sketch ID (default: selected sketch)\"),\n },\n async (args) => {\n try {\n const result = await designCaptureComposite(state, args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Knowledge Tools (Phase 5 stubs)\n// ---------------------------------------------------------------------------\n\nfunction registerKnowledgeTools(server: McpServer, _state: EditorState): void {\n server.tool(\n \"list_skills\",\n \"List all available design knowledge skills (Phase 5)\",\n {\n category: z\n .string()\n .optional()\n .describe(\"Filter by skill category\"),\n },\n async (args) => {\n try {\n const result = await listSkills(args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"load_skill\",\n \"Load a specific design knowledge skill with full content (Phase 5)\",\n {\n skillId: z.string().describe(\"ID of the skill to load\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer-specific examples (default: p5)\"),\n },\n async (args) => {\n try {\n const result = await loadSkill(args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"get_guidelines\",\n \"Return design guidelines and best practices for a topic (Phase 5)\",\n {\n topic: z\n .enum([\"composition\", \"color\", \"parameters\", \"animation\", \"performance\"])\n .describe(\"Guideline topic\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer-specific guidance\"),\n },\n async (args) => {\n try {\n const result = await getGuidelines(args);\n return jsonResult(result);\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n}\n","/**\n * Workspace management tools.\n * create_workspace, open_workspace, add_sketch_to_workspace,\n * remove_sketch_from_workspace, list_workspace_sketches\n */\n\nimport { readFile, writeFile, stat } from \"fs/promises\";\nimport { basename, dirname } from \"path\";\nimport {\n parseGenart,\n parseWorkspace,\n serializeWorkspace,\n type SketchDefinition,\n type WorkspaceDefinition,\n type WorkspaceSketchRef,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nfunction kebabify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\n// resolvePath removed — use state.resolvePath() for sandbox-aware path resolution\n\n/**\n * Arrange sketches in a grid, row, or column layout.\n * Returns position assignments.\n */\nfunction arrangePositions(\n sketches: { file: string; width: number; height: number }[],\n layout: \"grid\" | \"row\" | \"column\",\n spacing: number,\n): { file: string; position: { x: number; y: number } }[] {\n if (sketches.length === 0) return [];\n\n if (layout === \"row\") {\n let x = 0;\n return sketches.map((s) => {\n const pos = { file: s.file, position: { x, y: 0 } };\n x += s.width + spacing;\n return pos;\n });\n }\n\n if (layout === \"column\") {\n let y = 0;\n return sketches.map((s) => {\n const pos = { file: s.file, position: { x: 0, y } };\n y += s.height + spacing;\n return pos;\n });\n }\n\n // grid (default): row-major, cols = ceil(sqrt(n))\n const cols = Math.ceil(Math.sqrt(sketches.length));\n const maxW = Math.max(...sketches.map((s) => s.width));\n const maxH = Math.max(...sketches.map((s) => s.height));\n const cellW = maxW + spacing;\n const cellH = maxH + spacing;\n\n return sketches.map((s, i) => ({\n file: s.file,\n position: {\n x: (i % cols) * cellW,\n y: Math.floor(i / cols) * cellH,\n },\n }));\n}\n\n/**\n * Compute a viewport that fits all sketches.\n */\nfunction computeViewport(\n positions: { position: { x: number; y: number }; width?: number; height?: number }[],\n): { x: number; y: number; zoom: number } {\n if (positions.length === 0) return { x: 0, y: 0, zoom: 1 };\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of positions) {\n const w = p.width ?? 1200;\n const h = p.height ?? 1200;\n if (p.position.x < minX) minX = p.position.x;\n if (p.position.y < minY) minY = p.position.y;\n if (p.position.x + w > maxX) maxX = p.position.x + w;\n if (p.position.y + h > maxY) maxY = p.position.y + h;\n }\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const totalW = maxX - minX;\n const totalH = maxY - minY;\n // Assume ~1920x1080 viewport; fit all sketches with some margin\n const zoom = Math.min(1, Math.min(1920 / (totalW + 200), 1080 / (totalH + 200)));\n return { x: Math.round(centerX), y: Math.round(centerY), zoom: Math.round(zoom * 100) / 100 };\n}\n\n// ---------------------------------------------------------------------------\n// create_workspace\n// ---------------------------------------------------------------------------\n\nexport interface CreateWorkspaceInput {\n title: string;\n path: string;\n sketches?: string[];\n arrangement?: \"grid\" | \"row\" | \"column\";\n spacing?: number;\n}\n\nexport async function createWorkspace(\n state: EditorState,\n input: CreateWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const absPath = state.resolvePath(input.path);\n\n if (!absPath.endsWith(\".genart-workspace\")) {\n throw new Error(\"Path must end with .genart-workspace\");\n }\n\n if (!state.remoteMode) {\n const parentDir = dirname(absPath);\n if (!(await dirExists(parentDir))) {\n throw new Error(`Parent directory does not exist: ${parentDir}`);\n }\n if (await fileExists(absPath)) {\n throw new Error(\n `Workspace already exists at ${absPath}. Use open_workspace to load it.`,\n );\n }\n }\n\n // Load and validate initial sketches\n const sketchRefs: WorkspaceSketchRef[] = [];\n const sketchDefs: { file: string; width: number; height: number }[] = [];\n\n if (input.sketches && input.sketches.length > 0) {\n for (const sketchPath of input.sketches) {\n const absSketchPath = state.resolvePath(sketchPath);\n if (!(await fileExists(absSketchPath))) {\n throw new Error(`Sketch file not found: ${absSketchPath}`);\n }\n try {\n const raw = await readFile(absSketchPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const def = parseGenart(json);\n sketchDefs.push({\n file: basename(absSketchPath),\n width: def.canvas.width,\n height: def.canvas.height,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Invalid .genart file: ${absSketchPath} — ${msg}`);\n }\n }\n\n // Arrange sketches\n const layout = input.arrangement ?? \"grid\";\n const spacing = input.spacing ?? 200;\n const positions = arrangePositions(sketchDefs, layout, spacing);\n\n for (const p of positions) {\n sketchRefs.push({ file: p.file, position: p.position });\n }\n }\n\n const viewport = computeViewport(\n sketchRefs.map((r) => {\n const def = sketchDefs.find((d) => d.file === r.file);\n return { position: r.position, width: def?.width, height: def?.height };\n }),\n );\n\n const ts = now();\n const ws: WorkspaceDefinition = {\n \"genart-workspace\": \"1.0\",\n id: kebabify(input.title),\n title: input.title,\n created: ts,\n modified: ts,\n viewport,\n sketches: sketchRefs,\n };\n\n // Serialize workspace JSON\n const json = serializeWorkspace(ws);\n\n if (state.remoteMode) {\n // Remote mode: can't write to user's filesystem — set state directly,\n // file content is returned in the response for the client to write.\n state.workspacePath = absPath;\n state.workspace = ws;\n state.sketches.clear();\n state.selection.clear();\n state.emitMutation(\"workspace:loaded\", { path: absPath, title: ws.title });\n } else {\n // Local mode: write to disk and load (which also loads referenced sketches)\n await writeFile(absPath, json, \"utf-8\");\n await state.loadWorkspace(absPath);\n }\n state.emitMutation(\"workspace:updated\", { path: absPath });\n\n return {\n success: true,\n path: absPath,\n title: input.title,\n sketchCount: sketchRefs.length,\n viewport,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// open_workspace\n// ---------------------------------------------------------------------------\n\nexport interface OpenWorkspaceInput {\n path: string;\n}\n\nexport async function openWorkspace(\n state: EditorState,\n input: OpenWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const absPath = state.resolvePath(input.path);\n\n if (!absPath.endsWith(\".genart-workspace\")) {\n throw new Error(\"Path must end with .genart-workspace\");\n }\n\n if (!(await fileExists(absPath))) {\n throw new Error(`Workspace not found: ${absPath}`);\n }\n\n // Load workspace (this validates and loads all sketches)\n try {\n await state.loadWorkspace(absPath);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n // Distinguish parse errors from missing sketch files\n if (msg.includes(\"not found\") || msg.includes(\"ENOENT\")) {\n throw e;\n }\n throw new Error(`Invalid workspace file: ${absPath} — ${msg}`);\n }\n\n const ws = state.requireWorkspace();\n\n // Build sketch summaries\n const sketches = ws.sketches.map((ref) => {\n const loaded = state.getSketch(\n // Find by filename match\n [...state.sketches.entries()].find(\n ([, v]) => basename(v.path) === ref.file,\n )?.[0] ?? \"\",\n );\n const def = loaded?.definition;\n return {\n file: ref.file,\n position: ref.position,\n label: ref.label,\n id: def?.id,\n title: def?.title,\n renderer: def?.renderer ? { type: def.renderer.type, version: def.renderer.version } : undefined,\n canvas: def?.canvas ? { width: def.canvas.width, height: def.canvas.height } : undefined,\n locked: ref.locked ?? false,\n visible: ref.visible ?? true,\n };\n });\n\n state.emitMutation(\"workspace:updated\", { path: absPath });\n\n return {\n success: true,\n path: absPath,\n id: ws.id,\n title: ws.title,\n viewport: ws.viewport,\n sketchCount: ws.sketches.length,\n sketches,\n groups: ws.groups ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// add_sketch_to_workspace\n// ---------------------------------------------------------------------------\n\nexport interface AddSketchToWorkspaceInput {\n sketchPath: string;\n position?: { x: number; y: number };\n label?: string;\n}\n\nexport async function addSketchToWorkspace(\n state: EditorState,\n input: AddSketchToWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const absSketchPath = state.resolvePath(input.sketchPath);\n\n if (!(await fileExists(absSketchPath))) {\n throw new Error(`Sketch file not found: ${absSketchPath}`);\n }\n\n const file = basename(absSketchPath);\n\n // Check for duplicate\n if (ws.sketches.some((s) => s.file === file)) {\n throw new Error(\n `Sketch '${file}' is already in the workspace`,\n );\n }\n\n // Validate the sketch\n let def: SketchDefinition;\n try {\n def = await state.loadSketch(absSketchPath);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Invalid .genart file: ${absSketchPath} — ${msg}`);\n }\n\n // Auto-position if not specified: place to the right of the rightmost sketch\n const position = input.position ?? autoPosition(ws, def);\n\n const newRef: WorkspaceSketchRef = {\n file,\n position,\n ...(input.label ? { label: input.label } : {}),\n };\n\n // Update workspace (immutable — create new object)\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: [...ws.sketches, newRef],\n };\n\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { added: file });\n\n return {\n success: true,\n file,\n id: def.id,\n title: def.title,\n position,\n sketchCount: state.workspace.sketches.length,\n };\n}\n\nfunction autoPosition(\n ws: WorkspaceDefinition,\n def: SketchDefinition,\n): { x: number; y: number } {\n if (ws.sketches.length === 0) return { x: 0, y: 0 };\n\n // Place to the right of the rightmost sketch\n let maxRight = -Infinity;\n for (const s of ws.sketches) {\n const right = s.position.x + 1200; // Assume 1200 default width\n if (right > maxRight) maxRight = right;\n }\n return { x: maxRight + 200, y: 0 };\n}\n\n// ---------------------------------------------------------------------------\n// remove_sketch_from_workspace\n// ---------------------------------------------------------------------------\n\nexport interface RemoveSketchFromWorkspaceInput {\n sketchId: string;\n deleteFile?: boolean;\n}\n\nexport async function removeSketchFromWorkspace(\n state: EditorState,\n input: RemoveSketchFromWorkspaceInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n // Find the sketch by ID\n const loaded = state.getSketch(input.sketchId);\n if (!loaded) {\n throw new Error(`Sketch not found: '${input.sketchId}'`);\n }\n\n const file = basename(loaded.path);\n const hadSketch = ws.sketches.some((s) => s.file === file);\n if (!hadSketch) {\n throw new Error(`Sketch '${input.sketchId}' is not in the workspace`);\n }\n\n // Remove from sketches and groups\n const newSketches = ws.sketches.filter((s) => s.file !== file);\n const newGroups = ws.groups?.map((g) => ({\n ...g,\n sketchFiles: g.sketchFiles.filter((f) => f !== file),\n })).filter((g) => g.sketchFiles.length > 0);\n\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: newSketches,\n ...(newGroups && newGroups.length > 0 ? { groups: newGroups } : {}),\n };\n\n // Remove from state cache\n state.sketches.delete(input.sketchId);\n state.selection.delete(input.sketchId);\n\n // Optionally delete the file\n if (input.deleteFile) {\n const { unlink } = await import(\"fs/promises\");\n try {\n await unlink(loaded.path);\n } catch {\n // File may already be deleted\n }\n }\n\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { removed: file });\n\n return {\n success: true,\n removedId: input.sketchId,\n removedFile: file,\n fileDeleted: input.deleteFile ?? false,\n sketchCount: state.workspace.sketches.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// list_workspace_sketches\n// ---------------------------------------------------------------------------\n\nexport interface ListWorkspaceSketchesInput {\n includeState?: boolean;\n}\n\nexport async function listWorkspaceSketches(\n state: EditorState,\n input: ListWorkspaceSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const sketches = ws.sketches.map((ref) => {\n // Find loaded sketch by filename\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === ref.file,\n );\n const def = loaded?.definition;\n\n const entry: Record<string, unknown> = {\n file: ref.file,\n position: ref.position,\n label: ref.label,\n id: def?.id,\n title: def?.title,\n renderer: def?.renderer.type,\n canvas: def ? { width: def.canvas.width, height: def.canvas.height } : undefined,\n parameterCount: def?.parameters.length ?? 0,\n colorCount: def?.colors.length ?? 0,\n locked: ref.locked ?? false,\n visible: ref.visible ?? true,\n };\n\n if (input.includeState && def) {\n entry.state = def.state;\n }\n\n return entry;\n });\n\n return {\n success: true,\n workspace: {\n id: ws.id,\n title: ws.title,\n path: state.workspacePath,\n },\n sketchCount: sketches.length,\n sketches,\n };\n}\n","/**\n * Sketch lifecycle tools.\n * create_sketch, open_sketch, update_sketch, update_algorithm,\n * save_sketch, fork_sketch, delete_sketch\n */\n\nimport { readFile, writeFile, stat, unlink } from \"fs/promises\";\nimport { basename, dirname, resolve } from \"path\";\nimport {\n createDefaultRegistry,\n parseGenart,\n resolveComponents,\n resolvePreset,\n serializeGenart,\n serializeWorkspace,\n type ColorDef,\n type ParamDef,\n type RendererType,\n type SketchComponentDef,\n type SketchComponentValue,\n type SketchDefinition,\n type SketchState,\n type ThemeDef,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Shared constants\n// ---------------------------------------------------------------------------\n\nconst VALID_RENDERERS: readonly RendererType[] = [\n \"p5\",\n \"three\",\n \"glsl\",\n \"canvas2d\",\n \"svg\",\n];\nconst KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\n// resolvePath removed — use state.resolvePath() for sandbox-aware path resolution\n\nfunction validateRendererType(type: string): asserts type is RendererType {\n if (!VALID_RENDERERS.includes(type as RendererType)) {\n throw new Error(\n `Unknown renderer type: '${type}'. Valid types: ${VALID_RENDERERS.join(\", \")}`,\n );\n }\n}\n\nfunction validateKebabId(id: string): void {\n if (!KEBAB_RE.test(id)) {\n throw new Error(\n \"ID must be kebab-case: lowercase letters, numbers, hyphens\",\n );\n }\n}\n\nfunction validateParameters(parameters: ParamDef[]): void {\n const keys = new Set<string>();\n for (const p of parameters) {\n if (keys.has(p.key)) {\n throw new Error(`Duplicate parameter key: '${p.key}'`);\n }\n keys.add(p.key);\n if (p.default < p.min || p.default > p.max) {\n throw new Error(\n `Parameter '${p.key}' default (${p.default}) outside range [${p.min}, ${p.max}]`,\n );\n }\n }\n}\n\nfunction resolveCanvas(\n canvas?: { preset?: string; width?: number; height?: number },\n): { width: number; height: number } {\n if (!canvas) {\n return resolvePreset(\"square-1200\");\n }\n if (canvas.preset) {\n return resolvePreset(canvas.preset);\n }\n return {\n width: canvas.width ?? 1200,\n height: canvas.height ?? 1200,\n };\n}\n\nfunction buildState(\n parameters: readonly ParamDef[],\n colors: readonly ColorDef[],\n seed: number,\n): SketchState {\n const params: Record<string, number> = {};\n for (const p of parameters) {\n params[p.key] = p.default;\n }\n const colorPalette = colors.map((c) => c.default);\n return { seed, params, colorPalette };\n}\n\n// ---------------------------------------------------------------------------\n// create_sketch\n// ---------------------------------------------------------------------------\n\nexport interface CreateSketchInput {\n id: string;\n title: string;\n path: string;\n renderer?: string;\n canvas?: { preset?: string; width?: number; height?: number };\n philosophy?: string;\n parameters?: ParamDef[];\n colors?: ColorDef[];\n themes?: ThemeDef[];\n algorithm?: string;\n seed?: number;\n skills?: string[];\n components?: Record<string, string | { version?: string; code?: string; exports?: string[] }>;\n addToWorkspace?: string;\n agent?: string;\n model?: string;\n}\n\nexport async function createSketch(\n state: EditorState,\n input: CreateSketchInput,\n): Promise<Record<string, unknown>> {\n const absPath = state.resolvePath(input.path);\n\n if (!absPath.endsWith(\".genart\")) {\n throw new Error(\"Path must end with .genart\");\n }\n\n validateKebabId(input.id);\n\n if (!state.remoteMode && await fileExists(absPath)) {\n throw new Error(\n `File already exists at ${absPath}. Use update_sketch or fork_sketch.`,\n );\n }\n\n const rendererType = (input.renderer ?? \"p5\") as string;\n validateRendererType(rendererType);\n\n const canvasDims = resolveCanvas(input.canvas);\n const parameters = input.parameters ?? [];\n const colors = input.colors ?? [];\n\n if (parameters.length > 0) {\n validateParameters(parameters);\n }\n\n // Get algorithm from input or renderer template\n let algorithm = input.algorithm;\n if (!algorithm) {\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(rendererType);\n algorithm = adapter.getAlgorithmTemplate();\n }\n\n // Resolve components if provided\n let resolvedComponents: Record<string, SketchComponentDef> | undefined;\n if (input.components && Object.keys(input.components).length > 0) {\n // Build shorthand map for the resolver\n const shorthand: Record<string, string> = {};\n for (const [name, value] of Object.entries(input.components)) {\n if (typeof value === \"string\") {\n shorthand[name] = value;\n } else if (value.version) {\n shorthand[name] = value.version;\n } else if (value.code) {\n // Inline component — skip resolver, include directly\n if (!resolvedComponents) resolvedComponents = {};\n resolvedComponents[name] = {\n ...(value.version ? { version: value.version } : {}),\n code: value.code,\n ...(value.exports ? { exports: value.exports } : {}),\n };\n }\n }\n\n // Resolve registry components\n if (Object.keys(shorthand).length > 0) {\n const resolved = resolveComponents(shorthand, rendererType as RendererType);\n if (!resolvedComponents) resolvedComponents = {};\n for (const rc of resolved) {\n resolvedComponents[rc.name] = {\n version: rc.version,\n code: rc.code,\n exports: [...rc.exports],\n };\n }\n }\n }\n\n const seed =\n input.seed ?? Math.floor(Math.random() * 100000);\n const ts = now();\n const hasComponents = resolvedComponents && Object.keys(resolvedComponents).length > 0;\n\n const sketch: SketchDefinition = {\n genart: hasComponents ? \"1.2\" : \"1.1\",\n id: input.id,\n title: input.title,\n created: ts,\n modified: ts,\n renderer: { type: rendererType, version: \"1.x\" },\n canvas: canvasDims,\n parameters,\n colors,\n state: buildState(parameters, colors, seed),\n algorithm,\n ...(input.philosophy ? { philosophy: input.philosophy } : {}),\n ...(input.themes && input.themes.length > 0\n ? { themes: input.themes }\n : {}),\n ...(input.skills && input.skills.length > 0\n ? { skills: input.skills }\n : {}),\n ...(hasComponents ? { components: resolvedComponents } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Serialize sketch JSON\n const json = serializeGenart(sketch);\n\n // Write to disk in local mode\n if (!state.remoteMode) {\n await writeFile(absPath, json, \"utf-8\");\n }\n\n // Load into state\n state.sketches.set(input.id, { definition: sketch, path: absPath });\n state.emitMutation(\"sketch:created\", { id: input.id, path: absPath });\n\n // In remote sessions, auto-manage the workspace so every sketch is visible\n // in the editor without requiring explicit workspace tools.\n if (state.remoteMode && !input.addToWorkspace) {\n const file = basename(absPath);\n if (!state.workspace) {\n // Auto-create a workspace for the first sketch in this session\n const ts = now();\n state.workspace = {\n \"genart-workspace\": \"1.0\",\n id: \"session\",\n title: \"genart.dev\",\n created: ts,\n modified: ts,\n viewport: { x: 0, y: 0, zoom: 1 },\n sketches: [{ file, position: { x: 0, y: 0 } }],\n };\n state.workspacePath = state.resolvePath(\"workspace.genart-workspace\");\n state.emitMutation(\"workspace:loaded\", { path: state.workspacePath, title: state.workspace.title });\n } else {\n // Add to the existing auto-created workspace\n let maxRight = 0;\n for (const s of state.workspace.sketches) {\n const right = s.position.x + 1200;\n if (right > maxRight) maxRight = right;\n }\n state.workspace = {\n ...state.workspace,\n modified: now(),\n sketches: [...state.workspace.sketches, { file, position: { x: maxRight + 200, y: 0 } }],\n };\n state.emitMutation(\"workspace:updated\", { added: file });\n }\n }\n\n // Optionally add to a specific workspace (local mode / explicit path)\n let workspaceContent: string | undefined;\n if (input.addToWorkspace) {\n // If workspace is open and matches the requested path, add the sketch ref\n const wsPath = state.resolvePath(input.addToWorkspace);\n if (state.workspace && state.workspacePath === wsPath) {\n const file = basename(absPath);\n const ws = state.requireWorkspace();\n // Auto-position to the right of existing sketches\n let maxRight = 0;\n for (const s of ws.sketches) {\n const right = s.position.x + 1200;\n if (right > maxRight) maxRight = right;\n }\n const position =\n ws.sketches.length === 0\n ? { x: 0, y: 0 }\n : { x: maxRight + 200, y: 0 };\n\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: [...ws.sketches, { file, position }],\n };\n\n workspaceContent = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(wsPath, workspaceContent, \"utf-8\");\n }\n state.emitMutation(\"workspace:updated\", { added: file });\n }\n }\n\n return {\n success: true,\n path: absPath,\n id: input.id,\n title: input.title,\n renderer: rendererType,\n canvas: canvasDims,\n seed,\n fileContent: json,\n ...(workspaceContent ? { workspaceContent } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// open_sketch\n// ---------------------------------------------------------------------------\n\nexport interface OpenSketchInput {\n sketchId: string;\n}\n\nexport async function openSketch(\n state: EditorState,\n input: OpenSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n // Set selection to this sketch\n state.setSelection([input.sketchId]);\n state.emitMutation(\"selection:changed\", { selected: [input.sketchId] });\n\n return {\n success: true,\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n seed: def.state.seed,\n philosophy: def.philosophy ?? null,\n algorithmLength: def.algorithm.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// update_sketch\n// ---------------------------------------------------------------------------\n\nexport interface UpdateSketchInput {\n sketchId: string;\n title?: string;\n philosophy?: string;\n canvas?: { preset?: string; width?: number; height?: number };\n parameters?: ParamDef[];\n colors?: ColorDef[];\n themes?: ThemeDef[];\n seed?: number;\n skills?: string[];\n agent?: string;\n model?: string;\n}\n\nexport async function updateSketch(\n state: EditorState,\n input: UpdateSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const updatableFields = [\n \"title\",\n \"philosophy\",\n \"canvas\",\n \"parameters\",\n \"colors\",\n \"themes\",\n \"seed\",\n \"skills\",\n ] as const;\n\n const updated: string[] = [];\n for (const field of updatableFields) {\n if (input[field] !== undefined) {\n updated.push(field);\n }\n }\n\n if (updated.length === 0) {\n throw new Error(\n \"No fields to update. Provide at least one of: title, philosophy, canvas, parameters, colors, themes, seed, skills\",\n );\n }\n\n // Validate new parameters if provided\n if (input.parameters) {\n validateParameters(input.parameters);\n }\n\n // Resolve canvas if provided\n let canvasDims = { width: def.canvas.width, height: def.canvas.height };\n if (input.canvas) {\n canvasDims = resolveCanvas(input.canvas);\n }\n\n // Build new state\n const newParams = input.parameters ?? def.parameters;\n const newColors = input.colors ?? def.colors;\n const newSeed = input.seed ?? def.state.seed;\n const newState = buildState(newParams, newColors, newSeed);\n\n const newDef: SketchDefinition = {\n ...def,\n modified: now(),\n canvas: canvasDims,\n parameters: newParams,\n colors: newColors,\n state: newState,\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.philosophy !== undefined\n ? { philosophy: input.philosophy }\n : {}),\n ...(input.themes !== undefined ? { themes: input.themes } : {}),\n ...(input.seed !== undefined\n ? { state: { ...newState, seed: input.seed } }\n : {}),\n ...(input.skills !== undefined ? { skills: input.skills } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Update in state and save\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated });\n\n return {\n success: true,\n sketchId: input.sketchId,\n updated,\n canvas: canvasDims,\n parameterCount: newDef.parameters.length,\n colorCount: newDef.colors.length,\n seed: newDef.state.seed,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// update_algorithm\n// ---------------------------------------------------------------------------\n\nexport interface UpdateAlgorithmInput {\n sketchId: string;\n algorithm: string;\n validate?: boolean;\n components?: Record<string, string | { version?: string; code?: string; exports?: string[] }>;\n agent?: string;\n model?: string;\n}\n\nexport async function updateAlgorithm(\n state: EditorState,\n input: UpdateAlgorithmInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n if (!input.algorithm || input.algorithm.trim() === \"\") {\n throw new Error(\"Algorithm cannot be empty\");\n }\n\n const shouldValidate = input.validate !== false;\n let validationPassed = true;\n\n if (shouldValidate) {\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(def.renderer.type);\n const result = adapter.validate(input.algorithm);\n if (!result.valid) {\n throw new Error(\n `Algorithm validation failed: ${result.errors.join(\"; \")}`,\n );\n }\n }\n\n // Resolve components if provided\n let resolvedComponents: Record<string, SketchComponentDef> | undefined;\n if (input.components && Object.keys(input.components).length > 0) {\n const renderer = def.renderer.type;\n const shorthand: Record<string, string> = {};\n for (const [name, value] of Object.entries(input.components)) {\n if (typeof value === \"string\") {\n shorthand[name] = value;\n } else if (value.version) {\n shorthand[name] = value.version;\n } else if (value.code) {\n if (!resolvedComponents) resolvedComponents = {};\n resolvedComponents[name] = {\n ...(value.version ? { version: value.version } : {}),\n code: value.code,\n ...(value.exports ? { exports: value.exports } : {}),\n };\n }\n }\n if (Object.keys(shorthand).length > 0) {\n const resolved = resolveComponents(shorthand, renderer);\n if (!resolvedComponents) resolvedComponents = {};\n for (const rc of resolved) {\n resolvedComponents[rc.name] = {\n version: rc.version,\n code: rc.code,\n exports: [...rc.exports],\n };\n }\n }\n }\n\n const updated: string[] = [\"algorithm\"];\n const hasNewComponents = resolvedComponents && Object.keys(resolvedComponents).length > 0;\n if (hasNewComponents) updated.push(\"components\");\n\n const newDef: SketchDefinition = {\n ...def,\n modified: now(),\n algorithm: input.algorithm,\n ...(hasNewComponents\n ? { genart: \"1.2\" as const, components: resolvedComponents }\n : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", {\n id: input.sketchId,\n updated,\n });\n\n return {\n success: true,\n sketchId: input.sketchId,\n renderer: def.renderer.type,\n algorithmLength: input.algorithm.length,\n validationPassed,\n ...(hasNewComponents ? { componentsUpdated: true } : {}),\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// save_sketch\n// ---------------------------------------------------------------------------\n\nexport interface SaveSketchInput {\n sketchId: string;\n}\n\nexport async function saveSketch(\n state: EditorState,\n input: SaveSketchInput,\n): Promise<Record<string, unknown>> {\n const loaded = state.requireSketch(input.sketchId);\n\n // Update modified timestamp\n const newDef: SketchDefinition = {\n ...loaded.definition,\n modified: now(),\n };\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:saved\", { id: input.sketchId, path: loaded.path });\n\n return {\n success: true,\n sketchId: input.sketchId,\n path: loaded.path,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// fork_sketch\n// ---------------------------------------------------------------------------\n\nexport interface ForkSketchInput {\n sourceId: string;\n newId: string;\n title?: string;\n position?: { x: number; y: number };\n modifications?: {\n renderer?: string;\n canvas?: { preset?: string; width?: number; height?: number };\n parameters?: ParamDef[];\n colors?: ColorDef[];\n algorithm?: string;\n philosophy?: string;\n };\n newSeed?: boolean;\n agent?: string;\n model?: string;\n}\n\nexport async function forkSketch(\n state: EditorState,\n input: ForkSketchInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const source = state.requireSketch(input.sourceId);\n const sourceDef = source.definition;\n\n validateKebabId(input.newId);\n\n // Check if newId already exists in workspace\n if (state.getSketch(input.newId)) {\n throw new Error(\n `Sketch with ID '${input.newId}' already exists in workspace`,\n );\n }\n\n // Determine file path: same directory as source\n const sourceDir = dirname(source.path);\n const newPath = resolve(sourceDir, `${input.newId}.genart`);\n\n if (await fileExists(newPath)) {\n throw new Error(`File already exists at ${newPath}`);\n }\n\n // Apply modifications\n const mods = input.modifications ?? {};\n\n let rendererType = sourceDef.renderer.type as string;\n if (mods.renderer) {\n validateRendererType(mods.renderer);\n rendererType = mods.renderer;\n }\n\n const canvasDims = mods.canvas\n ? resolveCanvas(mods.canvas)\n : { width: sourceDef.canvas.width, height: sourceDef.canvas.height };\n\n const parameters = mods.parameters ?? [...sourceDef.parameters];\n const colors = mods.colors ?? [...sourceDef.colors];\n const algorithm = mods.algorithm ?? sourceDef.algorithm;\n const philosophy = mods.philosophy ?? sourceDef.philosophy;\n\n const generateNewSeed = input.newSeed !== false;\n const seed = generateNewSeed\n ? Math.floor(Math.random() * 100000)\n : sourceDef.state.seed;\n\n const title = input.title ?? `${sourceDef.title} (fork)`;\n const ts = now();\n\n const forkedDef: SketchDefinition = {\n genart: \"1.1\",\n id: input.newId,\n title,\n created: ts,\n modified: ts,\n renderer: { type: rendererType as RendererType, version: \"1.x\" },\n canvas: canvasDims,\n parameters,\n colors,\n state: buildState(parameters, colors, seed),\n algorithm,\n ...(philosophy ? { philosophy } : {}),\n ...(sourceDef.themes ? { themes: [...sourceDef.themes] } : {}),\n ...(sourceDef.skills ? { skills: [...sourceDef.skills] } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Serialize sketch JSON\n const json = serializeGenart(forkedDef);\n\n if (!state.remoteMode) {\n await writeFile(newPath, json, \"utf-8\");\n }\n\n // Load into state\n state.sketches.set(input.newId, { definition: forkedDef, path: newPath });\n\n // Auto-position: to the right of source sketch in workspace\n let position = input.position;\n if (!position) {\n const sourceRef = ws.sketches.find(\n (s) => s.file === basename(source.path),\n );\n if (sourceRef) {\n position = {\n x: sourceRef.position.x + sourceDef.canvas.width + 200,\n y: sourceRef.position.y,\n };\n } else {\n position = { x: 0, y: 0 };\n }\n }\n\n // Add to workspace\n const file = basename(newPath);\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: [...ws.sketches, { file, position }],\n };\n\n const workspaceJson = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(state.workspacePath!, workspaceJson, \"utf-8\");\n }\n\n state.emitMutation(\"sketch:created\", { id: input.newId, path: newPath });\n state.emitMutation(\"workspace:updated\", { added: file });\n\n return {\n success: true,\n sourceId: input.sourceId,\n forkedSketch: {\n id: input.newId,\n title,\n path: newPath,\n renderer: rendererType,\n canvas: canvasDims,\n seed,\n position,\n },\n fileContent: json,\n workspaceContent: workspaceJson,\n };\n}\n\n// ---------------------------------------------------------------------------\n// delete_sketch\n// ---------------------------------------------------------------------------\n\nexport interface DeleteSketchInput {\n sketchId: string;\n keepFile?: boolean;\n}\n\nexport async function deleteSketch(\n state: EditorState,\n input: DeleteSketchInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const file = basename(loaded.path);\n\n // Remove from workspace sketches\n const newSketches = ws.sketches.filter((s) => s.file !== file);\n\n // Clean up groups\n const newGroups = ws.groups\n ?.map((g) => ({\n ...g,\n sketchFiles: g.sketchFiles.filter((f) => f !== file),\n }))\n .filter((g) => g.sketchFiles.length > 0);\n\n state.workspace = {\n ...ws,\n modified: now(),\n sketches: newSketches,\n ...(newGroups && newGroups.length > 0 ? { groups: newGroups } : {}),\n };\n\n // Remove from state cache and selection\n state.sketches.delete(input.sketchId);\n state.selection.delete(input.sketchId);\n\n // Delete file from disk unless keepFile is true\n const shouldDelete = !input.keepFile;\n if (shouldDelete) {\n try {\n await unlink(loaded.path);\n } catch {\n // File may already be deleted\n }\n }\n\n await state.saveWorkspace();\n state.emitMutation(\"sketch:deleted\", { id: input.sketchId });\n state.emitMutation(\"workspace:updated\", { removed: file });\n\n return {\n success: true,\n deletedId: input.sketchId,\n path: loaded.path,\n fileDeleted: shouldDelete,\n sketchCount: state.workspace.sketches.length,\n };\n}\n","/**\n * Selection and context tools.\n * get_selection, select_sketch, get_editor_state\n */\n\nimport { basename } from \"path\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// get_selection\n// ---------------------------------------------------------------------------\n\nexport interface GetSelectionInput {\n includeAlgorithm?: boolean;\n includePhilosophy?: boolean;\n includeNeighbors?: boolean;\n}\n\nexport async function getSelection(\n state: EditorState,\n input: GetSelectionInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const includeAlgorithm = input.includeAlgorithm !== false;\n const includePhilosophy = input.includePhilosophy !== false;\n const includeNeighbors = input.includeNeighbors === true;\n\n const selected: Record<string, unknown>[] = [];\n\n for (const id of state.selection) {\n const loaded = state.getSketch(id);\n if (!loaded) continue;\n\n const def = loaded.definition;\n const ref = ws.sketches.find((s) => s.file === basename(loaded.path));\n\n const entry: Record<string, unknown> = {\n id: def.id,\n title: def.title,\n path: loaded.path,\n renderer: { type: def.renderer.type, version: def.renderer.version },\n canvas: { preset: undefined, width: def.canvas.width, height: def.canvas.height },\n state: def.state,\n parameters: def.parameters,\n colors: def.colors,\n themes: def.themes ?? [],\n skills: def.skills ?? [],\n position: ref?.position ?? { x: 0, y: 0 },\n snapshotCount: def.snapshots?.length ?? 0,\n };\n\n if (includePhilosophy) {\n entry.philosophy = def.philosophy ?? null;\n }\n\n if (includeAlgorithm) {\n entry.algorithm = def.algorithm;\n }\n\n selected.push(entry);\n }\n\n // Compute neighbors if requested\n const neighbors: Record<string, unknown>[] = [];\n if (includeNeighbors && selected.length > 0) {\n const selectedIds = new Set(state.selection);\n\n for (const ref of ws.sketches) {\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === ref.file,\n );\n if (!loaded || selectedIds.has(loaded.definition.id)) continue;\n\n // Check if within 2000px of any selected sketch\n const isNear = selected.some((sel) => {\n const selPos = sel.position as { x: number; y: number };\n const dx = Math.abs(ref.position.x - selPos.x);\n const dy = Math.abs(ref.position.y - selPos.y);\n return dx <= 2000 && dy <= 2000;\n });\n\n if (isNear) {\n neighbors.push({\n id: loaded.definition.id,\n title: loaded.definition.title,\n renderer: loaded.definition.renderer.type,\n position: ref.position,\n });\n }\n }\n }\n\n return {\n selected,\n workspace: {\n id: ws.id,\n title: ws.title,\n sketchCount: ws.sketches.length,\n },\n neighbors,\n };\n}\n\n// ---------------------------------------------------------------------------\n// select_sketch\n// ---------------------------------------------------------------------------\n\nexport interface SelectSketchInput {\n sketchIds: string[];\n addToSelection?: boolean;\n}\n\nexport async function selectSketch(\n state: EditorState,\n input: SelectSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n\n if (!input.sketchIds || input.sketchIds.length === 0) {\n throw new Error(\"At least one sketch ID is required\");\n }\n\n // Validate all IDs exist\n for (const id of input.sketchIds) {\n state.requireSketch(id);\n }\n\n if (input.addToSelection) {\n for (const id of input.sketchIds) {\n state.selection.add(id);\n }\n } else {\n state.setSelection(input.sketchIds);\n }\n\n const selected = [...state.selection];\n state.emitMutation(\"selection:changed\", { selected });\n\n return {\n success: true,\n selected,\n selectionCount: selected.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// get_editor_state\n// ---------------------------------------------------------------------------\n\nexport async function getEditorState(\n state: EditorState,\n): Promise<Record<string, unknown>> {\n if (!state.workspace) {\n return {\n hasWorkspace: false,\n workingDirectory: state.basePath,\n workspace: null,\n selection: [],\n sketches: [],\n };\n }\n\n const ws = state.workspace;\n const sketches = [...state.sketches.values()].map((loaded) => {\n const def = loaded.definition;\n return {\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n seed: def.state.seed,\n };\n });\n\n return {\n hasWorkspace: true,\n workingDirectory: state.basePath,\n workspace: {\n id: ws.id,\n title: ws.title,\n path: state.workspacePath,\n sketchCount: ws.sketches.length,\n viewport: ws.viewport,\n groups: ws.groups ?? [],\n },\n selection: [...state.selection],\n sketches,\n };\n}\n","/**\n * Parameter manipulation tools.\n * set_parameters, set_colors, set_seed, set_canvas_size, randomize_parameters\n */\n\nimport {\n resolvePreset,\n type SketchDefinition,\n type SketchState,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst HEX_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\nfunction updateSketchInState(\n state: EditorState,\n id: string,\n newDef: SketchDefinition,\n): void {\n const loaded = state.requireSketch(id);\n state.sketches.set(id, { definition: newDef, path: loaded.path });\n}\n\n// ---------------------------------------------------------------------------\n// set_parameters\n// ---------------------------------------------------------------------------\n\nexport interface SetParametersInput {\n sketchId: string;\n params: Record<string, number>;\n}\n\nexport async function setParameters(\n state: EditorState,\n input: SetParametersInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const validKeys = new Set(def.parameters.map((p) => p.key));\n const updated: string[] = [];\n\n // Validate all keys and values\n for (const [key, value] of Object.entries(input.params)) {\n if (!validKeys.has(key)) {\n throw new Error(\n `Unknown parameter: '${key}'. Valid keys: ${[...validKeys].join(\", \")}`,\n );\n }\n const paramDef = def.parameters.find((p) => p.key === key)!;\n if (value < paramDef.min || value > paramDef.max) {\n throw new Error(\n `Parameter '${key}' value ${value} outside range [${paramDef.min}, ${paramDef.max}]`,\n );\n }\n updated.push(key);\n }\n\n const newParams = { ...def.state.params, ...input.params };\n const newState: SketchState = { ...def.state, params: newParams };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"params\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n updated,\n state: newState,\n };\n}\n\n// ---------------------------------------------------------------------------\n// set_colors\n// ---------------------------------------------------------------------------\n\nexport interface SetColorsInput {\n sketchId: string;\n colors: Record<string, string>;\n}\n\nexport async function setColors(\n state: EditorState,\n input: SetColorsInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const colorDefs = def.colors;\n const validKeys = new Set(colorDefs.map((c) => c.key));\n const updated: string[] = [];\n\n // Validate all keys and values\n for (const [key, value] of Object.entries(input.colors)) {\n if (!validKeys.has(key)) {\n throw new Error(\n `Unknown color: '${key}'. Valid keys: ${[...validKeys].join(\", \")}`,\n );\n }\n if (!HEX_RE.test(value)) {\n throw new Error(`Invalid hex color for '${key}': '${value}'`);\n }\n updated.push(key);\n }\n\n // Build new colorPalette array preserving order from color definitions\n const newPalette = colorDefs.map((cDef) => {\n if (input.colors[cDef.key] !== undefined) {\n return input.colors[cDef.key];\n }\n // Keep existing value from current palette\n const idx = colorDefs.findIndex((c) => c.key === cDef.key);\n return def.state.colorPalette[idx] ?? cDef.default;\n });\n\n const newState: SketchState = { ...def.state, colorPalette: newPalette };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"colors\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n updated,\n colorPalette: newPalette,\n };\n}\n\n// ---------------------------------------------------------------------------\n// set_seed\n// ---------------------------------------------------------------------------\n\nexport interface SetSeedInput {\n sketchId: string;\n seed?: number;\n}\n\nexport async function setSeed(\n state: EditorState,\n input: SetSeedInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const previousSeed = def.state.seed;\n const newSeed = input.seed ?? Math.floor(Math.random() * 100000);\n\n const newState: SketchState = { ...def.state, seed: newSeed };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"seed\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n seed: newSeed,\n previousSeed,\n };\n}\n\n// ---------------------------------------------------------------------------\n// set_canvas_size\n// ---------------------------------------------------------------------------\n\nexport interface SetCanvasSizeInput {\n sketchId: string;\n preset?: string;\n width?: number;\n height?: number;\n}\n\nexport async function setCanvasSize(\n state: EditorState,\n input: SetCanvasSizeInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n const previousCanvas = { width: def.canvas.width, height: def.canvas.height };\n\n let newCanvas: { width: number; height: number };\n if (input.preset) {\n newCanvas = resolvePreset(input.preset);\n } else if (input.width !== undefined && input.height !== undefined) {\n newCanvas = { width: input.width, height: input.height };\n } else {\n throw new Error(\"Provide either a preset or both width and height\");\n }\n\n const newDef: SketchDefinition = { ...def, modified: now(), canvas: newCanvas };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"canvas\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n canvas: newCanvas,\n previousCanvas,\n };\n}\n\n// ---------------------------------------------------------------------------\n// randomize_parameters\n// ---------------------------------------------------------------------------\n\nexport interface RandomizeParametersInput {\n sketchId: string;\n paramKeys?: string[];\n newSeed?: boolean;\n}\n\nexport async function randomizeParameters(\n state: EditorState,\n input: RandomizeParametersInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n if (def.parameters.length === 0) {\n throw new Error(\"Sketch has no parameters to randomize\");\n }\n\n // Determine which parameters to randomize\n let paramsToRandomize = def.parameters;\n if (input.paramKeys && input.paramKeys.length > 0) {\n const validKeys = new Set(def.parameters.map((p) => p.key));\n for (const key of input.paramKeys) {\n if (!validKeys.has(key)) {\n throw new Error(\n `Unknown parameter: '${key}'. Valid keys: ${[...validKeys].join(\", \")}`,\n );\n }\n }\n const keySet = new Set(input.paramKeys);\n paramsToRandomize = def.parameters.filter((p) => keySet.has(p.key));\n }\n\n // Generate random values within each parameter's range, respecting step\n const newParams = { ...def.state.params };\n const randomized: string[] = [];\n for (const paramDef of paramsToRandomize) {\n const steps = Math.round((paramDef.max - paramDef.min) / paramDef.step);\n const randomStep = Math.floor(Math.random() * (steps + 1));\n newParams[paramDef.key] = paramDef.min + randomStep * paramDef.step;\n randomized.push(paramDef.key);\n }\n\n const newSeed = input.newSeed\n ? Math.floor(Math.random() * 100000)\n : def.state.seed;\n\n const newState: SketchState = { ...def.state, params: newParams, seed: newSeed };\n const newDef: SketchDefinition = { ...def, modified: now(), state: newState };\n\n updateSketchInState(state, input.sketchId, newDef);\n await state.saveSketch(input.sketchId);\n state.emitMutation(\"sketch:updated\", { id: input.sketchId, updated: [\"params\"] });\n\n return {\n success: true,\n sketchId: input.sketchId,\n randomized,\n state: newState,\n };\n}\n","/**\n * Spatial arrangement tools.\n * arrange_sketches, auto_arrange, group_sketches\n */\n\nimport { basename } from \"path\";\nimport type { WorkspaceDefinition, WorkspaceGroup } from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\n/** Get sketch dimensions from the loaded state. */\nfunction getSketchDimensions(\n state: EditorState,\n sketchId: string,\n): { width: number; height: number } {\n const loaded = state.getSketch(sketchId);\n if (!loaded) return { width: 1200, height: 1200 };\n return {\n width: loaded.definition.canvas.width,\n height: loaded.definition.canvas.height,\n };\n}\n\n/** Compute a viewport that fits all positions. */\nfunction computeViewport(\n positions: { position: { x: number; y: number }; width: number; height: number }[],\n): { x: number; y: number; zoom: number } {\n if (positions.length === 0) return { x: 0, y: 0, zoom: 1 };\n\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const p of positions) {\n if (p.position.x < minX) minX = p.position.x;\n if (p.position.y < minY) minY = p.position.y;\n if (p.position.x + p.width > maxX) maxX = p.position.x + p.width;\n if (p.position.y + p.height > maxY) maxY = p.position.y + p.height;\n }\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const totalW = maxX - minX;\n const totalH = maxY - minY;\n const zoom = Math.min(\n 1,\n Math.min(1920 / (totalW + 200), 1080 / (totalH + 200)),\n );\n return {\n x: Math.round(centerX),\n y: Math.round(centerY),\n zoom: Math.round(zoom * 100) / 100,\n };\n}\n\n/** Layout sketches in a grid pattern. */\nfunction layoutGrid(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n if (items.length === 0) return [];\n\n const cols = Math.ceil(Math.sqrt(items.length));\n const maxW = Math.max(...items.map((s) => s.width));\n const maxH = Math.max(...items.map((s) => s.height));\n const cellW = maxW + spacing;\n const cellH = maxH + spacing;\n\n return items.map((s, i) => ({\n id: s.id,\n position: {\n x: origin.x + (i % cols) * cellW,\n y: origin.y + Math.floor(i / cols) * cellH,\n },\n }));\n}\n\n/** Layout sketches in a row. */\nfunction layoutRow(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n let x = origin.x;\n return items.map((s) => {\n const pos = { id: s.id, position: { x, y: origin.y } };\n x += s.width + spacing;\n return pos;\n });\n}\n\n/** Layout sketches in a column. */\nfunction layoutColumn(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n let y = origin.y;\n return items.map((s) => {\n const pos = { id: s.id, position: { x: origin.x, y } };\n y += s.height + spacing;\n return pos;\n });\n}\n\n/** Layout sketches in a masonry pattern (shortest column first). */\nfunction layoutMasonry(\n items: { id: string; width: number; height: number }[],\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n if (items.length === 0) return [];\n\n const cols = Math.ceil(Math.sqrt(items.length));\n const maxW = Math.max(...items.map((s) => s.width));\n const cellW = maxW + spacing;\n\n // Track the current height of each column\n const columnHeights = new Array(cols).fill(0) as number[];\n const result: { id: string; position: { x: number; y: number } }[] = [];\n\n for (const item of items) {\n // Find the shortest column\n let minCol = 0;\n for (let c = 1; c < cols; c++) {\n if (columnHeights[c]! < columnHeights[minCol]!) minCol = c;\n }\n\n result.push({\n id: item.id,\n position: {\n x: origin.x + minCol * cellW,\n y: origin.y + columnHeights[minCol]!,\n },\n });\n\n columnHeights[minCol]! += item.height + spacing;\n }\n\n return result;\n}\n\nconst VALID_LAYOUTS = [\"grid\", \"row\", \"column\", \"masonry\"] as const;\ntype LayoutType = (typeof VALID_LAYOUTS)[number];\n\nfunction applyLayout(\n items: { id: string; width: number; height: number }[],\n layout: LayoutType,\n spacing: number,\n origin: { x: number; y: number },\n): { id: string; position: { x: number; y: number } }[] {\n switch (layout) {\n case \"row\":\n return layoutRow(items, spacing, origin);\n case \"column\":\n return layoutColumn(items, spacing, origin);\n case \"masonry\":\n return layoutMasonry(items, spacing, origin);\n case \"grid\":\n default:\n return layoutGrid(items, spacing, origin);\n }\n}\n\n// ---------------------------------------------------------------------------\n// arrange_sketches\n// ---------------------------------------------------------------------------\n\nexport interface ArrangeSketchesInput {\n positions: { sketchId: string; x: number; y: number }[];\n}\n\nexport async function arrangeSketches(\n state: EditorState,\n input: ArrangeSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!input.positions || input.positions.length === 0) {\n throw new Error(\"At least one position is required\");\n }\n\n // Validate all sketch IDs\n for (const pos of input.positions) {\n state.requireSketch(pos.sketchId);\n }\n\n // Build a map of sketchId → file for workspace refs\n const idToFile = new Map<string, string>();\n for (const [id, loaded] of state.sketches) {\n idToFile.set(id, basename(loaded.path));\n }\n\n // Update positions in workspace\n const positionMap = new Map(\n input.positions.map((p) => [idToFile.get(p.sketchId)!, { x: p.x, y: p.y }]),\n );\n\n const newSketches = ws.sketches.map((ref) => {\n const newPos = positionMap.get(ref.file);\n if (newPos) {\n return { ...ref, position: newPos };\n }\n return ref;\n });\n\n // Compute viewport for moved sketches\n const viewportItems = input.positions.map((p) => {\n const dims = getSketchDimensions(state, p.sketchId);\n return { position: { x: p.x, y: p.y }, width: dims.width, height: dims.height };\n });\n const viewport = computeViewport(viewportItems);\n\n state.workspace = { ...ws, modified: now(), sketches: newSketches, viewport };\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { arranged: input.positions.length });\n\n return {\n success: true,\n moved: input.positions.length,\n positions: input.positions.map((p) => ({\n id: p.sketchId,\n position: { x: p.x, y: p.y },\n })),\n viewport,\n };\n}\n\n// ---------------------------------------------------------------------------\n// auto_arrange\n// ---------------------------------------------------------------------------\n\nexport interface AutoArrangeInput {\n layout?: string;\n sketchIds?: string[];\n spacing?: number;\n sortBy?: string;\n origin?: { x: number; y: number };\n}\n\nexport async function autoArrange(\n state: EditorState,\n input: AutoArrangeInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const layout = (input.layout ?? \"grid\") as string;\n if (!VALID_LAYOUTS.includes(layout as LayoutType)) {\n throw new Error(\n `Unknown layout: '${layout}'. Valid layouts: ${VALID_LAYOUTS.join(\", \")}`,\n );\n }\n\n const spacing = input.spacing ?? 200;\n const origin = input.origin ?? { x: 0, y: 0 };\n\n // Determine which sketches to arrange\n let sketchIds: string[];\n if (input.sketchIds && input.sketchIds.length > 0) {\n for (const id of input.sketchIds) {\n state.requireSketch(id);\n }\n sketchIds = input.sketchIds;\n } else {\n // All sketches in workspace\n sketchIds = [...state.sketches.keys()];\n }\n\n if (sketchIds.length === 0) {\n throw new Error(\"No sketches to arrange\");\n }\n\n // Sort sketches\n const sortBy = input.sortBy ?? \"created\";\n const sortedItems = sketchIds\n .map((id) => {\n const loaded = state.requireSketch(id);\n const def = loaded.definition;\n return {\n id,\n title: def.title,\n created: def.created,\n modified: def.modified,\n renderer: def.renderer.type,\n width: def.canvas.width,\n height: def.canvas.height,\n };\n })\n .sort((a, b) => {\n switch (sortBy) {\n case \"title\":\n return a.title.localeCompare(b.title);\n case \"modified\":\n return a.modified.localeCompare(b.modified);\n case \"renderer\":\n return a.renderer.localeCompare(b.renderer);\n case \"created\":\n default:\n return a.created.localeCompare(b.created);\n }\n });\n\n // Apply layout\n const arranged = applyLayout(sortedItems, layout as LayoutType, spacing, origin);\n\n // Build file map and update workspace\n const idToFile = new Map<string, string>();\n for (const [id, loaded] of state.sketches) {\n idToFile.set(id, basename(loaded.path));\n }\n\n const positionMap = new Map(\n arranged.map((a) => [idToFile.get(a.id)!, a.position]),\n );\n\n const newSketches = ws.sketches.map((ref) => {\n const newPos = positionMap.get(ref.file);\n if (newPos) {\n return { ...ref, position: newPos };\n }\n return ref;\n });\n\n // Compute bounding box and viewport\n const viewportItems = arranged.map((a) => {\n const item = sortedItems.find((s) => s.id === a.id)!;\n return { position: a.position, width: item.width, height: item.height };\n });\n\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const item of viewportItems) {\n if (item.position.x < minX) minX = item.position.x;\n if (item.position.y < minY) minY = item.position.y;\n if (item.position.x + item.width > maxX) maxX = item.position.x + item.width;\n if (item.position.y + item.height > maxY) maxY = item.position.y + item.height;\n }\n\n const boundingBox = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n\n const viewport = computeViewport(viewportItems);\n\n state.workspace = { ...ws, modified: now(), sketches: newSketches, viewport };\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { arranged: arranged.length });\n\n return {\n success: true,\n layout,\n arranged: arranged.length,\n positions: arranged.map((a) => ({\n id: a.id,\n position: a.position,\n })),\n boundingBox,\n viewport,\n };\n}\n\n// ---------------------------------------------------------------------------\n// group_sketches\n// ---------------------------------------------------------------------------\n\nexport interface GroupSketchesInput {\n groupId: string;\n label: string;\n sketchIds: string[];\n color?: string;\n}\n\nexport async function groupSketches(\n state: EditorState,\n input: GroupSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!input.sketchIds || input.sketchIds.length === 0) {\n throw new Error(\"At least one sketch ID is required\");\n }\n\n // Validate all sketch IDs and collect their file names\n const sketchFiles: string[] = [];\n for (const id of input.sketchIds) {\n const loaded = state.requireSketch(id);\n sketchFiles.push(basename(loaded.path));\n }\n\n const newGroup: WorkspaceGroup = {\n id: input.groupId,\n label: input.label,\n sketchFiles,\n ...(input.color ? { color: input.color } : {}),\n };\n\n // Replace existing group with same ID, or add new one\n const existingGroups = ws.groups ?? [];\n const filtered = existingGroups.filter((g) => g.id !== input.groupId);\n const newGroups = [...filtered, newGroup];\n\n state.workspace = { ...ws, modified: now(), groups: newGroups };\n await state.saveWorkspace();\n state.emitMutation(\"workspace:updated\", { groupUpdated: input.groupId });\n\n return {\n success: true,\n group: newGroup,\n groupCount: newGroups.length,\n };\n}\n","/**\n * Gallery tools.\n * list_sketches, search_sketches\n */\n\nimport { readdir, readFile, stat } from \"fs/promises\";\nimport { basename, dirname, join } from \"path\";\nimport { parseGenart } from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Try to parse a .genart file, returning null on failure. */\nasync function tryParseGenart(\n absPath: string,\n): Promise<{ id: string; title: string; renderer: string; canvas: { width: number; height: number }; parameterCount: number; colorCount: number; snapshotCount: number; hasPhilosophy: boolean; skills: readonly string[]; modified: string; path: string } | null> {\n try {\n const raw = await readFile(absPath, \"utf-8\");\n const json = JSON.parse(raw) as unknown;\n const def = parseGenart(json);\n return {\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n snapshotCount: def.snapshots?.length ?? 0,\n hasPhilosophy: !!def.philosophy,\n skills: def.skills ?? [],\n modified: def.modified,\n path: absPath,\n };\n } catch {\n return null;\n }\n}\n\n/** Scan a directory for .genart files. */\nasync function scanGenartFiles(\n dir: string,\n recursive: boolean,\n): Promise<string[]> {\n const results: string[] = [];\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".genart\")) {\n results.push(fullPath);\n } else if (recursive && entry.isDirectory()) {\n const sub = await scanGenartFiles(fullPath, true);\n results.push(...sub);\n }\n }\n\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// list_sketches\n// ---------------------------------------------------------------------------\n\nexport interface ListSketchesInput {\n directory?: string;\n recursive?: boolean;\n includeUnreferenced?: boolean;\n}\n\nexport async function listSketches(\n state: EditorState,\n input: ListSketchesInput,\n): Promise<Record<string, unknown>> {\n const dir = input.directory\n ? state.resolvePath(input.directory)\n : state.workspacePath\n ? dirname(state.workspacePath)\n : null;\n if (!dir) {\n throw new Error(\"No workspace is currently open and no directory specified\");\n }\n\n // Verify directory exists\n try {\n const s = await stat(dir);\n if (!s.isDirectory()) {\n throw new Error(`Not a directory: '${dir}'`);\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"Not a directory\")) throw e;\n throw new Error(`Directory does not exist: '${dir}'`);\n }\n\n const recursive = input.recursive ?? false;\n const includeUnreferenced = input.includeUnreferenced !== false;\n\n // Get workspace file set for inWorkspace flag\n const wsFiles = new Set<string>();\n if (state.workspace) {\n for (const ref of state.workspace.sketches) {\n const absPath = state.resolveSketchPath(ref.file);\n wsFiles.add(absPath);\n }\n }\n\n // Scan directory\n const genartFiles = await scanGenartFiles(dir, recursive);\n const sketches: Record<string, unknown>[] = [];\n\n for (const filePath of genartFiles) {\n const inWorkspace = wsFiles.has(filePath);\n if (!includeUnreferenced && !inWorkspace) continue;\n\n const info = await tryParseGenart(filePath);\n if (!info) continue;\n\n sketches.push({\n id: info.id,\n title: info.title,\n renderer: info.renderer,\n canvas: info.canvas,\n parameterCount: info.parameterCount,\n colorCount: info.colorCount,\n path: info.path,\n inWorkspace,\n modified: info.modified,\n });\n }\n\n const inWorkspaceCount = sketches.filter(\n (s) => (s as { inWorkspace: boolean }).inWorkspace,\n ).length;\n\n return {\n success: true,\n directory: dir,\n sketches,\n total: sketches.length,\n inWorkspace: inWorkspaceCount,\n unreferenced: sketches.length - inWorkspaceCount,\n };\n}\n\n// ---------------------------------------------------------------------------\n// search_sketches\n// ---------------------------------------------------------------------------\n\nexport interface SearchSketchesInput {\n query?: string;\n renderer?: string;\n minParameters?: number;\n maxParameters?: number;\n canvasWidth?: number;\n canvasHeight?: number;\n hasPhilosophy?: boolean;\n skills?: string[];\n}\n\nexport async function searchSketches(\n state: EditorState,\n input: SearchSketchesInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n\n // Validate at least one filter\n const hasFilter =\n input.query !== undefined ||\n input.renderer !== undefined ||\n input.minParameters !== undefined ||\n input.maxParameters !== undefined ||\n input.canvasWidth !== undefined ||\n input.canvasHeight !== undefined ||\n input.hasPhilosophy !== undefined ||\n (input.skills !== undefined && input.skills.length > 0);\n\n if (!hasFilter) {\n throw new Error(\"At least one search filter is required\");\n }\n\n const matches: Record<string, unknown>[] = [];\n const filters: Record<string, unknown> = {};\n\n // Track applied filters\n if (input.query !== undefined) filters.query = input.query;\n if (input.renderer !== undefined) filters.renderer = input.renderer;\n if (input.minParameters !== undefined) filters.minParameters = input.minParameters;\n if (input.maxParameters !== undefined) filters.maxParameters = input.maxParameters;\n if (input.canvasWidth !== undefined) filters.canvasWidth = input.canvasWidth;\n if (input.canvasHeight !== undefined) filters.canvasHeight = input.canvasHeight;\n if (input.hasPhilosophy !== undefined) filters.hasPhilosophy = input.hasPhilosophy;\n if (input.skills !== undefined) filters.skills = input.skills;\n\n for (const [, loaded] of state.sketches) {\n const def = loaded.definition;\n\n // Apply filters\n if (input.query !== undefined) {\n if (!def.title.toLowerCase().includes(input.query.toLowerCase())) continue;\n }\n\n if (input.renderer !== undefined) {\n if (def.renderer.type !== input.renderer) continue;\n }\n\n if (input.minParameters !== undefined) {\n if (def.parameters.length < input.minParameters) continue;\n }\n\n if (input.maxParameters !== undefined) {\n if (def.parameters.length > input.maxParameters) continue;\n }\n\n if (input.canvasWidth !== undefined) {\n if (def.canvas.width !== input.canvasWidth) continue;\n }\n\n if (input.canvasHeight !== undefined) {\n if (def.canvas.height !== input.canvasHeight) continue;\n }\n\n if (input.hasPhilosophy !== undefined) {\n const has = !!def.philosophy;\n if (has !== input.hasPhilosophy) continue;\n }\n\n if (input.skills !== undefined && input.skills.length > 0) {\n const sketchSkills = new Set(def.skills ?? []);\n const hasAny = input.skills.some((s) => sketchSkills.has(s));\n if (!hasAny) continue;\n }\n\n matches.push({\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n snapshotCount: def.snapshots?.length ?? 0,\n hasPhilosophy: !!def.philosophy,\n skills: def.skills ?? [],\n });\n }\n\n return {\n success: true,\n matches,\n total: matches.length,\n filters,\n };\n}\n","/**\n * Merge tool.\n * merge_sketches\n */\n\nimport { basename, dirname, join } from \"path\";\nimport { writeFile } from \"fs/promises\";\nimport {\n serializeGenart,\n type SketchDefinition,\n type ParamDef,\n type ColorDef,\n type ThemeDef,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst VALID_STRATEGIES = [\"blend\", \"layer\", \"alternate\"] as const;\ntype MergeStrategy = (typeof VALID_STRATEGIES)[number];\n\n/** Merge parameters using the blend strategy: union with first-wins on conflicts. */\nfunction blendParameters(sources: SketchDefinition[]): ParamDef[] {\n const seen = new Set<string>();\n const result: ParamDef[] = [];\n\n for (const source of sources) {\n for (const param of source.parameters) {\n if (!seen.has(param.key)) {\n seen.add(param.key);\n result.push(param);\n }\n }\n }\n\n return result;\n}\n\n/** Merge parameters using the layer strategy: namespace per source. */\nfunction layerParameters(sources: SketchDefinition[]): ParamDef[] {\n const result: ParamDef[] = [];\n\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i]!;\n const prefix = `source${i + 1}_`;\n for (const param of source.parameters) {\n result.push({\n ...param,\n key: `${prefix}${param.key}`,\n label: `[${i + 1}] ${param.label}`,\n });\n }\n }\n\n return result;\n}\n\n/** Merge parameters using the alternate strategy: odd-indexed sources only. */\nfunction alternateParameters(sources: SketchDefinition[]): ParamDef[] {\n const seen = new Set<string>();\n const result: ParamDef[] = [];\n\n for (let i = 0; i < sources.length; i += 2) {\n const source = sources[i]!;\n for (const param of source.parameters) {\n if (!seen.has(param.key)) {\n seen.add(param.key);\n result.push(param);\n }\n }\n }\n\n return result;\n}\n\n/** Merge colors: union with first-wins on conflicts. */\nfunction mergeColors(sources: SketchDefinition[]): ColorDef[] {\n const seen = new Set<string>();\n const result: ColorDef[] = [];\n\n for (const source of sources) {\n for (const color of source.colors) {\n if (!seen.has(color.key)) {\n seen.add(color.key);\n result.push(color);\n }\n }\n }\n\n return result;\n}\n\n/** Merge colors for alternate strategy: even-indexed sources. */\nfunction alternateColors(sources: SketchDefinition[]): ColorDef[] {\n const seen = new Set<string>();\n const result: ColorDef[] = [];\n\n for (let i = 1; i < sources.length; i += 2) {\n const source = sources[i]!;\n for (const color of source.colors) {\n if (!seen.has(color.key)) {\n seen.add(color.key);\n result.push(color);\n }\n }\n }\n\n // If no even-indexed sources contributed colors, fall back to all sources\n if (result.length === 0) {\n return mergeColors(sources);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// merge_sketches\n// ---------------------------------------------------------------------------\n\nexport interface MergeSketchesInput {\n sourceIds: string[];\n newId: string;\n title: string;\n strategy?: string;\n renderer?: string;\n canvas?: { width?: number; height?: number };\n}\n\nexport async function mergeSketches(\n state: EditorState,\n input: MergeSketchesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!input.sourceIds || input.sourceIds.length < 2) {\n throw new Error(\"At least 2 source sketches are required\");\n }\n\n // Validate strategy\n const strategy = (input.strategy ?? \"blend\") as string;\n if (!VALID_STRATEGIES.includes(strategy as MergeStrategy)) {\n throw new Error(\n `Unknown merge strategy: '${strategy}'. Valid strategies: ${VALID_STRATEGIES.join(\", \")}`,\n );\n }\n\n // Check for duplicate ID\n if (state.getSketch(input.newId)) {\n throw new Error(`Sketch with ID '${input.newId}' already exists`);\n }\n\n // Load all source sketches\n const sources: SketchDefinition[] = [];\n for (const id of input.sourceIds) {\n const loaded = state.requireSketch(id);\n sources.push(loaded.definition);\n }\n\n // Determine renderer and canvas\n const renderer = input.renderer ?? sources[0]!.renderer.type;\n const canvasWidth =\n input.canvas?.width ??\n Math.max(...sources.map((s) => s.canvas.width));\n const canvasHeight =\n input.canvas?.height ??\n Math.max(...sources.map((s) => s.canvas.height));\n\n // Merge parameters based on strategy\n let parameters: ParamDef[];\n let algorithm: string;\n let colors: ColorDef[];\n\n switch (strategy as MergeStrategy) {\n case \"layer\":\n parameters = layerParameters(sources);\n colors = mergeColors(sources);\n break;\n case \"alternate\":\n parameters = alternateParameters(sources);\n colors = alternateColors(sources);\n break;\n case \"blend\":\n default:\n parameters = blendParameters(sources);\n colors = mergeColors(sources);\n break;\n }\n\n // Empty algorithm placeholder for AI synthesis\n algorithm = `// Merged from: ${input.sourceIds.join(\", \")}\\n// Strategy: ${strategy}\\n// TODO: Write a unified algorithm combining the source concepts.\\n`;\n\n // Concatenate philosophies\n const philosophyParts = sources\n .filter((s) => s.philosophy)\n .map((s) => `## ${s.title}\\n\\n${s.philosophy}`);\n const philosophy =\n philosophyParts.length > 0 ? philosophyParts.join(\"\\n\\n---\\n\\n\") : undefined;\n\n // Merge themes (deduplicate by name)\n const themes: ThemeDef[] = [];\n const seenThemeNames = new Set<string>();\n for (const source of sources) {\n for (const theme of source.themes ?? []) {\n if (!seenThemeNames.has(theme.name)) {\n seenThemeNames.add(theme.name);\n themes.push(theme);\n }\n }\n }\n\n // Merge skills (union, deduplicated)\n const skills = [...new Set(sources.flatMap((s) => s.skills ?? []))];\n\n // Build initial state\n const params: Record<string, number> = {};\n for (const p of parameters) {\n params[p.key] = p.default;\n }\n const colorPalette = colors.map((c) => c.default);\n\n const timestamp = now();\n const newDef: SketchDefinition = {\n genart: \"1.1\",\n id: input.newId,\n title: input.title,\n created: timestamp,\n modified: timestamp,\n ...(skills.length > 0 ? { skills } : {}),\n renderer: { type: renderer, version: sources[0]!.renderer.version },\n canvas: { width: canvasWidth, height: canvasHeight },\n ...(philosophy ? { philosophy } : {}),\n parameters,\n colors,\n ...(themes.length > 0 ? { themes } : {}),\n state: {\n seed: Math.floor(Math.random() * 100000),\n params,\n colorPalette,\n },\n algorithm,\n };\n\n // Save to disk\n const wsDir = dirname(state.workspacePath!);\n const fileName = `${input.newId}.genart`;\n const filePath = join(wsDir, fileName);\n const json = serializeGenart(newDef);\n await writeFile(filePath, json, \"utf-8\");\n\n // Add to state\n state.sketches.set(input.newId, { definition: newDef, path: filePath });\n\n // Add to workspace\n const maxX = ws.sketches.reduce(\n (max, ref) => Math.max(max, ref.position.x),\n 0,\n );\n const newRef = {\n file: fileName,\n position: { x: maxX + 1400, y: 0 },\n };\n\n state.workspace = {\n ...ws,\n modified: timestamp,\n sketches: [...ws.sketches, newRef],\n };\n await state.saveWorkspace();\n state.emitMutation(\"sketch:created\", { id: input.newId });\n\n const crossRenderer = sources.some((s) => s.renderer.type !== renderer);\n\n return {\n success: true,\n sketchId: input.newId,\n title: input.title,\n path: filePath,\n renderer,\n strategy,\n sources: input.sourceIds,\n parameterCount: parameters.length,\n colorCount: colors.length,\n ...(crossRenderer\n ? {\n crossRendererNotice: `Source sketches use different renderers. The merged sketch targets '${renderer}' — the algorithm must be written for this renderer.`,\n }\n : {}),\n };\n}\n","/**\n * Snapshot layout tool.\n * snapshot_layout\n */\n\nimport { basename } from \"path\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// snapshot_layout\n// ---------------------------------------------------------------------------\n\nexport interface SnapshotLayoutInput {\n includeGroups?: boolean;\n includeState?: boolean;\n}\n\nexport async function snapshotLayout(\n state: EditorState,\n input: SnapshotLayoutInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const includeGroups = input.includeGroups !== false;\n const includeState = input.includeState === true;\n\n // Build sketch summaries\n const sketches: Record<string, unknown>[] = [];\n const rendererCounts: Record<string, number> = {};\n\n for (const ref of ws.sketches) {\n // Find the loaded sketch by matching file name\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === ref.file,\n );\n if (!loaded) continue;\n\n const def = loaded.definition;\n\n const entry: Record<string, unknown> = {\n id: def.id,\n title: def.title,\n renderer: def.renderer.type,\n position: ref.position,\n canvas: { width: def.canvas.width, height: def.canvas.height },\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n snapshotCount: def.snapshots?.length ?? 0,\n locked: false,\n visible: true,\n };\n\n if (includeState) {\n entry.state = {\n seed: def.state.seed,\n params: def.state.params,\n colorPalette: def.state.colorPalette,\n };\n }\n\n sketches.push(entry);\n\n // Count renderers\n const rt = def.renderer.type;\n rendererCounts[rt] = (rendererCounts[rt] ?? 0) + 1;\n }\n\n // Compute bounding box\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n\n for (const sketch of sketches) {\n const pos = sketch.position as { x: number; y: number };\n const canvas = sketch.canvas as { width: number; height: number };\n if (pos.x < minX) minX = pos.x;\n if (pos.y < minY) minY = pos.y;\n if (pos.x + canvas.width > maxX) maxX = pos.x + canvas.width;\n if (pos.y + canvas.height > maxY) maxY = pos.y + canvas.height;\n }\n\n const boundingBox =\n sketches.length > 0\n ? { x: minX, y: minY, width: maxX - minX, height: maxY - minY }\n : { x: 0, y: 0, width: 0, height: 0 };\n\n // Build groups\n const groups: Record<string, unknown>[] = [];\n if (includeGroups && ws.groups) {\n for (const group of ws.groups) {\n // Map sketchFiles to sketch IDs\n const sketchIds: string[] = [];\n for (const file of group.sketchFiles) {\n const loaded = [...state.sketches.values()].find(\n (v) => basename(v.path) === file,\n );\n if (loaded) {\n sketchIds.push(loaded.definition.id);\n }\n }\n\n groups.push({\n id: group.id,\n label: group.label,\n sketchIds,\n ...(group.color ? { color: group.color } : {}),\n });\n }\n }\n\n const result: Record<string, unknown> = {\n success: true,\n workspace: {\n id: ws.id,\n title: ws.title,\n viewport: ws.viewport,\n },\n sketches,\n boundingBox,\n totalSketches: sketches.length,\n rendererBreakdown: rendererCounts,\n };\n\n if (includeGroups) {\n result.groups = groups;\n }\n\n return result;\n}\n","/**\n * Design knowledge tools.\n * list_skills, load_skill, get_guidelines\n */\n\nimport { createDefaultSkillRegistry } from \"@genart-dev/core\";\n\nconst registry = createDefaultSkillRegistry();\n\n// ---------------------------------------------------------------------------\n// list_skills\n// ---------------------------------------------------------------------------\n\nexport interface ListSkillsInput {\n category?: string;\n}\n\nexport async function listSkills(\n input: ListSkillsInput,\n): Promise<Record<string, unknown>> {\n const skills = registry.list(input.category);\n\n return {\n success: true,\n skills: skills.map((s) => ({\n id: s.id,\n name: s.name,\n category: s.category,\n complexity: s.complexity,\n description: s.description,\n })),\n total: skills.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// load_skill\n// ---------------------------------------------------------------------------\n\nexport interface LoadSkillInput {\n skillId: string;\n renderer?: string;\n}\n\nexport async function loadSkill(\n input: LoadSkillInput,\n): Promise<Record<string, unknown>> {\n const skill = registry.get(input.skillId);\n\n if (!skill) {\n return {\n success: false,\n error: `Skill not found: '${input.skillId}'`,\n skill: null,\n };\n }\n\n const skillData: Record<string, unknown> = {\n id: skill.id,\n name: skill.name,\n category: skill.category,\n complexity: skill.complexity,\n description: skill.description,\n theory: skill.theory,\n principles: skill.principles,\n references: skill.references,\n suggestedParameters: skill.suggestedParameters ?? [],\n suggestedColors: skill.suggestedColors ?? [],\n };\n\n // Include renderer-specific example if requested and available\n if (input.renderer && skill.examples) {\n const example =\n skill.examples[input.renderer as keyof typeof skill.examples];\n if (example) {\n skillData[\"example\"] = example;\n }\n }\n\n return {\n success: true,\n skill: skillData,\n };\n}\n\n// ---------------------------------------------------------------------------\n// get_guidelines\n// ---------------------------------------------------------------------------\n\nexport interface GetGuidelinesInput {\n topic: string;\n renderer?: string;\n}\n\n/** Static guidelines for topics that don't map to skill categories. */\nconst STATIC_GUIDELINES: Record<string, string> = {\n parameters: `## Parameter Design Guidelines\n\n- Keep parameter count between 3 and 8 for usability\n- Use intuitive ranges: 0-1 for normalized values, actual units for physical quantities\n- Set defaults that produce an interesting (not extreme) result\n- Group related parameters in tabs for complex sketches\n- Name parameters descriptively: \"noiseScale\" not \"ns\"\n- Step size should match visual sensitivity: fine for color, coarse for counts`,\n\n animation: `## Animation Guidelines\n\n- Use requestAnimationFrame for smooth 60fps animation\n- Separate initialization from per-frame updates\n- Provide pause/resume control for resource management\n- Use time-based animation (not frame-count) for consistent speed\n- Consider using easing functions for natural motion\n- Keep draw loops lightweight — precompute what you can in setup`,\n\n performance: `## Performance Guidelines\n\n- Only the selected artboard should run live; others should pause\n- Use offscreen rendering for thumbnails\n- Dispose WebGL contexts and GPU resources when unmounting\n- Limit particle/element counts with parameters\n- Use spatial data structures (quadtree, grid) for collision/proximity\n- Profile with Chrome DevTools before optimizing`,\n};\n\nexport async function getGuidelines(\n input: GetGuidelinesInput,\n): Promise<Record<string, unknown>> {\n const topic = input.topic;\n\n // Check for static guidelines first\n if (STATIC_GUIDELINES[topic]) {\n return {\n success: true,\n topic,\n guidelines: STATIC_GUIDELINES[topic],\n relatedSkills: [],\n };\n }\n\n // Map topic to skill category\n const categoryMap: Record<string, string> = {\n composition: \"composition\",\n color: \"color\",\n colours: \"color\",\n layout: \"composition\",\n palette: \"color\",\n };\n\n const category = categoryMap[topic];\n if (!category) {\n return {\n success: false,\n topic,\n error: `No guidelines found for topic: '${topic}'. Available topics: composition, color, parameters, animation, performance`,\n guidelines: null,\n relatedSkills: [],\n };\n }\n\n const skills = registry.list(category);\n const guidelines = skills\n .map(\n (s) =>\n `### ${s.name}\\n\\n${s.description}\\n\\n**Principles:**\\n${s.principles.map((p) => `- ${p}`).join(\"\\n\")}`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n success: true,\n topic,\n guidelines: `## ${category.charAt(0).toUpperCase() + category.slice(1)} Guidelines\\n\\n${guidelines}`,\n relatedSkills: skills.map((s) => ({\n id: s.id,\n name: s.name,\n complexity: s.complexity,\n })),\n };\n}\n","/**\n * Component tools.\n * list_components, add_component, remove_component\n */\n\nimport { writeFile } from \"fs/promises\";\nimport {\n COMPONENT_REGISTRY,\n resolveComponents,\n serializeGenart,\n type ComponentCategory,\n type ComponentEntry,\n type RendererType,\n type SketchComponentDef,\n type SketchComponentValue,\n type SketchDefinition,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Shared constants\n// ---------------------------------------------------------------------------\n\nconst VALID_RENDERERS: readonly RendererType[] = [\n \"p5\",\n \"three\",\n \"glsl\",\n \"canvas2d\",\n \"svg\",\n];\n\n/** Maps renderer types to their target (\"js\" or \"glsl\"). */\nconst RENDERER_TARGET: Record<RendererType, \"js\" | \"glsl\"> = {\n p5: \"js\",\n three: \"js\",\n canvas2d: \"js\",\n svg: \"js\",\n glsl: \"glsl\",\n};\n\n// ---------------------------------------------------------------------------\n// list_components\n// ---------------------------------------------------------------------------\n\nexport interface ListComponentsInput {\n renderer?: string;\n category?: string;\n}\n\nexport async function listComponents(\n _state: EditorState,\n input: ListComponentsInput,\n): Promise<Record<string, unknown>> {\n let entries = Object.values(COMPONENT_REGISTRY);\n\n // Filter by renderer compatibility\n if (input.renderer) {\n const renderer = input.renderer as RendererType;\n const target = RENDERER_TARGET[renderer];\n if (!target) {\n throw new Error(\n `Unknown renderer type: '${input.renderer}'. Valid types: ${VALID_RENDERERS.join(\", \")}`,\n );\n }\n entries = entries.filter(\n (e) =>\n e.target === target &&\n (e.renderers.length === 0 || e.renderers.includes(renderer)),\n );\n }\n\n // Filter by category\n if (input.category) {\n const cat = input.category as ComponentCategory;\n entries = entries.filter((e) => e.category === cat);\n }\n\n // Sort by category then name\n entries.sort((a, b) => {\n const catCmp = a.category.localeCompare(b.category);\n if (catCmp !== 0) return catCmp;\n return a.name.localeCompare(b.name);\n });\n\n const components = entries.map((e) => ({\n name: e.name,\n version: e.version,\n category: e.category,\n target: e.target,\n exports: [...e.exports],\n dependencies: [...e.dependencies],\n description: e.description,\n }));\n\n return {\n count: components.length,\n components,\n };\n}\n\n// ---------------------------------------------------------------------------\n// add_component\n// ---------------------------------------------------------------------------\n\nexport interface AddComponentInput {\n sketchId: string;\n component: string;\n version?: string;\n}\n\nexport async function addComponent(\n state: EditorState,\n input: AddComponentInput,\n): Promise<Record<string, unknown>> {\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n const renderer = def.renderer.type;\n\n // Validate component exists\n const entry = COMPONENT_REGISTRY[input.component];\n if (!entry) {\n throw new Error(`Unknown component: \"${input.component}\"`);\n }\n\n // Validate renderer compatibility\n const target = RENDERER_TARGET[renderer];\n if (entry.target !== target) {\n throw new Error(\n `Component \"${input.component}\" has target \"${entry.target}\" but renderer \"${renderer}\" requires target \"${target}\"`,\n );\n }\n if (entry.renderers.length > 0 && !entry.renderers.includes(renderer)) {\n throw new Error(\n `Component \"${input.component}\" is not compatible with renderer \"${renderer}\". Compatible: ${entry.renderers.join(\", \")}`,\n );\n }\n\n // Build the component map for resolution: existing + new\n const existingComponents: Record<string, string> = {};\n if (def.components) {\n for (const [name, value] of Object.entries(def.components)) {\n if (typeof value === \"string\") {\n existingComponents[name] = value;\n } else if (value.version) {\n existingComponents[name] = value.version;\n }\n }\n }\n\n // Don't overwrite if already present\n if (existingComponents[input.component]) {\n throw new Error(\n `Component \"${input.component}\" is already present in sketch \"${input.sketchId}\"`,\n );\n }\n\n // Add the new component\n existingComponents[input.component] = input.version ?? \"^1.0.0\";\n\n // Resolve all components (validates and pulls transitive deps)\n const resolved = resolveComponents(existingComponents, renderer);\n\n // Build the resolved components record\n const resolvedRecord: Record<string, SketchComponentDef> = {};\n for (const rc of resolved) {\n resolvedRecord[rc.name] = {\n version: rc.version,\n code: rc.code,\n exports: [...rc.exports],\n };\n }\n\n // Determine which were newly added\n const previousNames = new Set(\n def.components ? Object.keys(def.components) : [],\n );\n const added = resolved\n .map((rc) => rc.name)\n .filter((name) => !previousNames.has(name));\n\n // Update sketch definition\n const newDef: SketchDefinition = {\n ...def,\n genart: \"1.2\",\n modified: new Date().toISOString(),\n components: resolvedRecord,\n };\n\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", {\n id: input.sketchId,\n updated: [\"components\"],\n });\n\n return {\n success: true,\n sketchId: input.sketchId,\n components: resolvedRecord,\n added,\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// remove_component\n// ---------------------------------------------------------------------------\n\nexport interface RemoveComponentInput {\n sketchId: string;\n component: string;\n}\n\nexport async function removeComponent(\n state: EditorState,\n input: RemoveComponentInput,\n): Promise<Record<string, unknown>> {\n const loaded = state.requireSketch(input.sketchId);\n const def = loaded.definition;\n\n if (!def.components || !def.components[input.component]) {\n throw new Error(\n `Component \"${input.component}\" is not present in sketch \"${input.sketchId}\"`,\n );\n }\n\n // Check if any remaining components depend on the one being removed\n const remaining = { ...def.components };\n delete remaining[input.component];\n\n for (const [name, value] of Object.entries(remaining)) {\n // Look up the registry entry to check dependencies\n const entry = COMPONENT_REGISTRY[name];\n if (entry && entry.dependencies.includes(input.component)) {\n throw new Error(\n `Cannot remove \"${input.component}\": component \"${name}\" depends on it`,\n );\n }\n }\n\n // Check if algorithm references any of the component's exports\n let warning: string | undefined;\n const removedValue = def.components[input.component]!;\n const exports: readonly string[] =\n typeof removedValue === \"string\"\n ? COMPONENT_REGISTRY[input.component]?.exports ?? []\n : removedValue.exports ?? [];\n\n const usedExports = exports.filter((exp) => def.algorithm.includes(exp));\n if (usedExports.length > 0) {\n warning = `Algorithm may reference these exports from \"${input.component}\": ${usedExports.join(\", \")}. Review your algorithm after removal.`;\n }\n\n // Also remove any transitive-only deps that were pulled in by this component\n // and are no longer needed by remaining components\n const removed = [input.component];\n const neededDeps = new Set<string>();\n\n // Collect all deps still needed by remaining components\n for (const name of Object.keys(remaining)) {\n const entry = COMPONENT_REGISTRY[name];\n if (entry) {\n collectTransitiveDeps(name, neededDeps);\n }\n }\n\n // Remove orphaned transitive deps\n for (const name of Object.keys(remaining)) {\n if (!neededDeps.has(name) && !isDirectComponent(name, remaining)) {\n // This was a transitive dep only needed by the removed component\n delete remaining[name];\n removed.push(name);\n }\n }\n\n // Update sketch definition\n const hasRemaining = Object.keys(remaining).length > 0;\n const newDef: SketchDefinition = {\n ...def,\n modified: new Date().toISOString(),\n ...(hasRemaining ? { components: remaining } : { components: undefined }),\n };\n\n state.sketches.set(input.sketchId, {\n definition: newDef,\n path: loaded.path,\n });\n\n const json = serializeGenart(newDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, json, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", {\n id: input.sketchId,\n updated: [\"components\"],\n });\n\n return {\n success: true,\n sketchId: input.sketchId,\n removed,\n ...(warning ? { warning } : {}),\n fileContent: json,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Recursively collect transitive dependency names for a component. */\nfunction collectTransitiveDeps(name: string, deps: Set<string>): void {\n const entry = COMPONENT_REGISTRY[name];\n if (!entry) return;\n deps.add(name);\n for (const dep of entry.dependencies) {\n if (!deps.has(dep)) {\n collectTransitiveDeps(dep, deps);\n }\n }\n}\n\n/** Check if a component name was directly added (vs. only a transitive dep). */\nfunction isDirectComponent(\n name: string,\n components: Record<string, SketchComponentValue>,\n): boolean {\n // A component is \"direct\" if it was in the original map.\n // Since we only have the current map, treat all remaining as direct\n // unless they only appear as deps of other remaining components.\n // For simplicity in v1, we keep all remaining components.\n return name in components;\n}\n","/**\n * Capture tools.\n * capture_screenshot, capture_batch\n *\n * Two-tier capture: each capture produces a full-res PNG for the preview file\n * and a small JPEG for inline AI viewing via MCP native image blocks.\n */\n\nimport { writeFile } from \"fs/promises\";\nimport {\n createDefaultRegistry,\n type SketchDefinition,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\nimport { captureHtmlMulti, type MultiCaptureResult } from \"../capture/headless.js\";\n\nconst registry = createDefaultRegistry();\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Build a SketchDefinition copy with optional seed/param overrides (no mutation). */\nfunction applyOverrides(\n sketch: SketchDefinition,\n overrides: { seed?: number; params?: Record<string, number> },\n): SketchDefinition {\n if (overrides.seed === undefined && overrides.params === undefined) {\n return sketch;\n }\n\n const newState = {\n seed: overrides.seed ?? sketch.state.seed,\n params: overrides.params\n ? { ...sketch.state.params, ...overrides.params }\n : sketch.state.params,\n colorPalette: sketch.state.colorPalette,\n };\n\n return { ...sketch, state: newState };\n}\n\n/** Generate standalone HTML for a sketch with optional overrides. */\nfunction generateSketchHtml(\n sketch: SketchDefinition,\n opts: { seed?: number; params?: Record<string, number> },\n): string {\n const effective = applyOverrides(sketch, opts);\n const adapter = registry.resolve(effective.renderer.type);\n if (!adapter) {\n throw new Error(\n `Unsupported renderer type: '${effective.renderer.type}'`,\n );\n }\n return adapter.generateStandaloneHTML(effective);\n}\n\n/** Derive the preview PNG path from a sketch file path: foo.genart → foo.png */\nfunction derivePreviewPath(sketchPath: string): string {\n return sketchPath.replace(/\\.genart$/, \".png\");\n}\n\n// ---------------------------------------------------------------------------\n// capture_screenshot\n// ---------------------------------------------------------------------------\n\nexport interface CaptureScreenshotInput {\n target?: \"selected\" | \"sketch\";\n sketchId?: string;\n width?: number;\n height?: number;\n seed?: number;\n params?: Record<string, number>;\n previewSize?: number;\n}\n\n/** Structured result from captureScreenshot. */\nexport interface CaptureScreenshotResult {\n /** JSON-safe metadata for the text content block. */\n metadata: Record<string, unknown>;\n /** Small JPEG as base64 string for the MCP image content block. */\n previewJpegBase64: string;\n}\n\nexport async function captureScreenshot(\n state: EditorState,\n input: CaptureScreenshotInput,\n): Promise<CaptureScreenshotResult> {\n state.requireWorkspace();\n\n const target = input.target ?? \"selected\";\n\n let sketchId: string;\n\n if (target === \"selected\") {\n if (state.selection.size === 0) {\n throw new Error(\"No sketch is currently selected\");\n }\n sketchId = [...state.selection][0]!;\n } else {\n if (!input.sketchId) {\n throw new Error(\"sketchId is required when target is 'sketch'\");\n }\n sketchId = input.sketchId;\n }\n\n const loaded = state.requireSketch(sketchId);\n const sketch = loaded.definition;\n\n try {\n const html = generateSketchHtml(sketch, {\n seed: input.seed,\n params: input.params,\n });\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n const inlineSize = input.previewSize ?? 400;\n\n const multi = await captureHtmlMulti({\n html,\n width,\n height,\n inlineSize,\n });\n\n // Auto-save preview PNG and build metadata\n const previewPath = derivePreviewPath(loaded.path);\n const metadata = await buildScreenshotMetadata(state, multi, {\n target,\n sketchId,\n seed: input.seed ?? sketch.state.seed,\n previewPath,\n });\n\n const previewJpegBase64 = Buffer.from(multi.inlineJpeg).toString(\"base64\");\n\n return { metadata, previewJpegBase64 };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Renderer error for '${sketchId}': ${msg}`);\n }\n}\n\n/** Build metadata object and handle file writing / remoteMode content. */\nasync function buildScreenshotMetadata(\n state: EditorState,\n multi: MultiCaptureResult,\n info: {\n target: string;\n sketchId: string;\n seed: number;\n previewPath: string;\n },\n): Promise<Record<string, unknown>> {\n const metadata: Record<string, unknown> = {\n success: true,\n target: info.target,\n sketchId: info.sketchId,\n width: multi.previewWidth,\n height: multi.previewHeight,\n seed: info.seed,\n previewPath: info.previewPath,\n };\n\n if (!state.remoteMode) {\n // Local mode: write preview PNG directly to disk\n await writeFile(info.previewPath, multi.previewPng);\n metadata.savedPreviewTo = info.previewPath;\n }\n // Remote mode: skip preview file — the inline JPEG image block is sufficient\n // for AI analysis, and shuttling a full PNG as base64 text wastes tokens.\n\n return metadata;\n}\n\n// ---------------------------------------------------------------------------\n// capture_batch\n// ---------------------------------------------------------------------------\n\nexport interface CaptureBatchInput {\n sketchIds?: string[];\n width?: number;\n height?: number;\n seed?: number;\n previewSize?: number;\n}\n\n/** Structured result for a single sketch in a batch capture. */\nexport interface BatchItemResult {\n metadata: Record<string, unknown>;\n inlineJpegBase64: string;\n}\n\nexport interface CaptureBatchResult {\n /** JSON-safe batch metadata for the text content block. */\n metadata: Record<string, unknown>;\n /** Per-sketch inline JPEG base64 strings for MCP image content blocks. */\n items: BatchItemResult[];\n}\n\nexport async function captureBatch(\n state: EditorState,\n input: CaptureBatchInput,\n): Promise<CaptureBatchResult> {\n state.requireWorkspace();\n\n const ids = input.sketchIds ?? [...state.sketches.keys()];\n if (ids.length === 0) {\n throw new Error(\"No sketches to capture\");\n }\n\n // Validate all sketch IDs exist before starting\n for (const id of ids) {\n state.requireSketch(id);\n }\n\n // Use smaller inline size for batches to keep total response manageable\n const inlineSize = input.previewSize ?? 200;\n\n const items: BatchItemResult[] = [];\n const errors: Record<string, unknown>[] = [];\n\n const promises = ids.map(async (id) => {\n const loaded = state.requireSketch(id);\n const sketch = loaded.definition;\n try {\n const html = generateSketchHtml(sketch, { seed: input.seed });\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n const multi = await captureHtmlMulti({\n html,\n width,\n height,\n inlineSize,\n });\n\n const previewPath = derivePreviewPath(loaded.path);\n const itemMetadata = await buildScreenshotMetadata(state, multi, {\n target: \"sketch\",\n sketchId: id,\n seed: input.seed ?? sketch.state.seed,\n previewPath,\n });\n\n items.push({\n metadata: itemMetadata,\n inlineJpegBase64: Buffer.from(multi.inlineJpeg).toString(\"base64\"),\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n errors.push({ sketchId: id, error: msg });\n }\n });\n\n await Promise.all(promises);\n\n return {\n metadata: {\n success: errors.length === 0,\n total: ids.length,\n captured: items.length,\n failed: errors.length,\n errors: errors.length > 0 ? errors : undefined,\n },\n items,\n };\n}\n","/**\n * Headless capture — renders a standalone HTML page to a PNG screenshot\n * using Puppeteer's headless Chrome.\n *\n * Puppeteer is an optional peer dependency. If not installed, capture\n * functions will throw a clear error message.\n */\n\ntype PuppeteerModule = typeof import(\"puppeteer\");\ntype Browser = Awaited<ReturnType<PuppeteerModule[\"launch\"]>>;\n\n/** Cached puppeteer default export (loaded on first use). */\nlet cachedModule: PuppeteerModule | null = null;\n\n/** Dynamically load puppeteer (optional peer dep). */\nasync function loadPuppeteer(): Promise<PuppeteerModule> {\n if (!cachedModule) {\n try {\n // Dynamic import returns { default: puppeteer } for CJS interop\n const mod = await import(\"puppeteer\") as { default?: PuppeteerModule } & PuppeteerModule;\n cachedModule = mod.default ?? mod;\n } catch {\n throw new Error(\n \"Puppeteer is required for screenshot capture. Install it with: npm install puppeteer\",\n );\n }\n }\n return cachedModule;\n}\n\n/** Options for capturing a screenshot of an HTML page. */\nexport interface CaptureOptions {\n /** Full HTML source to render. */\n html: string;\n /** Viewport / output width in pixels. */\n width: number;\n /** Viewport / output height in pixels. */\n height: number;\n /** Time in ms to wait after page load before screenshotting (default: 500). */\n waitMs?: number;\n /** Image format (default: \"png\"). */\n imageType?: \"png\" | \"jpeg\";\n /** JPEG quality 0-100 (only used when imageType is \"jpeg\", default: 80). */\n quality?: number;\n}\n\n/** Result of a headless capture. */\nexport interface CaptureResult {\n /** Raw image bytes. */\n bytes: Uint8Array;\n /** MIME type of the captured image. */\n mimeType: \"image/png\" | \"image/jpeg\";\n /** Width of the captured image. */\n width: number;\n /** Height of the captured image. */\n height: number;\n}\n\n/** Result of a two-tier capture (preview PNG + inline JPEG). */\nexport interface MultiCaptureResult {\n /** Full-resolution PNG for the preview file. */\n previewPng: Uint8Array;\n previewWidth: number;\n previewHeight: number;\n /** Small JPEG for inline AI viewing. */\n inlineJpeg: Uint8Array;\n inlineWidth: number;\n inlineHeight: number;\n}\n\n/** Shared browser instance (lazy singleton). */\nlet browserInstance: Browser | null = null;\n\n/** Get or launch the shared headless browser. */\nasync function getBrowser(): Promise<Browser> {\n if (browserInstance && browserInstance.connected) {\n return browserInstance;\n }\n const puppeteer = await loadPuppeteer();\n browserInstance = await puppeteer.launch({\n headless: true,\n executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || undefined,\n args: [\n \"--no-sandbox\",\n \"--disable-setuid-sandbox\",\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n \"--single-process\",\n ],\n });\n return browserInstance;\n}\n\n/**\n * Render an HTML string to a PNG image using headless Chrome.\n * The page is loaded with the given viewport dimensions, then screenshotted\n * after a brief wait to allow the sketch to render its first frame.\n */\nexport async function captureHtml(options: CaptureOptions): Promise<CaptureResult> {\n const { html, width, height, waitMs = 500, imageType = \"png\", quality } = options;\n\n const browser = await getBrowser();\n const page = await browser.newPage();\n\n try {\n await page.setViewport({ width, height, deviceScaleFactor: 1 });\n await page.setContent(html, { waitUntil: \"domcontentloaded\", timeout: 30_000 });\n\n // Wait for the sketch to render its first frame\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n\n const buffer = await page.screenshot({\n type: imageType,\n clip: { x: 0, y: 0, width, height },\n ...(imageType === \"jpeg\" && quality !== undefined ? { quality } : {}),\n });\n const bytes = new Uint8Array(buffer);\n const mimeType = imageType === \"jpeg\" ? \"image/jpeg\" as const : \"image/png\" as const;\n\n return { bytes, mimeType, width, height };\n } finally {\n await page.close();\n }\n}\n\n/**\n * Two-tier capture: loads the page once and takes two screenshots.\n * 1. Full-res PNG at the given dimensions (for preview file)\n * 2. Resized JPEG at inlineSize (for inline AI viewing, low token cost)\n */\nexport async function captureHtmlMulti(options: {\n html: string;\n width: number;\n height: number;\n waitMs?: number;\n inlineSize?: number;\n jpegQuality?: number;\n}): Promise<MultiCaptureResult> {\n const { html, width, height, waitMs = 500, inlineSize = 400, jpegQuality = 70 } = options;\n\n const browser = await getBrowser();\n const page = await browser.newPage();\n\n try {\n // First capture: full-res PNG at sketch dimensions\n await page.setViewport({ width, height, deviceScaleFactor: 1 });\n await page.setContent(html, { waitUntil: \"domcontentloaded\", timeout: 30_000 });\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n\n const pngBuffer = await page.screenshot({\n type: \"png\",\n clip: { x: 0, y: 0, width, height },\n });\n const previewPng = new Uint8Array(pngBuffer);\n\n // Second capture: small JPEG for inline AI viewing\n // Scale to fit within inlineSize, preserving aspect ratio\n const scale = Math.min(inlineSize / width, inlineSize / height, 1);\n const inlineWidth = Math.round(width * scale);\n const inlineHeight = Math.round(height * scale);\n\n await page.setViewport({ width: inlineWidth, height: inlineHeight, deviceScaleFactor: 1 });\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const jpegBuffer = await page.screenshot({\n type: \"jpeg\",\n quality: jpegQuality,\n clip: { x: 0, y: 0, width: inlineWidth, height: inlineHeight },\n });\n const inlineJpeg = new Uint8Array(jpegBuffer);\n\n return {\n previewPng,\n previewWidth: width,\n previewHeight: height,\n inlineJpeg,\n inlineWidth,\n inlineHeight,\n };\n } finally {\n await page.close();\n }\n}\n\n/** Close the shared browser instance. Call on server shutdown. */\nexport async function closeBrowser(): Promise<void> {\n if (browserInstance) {\n await browserInstance.close();\n browserInstance = null;\n }\n}\n","/**\n * Export tool.\n * export_sketch — exports a sketch as html, png, algorithm, or zip.\n */\n\nimport { createWriteStream } from \"fs\";\nimport { stat, writeFile } from \"fs/promises\";\nimport { dirname, extname } from \"path\";\nimport archiver from \"archiver\";\nimport {\n createDefaultRegistry,\n serializeGenart,\n type SketchDefinition,\n} from \"@genart-dev/core\";\nimport { EditorState } from \"../state.js\";\nimport { captureHtml } from \"../capture/headless.js\";\n\nconst registry = createDefaultRegistry();\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Verify the parent directory exists and the output path doesn't already exist. */\nasync function validateOutputPath(outputPath: string): Promise<void> {\n const parentDir = dirname(outputPath);\n try {\n const s = await stat(parentDir);\n if (!s.isDirectory()) {\n throw new Error(`Parent directory does not exist: ${parentDir}`);\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"Parent directory\")) throw e;\n throw new Error(`Parent directory does not exist: ${parentDir}`);\n }\n\n try {\n await stat(outputPath);\n // If stat succeeds, file exists\n throw new Error(\n `File already exists at ${outputPath}. Delete it first or use a different path.`,\n );\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"File already exists\")) throw e;\n // ENOENT is expected — file doesn't exist yet\n }\n}\n\n/** Get the algorithm file extension based on renderer type. */\nfunction algorithmExtension(rendererType: string): string {\n return rendererType === \"glsl\" ? \".glsl\" : \".js\";\n}\n\n/** Build a sketch copy with optional overrides (no mutation). */\nfunction applyOverrides(\n sketch: SketchDefinition,\n overrides: { seed?: number; params?: Record<string, number> },\n): SketchDefinition {\n if (overrides.seed === undefined && overrides.params === undefined) {\n return sketch;\n }\n const newState = {\n seed: overrides.seed ?? sketch.state.seed,\n params: overrides.params\n ? { ...sketch.state.params, ...overrides.params }\n : sketch.state.params,\n colorPalette: sketch.state.colorPalette,\n };\n return { ...sketch, state: newState };\n}\n\n// ---------------------------------------------------------------------------\n// export_sketch\n// ---------------------------------------------------------------------------\n\nexport interface ExportSketchInput {\n sketchId: string;\n format: \"html\" | \"png\" | \"svg\" | \"algorithm\" | \"zip\";\n outputPath: string;\n width?: number;\n height?: number;\n seed?: number;\n params?: Record<string, number>;\n}\n\nexport async function exportSketch(\n state: EditorState,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n state.requireWorkspace();\n\n const loaded = state.requireSketch(input.sketchId);\n const sketch = applyOverrides(loaded.definition, {\n seed: input.seed,\n params: input.params,\n });\n\n await validateOutputPath(input.outputPath);\n\n const adapter = registry.resolve(sketch.renderer.type);\n if (!adapter) {\n throw new Error(\n `Unsupported renderer type: '${sketch.renderer.type}'`,\n );\n }\n\n switch (input.format) {\n case \"html\":\n return await exportHtml(sketch, input.outputPath);\n\n case \"png\":\n return await exportPng(sketch, input);\n\n case \"svg\":\n return await exportSvg(sketch, input);\n\n case \"algorithm\":\n return await exportAlgorithm(sketch, input.outputPath);\n\n case \"zip\":\n return await exportZip(sketch, input);\n\n default:\n throw new Error(`Unsupported export format: '${input.format}'`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Format exporters\n// ---------------------------------------------------------------------------\n\nasync function exportHtml(\n sketch: SketchDefinition,\n outputPath: string,\n): Promise<Record<string, unknown>> {\n const adapter = registry.resolve(sketch.renderer.type)!;\n const html = adapter.generateStandaloneHTML(sketch);\n const content = Buffer.from(html, \"utf-8\");\n await writeFile(outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"html\",\n outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n };\n}\n\nasync function exportPng(\n sketch: SketchDefinition,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n const adapter = registry.resolve(sketch.renderer.type)!;\n const html = adapter.generateStandaloneHTML(sketch);\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n const result = await captureHtml({ html, width, height });\n await writeFile(input.outputPath, result.bytes);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"png\",\n outputPath: input.outputPath,\n fileSize: result.bytes.byteLength,\n renderer: sketch.renderer.type,\n };\n}\n\nasync function exportSvg(\n sketch: SketchDefinition,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n if (sketch.renderer.type === \"svg\") {\n // For SVG renderer, use the algorithm as raw SVG output\n const content = Buffer.from(sketch.algorithm, \"utf-8\");\n await writeFile(input.outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"svg\",\n outputPath: input.outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n notice: null,\n };\n }\n\n // For non-SVG renderers, rasterize to PNG and embed in SVG container\n const adapter = registry.resolve(sketch.renderer.type)!;\n const html = adapter.generateStandaloneHTML(sketch);\n const result = await captureHtml({ html, width, height });\n const b64 = Buffer.from(result.bytes).toString(\"base64\");\n\n const svg = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <image width=\"${width}\" height=\"${height}\"\n href=\"data:image/png;base64,${b64}\"/>\n</svg>`;\n\n const content = Buffer.from(svg, \"utf-8\");\n await writeFile(input.outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"svg\",\n outputPath: input.outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n notice: \"Non-SVG renderer — rasterized PNG embedded in SVG container\",\n };\n}\n\nasync function exportAlgorithm(\n sketch: SketchDefinition,\n outputPath: string,\n): Promise<Record<string, unknown>> {\n const content = Buffer.from(sketch.algorithm, \"utf-8\");\n await writeFile(outputPath, content);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"algorithm\",\n outputPath,\n fileSize: content.byteLength,\n renderer: sketch.renderer.type,\n };\n}\n\nasync function exportZip(\n sketch: SketchDefinition,\n input: ExportSketchInput,\n): Promise<Record<string, unknown>> {\n const adapter = registry.resolve(sketch.renderer.type)!;\n const width = input.width ?? sketch.canvas.width;\n const height = input.height ?? sketch.canvas.height;\n\n // Generate all artifacts\n const html = adapter.generateStandaloneHTML(sketch);\n const genartJson = serializeGenart(sketch);\n const algorithm = sketch.algorithm;\n const algExt = algorithmExtension(sketch.renderer.type);\n\n // Capture PNG\n const captureResult = await captureHtml({ html, width, height });\n\n // Write zip\n const output = createWriteStream(input.outputPath);\n const archive = archiver(\"zip\", { zlib: { level: 9 } });\n\n const finished = new Promise<void>((resolve, reject) => {\n output.on(\"close\", resolve);\n archive.on(\"error\", reject);\n });\n\n archive.pipe(output);\n archive.append(html, { name: `${sketch.id}.html` });\n archive.append(Buffer.from(captureResult.bytes), { name: `${sketch.id}.png` });\n archive.append(algorithm, { name: `${sketch.id}${algExt}` });\n archive.append(genartJson, { name: `${sketch.id}.genart` });\n await archive.finalize();\n await finished;\n\n // Get final file size\n const s = await stat(input.outputPath);\n\n return {\n success: true,\n sketchId: sketch.id,\n format: \"zip\",\n outputPath: input.outputPath,\n fileSize: s.size,\n renderer: sketch.renderer.type,\n contents: [\n `${sketch.id}.html`,\n `${sketch.id}.png`,\n `${sketch.id}${algExt}`,\n `${sketch.id}.genart`,\n ],\n };\n}\n","/**\n * Core design layer tools — always available, not plugin-contributed.\n * These operate directly on the LayerStackAccessor for the active sketch.\n */\n\nimport type {\n DesignLayer,\n LayerTransform,\n BlendMode,\n PluginRegistry,\n} from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction requireSketchId(\n state: EditorState,\n args: { sketchId?: string },\n): string {\n return args.sketchId ?? state.requireSelectedSketchId();\n}\n\nconst BLEND_MODES: BlendMode[] = [\n \"normal\", \"multiply\", \"screen\", \"overlay\",\n \"darken\", \"lighten\", \"color-dodge\", \"color-burn\",\n \"hard-light\", \"soft-light\", \"difference\", \"exclusion\",\n \"hue\", \"saturation\", \"color\", \"luminosity\",\n];\n\nfunction generateLayerId(): string {\n return `layer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Tool implementations\n// ---------------------------------------------------------------------------\n\nexport async function designAddLayer(\n state: EditorState,\n args: {\n sketchId?: string;\n type: string;\n name?: string;\n properties?: Record<string, unknown>;\n transform?: Partial<LayerTransform>;\n opacity?: number;\n blendMode?: string;\n index?: number;\n },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const loaded = state.requireSketch(sketchId);\n const stack = state.getLayerStack(sketchId);\n const registry = state.pluginRegistry;\n\n // Resolve layer type from registry to get defaults\n const layerTypeDef = registry?.resolveLayerType(args.type);\n if (!layerTypeDef) {\n throw new Error(\n `Unknown layer type: '${args.type}'. Use design_list_layers types from registered plugins.`,\n );\n }\n\n const defaults = layerTypeDef.createDefault();\n const id = generateLayerId();\n const { width, height } = loaded.definition.canvas;\n\n const layer: DesignLayer = {\n id,\n type: args.type,\n name: args.name ?? layerTypeDef.displayName,\n visible: true,\n locked: false,\n opacity: args.opacity ?? 1,\n blendMode: (args.blendMode as BlendMode) ?? \"normal\",\n transform: {\n x: 0,\n y: 0,\n width,\n height,\n rotation: 0,\n scaleX: 1,\n scaleY: 1,\n anchorX: 0.5,\n anchorY: 0.5,\n ...args.transform,\n },\n properties: { ...defaults, ...args.properties },\n };\n\n stack.add(layer, args.index);\n await state.saveSketch(sketchId);\n\n return {\n layerId: id,\n type: args.type,\n name: layer.name,\n index: args.index ?? stack.count - 1,\n sketchId,\n };\n}\n\nexport async function designRemoveLayer(\n state: EditorState,\n args: { sketchId?: string; layerId: string },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const removed = stack.remove(args.layerId);\n if (!removed) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n await state.saveSketch(sketchId);\n return { removed: true, layerId: args.layerId, sketchId };\n}\n\nexport async function designListLayers(\n state: EditorState,\n args: { sketchId?: string },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n const layers = stack.getAll();\n\n return {\n sketchId,\n count: layers.length,\n layers: layers.map((l, i) => ({\n index: i,\n id: l.id,\n type: l.type,\n name: l.name,\n visible: l.visible,\n locked: l.locked,\n opacity: l.opacity,\n blendMode: l.blendMode,\n })),\n };\n}\n\nexport async function designGetLayer(\n state: EditorState,\n args: { sketchId?: string; layerId: string },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n return {\n sketchId,\n layer: {\n id: layer.id,\n type: layer.type,\n name: layer.name,\n visible: layer.visible,\n locked: layer.locked,\n opacity: layer.opacity,\n blendMode: layer.blendMode,\n transform: layer.transform,\n properties: layer.properties,\n },\n };\n}\n\nexport async function designUpdateLayer(\n state: EditorState,\n args: {\n sketchId?: string;\n layerId: string;\n name?: string;\n properties?: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n const updates: Record<string, unknown> = {};\n if (args.properties) {\n Object.assign(updates, args.properties);\n }\n\n if (Object.keys(updates).length > 0) {\n stack.updateProperties(args.layerId, updates);\n }\n\n // Name is a layer-level field, not a property — handle via direct mutation\n if (args.name !== undefined) {\n const current = stack.get(args.layerId)!;\n // Re-add with updated name by updating properties (triggers onChange)\n // LayerStackAccessor doesn't have a setName, so we update via the stack internals\n // For now, use updateProperties which triggers onChange and sync\n stack.updateProperties(args.layerId, { ...current.properties });\n // The name field needs direct mutation on the mutable layer\n const mutableLayer = stack.get(args.layerId) as { name: string };\n mutableLayer.name = args.name;\n }\n\n await state.saveSketch(sketchId);\n return { updated: true, layerId: args.layerId, sketchId };\n}\n\nexport async function designSetTransform(\n state: EditorState,\n args: {\n sketchId?: string;\n layerId: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n rotation?: number;\n scaleX?: number;\n scaleY?: number;\n anchorX?: number;\n anchorY?: number;\n },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n const partial: Partial<LayerTransform> = {};\n if (args.x !== undefined) partial.x = args.x;\n if (args.y !== undefined) partial.y = args.y;\n if (args.width !== undefined) partial.width = args.width;\n if (args.height !== undefined) partial.height = args.height;\n if (args.rotation !== undefined) partial.rotation = args.rotation;\n if (args.scaleX !== undefined) partial.scaleX = args.scaleX;\n if (args.scaleY !== undefined) partial.scaleY = args.scaleY;\n if (args.anchorX !== undefined) partial.anchorX = args.anchorX;\n if (args.anchorY !== undefined) partial.anchorY = args.anchorY;\n\n stack.updateTransform(args.layerId, partial);\n await state.saveSketch(sketchId);\n\n return {\n updated: true,\n layerId: args.layerId,\n transform: stack.get(args.layerId)!.transform,\n sketchId,\n };\n}\n\nexport async function designSetBlend(\n state: EditorState,\n args: {\n sketchId?: string;\n layerId: string;\n blendMode?: string;\n opacity?: number;\n },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n if (args.blendMode && !BLEND_MODES.includes(args.blendMode as BlendMode)) {\n throw new Error(\n `Invalid blend mode '${args.blendMode}'. Must be one of: ${BLEND_MODES.join(\", \")}`,\n );\n }\n\n stack.updateBlend(\n args.layerId,\n args.blendMode as BlendMode | undefined,\n args.opacity,\n );\n await state.saveSketch(sketchId);\n\n const updated = stack.get(args.layerId)!;\n return {\n updated: true,\n layerId: args.layerId,\n blendMode: updated.blendMode,\n opacity: updated.opacity,\n sketchId,\n };\n}\n\nexport async function designReorderLayers(\n state: EditorState,\n args: { sketchId?: string; layerId: string; newIndex: number },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n stack.reorder(args.layerId, args.newIndex);\n await state.saveSketch(sketchId);\n\n return {\n reordered: true,\n layerId: args.layerId,\n newIndex: args.newIndex,\n sketchId,\n };\n}\n\nexport async function designDuplicateLayer(\n state: EditorState,\n args: { sketchId?: string; layerId: string },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n const newId = stack.duplicate(args.layerId);\n await state.saveSketch(sketchId);\n\n return {\n duplicated: true,\n sourceLayerId: args.layerId,\n newLayerId: newId,\n sketchId,\n };\n}\n\nexport async function designToggleVisibility(\n state: EditorState,\n args: { sketchId?: string; layerId: string; visible?: boolean },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n const newVisible = args.visible ?? !layer.visible;\n // Use the mutable layer reference to toggle visibility\n const mutableLayer = layer as { visible: boolean };\n mutableLayer.visible = newVisible;\n // Trigger onChange by doing a no-op property update\n stack.updateProperties(args.layerId, { ...layer.properties });\n await state.saveSketch(sketchId);\n\n return {\n layerId: args.layerId,\n visible: newVisible,\n sketchId,\n };\n}\n\nexport async function designLockLayer(\n state: EditorState,\n args: { sketchId?: string; layerId: string; locked?: boolean },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n\n const layer = stack.get(args.layerId);\n if (!layer) {\n throw new Error(`Layer '${args.layerId}' not found in sketch '${sketchId}'.`);\n }\n\n const newLocked = args.locked ?? !layer.locked;\n const mutableLayer = layer as { locked: boolean };\n mutableLayer.locked = newLocked;\n stack.updateProperties(args.layerId, { ...layer.properties });\n await state.saveSketch(sketchId);\n\n return {\n layerId: args.layerId,\n locked: newLocked,\n sketchId,\n };\n}\n\nexport async function designCaptureComposite(\n state: EditorState,\n args: { sketchId?: string },\n): Promise<Record<string, unknown>> {\n const sketchId = requireSketchId(state, args);\n const stack = state.getLayerStack(sketchId);\n const layers = stack.getAll();\n\n return {\n sketchId,\n layerCount: layers.length,\n visibleCount: layers.filter((l) => l.visible).length,\n message:\n \"Composite capture requires a rendering surface. \" +\n \"Use capture_screenshot to get a rasterized preview of the sketch, \" +\n \"then use design_list_layers to see the design layer stack.\",\n };\n}\n","/**\n * Dynamic MCP tool registration from the PluginRegistry.\n * Iterates all plugin-contributed MCP tools and registers each\n * as a standard MCP server tool with the \"design_\" prefix.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { PluginRegistry } from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\n\n/**\n * Register all plugin-contributed MCP tools with the MCP server.\n * Each tool is prefixed with \"design_\" by the PluginRegistry.\n *\n * Each tool delegates to its plugin handler and saves after mutation.\n */\nexport function registerPluginMcpTools(\n server: McpServer,\n registry: PluginRegistry,\n state: EditorState,\n): void {\n for (const tool of registry.getMcpTools()) {\n // Build the Zod-compatible shape from the plugin's JSON Schema.\n // The MCP SDK's server.tool() accepts raw JSON Schema as the shape\n // when passed as a plain object (not Zod). We pass the inputSchema\n // properties directly for compatibility.\n const inputSchema = tool.definition.inputSchema as {\n properties?: Record<string, unknown>;\n required?: string[];\n };\n\n server.tool(\n tool.name,\n tool.definition.description,\n // Pass raw JSON schema — MCP SDK accepts this alongside Zod\n inputSchema as Record<string, unknown>,\n async (args: Record<string, unknown>) => {\n try {\n // Resolve the target sketch\n const sketchId =\n (args.sketchId as string | undefined) ??\n state.requireSelectedSketchId();\n\n // Create the plugin tool context\n const context = state.createMcpToolContext(sketchId);\n\n // Delegate to plugin handler\n const result = await tool.definition.handler(args, context);\n\n // Save after mutation\n await state.saveSketch(sketchId);\n\n return {\n content: result.content.map((c) => {\n if (c.type === \"text\") {\n return { type: \"text\" as const, text: c.text };\n }\n return {\n type: \"image\" as const,\n data: c.data,\n mimeType: c.mimeType as \"image/jpeg\",\n };\n }),\n isError: result.isError,\n };\n } catch (e) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({\n error: e instanceof Error ? e.message : String(e),\n }),\n },\n ],\n isError: true as const,\n };\n }\n },\n );\n }\n}\n","/**\n * MCP resource registration.\n * Resources are read-only data endpoints exposed to AI clients.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CANVAS_PRESETS,\n createDefaultRegistry,\n createDefaultSkillRegistry,\n type RendererType,\n} from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\n\n/** Register all MCP resources on the server. */\nexport function registerResources(\n server: McpServer,\n state: EditorState,\n): void {\n registerSkillsResource(server);\n registerCanvasPresetsResource(server);\n registerGalleryResource(server, state);\n registerRenderersResource(server);\n}\n\n// ---------------------------------------------------------------------------\n// genart://skills — design knowledge skills listing\n// ---------------------------------------------------------------------------\n\nfunction registerSkillsResource(server: McpServer): void {\n const skillRegistry = createDefaultSkillRegistry();\n\n server.resource(\n \"skills\",\n \"genart://skills\",\n {\n description:\n \"List available design knowledge skills with id, name, category, complexity, and description.\",\n mimeType: \"application/json\",\n },\n async () => {\n const skills = skillRegistry.list().map((s) => ({\n id: s.id,\n name: s.name,\n category: s.category,\n complexity: s.complexity,\n description: s.description,\n }));\n\n return {\n contents: [\n {\n uri: \"genart://skills\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n skills,\n total: skills.length,\n categories: skillRegistry.categories(),\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// genart://presets/canvas — canvas dimension presets\n// ---------------------------------------------------------------------------\n\nfunction registerCanvasPresetsResource(server: McpServer): void {\n server.resource(\n \"canvas-presets\",\n \"genart://presets/canvas\",\n {\n description:\n \"List all built-in canvas dimension presets with id, label, category, width, and height.\",\n mimeType: \"application/json\",\n },\n async () => ({\n contents: [\n {\n uri: \"genart://presets/canvas\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n presets: CANVAS_PRESETS.map((p) => ({\n id: p.id,\n label: p.label,\n category: p.category,\n width: p.width,\n height: p.height,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n }),\n );\n}\n\n// ---------------------------------------------------------------------------\n// genart://gallery — loaded sketches with metadata summaries\n// ---------------------------------------------------------------------------\n\nfunction registerGalleryResource(\n server: McpServer,\n state: EditorState,\n): void {\n server.resource(\n \"gallery\",\n \"genart://gallery\",\n {\n description:\n \"List all loaded sketches in the active workspace with metadata summaries.\",\n mimeType: \"application/json\",\n },\n async () => {\n const sketches = [...state.sketches.values()].map(({ definition, path }) => ({\n id: definition.id,\n title: definition.title,\n renderer: definition.renderer,\n canvas: definition.canvas,\n parameterCount: definition.parameters?.length ?? 0,\n colorCount: definition.colors?.length ?? 0,\n hasPhilosophy: !!definition.philosophy,\n seed: definition.seed,\n path,\n }));\n\n return {\n contents: [\n {\n uri: \"genart://gallery\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n workspacePath: state.workspacePath,\n sketchCount: sketches.length,\n sketches,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// genart://renderers — available renderers with metadata\n// ---------------------------------------------------------------------------\n\nfunction registerRenderersResource(server: McpServer): void {\n const registry = createDefaultRegistry();\n\n server.resource(\n \"renderers\",\n \"genart://renderers\",\n {\n description:\n \"List all available renderer types with display name, algorithm language, and runtime dependencies.\",\n mimeType: \"application/json\",\n },\n async () => {\n const types = registry.list();\n const renderers = types.map((type: RendererType) => {\n const adapter = registry.resolve(type);\n return {\n type: adapter.type,\n displayName: adapter.displayName,\n algorithmLanguage: adapter.algorithmLanguage,\n dependencies: adapter.getRuntimeDependencies().map((dep) => ({\n name: dep.name,\n version: dep.version,\n cdnUrl: dep.cdnUrl,\n })),\n };\n });\n\n const defaultAdapter = registry.getDefault();\n\n return {\n contents: [\n {\n uri: \"genart://renderers\",\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n defaultRenderer: defaultAdapter.type,\n renderers,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n","/**\n * MCP prompt registration.\n * Prompts are structured prompt templates exposed to AI clients.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { EditorState } from \"../state.js\";\n\n/** Register all MCP prompts on the server. */\nexport function registerPrompts(\n server: McpServer,\n state: EditorState,\n): void {\n registerCreateGenerativeArt(server);\n registerExploreVariations(server, state);\n registerApplyDesignTheory(server, state);\n}\n\n// ---------------------------------------------------------------------------\n// create-generative-art — structured prompt for creating new generative art\n// ---------------------------------------------------------------------------\n\nfunction registerCreateGenerativeArt(server: McpServer): void {\n server.prompt(\n \"create-generative-art\",\n \"Create a new piece of generative art with structured guidance\",\n {\n concept: z\n .string()\n .describe(\"The artistic concept or visual idea to explore\"),\n renderer: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer to use (default: p5)\"),\n complexity: z\n .enum([\"simple\", \"moderate\", \"complex\"])\n .optional()\n .describe(\"Desired complexity level (default: moderate)\"),\n canvas: z\n .string()\n .optional()\n .describe(\"Canvas preset name or WxH dimensions (default: square-1200)\"),\n },\n async (args) => {\n const renderer = args.renderer ?? \"p5\";\n const complexity = args.complexity ?? \"moderate\";\n const canvas = args.canvas ?? \"square-1200\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Create a generative art sketch with the following specifications:`,\n ``,\n `## Concept`,\n `${args.concept}`,\n ``,\n `## Technical Specifications`,\n `- **Renderer:** ${renderer}`,\n `- **Complexity:** ${complexity}`,\n `- **Canvas:** ${canvas}`,\n ``,\n `## Steps`,\n `1. Use \\`create_sketch\\` to create a new .genart file with a relative path (e.g. \\`my-sketch.genart\\`)`,\n `2. Design 3–6 parameters that control visual variation (range sliders)`,\n `3. Define 2–4 color parameters for palette control`,\n `4. Write the algorithm that implements the concept`,\n `5. Use \\`update_algorithm\\` to set the algorithm with validation`,\n `6. Use \\`capture_screenshot\\` to verify the visual output`,\n `7. Iterate on parameters and algorithm until the result matches the concept`,\n ``,\n `## Guidelines`,\n `- Parameters should have meaningful ranges that produce visually distinct results`,\n `- The algorithm should be deterministic given the same seed and parameters`,\n `- Include a philosophy field describing the artistic intent`,\n `- Use design principles: balance, contrast, rhythm, harmony`,\n `- Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools that create or modify sketches`,\n complexity === \"simple\"\n ? `- Keep the algorithm under 50 lines with 2–3 parameters`\n : complexity === \"complex\"\n ? `- The algorithm can be extensive; use 5+ parameters and consider animation`\n : `- Aim for 30–80 lines with 3–5 parameters`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// explore-variations — explore parameter/seed variations of an existing sketch\n// ---------------------------------------------------------------------------\n\nfunction registerExploreVariations(\n server: McpServer,\n state: EditorState,\n): void {\n server.prompt(\n \"explore-variations\",\n \"Explore parameter and seed variations of an existing sketch\",\n {\n sketchId: z\n .string()\n .describe(\"ID of the sketch to explore variations of\"),\n strategy: z\n .enum([\"seeds\", \"params\", \"both\", \"extremes\"])\n .optional()\n .describe(\"Variation strategy (default: both)\"),\n count: z\n .string()\n .optional()\n .describe(\"Number of variations to explore (default: 6)\"),\n },\n async (args) => {\n const strategy = args.strategy ?? \"both\";\n const count = args.count ?? \"6\";\n const sketch = state.getSketch(args.sketchId);\n\n let sketchContext = \"\";\n if (sketch) {\n const def = sketch.definition;\n const params = def.parameters\n ?.map(\n (p) =>\n ` - ${p.key} (${p.label}): ${p.min}–${p.max}, step ${p.step}, default ${p.default}`,\n )\n .join(\"\\n\");\n const colors = def.colors\n ?.map((c) => ` - ${c.key} (${c.label}): ${c.default}`)\n .join(\"\\n\");\n\n sketchContext = [\n `## Current Sketch: \"${def.title}\"`,\n `- **ID:** ${def.id}`,\n `- **Renderer:** ${def.renderer}`,\n `- **Canvas:** ${def.canvas.width}×${def.canvas.height}`,\n `- **Seed:** ${def.seed}`,\n params ? `- **Parameters:**\\n${params}` : `- **Parameters:** none`,\n colors ? `- **Colors:**\\n${colors}` : `- **Colors:** none`,\n ].join(\"\\n\");\n } else {\n sketchContext = `## Sketch: ${args.sketchId}\\n*(Not currently loaded — use open_sketch or get_selection to load it first)*`;\n }\n\n const strategyInstructions: Record<string, string> = {\n seeds: [\n `## Strategy: Seed Exploration`,\n `Generate ${count} variations by changing only the seed value.`,\n `1. Use \\`fork_sketch\\` to create each variation with \\`newSeed: true\\``,\n `2. Use \\`capture_batch\\` to capture all variations`,\n `3. Compare the results and identify which seeds produce the most interesting outputs`,\n ].join(\"\\n\"),\n params: [\n `## Strategy: Parameter Exploration`,\n `Generate ${count} variations by systematically varying parameters.`,\n `1. Use \\`fork_sketch\\` for each variation`,\n `2. For each fork, use \\`set_parameters\\` to explore different regions of the parameter space`,\n `3. Try: minimum values, maximum values, center values, and random combinations`,\n `4. Use \\`capture_batch\\` to capture all variations`,\n ].join(\"\\n\"),\n both: [\n `## Strategy: Combined Exploration`,\n `Generate ${count} variations by varying both seeds and parameters.`,\n `1. Create ${count} forks with \\`fork_sketch\\` (newSeed: true)`,\n `2. For half the forks, also adjust parameters to explore different visual territories`,\n `3. Use \\`capture_batch\\` to capture all variations`,\n `4. Identify the most visually interesting combinations`,\n ].join(\"\\n\"),\n extremes: [\n `## Strategy: Extreme Parameter Exploration`,\n `Generate ${count} variations by pushing parameters to their limits.`,\n `1. Create forks with all parameters at minimum, all at maximum, and diagonal extremes`,\n `2. Also create forks with each parameter individually at its min and max`,\n `3. Use \\`capture_batch\\` to capture all variations`,\n `4. This reveals the full range of the parameter space`,\n ].join(\"\\n\"),\n };\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Explore variations of an existing generative art sketch.`,\n ``,\n sketchContext,\n ``,\n strategyInstructions[strategy],\n ``,\n `## After Exploration`,\n `- Use \\`auto_arrange\\` to lay out all variations in a grid`,\n `- Use \\`snapshot_layout\\` to capture the arrangement`,\n `- Summarize which variations are most interesting and why`,\n ``,\n `**Attribution:** Always pass your \\`agent\\` name and \\`model\\` identifier when calling \\`fork_sketch\\` and other tools that create or modify sketches.`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// apply-design-theory — apply design theory concepts to a sketch\n// ---------------------------------------------------------------------------\n\nfunction registerApplyDesignTheory(\n server: McpServer,\n state: EditorState,\n): void {\n server.prompt(\n \"apply-design-theory\",\n \"Apply design theory concepts to improve or evolve a generative art sketch\",\n {\n sketchId: z\n .string()\n .describe(\"ID of the sketch to apply design theory to\"),\n theory: z\n .enum([\n \"gestalt\",\n \"color-theory\",\n \"composition\",\n \"rhythm-repetition\",\n \"negative-space\",\n \"contrast\",\n ])\n .describe(\"Design theory to apply\"),\n },\n async (args) => {\n const sketch = state.getSketch(args.sketchId);\n\n let sketchContext = \"\";\n if (sketch) {\n const def = sketch.definition;\n sketchContext = [\n `## Current Sketch: \"${def.title}\"`,\n `- **Renderer:** ${def.renderer}`,\n `- **Canvas:** ${def.canvas.width}×${def.canvas.height}`,\n `- **Parameters:** ${def.parameters?.length ?? 0} defined`,\n `- **Colors:** ${def.colors?.length ?? 0} defined`,\n def.philosophy\n ? `- **Philosophy:** ${def.philosophy}`\n : `- **Philosophy:** not set`,\n ].join(\"\\n\");\n } else {\n sketchContext = `## Sketch: ${args.sketchId}\\n*(Not currently loaded — use open_sketch first)*`;\n }\n\n const theoryGuides: Record<string, string> = {\n gestalt: [\n `## Theory: Gestalt Principles`,\n `Apply principles of visual perception to the sketch:`,\n `- **Proximity:** Group related elements closer together`,\n `- **Similarity:** Make related elements share visual properties (size, color, shape)`,\n `- **Continuity:** Align elements to create implied lines and flow`,\n `- **Closure:** Allow the viewer's mind to complete partial shapes`,\n `- **Figure-Ground:** Establish clear foreground/background relationships`,\n ``,\n `### Implementation`,\n `1. Analyze the current algorithm for element placement patterns`,\n `2. Add or modify parameters that control grouping, spacing, and alignment`,\n `3. Ensure the seed produces consistent perceptual grouping`,\n ].join(\"\\n\"),\n\n \"color-theory\": [\n `## Theory: Color Theory`,\n `Apply color harmony and contrast principles:`,\n `- **Complementary:** Use colors opposite on the color wheel for high contrast`,\n `- **Analogous:** Use adjacent colors for harmony`,\n `- **Triadic:** Use three evenly-spaced colors for vibrancy`,\n `- **Value contrast:** Ensure sufficient light/dark variation`,\n `- **Saturation:** Control intensity for emphasis and depth`,\n ``,\n `### Implementation`,\n `1. Review the current color definitions and themes`,\n `2. Add color parameters that follow a chosen harmony scheme`,\n `3. Create 2–3 theme presets demonstrating different harmonies`,\n `4. Update the algorithm to use colors intentionally for depth and emphasis`,\n ].join(\"\\n\"),\n\n composition: [\n `## Theory: Composition`,\n `Apply compositional rules for visual impact:`,\n `- **Rule of thirds:** Place key elements at intersection points`,\n `- **Golden ratio:** Use φ (1.618) for proportional divisions`,\n `- **Visual weight:** Balance heavy elements with negative space`,\n `- **Leading lines:** Direct the eye through the composition`,\n `- **Focal point:** Establish a clear center of interest`,\n ``,\n `### Implementation`,\n `1. Analyze element distribution in the current algorithm`,\n `2. Add parameters for compositional control (focal point position, density distribution)`,\n `3. Use mathematical ratios (thirds, golden) for element placement`,\n `4. Test with \\`capture_screenshot\\` and verify visual balance`,\n ].join(\"\\n\"),\n\n \"rhythm-repetition\": [\n `## Theory: Rhythm & Repetition`,\n `Apply rhythmic patterns and controlled repetition:`,\n `- **Regular rhythm:** Equal spacing between repeated elements`,\n `- **Alternating rhythm:** Two or more elements in sequence`,\n `- **Progressive rhythm:** Gradual size, color, or spacing changes`,\n `- **Random rhythm:** Organic, noise-driven variation within structure`,\n `- **Fractal repetition:** Self-similar patterns at different scales`,\n ``,\n `### Implementation`,\n `1. Identify repeating elements in the current algorithm`,\n `2. Add parameters for rhythm type, frequency, and amplitude`,\n `3. Layer multiple rhythmic patterns for visual complexity`,\n `4. Use the seed to introduce controlled randomness within the rhythm`,\n ].join(\"\\n\"),\n\n \"negative-space\": [\n `## Theory: Negative Space`,\n `Use emptiness as a compositional element:`,\n `- **Active negative space:** Intentional empty areas that form shapes`,\n `- **Breathing room:** Prevent visual overcrowding`,\n `- **Figure-ground reversal:** Make negative space as interesting as positive`,\n `- **Density gradients:** Transition from dense to sparse areas`,\n ``,\n `### Implementation`,\n `1. Add a density/coverage parameter to control fill percentage`,\n `2. Create regions of intentional emptiness in the algorithm`,\n `3. Use the canvas edges and margins as compositional anchors`,\n `4. Test at different density levels with \\`capture_screenshot\\``,\n ].join(\"\\n\"),\n\n contrast: [\n `## Theory: Contrast`,\n `Apply contrast principles for visual interest:`,\n `- **Size contrast:** Juxtapose large and small elements`,\n `- **Color contrast:** Use complementary or value differences`,\n `- **Shape contrast:** Mix geometric and organic forms`,\n `- **Texture contrast:** Smooth vs. rough, dense vs. sparse`,\n `- **Movement contrast:** Static vs. dynamic, fast vs. slow`,\n ``,\n `### Implementation`,\n `1. Identify the dominant visual quality in the current algorithm`,\n `2. Introduce its opposite as a secondary element`,\n `3. Add parameters that control the degree of contrast`,\n `4. Use \\`fork_sketch\\` to compare low-contrast and high-contrast versions`,\n ].join(\"\\n\"),\n };\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Apply design theory to improve a generative art sketch.`,\n ``,\n sketchContext,\n ``,\n theoryGuides[args.theory],\n ``,\n `## Workflow`,\n `1. Use \\`get_selection\\` or \\`open_sketch\\` to examine the current sketch`,\n `2. Analyze how the theory applies to the existing algorithm`,\n `3. Use \\`fork_sketch\\` to create a theory-applied variant`,\n `4. Modify the fork's algorithm and parameters using the theory principles above`,\n `5. Use \\`capture_screenshot\\` to compare before and after`,\n `6. Update the philosophy field to document the design rationale`,\n ``,\n `**Attribution:** Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools that create or modify sketches.`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n"],"mappings":"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","names":["import_promises","import_zod","import_core","import_promises","import_path","import_core","json","unlink","import_promises","import_path","import_core","now","fileExists","registry","ts","import_path","import_core","now","import_path","now","computeViewport","import_promises","import_path","import_core","import_path","import_promises","import_core","now","import_path","import_core","import_promises","import_core","VALID_RENDERERS","exports","import_promises","import_core","resolve","registry","import_promises","import_path","import_core","registry","applyOverrides","content","archiver","resolve","registry","registry","import_core","registry","registry","typographyPlugin","filtersPlugin","shapesPlugin","layoutGuidesPlugin"]}