@genart-dev/mcp-server 0.4.7 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/critique.ts","../src/tools/series.ts","../src/tools/reference.ts","../src/tools/export.ts","../src/tools/design.ts","../src/tools/design-plugins.ts","../src/resources/index.ts","../src/prompts/index.ts","../src/state.ts","../src/sidecar.ts"],"sourcesContent":["/**\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 paintingPlugin from \"@genart-dev/plugin-painting\";\nimport texturesPlugin from \"@genart-dev/plugin-textures\";\nimport animationPlugin from \"@genart-dev/plugin-animation\";\nimport colorAdjustPlugin from \"@genart-dev/plugin-color-adjust\";\nimport compositingPlugin from \"@genart-dev/plugin-compositing\";\nimport constructionPlugin from \"@genart-dev/plugin-construction\";\nimport distributionPlugin from \"@genart-dev/plugin-distribution\";\nimport figurePlugin from \"@genart-dev/plugin-figure\";\nimport layoutCompositionPlugin from \"@genart-dev/plugin-layout-composition\";\nimport perspectivePlugin from \"@genart-dev/plugin-perspective\";\nimport posesPlugin from \"@genart-dev/plugin-poses\";\nimport stylesPlugin from \"@genart-dev/plugin-styles\";\nimport symbolsPlugin from \"@genart-dev/plugin-symbols\";\nimport tracePlugin from \"@genart-dev/plugin-trace\";\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, suggestSkills } from \"./tools/knowledge.js\";\nimport {\n listComponents,\n addComponent,\n removeComponent,\n} from \"./tools/components.js\";\nimport { captureScreenshot, captureBatch } from \"./tools/capture.js\";\nimport { critiqueSketch, compareSketches } from \"./tools/critique.js\";\nimport {\n createSeries,\n developConcept,\n seriesSummary,\n promoteSketch,\n} from \"./tools/series.js\";\nimport {\n addReference,\n analyzeReference,\n updateReferenceAnalysis,\n extractPalette,\n} from \"./tools/reference.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 all design plugins\n await registry.register(typographyPlugin);\n await registry.register(filtersPlugin);\n await registry.register(shapesPlugin);\n await registry.register(layoutGuidesPlugin);\n await registry.register(paintingPlugin);\n await registry.register(texturesPlugin);\n await registry.register(animationPlugin);\n await registry.register(colorAdjustPlugin);\n await registry.register(compositingPlugin);\n await registry.register(constructionPlugin);\n await registry.register(distributionPlugin);\n await registry.register(figurePlugin);\n await registry.register(layoutCompositionPlugin);\n await registry.register(perspectivePlugin);\n await registry.register(posesPlugin);\n await registry.register(stylesPlugin);\n await registry.register(symbolsPlugin);\n await registry.register(tracePlugin);\n\n return registry;\n}\n\nexport interface CreateServerOptions {\n /** Only register capture tools (for local-only capture companion server). */\n captureOnly?: boolean;\n}\n\n/** Create and configure the MCP server with all tools. */\nexport function createServer(\n state: EditorState,\n options?: CreateServerOptions,\n): McpServer {\n const captureOnly = options?.captureOnly ?? false;\n\n const server = new McpServer(\n {\n name: captureOnly ? \"@genart/mcp-capture\" : \"@genart/mcp-server\",\n version: \"0.4.0\",\n },\n {\n capabilities: {\n tools: {},\n ...(!captureOnly && { resources: {}, prompts: {} }),\n },\n },\n );\n\n if (captureOnly) {\n // Local capture-only mode: just capture + export tools, no remote deps\n registerCaptureTools(server, state);\n return server;\n }\n\n // Full server mode — register all tools\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 // Capture tools require puppeteer + local filesystem — skip in remote mode\n if (!state.remoteMode) {\n registerCaptureTools(server, state);\n }\n registerCritiqueTools(server, state);\n registerSeriesTools(server, state);\n registerReferenceTools(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 capture: z.boolean().optional().describe(\"When true, automatically capture a screenshot after creation and return it inline (avoids a separate capture_screenshot call)\"),\n },\n async (args) => {\n try {\n const result = await createSketch(state, args);\n\n // If capture requested and we're in local mode (capture tools available),\n // run headless capture and return image inline with metadata.\n if (args.capture && !state.remoteMode) {\n try {\n const captureResult = await captureScreenshot(state, {\n target: \"sketch\",\n sketchId: args.id,\n });\n return {\n content: [\n { type: \"image\" as const, data: captureResult.previewJpegBase64, mimeType: \"image/jpeg\" as const },\n { type: \"text\" as const, text: JSON.stringify({\n ...result,\n capture: captureResult.metadata,\n }, null, 2) },\n ],\n };\n } catch (captureErr) {\n // Capture failed but sketch was created successfully — return sketch result with capture error\n return jsonResult({\n ...result,\n captureError: captureErr instanceof Error ? captureErr.message : String(captureErr),\n });\n }\n }\n\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 an inline JPEG image + metadata as text. In local mode, also writes a full-res PNG to snapshots/<sketchId>-<seed>-preview.png (path in savedPreviewTo).\",\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 console.error(`[capture_screenshot] jpeg base64 length: ${result.previewJpegBase64.length}`);\n return {\n content: [\n { type: \"image\" as const, data: result.previewJpegBase64, mimeType: \"image/jpeg\" as const },\n { type: \"text\" as const, text: JSON.stringify(result.metadata, null, 2) },\n ],\n };\n } catch (e) {\n console.error(`[capture_screenshot] error: ${e instanceof Error ? e.message : String(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 inline JPEG images + per-sketch metadata. In local mode, writes full-res PNGs to snapshots/.\",\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 image + metadata (image first for inline rendering)\n for (const item of result.items) {\n content.push({\n type: \"image\",\n data: item.inlineJpegBase64,\n mimeType: \"image/jpeg\",\n });\n content.push({\n type: \"text\",\n text: JSON.stringify(item.metadata, null, 2),\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// Critique Tools (Phase 2: Perception & Self-Critique — ADR 053)\n// ---------------------------------------------------------------------------\n\nfunction registerCritiqueTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"critique_sketch\",\n \"Capture a sketch screenshot and return a structured self-critique framework (questions, principles, pitfalls) per aspect. Severity calibrates to compositionLevel.\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch to critique (default: selected sketch)\"),\n aspects: z\n .array(z.enum([\"composition\", \"color\", \"rhythm\", \"unity\", \"expression\"]))\n .optional()\n .describe(\"Aspects to critique (default: all five)\"),\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 critiqueSketch(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 \"compare_sketches\",\n \"Side-by-side capture of 2-4 sketches with a structured comparison framework across specified aspects.\",\n {\n sketchIds: z\n .array(z.string())\n .describe(\"IDs of 2-4 sketches to compare\"),\n aspects: z\n .array(z.enum([\"composition\", \"color\", \"rhythm\", \"unity\", \"expression\"]))\n .optional()\n .describe(\"Aspects to compare (default: all five)\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for inline preview JPEGs (default: 300)\"),\n },\n async (args) => {\n try {\n const result = await compareSketches(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 images interleaved for easy visual comparison\n for (const preview of result.previews) {\n content.push({\n type: \"text\",\n text: `--- Sketch: ${preview.sketchId} ---`,\n });\n content.push({\n type: \"image\",\n data: preview.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// Series & Conceptual Development Tools (Phase 3)\n// ---------------------------------------------------------------------------\n\nfunction registerSeriesTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"create_series\",\n \"Create a new curated series of sketches with narrative, intent, and studio workflow stages\",\n {\n label: z.string().describe(\"Display label for the series\"),\n narrative: z\n .string()\n .describe(\"Prose narrative describing the artistic exploration\"),\n intent: z.string().describe(\"Short statement of artistic intent\"),\n progression: z\n .string()\n .optional()\n .describe(\n \"Series progression type (e.g. 'linear', 'branching', 'iterative')\",\n ),\n stages: z\n .array(z.enum([\"studies\", \"drafts\", \"refinements\", \"finals\"]))\n .optional()\n .describe(\n \"Ordered stages in the studio workflow (default: all four)\",\n ),\n sketchFiles: z\n .array(z.string())\n .optional()\n .describe(\"File names of existing sketches to include\"),\n },\n async (args) => {\n try {\n const result = await createSeries(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 \"develop_concept\",\n \"Generate a structured concept development plan with mood, palette, composition, skills, and series structure recommendations\",\n {\n concept: z\n .string()\n .describe(\"The artistic concept or theme to develop\"),\n medium: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Preferred renderer/medium (default: p5)\"),\n },\n async (args) => {\n try {\n const result = await developConcept(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 \"series_summary\",\n \"Capture all sketches in a series with narrative context for holistic evaluation\",\n {\n seriesId: z.string().describe(\"ID of the series to summarize\"),\n captureScreenshots: z\n .boolean()\n .optional()\n .describe(\"Capture screenshots of each sketch (default: true)\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Preview image size in pixels (default: 300)\"),\n },\n async (args) => {\n try {\n const result = await seriesSummary(state, args);\n // Return text metadata + inline image previews\n const content: Array<{ type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string }> = [\n { type: \"text\" as const, text: JSON.stringify(result.metadata, null, 2) },\n ];\n if (result.previews) {\n for (const preview of result.previews) {\n content.push({\n type: \"image\" as const,\n data: preview.inlineJpegBase64,\n mimeType: \"image/jpeg\",\n });\n }\n }\n return { content };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"promote_sketch\",\n \"Promote a sketch to the next studio workflow stage — fork, upscale canvas, update compositionLevel, and add to series\",\n {\n sketchId: z.string().describe(\"ID of the sketch to promote\"),\n toStage: z\n .enum([\"studies\", \"drafts\", \"refinements\", \"finals\"])\n .describe(\"Target stage to promote to\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series to add the promoted sketch to\"),\n newId: z\n .string()\n .optional()\n .describe(\n \"URL-safe kebab-case ID for the promoted sketch (default: auto-generated)\",\n ),\n title: z\n .string()\n .optional()\n .describe(\"Title for the promoted sketch (default: auto-generated)\"),\n agent: z\n .string()\n .optional()\n .describe(\"CLI agent name\"),\n model: z\n .string()\n .optional()\n .describe(\"AI model identifier\"),\n },\n async (args) => {\n try {\n const result = await promoteSketch(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// Reference Tools\n// ---------------------------------------------------------------------------\n\nfunction registerReferenceTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"add_reference\",\n \"Import an image as a reference for inspiration. Copies the image to the workspace references/ directory and attaches it to a series or sketch.\",\n {\n image: z.string().describe(\"Path to the reference image file\"),\n type: z\n .enum([\"image\", \"artwork\", \"photograph\", \"texture\", \"palette\"])\n .optional()\n .describe(\"Reference type (default: image)\"),\n source: z\n .string()\n .optional()\n .describe(\"Source attribution (artist, URL, collection)\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series to attach the reference to\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch to attach the reference to\"),\n id: z\n .string()\n .optional()\n .describe(\"Custom reference ID (default: derived from filename)\"),\n },\n async (args) => {\n try {\n const result = await addReference(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 \"analyze_reference\",\n \"Return a structured analysis framework for a reference image, with the image for visual inspection. The agent fills in the analysis using the framework prompts.\",\n {\n referenceId: z.string().describe(\"ID of the reference to analyze\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to (speeds up lookup)\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to (speeds up lookup)\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for preview image (default: native)\"),\n },\n async (args) => {\n try {\n const result = await analyzeReference(state, args);\n const content: Array<\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n > = [\n { type: \"text\", text: JSON.stringify(result.metadata, null, 2) },\n ];\n if (result.previewJpegBase64) {\n const ext = (result.metadata[\"path\"] as string ?? \".png\").split(\".\").pop() ?? \"png\";\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n content.push({\n type: \"image\",\n data: result.previewJpegBase64,\n mimeType: mimeMap[ext] ?? \"image/png\",\n });\n }\n return { content };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"update_reference_analysis\",\n \"Save a structured analysis (composition, palette, rhythm, mood, technique) back to a reference after studying it with analyze_reference.\",\n {\n referenceId: z.string().describe(\"ID of the reference to update\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to\"),\n analysis: z.object({\n composition: z.string().optional().describe(\"Compositional structure observations\"),\n palette: z.array(z.string()).optional().describe(\"Dominant colors as hex values\"),\n rhythm: z.string().optional().describe(\"Visual rhythm and pattern observations\"),\n mood: z.string().optional().describe(\"Mood and emotional qualities\"),\n technique: z.string().optional().describe(\"Technique and medium observations\"),\n keyQualities: z.array(z.string()).optional().describe(\"Key qualities worth studying\"),\n }).describe(\"Structured analysis to save\"),\n },\n async (args) => {\n try {\n const result = await updateReferenceAnalysis(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 \"extract_palette\",\n \"Return a reference image for color palette extraction, with guidelines for identifying dominant colors. The agent extracts hex colors visually.\",\n {\n referenceId: z.string().describe(\"ID of the reference to extract palette from\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to\"),\n count: z\n .number()\n .optional()\n .describe(\"Number of colors to extract (default: 6)\"),\n },\n async (args) => {\n try {\n const result = await extractPalette(state, args);\n const content: Array<\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n > = [\n { type: \"text\", text: JSON.stringify(result.metadata, null, 2) },\n ];\n if (result.previewJpegBase64) {\n const ext = (result.metadata[\"path\"] as string ?? \".png\").split(\".\").pop() ?? \"png\";\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n content.push({\n type: \"image\",\n data: result.previewJpegBase64,\n mimeType: mimeMap[ext] ?? \"image/png\",\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\", \"process\", \"painting\", \"illustration\", \"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 server.tool(\n \"suggest_skills\",\n \"Recommend relevant design skills based on sketch context and/or free-text description\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"ID of a loaded sketch to analyze for skill recommendations\"),\n context: z\n .string()\n .optional()\n .describe(\"Free-text description of what you're working on (e.g., 'atmospheric landscape with watercolor')\"),\n },\n async (args) => {\n try {\n const result = await suggestSkills(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 * 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 capture?: boolean;\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 // Build lineage from parent\n const sourceGeneration = sourceDef.lineage?.generation ?? 1;\n const lineage = {\n parentId: input.sourceId,\n parentTitle: sourceDef.title,\n generation: sourceGeneration + 1,\n };\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 ...(sourceDef.compositionLevel ? { compositionLevel: sourceDef.compositionLevel } : {}),\n lineage,\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 // Build lineage with blend sources\n const maxGeneration = Math.max(\n ...sources.map((s) => s.lineage?.generation ?? 1),\n );\n const lineage = {\n blendSources: input.sourceIds,\n generation: maxGeneration + 1,\n };\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 lineage,\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, suggest_skills\n */\n\nimport { createDefaultSkillRegistry } from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\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 painting: \"painting\",\n watercolor: \"painting\",\n ink: \"illustration\",\n illustration: \"illustration\",\n \"mixed-media\": \"illustration\",\n \"mixed media\": \"illustration\",\n process: \"process\",\n layering: \"process\",\n \"mark-making\": \"process\",\n refinement: \"process\",\n constraints: \"process\",\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, painting, illustration, process, 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// ---------------------------------------------------------------------------\n// suggest_skills\n// ---------------------------------------------------------------------------\n\nexport interface SuggestSkillsInput {\n sketchId?: string;\n context?: string;\n}\n\n/** Keyword-to-skill relevance mapping for context-based suggestions. */\nconst CONTEXT_KEYWORDS: Record<string, readonly string[]> = {\n // Composition keywords\n layout: [\"golden-ratio\", \"rule-of-thirds\", \"visual-weight\", \"gestalt-grouping\"],\n balance: [\"visual-weight\", \"golden-ratio\", \"rule-of-thirds\"],\n grid: [\"rule-of-thirds\", \"gestalt-grouping\", \"rhythm-movement\"],\n flow: [\"rhythm-movement\", \"gestalt-grouping\"],\n movement: [\"rhythm-movement\", \"mark-making\"],\n rhythm: [\"rhythm-movement\", \"mark-making\"],\n focal: [\"rule-of-thirds\", \"visual-weight\", \"figure-ground\"],\n negative: [\"figure-ground\", \"visual-weight\"],\n space: [\"figure-ground\", \"visual-weight\", \"atmospheric-depth\"],\n // Color keywords\n palette: [\"color-harmony\", \"palette-generation\", \"color-mixing-strategy\"],\n color: [\"color-harmony\", \"color-temperature\", \"itten-contrasts\", \"color-mixing-strategy\"],\n warm: [\"color-temperature\", \"atmospheric-depth\"],\n cool: [\"color-temperature\", \"atmospheric-depth\"],\n contrast: [\"simultaneous-contrast\", \"itten-contrasts\", \"value-structure\"],\n value: [\"value-structure\", \"itten-contrasts\", \"layering-strategy\"],\n gray: [\"color-mixing-strategy\", \"value-structure\"],\n // Painting keywords\n watercolor: [\"watercolor-techniques\", \"layering-strategy\", \"material-behavior\"],\n ink: [\"ink-illustration\", \"mark-making\", \"material-behavior\"],\n oil: [\"painting-foundations\", \"layering-strategy\", \"material-behavior\"],\n charcoal: [\"material-behavior\", \"mark-making\"],\n brush: [\"mark-making\", \"material-behavior\"],\n layer: [\"layering-strategy\", \"mixed-media-workflow\", \"iterative-refinement\"],\n texture: [\"material-behavior\", \"mark-making\"],\n // Process keywords\n study: [\"thumbnail-studies\", \"creative-constraints\", \"iterative-refinement\"],\n thumbnail: [\"thumbnail-studies\", \"creative-constraints\"],\n refine: [\"iterative-refinement\", \"layering-strategy\"],\n iterate: [\"iterative-refinement\", \"thumbnail-studies\"],\n depth: [\"atmospheric-depth\", \"color-temperature\", \"value-structure\"],\n atmosphere: [\"atmospheric-depth\", \"color-temperature\"],\n perspective: [\"atmospheric-depth\"],\n constraint: [\"creative-constraints\"],\n limit: [\"creative-constraints\", \"color-mixing-strategy\"],\n hatch: [\"mark-making\", \"ink-illustration\"],\n stipple: [\"mark-making\"],\n gestural: [\"mark-making\", \"iterative-refinement\"],\n mix: [\"color-mixing-strategy\", \"mixed-media-workflow\"],\n glaze: [\"layering-strategy\", \"material-behavior\"],\n};\n\nexport async function suggestSkills(\n state: EditorState,\n input: SuggestSkillsInput,\n): Promise<Record<string, unknown>> {\n const allSkills = registry.list();\n const scored = new Map<string, { score: number; reasons: string[] }>();\n\n // Initialize all skills with base score\n for (const skill of allSkills) {\n scored.set(skill.id, { score: 0, reasons: [] });\n }\n\n // Score based on sketch context if a sketch is provided\n if (input.sketchId) {\n const loaded = state.getSketch(input.sketchId);\n if (loaded) {\n const sketch = loaded.definition;\n\n // Boost skills not already used by the sketch\n const usedSkills = new Set(sketch.skills ?? []);\n for (const skill of allSkills) {\n if (!usedSkills.has(skill.id)) {\n const entry = scored.get(skill.id)!;\n entry.score += 1;\n entry.reasons.push(\"not yet used in this sketch\");\n }\n }\n\n // Boost process skills based on compositionLevel\n const level = sketch.compositionLevel;\n if (level) {\n const levelSkills: Record<string, string[]> = {\n study: [\"thumbnail-studies\", \"creative-constraints\", \"iterative-refinement\"],\n sketch: [\"iterative-refinement\", \"mark-making\", \"layering-strategy\", \"color-mixing-strategy\"],\n developed: [\"layering-strategy\", \"material-behavior\", \"atmospheric-depth\", \"color-mixing-strategy\"],\n exhibition: [\"layering-strategy\", \"material-behavior\", \"atmospheric-depth\", \"iterative-refinement\", \"mark-making\"],\n };\n for (const id of levelSkills[level] ?? []) {\n const entry = scored.get(id);\n if (entry) {\n entry.score += 3;\n entry.reasons.push(`recommended for ${level}-level work`);\n }\n }\n }\n\n // Boost based on existing layers (painting-related skills)\n if (sketch.layers && sketch.layers.length > 0) {\n const layerTypes = sketch.layers.map((l) => l.type);\n if (layerTypes.some((t) => t.startsWith(\"painting:\"))) {\n for (const id of [\"layering-strategy\", \"material-behavior\", \"iterative-refinement\"]) {\n const entry = scored.get(id);\n if (entry) {\n entry.score += 2;\n entry.reasons.push(\"sketch uses painting layers\");\n }\n }\n }\n }\n }\n }\n\n // Score based on free-text context\n if (input.context) {\n const words = input.context.toLowerCase().split(/\\W+/);\n for (const word of words) {\n const matched = CONTEXT_KEYWORDS[word];\n if (matched) {\n for (const skillId of matched) {\n const entry = scored.get(skillId);\n if (entry) {\n entry.score += 2;\n if (!entry.reasons.includes(`matches context keyword \"${word}\"`)) {\n entry.reasons.push(`matches context keyword \"${word}\"`);\n }\n }\n }\n }\n }\n }\n\n // If no context clues at all, boost process skills as general recommendations\n if (!input.sketchId && !input.context) {\n for (const skill of allSkills) {\n if (skill.category === \"process\") {\n const entry = scored.get(skill.id)!;\n entry.score += 2;\n entry.reasons.push(\"process knowledge is broadly applicable\");\n }\n }\n }\n\n // Sort by score descending, take top 5\n const ranked = allSkills\n .map((skill) => ({\n id: skill.id,\n name: skill.name,\n category: skill.category,\n complexity: skill.complexity,\n description: skill.description,\n relevanceScore: scored.get(skill.id)!.score,\n rationale: scored.get(skill.id)!.reasons,\n }))\n .filter((s) => s.relevanceScore > 0)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n .slice(0, 5);\n\n return {\n success: true,\n suggestions: ranked,\n total: ranked.length,\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 { mkdir, writeFile } from \"fs/promises\";\nimport { dirname, join } from \"path\";\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 snapshot PNG path: <workspace-dir>/snapshots/<sketchId>-<seed>-preview.png */\nfunction deriveSnapshotPath(\n sketchPath: string,\n sketchId: string,\n seed: number,\n): string {\n const wsDir = dirname(sketchPath);\n return join(wsDir, \"snapshots\", `${sketchId}-${seed}-preview.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 effectiveSeed = input.seed ?? sketch.state.seed;\n const previewPath = deriveSnapshotPath(loaded.path, sketchId, effectiveSeed);\n const metadata = await buildScreenshotMetadata(state, multi, {\n target,\n sketchId,\n seed: effectiveSeed,\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: ensure snapshots/ directory exists, then write preview PNG\n await mkdir(dirname(info.previewPath), { recursive: true });\n await writeFile(info.previewPath, multi.previewPng);\n metadata.savedPreviewTo = info.previewPath;\n metadata.previewWritten = true;\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 effectiveSeed = input.seed ?? sketch.state.seed;\n const previewPath = deriveSnapshotPath(loaded.path, id, effectiveSeed);\n const itemMetadata = await buildScreenshotMetadata(state, multi, {\n target: \"sketch\",\n sketchId: id,\n seed: effectiveSeed,\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\nimport puppeteer from \"puppeteer\";\n\ntype Browser = Awaited<ReturnType<typeof puppeteer.launch>>;\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 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 * Critique tools — Phase 2: Perception & Self-Critique (ADR 053).\n * critique_sketch, compare_sketches\n *\n * Each tool captures a screenshot and returns a structured critique framework\n * (questions, principles, pitfalls) per aspect. Critique severity calibrates\n * to the sketch's compositionLevel.\n */\n\nimport { createDefaultSkillRegistry } from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\nimport { captureScreenshot, captureBatch, type CaptureScreenshotResult, type BatchItemResult } from \"./capture.js\";\n\nconst registry = createDefaultSkillRegistry();\n\n// ---------------------------------------------------------------------------\n// Aspect definitions\n// ---------------------------------------------------------------------------\n\n/** Aspects the agent can self-critique. */\nexport type CritiqueAspect =\n | \"composition\"\n | \"color\"\n | \"rhythm\"\n | \"unity\"\n | \"expression\";\n\nexport const ALL_ASPECTS: readonly CritiqueAspect[] = [\n \"composition\",\n \"color\",\n \"rhythm\",\n \"unity\",\n \"expression\",\n];\n\n/** Per-aspect framework: questions to ask, principles to check, pitfalls to watch for. */\ninterface AspectFramework {\n aspect: CritiqueAspect;\n questions: string[];\n principles: string[];\n pitfalls: string[];\n}\n\n/** Composition level type (matches @genart-dev/format CompositionLevel). */\ntype CompositionLevel = \"study\" | \"sketch\" | \"developed\" | \"exhibition\";\n\n/** Severity calibration per composition level. */\ninterface SeverityCalibration {\n level: CompositionLevel;\n description: string;\n focus: string;\n tolerance: string;\n}\n\nconst SEVERITY: Record<string, SeverityCalibration> = {\n study: {\n level: \"study\",\n description: \"Fast, exploratory — value the energy of discovery over polish\",\n focus: \"Is the core idea visible? Does the sketch capture a single insight?\",\n tolerance: \"High tolerance for roughness, imbalance, and incomplete resolution. Studies should feel alive, not finished.\",\n },\n sketch: {\n level: \"sketch\",\n description: \"Intentional but rough — the idea should read clearly\",\n focus: \"Do composition and color serve the concept? Are parameters well-chosen?\",\n tolerance: \"Moderate tolerance. Unresolved edges and raw marks are fine, but the structure should be deliberate.\",\n },\n developed: {\n level: \"developed\",\n description: \"Refined — every major decision should be justified\",\n focus: \"Do all elements work together? Is there a clear visual hierarchy? Does the palette feel cohesive?\",\n tolerance: \"Low tolerance for accidental imbalance. Rough areas should be intentional, not neglected.\",\n },\n exhibition: {\n level: \"exhibition\",\n description: \"Polished — every element earns its place\",\n focus: \"Could you defend every choice? Does the piece hold up under sustained viewing? Is the concept fully realized?\",\n tolerance: \"Minimal tolerance. Each mark, color, and spatial relationship should feel inevitable.\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Aspect framework builders\n// ---------------------------------------------------------------------------\n\nfunction buildCompositionFramework(): AspectFramework {\n return {\n aspect: \"composition\",\n questions: [\n \"Where does the eye land first? Is that the intended focal point?\",\n \"Is there a clear visual hierarchy (primary, secondary, tertiary)?\",\n \"How does the composition use the edges and corners of the canvas?\",\n \"Is negative space working actively or is it leftover?\",\n \"Does the arrangement feel balanced or intentionally unbalanced?\",\n ],\n principles: [\n \"Visual weight distribution — dense, dark, saturated, or detailed areas carry more weight\",\n \"Entry points and eye paths — the viewer needs a way in and a journey through the piece\",\n \"Edge tension — elements near canvas edges create tension; use this deliberately\",\n \"Rule of thirds / golden ratio — useful starting points, not rigid rules\",\n \"Figure-ground clarity — the relationship between positive and negative space\",\n ],\n pitfalls: [\n \"Centering everything — creates static compositions unless intentionally symmetrical\",\n \"Filling the canvas uniformly — denies the viewer rest areas and focal emphasis\",\n \"Tangent lines — elements barely touching edges or each other create visual discomfort\",\n \"Competing focal points — multiple areas of equal emphasis confuse the eye\",\n \"Ignoring the canvas aspect ratio — composition should respond to the format\",\n ],\n };\n}\n\nfunction buildColorFramework(): AspectFramework {\n return {\n aspect: \"color\",\n questions: [\n \"Does the palette feel intentional or arbitrary?\",\n \"Is there a dominant color temperature (warm/cool) or a deliberate tension between them?\",\n \"How many distinct hues are active? Is that number serving the concept?\",\n \"Are value contrasts (light/dark) creating readable structure?\",\n \"Do any colors feel out of place — or is dissonance intentional?\",\n ],\n principles: [\n \"Color harmony — analogous, complementary, triadic, or split-complementary relationships\",\n \"Value structure — squint at the piece; the composition should read in grayscale\",\n \"Temperature as depth — warm advances, cool recedes (atmospheric perspective)\",\n \"Saturation as emphasis — high saturation draws the eye; use it sparingly for focus\",\n \"Color proportion — unequal amounts create interest (e.g., 60-30-10 ratio)\",\n ],\n pitfalls: [\n \"Too many fully saturated colors competing for attention\",\n \"No value range — all mid-tones flatten the piece\",\n \"Random color assignment — palette should derive from concept, not just randomness\",\n \"Ignoring simultaneous contrast — adjacent colors alter each other's appearance\",\n \"Uniform opacity everywhere — varying transparency adds depth and atmosphere\",\n ],\n };\n}\n\nfunction buildRhythmFramework(): AspectFramework {\n return {\n aspect: \"rhythm\",\n questions: [\n \"Is there a repeating visual motif or interval?\",\n \"Does the rhythm accelerate, decelerate, or remain steady?\",\n \"Are there moments of syncopation — unexpected breaks in the pattern?\",\n \"Does the rhythm contribute to or fight against the composition?\",\n \"Is there scale variation — does the motif appear at multiple sizes?\",\n ],\n principles: [\n \"Regular rhythm creates calm and order; irregular rhythm creates energy\",\n \"Progressive rhythm (gradual change) creates movement and depth\",\n \"Alternating rhythm adds complexity without chaos\",\n \"Rhythm at multiple scales (fractal repetition) creates richness\",\n \"Silence (empty intervals) is as important as sound (marked intervals)\",\n ],\n pitfalls: [\n \"Perfectly regular grids without variation feel mechanical, not generative\",\n \"Random distribution reads as noise, not rhythm\",\n \"Single-scale repetition feels monotonous — vary size, spacing, or density\",\n \"Rhythm that ignores the composition's focal structure\",\n \"Over-complexity — too many overlapping rhythms create visual noise\",\n ],\n };\n}\n\nfunction buildUnityFramework(): AspectFramework {\n return {\n aspect: \"unity\",\n questions: [\n \"Does the piece feel like one cohesive work or disconnected parts?\",\n \"Is there a unifying visual language (consistent mark quality, shape vocabulary)?\",\n \"Do the parameters work together or do some feel bolted on?\",\n \"Would removing any element weaken the whole?\",\n \"Does the algorithm express a single clear idea?\",\n ],\n principles: [\n \"Unity through repetition — shared elements tie the composition together\",\n \"Unity through proximity — grouped elements feel related\",\n \"Unity through continuation — aligned elements create visual connections\",\n \"Variety within unity — enough variation to hold interest, enough consistency to cohere\",\n \"Conceptual unity — all visual decisions serve the stated philosophy\",\n ],\n pitfalls: [\n \"Feature accumulation — adding elements that don't serve the core concept\",\n \"Inconsistent mark quality — mixing precise geometry with organic marks without intention\",\n \"Disconnected color and form — palette that doesn't relate to the spatial structure\",\n \"Parameter sprawl — too many controls that don't interact meaningfully\",\n \"Style mixing without integration — combining techniques that don't speak to each other\",\n ],\n };\n}\n\nfunction buildExpressionFramework(): AspectFramework {\n return {\n aspect: \"expression\",\n questions: [\n \"What mood or feeling does this piece evoke?\",\n \"Is the generative process visible in the output? Should it be?\",\n \"Does the algorithm's logic contribute to the emotional quality?\",\n \"Is there a sense of the unexpected — does the piece surprise even its creator?\",\n \"Does the philosophy statement match the visual experience?\",\n ],\n principles: [\n \"Generative art is a conversation between intention and emergence\",\n \"The algorithm is a medium — its constraints and affordances shape expression\",\n \"Controlled randomness creates life; pure randomness creates noise\",\n \"The seed is a collaborator — different seeds should produce meaningfully different moods\",\n \"Process and result are both the artwork — the code embodies artistic decisions\",\n ],\n pitfalls: [\n \"Over-control — leaving no room for generative surprise\",\n \"Under-control — no discernible artistic intention behind the randomness\",\n \"Technique as end — impressive code that produces emotionally flat output\",\n \"Derivative work — reproducing established generative art tropes without adding perspective\",\n \"Mismatched intent — the philosophy says one thing but the visual says another\",\n ],\n };\n}\n\nconst ASPECT_BUILDERS: Record<CritiqueAspect, () => AspectFramework> = {\n composition: buildCompositionFramework,\n color: buildColorFramework,\n rhythm: buildRhythmFramework,\n unity: buildUnityFramework,\n expression: buildExpressionFramework,\n};\n\n// ---------------------------------------------------------------------------\n// critique_sketch\n// ---------------------------------------------------------------------------\n\nexport interface CritiqueSketchInput {\n sketchId?: string;\n aspects?: CritiqueAspect[];\n previewSize?: number;\n}\n\nexport interface CritiqueSketchResult {\n /** JSON-safe critique framework for the text content block. */\n metadata: Record<string, unknown>;\n /** Small JPEG as base64 for MCP image content block. */\n previewJpegBase64: string;\n}\n\nexport async function critiqueSketch(\n state: EditorState,\n input: CritiqueSketchInput,\n): Promise<CritiqueSketchResult> {\n state.requireWorkspace();\n\n // Resolve sketch ID\n let sketchId: string;\n if (input.sketchId) {\n sketchId = input.sketchId;\n } else if (state.selection.size > 0) {\n sketchId = [...state.selection][0]!;\n } else {\n throw new Error(\"No sketch specified and nothing selected\");\n }\n\n const loaded = state.requireSketch(sketchId);\n const sketch = loaded.definition;\n\n // Capture screenshot for visual analysis\n const capture: CaptureScreenshotResult = await captureScreenshot(state, {\n target: \"sketch\",\n sketchId,\n previewSize: input.previewSize ?? 400,\n });\n\n // Determine which aspects to critique\n const aspects = input.aspects ?? [...ALL_ASPECTS];\n\n // Build frameworks\n const frameworks = aspects.map((a) => ASPECT_BUILDERS[a]());\n\n // Determine severity calibration\n const level = sketch.compositionLevel ?? \"sketch\";\n const severity = SEVERITY[level] ?? SEVERITY[\"sketch\"]!;\n\n // Gather relevant skills as context\n const relevantSkills = gatherRelevantSkills(aspects);\n\n const metadata: Record<string, unknown> = {\n success: true,\n sketchId,\n title: sketch.title,\n compositionLevel: level,\n philosophy: sketch.philosophy ?? null,\n severity: {\n level: severity.level,\n description: severity.description,\n focus: severity.focus,\n tolerance: severity.tolerance,\n },\n frameworks,\n relevantSkills,\n instructions: [\n \"Use the image above and the frameworks below to perform a structured self-critique.\",\n `Calibrate your critique to the ${severity.level} level: ${severity.description}`,\n \"For each aspect, answer the questions, check the principles, and watch for the pitfalls.\",\n \"Be honest but constructive — identify what works as well as what could improve.\",\n \"End with 2-3 specific, actionable improvements ranked by impact.\",\n ],\n };\n\n return {\n metadata,\n previewJpegBase64: capture.previewJpegBase64,\n };\n}\n\n// ---------------------------------------------------------------------------\n// compare_sketches\n// ---------------------------------------------------------------------------\n\nexport interface CompareSketchesInput {\n sketchIds: string[];\n aspects?: CritiqueAspect[];\n previewSize?: number;\n}\n\nexport interface CompareSketchesResult {\n /** JSON-safe comparison framework. */\n metadata: Record<string, unknown>;\n /** Per-sketch inline JPEG base64 strings. */\n previews: Array<{ sketchId: string; inlineJpegBase64: string }>;\n}\n\nexport async function compareSketches(\n state: EditorState,\n input: CompareSketchesInput,\n): Promise<CompareSketchesResult> {\n state.requireWorkspace();\n\n const ids = input.sketchIds;\n if (ids.length < 2) {\n throw new Error(\"compare_sketches requires at least 2 sketch IDs\");\n }\n if (ids.length > 4) {\n throw new Error(\"compare_sketches supports a maximum of 4 sketches\");\n }\n\n // Validate all sketches exist\n const sketchInfos = ids.map((id) => {\n const loaded = state.requireSketch(id);\n return {\n id,\n title: loaded.definition.title,\n compositionLevel: loaded.definition.compositionLevel ?? \"sketch\",\n philosophy: loaded.definition.philosophy ?? null,\n renderer: loaded.definition.renderer.type,\n seed: loaded.definition.state.seed,\n };\n });\n\n // Batch capture all sketches\n const batchResult = await captureBatch(state, {\n sketchIds: ids,\n previewSize: input.previewSize ?? 300,\n });\n\n // Build previews array matched by sketch ID\n const previews = batchResult.items.map((item: BatchItemResult) => ({\n sketchId: (item.metadata as Record<string, unknown>)[\"sketchId\"] as string,\n inlineJpegBase64: item.inlineJpegBase64,\n }));\n\n // Determine aspects\n const aspects = input.aspects ?? [...ALL_ASPECTS];\n const frameworks = aspects.map((a) => ASPECT_BUILDERS[a]());\n\n // Build comparison-specific questions per aspect\n const comparisonQuestions = aspects.map((aspect) => ({\n aspect,\n questions: buildComparisonQuestions(aspect, sketchInfos.length),\n }));\n\n const metadata: Record<string, unknown> = {\n success: true,\n sketches: sketchInfos,\n aspects,\n frameworks,\n comparisonQuestions,\n instructions: [\n `Compare the ${ids.length} sketches shown above across the specified aspects.`,\n \"For each aspect, use the framework questions and comparison questions to analyze differences.\",\n \"Identify which sketch handles each aspect most effectively and why.\",\n \"Note where sketches complement each other — techniques from one could improve another.\",\n \"End with a ranking per aspect and overall, with specific observations justifying each placement.\",\n ],\n };\n\n return { metadata, previews };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Build comparison-specific questions for an aspect. */\nfunction buildComparisonQuestions(\n aspect: CritiqueAspect,\n count: number,\n): string[] {\n const base: Record<CritiqueAspect, string[]> = {\n composition: [\n \"Which sketch has the strongest focal point?\",\n \"How do the compositions differ in their use of space?\",\n \"Which creates the most effective visual hierarchy?\",\n ],\n color: [\n \"Which palette feels most intentional?\",\n \"How do the value ranges compare — which has the strongest lights and darks?\",\n \"Which color temperature creates the most effective mood?\",\n ],\n rhythm: [\n \"Which sketch has the most engaging visual rhythm?\",\n \"How do the rhythmic structures differ — regular vs progressive vs irregular?\",\n \"Which achieves the best balance of repetition and variation?\",\n ],\n unity: [\n \"Which sketch feels most cohesive as a single work?\",\n \"Where does unity break down in each — what elements feel disconnected?\",\n \"Which has the tightest relationship between concept and execution?\",\n ],\n expression: [\n \"Which sketch evokes the strongest emotional response?\",\n \"How does each sketch's generative process contribute to its expression?\",\n \"Which most successfully balances intention with emergence?\",\n ],\n };\n\n const questions = [...base[aspect]];\n if (count > 2) {\n questions.push(\n `Could elements from different sketches be combined to create something stronger?`,\n );\n }\n return questions;\n}\n\n/** Gather skill summaries relevant to the requested aspects. */\nfunction gatherRelevantSkills(\n aspects: CritiqueAspect[],\n): Array<{ id: string; name: string; relevantTo: CritiqueAspect }> {\n const aspectToCategory: Record<CritiqueAspect, string[]> = {\n composition: [\"composition\"],\n color: [\"color\"],\n rhythm: [\"composition\"],\n unity: [\"composition\", \"color\"],\n expression: [\"process\"],\n };\n\n const seen = new Set<string>();\n const result: Array<{ id: string; name: string; relevantTo: CritiqueAspect }> = [];\n\n for (const aspect of aspects) {\n const categories = aspectToCategory[aspect];\n for (const cat of categories) {\n const skills = registry.list(cat);\n for (const skill of skills) {\n if (!seen.has(skill.id)) {\n seen.add(skill.id);\n result.push({ id: skill.id, name: skill.name, relevantTo: aspect });\n }\n }\n }\n }\n\n return result;\n}\n","/**\n * Series & conceptual development tools — Phase 3 (ADRs 054, 056).\n * create_series, develop_concept, series_summary, promote_sketch\n */\n\nimport { writeFile } from \"fs/promises\";\nimport { basename, dirname, resolve } from \"path\";\nimport {\n serializeGenart,\n serializeWorkspace,\n type CompositionLevel,\n type SeriesStage,\n type SketchDefinition,\n type WorkspaceSeries,\n} from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\nimport { captureBatch, type BatchItemResult } from \"./capture.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\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\nconst VALID_STAGES: readonly SeriesStage[] = [\n \"studies\",\n \"drafts\",\n \"refinements\",\n \"finals\",\n];\n\n/** Map from stage to recommended compositionLevel. */\nconst STAGE_TO_LEVEL: Record<SeriesStage, CompositionLevel> = {\n studies: \"study\",\n drafts: \"sketch\",\n refinements: \"developed\",\n finals: \"exhibition\",\n};\n\n/** Map from compositionLevel to recommended next stage. */\nconst LEVEL_TO_NEXT_STAGE: Record<CompositionLevel, SeriesStage | null> = {\n study: \"drafts\",\n sketch: \"refinements\",\n developed: \"finals\",\n exhibition: null,\n};\n\n/** Canvas scale factor per compositionLevel. */\nconst LEVEL_SCALE: Record<CompositionLevel, number> = {\n study: 1,\n sketch: 1,\n developed: 1.5,\n exhibition: 2,\n};\n\n// ---------------------------------------------------------------------------\n// create_series\n// ---------------------------------------------------------------------------\n\nexport interface CreateSeriesInput {\n label: string;\n narrative: string;\n intent: string;\n progression?: string;\n stages?: SeriesStage[];\n sketchFiles?: string[];\n}\n\nexport async function createSeries(\n state: EditorState,\n input: CreateSeriesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n // Generate a kebab-case ID from the label\n const id = input.label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (!id) {\n throw new Error(\"Could not derive a valid ID from the label\");\n }\n\n // Check for duplicate series ID\n if (ws.series?.some((s) => s.id === id)) {\n throw new Error(`Series with ID '${id}' already exists in workspace`);\n }\n\n const stages = input.stages ?? [...VALID_STAGES];\n\n // Validate stages\n for (const stage of stages) {\n if (!VALID_STAGES.includes(stage)) {\n throw new Error(\n `Invalid stage: '${stage}'. Valid stages: ${VALID_STAGES.join(\", \")}`,\n );\n }\n }\n\n // Validate sketch files exist in workspace\n const sketchFiles = input.sketchFiles ?? [];\n for (const file of sketchFiles) {\n const found = ws.sketches.some((s) => s.file === file);\n if (!found) {\n throw new Error(\n `Sketch file '${file}' not found in workspace`,\n );\n }\n }\n\n const series: WorkspaceSeries = {\n id,\n label: input.label,\n narrative: input.narrative,\n intent: input.intent,\n ...(input.progression ? { progression: input.progression } : {}),\n stages,\n sketchFiles,\n };\n\n // Update workspace\n state.workspace = {\n ...ws,\n modified: now(),\n series: [...(ws.series ?? []), series],\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(\"workspace:updated\", { seriesAdded: id });\n\n return {\n success: true,\n series: {\n id,\n label: input.label,\n narrative: input.narrative,\n intent: input.intent,\n stages,\n sketchCount: sketchFiles.length,\n },\n workspaceContent: workspaceJson,\n };\n}\n\n// ---------------------------------------------------------------------------\n// develop_concept\n// ---------------------------------------------------------------------------\n\nexport interface DevelopConceptInput {\n concept: string;\n medium?: string;\n}\n\nexport async function developConcept(\n _state: EditorState,\n input: DevelopConceptInput,\n): Promise<Record<string, unknown>> {\n // This tool returns a structured concept plan for the agent to execute.\n // It doesn't modify state — it provides a framework for creative development.\n\n const medium = input.medium ?? \"p5\";\n\n return {\n success: true,\n conceptPlan: {\n concept: input.concept,\n medium,\n mood: {\n instruction: \"Define the emotional quality this concept should evoke.\",\n prompts: [\n \"What feeling should the viewer experience?\",\n \"Is this contemplative, energetic, unsettling, serene?\",\n \"What time of day, season, or environment does this concept suggest?\",\n ],\n },\n palette: {\n instruction: \"Design a color strategy that serves the mood.\",\n prompts: [\n \"What color temperature dominates (warm/cool)?\",\n \"How many distinct hues are needed?\",\n \"Should saturation be high (bold, graphic) or low (subtle, atmospheric)?\",\n \"What value range (light-to-dark contrast) supports the concept?\",\n ],\n },\n composition: {\n instruction: \"Plan the spatial structure.\",\n prompts: [\n \"Where should the viewer's eye land first?\",\n \"Is the composition centered, asymmetric, or edge-driven?\",\n \"How does negative space contribute to the concept?\",\n \"What rhythm (regular, progressive, chaotic) serves the idea?\",\n ],\n },\n skills: {\n instruction: \"Identify design skills to load for this concept.\",\n prompts: [\n \"Which composition skill applies (rule-of-thirds, golden-ratio, gestalt)?\",\n \"Which color skill applies (color-harmony, color-temperature, simultaneous-contrast)?\",\n \"Are there process skills needed (layering-strategy, iterative-refinement, thumbnail-studies)?\",\n \"Consider using `suggest_skills` with the concept as context.\",\n ],\n },\n seriesStructure: {\n instruction: \"Plan the body of work.\",\n prompts: [\n \"How many studies should explore the core idea (3-6 recommended)?\",\n \"What aspect varies between studies (color, density, rhythm, scale)?\",\n \"Which studies should be developed further into drafts?\",\n \"What progression tells the most compelling story?\",\n ],\n recommendedStages: [\"studies\", \"drafts\", \"refinements\", \"finals\"],\n },\n },\n nextSteps: [\n \"1. Use `create_series` with a label, narrative, and intent derived from this plan.\",\n \"2. Create 3-6 study-level sketches using `create_sketch` with compositionLevel: 'study'.\",\n \"3. Use `critique_sketch` on each study to evaluate against the concept.\",\n \"4. Use `promote_sketch` to advance the best studies to drafts.\",\n \"5. Iterate: critique → refine → promote through stages.\",\n \"6. Use `series_summary` to capture the full progression.\",\n ],\n };\n}\n\n// ---------------------------------------------------------------------------\n// series_summary\n// ---------------------------------------------------------------------------\n\nexport interface SeriesSummaryInput {\n seriesId: string;\n captureScreenshots?: boolean;\n previewSize?: number;\n}\n\nexport interface SeriesSummaryResult {\n metadata: Record<string, unknown>;\n previews?: Array<{ sketchId: string; inlineJpegBase64: string }>;\n}\n\nexport async function seriesSummary(\n state: EditorState,\n input: SeriesSummaryInput,\n): Promise<SeriesSummaryResult> {\n const ws = state.requireWorkspace();\n\n const series = ws.series?.find((s) => s.id === input.seriesId);\n if (!series) {\n throw new Error(`Series '${input.seriesId}' not found in workspace`);\n }\n\n // Gather sketch info for each file in the series\n const sketchInfos: Array<Record<string, unknown>> = [];\n const loadedIds: string[] = [];\n\n for (const file of series.sketchFiles) {\n // Find the sketch by file name\n let found = false;\n for (const [id, loaded] of state.sketches) {\n if (basename(loaded.path) === file) {\n const def = loaded.definition;\n sketchInfos.push({\n id,\n title: def.title,\n file,\n compositionLevel: def.compositionLevel ?? \"sketch\",\n lineage: def.lineage ?? null,\n renderer: def.renderer.type,\n canvas: `${def.canvas.width}x${def.canvas.height}`,\n seed: def.state.seed,\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n philosophy: def.philosophy ?? null,\n });\n loadedIds.push(id);\n found = true;\n break;\n }\n }\n if (!found) {\n sketchInfos.push({ file, status: \"not loaded\" });\n }\n }\n\n // Optionally capture screenshots\n let previews: Array<{ sketchId: string; inlineJpegBase64: string }> | undefined;\n if (input.captureScreenshots !== false && loadedIds.length > 0) {\n const batchResult = await captureBatch(state, {\n sketchIds: loadedIds,\n previewSize: input.previewSize ?? 300,\n });\n previews = batchResult.items.map((item: BatchItemResult) => ({\n sketchId: (item.metadata as Record<string, unknown>)[\"sketchId\"] as string,\n inlineJpegBase64: item.inlineJpegBase64,\n }));\n }\n\n const metadata: Record<string, unknown> = {\n success: true,\n series: {\n id: series.id,\n label: series.label,\n narrative: series.narrative,\n intent: series.intent,\n progression: series.progression ?? null,\n stages: series.stages ?? null,\n },\n sketches: sketchInfos,\n summary: {\n totalSketches: series.sketchFiles.length,\n loadedSketches: loadedIds.length,\n compositionLevels: countBy(\n sketchInfos\n .filter((s) => s[\"compositionLevel\"])\n .map((s) => s[\"compositionLevel\"] as string),\n ),\n },\n instructions: [\n \"Review the series progression from studies through finals.\",\n \"Evaluate whether the narrative and intent are reflected in the body of work.\",\n \"Consider: does each sketch build on its predecessors? Is there a clear evolution?\",\n \"Identify the strongest and weakest pieces. What makes them succeed or fail?\",\n \"Document insights and decisions in the series narrative.\",\n ],\n };\n\n return { metadata, previews };\n}\n\n// ---------------------------------------------------------------------------\n// promote_sketch\n// ---------------------------------------------------------------------------\n\nexport interface PromoteSketchInput {\n sketchId: string;\n toStage: SeriesStage;\n seriesId?: string;\n newId?: string;\n title?: string;\n agent?: string;\n model?: string;\n}\n\nexport async function promoteSketch(\n state: EditorState,\n input: PromoteSketchInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const source = state.requireSketch(input.sketchId);\n const sourceDef = source.definition;\n\n // Validate stage\n if (!VALID_STAGES.includes(input.toStage)) {\n throw new Error(\n `Invalid stage: '${input.toStage}'. Valid stages: ${VALID_STAGES.join(\", \")}`,\n );\n }\n\n // Determine the target compositionLevel from the stage\n const targetLevel = STAGE_TO_LEVEL[input.toStage];\n const scale = LEVEL_SCALE[targetLevel];\n\n // Generate new ID\n const newId =\n input.newId ?? `${input.sketchId}-${input.toStage.replace(/s$/, \"\")}`;\n validateKebabId(newId);\n\n if (state.getSketch(newId)) {\n throw new Error(`Sketch with ID '${newId}' already exists`);\n }\n\n // Scale canvas\n const newWidth = Math.round(sourceDef.canvas.width * scale);\n const newHeight = Math.round(sourceDef.canvas.height * scale);\n\n // Build lineage\n const sourceGeneration = sourceDef.lineage?.generation ?? 1;\n\n const title =\n input.title ??\n `${sourceDef.title} (${input.toStage.replace(/s$/, \"\")})`;\n const ts = now();\n\n const promotedDef: SketchDefinition = {\n genart: \"1.1\",\n id: newId,\n title,\n created: ts,\n modified: ts,\n renderer: sourceDef.renderer,\n canvas: { width: newWidth, height: newHeight },\n parameters: [...sourceDef.parameters],\n colors: [...sourceDef.colors],\n state: {\n seed: sourceDef.state.seed,\n params: { ...sourceDef.state.params },\n colorPalette: [...sourceDef.state.colorPalette],\n },\n algorithm: sourceDef.algorithm,\n compositionLevel: targetLevel,\n lineage: {\n parentId: input.sketchId,\n parentTitle: sourceDef.title,\n generation: sourceGeneration + 1,\n },\n ...(sourceDef.philosophy ? { philosophy: sourceDef.philosophy } : {}),\n ...(sourceDef.themes ? { themes: [...sourceDef.themes] } : {}),\n ...(sourceDef.skills ? { skills: [...sourceDef.skills] } : {}),\n ...(sourceDef.components ? { components: sourceDef.components } : {}),\n ...(sourceDef.symbols ? { symbols: sourceDef.symbols } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Save to disk\n const sourceDir = dirname(source.path);\n const newPath = resolve(sourceDir, `${newId}.genart`);\n const json = serializeGenart(promotedDef);\n\n if (!state.remoteMode) {\n await writeFile(newPath, json, \"utf-8\");\n }\n\n // Load into state\n state.sketches.set(newId, { definition: promotedDef, path: newPath });\n\n // Auto-position below the source sketch\n const sourceRef = ws.sketches.find(\n (s) => s.file === basename(source.path),\n );\n const position = sourceRef\n ? { x: sourceRef.position.x, y: sourceRef.position.y + sourceDef.canvas.height + 200 }\n : { x: 0, y: 0 };\n\n // Add to workspace sketches\n const file = basename(newPath);\n state.workspace = {\n ...ws,\n modified: ts,\n sketches: [...ws.sketches, { file, position }],\n };\n\n // Add to series if specified\n if (input.seriesId) {\n const seriesIndex = state.workspace.series?.findIndex(\n (s) => s.id === input.seriesId,\n );\n if (seriesIndex !== undefined && seriesIndex >= 0 && state.workspace.series) {\n const series = state.workspace.series[seriesIndex]!;\n const updatedSeries: WorkspaceSeries = {\n ...series,\n sketchFiles: [...series.sketchFiles, file],\n };\n state.workspace = {\n ...state.workspace,\n series: state.workspace.series.map((s, i) =>\n i === seriesIndex ? updatedSeries : s,\n ),\n };\n }\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: newId, path: newPath });\n state.emitMutation(\"workspace:updated\", { added: file });\n\n return {\n success: true,\n sourceId: input.sketchId,\n promotedSketch: {\n id: newId,\n title,\n path: newPath,\n compositionLevel: targetLevel,\n stage: input.toStage,\n canvas: { width: newWidth, height: newHeight },\n position,\n lineage: promotedDef.lineage,\n },\n ...(scale > 1\n ? {\n canvasUpscaled: `Canvas scaled ${scale}x: ${sourceDef.canvas.width}x${sourceDef.canvas.height} → ${newWidth}x${newHeight}`,\n }\n : {}),\n fileContent: json,\n workspaceContent: workspaceJson,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction countBy(items: string[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const item of items) {\n counts[item] = (counts[item] ?? 0) + 1;\n }\n return counts;\n}\n","/**\n * Reference & inspiration tools — Phase 4 (ADR 057).\n * add_reference, analyze_reference, extract_palette\n */\n\nimport { copyFile, mkdir, readFile } from \"fs/promises\";\nimport { basename, dirname, extname, resolve } from \"path\";\nimport {\n serializeGenart,\n serializeWorkspace,\n type Reference,\n type ReferenceAnalysis,\n type ReferenceType,\n type SketchDefinition,\n type WorkspaceSeries,\n} from \"@genart-dev/core\";\nimport { writeFile } from \"fs/promises\";\nimport type { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\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\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".bmp\", \".tiff\", \".svg\",\n]);\n\nfunction isImageFile(path: string): boolean {\n return IMAGE_EXTENSIONS.has(extname(path).toLowerCase());\n}\n\nconst VALID_REFERENCE_TYPES: readonly ReferenceType[] = [\n \"image\", \"artwork\", \"photograph\", \"texture\", \"palette\",\n];\n\n// ---------------------------------------------------------------------------\n// add_reference\n// ---------------------------------------------------------------------------\n\nexport interface AddReferenceInput {\n image: string;\n type?: ReferenceType;\n source?: string;\n seriesId?: string;\n sketchId?: string;\n id?: string;\n}\n\nexport async function addReference(\n state: EditorState,\n input: AddReferenceInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!isImageFile(input.image)) {\n throw new Error(\n `Not a recognized image file: ${input.image}. Supported: ${[...IMAGE_EXTENSIONS].join(\", \")}`,\n );\n }\n\n // Generate ID from filename if not provided\n const id =\n input.id ??\n basename(input.image, extname(input.image))\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (!id) {\n throw new Error(\"Could not derive a valid ID from the image filename\");\n }\n validateKebabId(id);\n\n const refType = input.type ?? \"image\";\n if (!VALID_REFERENCE_TYPES.includes(refType)) {\n throw new Error(\n `Invalid reference type: '${refType}'. Valid types: ${VALID_REFERENCE_TYPES.join(\", \")}`,\n );\n }\n\n // Copy image to workspace references/ directory\n const workspaceDir = dirname(state.workspacePath!);\n const refsDir = resolve(workspaceDir, \"references\");\n await mkdir(refsDir, { recursive: true });\n\n const ext = extname(input.image);\n const destFilename = `${id}${ext}`;\n const destPath = resolve(refsDir, destFilename);\n const relativePath = `references/${destFilename}`;\n\n if (!state.remoteMode) {\n await copyFile(resolve(input.image), destPath);\n }\n\n const ref: Reference = {\n id,\n type: refType,\n path: relativePath,\n ...(input.source ? { source: input.source } : {}),\n };\n\n // Determine what to attach to\n let attachedTo: string;\n let workspaceJson: string | undefined;\n let sketchJson: string | undefined;\n\n if (input.sketchId) {\n // Attach to a specific sketch\n const loaded = state.requireSketch(input.sketchId);\n const existingRefs = loaded.definition.references ?? [];\n\n if (existingRefs.some((r) => r.id === id)) {\n throw new Error(\n `Reference with ID '${id}' already exists on sketch '${input.sketchId}'`,\n );\n }\n\n const updatedDef: SketchDefinition = {\n ...loaded.definition,\n modified: now(),\n references: [...existingRefs, ref],\n };\n\n state.sketches.set(input.sketchId, {\n definition: updatedDef,\n path: loaded.path,\n });\n\n sketchJson = serializeGenart(updatedDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, sketchJson, \"utf-8\");\n }\n\n attachedTo = `sketch:${input.sketchId}`;\n state.emitMutation(\"sketch:updated\", { id: input.sketchId });\n } else if (input.seriesId) {\n // Attach to a series\n const seriesIndex = ws.series?.findIndex((s) => s.id === input.seriesId);\n if (seriesIndex === undefined || seriesIndex < 0 || !ws.series) {\n throw new Error(`Series '${input.seriesId}' not found in workspace`);\n }\n\n const series = ws.series[seriesIndex]!;\n const existingRefs = series.references ?? [];\n\n if (existingRefs.some((r) => r.id === id)) {\n throw new Error(\n `Reference with ID '${id}' already exists on series '${input.seriesId}'`,\n );\n }\n\n const updatedSeries: WorkspaceSeries = {\n ...series,\n references: [...existingRefs, ref],\n };\n\n state.workspace = {\n ...ws,\n modified: now(),\n series: ws.series.map((s, i) =>\n i === seriesIndex ? updatedSeries : s,\n ),\n };\n\n workspaceJson = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(state.workspacePath!, workspaceJson, \"utf-8\");\n }\n\n attachedTo = `series:${input.seriesId}`;\n state.emitMutation(\"workspace:updated\", { referenceAdded: id });\n } else {\n throw new Error(\"Either seriesId or sketchId must be specified\");\n }\n\n return {\n success: true,\n reference: {\n id,\n type: refType,\n path: relativePath,\n source: input.source ?? null,\n },\n attachedTo,\n ...(sketchJson ? { fileContent: sketchJson } : {}),\n ...(workspaceJson ? { workspaceContent: workspaceJson } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// analyze_reference\n// ---------------------------------------------------------------------------\n\nexport interface AnalyzeReferenceInput {\n referenceId: string;\n seriesId?: string;\n sketchId?: string;\n previewSize?: number;\n}\n\nexport interface AnalyzeReferenceResult {\n metadata: Record<string, unknown>;\n previewJpegBase64?: string;\n}\n\nexport async function analyzeReference(\n state: EditorState,\n input: AnalyzeReferenceInput,\n): Promise<AnalyzeReferenceResult> {\n state.requireWorkspace();\n\n // Find the reference\n const { ref, location } = findReference(state, input.referenceId, input.seriesId, input.sketchId);\n\n // Read the image file and produce a base64 preview\n const workspaceDir = dirname(state.workspacePath!);\n const imagePath = resolve(workspaceDir, ref.path);\n\n let previewJpegBase64: string | undefined;\n try {\n const imageBuffer = await readFile(imagePath);\n // Return the raw image data as base64 for the agent to analyze visually\n const ext = extname(ref.path).toLowerCase();\n const mimeMap: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n };\n // For MCP image content blocks we need base64\n previewJpegBase64 = imageBuffer.toString(\"base64\");\n } catch {\n // Image file not accessible — provide framework without preview\n }\n\n const metadata: Record<string, unknown> = {\n success: true,\n referenceId: ref.id,\n type: ref.type,\n path: ref.path,\n source: ref.source ?? null,\n location,\n existingAnalysis: ref.analysis ?? null,\n analysisFramework: {\n composition: {\n instruction: \"Analyze the compositional structure of this reference.\",\n prompts: [\n \"What is the primary compositional structure (centered, asymmetric, diagonal, radial)?\",\n \"Where does the eye land first? What creates the focal point?\",\n \"How is negative space used — actively or passively?\",\n \"What is the relationship between foreground, middle ground, and background?\",\n \"How do the edges and corners of the frame interact with the subject?\",\n ],\n },\n palette: {\n instruction: \"Identify the color strategy.\",\n prompts: [\n \"What are the dominant colors (3-5 hex values)?\",\n \"What color temperature dominates — warm, cool, or neutral?\",\n \"What is the value range — high contrast or compressed?\",\n \"Is the palette analogous, complementary, triadic, or something else?\",\n \"How does saturation vary across the composition?\",\n ],\n },\n rhythm: {\n instruction: \"Identify rhythmic and pattern qualities.\",\n prompts: [\n \"Is there a repeating motif or interval?\",\n \"Is the rhythm regular, progressive, alternating, or irregular?\",\n \"At how many scales does pattern appear (fractal quality)?\",\n \"How do density variations create movement?\",\n \"Where are the moments of rest vs. activity?\",\n ],\n },\n mood: {\n instruction: \"Identify the emotional and atmospheric qualities.\",\n prompts: [\n \"What is the overall mood — contemplative, energetic, serene, unsettling?\",\n \"How do color, light, and space contribute to that mood?\",\n \"Is there a sense of time — moment, duration, timelessness?\",\n \"What emotional response does the work invite?\",\n ],\n },\n technique: {\n instruction: \"Identify technical and material qualities worth studying.\",\n prompts: [\n \"What medium or technique is used?\",\n \"How is mark-making contributing to expression?\",\n \"Are there layering or transparency effects?\",\n \"What level of control vs. chance is visible?\",\n \"What technical approach could be translated to generative art?\",\n ],\n },\n },\n instructions: [\n \"Study the reference image carefully using the framework above.\",\n \"For each category, answer the prompts and synthesize your observations.\",\n \"After analysis, use update_reference_analysis to save the structured analysis.\",\n \"The analysis should inform how you create study sketches inspired by this reference.\",\n \"Focus on qualities that can be translated to generative art — don't try to replicate literally.\",\n ],\n };\n\n return { metadata, previewJpegBase64 };\n}\n\n// ---------------------------------------------------------------------------\n// update_reference_analysis (save analysis back to reference)\n// ---------------------------------------------------------------------------\n\nexport interface UpdateReferenceAnalysisInput {\n referenceId: string;\n seriesId?: string;\n sketchId?: string;\n analysis: ReferenceAnalysis;\n}\n\nexport async function updateReferenceAnalysis(\n state: EditorState,\n input: UpdateReferenceAnalysisInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const { ref, location } = findReference(\n state, input.referenceId, input.seriesId, input.sketchId,\n );\n\n const updatedRef: Reference = {\n ...ref,\n analysis: input.analysis,\n };\n\n let workspaceJson: string | undefined;\n let sketchJson: string | undefined;\n\n if (location.startsWith(\"sketch:\")) {\n const sketchId = location.replace(\"sketch:\", \"\");\n const loaded = state.requireSketch(sketchId);\n const updatedDef: SketchDefinition = {\n ...loaded.definition,\n modified: now(),\n references: (loaded.definition.references ?? []).map((r) =>\n r.id === input.referenceId ? updatedRef : r,\n ),\n };\n state.sketches.set(sketchId, {\n definition: updatedDef,\n path: loaded.path,\n });\n sketchJson = serializeGenart(updatedDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, sketchJson, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", { id: sketchId });\n } else {\n const seriesId = location.replace(\"series:\", \"\");\n const seriesIndex = ws.series!.findIndex((s) => s.id === seriesId);\n const series = ws.series![seriesIndex]!;\n const updatedSeries: WorkspaceSeries = {\n ...series,\n references: (series.references ?? []).map((r) =>\n r.id === input.referenceId ? updatedRef : r,\n ),\n };\n state.workspace = {\n ...ws,\n modified: now(),\n series: ws.series!.map((s, i) =>\n i === seriesIndex ? updatedSeries : s,\n ),\n };\n workspaceJson = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(state.workspacePath!, workspaceJson, \"utf-8\");\n }\n state.emitMutation(\"workspace:updated\", { referenceAnalyzed: input.referenceId });\n }\n\n return {\n success: true,\n referenceId: input.referenceId,\n location,\n analysis: input.analysis,\n ...(sketchJson ? { fileContent: sketchJson } : {}),\n ...(workspaceJson ? { workspaceContent: workspaceJson } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// extract_palette\n// ---------------------------------------------------------------------------\n\nexport interface ExtractPaletteInput {\n referenceId: string;\n seriesId?: string;\n sketchId?: string;\n count?: number;\n}\n\nexport interface ExtractPaletteResult {\n metadata: Record<string, unknown>;\n previewJpegBase64?: string;\n}\n\nexport async function extractPalette(\n state: EditorState,\n input: ExtractPaletteInput,\n): Promise<ExtractPaletteResult> {\n state.requireWorkspace();\n\n const { ref, location } = findReference(\n state, input.referenceId, input.seriesId, input.sketchId,\n );\n\n const count = input.count ?? 6;\n\n // Read the image file\n const workspaceDir = dirname(state.workspacePath!);\n const imagePath = resolve(workspaceDir, ref.path);\n\n let previewJpegBase64: string | undefined;\n try {\n const imageBuffer = await readFile(imagePath);\n previewJpegBase64 = imageBuffer.toString(\"base64\");\n } catch {\n // Image not accessible\n }\n\n const metadata: Record<string, unknown> = {\n success: true,\n referenceId: ref.id,\n type: ref.type,\n path: ref.path,\n location,\n requestedColors: count,\n existingPalette: ref.analysis?.palette ?? null,\n instructions: [\n `Extract ${count} dominant colors from the reference image as hex values.`,\n \"Order them from most dominant to least dominant.\",\n \"Include both saturated and neutral colors if present in the image.\",\n \"Consider the role of each color — is it a background, accent, or primary element?\",\n \"After extraction, use update_reference_analysis to save the palette.\",\n \"You can also apply the extracted palette to a sketch using set_colors or create a new theme.\",\n ],\n extractionGuidelines: {\n dominance: \"Prioritize colors by the area they occupy, not just their saturation.\",\n variety: \"Include the full value range (lights, midtones, darks) if present.\",\n harmony: `Look for ${count <= 4 ? \"core harmony\" : \"extended palette including transitional colors\"}.`,\n neutrals: \"Don't ignore grays, blacks, and whites — they often define the character of a palette.\",\n },\n };\n\n return { metadata, previewJpegBase64 };\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/** Find a reference by ID across series and sketches. */\nfunction findReference(\n state: EditorState,\n referenceId: string,\n seriesId?: string,\n sketchId?: string,\n): { ref: Reference; location: string } {\n // Check specific sketch first\n if (sketchId) {\n const loaded = state.requireSketch(sketchId);\n const ref = (loaded.definition.references ?? []).find(\n (r) => r.id === referenceId,\n );\n if (ref) return { ref, location: `sketch:${sketchId}` };\n throw new Error(\n `Reference '${referenceId}' not found on sketch '${sketchId}'`,\n );\n }\n\n // Check specific series\n if (seriesId) {\n const ws = state.requireWorkspace();\n const series = ws.series?.find((s) => s.id === seriesId);\n if (!series) {\n throw new Error(`Series '${seriesId}' not found in workspace`);\n }\n const ref = (series.references ?? []).find((r) => r.id === referenceId);\n if (ref) return { ref, location: `series:${seriesId}` };\n throw new Error(\n `Reference '${referenceId}' not found on series '${seriesId}'`,\n );\n }\n\n // Search all series, then all sketches\n const ws = state.requireWorkspace();\n if (ws.series) {\n for (const series of ws.series) {\n const ref = (series.references ?? []).find((r) => r.id === referenceId);\n if (ref) return { ref, location: `series:${series.id}` };\n }\n }\n\n for (const [id, loaded] of state.sketches) {\n const ref = (loaded.definition.references ?? []).find(\n (r) => r.id === referenceId,\n );\n if (ref) return { ref, location: `sketch:${id}` };\n }\n\n throw new Error(\n `Reference '${referenceId}' not found in any series or sketch`,\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 if (args.name !== undefined) {\n stack.updateMeta(args.layerId, { 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 stack.updateMeta(args.layerId, { visible: newVisible });\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 stack.updateMeta(args.layerId, { locked: newLocked });\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 registerCritiqueAndIterate(server, state);\n registerDevelopArtisticConcept(server, state);\n registerStudyReference(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\n// ---------------------------------------------------------------------------\n// critique-and-iterate — capture → self-critique → improve → compare → document\n// ---------------------------------------------------------------------------\n\nfunction registerCritiqueAndIterate(\n server: McpServer,\n state: EditorState,\n): void {\n server.prompt(\n \"critique-and-iterate\",\n \"Capture a sketch, self-critique it, identify improvements, fork, apply changes, compare, and document the iteration\",\n {\n sketchId: z\n .string()\n .describe(\"ID of the sketch to critique and iterate on\"),\n aspects: z\n .string()\n .optional()\n .describe(\"Comma-separated aspects to focus on (composition, color, rhythm, unity, expression). Default: all\"),\n iterations: z\n .string()\n .optional()\n .describe(\"Number of improvement iterations (default: 1)\"),\n },\n async (args) => {\n const sketch = state.getSketch(args.sketchId);\n const iterations = args.iterations ? parseInt(args.iterations, 10) : 1;\n const aspectList = args.aspects\n ? args.aspects.split(\",\").map((a) => a.trim())\n : [\"composition\", \"color\", \"rhythm\", \"unity\", \"expression\"];\n\n let sketchContext = \"\";\n if (sketch) {\n const def = sketch.definition;\n sketchContext = [\n `## Current Sketch: \"${def.title}\"`,\n `- **ID:** ${def.id}`,\n `- **Renderer:** ${def.renderer.type}`,\n `- **Canvas:** ${def.canvas.width}×${def.canvas.height}`,\n `- **Composition Level:** ${def.compositionLevel ?? \"sketch\"}`,\n def.philosophy\n ? `- **Philosophy:** ${def.philosophy}`\n : `- **Philosophy:** not set`,\n `- **Parameters:** ${def.parameters?.length ?? 0} defined`,\n `- **Colors:** ${def.colors?.length ?? 0} defined`,\n ].join(\"\\n\");\n } else {\n sketchContext = `## Sketch: ${args.sketchId}\\n*(Not currently loaded — use open_sketch first)*`;\n }\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Perform a structured critique-and-iterate cycle on a generative art sketch.`,\n ``,\n sketchContext,\n ``,\n `## Focus Aspects`,\n aspectList.map((a) => `- ${a}`).join(\"\\n\"),\n ``,\n `## Iterations: ${iterations}`,\n ``,\n `## Process`,\n ``,\n `For each iteration:`,\n ``,\n `### Step 1: Capture & Critique`,\n `1. Use \\`critique_sketch\\` with sketchId=\"${args.sketchId}\" and aspects=[${aspectList.map((a) => `\"${a}\"`).join(\", \")}]`,\n `2. Study the returned screenshot carefully`,\n `3. Answer each framework question honestly — what works and what doesn't`,\n `4. Note the severity calibration for this composition level`,\n ``,\n `### Step 2: Identify Improvements`,\n `Based on the critique, identify 2-3 specific, actionable improvements:`,\n `- Rank them by expected visual impact`,\n `- Be precise: \"shift the focal cluster from center to upper-left third\" not \"improve composition\"`,\n `- Consider which improvements can be achieved via parameter changes vs algorithm changes`,\n ``,\n `### Step 3: Fork & Apply`,\n `1. Use \\`fork_sketch\\` to create a new version (preserve the original for comparison)`,\n `2. Apply the identified improvements:`,\n ` - Use \\`set_parameters\\` or \\`set_colors\\` for parameter-level changes`,\n ` - Use \\`update_algorithm\\` for algorithmic changes`,\n `3. Use \\`capture_screenshot\\` to verify each change visually`,\n ``,\n `### Step 4: Compare`,\n `1. Use \\`compare_sketches\\` with the original and improved sketch IDs`,\n `2. Evaluate: did each intended improvement actually improve the piece?`,\n `3. Note any unintended consequences — improvements in one aspect sometimes degrade another`,\n ``,\n `### Step 5: Document`,\n `After all iterations:`,\n `1. Update the improved sketch's philosophy field to document what changed and why`,\n `2. Summarize the iteration journey: what was tried, what worked, what was learned`,\n `3. If the original was better in some aspects, note what to preserve in future iterations`,\n ``,\n `## Guidelines`,\n `- Be your own harshest (but fairest) critic — the goal is genuine improvement`,\n `- Small, focused changes are better than sweeping rewrites`,\n `- If a change doesn't work, revert it before trying the next improvement`,\n `- The final piece should feel like a natural evolution, not a different sketch`,\n `- 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\n// ---------------------------------------------------------------------------\n// develop-artistic-concept — concept → study → thumbnails → develop → critique → iterate → document\n// ---------------------------------------------------------------------------\n\nfunction registerDevelopArtisticConcept(\n server: McpServer,\n _state: EditorState,\n): void {\n server.prompt(\n \"develop-artistic-concept\",\n \"Develop an artistic concept through a full studio workflow: concept planning, studies, development, critique, iteration, and documentation\",\n {\n concept: z\n .string()\n .describe(\"The artistic concept or theme to explore\"),\n medium: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Preferred renderer/medium (default: p5)\"),\n depth: z\n .enum([\"quick\", \"standard\", \"deep\"])\n .optional()\n .describe(\"How deeply to explore: quick (3 studies), standard (6 studies), deep (9+ studies). Default: standard\"),\n },\n async (args) => {\n const medium = args.medium ?? \"p5\";\n const depth = args.depth ?? \"standard\";\n const studyCount = depth === \"quick\" ? 3 : depth === \"deep\" ? 9 : 6;\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Develop the following artistic concept through a full studio workflow.`,\n ``,\n `## Concept`,\n `${args.concept}`,\n ``,\n `## Medium: ${medium}`,\n `## Depth: ${depth} (${studyCount} studies)`,\n ``,\n `## Phase 1: Conceptual Planning`,\n `1. Use \\`develop_concept\\` with your concept and medium to get a structured plan`,\n `2. Define: mood, color strategy, compositional approach, and relevant skills`,\n `3. Create a series with \\`create_series\\` — write a narrative and intent statement`,\n ``,\n `## Phase 2: Thumbnail Studies`,\n `1. Create ${studyCount} quick study-level sketches with \\`create_sketch\\` (compositionLevel: \"study\")`,\n `2. Each study should explore a different aspect of the concept:`,\n ` - Vary composition (centered vs asymmetric vs edge-driven)`,\n ` - Vary color (warm vs cool, saturated vs muted)`,\n ` - Vary rhythm (regular vs progressive vs chaotic)`,\n ` - Vary density (sparse vs dense vs gradient)`,\n `3. Use small canvases (600x600 or similar) — studies are fast explorations`,\n `4. Use \\`capture_batch\\` to see all studies at once`,\n ``,\n `## Phase 3: Selection & Critique`,\n `1. Use \\`series_summary\\` to see the full set of studies with screenshots`,\n `2. Use \\`critique_sketch\\` on the 2-3 most promising studies`,\n `3. Identify which studies best capture the concept's intent`,\n `4. Note what works in each — composition choices, color relationships, rhythmic qualities`,\n ``,\n `## Phase 4: Development`,\n `1. Use \\`promote_sketch\\` to advance the best 1-2 studies to \"drafts\" stage`,\n `2. Refine the promoted sketches:`,\n ` - Add more parameters for fine control`,\n ` - Develop the color palette with more nuance`,\n ` - Strengthen compositional structure`,\n ` - Load relevant skills with \\`load_skill\\` for guidance`,\n `3. Use \\`critique_sketch\\` after each round of changes`,\n ``,\n `## Phase 5: Critique & Iteration`,\n `1. Use \\`compare_sketches\\` to evaluate drafts against each other`,\n `2. For the strongest draft, use the critique-and-iterate workflow:`,\n ` - Critique → identify improvements → fork → apply → compare`,\n `3. Promote the best iteration to \"refinements\" stage`,\n `4. Continue refining until the piece feels resolved`,\n ``,\n `## Phase 6: Final & Documentation`,\n `1. Promote the best refinement to \"finals\" stage (canvas will upscale)`,\n `2. Update the philosophy field with the full artistic statement`,\n `3. Use \\`series_summary\\` to capture the complete progression`,\n `4. Document: what was the concept? How did it evolve? What was discovered?`,\n ``,\n `## Guidelines`,\n `- Each phase should feel like a natural progression, not a checklist`,\n `- Trust the studies — let unexpected results redirect the exploration`,\n `- The final piece should feel inevitable, like it couldn't have been any other way`,\n `- Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools`,\n `- Use \\`auto_arrange\\` periodically to keep the workspace organized`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// study-reference — analyze → identify key qualities → create study → document\n// ---------------------------------------------------------------------------\n\nfunction registerStudyReference(\n server: McpServer,\n _state: EditorState,\n): void {\n server.prompt(\n \"study-reference\",\n \"Study a reference image: analyze it, identify key qualities, create a generative study sketch inspired by it, and document learnings\",\n {\n referenceId: z\n .string()\n .describe(\"ID of the reference to study\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to (also where the study sketch will be added)\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to\"),\n medium: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer for the study sketch (default: p5)\"),\n focus: z\n .string()\n .optional()\n .describe(\"Specific quality to focus on: composition, palette, rhythm, mood, technique, or a custom focus\"),\n },\n async (args) => {\n const medium = args.medium ?? \"p5\";\n const focus = args.focus ?? \"all key qualities\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Study a reference image and create a generative art sketch inspired by it.`,\n ``,\n `## Reference: ${args.referenceId}`,\n args.seriesId ? `## Series: ${args.seriesId}` : \"\",\n `## Medium: ${medium}`,\n `## Focus: ${focus}`,\n ``,\n `## Phase 1: Analyze the Reference`,\n `1. Use \\`analyze_reference\\` with referenceId=\"${args.referenceId}\"${args.seriesId ? ` seriesId=\"${args.seriesId}\"` : \"\"}${args.sketchId ? ` sketchId=\"${args.sketchId}\"` : \"\"} to get the analysis framework and image`,\n `2. Study the image carefully using the framework prompts`,\n `3. Answer each category: composition, palette, rhythm, mood, technique`,\n `4. Use \\`update_reference_analysis\\` to save your structured analysis`,\n ``,\n `## Phase 2: Extract Key Qualities`,\n `From your analysis, identify 2-4 key qualities that are most interesting for generative art:`,\n `- These could be: a specific compositional structure, a color relationship, a rhythmic pattern, a mood quality`,\n `- Focus on qualities that can be *translated* into code, not literally replicated`,\n `- Consider what makes this reference compelling — what would be lost if you removed each quality?`,\n ``,\n `## Phase 3: Extract Palette`,\n `1. Use \\`extract_palette\\` to study the reference's color strategy`,\n `2. Extract 5-8 hex colors that capture the essential palette`,\n `3. Save the palette in the reference analysis`,\n ``,\n `## Phase 4: Create Study Sketch`,\n `1. Use \\`create_sketch\\` with compositionLevel: \"study\" to create a quick exploration`,\n `2. Translate the key qualities into generative parameters and algorithm choices:`,\n ` - Composition → element placement, density distribution, negative space`,\n ` - Palette → color definitions, themes derived from the reference palette`,\n ` - Rhythm → repetition patterns, interval variations, scale relationships`,\n ` - Mood → overall tone, animation speed, mark quality`,\n ` - Technique → rendering approach, layering, transparency`,\n `3. Add the reference to the sketch with \\`add_reference\\``,\n `4. Document in the philosophy field how the reference influenced the study`,\n `5. Use \\`capture_screenshot\\` to verify the result`,\n ``,\n `## Phase 5: Compare & Document`,\n `1. Use \\`analyze_reference\\` again to see the reference alongside your study`,\n `2. Evaluate: which qualities translated well? Which were lost or transformed?`,\n `3. Note what you learned — what worked, what surprised you, what to try next`,\n `4. Update the study sketch's philosophy with these insights`,\n ``,\n `## Guidelines`,\n `- The goal is *inspiration*, not replication — a study should be recognizably generative`,\n `- A good study captures the *spirit* of the reference while being authentically algorithmic`,\n `- Use small canvases (600x600) — studies are explorations, not finished pieces`,\n `- If the reference suggests multiple interesting directions, create multiple studies`,\n `- Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools`,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\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 SketchMutator,\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 const sketch: SketchMutator = {\n getSymbols() {\n return (loaded.definition.symbols ?? {}) as Readonly<Record<string, unknown>>;\n },\n setSymbols(symbols: Record<string, unknown> | undefined) {\n loaded.definition = { ...loaded.definition, symbols: symbols as typeof loaded.definition.symbols };\n },\n getComponents() {\n return (loaded.definition.components ?? {}) as Readonly<Record<string, unknown>>;\n },\n setComponents(components: Record<string, unknown>) {\n loaded.definition = { ...loaded.definition, components: components as typeof loaded.definition.components };\n },\n getThirdParty() {\n const def = loaded.definition as unknown as Record<string, unknown>;\n return ((def[\"thirdParty\"] as unknown[]) ?? []) as readonly Record<string, unknown>[];\n },\n setThirdParty(notices: Record<string, unknown>[] | undefined) {\n (loaded.definition as unknown as Record<string, unknown>)[\"thirdParty\"] = notices;\n },\n getRenderer() {\n return loaded.definition.renderer.type;\n },\n getGenartVersion() {\n return loaded.definition.genart;\n },\n setGenartVersion(version: string) {\n loaded.definition = { ...loaded.definition, genart: version };\n },\n };\n\n return {\n layers: layerStack,\n sketchState,\n sketch,\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"],"mappings":"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","names":["z","json","unlink","writeFile","stat","basename","dirname","serializeWorkspace","now","fileExists","registry","ts","basename","resolvePreset","now","basename","now","computeViewport","readFile","stat","dirname","parseGenart","dirname","join","writeFile","serializeGenart","now","basename","writeFile","resolveComponents","serializeGenart","VALID_RENDERERS","writeFile","dirname","join","createDefaultRegistry","resolve","registry","createDefaultRegistry","dirname","join","writeFile","createDefaultSkillRegistry","registry","createDefaultSkillRegistry","writeFile","basename","dirname","resolve","serializeGenart","serializeWorkspace","now","KEBAB_RE","validateKebabId","now","serializeWorkspace","writeFile","basename","validateKebabId","dirname","resolve","serializeGenart","mkdir","readFile","basename","dirname","resolve","serializeGenart","serializeWorkspace","writeFile","now","KEBAB_RE","validateKebabId","ws","stat","writeFile","dirname","createDefaultRegistry","serializeGenart","registry","createDefaultRegistry","dirname","stat","applyOverrides","writeFile","content","serializeGenart","resolve","registry","registry","createDefaultRegistry","createDefaultSkillRegistry","registry","registry","z","readFile","dirname","resolve","parseGenart","parseWorkspace","serializeGenart","serializeWorkspace","writeFile","resolve","dirname","readFile","def"]}
1
+ {"version":3,"sources":["../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/critique.ts","../src/tools/series.ts","../src/tools/reference.ts","../src/tools/export.ts","../src/tools/design.ts","../src/tools/design-plugins.ts","../src/resources/index.ts","../src/prompts/index.ts","../src/state.ts","../src/sidecar.ts"],"sourcesContent":["/**\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 paintingPlugin from \"@genart-dev/plugin-painting\";\nimport texturesPlugin from \"@genart-dev/plugin-textures\";\nimport animationPlugin from \"@genart-dev/plugin-animation\";\nimport colorAdjustPlugin from \"@genart-dev/plugin-color-adjust\";\nimport compositingPlugin from \"@genart-dev/plugin-compositing\";\nimport constructionPlugin from \"@genart-dev/plugin-construction\";\nimport distributionPlugin from \"@genart-dev/plugin-distribution\";\nimport figurePlugin from \"@genart-dev/plugin-figure\";\nimport layoutCompositionPlugin from \"@genart-dev/plugin-layout-composition\";\nimport perspectivePlugin from \"@genart-dev/plugin-perspective\";\nimport posesPlugin from \"@genart-dev/plugin-poses\";\nimport stylesPlugin from \"@genart-dev/plugin-styles\";\nimport symbolsPlugin from \"@genart-dev/plugin-symbols\";\nimport tracePlugin from \"@genart-dev/plugin-trace\";\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, suggestSkills } from \"./tools/knowledge.js\";\nimport {\n listComponents,\n addComponent,\n removeComponent,\n} from \"./tools/components.js\";\nimport { captureScreenshot, captureBatch } from \"./tools/capture.js\";\nimport { critiqueSketch, compareSketches } from \"./tools/critique.js\";\nimport {\n createSeries,\n developConcept,\n seriesSummary,\n promoteSketch,\n} from \"./tools/series.js\";\nimport {\n addReference,\n analyzeReference,\n updateReferenceAnalysis,\n extractPalette,\n} from \"./tools/reference.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 all design plugins\n await registry.register(typographyPlugin);\n await registry.register(filtersPlugin);\n await registry.register(shapesPlugin);\n await registry.register(layoutGuidesPlugin);\n await registry.register(paintingPlugin);\n await registry.register(texturesPlugin);\n await registry.register(animationPlugin);\n await registry.register(colorAdjustPlugin);\n await registry.register(compositingPlugin);\n await registry.register(constructionPlugin);\n await registry.register(distributionPlugin);\n await registry.register(figurePlugin);\n await registry.register(layoutCompositionPlugin);\n await registry.register(perspectivePlugin);\n await registry.register(posesPlugin);\n await registry.register(stylesPlugin);\n await registry.register(symbolsPlugin);\n await registry.register(tracePlugin);\n\n return registry;\n}\n\nexport interface CreateServerOptions {\n /** Only register capture tools (for local-only capture companion server). */\n captureOnly?: boolean;\n}\n\n/** Create and configure the MCP server with all tools. */\nexport function createServer(\n state: EditorState,\n options?: CreateServerOptions,\n): McpServer {\n const captureOnly = options?.captureOnly ?? false;\n\n const server = new McpServer(\n {\n name: captureOnly ? \"@genart/mcp-capture\" : \"@genart/mcp-server\",\n version: \"0.4.0\",\n },\n {\n capabilities: {\n tools: {},\n ...(!captureOnly && { resources: {}, prompts: {} }),\n },\n },\n );\n\n if (captureOnly) {\n // Local capture-only mode: just capture + export tools, no remote deps\n registerCaptureTools(server, state);\n return server;\n }\n\n // Full server mode — register all tools\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 // Capture tools require puppeteer + local filesystem — skip in remote mode\n if (!state.remoteMode) {\n registerCaptureTools(server, state);\n }\n registerCritiqueTools(server, state);\n registerSeriesTools(server, state);\n registerReferenceTools(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 capture: z.boolean().optional().describe(\"When true, automatically capture a screenshot after creation and return it inline (avoids a separate capture_screenshot call)\"),\n },\n async (args) => {\n try {\n const result = await createSketch(state, args);\n\n // If capture requested and we're in local mode (capture tools available),\n // run headless capture and return image inline with metadata.\n if (args.capture && !state.remoteMode) {\n try {\n const captureResult = await captureScreenshot(state, {\n target: \"sketch\",\n sketchId: args.id,\n });\n return {\n content: [\n {\n type: \"image\" as const,\n data: captureResult.previewJpegBase64,\n mimeType: \"image/jpeg\" as const,\n annotations: { audience: [\"user\", \"assistant\"] as const },\n },\n { type: \"text\" as const, text: JSON.stringify({\n ...result,\n capture: captureResult.metadata,\n }, null, 2) },\n ],\n };\n } catch (captureErr) {\n // Capture failed but sketch was created successfully — return sketch result with capture error\n return jsonResult({\n ...result,\n captureError: captureErr instanceof Error ? captureErr.message : String(captureErr),\n });\n }\n }\n\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 an inline JPEG image + metadata as text. In local mode, also writes a full-res PNG to snapshots/<sketchId>-<seed>-preview.png (path in savedPreviewTo).\",\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 console.error(`[capture_screenshot] jpeg base64 length: ${result.previewJpegBase64.length}`);\n return {\n content: [\n {\n type: \"image\" as const,\n data: result.previewJpegBase64,\n mimeType: \"image/jpeg\" as const,\n annotations: { audience: [\"user\", \"assistant\"] as const },\n },\n { type: \"text\" as const, text: JSON.stringify(result.metadata, null, 2) },\n ],\n };\n } catch (e) {\n console.error(`[capture_screenshot] error: ${e instanceof Error ? e.message : String(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 inline JPEG images + per-sketch metadata. In local mode, writes full-res PNGs to snapshots/.\",\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: any[] = [\n { type: \"text\", text: JSON.stringify(result.metadata, null, 2) },\n ];\n // Add per-sketch image + metadata (image first for inline rendering)\n for (const item of result.items) {\n content.push({\n type: \"image\",\n data: item.inlineJpegBase64,\n mimeType: \"image/jpeg\",\n annotations: { audience: [\"user\", \"assistant\"] },\n });\n content.push({\n type: \"text\",\n text: JSON.stringify(item.metadata, null, 2),\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// Critique Tools (Phase 2: Perception & Self-Critique — ADR 053)\n// ---------------------------------------------------------------------------\n\nfunction registerCritiqueTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"critique_sketch\",\n \"Capture a sketch screenshot and return a structured self-critique framework (questions, principles, pitfalls) per aspect. Severity calibrates to compositionLevel.\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch to critique (default: selected sketch)\"),\n aspects: z\n .array(z.enum([\"composition\", \"color\", \"rhythm\", \"unity\", \"expression\"]))\n .optional()\n .describe(\"Aspects to critique (default: all five)\"),\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 critiqueSketch(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 \"compare_sketches\",\n \"Side-by-side capture of 2-4 sketches with a structured comparison framework across specified aspects.\",\n {\n sketchIds: z\n .array(z.string())\n .describe(\"IDs of 2-4 sketches to compare\"),\n aspects: z\n .array(z.enum([\"composition\", \"color\", \"rhythm\", \"unity\", \"expression\"]))\n .optional()\n .describe(\"Aspects to compare (default: all five)\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for inline preview JPEGs (default: 300)\"),\n },\n async (args) => {\n try {\n const result = await compareSketches(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 images interleaved for easy visual comparison\n for (const preview of result.previews) {\n content.push({\n type: \"text\",\n text: `--- Sketch: ${preview.sketchId} ---`,\n });\n content.push({\n type: \"image\",\n data: preview.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// Series & Conceptual Development Tools (Phase 3)\n// ---------------------------------------------------------------------------\n\nfunction registerSeriesTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"create_series\",\n \"Create a new curated series of sketches with narrative, intent, and studio workflow stages\",\n {\n label: z.string().describe(\"Display label for the series\"),\n narrative: z\n .string()\n .describe(\"Prose narrative describing the artistic exploration\"),\n intent: z.string().describe(\"Short statement of artistic intent\"),\n progression: z\n .string()\n .optional()\n .describe(\n \"Series progression type (e.g. 'linear', 'branching', 'iterative')\",\n ),\n stages: z\n .array(z.enum([\"studies\", \"drafts\", \"refinements\", \"finals\"]))\n .optional()\n .describe(\n \"Ordered stages in the studio workflow (default: all four)\",\n ),\n sketchFiles: z\n .array(z.string())\n .optional()\n .describe(\"File names of existing sketches to include\"),\n },\n async (args) => {\n try {\n const result = await createSeries(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 \"develop_concept\",\n \"Generate a structured concept development plan with mood, palette, composition, skills, and series structure recommendations\",\n {\n concept: z\n .string()\n .describe(\"The artistic concept or theme to develop\"),\n medium: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Preferred renderer/medium (default: p5)\"),\n },\n async (args) => {\n try {\n const result = await developConcept(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 \"series_summary\",\n \"Capture all sketches in a series with narrative context for holistic evaluation\",\n {\n seriesId: z.string().describe(\"ID of the series to summarize\"),\n captureScreenshots: z\n .boolean()\n .optional()\n .describe(\"Capture screenshots of each sketch (default: true)\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Preview image size in pixels (default: 300)\"),\n },\n async (args) => {\n try {\n const result = await seriesSummary(state, args);\n // Return text metadata + inline image previews\n const content: Array<{ type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string }> = [\n { type: \"text\" as const, text: JSON.stringify(result.metadata, null, 2) },\n ];\n if (result.previews) {\n for (const preview of result.previews) {\n content.push({\n type: \"image\" as const,\n data: preview.inlineJpegBase64,\n mimeType: \"image/jpeg\",\n });\n }\n }\n return { content };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"promote_sketch\",\n \"Promote a sketch to the next studio workflow stage — fork, upscale canvas, update compositionLevel, and add to series\",\n {\n sketchId: z.string().describe(\"ID of the sketch to promote\"),\n toStage: z\n .enum([\"studies\", \"drafts\", \"refinements\", \"finals\"])\n .describe(\"Target stage to promote to\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series to add the promoted sketch to\"),\n newId: z\n .string()\n .optional()\n .describe(\n \"URL-safe kebab-case ID for the promoted sketch (default: auto-generated)\",\n ),\n title: z\n .string()\n .optional()\n .describe(\"Title for the promoted sketch (default: auto-generated)\"),\n agent: z\n .string()\n .optional()\n .describe(\"CLI agent name\"),\n model: z\n .string()\n .optional()\n .describe(\"AI model identifier\"),\n },\n async (args) => {\n try {\n const result = await promoteSketch(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// Reference Tools\n// ---------------------------------------------------------------------------\n\nfunction registerReferenceTools(server: McpServer, state: EditorState): void {\n server.tool(\n \"add_reference\",\n \"Import an image as a reference for inspiration. Copies the image to the workspace references/ directory and attaches it to a series or sketch.\",\n {\n image: z.string().describe(\"Path to the reference image file\"),\n type: z\n .enum([\"image\", \"artwork\", \"photograph\", \"texture\", \"palette\"])\n .optional()\n .describe(\"Reference type (default: image)\"),\n source: z\n .string()\n .optional()\n .describe(\"Source attribution (artist, URL, collection)\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series to attach the reference to\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch to attach the reference to\"),\n id: z\n .string()\n .optional()\n .describe(\"Custom reference ID (default: derived from filename)\"),\n },\n async (args) => {\n try {\n const result = await addReference(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 \"analyze_reference\",\n \"Return a structured analysis framework for a reference image, with the image for visual inspection. The agent fills in the analysis using the framework prompts.\",\n {\n referenceId: z.string().describe(\"ID of the reference to analyze\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to (speeds up lookup)\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to (speeds up lookup)\"),\n previewSize: z\n .number()\n .optional()\n .describe(\"Max dimension for preview image (default: native)\"),\n },\n async (args) => {\n try {\n const result = await analyzeReference(state, args);\n const content: Array<\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n > = [\n { type: \"text\", text: JSON.stringify(result.metadata, null, 2) },\n ];\n if (result.previewJpegBase64) {\n const ext = (result.metadata[\"path\"] as string ?? \".png\").split(\".\").pop() ?? \"png\";\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n content.push({\n type: \"image\",\n data: result.previewJpegBase64,\n mimeType: mimeMap[ext] ?? \"image/png\",\n });\n }\n return { content };\n } catch (e) {\n return toolError(e instanceof Error ? e.message : String(e));\n }\n },\n );\n\n server.tool(\n \"update_reference_analysis\",\n \"Save a structured analysis (composition, palette, rhythm, mood, technique) back to a reference after studying it with analyze_reference.\",\n {\n referenceId: z.string().describe(\"ID of the reference to update\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to\"),\n analysis: z.object({\n composition: z.string().optional().describe(\"Compositional structure observations\"),\n palette: z.array(z.string()).optional().describe(\"Dominant colors as hex values\"),\n rhythm: z.string().optional().describe(\"Visual rhythm and pattern observations\"),\n mood: z.string().optional().describe(\"Mood and emotional qualities\"),\n technique: z.string().optional().describe(\"Technique and medium observations\"),\n keyQualities: z.array(z.string()).optional().describe(\"Key qualities worth studying\"),\n }).describe(\"Structured analysis to save\"),\n },\n async (args) => {\n try {\n const result = await updateReferenceAnalysis(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 \"extract_palette\",\n \"Return a reference image for color palette extraction, with guidelines for identifying dominant colors. The agent extracts hex colors visually.\",\n {\n referenceId: z.string().describe(\"ID of the reference to extract palette from\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to\"),\n count: z\n .number()\n .optional()\n .describe(\"Number of colors to extract (default: 6)\"),\n },\n async (args) => {\n try {\n const result = await extractPalette(state, args);\n const content: Array<\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n > = [\n { type: \"text\", text: JSON.stringify(result.metadata, null, 2) },\n ];\n if (result.previewJpegBase64) {\n const ext = (result.metadata[\"path\"] as string ?? \".png\").split(\".\").pop() ?? \"png\";\n const mimeMap: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n };\n content.push({\n type: \"image\",\n data: result.previewJpegBase64,\n mimeType: mimeMap[ext] ?? \"image/png\",\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\", \"process\", \"painting\", \"illustration\", \"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 server.tool(\n \"suggest_skills\",\n \"Recommend relevant design skills based on sketch context and/or free-text description\",\n {\n sketchId: z\n .string()\n .optional()\n .describe(\"ID of a loaded sketch to analyze for skill recommendations\"),\n context: z\n .string()\n .optional()\n .describe(\"Free-text description of what you're working on (e.g., 'atmospheric landscape with watercolor')\"),\n },\n async (args) => {\n try {\n const result = await suggestSkills(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 * 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 capture?: boolean;\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 // Build lineage from parent\n const sourceGeneration = sourceDef.lineage?.generation ?? 1;\n const lineage = {\n parentId: input.sourceId,\n parentTitle: sourceDef.title,\n generation: sourceGeneration + 1,\n };\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 ...(sourceDef.compositionLevel ? { compositionLevel: sourceDef.compositionLevel } : {}),\n lineage,\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 // Build lineage with blend sources\n const maxGeneration = Math.max(\n ...sources.map((s) => s.lineage?.generation ?? 1),\n );\n const lineage = {\n blendSources: input.sourceIds,\n generation: maxGeneration + 1,\n };\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 lineage,\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, suggest_skills\n */\n\nimport { createDefaultSkillRegistry } from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\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 painting: \"painting\",\n watercolor: \"painting\",\n ink: \"illustration\",\n illustration: \"illustration\",\n \"mixed-media\": \"illustration\",\n \"mixed media\": \"illustration\",\n process: \"process\",\n layering: \"process\",\n \"mark-making\": \"process\",\n refinement: \"process\",\n constraints: \"process\",\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, painting, illustration, process, 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// ---------------------------------------------------------------------------\n// suggest_skills\n// ---------------------------------------------------------------------------\n\nexport interface SuggestSkillsInput {\n sketchId?: string;\n context?: string;\n}\n\n/** Keyword-to-skill relevance mapping for context-based suggestions. */\nconst CONTEXT_KEYWORDS: Record<string, readonly string[]> = {\n // Composition keywords\n layout: [\"golden-ratio\", \"rule-of-thirds\", \"visual-weight\", \"gestalt-grouping\"],\n balance: [\"visual-weight\", \"golden-ratio\", \"rule-of-thirds\"],\n grid: [\"rule-of-thirds\", \"gestalt-grouping\", \"rhythm-movement\"],\n flow: [\"rhythm-movement\", \"gestalt-grouping\"],\n movement: [\"rhythm-movement\", \"mark-making\"],\n rhythm: [\"rhythm-movement\", \"mark-making\"],\n focal: [\"rule-of-thirds\", \"visual-weight\", \"figure-ground\"],\n negative: [\"figure-ground\", \"visual-weight\"],\n space: [\"figure-ground\", \"visual-weight\", \"atmospheric-depth\"],\n // Color keywords\n palette: [\"color-harmony\", \"palette-generation\", \"color-mixing-strategy\"],\n color: [\"color-harmony\", \"color-temperature\", \"itten-contrasts\", \"color-mixing-strategy\"],\n warm: [\"color-temperature\", \"atmospheric-depth\"],\n cool: [\"color-temperature\", \"atmospheric-depth\"],\n contrast: [\"simultaneous-contrast\", \"itten-contrasts\", \"value-structure\"],\n value: [\"value-structure\", \"itten-contrasts\", \"layering-strategy\"],\n gray: [\"color-mixing-strategy\", \"value-structure\"],\n // Painting keywords\n watercolor: [\"watercolor-techniques\", \"layering-strategy\", \"material-behavior\"],\n ink: [\"ink-illustration\", \"mark-making\", \"material-behavior\"],\n oil: [\"painting-foundations\", \"layering-strategy\", \"material-behavior\"],\n charcoal: [\"material-behavior\", \"mark-making\"],\n brush: [\"mark-making\", \"material-behavior\"],\n layer: [\"layering-strategy\", \"mixed-media-workflow\", \"iterative-refinement\"],\n texture: [\"material-behavior\", \"mark-making\"],\n // Process keywords\n study: [\"thumbnail-studies\", \"creative-constraints\", \"iterative-refinement\"],\n thumbnail: [\"thumbnail-studies\", \"creative-constraints\"],\n refine: [\"iterative-refinement\", \"layering-strategy\"],\n iterate: [\"iterative-refinement\", \"thumbnail-studies\"],\n depth: [\"atmospheric-depth\", \"color-temperature\", \"value-structure\"],\n atmosphere: [\"atmospheric-depth\", \"color-temperature\"],\n perspective: [\"atmospheric-depth\"],\n constraint: [\"creative-constraints\"],\n limit: [\"creative-constraints\", \"color-mixing-strategy\"],\n hatch: [\"mark-making\", \"ink-illustration\"],\n stipple: [\"mark-making\"],\n gestural: [\"mark-making\", \"iterative-refinement\"],\n mix: [\"color-mixing-strategy\", \"mixed-media-workflow\"],\n glaze: [\"layering-strategy\", \"material-behavior\"],\n};\n\nexport async function suggestSkills(\n state: EditorState,\n input: SuggestSkillsInput,\n): Promise<Record<string, unknown>> {\n const allSkills = registry.list();\n const scored = new Map<string, { score: number; reasons: string[] }>();\n\n // Initialize all skills with base score\n for (const skill of allSkills) {\n scored.set(skill.id, { score: 0, reasons: [] });\n }\n\n // Score based on sketch context if a sketch is provided\n if (input.sketchId) {\n const loaded = state.getSketch(input.sketchId);\n if (loaded) {\n const sketch = loaded.definition;\n\n // Boost skills not already used by the sketch\n const usedSkills = new Set(sketch.skills ?? []);\n for (const skill of allSkills) {\n if (!usedSkills.has(skill.id)) {\n const entry = scored.get(skill.id)!;\n entry.score += 1;\n entry.reasons.push(\"not yet used in this sketch\");\n }\n }\n\n // Boost process skills based on compositionLevel\n const level = sketch.compositionLevel;\n if (level) {\n const levelSkills: Record<string, string[]> = {\n study: [\"thumbnail-studies\", \"creative-constraints\", \"iterative-refinement\"],\n sketch: [\"iterative-refinement\", \"mark-making\", \"layering-strategy\", \"color-mixing-strategy\"],\n developed: [\"layering-strategy\", \"material-behavior\", \"atmospheric-depth\", \"color-mixing-strategy\"],\n exhibition: [\"layering-strategy\", \"material-behavior\", \"atmospheric-depth\", \"iterative-refinement\", \"mark-making\"],\n };\n for (const id of levelSkills[level] ?? []) {\n const entry = scored.get(id);\n if (entry) {\n entry.score += 3;\n entry.reasons.push(`recommended for ${level}-level work`);\n }\n }\n }\n\n // Boost based on existing layers (painting-related skills)\n if (sketch.layers && sketch.layers.length > 0) {\n const layerTypes = sketch.layers.map((l) => l.type);\n if (layerTypes.some((t) => t.startsWith(\"painting:\"))) {\n for (const id of [\"layering-strategy\", \"material-behavior\", \"iterative-refinement\"]) {\n const entry = scored.get(id);\n if (entry) {\n entry.score += 2;\n entry.reasons.push(\"sketch uses painting layers\");\n }\n }\n }\n }\n }\n }\n\n // Score based on free-text context\n if (input.context) {\n const words = input.context.toLowerCase().split(/\\W+/);\n for (const word of words) {\n const matched = CONTEXT_KEYWORDS[word];\n if (matched) {\n for (const skillId of matched) {\n const entry = scored.get(skillId);\n if (entry) {\n entry.score += 2;\n if (!entry.reasons.includes(`matches context keyword \"${word}\"`)) {\n entry.reasons.push(`matches context keyword \"${word}\"`);\n }\n }\n }\n }\n }\n }\n\n // If no context clues at all, boost process skills as general recommendations\n if (!input.sketchId && !input.context) {\n for (const skill of allSkills) {\n if (skill.category === \"process\") {\n const entry = scored.get(skill.id)!;\n entry.score += 2;\n entry.reasons.push(\"process knowledge is broadly applicable\");\n }\n }\n }\n\n // Sort by score descending, take top 5\n const ranked = allSkills\n .map((skill) => ({\n id: skill.id,\n name: skill.name,\n category: skill.category,\n complexity: skill.complexity,\n description: skill.description,\n relevanceScore: scored.get(skill.id)!.score,\n rationale: scored.get(skill.id)!.reasons,\n }))\n .filter((s) => s.relevanceScore > 0)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n .slice(0, 5);\n\n return {\n success: true,\n suggestions: ranked,\n total: ranked.length,\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 { exec } from \"child_process\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { dirname, join } from \"path\";\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/** Open a file in the system viewer (macOS: Preview.app, Linux: xdg-open, Windows: start). */\nfunction openPreview(filePath: string): void {\n const cmd =\n process.platform === \"darwin\" ? \"open\" :\n process.platform === \"win32\" ? \"start\" :\n \"xdg-open\";\n exec(`${cmd} \"${filePath}\"`, (err) => {\n if (err) console.error(`[openPreview] failed: ${err.message}`);\n });\n}\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 snapshot PNG path: <workspace-dir>/snapshots/<sketchId>-<seed>-preview.png */\nfunction deriveSnapshotPath(\n sketchPath: string,\n sketchId: string,\n seed: number,\n): string {\n const wsDir = dirname(sketchPath);\n return join(wsDir, \"snapshots\", `${sketchId}-${seed}-preview.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 effectiveSeed = input.seed ?? sketch.state.seed;\n const previewPath = deriveSnapshotPath(loaded.path, sketchId, effectiveSeed);\n const metadata = await buildScreenshotMetadata(state, multi, {\n target,\n sketchId,\n seed: effectiveSeed,\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 /** Auto-open the preview in the system image viewer (default: true in local mode). */\n autoOpen?: boolean;\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: ensure snapshots/ directory exists, then write preview PNG\n await mkdir(dirname(info.previewPath), { recursive: true });\n await writeFile(info.previewPath, multi.previewPng);\n metadata.savedPreviewTo = info.previewPath;\n metadata.previewWritten = true;\n // Auto-open in system viewer so the user sees the render immediately\n if (info.autoOpen !== false) {\n openPreview(info.previewPath);\n }\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 effectiveSeed = input.seed ?? sketch.state.seed;\n const previewPath = deriveSnapshotPath(loaded.path, id, effectiveSeed);\n const itemMetadata = await buildScreenshotMetadata(state, multi, {\n target: \"sketch\",\n sketchId: id,\n seed: effectiveSeed,\n previewPath,\n autoOpen: false, // Don't flood windows for batch captures\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\nimport puppeteer from \"puppeteer\";\n\ntype Browser = Awaited<ReturnType<typeof puppeteer.launch>>;\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 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 * Critique tools — Phase 2: Perception & Self-Critique (ADR 053).\n * critique_sketch, compare_sketches\n *\n * Each tool captures a screenshot and returns a structured critique framework\n * (questions, principles, pitfalls) per aspect. Critique severity calibrates\n * to the sketch's compositionLevel.\n */\n\nimport { createDefaultSkillRegistry } from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\nimport { captureScreenshot, captureBatch, type CaptureScreenshotResult, type BatchItemResult } from \"./capture.js\";\n\nconst registry = createDefaultSkillRegistry();\n\n// ---------------------------------------------------------------------------\n// Aspect definitions\n// ---------------------------------------------------------------------------\n\n/** Aspects the agent can self-critique. */\nexport type CritiqueAspect =\n | \"composition\"\n | \"color\"\n | \"rhythm\"\n | \"unity\"\n | \"expression\";\n\nexport const ALL_ASPECTS: readonly CritiqueAspect[] = [\n \"composition\",\n \"color\",\n \"rhythm\",\n \"unity\",\n \"expression\",\n];\n\n/** Per-aspect framework: questions to ask, principles to check, pitfalls to watch for. */\ninterface AspectFramework {\n aspect: CritiqueAspect;\n questions: string[];\n principles: string[];\n pitfalls: string[];\n}\n\n/** Composition level type (matches @genart-dev/format CompositionLevel). */\ntype CompositionLevel = \"study\" | \"sketch\" | \"developed\" | \"exhibition\";\n\n/** Severity calibration per composition level. */\ninterface SeverityCalibration {\n level: CompositionLevel;\n description: string;\n focus: string;\n tolerance: string;\n}\n\nconst SEVERITY: Record<string, SeverityCalibration> = {\n study: {\n level: \"study\",\n description: \"Fast, exploratory — value the energy of discovery over polish\",\n focus: \"Is the core idea visible? Does the sketch capture a single insight?\",\n tolerance: \"High tolerance for roughness, imbalance, and incomplete resolution. Studies should feel alive, not finished.\",\n },\n sketch: {\n level: \"sketch\",\n description: \"Intentional but rough — the idea should read clearly\",\n focus: \"Do composition and color serve the concept? Are parameters well-chosen?\",\n tolerance: \"Moderate tolerance. Unresolved edges and raw marks are fine, but the structure should be deliberate.\",\n },\n developed: {\n level: \"developed\",\n description: \"Refined — every major decision should be justified\",\n focus: \"Do all elements work together? Is there a clear visual hierarchy? Does the palette feel cohesive?\",\n tolerance: \"Low tolerance for accidental imbalance. Rough areas should be intentional, not neglected.\",\n },\n exhibition: {\n level: \"exhibition\",\n description: \"Polished — every element earns its place\",\n focus: \"Could you defend every choice? Does the piece hold up under sustained viewing? Is the concept fully realized?\",\n tolerance: \"Minimal tolerance. Each mark, color, and spatial relationship should feel inevitable.\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Aspect framework builders\n// ---------------------------------------------------------------------------\n\nfunction buildCompositionFramework(): AspectFramework {\n return {\n aspect: \"composition\",\n questions: [\n \"Where does the eye land first? Is that the intended focal point?\",\n \"Is there a clear visual hierarchy (primary, secondary, tertiary)?\",\n \"How does the composition use the edges and corners of the canvas?\",\n \"Is negative space working actively or is it leftover?\",\n \"Does the arrangement feel balanced or intentionally unbalanced?\",\n ],\n principles: [\n \"Visual weight distribution — dense, dark, saturated, or detailed areas carry more weight\",\n \"Entry points and eye paths — the viewer needs a way in and a journey through the piece\",\n \"Edge tension — elements near canvas edges create tension; use this deliberately\",\n \"Rule of thirds / golden ratio — useful starting points, not rigid rules\",\n \"Figure-ground clarity — the relationship between positive and negative space\",\n ],\n pitfalls: [\n \"Centering everything — creates static compositions unless intentionally symmetrical\",\n \"Filling the canvas uniformly — denies the viewer rest areas and focal emphasis\",\n \"Tangent lines — elements barely touching edges or each other create visual discomfort\",\n \"Competing focal points — multiple areas of equal emphasis confuse the eye\",\n \"Ignoring the canvas aspect ratio — composition should respond to the format\",\n ],\n };\n}\n\nfunction buildColorFramework(): AspectFramework {\n return {\n aspect: \"color\",\n questions: [\n \"Does the palette feel intentional or arbitrary?\",\n \"Is there a dominant color temperature (warm/cool) or a deliberate tension between them?\",\n \"How many distinct hues are active? Is that number serving the concept?\",\n \"Are value contrasts (light/dark) creating readable structure?\",\n \"Do any colors feel out of place — or is dissonance intentional?\",\n ],\n principles: [\n \"Color harmony — analogous, complementary, triadic, or split-complementary relationships\",\n \"Value structure — squint at the piece; the composition should read in grayscale\",\n \"Temperature as depth — warm advances, cool recedes (atmospheric perspective)\",\n \"Saturation as emphasis — high saturation draws the eye; use it sparingly for focus\",\n \"Color proportion — unequal amounts create interest (e.g., 60-30-10 ratio)\",\n ],\n pitfalls: [\n \"Too many fully saturated colors competing for attention\",\n \"No value range — all mid-tones flatten the piece\",\n \"Random color assignment — palette should derive from concept, not just randomness\",\n \"Ignoring simultaneous contrast — adjacent colors alter each other's appearance\",\n \"Uniform opacity everywhere — varying transparency adds depth and atmosphere\",\n ],\n };\n}\n\nfunction buildRhythmFramework(): AspectFramework {\n return {\n aspect: \"rhythm\",\n questions: [\n \"Is there a repeating visual motif or interval?\",\n \"Does the rhythm accelerate, decelerate, or remain steady?\",\n \"Are there moments of syncopation — unexpected breaks in the pattern?\",\n \"Does the rhythm contribute to or fight against the composition?\",\n \"Is there scale variation — does the motif appear at multiple sizes?\",\n ],\n principles: [\n \"Regular rhythm creates calm and order; irregular rhythm creates energy\",\n \"Progressive rhythm (gradual change) creates movement and depth\",\n \"Alternating rhythm adds complexity without chaos\",\n \"Rhythm at multiple scales (fractal repetition) creates richness\",\n \"Silence (empty intervals) is as important as sound (marked intervals)\",\n ],\n pitfalls: [\n \"Perfectly regular grids without variation feel mechanical, not generative\",\n \"Random distribution reads as noise, not rhythm\",\n \"Single-scale repetition feels monotonous — vary size, spacing, or density\",\n \"Rhythm that ignores the composition's focal structure\",\n \"Over-complexity — too many overlapping rhythms create visual noise\",\n ],\n };\n}\n\nfunction buildUnityFramework(): AspectFramework {\n return {\n aspect: \"unity\",\n questions: [\n \"Does the piece feel like one cohesive work or disconnected parts?\",\n \"Is there a unifying visual language (consistent mark quality, shape vocabulary)?\",\n \"Do the parameters work together or do some feel bolted on?\",\n \"Would removing any element weaken the whole?\",\n \"Does the algorithm express a single clear idea?\",\n ],\n principles: [\n \"Unity through repetition — shared elements tie the composition together\",\n \"Unity through proximity — grouped elements feel related\",\n \"Unity through continuation — aligned elements create visual connections\",\n \"Variety within unity — enough variation to hold interest, enough consistency to cohere\",\n \"Conceptual unity — all visual decisions serve the stated philosophy\",\n ],\n pitfalls: [\n \"Feature accumulation — adding elements that don't serve the core concept\",\n \"Inconsistent mark quality — mixing precise geometry with organic marks without intention\",\n \"Disconnected color and form — palette that doesn't relate to the spatial structure\",\n \"Parameter sprawl — too many controls that don't interact meaningfully\",\n \"Style mixing without integration — combining techniques that don't speak to each other\",\n ],\n };\n}\n\nfunction buildExpressionFramework(): AspectFramework {\n return {\n aspect: \"expression\",\n questions: [\n \"What mood or feeling does this piece evoke?\",\n \"Is the generative process visible in the output? Should it be?\",\n \"Does the algorithm's logic contribute to the emotional quality?\",\n \"Is there a sense of the unexpected — does the piece surprise even its creator?\",\n \"Does the philosophy statement match the visual experience?\",\n ],\n principles: [\n \"Generative art is a conversation between intention and emergence\",\n \"The algorithm is a medium — its constraints and affordances shape expression\",\n \"Controlled randomness creates life; pure randomness creates noise\",\n \"The seed is a collaborator — different seeds should produce meaningfully different moods\",\n \"Process and result are both the artwork — the code embodies artistic decisions\",\n ],\n pitfalls: [\n \"Over-control — leaving no room for generative surprise\",\n \"Under-control — no discernible artistic intention behind the randomness\",\n \"Technique as end — impressive code that produces emotionally flat output\",\n \"Derivative work — reproducing established generative art tropes without adding perspective\",\n \"Mismatched intent — the philosophy says one thing but the visual says another\",\n ],\n };\n}\n\nconst ASPECT_BUILDERS: Record<CritiqueAspect, () => AspectFramework> = {\n composition: buildCompositionFramework,\n color: buildColorFramework,\n rhythm: buildRhythmFramework,\n unity: buildUnityFramework,\n expression: buildExpressionFramework,\n};\n\n// ---------------------------------------------------------------------------\n// critique_sketch\n// ---------------------------------------------------------------------------\n\nexport interface CritiqueSketchInput {\n sketchId?: string;\n aspects?: CritiqueAspect[];\n previewSize?: number;\n}\n\nexport interface CritiqueSketchResult {\n /** JSON-safe critique framework for the text content block. */\n metadata: Record<string, unknown>;\n /** Small JPEG as base64 for MCP image content block. */\n previewJpegBase64: string;\n}\n\nexport async function critiqueSketch(\n state: EditorState,\n input: CritiqueSketchInput,\n): Promise<CritiqueSketchResult> {\n state.requireWorkspace();\n\n // Resolve sketch ID\n let sketchId: string;\n if (input.sketchId) {\n sketchId = input.sketchId;\n } else if (state.selection.size > 0) {\n sketchId = [...state.selection][0]!;\n } else {\n throw new Error(\"No sketch specified and nothing selected\");\n }\n\n const loaded = state.requireSketch(sketchId);\n const sketch = loaded.definition;\n\n // Capture screenshot for visual analysis\n const capture: CaptureScreenshotResult = await captureScreenshot(state, {\n target: \"sketch\",\n sketchId,\n previewSize: input.previewSize ?? 400,\n });\n\n // Determine which aspects to critique\n const aspects = input.aspects ?? [...ALL_ASPECTS];\n\n // Build frameworks\n const frameworks = aspects.map((a) => ASPECT_BUILDERS[a]());\n\n // Determine severity calibration\n const level = sketch.compositionLevel ?? \"sketch\";\n const severity = SEVERITY[level] ?? SEVERITY[\"sketch\"]!;\n\n // Gather relevant skills as context\n const relevantSkills = gatherRelevantSkills(aspects);\n\n const metadata: Record<string, unknown> = {\n success: true,\n sketchId,\n title: sketch.title,\n compositionLevel: level,\n philosophy: sketch.philosophy ?? null,\n severity: {\n level: severity.level,\n description: severity.description,\n focus: severity.focus,\n tolerance: severity.tolerance,\n },\n frameworks,\n relevantSkills,\n instructions: [\n \"Use the image above and the frameworks below to perform a structured self-critique.\",\n `Calibrate your critique to the ${severity.level} level: ${severity.description}`,\n \"For each aspect, answer the questions, check the principles, and watch for the pitfalls.\",\n \"Be honest but constructive — identify what works as well as what could improve.\",\n \"End with 2-3 specific, actionable improvements ranked by impact.\",\n ],\n };\n\n return {\n metadata,\n previewJpegBase64: capture.previewJpegBase64,\n };\n}\n\n// ---------------------------------------------------------------------------\n// compare_sketches\n// ---------------------------------------------------------------------------\n\nexport interface CompareSketchesInput {\n sketchIds: string[];\n aspects?: CritiqueAspect[];\n previewSize?: number;\n}\n\nexport interface CompareSketchesResult {\n /** JSON-safe comparison framework. */\n metadata: Record<string, unknown>;\n /** Per-sketch inline JPEG base64 strings. */\n previews: Array<{ sketchId: string; inlineJpegBase64: string }>;\n}\n\nexport async function compareSketches(\n state: EditorState,\n input: CompareSketchesInput,\n): Promise<CompareSketchesResult> {\n state.requireWorkspace();\n\n const ids = input.sketchIds;\n if (ids.length < 2) {\n throw new Error(\"compare_sketches requires at least 2 sketch IDs\");\n }\n if (ids.length > 4) {\n throw new Error(\"compare_sketches supports a maximum of 4 sketches\");\n }\n\n // Validate all sketches exist\n const sketchInfos = ids.map((id) => {\n const loaded = state.requireSketch(id);\n return {\n id,\n title: loaded.definition.title,\n compositionLevel: loaded.definition.compositionLevel ?? \"sketch\",\n philosophy: loaded.definition.philosophy ?? null,\n renderer: loaded.definition.renderer.type,\n seed: loaded.definition.state.seed,\n };\n });\n\n // Batch capture all sketches\n const batchResult = await captureBatch(state, {\n sketchIds: ids,\n previewSize: input.previewSize ?? 300,\n });\n\n // Build previews array matched by sketch ID\n const previews = batchResult.items.map((item: BatchItemResult) => ({\n sketchId: (item.metadata as Record<string, unknown>)[\"sketchId\"] as string,\n inlineJpegBase64: item.inlineJpegBase64,\n }));\n\n // Determine aspects\n const aspects = input.aspects ?? [...ALL_ASPECTS];\n const frameworks = aspects.map((a) => ASPECT_BUILDERS[a]());\n\n // Build comparison-specific questions per aspect\n const comparisonQuestions = aspects.map((aspect) => ({\n aspect,\n questions: buildComparisonQuestions(aspect, sketchInfos.length),\n }));\n\n const metadata: Record<string, unknown> = {\n success: true,\n sketches: sketchInfos,\n aspects,\n frameworks,\n comparisonQuestions,\n instructions: [\n `Compare the ${ids.length} sketches shown above across the specified aspects.`,\n \"For each aspect, use the framework questions and comparison questions to analyze differences.\",\n \"Identify which sketch handles each aspect most effectively and why.\",\n \"Note where sketches complement each other — techniques from one could improve another.\",\n \"End with a ranking per aspect and overall, with specific observations justifying each placement.\",\n ],\n };\n\n return { metadata, previews };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Build comparison-specific questions for an aspect. */\nfunction buildComparisonQuestions(\n aspect: CritiqueAspect,\n count: number,\n): string[] {\n const base: Record<CritiqueAspect, string[]> = {\n composition: [\n \"Which sketch has the strongest focal point?\",\n \"How do the compositions differ in their use of space?\",\n \"Which creates the most effective visual hierarchy?\",\n ],\n color: [\n \"Which palette feels most intentional?\",\n \"How do the value ranges compare — which has the strongest lights and darks?\",\n \"Which color temperature creates the most effective mood?\",\n ],\n rhythm: [\n \"Which sketch has the most engaging visual rhythm?\",\n \"How do the rhythmic structures differ — regular vs progressive vs irregular?\",\n \"Which achieves the best balance of repetition and variation?\",\n ],\n unity: [\n \"Which sketch feels most cohesive as a single work?\",\n \"Where does unity break down in each — what elements feel disconnected?\",\n \"Which has the tightest relationship between concept and execution?\",\n ],\n expression: [\n \"Which sketch evokes the strongest emotional response?\",\n \"How does each sketch's generative process contribute to its expression?\",\n \"Which most successfully balances intention with emergence?\",\n ],\n };\n\n const questions = [...base[aspect]];\n if (count > 2) {\n questions.push(\n `Could elements from different sketches be combined to create something stronger?`,\n );\n }\n return questions;\n}\n\n/** Gather skill summaries relevant to the requested aspects. */\nfunction gatherRelevantSkills(\n aspects: CritiqueAspect[],\n): Array<{ id: string; name: string; relevantTo: CritiqueAspect }> {\n const aspectToCategory: Record<CritiqueAspect, string[]> = {\n composition: [\"composition\"],\n color: [\"color\"],\n rhythm: [\"composition\"],\n unity: [\"composition\", \"color\"],\n expression: [\"process\"],\n };\n\n const seen = new Set<string>();\n const result: Array<{ id: string; name: string; relevantTo: CritiqueAspect }> = [];\n\n for (const aspect of aspects) {\n const categories = aspectToCategory[aspect];\n for (const cat of categories) {\n const skills = registry.list(cat);\n for (const skill of skills) {\n if (!seen.has(skill.id)) {\n seen.add(skill.id);\n result.push({ id: skill.id, name: skill.name, relevantTo: aspect });\n }\n }\n }\n }\n\n return result;\n}\n","/**\n * Series & conceptual development tools — Phase 3 (ADRs 054, 056).\n * create_series, develop_concept, series_summary, promote_sketch\n */\n\nimport { writeFile } from \"fs/promises\";\nimport { basename, dirname, resolve } from \"path\";\nimport {\n serializeGenart,\n serializeWorkspace,\n type CompositionLevel,\n type SeriesStage,\n type SketchDefinition,\n type WorkspaceSeries,\n} from \"@genart-dev/core\";\nimport type { EditorState } from \"../state.js\";\nimport { captureBatch, type BatchItemResult } from \"./capture.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\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\nconst VALID_STAGES: readonly SeriesStage[] = [\n \"studies\",\n \"drafts\",\n \"refinements\",\n \"finals\",\n];\n\n/** Map from stage to recommended compositionLevel. */\nconst STAGE_TO_LEVEL: Record<SeriesStage, CompositionLevel> = {\n studies: \"study\",\n drafts: \"sketch\",\n refinements: \"developed\",\n finals: \"exhibition\",\n};\n\n/** Map from compositionLevel to recommended next stage. */\nconst LEVEL_TO_NEXT_STAGE: Record<CompositionLevel, SeriesStage | null> = {\n study: \"drafts\",\n sketch: \"refinements\",\n developed: \"finals\",\n exhibition: null,\n};\n\n/** Canvas scale factor per compositionLevel. */\nconst LEVEL_SCALE: Record<CompositionLevel, number> = {\n study: 1,\n sketch: 1,\n developed: 1.5,\n exhibition: 2,\n};\n\n// ---------------------------------------------------------------------------\n// create_series\n// ---------------------------------------------------------------------------\n\nexport interface CreateSeriesInput {\n label: string;\n narrative: string;\n intent: string;\n progression?: string;\n stages?: SeriesStage[];\n sketchFiles?: string[];\n}\n\nexport async function createSeries(\n state: EditorState,\n input: CreateSeriesInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n // Generate a kebab-case ID from the label\n const id = input.label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (!id) {\n throw new Error(\"Could not derive a valid ID from the label\");\n }\n\n // Check for duplicate series ID\n if (ws.series?.some((s) => s.id === id)) {\n throw new Error(`Series with ID '${id}' already exists in workspace`);\n }\n\n const stages = input.stages ?? [...VALID_STAGES];\n\n // Validate stages\n for (const stage of stages) {\n if (!VALID_STAGES.includes(stage)) {\n throw new Error(\n `Invalid stage: '${stage}'. Valid stages: ${VALID_STAGES.join(\", \")}`,\n );\n }\n }\n\n // Validate sketch files exist in workspace\n const sketchFiles = input.sketchFiles ?? [];\n for (const file of sketchFiles) {\n const found = ws.sketches.some((s) => s.file === file);\n if (!found) {\n throw new Error(\n `Sketch file '${file}' not found in workspace`,\n );\n }\n }\n\n const series: WorkspaceSeries = {\n id,\n label: input.label,\n narrative: input.narrative,\n intent: input.intent,\n ...(input.progression ? { progression: input.progression } : {}),\n stages,\n sketchFiles,\n };\n\n // Update workspace\n state.workspace = {\n ...ws,\n modified: now(),\n series: [...(ws.series ?? []), series],\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(\"workspace:updated\", { seriesAdded: id });\n\n return {\n success: true,\n series: {\n id,\n label: input.label,\n narrative: input.narrative,\n intent: input.intent,\n stages,\n sketchCount: sketchFiles.length,\n },\n workspaceContent: workspaceJson,\n };\n}\n\n// ---------------------------------------------------------------------------\n// develop_concept\n// ---------------------------------------------------------------------------\n\nexport interface DevelopConceptInput {\n concept: string;\n medium?: string;\n}\n\nexport async function developConcept(\n _state: EditorState,\n input: DevelopConceptInput,\n): Promise<Record<string, unknown>> {\n // This tool returns a structured concept plan for the agent to execute.\n // It doesn't modify state — it provides a framework for creative development.\n\n const medium = input.medium ?? \"p5\";\n\n return {\n success: true,\n conceptPlan: {\n concept: input.concept,\n medium,\n mood: {\n instruction: \"Define the emotional quality this concept should evoke.\",\n prompts: [\n \"What feeling should the viewer experience?\",\n \"Is this contemplative, energetic, unsettling, serene?\",\n \"What time of day, season, or environment does this concept suggest?\",\n ],\n },\n palette: {\n instruction: \"Design a color strategy that serves the mood.\",\n prompts: [\n \"What color temperature dominates (warm/cool)?\",\n \"How many distinct hues are needed?\",\n \"Should saturation be high (bold, graphic) or low (subtle, atmospheric)?\",\n \"What value range (light-to-dark contrast) supports the concept?\",\n ],\n },\n composition: {\n instruction: \"Plan the spatial structure.\",\n prompts: [\n \"Where should the viewer's eye land first?\",\n \"Is the composition centered, asymmetric, or edge-driven?\",\n \"How does negative space contribute to the concept?\",\n \"What rhythm (regular, progressive, chaotic) serves the idea?\",\n ],\n },\n skills: {\n instruction: \"Identify design skills to load for this concept.\",\n prompts: [\n \"Which composition skill applies (rule-of-thirds, golden-ratio, gestalt)?\",\n \"Which color skill applies (color-harmony, color-temperature, simultaneous-contrast)?\",\n \"Are there process skills needed (layering-strategy, iterative-refinement, thumbnail-studies)?\",\n \"Consider using `suggest_skills` with the concept as context.\",\n ],\n },\n seriesStructure: {\n instruction: \"Plan the body of work.\",\n prompts: [\n \"How many studies should explore the core idea (3-6 recommended)?\",\n \"What aspect varies between studies (color, density, rhythm, scale)?\",\n \"Which studies should be developed further into drafts?\",\n \"What progression tells the most compelling story?\",\n ],\n recommendedStages: [\"studies\", \"drafts\", \"refinements\", \"finals\"],\n },\n },\n nextSteps: [\n \"1. Use `create_series` with a label, narrative, and intent derived from this plan.\",\n \"2. Create 3-6 study-level sketches using `create_sketch` with compositionLevel: 'study'.\",\n \"3. Use `critique_sketch` on each study to evaluate against the concept.\",\n \"4. Use `promote_sketch` to advance the best studies to drafts.\",\n \"5. Iterate: critique → refine → promote through stages.\",\n \"6. Use `series_summary` to capture the full progression.\",\n ],\n };\n}\n\n// ---------------------------------------------------------------------------\n// series_summary\n// ---------------------------------------------------------------------------\n\nexport interface SeriesSummaryInput {\n seriesId: string;\n captureScreenshots?: boolean;\n previewSize?: number;\n}\n\nexport interface SeriesSummaryResult {\n metadata: Record<string, unknown>;\n previews?: Array<{ sketchId: string; inlineJpegBase64: string }>;\n}\n\nexport async function seriesSummary(\n state: EditorState,\n input: SeriesSummaryInput,\n): Promise<SeriesSummaryResult> {\n const ws = state.requireWorkspace();\n\n const series = ws.series?.find((s) => s.id === input.seriesId);\n if (!series) {\n throw new Error(`Series '${input.seriesId}' not found in workspace`);\n }\n\n // Gather sketch info for each file in the series\n const sketchInfos: Array<Record<string, unknown>> = [];\n const loadedIds: string[] = [];\n\n for (const file of series.sketchFiles) {\n // Find the sketch by file name\n let found = false;\n for (const [id, loaded] of state.sketches) {\n if (basename(loaded.path) === file) {\n const def = loaded.definition;\n sketchInfos.push({\n id,\n title: def.title,\n file,\n compositionLevel: def.compositionLevel ?? \"sketch\",\n lineage: def.lineage ?? null,\n renderer: def.renderer.type,\n canvas: `${def.canvas.width}x${def.canvas.height}`,\n seed: def.state.seed,\n parameterCount: def.parameters.length,\n colorCount: def.colors.length,\n philosophy: def.philosophy ?? null,\n });\n loadedIds.push(id);\n found = true;\n break;\n }\n }\n if (!found) {\n sketchInfos.push({ file, status: \"not loaded\" });\n }\n }\n\n // Optionally capture screenshots\n let previews: Array<{ sketchId: string; inlineJpegBase64: string }> | undefined;\n if (input.captureScreenshots !== false && loadedIds.length > 0) {\n const batchResult = await captureBatch(state, {\n sketchIds: loadedIds,\n previewSize: input.previewSize ?? 300,\n });\n previews = batchResult.items.map((item: BatchItemResult) => ({\n sketchId: (item.metadata as Record<string, unknown>)[\"sketchId\"] as string,\n inlineJpegBase64: item.inlineJpegBase64,\n }));\n }\n\n const metadata: Record<string, unknown> = {\n success: true,\n series: {\n id: series.id,\n label: series.label,\n narrative: series.narrative,\n intent: series.intent,\n progression: series.progression ?? null,\n stages: series.stages ?? null,\n },\n sketches: sketchInfos,\n summary: {\n totalSketches: series.sketchFiles.length,\n loadedSketches: loadedIds.length,\n compositionLevels: countBy(\n sketchInfos\n .filter((s) => s[\"compositionLevel\"])\n .map((s) => s[\"compositionLevel\"] as string),\n ),\n },\n instructions: [\n \"Review the series progression from studies through finals.\",\n \"Evaluate whether the narrative and intent are reflected in the body of work.\",\n \"Consider: does each sketch build on its predecessors? Is there a clear evolution?\",\n \"Identify the strongest and weakest pieces. What makes them succeed or fail?\",\n \"Document insights and decisions in the series narrative.\",\n ],\n };\n\n return { metadata, previews };\n}\n\n// ---------------------------------------------------------------------------\n// promote_sketch\n// ---------------------------------------------------------------------------\n\nexport interface PromoteSketchInput {\n sketchId: string;\n toStage: SeriesStage;\n seriesId?: string;\n newId?: string;\n title?: string;\n agent?: string;\n model?: string;\n}\n\nexport async function promoteSketch(\n state: EditorState,\n input: PromoteSketchInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n const source = state.requireSketch(input.sketchId);\n const sourceDef = source.definition;\n\n // Validate stage\n if (!VALID_STAGES.includes(input.toStage)) {\n throw new Error(\n `Invalid stage: '${input.toStage}'. Valid stages: ${VALID_STAGES.join(\", \")}`,\n );\n }\n\n // Determine the target compositionLevel from the stage\n const targetLevel = STAGE_TO_LEVEL[input.toStage];\n const scale = LEVEL_SCALE[targetLevel];\n\n // Generate new ID\n const newId =\n input.newId ?? `${input.sketchId}-${input.toStage.replace(/s$/, \"\")}`;\n validateKebabId(newId);\n\n if (state.getSketch(newId)) {\n throw new Error(`Sketch with ID '${newId}' already exists`);\n }\n\n // Scale canvas\n const newWidth = Math.round(sourceDef.canvas.width * scale);\n const newHeight = Math.round(sourceDef.canvas.height * scale);\n\n // Build lineage\n const sourceGeneration = sourceDef.lineage?.generation ?? 1;\n\n const title =\n input.title ??\n `${sourceDef.title} (${input.toStage.replace(/s$/, \"\")})`;\n const ts = now();\n\n const promotedDef: SketchDefinition = {\n genart: \"1.1\",\n id: newId,\n title,\n created: ts,\n modified: ts,\n renderer: sourceDef.renderer,\n canvas: { width: newWidth, height: newHeight },\n parameters: [...sourceDef.parameters],\n colors: [...sourceDef.colors],\n state: {\n seed: sourceDef.state.seed,\n params: { ...sourceDef.state.params },\n colorPalette: [...sourceDef.state.colorPalette],\n },\n algorithm: sourceDef.algorithm,\n compositionLevel: targetLevel,\n lineage: {\n parentId: input.sketchId,\n parentTitle: sourceDef.title,\n generation: sourceGeneration + 1,\n },\n ...(sourceDef.philosophy ? { philosophy: sourceDef.philosophy } : {}),\n ...(sourceDef.themes ? { themes: [...sourceDef.themes] } : {}),\n ...(sourceDef.skills ? { skills: [...sourceDef.skills] } : {}),\n ...(sourceDef.components ? { components: sourceDef.components } : {}),\n ...(sourceDef.symbols ? { symbols: sourceDef.symbols } : {}),\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.model ? { model: input.model } : {}),\n };\n\n // Save to disk\n const sourceDir = dirname(source.path);\n const newPath = resolve(sourceDir, `${newId}.genart`);\n const json = serializeGenart(promotedDef);\n\n if (!state.remoteMode) {\n await writeFile(newPath, json, \"utf-8\");\n }\n\n // Load into state\n state.sketches.set(newId, { definition: promotedDef, path: newPath });\n\n // Auto-position below the source sketch\n const sourceRef = ws.sketches.find(\n (s) => s.file === basename(source.path),\n );\n const position = sourceRef\n ? { x: sourceRef.position.x, y: sourceRef.position.y + sourceDef.canvas.height + 200 }\n : { x: 0, y: 0 };\n\n // Add to workspace sketches\n const file = basename(newPath);\n state.workspace = {\n ...ws,\n modified: ts,\n sketches: [...ws.sketches, { file, position }],\n };\n\n // Add to series if specified\n if (input.seriesId) {\n const seriesIndex = state.workspace.series?.findIndex(\n (s) => s.id === input.seriesId,\n );\n if (seriesIndex !== undefined && seriesIndex >= 0 && state.workspace.series) {\n const series = state.workspace.series[seriesIndex]!;\n const updatedSeries: WorkspaceSeries = {\n ...series,\n sketchFiles: [...series.sketchFiles, file],\n };\n state.workspace = {\n ...state.workspace,\n series: state.workspace.series.map((s, i) =>\n i === seriesIndex ? updatedSeries : s,\n ),\n };\n }\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: newId, path: newPath });\n state.emitMutation(\"workspace:updated\", { added: file });\n\n return {\n success: true,\n sourceId: input.sketchId,\n promotedSketch: {\n id: newId,\n title,\n path: newPath,\n compositionLevel: targetLevel,\n stage: input.toStage,\n canvas: { width: newWidth, height: newHeight },\n position,\n lineage: promotedDef.lineage,\n },\n ...(scale > 1\n ? {\n canvasUpscaled: `Canvas scaled ${scale}x: ${sourceDef.canvas.width}x${sourceDef.canvas.height} → ${newWidth}x${newHeight}`,\n }\n : {}),\n fileContent: json,\n workspaceContent: workspaceJson,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction countBy(items: string[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const item of items) {\n counts[item] = (counts[item] ?? 0) + 1;\n }\n return counts;\n}\n","/**\n * Reference & inspiration tools — Phase 4 (ADR 057).\n * add_reference, analyze_reference, extract_palette\n */\n\nimport { copyFile, mkdir, readFile } from \"fs/promises\";\nimport { basename, dirname, extname, resolve } from \"path\";\nimport {\n serializeGenart,\n serializeWorkspace,\n type Reference,\n type ReferenceAnalysis,\n type ReferenceType,\n type SketchDefinition,\n type WorkspaceSeries,\n} from \"@genart-dev/core\";\nimport { writeFile } from \"fs/promises\";\nimport type { EditorState } from \"../state.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nconst KEBAB_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\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\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".bmp\", \".tiff\", \".svg\",\n]);\n\nfunction isImageFile(path: string): boolean {\n return IMAGE_EXTENSIONS.has(extname(path).toLowerCase());\n}\n\nconst VALID_REFERENCE_TYPES: readonly ReferenceType[] = [\n \"image\", \"artwork\", \"photograph\", \"texture\", \"palette\",\n];\n\n// ---------------------------------------------------------------------------\n// add_reference\n// ---------------------------------------------------------------------------\n\nexport interface AddReferenceInput {\n image: string;\n type?: ReferenceType;\n source?: string;\n seriesId?: string;\n sketchId?: string;\n id?: string;\n}\n\nexport async function addReference(\n state: EditorState,\n input: AddReferenceInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n if (!isImageFile(input.image)) {\n throw new Error(\n `Not a recognized image file: ${input.image}. Supported: ${[...IMAGE_EXTENSIONS].join(\", \")}`,\n );\n }\n\n // Generate ID from filename if not provided\n const id =\n input.id ??\n basename(input.image, extname(input.image))\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (!id) {\n throw new Error(\"Could not derive a valid ID from the image filename\");\n }\n validateKebabId(id);\n\n const refType = input.type ?? \"image\";\n if (!VALID_REFERENCE_TYPES.includes(refType)) {\n throw new Error(\n `Invalid reference type: '${refType}'. Valid types: ${VALID_REFERENCE_TYPES.join(\", \")}`,\n );\n }\n\n // Copy image to workspace references/ directory\n const workspaceDir = dirname(state.workspacePath!);\n const refsDir = resolve(workspaceDir, \"references\");\n await mkdir(refsDir, { recursive: true });\n\n const ext = extname(input.image);\n const destFilename = `${id}${ext}`;\n const destPath = resolve(refsDir, destFilename);\n const relativePath = `references/${destFilename}`;\n\n if (!state.remoteMode) {\n await copyFile(resolve(input.image), destPath);\n }\n\n const ref: Reference = {\n id,\n type: refType,\n path: relativePath,\n ...(input.source ? { source: input.source } : {}),\n };\n\n // Determine what to attach to\n let attachedTo: string;\n let workspaceJson: string | undefined;\n let sketchJson: string | undefined;\n\n if (input.sketchId) {\n // Attach to a specific sketch\n const loaded = state.requireSketch(input.sketchId);\n const existingRefs = loaded.definition.references ?? [];\n\n if (existingRefs.some((r) => r.id === id)) {\n throw new Error(\n `Reference with ID '${id}' already exists on sketch '${input.sketchId}'`,\n );\n }\n\n const updatedDef: SketchDefinition = {\n ...loaded.definition,\n modified: now(),\n references: [...existingRefs, ref],\n };\n\n state.sketches.set(input.sketchId, {\n definition: updatedDef,\n path: loaded.path,\n });\n\n sketchJson = serializeGenart(updatedDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, sketchJson, \"utf-8\");\n }\n\n attachedTo = `sketch:${input.sketchId}`;\n state.emitMutation(\"sketch:updated\", { id: input.sketchId });\n } else if (input.seriesId) {\n // Attach to a series\n const seriesIndex = ws.series?.findIndex((s) => s.id === input.seriesId);\n if (seriesIndex === undefined || seriesIndex < 0 || !ws.series) {\n throw new Error(`Series '${input.seriesId}' not found in workspace`);\n }\n\n const series = ws.series[seriesIndex]!;\n const existingRefs = series.references ?? [];\n\n if (existingRefs.some((r) => r.id === id)) {\n throw new Error(\n `Reference with ID '${id}' already exists on series '${input.seriesId}'`,\n );\n }\n\n const updatedSeries: WorkspaceSeries = {\n ...series,\n references: [...existingRefs, ref],\n };\n\n state.workspace = {\n ...ws,\n modified: now(),\n series: ws.series.map((s, i) =>\n i === seriesIndex ? updatedSeries : s,\n ),\n };\n\n workspaceJson = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(state.workspacePath!, workspaceJson, \"utf-8\");\n }\n\n attachedTo = `series:${input.seriesId}`;\n state.emitMutation(\"workspace:updated\", { referenceAdded: id });\n } else {\n throw new Error(\"Either seriesId or sketchId must be specified\");\n }\n\n return {\n success: true,\n reference: {\n id,\n type: refType,\n path: relativePath,\n source: input.source ?? null,\n },\n attachedTo,\n ...(sketchJson ? { fileContent: sketchJson } : {}),\n ...(workspaceJson ? { workspaceContent: workspaceJson } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// analyze_reference\n// ---------------------------------------------------------------------------\n\nexport interface AnalyzeReferenceInput {\n referenceId: string;\n seriesId?: string;\n sketchId?: string;\n previewSize?: number;\n}\n\nexport interface AnalyzeReferenceResult {\n metadata: Record<string, unknown>;\n previewJpegBase64?: string;\n}\n\nexport async function analyzeReference(\n state: EditorState,\n input: AnalyzeReferenceInput,\n): Promise<AnalyzeReferenceResult> {\n state.requireWorkspace();\n\n // Find the reference\n const { ref, location } = findReference(state, input.referenceId, input.seriesId, input.sketchId);\n\n // Read the image file and produce a base64 preview\n const workspaceDir = dirname(state.workspacePath!);\n const imagePath = resolve(workspaceDir, ref.path);\n\n let previewJpegBase64: string | undefined;\n try {\n const imageBuffer = await readFile(imagePath);\n // Return the raw image data as base64 for the agent to analyze visually\n const ext = extname(ref.path).toLowerCase();\n const mimeMap: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n };\n // For MCP image content blocks we need base64\n previewJpegBase64 = imageBuffer.toString(\"base64\");\n } catch {\n // Image file not accessible — provide framework without preview\n }\n\n const metadata: Record<string, unknown> = {\n success: true,\n referenceId: ref.id,\n type: ref.type,\n path: ref.path,\n source: ref.source ?? null,\n location,\n existingAnalysis: ref.analysis ?? null,\n analysisFramework: {\n composition: {\n instruction: \"Analyze the compositional structure of this reference.\",\n prompts: [\n \"What is the primary compositional structure (centered, asymmetric, diagonal, radial)?\",\n \"Where does the eye land first? What creates the focal point?\",\n \"How is negative space used — actively or passively?\",\n \"What is the relationship between foreground, middle ground, and background?\",\n \"How do the edges and corners of the frame interact with the subject?\",\n ],\n },\n palette: {\n instruction: \"Identify the color strategy.\",\n prompts: [\n \"What are the dominant colors (3-5 hex values)?\",\n \"What color temperature dominates — warm, cool, or neutral?\",\n \"What is the value range — high contrast or compressed?\",\n \"Is the palette analogous, complementary, triadic, or something else?\",\n \"How does saturation vary across the composition?\",\n ],\n },\n rhythm: {\n instruction: \"Identify rhythmic and pattern qualities.\",\n prompts: [\n \"Is there a repeating motif or interval?\",\n \"Is the rhythm regular, progressive, alternating, or irregular?\",\n \"At how many scales does pattern appear (fractal quality)?\",\n \"How do density variations create movement?\",\n \"Where are the moments of rest vs. activity?\",\n ],\n },\n mood: {\n instruction: \"Identify the emotional and atmospheric qualities.\",\n prompts: [\n \"What is the overall mood — contemplative, energetic, serene, unsettling?\",\n \"How do color, light, and space contribute to that mood?\",\n \"Is there a sense of time — moment, duration, timelessness?\",\n \"What emotional response does the work invite?\",\n ],\n },\n technique: {\n instruction: \"Identify technical and material qualities worth studying.\",\n prompts: [\n \"What medium or technique is used?\",\n \"How is mark-making contributing to expression?\",\n \"Are there layering or transparency effects?\",\n \"What level of control vs. chance is visible?\",\n \"What technical approach could be translated to generative art?\",\n ],\n },\n },\n instructions: [\n \"Study the reference image carefully using the framework above.\",\n \"For each category, answer the prompts and synthesize your observations.\",\n \"After analysis, use update_reference_analysis to save the structured analysis.\",\n \"The analysis should inform how you create study sketches inspired by this reference.\",\n \"Focus on qualities that can be translated to generative art — don't try to replicate literally.\",\n ],\n };\n\n return { metadata, previewJpegBase64 };\n}\n\n// ---------------------------------------------------------------------------\n// update_reference_analysis (save analysis back to reference)\n// ---------------------------------------------------------------------------\n\nexport interface UpdateReferenceAnalysisInput {\n referenceId: string;\n seriesId?: string;\n sketchId?: string;\n analysis: ReferenceAnalysis;\n}\n\nexport async function updateReferenceAnalysis(\n state: EditorState,\n input: UpdateReferenceAnalysisInput,\n): Promise<Record<string, unknown>> {\n const ws = state.requireWorkspace();\n\n const { ref, location } = findReference(\n state, input.referenceId, input.seriesId, input.sketchId,\n );\n\n const updatedRef: Reference = {\n ...ref,\n analysis: input.analysis,\n };\n\n let workspaceJson: string | undefined;\n let sketchJson: string | undefined;\n\n if (location.startsWith(\"sketch:\")) {\n const sketchId = location.replace(\"sketch:\", \"\");\n const loaded = state.requireSketch(sketchId);\n const updatedDef: SketchDefinition = {\n ...loaded.definition,\n modified: now(),\n references: (loaded.definition.references ?? []).map((r) =>\n r.id === input.referenceId ? updatedRef : r,\n ),\n };\n state.sketches.set(sketchId, {\n definition: updatedDef,\n path: loaded.path,\n });\n sketchJson = serializeGenart(updatedDef);\n if (!state.remoteMode) {\n await writeFile(loaded.path, sketchJson, \"utf-8\");\n }\n state.emitMutation(\"sketch:updated\", { id: sketchId });\n } else {\n const seriesId = location.replace(\"series:\", \"\");\n const seriesIndex = ws.series!.findIndex((s) => s.id === seriesId);\n const series = ws.series![seriesIndex]!;\n const updatedSeries: WorkspaceSeries = {\n ...series,\n references: (series.references ?? []).map((r) =>\n r.id === input.referenceId ? updatedRef : r,\n ),\n };\n state.workspace = {\n ...ws,\n modified: now(),\n series: ws.series!.map((s, i) =>\n i === seriesIndex ? updatedSeries : s,\n ),\n };\n workspaceJson = serializeWorkspace(state.workspace);\n if (!state.remoteMode) {\n await writeFile(state.workspacePath!, workspaceJson, \"utf-8\");\n }\n state.emitMutation(\"workspace:updated\", { referenceAnalyzed: input.referenceId });\n }\n\n return {\n success: true,\n referenceId: input.referenceId,\n location,\n analysis: input.analysis,\n ...(sketchJson ? { fileContent: sketchJson } : {}),\n ...(workspaceJson ? { workspaceContent: workspaceJson } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// extract_palette\n// ---------------------------------------------------------------------------\n\nexport interface ExtractPaletteInput {\n referenceId: string;\n seriesId?: string;\n sketchId?: string;\n count?: number;\n}\n\nexport interface ExtractPaletteResult {\n metadata: Record<string, unknown>;\n previewJpegBase64?: string;\n}\n\nexport async function extractPalette(\n state: EditorState,\n input: ExtractPaletteInput,\n): Promise<ExtractPaletteResult> {\n state.requireWorkspace();\n\n const { ref, location } = findReference(\n state, input.referenceId, input.seriesId, input.sketchId,\n );\n\n const count = input.count ?? 6;\n\n // Read the image file\n const workspaceDir = dirname(state.workspacePath!);\n const imagePath = resolve(workspaceDir, ref.path);\n\n let previewJpegBase64: string | undefined;\n try {\n const imageBuffer = await readFile(imagePath);\n previewJpegBase64 = imageBuffer.toString(\"base64\");\n } catch {\n // Image not accessible\n }\n\n const metadata: Record<string, unknown> = {\n success: true,\n referenceId: ref.id,\n type: ref.type,\n path: ref.path,\n location,\n requestedColors: count,\n existingPalette: ref.analysis?.palette ?? null,\n instructions: [\n `Extract ${count} dominant colors from the reference image as hex values.`,\n \"Order them from most dominant to least dominant.\",\n \"Include both saturated and neutral colors if present in the image.\",\n \"Consider the role of each color — is it a background, accent, or primary element?\",\n \"After extraction, use update_reference_analysis to save the palette.\",\n \"You can also apply the extracted palette to a sketch using set_colors or create a new theme.\",\n ],\n extractionGuidelines: {\n dominance: \"Prioritize colors by the area they occupy, not just their saturation.\",\n variety: \"Include the full value range (lights, midtones, darks) if present.\",\n harmony: `Look for ${count <= 4 ? \"core harmony\" : \"extended palette including transitional colors\"}.`,\n neutrals: \"Don't ignore grays, blacks, and whites — they often define the character of a palette.\",\n },\n };\n\n return { metadata, previewJpegBase64 };\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/** Find a reference by ID across series and sketches. */\nfunction findReference(\n state: EditorState,\n referenceId: string,\n seriesId?: string,\n sketchId?: string,\n): { ref: Reference; location: string } {\n // Check specific sketch first\n if (sketchId) {\n const loaded = state.requireSketch(sketchId);\n const ref = (loaded.definition.references ?? []).find(\n (r) => r.id === referenceId,\n );\n if (ref) return { ref, location: `sketch:${sketchId}` };\n throw new Error(\n `Reference '${referenceId}' not found on sketch '${sketchId}'`,\n );\n }\n\n // Check specific series\n if (seriesId) {\n const ws = state.requireWorkspace();\n const series = ws.series?.find((s) => s.id === seriesId);\n if (!series) {\n throw new Error(`Series '${seriesId}' not found in workspace`);\n }\n const ref = (series.references ?? []).find((r) => r.id === referenceId);\n if (ref) return { ref, location: `series:${seriesId}` };\n throw new Error(\n `Reference '${referenceId}' not found on series '${seriesId}'`,\n );\n }\n\n // Search all series, then all sketches\n const ws = state.requireWorkspace();\n if (ws.series) {\n for (const series of ws.series) {\n const ref = (series.references ?? []).find((r) => r.id === referenceId);\n if (ref) return { ref, location: `series:${series.id}` };\n }\n }\n\n for (const [id, loaded] of state.sketches) {\n const ref = (loaded.definition.references ?? []).find(\n (r) => r.id === referenceId,\n );\n if (ref) return { ref, location: `sketch:${id}` };\n }\n\n throw new Error(\n `Reference '${referenceId}' not found in any series or sketch`,\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 if (args.name !== undefined) {\n stack.updateMeta(args.layerId, { 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 stack.updateMeta(args.layerId, { visible: newVisible });\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 stack.updateMeta(args.layerId, { locked: newLocked });\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 registerCritiqueAndIterate(server, state);\n registerDevelopArtisticConcept(server, state);\n registerStudyReference(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\n// ---------------------------------------------------------------------------\n// critique-and-iterate — capture → self-critique → improve → compare → document\n// ---------------------------------------------------------------------------\n\nfunction registerCritiqueAndIterate(\n server: McpServer,\n state: EditorState,\n): void {\n server.prompt(\n \"critique-and-iterate\",\n \"Capture a sketch, self-critique it, identify improvements, fork, apply changes, compare, and document the iteration\",\n {\n sketchId: z\n .string()\n .describe(\"ID of the sketch to critique and iterate on\"),\n aspects: z\n .string()\n .optional()\n .describe(\"Comma-separated aspects to focus on (composition, color, rhythm, unity, expression). Default: all\"),\n iterations: z\n .string()\n .optional()\n .describe(\"Number of improvement iterations (default: 1)\"),\n },\n async (args) => {\n const sketch = state.getSketch(args.sketchId);\n const iterations = args.iterations ? parseInt(args.iterations, 10) : 1;\n const aspectList = args.aspects\n ? args.aspects.split(\",\").map((a) => a.trim())\n : [\"composition\", \"color\", \"rhythm\", \"unity\", \"expression\"];\n\n let sketchContext = \"\";\n if (sketch) {\n const def = sketch.definition;\n sketchContext = [\n `## Current Sketch: \"${def.title}\"`,\n `- **ID:** ${def.id}`,\n `- **Renderer:** ${def.renderer.type}`,\n `- **Canvas:** ${def.canvas.width}×${def.canvas.height}`,\n `- **Composition Level:** ${def.compositionLevel ?? \"sketch\"}`,\n def.philosophy\n ? `- **Philosophy:** ${def.philosophy}`\n : `- **Philosophy:** not set`,\n `- **Parameters:** ${def.parameters?.length ?? 0} defined`,\n `- **Colors:** ${def.colors?.length ?? 0} defined`,\n ].join(\"\\n\");\n } else {\n sketchContext = `## Sketch: ${args.sketchId}\\n*(Not currently loaded — use open_sketch first)*`;\n }\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Perform a structured critique-and-iterate cycle on a generative art sketch.`,\n ``,\n sketchContext,\n ``,\n `## Focus Aspects`,\n aspectList.map((a) => `- ${a}`).join(\"\\n\"),\n ``,\n `## Iterations: ${iterations}`,\n ``,\n `## Process`,\n ``,\n `For each iteration:`,\n ``,\n `### Step 1: Capture & Critique`,\n `1. Use \\`critique_sketch\\` with sketchId=\"${args.sketchId}\" and aspects=[${aspectList.map((a) => `\"${a}\"`).join(\", \")}]`,\n `2. Study the returned screenshot carefully`,\n `3. Answer each framework question honestly — what works and what doesn't`,\n `4. Note the severity calibration for this composition level`,\n ``,\n `### Step 2: Identify Improvements`,\n `Based on the critique, identify 2-3 specific, actionable improvements:`,\n `- Rank them by expected visual impact`,\n `- Be precise: \"shift the focal cluster from center to upper-left third\" not \"improve composition\"`,\n `- Consider which improvements can be achieved via parameter changes vs algorithm changes`,\n ``,\n `### Step 3: Fork & Apply`,\n `1. Use \\`fork_sketch\\` to create a new version (preserve the original for comparison)`,\n `2. Apply the identified improvements:`,\n ` - Use \\`set_parameters\\` or \\`set_colors\\` for parameter-level changes`,\n ` - Use \\`update_algorithm\\` for algorithmic changes`,\n `3. Use \\`capture_screenshot\\` to verify each change visually`,\n ``,\n `### Step 4: Compare`,\n `1. Use \\`compare_sketches\\` with the original and improved sketch IDs`,\n `2. Evaluate: did each intended improvement actually improve the piece?`,\n `3. Note any unintended consequences — improvements in one aspect sometimes degrade another`,\n ``,\n `### Step 5: Document`,\n `After all iterations:`,\n `1. Update the improved sketch's philosophy field to document what changed and why`,\n `2. Summarize the iteration journey: what was tried, what worked, what was learned`,\n `3. If the original was better in some aspects, note what to preserve in future iterations`,\n ``,\n `## Guidelines`,\n `- Be your own harshest (but fairest) critic — the goal is genuine improvement`,\n `- Small, focused changes are better than sweeping rewrites`,\n `- If a change doesn't work, revert it before trying the next improvement`,\n `- The final piece should feel like a natural evolution, not a different sketch`,\n `- 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\n// ---------------------------------------------------------------------------\n// develop-artistic-concept — concept → study → thumbnails → develop → critique → iterate → document\n// ---------------------------------------------------------------------------\n\nfunction registerDevelopArtisticConcept(\n server: McpServer,\n _state: EditorState,\n): void {\n server.prompt(\n \"develop-artistic-concept\",\n \"Develop an artistic concept through a full studio workflow: concept planning, studies, development, critique, iteration, and documentation\",\n {\n concept: z\n .string()\n .describe(\"The artistic concept or theme to explore\"),\n medium: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Preferred renderer/medium (default: p5)\"),\n depth: z\n .enum([\"quick\", \"standard\", \"deep\"])\n .optional()\n .describe(\"How deeply to explore: quick (3 studies), standard (6 studies), deep (9+ studies). Default: standard\"),\n },\n async (args) => {\n const medium = args.medium ?? \"p5\";\n const depth = args.depth ?? \"standard\";\n const studyCount = depth === \"quick\" ? 3 : depth === \"deep\" ? 9 : 6;\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Develop the following artistic concept through a full studio workflow.`,\n ``,\n `## Concept`,\n `${args.concept}`,\n ``,\n `## Medium: ${medium}`,\n `## Depth: ${depth} (${studyCount} studies)`,\n ``,\n `## Phase 1: Conceptual Planning`,\n `1. Use \\`develop_concept\\` with your concept and medium to get a structured plan`,\n `2. Define: mood, color strategy, compositional approach, and relevant skills`,\n `3. Create a series with \\`create_series\\` — write a narrative and intent statement`,\n ``,\n `## Phase 2: Thumbnail Studies`,\n `1. Create ${studyCount} quick study-level sketches with \\`create_sketch\\` (compositionLevel: \"study\")`,\n `2. Each study should explore a different aspect of the concept:`,\n ` - Vary composition (centered vs asymmetric vs edge-driven)`,\n ` - Vary color (warm vs cool, saturated vs muted)`,\n ` - Vary rhythm (regular vs progressive vs chaotic)`,\n ` - Vary density (sparse vs dense vs gradient)`,\n `3. Use small canvases (600x600 or similar) — studies are fast explorations`,\n `4. Use \\`capture_batch\\` to see all studies at once`,\n ``,\n `## Phase 3: Selection & Critique`,\n `1. Use \\`series_summary\\` to see the full set of studies with screenshots`,\n `2. Use \\`critique_sketch\\` on the 2-3 most promising studies`,\n `3. Identify which studies best capture the concept's intent`,\n `4. Note what works in each — composition choices, color relationships, rhythmic qualities`,\n ``,\n `## Phase 4: Development`,\n `1. Use \\`promote_sketch\\` to advance the best 1-2 studies to \"drafts\" stage`,\n `2. Refine the promoted sketches:`,\n ` - Add more parameters for fine control`,\n ` - Develop the color palette with more nuance`,\n ` - Strengthen compositional structure`,\n ` - Load relevant skills with \\`load_skill\\` for guidance`,\n `3. Use \\`critique_sketch\\` after each round of changes`,\n ``,\n `## Phase 5: Critique & Iteration`,\n `1. Use \\`compare_sketches\\` to evaluate drafts against each other`,\n `2. For the strongest draft, use the critique-and-iterate workflow:`,\n ` - Critique → identify improvements → fork → apply → compare`,\n `3. Promote the best iteration to \"refinements\" stage`,\n `4. Continue refining until the piece feels resolved`,\n ``,\n `## Phase 6: Final & Documentation`,\n `1. Promote the best refinement to \"finals\" stage (canvas will upscale)`,\n `2. Update the philosophy field with the full artistic statement`,\n `3. Use \\`series_summary\\` to capture the complete progression`,\n `4. Document: what was the concept? How did it evolve? What was discovered?`,\n ``,\n `## Guidelines`,\n `- Each phase should feel like a natural progression, not a checklist`,\n `- Trust the studies — let unexpected results redirect the exploration`,\n `- The final piece should feel inevitable, like it couldn't have been any other way`,\n `- Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools`,\n `- Use \\`auto_arrange\\` periodically to keep the workspace organized`,\n ].join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// study-reference — analyze → identify key qualities → create study → document\n// ---------------------------------------------------------------------------\n\nfunction registerStudyReference(\n server: McpServer,\n _state: EditorState,\n): void {\n server.prompt(\n \"study-reference\",\n \"Study a reference image: analyze it, identify key qualities, create a generative study sketch inspired by it, and document learnings\",\n {\n referenceId: z\n .string()\n .describe(\"ID of the reference to study\"),\n seriesId: z\n .string()\n .optional()\n .describe(\"Series the reference belongs to (also where the study sketch will be added)\"),\n sketchId: z\n .string()\n .optional()\n .describe(\"Sketch the reference belongs to\"),\n medium: z\n .enum([\"p5\", \"three\", \"glsl\", \"canvas2d\", \"svg\"])\n .optional()\n .describe(\"Renderer for the study sketch (default: p5)\"),\n focus: z\n .string()\n .optional()\n .describe(\"Specific quality to focus on: composition, palette, rhythm, mood, technique, or a custom focus\"),\n },\n async (args) => {\n const medium = args.medium ?? \"p5\";\n const focus = args.focus ?? \"all key qualities\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: [\n `Study a reference image and create a generative art sketch inspired by it.`,\n ``,\n `## Reference: ${args.referenceId}`,\n args.seriesId ? `## Series: ${args.seriesId}` : \"\",\n `## Medium: ${medium}`,\n `## Focus: ${focus}`,\n ``,\n `## Phase 1: Analyze the Reference`,\n `1. Use \\`analyze_reference\\` with referenceId=\"${args.referenceId}\"${args.seriesId ? ` seriesId=\"${args.seriesId}\"` : \"\"}${args.sketchId ? ` sketchId=\"${args.sketchId}\"` : \"\"} to get the analysis framework and image`,\n `2. Study the image carefully using the framework prompts`,\n `3. Answer each category: composition, palette, rhythm, mood, technique`,\n `4. Use \\`update_reference_analysis\\` to save your structured analysis`,\n ``,\n `## Phase 2: Extract Key Qualities`,\n `From your analysis, identify 2-4 key qualities that are most interesting for generative art:`,\n `- These could be: a specific compositional structure, a color relationship, a rhythmic pattern, a mood quality`,\n `- Focus on qualities that can be *translated* into code, not literally replicated`,\n `- Consider what makes this reference compelling — what would be lost if you removed each quality?`,\n ``,\n `## Phase 3: Extract Palette`,\n `1. Use \\`extract_palette\\` to study the reference's color strategy`,\n `2. Extract 5-8 hex colors that capture the essential palette`,\n `3. Save the palette in the reference analysis`,\n ``,\n `## Phase 4: Create Study Sketch`,\n `1. Use \\`create_sketch\\` with compositionLevel: \"study\" to create a quick exploration`,\n `2. Translate the key qualities into generative parameters and algorithm choices:`,\n ` - Composition → element placement, density distribution, negative space`,\n ` - Palette → color definitions, themes derived from the reference palette`,\n ` - Rhythm → repetition patterns, interval variations, scale relationships`,\n ` - Mood → overall tone, animation speed, mark quality`,\n ` - Technique → rendering approach, layering, transparency`,\n `3. Add the reference to the sketch with \\`add_reference\\``,\n `4. Document in the philosophy field how the reference influenced the study`,\n `5. Use \\`capture_screenshot\\` to verify the result`,\n ``,\n `## Phase 5: Compare & Document`,\n `1. Use \\`analyze_reference\\` again to see the reference alongside your study`,\n `2. Evaluate: which qualities translated well? Which were lost or transformed?`,\n `3. Note what you learned — what worked, what surprised you, what to try next`,\n `4. Update the study sketch's philosophy with these insights`,\n ``,\n `## Guidelines`,\n `- The goal is *inspiration*, not replication — a study should be recognizably generative`,\n `- A good study captures the *spirit* of the reference while being authentically algorithmic`,\n `- Use small canvases (600x600) — studies are explorations, not finished pieces`,\n `- If the reference suggests multiple interesting directions, create multiple studies`,\n `- Always pass your \\`agent\\` name and \\`model\\` identifier when calling tools`,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n },\n },\n ],\n };\n },\n );\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 SketchMutator,\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 const sketch: SketchMutator = {\n getSymbols() {\n return (loaded.definition.symbols ?? {}) as Readonly<Record<string, unknown>>;\n },\n setSymbols(symbols: Record<string, unknown> | undefined) {\n loaded.definition = { ...loaded.definition, symbols: symbols as typeof loaded.definition.symbols };\n },\n getComponents() {\n return (loaded.definition.components ?? {}) as Readonly<Record<string, unknown>>;\n },\n setComponents(components: Record<string, unknown>) {\n loaded.definition = { ...loaded.definition, components: components as typeof loaded.definition.components };\n },\n getThirdParty() {\n const def = loaded.definition as unknown as Record<string, unknown>;\n return ((def[\"thirdParty\"] as unknown[]) ?? []) as readonly Record<string, unknown>[];\n },\n setThirdParty(notices: Record<string, unknown>[] | undefined) {\n (loaded.definition as unknown as Record<string, unknown>)[\"thirdParty\"] = notices;\n },\n getRenderer() {\n return loaded.definition.renderer.type;\n },\n getGenartVersion() {\n return loaded.definition.genart;\n },\n setGenartVersion(version: string) {\n loaded.definition = { ...loaded.definition, genart: version };\n },\n };\n\n return {\n layers: layerStack,\n sketchState,\n sketch,\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"],"mappings":"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","names":["z","json","unlink","writeFile","stat","basename","dirname","serializeWorkspace","now","fileExists","registry","ts","basename","resolvePreset","now","basename","now","computeViewport","readFile","stat","dirname","parseGenart","dirname","join","writeFile","serializeGenart","now","basename","writeFile","resolveComponents","serializeGenart","VALID_RENDERERS","writeFile","dirname","join","createDefaultRegistry","resolve","registry","createDefaultRegistry","dirname","join","writeFile","createDefaultSkillRegistry","registry","createDefaultSkillRegistry","writeFile","basename","dirname","resolve","serializeGenart","serializeWorkspace","now","KEBAB_RE","validateKebabId","now","serializeWorkspace","writeFile","basename","validateKebabId","dirname","resolve","serializeGenart","mkdir","readFile","basename","dirname","resolve","serializeGenart","serializeWorkspace","writeFile","now","KEBAB_RE","validateKebabId","ws","stat","writeFile","dirname","createDefaultRegistry","serializeGenart","registry","createDefaultRegistry","dirname","stat","applyOverrides","writeFile","content","serializeGenart","resolve","registry","registry","createDefaultRegistry","createDefaultSkillRegistry","registry","registry","z","readFile","dirname","resolve","parseGenart","parseWorkspace","serializeGenart","serializeWorkspace","writeFile","resolve","dirname","readFile","def"]}