@dpantani/tdmcp 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/installBridge.ts","../src/utils/paths.ts","../src/server/tdmcpServer.ts","../src/prompts/debugNetwork.ts","../src/prompts/types.ts","../src/prompts/explainNetwork.ts","../src/prompts/optimizePerformance.ts","../src/prompts/remixVisual.ts","../src/prompts/visualArtistMode.ts","../src/prompts/index.ts","../src/resources/glslPatternResource.ts","../src/resources/shared.ts","../src/resources/operatorResource.ts","../src/knowledge/normalize.ts","../src/resources/patternResource.ts","../src/resources/pythonApiResource.ts","../src/resources/recipeResource.ts","../src/resources/tutorialResource.ts","../src/resources/index.ts","../src/tools/layer1/applyPostProcessing.ts","../src/feedback/errorChecker.ts","../src/feedback/previewCapture.ts","../src/td-client/types.ts","../src/tools/layer2/connectHelper.ts","../src/tools/result.ts","../src/tools/layer1/orchestration.ts","../src/tools/layer1/createAudioReactive.ts","../src/tools/layer1/createDataVisualization.ts","../src/tools/layer1/createFeedbackNetwork.ts","../src/tools/layer1/createGenerativeArt.ts","../src/tools/layer1/createParticleSystem.ts","../src/tools/layer1/createVisualSystem.ts","../src/tools/layer1/intent.ts","../src/tools/layer1/describeProject.ts","../src/tools/layer1/getPreview.ts","../src/tools/layer1/setupOutput.ts","../src/tools/layer1/index.ts","../src/tools/layer2/connectNodes.ts","../src/tools/layer2/createContainer.ts","../src/tools/layer2/createGlslShader.ts","../src/tools/layer2/createNodeChain.ts","../src/tools/layer2/createPythonScript.ts","../src/tools/layer2/duplicateNetwork.ts","../src/tools/layer2/setParametersBatch.ts","../src/tools/layer2/index.ts","../src/tools/layer3/compareTdNodes.ts","../src/tools/layer3/createTdNode.ts","../src/tools/layer3/deleteTdNode.ts","../src/tools/layer3/execNodeMethod.ts","../src/tools/layer3/executePythonScript.ts","../src/tools/layer3/findTdNodes.ts","../src/td-client/validators.ts","../src/tools/layer3/nodeMatch.ts","../src/tools/layer3/getModuleHelp.ts","../src/tools/layer3/getTdClassDetails.ts","../src/tools/layer3/getTdClasses.ts","../src/tools/layer3/getTdInfo.ts","../src/tools/layer3/getTdNodeErrors.ts","../src/tools/layer3/getTdNodeParameters.ts","../src/tools/layer3/getTdNodes.ts","../src/tools/layer3/getTdPerformance.ts","../src/feedback/performanceMonitor.ts","../src/tools/layer3/getTdTopology.ts","../src/feedback/networkVerifier.ts","../src/tools/layer3/snapshotTdGraph.ts","../src/tools/layer3/summarizeTdErrors.ts","../src/tools/layer3/updateTdNodeParameters.ts","../src/tools/layer3/index.ts","../src/tools/index.ts","../src/utils/version.ts","../src/knowledge/index.ts","../src/utils/logger.ts","../src/recipes/loader.ts","../src/recipes/schema.ts","../src/td-client/touchDesignerClient.ts","../src/utils/config.ts","../src/server/connectionManager.ts","../src/server/context.ts","../src/server/transportFactory.ts","../src/td-client/eventStream.ts","../src/index.ts"],"sourcesContent":["import { cpSync, existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { bridgeModulesDir } from \"../utils/paths.js\";\n\n/**\n * `tdmcp install-bridge [--dir <path>]`\n *\n * Copies the packaged TouchDesigner bridge modules (`td/modules`) to a friendly,\n * stable folder on disk and prints the two things the artist needs to turn the\n * bridge on inside TouchDesigner. This is what makes the `npx` flow work without\n * cloning the repo: the modules live in the npm cache otherwise.\n */\nexport function runInstallBridge(args: string[]): void {\n const dirFlag = args.indexOf(\"--dir\");\n const explicitDir = dirFlag !== -1 ? args[dirFlag + 1] : undefined;\n const targetRoot = explicitDir ?? join(homedir(), \"tdmcp-bridge\");\n const dest = join(targetRoot, \"modules\");\n\n const src = bridgeModulesDir();\n if (!existsSync(src)) {\n console.error(\n `[tdmcp] Could not find the bridge modules to copy (looked in ${src}).\\n` +\n \"If you're running from source, build first with `npm run build`.\",\n );\n process.exitCode = 1;\n return;\n }\n\n cpSync(src, dest, { recursive: true });\n\n const oneLiner = \"from mcp import install; install.run()\";\n const noPrefs = `import sys; sys.path.insert(0, ${JSON.stringify(dest)})\\n${oneLiner.replace(\"install.run()\", `install.run(modules_dir=${JSON.stringify(dest)})`)}`;\n\n console.log(\n [\n \"\",\n \" tdmcp bridge installed.\",\n ` Modules copied to: ${dest}`,\n \"\",\n \" Now switch the bridge on inside TouchDesigner:\",\n \"\",\n \" 1. Open Preferences (Edit > Preferences, or the TouchDesigner menu on macOS).\",\n ' In \"Python 64-bit Module Path\", add this folder:',\n \"\",\n ` ${dest}`,\n \"\",\n \" 2. Open the Textport (Dialogs > Textport and DATs) and run:\",\n \"\",\n ` ${oneLiner}`,\n \"\",\n \" You should see: [tdmcp] bridge running on port 9980 (/project1/tdmcp_bridge)\",\n \"\",\n \" ⚠ Security: the bridge runs arbitrary Python inside TouchDesigner and the\",\n \" Web Server DAT listens on all network interfaces with no auth. Only run it\",\n \" on a trusted network, or firewall port 9980 to localhost.\",\n \"\",\n \" Prefer not to touch Preferences? Paste this in the Textport instead:\",\n \"\",\n ...noPrefs.split(\"\\n\").map((line) => ` ${line}`),\n \"\",\n ].join(\"\\n\"),\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst moduleDir = dirname(fileURLToPath(import.meta.url));\n\nfunction firstExisting(candidates: string[], fallback: string): string {\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return fallback;\n}\n\n/**\n * Directory holding the imported knowledge base JSON.\n * - dev (tsx): `<root>/src/knowledge/data`\n * - build (node): `<root>/dist/knowledge/data` (copied by `copy-assets.mjs`)\n */\nexport function knowledgeDataDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../knowledge/data\"), resolve(moduleDir, \"knowledge/data\")],\n resolve(moduleDir, \"../knowledge/data\"),\n );\n}\n\n/**\n * Directory holding recipe JSON files.\n * - dev: `<root>/recipes`\n * - build: `<root>/dist/recipes`\n */\nexport function recipesDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../../recipes\"), resolve(moduleDir, \"recipes\")],\n resolve(moduleDir, \"../../recipes\"),\n );\n}\n\n/**\n * Directory holding the TouchDesigner-side Python bridge modules that ship with\n * the package (the `td/modules` tree). Used by the `install-bridge` CLI to copy\n * them somewhere TouchDesigner can import from.\n * - dev (tsx): `<root>/td/modules`\n * - installed package (node): `<pkgroot>/td/modules`\n */\nexport function bridgeModulesDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../td/modules\"), resolve(moduleDir, \"../../td/modules\")],\n resolve(moduleDir, \"../td/modules\"),\n );\n}\n\n/**\n * Resolves the installed `@bottobot/td-mcp` package root (the source of operator\n * data), if present. Used as a fallback when local knowledge data is missing.\n */\nexport function bottobotPackageDir(): string | undefined {\n const candidates = [\n resolve(moduleDir, \"../../node_modules/@bottobot/td-mcp\"),\n resolve(moduleDir, \"../node_modules/@bottobot/td-mcp\"),\n resolve(process.cwd(), \"node_modules/@bottobot/td-mcp\"),\n ];\n for (const candidate of candidates) {\n if (existsSync(resolve(candidate, \"wiki/data/processed\"))) return candidate;\n }\n return undefined;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAllPrompts } from \"../prompts/index.js\";\nimport { registerAllResources } from \"../resources/index.js\";\nimport { registerAllTools } from \"../tools/index.js\";\nimport type { TdmcpConfig } from \"../utils/config.js\";\nimport { getVersion } from \"../utils/version.js\";\nimport { buildToolContext, type ToolContextOverrides } from \"./context.js\";\n\nconst INSTRUCTIONS = `tdmcp lets you build visual systems in TouchDesigner.\n\nWorkflow:\n1. Call get_td_info first to confirm the bridge is reachable.\n2. Consult the knowledge base resources (tdmcp://operators/..., tdmcp://recipes/...) before creating nodes — never invent operator types.\n3. Build with the highest-level tool that fits, dropping to Layer 2/3 for fine control.\n4. After building, check get_td_node_errors and capture get_preview so the artist can see the result.\n5. Prefer structured inspection/edit tools (find_td_nodes, get_td_node_parameters, summarize_td_errors, compare_td_nodes, snapshot_td_graph, update_td_node_parameters) and process their structuredContent with code. Treat execute_python_script and exec_node_method as a last resort, only when no structured tool fits.\n\nThe server stays usable even when TouchDesigner is offline; tools return a friendly error in that case.`;\n\nexport type TdmcpServerOverrides = ToolContextOverrides;\n\n/** Builds a fully wired (but not yet connected) MCP server. */\nexport function createTdmcpServer(\n config: TdmcpConfig,\n overrides: TdmcpServerOverrides = {},\n): McpServer {\n const ctx = buildToolContext(config, overrides);\n const { knowledge, recipes, logger } = ctx;\n\n const server = new McpServer(\n { name: \"tdmcp\", version: getVersion() },\n { instructions: INSTRUCTIONS },\n );\n\n registerAllTools(server, ctx);\n registerAllResources(server, { knowledge, recipes, logger });\n registerAllPrompts(server, { knowledge, recipes, logger });\n\n logger.info(\"tdmcp server initialized\", {\n version: getVersion(),\n knowledge: knowledge.stats(),\n recipes: recipes.list().length,\n });\n\n return server;\n}\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerDebugNetwork: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"debug_network\",\n {\n title: \"Debug network\",\n description:\n \"Systematically debug a TD network: check errors, verify connections, inspect cook times, and suggest fixes.\",\n argsSchema: { root_path: z.string().describe(\"Root path to debug from, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Debug the TouchDesigner network under ${root_path}. Work step by step:`,\n `1. Call get_td_node_errors with path \"${root_path}\" and recursive=true. List every error/warning.`,\n `2. Call get_td_nodes for \"${root_path}\" to map the children, and get_td_node_parameters on any node that errored.`,\n \"3. For each error, explain the likely cause (missing input, bad parameter, unsupported operator, resolution mismatch) and the concrete fix.\",\n \"4. Apply fixes with update_td_node_parameters or connect_nodes, then re-run get_td_node_errors to confirm.\",\n \"5. Finish with get_preview on the output TOP to confirm it renders.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { KnowledgeBase } from \"../knowledge/index.js\";\nimport type { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\nexport interface PromptContext {\n knowledge: KnowledgeBase;\n recipes: RecipeLibrary;\n logger: Logger;\n}\n\nexport type PromptRegistrar = (server: McpServer, ctx: PromptContext) => void;\n\n/** Builds a single user-message prompt result. */\nexport function userPrompt(text: string) {\n return { messages: [{ role: \"user\" as const, content: { type: \"text\" as const, text } }] };\n}\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerExplainNetwork: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"explain_network\",\n {\n title: \"Explain network\",\n description:\n \"Generate a human-readable explanation of what a TD network does: data flow, key parameters, and artistic intent.\",\n argsSchema: { root_path: z.string().describe(\"Root path to explain, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Explain the TouchDesigner network under ${root_path} for someone learning TouchDesigner.`,\n `1. Call get_td_nodes for \"${root_path}\" and follow the connections to understand the data flow.`,\n \"2. Describe the signal path from input to output in plain language (what each stage does and why).\",\n \"3. Call out the key parameters an artist would tweak and what visual effect they have.\",\n \"4. Summarize the artistic intent — what the piece looks like and the technique it uses.\",\n \"Keep it concise and friendly; avoid dumping raw parameter lists.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerOptimizePerformance: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"optimize_performance\",\n {\n title: \"Optimize performance\",\n description:\n \"Analyze a TD network for performance: identify bottlenecks, suggest resolution changes, and recommend cooking optimizations.\",\n argsSchema: { root_path: z.string().describe(\"Root path to optimize, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Optimize the TouchDesigner network under ${root_path} for real-time performance.`,\n `1. Inspect cook times: read tdmcp://operators for any heavy operators and use get_td_node_parameters under \"${root_path}\".`,\n \"2. Identify the most expensive nodes and explain why (resolution too high, cooking every frame, large blurs/feedback, CPU SOPs).\",\n \"3. Recommend concrete fixes: lower TOP resolution, use Null/Select for caching, reduce blur sizes, move CPU work to GPU, limit cook rate, bypass unused branches.\",\n \"4. Apply the safe changes with update_td_node_parameters and report the expected FPS impact. Do not delete nodes unless asked.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerRemixVisual: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"remix_visual\",\n {\n title: \"Remix visual\",\n description:\n \"Take an existing visual system and create variations — change colors, swap techniques, add effects, alter timing.\",\n argsSchema: {\n source_path: z.string().describe(\"Path of the visual system to remix.\"),\n remix_direction: z\n .string()\n .describe(\"What to change, e.g. 'make it darker', 'add glitch', 'slow it down'.\"),\n },\n },\n ({ source_path, remix_direction }) =>\n userPrompt(\n [\n `Remix the visual system at ${source_path}. Direction: \"${remix_direction}\".`,\n `1. Inspect it first: get_td_nodes and get_td_node_parameters under \"${source_path}\" to understand the current setup.`,\n \"2. Plan changes that match the direction (palette via level/hsv_adjust, motion via transform/feedback gain, texture via added effects).\",\n \"3. Prefer non-destructive edits: update parameters, or use apply_post_processing to add effects after the output. Do not delete the original unless asked.\",\n \"4. After editing, run get_td_node_errors and get_preview to show the remixed result, and describe what changed.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerVisualArtistMode: PromptRegistrar = (server, ctx) => {\n server.registerPrompt(\n \"visual_artist_mode\",\n {\n title: \"Visual artist mode\",\n description:\n \"Think in terms of visual composition, color, motion and aesthetics rather than code while building in TouchDesigner.\",\n argsSchema: {\n style: z\n .string()\n .optional()\n .describe(\"Artistic style: abstract, geometric, organic, glitch, minimal, maximal.\"),\n },\n },\n ({ style }) => {\n const recipes = ctx.recipes\n .list()\n .map((r) => r.id)\n .join(\", \");\n return userPrompt(\n [\n \"You are in Visual Artist Mode for TouchDesigner via the tdmcp server.\",\n \"Think like a VJ / installation artist — composition, color, motion, rhythm, negative space — not code.\",\n \"\",\n \"Working method:\",\n \"1. Prefer high-level tools: create_visual_system (from a description) or create_feedback_network / create_generative_art / create_audio_reactive / create_particle_system.\",\n \"2. Before creating nodes, consult the knowledge resources: tdmcp://operators/{category|name} and tdmcp://recipes/{name}. Never invent operator types.\",\n \"3. Build inside a new container; keep the project tidy.\",\n \"4. After building, run get_td_node_errors, then get_preview so we can SEE the result, and iterate on the aesthetics.\",\n `Available recipes: ${recipes || \"(none yet)\"}.`,\n style ? `\\nLean into a \"${style}\" aesthetic in your choices.` : \"\",\n ].join(\"\\n\"),\n );\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerDebugNetwork } from \"./debugNetwork.js\";\nimport { registerExplainNetwork } from \"./explainNetwork.js\";\nimport { registerOptimizePerformance } from \"./optimizePerformance.js\";\nimport { registerRemixVisual } from \"./remixVisual.js\";\nimport type { PromptContext } from \"./types.js\";\nimport { registerVisualArtistMode } from \"./visualArtistMode.js\";\n\n/** Registers every MCP prompt against the server. */\nexport function registerAllPrompts(server: McpServer, ctx: PromptContext): void {\n registerVisualArtistMode(server, ctx);\n registerDebugNetwork(server, ctx);\n registerOptimizePerformance(server, ctx);\n registerExplainNetwork(server, ctx);\n registerRemixVisual(server, ctx);\n}\n\nexport type { PromptContext } from \"./types.js\";\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerGlslPatternResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://glsl/{pattern_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listGlslPatterns().map((pattern) => ({\n uri: `tdmcp://glsl/${pattern.id}`,\n name: pattern.name,\n description: `${pattern.difficulty} — ${pattern.description}`,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-glsl\",\n template,\n {\n title: \"GLSL shader patterns\",\n description: \"Named GLSL shader techniques with ready-to-use fragment shader snippets.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.pattern_name);\n const pattern = ctx.knowledge.getGlslPattern(name);\n if (!pattern) return jsonContents(uri, { error: `GLSL pattern \"${name}\" not found.` });\n return jsonContents(uri, pattern);\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { KnowledgeBase } from \"../knowledge/index.js\";\nimport type { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\nexport interface ResourceContext {\n knowledge: KnowledgeBase;\n recipes: RecipeLibrary;\n logger: Logger;\n}\n\nexport type ResourceRegistrar = (server: McpServer, ctx: ResourceContext) => void;\n\n/** URI template variables may be string or string[]; this returns the first scalar. */\nexport function firstVar(value: string | string[] | undefined): string {\n if (Array.isArray(value)) return value[0] ?? \"\";\n return value ?? \"\";\n}\n\nexport function jsonContents(uri: URL, data: unknown): ReadResourceResult {\n return {\n contents: [\n { uri: uri.href, mimeType: \"application/json\", text: JSON.stringify(data, null, 2) },\n ],\n };\n}\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { compactKey } from \"../knowledge/normalize.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerOperatorResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://operators/{name}\", {\n list: async () => ({\n resources: ctx.knowledge.listOperatorCategories().map((category) => ({\n uri: `tdmcp://operators/${category}`,\n name: `Operators: ${category}`,\n description: `All ${category} operators`,\n mimeType: \"application/json\",\n })),\n }),\n complete: {\n name: async (value) => {\n const categories = ctx.knowledge.listOperatorCategories();\n const operators = ctx.knowledge.searchOperators(value, 20).map((o) => o.slug);\n return [...categories, ...operators].slice(0, 50);\n },\n },\n });\n\n server.registerResource(\n \"td-operators\",\n template,\n {\n title: \"TouchDesigner operators\",\n description:\n \"Operator catalog. Read a category (TOP, CHOP, SOP, DAT, COMP, MAT, POP) to list its operators, or an operator name/slug for full documentation.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.name);\n const isCategory = ctx.knowledge\n .listOperatorCategories()\n .some((category) => compactKey(category) === compactKey(name));\n\n if (isCategory) {\n const operators = ctx.knowledge.listOperators(name);\n return jsonContents(uri, { category: name, count: operators.length, operators });\n }\n\n const doc = ctx.knowledge.getOperator(name);\n if (!doc) {\n const suggestions = ctx.knowledge.searchOperators(name, 5).map((o) => o.name);\n return jsonContents(uri, { error: `Operator \"${name}\" not found.`, suggestions });\n }\n return jsonContents(uri, doc);\n },\n );\n};\n","import type {\n GlslTechnique,\n OperatorDoc,\n OperatorSummary,\n Pattern,\n PythonClass,\n PythonClassSummary,\n Tutorial,\n TutorialSummary,\n} from \"./types.js\";\n\n/** Filename-style slug: lowercase, non-alphanumerics collapse to underscores. */\nexport function slugify(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n\n/** Lookup key that unifies \"Noise TOP\", \"noiseTOP\" and \"noise_top\" → \"noisetop\". */\nexport function compactKey(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nexport function toOperatorSummary(slug: string, doc: OperatorDoc): OperatorSummary {\n return {\n slug,\n name: doc.name,\n displayName: doc.displayName ?? doc.name,\n category: doc.category ?? \"Unknown\",\n subcategory: doc.subcategory ?? \"\",\n summary: doc.summary ?? doc.description ?? \"\",\n keywords: doc.keywords ?? [],\n };\n}\n\nexport function toPythonSummary(cls: PythonClass): PythonClassSummary {\n return {\n className: cls.className,\n displayName: cls.displayName ?? cls.className,\n category: cls.category ?? \"Unknown\",\n methodCount: cls.methods?.length ?? 0,\n memberCount: cls.members?.length ?? 0,\n };\n}\n\nexport function toTutorialSummary(tut: Tutorial): TutorialSummary {\n return {\n id: tut.id,\n name: tut.name,\n category: tut.category ?? \"Unknown\",\n summary: tut.summary ?? tut.description ?? \"\",\n };\n}\n\ninterface RawPattern {\n name?: string;\n description?: string;\n category?: string;\n workflow?: string[];\n use_case?: string;\n}\n\n/**\n * The bottobot patterns file is an object with a `patterns` array (plus extra\n * metadata keys). Normalizes it into a flat, id-keyed array.\n */\nexport function normalizePatterns(raw: unknown): Pattern[] {\n let list: RawPattern[] = [];\n if (Array.isArray(raw)) {\n list = raw as RawPattern[];\n } else if (raw && typeof raw === \"object\") {\n const obj = raw as Record<string, unknown>;\n if (Array.isArray(obj.patterns)) {\n list = obj.patterns as RawPattern[];\n } else {\n list = Object.values(obj).filter((v): v is RawPattern => !!v && typeof v === \"object\");\n }\n }\n return list\n .filter((p) => typeof p.name === \"string\")\n .map((p) => ({\n id: slugify(p.name as string),\n name: p.name as string,\n description: p.description,\n category: p.category,\n workflow: Array.isArray(p.workflow) ? p.workflow : undefined,\n use_case: p.use_case,\n }));\n}\n\ninterface RawGlslFile {\n techniques?: unknown;\n}\n\n/** Extracts GLSL techniques from bottobot's `experimental/glsl.json`. */\nexport function normalizeGlsl(raw: unknown): GlslTechnique[] {\n const file = (raw ?? {}) as RawGlslFile;\n const techniques = Array.isArray(file.techniques) ? file.techniques : [];\n return techniques\n .filter((t): t is Record<string, unknown> => !!t && typeof t === \"object\")\n .map((t) => {\n const name = typeof t.name === \"string\" ? t.name : \"Untitled\";\n const id = typeof t.id === \"string\" && t.id.length > 0 ? t.id : slugify(name);\n return {\n id,\n name,\n subcategory: typeof t.subcategory === \"string\" ? t.subcategory : undefined,\n description: typeof t.description === \"string\" ? t.description : undefined,\n difficulty: typeof t.difficulty === \"string\" ? t.difficulty : undefined,\n operators: Array.isArray(t.operators) ? (t.operators as string[]) : undefined,\n tags: Array.isArray(t.tags) ? (t.tags as string[]) : undefined,\n notes: typeof t.notes === \"string\" ? t.notes : undefined,\n code: (t.code ?? undefined) as GlslTechnique[\"code\"],\n setup: typeof t.setup === \"string\" ? t.setup : undefined,\n };\n });\n}\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerPatternResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://patterns/{pattern_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listPatterns().map((pattern) => ({\n uri: `tdmcp://patterns/${pattern.id}`,\n name: pattern.name,\n description: pattern.description,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-patterns\",\n template,\n {\n title: \"TouchDesigner workflow patterns\",\n description: \"Named operator-chain workflow patterns (recommended wiring for common tasks).\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.pattern_name);\n const pattern = ctx.knowledge.getPattern(name);\n if (!pattern) return jsonContents(uri, { error: `Pattern \"${name}\" not found.` });\n return jsonContents(uri, pattern);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerPythonApiResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://python-api/{class_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listPythonClasses().map((cls) => ({\n uri: `tdmcp://python-api/${cls.className}`,\n name: `Python: ${cls.className}`,\n description: `${cls.methodCount} methods, ${cls.memberCount} members`,\n mimeType: \"application/json\",\n })),\n }),\n complete: {\n class_name: async (value) =>\n ctx.knowledge\n .listPythonClasses()\n .map((c) => c.className)\n .filter((n) => n.toLowerCase().includes(value.toLowerCase()))\n .slice(0, 50),\n },\n });\n\n server.registerResource(\n \"td-python-api\",\n template,\n {\n title: \"TouchDesigner Python API\",\n description: \"Python class reference (members + methods) for the TouchDesigner API.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const className = firstVar(variables.class_name);\n const cls = ctx.knowledge.getPythonClass(className);\n if (!cls) return jsonContents(uri, { error: `Python class \"${className}\" not found.` });\n return jsonContents(uri, cls);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerRecipeResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://recipes/{recipe_name}\", {\n list: async () => ({\n resources: ctx.recipes.list().map((recipe) => ({\n uri: `tdmcp://recipes/${recipe.id}`,\n name: recipe.name,\n description: `${recipe.difficulty} — ${recipe.description}`,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-recipes\",\n template,\n {\n title: \"Composite network recipes\",\n description: \"Pre-validated composite network templates (nodes + connections + parameters).\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.recipe_name);\n const recipe = ctx.recipes.get(name);\n if (!recipe) {\n return jsonContents(uri, {\n error: `Recipe \"${name}\" not found.`,\n available: ctx.recipes.list().map((r) => r.id),\n });\n }\n return jsonContents(uri, recipe);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerTutorialResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://tutorials/{tutorial_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listTutorials().map((tutorial) => ({\n uri: `tdmcp://tutorials/${tutorial.id}`,\n name: tutorial.name,\n description: tutorial.summary,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-tutorials\",\n template,\n {\n title: \"TouchDesigner tutorials\",\n description: \"Long-form tutorial content covering TD fundamentals and workflows.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.tutorial_name);\n const tutorial = ctx.knowledge.getTutorial(name);\n if (!tutorial) return jsonContents(uri, { error: `Tutorial \"${name}\" not found.` });\n return jsonContents(uri, tutorial);\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerGlslPatternResource } from \"./glslPatternResource.js\";\nimport { registerOperatorResource } from \"./operatorResource.js\";\nimport { registerPatternResource } from \"./patternResource.js\";\nimport { registerPythonApiResource } from \"./pythonApiResource.js\";\nimport { registerRecipeResource } from \"./recipeResource.js\";\nimport type { ResourceContext } from \"./shared.js\";\nimport { registerTutorialResource } from \"./tutorialResource.js\";\n\n/** Registers every MCP resource (knowledge base) against the server. */\nexport function registerAllResources(server: McpServer, ctx: ResourceContext): void {\n registerOperatorResource(server, ctx);\n registerPythonApiResource(server, ctx);\n registerPatternResource(server, ctx);\n registerGlslPatternResource(server, ctx);\n registerRecipeResource(server, ctx);\n registerTutorialResource(server, ctx);\n}\n\nexport type { ResourceContext } from \"./shared.js\";\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, type NetworkBuilder, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst DIRECT_EFFECTS: Record<string, { type: string; parameters?: Record<string, unknown> }> = {\n bloom: { type: \"bloomTOP\" },\n blur: { type: \"blurTOP\", parameters: { size: 4 } },\n edge_detect: { type: \"edgeTOP\" },\n sharpen: { type: \"sharpenTOP\" },\n threshold: { type: \"thresholdTOP\", parameters: { threshold: 0.5 } },\n invert: { type: \"levelTOP\", parameters: { invert: 1 } },\n color_grade: { type: \"levelTOP\", parameters: { gamma1: 1.1, blacklevel: 0.02 } },\n};\n\nconst GLSL_EFFECTS: Record<string, string> = {\n rgb_split: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec2 o=vec2(0.004,0.0);\n float r=texture(sTD2DInputs[0],uv+o).r; float g=texture(sTD2DInputs[0],uv).g; float b=texture(sTD2DInputs[0],uv-o).b;\n fragColor=TDOutputSwizzle(vec4(r,g,b,1.0)); }\n`,\n chromatic_aberration: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec2 o=(uv-0.5)*0.02;\n float r=texture(sTD2DInputs[0],uv+o).r; float g=texture(sTD2DInputs[0],uv).g; float b=texture(sTD2DInputs[0],uv-o).b;\n fragColor=TDOutputSwizzle(vec4(r,g,b,1.0)); }\n`,\n scanlines: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float s=0.85+0.15*step(0.5,fract(uv.y*uTD2DInfos[0].res.w*0.5));\n fragColor=TDOutputSwizzle(vec4(c.rgb*s,c.a)); }\n`,\n vignette: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float v=smoothstep(0.8,0.35,distance(uv,vec2(0.5)));\n fragColor=TDOutputSwizzle(vec4(c.rgb*v,c.a)); }\n`,\n posterize: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n vec3 p=floor(c.rgb*6.0)/6.0; fragColor=TDOutputSwizzle(vec4(p,c.a)); }\n`,\n film_grain: `out vec4 fragColor;\nfloat hash(vec2 p){return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453);}\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float g=hash(uv*uTD2DInfos[0].res.zw)*0.12-0.06; fragColor=TDOutputSwizzle(vec4(c.rgb+g,c.a)); }\n`,\n glitch: `out vec4 fragColor;\nfloat hash(float x){return fract(sin(x*127.1)*43758.5453);}\nvoid main(){ vec2 uv=vUV.st; float band=floor(uv.y*24.0);\n float off=(hash(band)-0.5)*0.06*step(0.7,hash(band*1.7));\n fragColor=TDOutputSwizzle(texture(sTD2DInputs[0],uv+vec2(off,0.0))); }\n`,\n};\n\nconst EFFECTS = [\n \"bloom\",\n \"chromatic_aberration\",\n \"film_grain\",\n \"vignette\",\n \"color_grade\",\n \"sharpen\",\n \"blur\",\n \"edge_detect\",\n \"invert\",\n \"threshold\",\n \"posterize\",\n \"glitch\",\n \"rgb_split\",\n \"scanlines\",\n] as const;\n\nexport const applyPostProcessingSchema = z.object({\n source_path: z.string().describe(\"Path of the TOP to post-process.\"),\n effects: z.array(z.enum(EFFECTS)).min(1).describe(\"Effects to apply in order.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype ApplyPostProcessingArgs = z.infer<typeof applyPostProcessingSchema>;\n\nasync function addGlslEffect(\n builder: NetworkBuilder,\n name: string,\n fragment: string,\n): Promise<string> {\n const glsl = await builder.add(\"glslTOP\", name);\n const frag = await builder.add(\"textDAT\", `${name}_frag`);\n await builder.python(\n `op(${q(frag)}).text = ${q(fragment)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n return glsl;\n}\n\nexport async function applyPostProcessingImpl(ctx: ToolContext, args: ApplyPostProcessingArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"post_fx\");\n // Wires can't cross COMPs, so pull the external source in via a Select TOP (references by path).\n const source = await builder.add(\"selectTOP\", \"source\");\n await builder.setParams(source, { top: args.source_path });\n let previous = source;\n let applied = 0;\n\n for (let i = 0; i < args.effects.length; i++) {\n const effect = args.effects[i];\n if (!effect) continue;\n let nodePath: string | undefined;\n const direct = DIRECT_EFFECTS[effect];\n if (direct) {\n nodePath = await builder.add(direct.type, `${effect}${i}`, direct.parameters);\n } else if (GLSL_EFFECTS[effect]) {\n nodePath = await addGlslEffect(builder, `${effect}${i}`, GLSL_EFFECTS[effect]);\n }\n if (!nodePath) {\n builder.warnings.push(`Effect \"${effect}\" is not supported and was skipped.`);\n continue;\n }\n await builder.connect(previous, nodePath);\n previous = nodePath;\n applied++;\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(previous, out);\n\n return finalize(ctx, {\n summary: `Applied ${applied}/${args.effects.length} post-processing effect(s) to ${args.source_path}.`,\n builder,\n outputPath: out,\n extra: { source_path: args.source_path, effects: args.effects },\n });\n });\n}\n\nexport const registerApplyPostProcessing: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"apply_post_processing\",\n {\n title: \"Apply post-processing\",\n description:\n \"Chain post-processing effects (bloom, glitch, rgb_split, vignette, etc.) onto an existing TOP. Returns the processed output.\",\n inputSchema: applyPostProcessingSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => applyPostProcessingImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport type { TdNodeError } from \"../td-client/types.js\";\n\nexport interface ErrorReport {\n path: string;\n hasErrors: boolean;\n errors: TdNodeError[];\n}\n\n/** Checks a node (or its whole sub-network) for errors after building. */\nexport async function checkErrors(\n client: TouchDesignerClient,\n path: string,\n recursive = true,\n): Promise<ErrorReport> {\n const result = recursive ? await client.getNetworkErrors(path) : await client.getNodeErrors(path);\n return { path, hasErrors: result.errors.length > 0, errors: result.errors };\n}\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\n\nexport interface PreviewResult {\n path: string;\n width: number;\n height: number;\n base64: string;\n mimeType: string;\n}\n\n/** Captures a TOP as a base64 image via the bridge preview endpoint. */\nexport async function capturePreview(\n client: TouchDesignerClient,\n path: string,\n width = 640,\n height = 360,\n): Promise<PreviewResult> {\n const preview = await client.getPreview(path, width, height);\n return {\n path: preview.path,\n width: preview.width,\n height: preview.height,\n base64: preview.base64,\n mimeType: `image/${preview.format || \"png\"}`,\n };\n}\n","/** Base error for all TouchDesigner bridge failures. */\nexport class TdError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"TdError\";\n this.code = code;\n }\n}\n\n/** The bridge could not be reached (TD not running, wrong host/port, etc.). */\nexport class TdConnectionError extends TdError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, \"TD_CONNECTION\", options);\n this.name = \"TdConnectionError\";\n }\n}\n\n/** The request exceeded the configured timeout. */\nexport class TdTimeoutError extends TdError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, \"TD_TIMEOUT\", options);\n this.name = \"TdTimeoutError\";\n }\n}\n\n/** The bridge responded but reported an error (HTTP non-2xx or `ok: false`). */\nexport class TdApiError extends TdError {\n readonly status: number | undefined;\n readonly apiCode: string | undefined;\n\n constructor(message: string, options?: { status?: number; apiCode?: string; cause?: unknown }) {\n super(message, \"TD_API\", options);\n this.name = \"TdApiError\";\n this.status = options?.status;\n this.apiCode = options?.apiCode;\n }\n}\n\n/** Produces a human-friendly, single-line description of any error. */\nexport function friendlyTdError(err: unknown): string {\n if (err instanceof TdError) return err.message;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nexport type {\n ApiEnvelope,\n CreateNodeInput,\n TdBatchOperation,\n TdBatchResult,\n TdConnection,\n TdDeleteResult,\n TdExecResult,\n TdInfo,\n TdMethodResult,\n TdNodeDetail,\n TdNodeError,\n TdNodeErrors,\n TdNodeList,\n TdNodeRef,\n TdPerformance,\n TdPreview,\n TdTopology,\n} from \"./validators.js\";\n","import type { TouchDesignerClient } from \"../../td-client/touchDesignerClient.js\";\nimport { TdApiError } from \"../../td-client/types.js\";\n\nexport interface ConnectResult {\n method: \"batch\" | \"python\";\n}\n\n/**\n * Connects two nodes. Prefers the bridge `/api/batch` connect op; if the bridge\n * responds with an API error (e.g. batch not supported), falls back to a Python\n * `inputConnectors[...].connect(...)` call. Connection/timeout errors propagate.\n */\nexport async function connectNodesViaBridge(\n client: TouchDesignerClient,\n sourcePath: string,\n targetPath: string,\n sourceOutput = 0,\n targetInput = 0,\n): Promise<ConnectResult> {\n try {\n const result = await client.batch([\n {\n action: \"connect\",\n source_path: sourcePath,\n target_path: targetPath,\n source_output: sourceOutput,\n target_input: targetInput,\n },\n ]);\n if (result.results[0]?.ok) return { method: \"batch\" };\n } catch (err) {\n if (!(err instanceof TdApiError)) throw err;\n }\n\n // Fallback: wire via Python inside TD.\n const src = JSON.stringify(sourcePath);\n const dst = JSON.stringify(targetPath);\n const python = `op(${dst}).inputConnectors[${targetInput}].connect(op(${src}).outputConnectors[${sourceOutput}])`;\n await client.executePythonScript(python, false);\n return { method: \"python\" };\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { friendlyTdError } from \"../td-client/types.js\";\n\ntype Content = CallToolResult[\"content\"];\n\nexport function textResult(text: string): CallToolResult {\n return { content: [{ type: \"text\", text }] };\n}\n\nexport function errorResult(message: string): CallToolResult {\n return { isError: true, content: [{ type: \"text\", text: message }] };\n}\n\n/** A text block followed by a pretty-printed JSON code fence. */\nexport function jsonResult(summary: string, data: unknown): CallToolResult {\n const text = `${summary}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``;\n return { content: [{ type: \"text\", text }] };\n}\n\n/**\n * A short text summary plus a machine-readable `structuredContent` payload.\n *\n * Use this (with an `outputSchema` on the tool) for read tools so agents can\n * process the data with code instead of re-parsing a JSON code fence out of the\n * conversation. The text block stays small on purpose — it is only a summary;\n * the full data travels on the `structuredContent` channel.\n */\nexport function structuredResult(summary: string, data: object): CallToolResult {\n return {\n content: [{ type: \"text\", text: summary }],\n structuredContent: data as { [key: string]: unknown },\n };\n}\n\n/** An image block (base64), optionally preceded by a caption. */\nexport function imageResult(\n base64: string,\n mimeType = \"image/png\",\n caption?: string,\n): CallToolResult {\n const content: Content = [];\n if (caption) content.push({ type: \"text\", text: caption });\n content.push({ type: \"image\", data: base64, mimeType });\n return { content };\n}\n\n/**\n * Runs a client call and formats the result, converting any TD error into a\n * friendly `isError` result instead of throwing out of the MCP handler.\n */\nexport async function guardTd<T>(\n fn: () => Promise<T>,\n onOk: (value: T) => CallToolResult,\n): Promise<CallToolResult> {\n try {\n return onOk(await fn());\n } catch (err) {\n return errorResult(friendlyTdError(err));\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { checkErrors } from \"../../feedback/errorChecker.js\";\nimport { capturePreview } from \"../../feedback/previewCapture.js\";\nimport type { Recipe, RecipeGlslUniform } from \"../../recipes/schema.js\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { connectNodesViaBridge } from \"../layer2/connectHelper.js\";\nimport { errorResult } from \"../result.js\";\nimport type { ToolContext } from \"../types.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\n/**\n * Maps each GLSL TOP uniform kind to the parameter *sequence* that binds it and the\n * per-block value sub-parameter suffixes (verified against a live GLSL TOP). A scalar\n * `uniform float` and a `uniform vecN` both bind through the \"Vectors\" page (the `vec`\n * sequence) — a float just fills the first (`valuex`) component; `color` binds through\n * the \"Colors\" page (the `color` sequence). The block name lives at `<seq><i>name`,\n * the values at `<seq><i><suffix>`. (The \"Constants\" page does not feed `uniform float`.)\n */\nconst UNIFORM_KINDS: Record<\n RecipeGlslUniform[\"kind\"],\n { seq: \"vec\" | \"color\"; fields: readonly string[] }\n> = {\n float: { seq: \"vec\", fields: [\"valuex\"] },\n vec: { seq: \"vec\", fields: [\"valuex\", \"valuey\", \"valuez\", \"valuew\"] },\n color: { seq: \"color\", fields: [\"rgbr\", \"rgbg\", \"rgbb\", \"alpha\"] },\n};\n\ninterface UniformGroup {\n node: string;\n seq: \"vec\" | \"color\";\n items: RecipeGlslUniform[];\n}\n\n/**\n * Groups uniforms by node + binding sequence, preserving order (block index = position\n * in group). `float` and `vec` share the `vec` sequence, so they land in one group and\n * receive distinct block indices.\n */\nfunction groupUniforms(uniforms: readonly RecipeGlslUniform[]): UniformGroup[] {\n const groups = new Map<string, UniformGroup>();\n for (const uniform of uniforms) {\n const { seq } = UNIFORM_KINDS[uniform.kind];\n const key = `${uniform.node} ${seq}`;\n let group = groups.get(key);\n if (!group) {\n group = { node: uniform.node, seq, items: [] };\n groups.set(key, group);\n }\n group.items.push(uniform);\n }\n return [...groups.values()];\n}\n\n/**\n * Conversion operators (e.g. `choptoTOP`, `dattoCHOP`, `toptoCHOP`, `soptoDAT`)\n * read their source from a parameter named after the source family, not from a\n * connector wire. Returns that parameter name (`chop`/`dat`/`top`/`sop`) or undefined.\n */\nfunction converterSourceParam(type: string): string | undefined {\n const match = /^(chop|dat|top|sop)to/i.exec(type);\n return match?.[1]?.toLowerCase();\n}\n\n/** Wraps a Layer 1 build, converting any thrown TD error into a friendly result. */\nexport async function runBuild(fn: () => Promise<CallToolResult>): Promise<CallToolResult> {\n try {\n return await fn();\n } catch (err) {\n return errorResult(friendlyTdError(err));\n }\n}\n\nexport interface CreatedNode {\n name: string;\n path: string;\n type: string;\n}\n\n/**\n * Stateful helper for building a network inside a container. Connection / param\n * failures are collected as warnings rather than thrown, so a partial build still\n * returns useful information (fail-forward).\n */\nexport class NetworkBuilder {\n readonly created: CreatedNode[] = [];\n readonly warnings: string[] = [];\n private readonly nameToPath = new Map<string, string>();\n private readonly pathToType = new Map<string, string>();\n\n constructor(\n private readonly ctx: ToolContext,\n readonly containerPath: string,\n ) {}\n\n async add(\n type: string,\n name?: string,\n parameters?: Record<string, unknown>,\n parentPath?: string,\n ): Promise<string> {\n const ref = await this.ctx.client.createNode({\n parent_path: parentPath ?? this.containerPath,\n type,\n name,\n parameters,\n });\n if (name) this.nameToPath.set(name, ref.path);\n if (ref.name) this.nameToPath.set(ref.name, ref.path);\n this.pathToType.set(ref.path, ref.type || type);\n this.created.push({ name: ref.name || name || \"\", path: ref.path, type: ref.type || type });\n // A fresh geometryCOMP ships with a default torus1 that renders over the real\n // geometry; clear its default children before the builder populates it.\n if (/geometrycomp/i.test(type)) {\n await this.python(`_g = op(${q(ref.path)})\\nfor _c in list(_g.children):\\n _c.destroy()`);\n }\n return ref.path;\n }\n\n pathOf(name: string): string | undefined {\n return this.nameToPath.get(name);\n }\n\n async connect(fromPath: string, toPath: string, fromOutput = 0, toInput = 0): Promise<void> {\n // Conversion ops (choptoTOP, dattoCHOP, …) take their source via a parameter.\n const targetType = this.pathToType.get(toPath);\n const param = targetType ? converterSourceParam(targetType) : undefined;\n if (param) {\n await this.setParams(toPath, { [param]: fromPath });\n return;\n }\n try {\n await connectNodesViaBridge(this.ctx.client, fromPath, toPath, fromOutput, toInput);\n } catch (err) {\n this.warnings.push(`Failed to connect ${fromPath} → ${toPath}: ${friendlyTdError(err)}`);\n }\n }\n\n async setParams(path: string, parameters: Record<string, unknown>): Promise<void> {\n try {\n await this.ctx.client.updateNodeParameters(path, parameters);\n } catch (err) {\n this.warnings.push(`Failed to set parameters on ${path}: ${friendlyTdError(err)}`);\n }\n }\n\n async python(code: string): Promise<void> {\n try {\n await this.ctx.client.executePythonScript(code, false);\n } catch (err) {\n this.warnings.push(`Python step failed: ${friendlyTdError(err)}`);\n }\n }\n}\n\n/** Creates a fresh base COMP to hold a visual system and returns a builder for it. */\nexport async function createSystemContainer(\n ctx: ToolContext,\n parentPath: string,\n name: string,\n): Promise<NetworkBuilder> {\n const container = await ctx.client.createNode({\n parent_path: parentPath,\n type: \"baseCOMP\",\n name,\n });\n return new NetworkBuilder(ctx, container.path);\n}\n\nexport interface RecipeBuildResult {\n builder: NetworkBuilder;\n outputPath?: string;\n}\n\n/** Instantiates a recipe inside a new container under `parentPath`. */\nexport async function buildFromRecipe(\n ctx: ToolContext,\n recipe: Recipe,\n parentPath: string,\n): Promise<RecipeBuildResult> {\n const builder = await createSystemContainer(ctx, parentPath, recipe.id);\n\n for (const node of recipe.nodes) {\n let parentPath: string | undefined;\n if (node.parent) {\n parentPath = builder.pathOf(node.parent);\n if (!parentPath) {\n builder.warnings.push(\n `Node \"${node.name}\" references unknown parent \"${node.parent}\" (it must appear earlier in nodes).`,\n );\n }\n }\n await builder.add(node.type, node.name, node.parameters, parentPath);\n }\n\n // Inline GLSL: place each shader in a Text DAT and point the GLSL TOP's pixeldat at it.\n if (recipe.glsl_code) {\n for (const [nodeName, code] of Object.entries(recipe.glsl_code)) {\n const target = builder.pathOf(nodeName);\n if (!target) {\n builder.warnings.push(`glsl_code references unknown node \"${nodeName}\".`);\n continue;\n }\n const fragPath = await builder.add(\"textDAT\", `${nodeName}_frag`);\n await builder.python(\n `op(${q(fragPath)}).text = ${q(code)}\\nop(${q(target)}).par.pixeldat = op(${q(fragPath)}).name`,\n );\n }\n }\n\n // GLSL TOP uniforms: these live in parameter sequences, so the block count must be\n // raised (op.seq.<seq>.numBlocks, which has no structured setter) before the\n // per-block name/value sub-parameters exist and can be set the normal way.\n for (const group of groupUniforms(recipe.glsl_uniforms)) {\n const target = builder.pathOf(group.node);\n if (!target) {\n builder.warnings.push(`glsl_uniforms references unknown node \"${group.node}\".`);\n continue;\n }\n await builder.python(\n `_seq = op(${q(target)}).seq.${group.seq}\\n_seq.numBlocks = max(_seq.numBlocks, ${group.items.length})`,\n );\n for (const [i, uniform] of group.items.entries()) {\n const { fields } = UNIFORM_KINDS[uniform.kind];\n const params: Record<string, unknown> = { [`${group.seq}${i}name`]: uniform.name };\n const values = Array.isArray(uniform.value)\n ? uniform.value\n : uniform.value === undefined\n ? []\n : [uniform.value];\n for (const [j, field] of fields.entries()) {\n const value = values[j];\n if (value !== undefined) params[`${group.seq}${i}${field}`] = value;\n }\n await builder.setParams(target, params);\n }\n }\n\n // Inline Python: set the target DAT's text.\n if (recipe.python_code) {\n for (const [nodeName, code] of Object.entries(recipe.python_code)) {\n const target = builder.pathOf(nodeName);\n if (!target) {\n builder.warnings.push(`python_code references unknown node \"${nodeName}\".`);\n continue;\n }\n await builder.python(`op(${q(target)}).text = ${q(code)}`);\n }\n }\n\n // Exposed parameters; a string value matching a node name resolves to that node's path.\n for (const param of recipe.parameters) {\n const target = builder.pathOf(param.node);\n if (!target) {\n builder.warnings.push(`Parameter \"${param.name}\" references unknown node \"${param.node}\".`);\n continue;\n }\n if (param.value === undefined) continue;\n let value = param.value;\n if (typeof value === \"string\") {\n const referenced = builder.pathOf(value);\n if (referenced) value = referenced;\n }\n await builder.setParams(target, { [param.param]: value });\n }\n\n for (const connection of recipe.connections) {\n const from = builder.pathOf(connection.from);\n const to = builder.pathOf(connection.to);\n if (!from || !to) {\n builder.warnings.push(\n `Connection ${connection.from} → ${connection.to} references an unknown node.`,\n );\n continue;\n }\n await builder.connect(from, to, connection.from_output, connection.to_input);\n }\n\n // Nested render geometry: make each flagged SOP the one its parent COMP renders,\n // clearing its siblings (including the COMP's default torus).\n for (const node of recipe.nodes) {\n if (!node.render) continue;\n const target = builder.pathOf(node.name);\n if (!target) continue;\n await builder.python(\n `_n = op(${q(target)})\\n_p = _n.parent()\\nfor _c in _p.children:\\n _c.render = False\\n _c.display = False\\n_n.render = True\\n_n.display = True`,\n );\n }\n\n const outNode =\n recipe.nodes.find((n) => /^out/i.test(n.name)) ?? recipe.nodes[recipe.nodes.length - 1];\n const outputPath = outNode ? builder.pathOf(outNode.name) : undefined;\n return { builder, outputPath };\n}\n\nexport interface FinalizeOptions {\n summary: string;\n builder: NetworkBuilder;\n outputPath?: string;\n recipeId?: string;\n capturePreviewImage?: boolean;\n extra?: Record<string, unknown>;\n}\n\n/**\n * Shared \"verify → preview → respond\" step for Layer 1 tools: runs an error check,\n * captures a preview of the output TOP, and returns a structured result with an\n * inline preview image when available.\n */\nexport async function finalize(\n ctx: ToolContext,\n options: FinalizeOptions,\n): Promise<CallToolResult> {\n const { builder } = options;\n const warnings = [...builder.warnings];\n\n let errors: Array<{ path: string; message: string }> = [];\n try {\n const report = await checkErrors(ctx.client, builder.containerPath);\n errors = report.errors;\n if (report.hasErrors)\n warnings.push(`${report.errors.length} node error(s) detected after build.`);\n } catch (err) {\n warnings.push(`Error check unavailable: ${friendlyTdError(err)}`);\n }\n\n let previewBase64: string | undefined;\n let previewMime: string | undefined;\n if (options.capturePreviewImage !== false && options.outputPath) {\n try {\n const preview = await capturePreview(ctx.client, options.outputPath);\n previewBase64 = preview.base64;\n previewMime = preview.mimeType;\n } catch (err) {\n warnings.push(`Preview unavailable: ${friendlyTdError(err)}`);\n }\n }\n\n const data = {\n container: builder.containerPath,\n created: builder.created.map((c) => c.path),\n output: options.outputPath,\n recipe: options.recipeId,\n errors,\n warnings,\n ...options.extra,\n };\n\n const content: CallToolResult[\"content\"] = [\n {\n type: \"text\",\n text: `${options.summary}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``,\n },\n ];\n if (previewBase64) {\n content.push({ type: \"image\", data: previewBase64, mimeType: previewMime ?? \"image/png\" });\n }\n return { content };\n}\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, type NetworkBuilder, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst AUDIO_SPECTRUM_SHADER = `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n float amp = texture(sTD2DInputs[0], vec2(uv.x, 0.5)).r;\n float bar = step(uv.y, clamp(amp, 0.0, 1.0));\n vec3 col = mix(vec3(0.02, 0.0, 0.08), vec3(0.1, 0.8, 1.0), uv.x) * bar;\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nexport const createAudioReactiveSchema = z.object({\n audio_source: z.enum([\"microphone\", \"file\", \"device_in\", \"existing_chop\"]).default(\"microphone\"),\n audio_file_path: z.string().optional().describe(\"Audio file path (audio_source='file').\"),\n existing_chop_path: z\n .string()\n .optional()\n .describe(\"Existing CHOP path (audio_source='existing_chop').\"),\n visual_style: z.enum([\"geometric\", \"particle\", \"feedback\", \"glsl\", \"instancing\"]),\n frequency_bands: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\n \"Spectrum resolution: sets the Audio Spectrum CHOP output length (TouchDesigner clamps it to 128–4096 bins). Higher = finer spectrum.\",\n ),\n beat_detection: z.boolean().default(true),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateAudioReactiveArgs = z.infer<typeof createAudioReactiveSchema>;\n\nasync function buildAudioSource(\n builder: NetworkBuilder,\n args: CreateAudioReactiveArgs,\n): Promise<string> {\n if (args.audio_source === \"existing_chop\" && args.existing_chop_path) {\n return args.existing_chop_path;\n }\n if (args.audio_source === \"file\") {\n return builder.add(\"audiofileinCHOP\", \"audioin\", {\n ...(args.audio_file_path ? { file: args.audio_file_path } : {}),\n play: 1,\n });\n }\n return builder.add(\"audiodeviceinCHOP\", \"audioin\");\n}\n\nexport async function createAudioReactiveImpl(ctx: ToolContext, args: CreateAudioReactiveArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"audio_reactive\");\n\n const audioSource = await buildAudioSource(builder, args);\n // Cap the spectrum output length so the downstream CHOP-to-TOP texture stays within\n // GPU limits. Left on \"Match Length To Frequency\", the spectrum emits ~22050 samples,\n // which overflows the 16384 max texture width and triggers a clamp warning. TouchDesigner\n // clamps outlength to 128–4096, so frequency_bands maps into that range.\n const outLength = Math.min(Math.max(args.frequency_bands, 128), 4096);\n const spectrum = await builder.add(\"audiospectrumCHOP\", \"spectrum\", {\n outputmenu: \"setmanually\",\n outlength: outLength,\n });\n await builder.connect(audioSource, spectrum);\n\n const analyze = await builder.add(\"analyzeCHOP\", \"level\", { function: 6 });\n await builder.connect(audioSource, analyze);\n\n if (args.beat_detection) {\n const beat = await builder.add(\"beatCHOP\", \"beat\");\n await builder.connect(audioSource, beat);\n }\n\n const audioTex = await builder.add(\"choptoTOP\", \"audio_tex\");\n await builder.connect(spectrum, audioTex);\n\n let visual: string;\n if (args.visual_style === \"glsl\") {\n // Give the visual a real canvas + RGBA format. Left on \"use input\", the GLSL TOP\n // inherits the audio texture's Nx1 mono resolution, collapsing the output to a\n // 1px-tall grayscale strip.\n visual = await builder.add(\"glslTOP\", \"visual\", {\n outputresolution: \"custom\",\n resolutionw: 1280,\n resolutionh: 720,\n format: \"rgba8fixed\",\n });\n const frag = await builder.add(\"textDAT\", \"visual_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(AUDIO_SPECTRUM_SHADER)}\\nop(${q(visual)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(audioTex, visual);\n } else {\n visual = await builder.add(\"circleTOP\", \"visual\", { radius: 0.3 });\n await builder.python(\n `c = op(${q(visual)})\\nfor p in ('radiusx', 'radiusy'):\\n try:\\n par = getattr(c.par, p)\\n par.expr = \"0.2 + op('level')['chan1'] * 0.6\"\\n except Exception: pass`,\n );\n builder.warnings.push(\n `Visual style \"${args.visual_style}\" is approximated: a circle driven by the audio level. Refine the mapping for production.`,\n );\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(visual, out);\n\n return finalize(ctx, {\n summary: `Created an audio-reactive system (source: ${args.audio_source}, style: ${args.visual_style}, ${args.frequency_bands} bands).`,\n builder,\n outputPath: out,\n extra: {\n audio_source: args.audio_source,\n visual_style: args.visual_style,\n beat_detection: args.beat_detection,\n },\n });\n });\n}\n\nexport const registerCreateAudioReactive: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_audio_reactive\",\n {\n title: \"Create audio-reactive visual\",\n description:\n \"Build an audio analysis chain (spectrum + level + optional beat) and a visual driven by it. The 'glsl' style renders a spectrum visualization; other styles are approximated.\",\n inputSchema: createAudioReactiveSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createAudioReactiveImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst BARS_SHADER = `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n float v = texture(sTD2DInputs[0], vec2(uv.x, 0.5)).r;\n float bar = step(uv.y, clamp(v, 0.0, 1.0));\n vec3 col = mix(vec3(0.03, 0.05, 0.1), vec3(0.2, 0.9, 0.6), uv.x) * bar;\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nconst SOURCE_TYPE = {\n table: \"tableDAT\",\n file: \"fileinDAT\",\n chop: \"constantCHOP\",\n} as const;\n\nexport const createDataVisualizationSchema = z.object({\n data_source: z.enum([\"table\", \"file\", \"chop\"]).default(\"table\"),\n chart_style: z.enum([\"bars\", \"graph\", \"points\"]).default(\"bars\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateDataVisualizationArgs = z.infer<typeof createDataVisualizationSchema>;\n\nexport async function createDataVisualizationImpl(\n ctx: ToolContext,\n args: CreateDataVisualizationArgs,\n) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"data_viz\");\n const source = await builder.add(SOURCE_TYPE[args.data_source], \"data\");\n\n // Seed the placeholder table so the chart shows sample bars immediately instead of a\n // blank 1x1 output; an empty table yields a single zero-valued sample.\n if (args.data_source === \"table\") {\n const rows = Array.from({ length: 16 }, (_, i) =>\n (0.5 + 0.45 * Math.sin(i * 0.6)).toFixed(3),\n );\n await builder.python(\n `d = op(${q(source)})\\nd.clear()\\nfor v in ${JSON.stringify(rows)}:\\n d.appendRow([v])`,\n );\n }\n\n let chop = source;\n if (args.data_source !== \"chop\") {\n // dattoCHOP defaults firstcolumn to \"names\", which turns a single numeric column into\n // channel *names* with value 0; read the column as values (one channel, N samples).\n chop = await builder.add(\"dattoCHOP\", \"datto\", {\n firstrow: \"values\",\n firstcolumn: \"values\",\n output: \"chanpercol\",\n });\n await builder.connect(source, chop);\n }\n\n const tex = await builder.add(\"choptoTOP\", \"data_tex\");\n await builder.connect(chop, tex);\n\n let visual = tex;\n if (args.chart_style === \"bars\") {\n // Fixed canvas + RGBA. Left on \"use input\", the chart inherits the data texture's\n // tiny Nx1 mono resolution, collapsing the output to a grayscale speck.\n const glsl = await builder.add(\"glslTOP\", \"chart\", {\n outputresolution: \"custom\",\n resolutionw: 1280,\n resolutionh: 720,\n format: \"rgba8fixed\",\n });\n const frag = await builder.add(\"textDAT\", \"chart_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(BARS_SHADER)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(tex, glsl);\n visual = glsl;\n } else {\n builder.warnings.push(\n `Chart style \"${args.chart_style}\" renders the data as a texture strip; richer plotting needs customization.`,\n );\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(visual, out);\n builder.warnings.push(\n \"Wire your real data into the 'data' node — a placeholder source was created.\",\n );\n\n return finalize(ctx, {\n summary: `Created a data visualization (source: ${args.data_source}, style: ${args.chart_style}).`,\n builder,\n outputPath: out,\n extra: { data_source: args.data_source, chart_style: args.chart_style },\n });\n });\n}\n\nexport const registerCreateDataVisualization: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_data_visualization\",\n {\n title: \"Create data visualization\",\n description:\n \"Build a data-driven visualization: a data source feeds a CHOP that drives a chart TOP. Wire your real data into the created 'data' node.\",\n inputSchema: createDataVisualizationSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createDataVisualizationImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\n// Builds a GLSL fragment that maps the grayscale luminance through a 1- or 2-color\n// gradient, so a described palette (\"blues and magentas\") survives to the output.\nfunction colorizeShader(colors: string[]): string {\n const toVec3 = (hex: string | undefined): string => {\n const m = hex ? /^#?([0-9a-fA-F]{6})$/.exec(hex.trim()) : null;\n if (!m?.[1]) return \"vec3(1.0)\";\n const n = Number.parseInt(m[1], 16);\n const r = ((n >> 16) & 255) / 255;\n const g = ((n >> 8) & 255) / 255;\n const b = (n & 255) / 255;\n return `vec3(${r.toFixed(4)}, ${g.toFixed(4)}, ${b.toFixed(4)})`;\n };\n const lo = colors.length >= 2 ? toVec3(colors[0]) : \"vec3(0.0)\";\n const hi = toVec3(colors[colors.length - 1]);\n return `out vec4 fragColor;\nvoid main(){\n float l = texture(sTD2DInputs[0], vUV.st).r;\n fragColor = TDOutputSwizzle(vec4(mix(${lo}, ${hi}, l), 1.0));\n}\n`;\n}\n\nconst SEED_TYPES = {\n noise: \"noiseTOP\",\n shape: \"circleTOP\",\n image: \"moviefileinTOP\",\n video: \"moviefileinTOP\",\n webcam: \"videodeviceinTOP\",\n glsl: \"glslTOP\",\n} as const;\n\nconst TRANSFORM_TYPES = {\n blur: \"blurTOP\",\n displace: \"displaceTOP\",\n edge: \"edgeTOP\",\n level: \"levelTOP\",\n hsv_adjust: \"hsvadjustTOP\",\n transform: \"transformTOP\",\n mirror: \"mirrorTOP\",\n tile: \"tileTOP\",\n luma_blur: \"lumablurTOP\",\n} as const;\n\nexport const createFeedbackNetworkSchema = z.object({\n seed_type: z.enum([\"noise\", \"shape\", \"image\", \"video\", \"webcam\", \"glsl\"]).default(\"noise\"),\n transformations: z\n .array(\n z.enum([\n \"blur\",\n \"displace\",\n \"edge\",\n \"level\",\n \"hsv_adjust\",\n \"transform\",\n \"mirror\",\n \"tile\",\n \"luma_blur\",\n ]),\n )\n .default([\"blur\", \"displace\", \"level\"]),\n feedback_gain: z.number().min(0).max(1).default(0.95),\n colors: z\n .array(z.string())\n .max(2)\n .optional()\n .describe(\"Up to two hex colors to colorize the otherwise-grayscale output.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateFeedbackNetworkArgs = z.infer<typeof createFeedbackNetworkSchema>;\n\nexport async function createFeedbackNetworkImpl(ctx: ToolContext, args: CreateFeedbackNetworkArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"feedback_system\");\n\n const seed = await builder.add(SEED_TYPES[args.seed_type], \"seed\", {\n ...(args.seed_type === \"noise\" ? { monochrome: 1, period: 4 } : {}),\n });\n const feedback = await builder.add(\"feedbackTOP\", \"feedback1\");\n const comp = await builder.add(\"compositeTOP\", \"comp1\");\n // The TD default operand (multiply) collapses the loop to black; an additive\n // operand injects the seed each frame, and \"maximum\" stays bounded under feedback gain.\n await builder.setParams(comp, { operand: \"maximum\" });\n await builder.connect(seed, comp, 0, 0);\n await builder.connect(feedback, comp, 0, 1);\n // feedbackTOP needs an input for its first frame; seed it before the loop closes.\n await builder.connect(seed, feedback);\n\n let last = comp;\n for (const transformation of args.transformations) {\n const node = await builder.add(TRANSFORM_TYPES[transformation], transformation);\n await builder.connect(last, node);\n // displaceTOP and lumablurTOP need a second input (the displacement / luma map).\n if (transformation === \"displace\" || transformation === \"luma_blur\") {\n await builder.connect(seed, node, 0, 1);\n }\n last = node;\n }\n\n const gain = await builder.add(\"levelTOP\", \"gain\");\n await builder.setParams(gain, { gain: args.feedback_gain });\n await builder.connect(last, gain);\n\n // Colorize only the final output; the loop keeps sampling the grayscale gain node\n // so the feedback stays clean.\n let output = gain;\n if (args.colors && args.colors.length > 0) {\n const colorize = await builder.add(\"glslTOP\", \"colorize\");\n const frag = await builder.add(\"textDAT\", \"colorize_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(colorizeShader(args.colors))}\\nop(${q(colorize)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(gain, colorize);\n output = colorize;\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(output, out);\n\n // Close the loop: feedbackTOP samples the gain node's output.\n await builder.python(`op(${q(feedback)}).par.top = op(${q(gain)}).name`);\n\n return finalize(ctx, {\n summary: `Created a feedback network (seed: ${args.seed_type}, gain: ${args.feedback_gain}, ${args.transformations.length} transform(s)).`,\n builder,\n outputPath: out,\n extra: { seed_type: args.seed_type, transformations: args.transformations },\n });\n });\n}\n\nexport const registerCreateFeedbackNetwork: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_feedback_network\",\n {\n title: \"Create feedback network\",\n description:\n \"Build a feedback-based visual system: a seed feeds a loop that is transformed (blur/displace/etc.) and fed back each frame. Great for evolving, hypnotic visuals.\",\n inputSchema: createFeedbackNetworkSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createFeedbackNetworkImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport {\n buildFromRecipe,\n createSystemContainer,\n finalize,\n type NetworkBuilder,\n runBuild,\n} from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst DEFAULT_PLASMA = `out vec4 fragColor;\nuniform float uTime;\nvoid main(){\n vec2 uv = vUV.st;\n float v = sin(uv.x * 10.0 + uTime) + sin(uv.y * 10.0 + uTime * 0.7);\n v += sin((uv.x + uv.y) * 8.0 + uTime * 1.3);\n vec3 col = 0.5 + 0.5 * cos(vec3(0.0, 2.0, 4.0) + v);\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nconst RECIPE_FOR = new Map<string, string>([\n [\"reaction_diffusion\", \"reaction_diffusion\"],\n [\"noise_landscape\", \"noise_landscape\"],\n]);\n\nexport const createGenerativeArtSchema = z.object({\n technique: z.enum([\n \"noise_landscape\",\n \"reaction_diffusion\",\n \"strange_attractor\",\n \"l_system\",\n \"cellular_automata\",\n \"flow_field\",\n \"voronoi\",\n \"fractal\",\n \"custom_glsl\",\n ]),\n color_palette: z.string().optional().describe(\"Free-text palette hint (best-effort).\"),\n evolution_speed: z.number().positive().default(1.0),\n custom_glsl_code: z\n .string()\n .optional()\n .describe(\"Fragment shader (only for technique 'custom_glsl').\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateGenerativeArtArgs = z.infer<typeof createGenerativeArtSchema>;\n\nasync function buildGlslGenerative(\n ctx: ToolContext,\n parentPath: string,\n name: string,\n fragment: string,\n): Promise<{ builder: NetworkBuilder; outputPath: string }> {\n const builder = await createSystemContainer(ctx, parentPath, name);\n const glsl = await builder.add(\"glslTOP\", \"glsl1\");\n const frag = await builder.add(\"textDAT\", \"glsl1_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(fragment)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(glsl, out);\n return { builder, outputPath: out };\n}\n\nexport async function createGenerativeArtImpl(ctx: ToolContext, args: CreateGenerativeArtArgs) {\n return runBuild(async () => {\n const recipeId = RECIPE_FOR.get(args.technique);\n if (recipeId) {\n const recipe = ctx.recipes.get(recipeId);\n if (recipe) {\n const { builder, outputPath } = await buildFromRecipe(ctx, recipe, args.parent_path);\n return finalize(ctx, {\n summary: `Created \"${recipe.name}\" generative system.`,\n builder,\n outputPath,\n recipeId,\n extra: { technique: args.technique, color_palette: args.color_palette },\n });\n }\n }\n\n if (args.technique === \"custom_glsl\") {\n const fragment = args.custom_glsl_code ?? DEFAULT_PLASMA;\n const { builder, outputPath } = await buildGlslGenerative(\n ctx,\n args.parent_path,\n \"generative_custom_glsl\",\n fragment,\n );\n if (!args.custom_glsl_code) {\n builder.warnings.push(\"No custom_glsl_code provided; used a default plasma shader.\");\n }\n return finalize(ctx, {\n summary: \"Created a custom GLSL generative system.\",\n builder,\n outputPath,\n extra: { technique: args.technique },\n });\n }\n\n // Other techniques: prefer a matching GLSL knowledge pattern, else animated noise.\n const pattern = ctx.knowledge.getGlslPattern(args.technique);\n if (pattern?.code?.snippet) {\n const { builder, outputPath } = await buildGlslGenerative(\n ctx,\n args.parent_path,\n `generative_${args.technique}`,\n pattern.code.snippet,\n );\n return finalize(ctx, {\n summary: `Created a \"${args.technique}\" system from the GLSL knowledge pattern \"${pattern.name}\".`,\n builder,\n outputPath,\n extra: { technique: args.technique, glsl_pattern: pattern.id },\n });\n }\n\n const builder = await createSystemContainer(\n ctx,\n args.parent_path,\n `generative_${args.technique}`,\n );\n const noise = await builder.add(\"noiseTOP\", \"noise1\", { monochrome: 0, period: 6 });\n const level = await builder.add(\"levelTOP\", \"level1\");\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(noise, level);\n await builder.connect(level, out);\n await builder.python(\n `p = op(${q(noise)}).par.tz\\np.expr = ${q(`absTime.seconds * ${args.evolution_speed}`)}`,\n );\n builder.warnings.push(\n `Technique \"${args.technique}\" is approximated with an animated-noise generator in this version.`,\n );\n return finalize(ctx, {\n summary: `Created an approximate \"${args.technique}\" generative system.`,\n builder,\n outputPath: out,\n extra: { technique: args.technique, evolution_speed: args.evolution_speed },\n });\n });\n}\n\nexport const registerCreateGenerativeArt: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_generative_art\",\n {\n title: \"Create generative art\",\n description:\n \"Create an evolving generative visual. Known techniques (reaction_diffusion, noise_landscape) use validated recipes; custom_glsl uses your shader; others fall back to a knowledge GLSL pattern or animated noise.\",\n inputSchema: createGenerativeArtSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createGenerativeArtImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst EMITTER_SOP = {\n point: \"addSOP\",\n line: \"lineSOP\",\n circle: \"circleSOP\",\n sphere: \"sphereSOP\",\n mesh: \"boxSOP\",\n image: \"gridSOP\",\n} as const;\n\nexport const createParticleSystemSchema = z.object({\n emitter_shape: z.enum([\"point\", \"line\", \"circle\", \"sphere\", \"mesh\", \"image\"]).default(\"point\"),\n particle_count: z.number().int().positive().default(10000),\n forces: z\n .array(z.enum([\"gravity\", \"noise\", \"attract\", \"repel\", \"vortex\", \"turbulence\", \"drag\"]))\n .default([\"noise\", \"gravity\"]),\n render_style: z\n .enum([\"points\", \"sprites\", \"lines\", \"trails\", \"instanced_geo\"])\n .default(\"sprites\"),\n lifetime: z.number().positive().default(3),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateParticleSystemArgs = z.infer<typeof createParticleSystemSchema>;\n\nexport async function createParticleSystemImpl(ctx: ToolContext, args: CreateParticleSystemArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"particle_system\");\n\n // Geometry COMP holds the particle SOP chain so the renderer can see it.\n const geo = await builder.add(\"geometryCOMP\", \"geo\");\n\n const emitter = await ctx.client.createNode({\n parent_path: geo,\n type: EMITTER_SOP[args.emitter_shape],\n name: \"emitter\",\n });\n const particle = await ctx.client.createNode({\n parent_path: geo,\n type: \"particleSOP\",\n name: \"particle\",\n parameters: { life: args.lifetime },\n });\n builder.created.push(\n { name: \"emitter\", path: emitter.path, type: emitter.type },\n { name: \"particle\", path: particle.path, type: particle.type },\n );\n await builder.connect(emitter.path, particle.path);\n\n const mat = await builder.add(\n args.render_style === \"sprites\" ? \"pointspriteMAT\" : \"constantMAT\",\n \"mat\",\n );\n const cam = await builder.add(\"cameraCOMP\", \"cam\", { tz: 5 });\n const light = await builder.add(\"lightCOMP\", \"light\", { tx: 3, ty: 4, tz: 4 });\n const render = await builder.add(\"renderTOP\", \"render\");\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(render, out);\n\n await builder.python(\n [\n `g = op(${q(geo)})`,\n \"p = op(g.path + '/particle')\",\n \"p.render = True\",\n \"p.display = True\",\n `g.par.material = ${q(mat)}`,\n `r = op(${q(render)})`,\n `r.par.geometry = ${q(geo)}`,\n `r.par.camera = ${q(cam)}`,\n `r.par.lights = ${q(light)}`,\n ].join(\"\\n\"),\n );\n\n builder.warnings.push(\n `Particle forces (${args.forces.join(\", \")}), exact count (${args.particle_count}) and the \"${args.render_style}\" render style are scaffolded; tune the particleSOP and material for production.`,\n );\n\n return finalize(ctx, {\n summary: `Created a particle system (emitter: ${args.emitter_shape}, ~${args.particle_count} particles, render: ${args.render_style}).`,\n builder,\n outputPath: out,\n extra: {\n emitter_shape: args.emitter_shape,\n forces: args.forces,\n render_style: args.render_style,\n },\n });\n });\n}\n\nexport const registerCreateParticleSystem: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_particle_system\",\n {\n title: \"Create particle system\",\n description:\n \"Build a particle system: an emitter feeds a particle SOP inside a Geometry COMP, rendered with a camera + light. Forces and render style are scaffolded for further tuning.\",\n inputSchema: createParticleSystemSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createParticleSystemImpl(ctx, args),\n );\n};\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createAudioReactiveImpl } from \"./createAudioReactive.js\";\nimport { createFeedbackNetworkImpl } from \"./createFeedbackNetwork.js\";\nimport { createGenerativeArtImpl } from \"./createGenerativeArt.js\";\nimport { createParticleSystemImpl } from \"./createParticleSystem.js\";\nimport { significantTerms } from \"./intent.js\";\nimport { buildFromRecipe, finalize, runBuild } from \"./orchestration.js\";\n\nexport const createVisualSystemSchema = z.object({\n description: z.string().min(1).describe(\"Natural-language description of the visual system.\"),\n parent_path: z.string().default(\"/project1\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\", \"custom\"]).default(\"1080p\"),\n target_fps: z.number().positive().default(60),\n});\ntype CreateVisualSystemArgs = z.infer<typeof createVisualSystemSchema>;\n\ntype Kind =\n | \"audio\"\n | \"particle\"\n | \"feedback\"\n | \"reaction_diffusion\"\n | \"noise_landscape\"\n | \"default\";\n\nfunction classify(description: string): { kind: Kind; label: string } {\n const d = description.toLowerCase();\n const has = (...words: string[]) => words.some((w) => d.includes(w));\n if (has(\"audio\", \"sound\", \"music\", \"beat\", \"frequenc\", \"spectrum\", \"reactive\")) {\n return { kind: \"audio\", label: \"audio-reactive\" };\n }\n if (has(\"particle\", \"swarm\", \"galaxy\", \"sparkle\", \"emitter\")) {\n return { kind: \"particle\", label: \"particle\" };\n }\n if (has(\"reaction\", \"diffusion\", \"gray-scott\", \"gray scott\")) {\n return { kind: \"reaction_diffusion\", label: \"reaction-diffusion\" };\n }\n if (has(\"landscape\", \"terrain\", \"mountain\", \"heightfield\")) {\n return { kind: \"noise_landscape\", label: \"noise landscape\" };\n }\n if (has(\"feedback\", \"tunnel\", \"echo\", \"trail\", \"infinite\", \"kaleido\")) {\n return { kind: \"feedback\", label: \"feedback\" };\n }\n return { kind: \"default\", label: \"generative\" };\n}\n\nfunction pickAudioStyle(\n description: string,\n): \"geometric\" | \"particle\" | \"feedback\" | \"glsl\" | \"instancing\" {\n const d = description.toLowerCase();\n if (d.includes(\"particle\")) return \"particle\";\n if (d.includes(\"feedback\") || d.includes(\"tunnel\")) return \"feedback\";\n if (d.includes(\"geometr\") || d.includes(\"shape\")) return \"geometric\";\n if (d.includes(\"instanc\")) return \"instancing\";\n return \"glsl\";\n}\n\nfunction pickEmitter(\n description: string,\n): \"point\" | \"line\" | \"circle\" | \"sphere\" | \"mesh\" | \"image\" {\n const d = description.toLowerCase();\n if (d.includes(\"galaxy\") || d.includes(\"sphere\") || d.includes(\"orbit\")) return \"sphere\";\n if (d.includes(\"ring\") || d.includes(\"circle\")) return \"circle\";\n if (d.includes(\"line\")) return \"line\";\n return \"point\";\n}\n\nconst COLOR_WORDS: Record<string, string> = {\n red: \"#e03030\",\n crimson: \"#c01040\",\n orange: \"#ff7a18\",\n amber: \"#ffb000\",\n yellow: \"#f5e050\",\n gold: \"#e8c020\",\n green: \"#30c050\",\n lime: \"#9be025\",\n teal: \"#10b0a0\",\n cyan: \"#20d0e0\",\n blue: \"#1840d0\",\n navy: \"#0a1a66\",\n indigo: \"#3010a0\",\n purple: \"#7a20c0\",\n violet: \"#8a40e0\",\n magenta: \"#d020a0\",\n pink: \"#ff60b0\",\n white: \"#f0f0f0\",\n black: \"#101015\",\n};\n\n// Best-effort: pull up to two named colors from the description so a feedback system\n// can honor a requested palette instead of rendering grayscale.\nfunction parseColors(description: string): string[] {\n const d = description.toLowerCase();\n const found: string[] = [];\n for (const [word, hex] of Object.entries(COLOR_WORDS)) {\n if (new RegExp(`\\\\b${word}`).test(d) && !found.includes(hex)) found.push(hex);\n if (found.length >= 2) break;\n }\n return found;\n}\n\nfunction withNote(result: CallToolResult, note: string): CallToolResult {\n return { ...result, content: [{ type: \"text\", text: note }, ...result.content] };\n}\n\nexport async function createVisualSystemImpl(ctx: ToolContext, args: CreateVisualSystemArgs) {\n const { kind, label } = classify(args.description);\n const note = `Interpreted \"${args.description}\" as a ${label} system (target ${args.resolution} @ ${args.target_fps}fps).`;\n ctx.logger.info(\"create_visual_system classified\", { kind, description: args.description });\n\n switch (kind) {\n case \"audio\":\n return withNote(\n await createAudioReactiveImpl(ctx, {\n audio_source: \"microphone\",\n visual_style: pickAudioStyle(args.description),\n frequency_bands: 8,\n beat_detection: true,\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"particle\":\n return withNote(\n await createParticleSystemImpl(ctx, {\n emitter_shape: pickEmitter(args.description),\n particle_count: 10000,\n forces: [\"noise\", \"gravity\"],\n render_style: \"sprites\",\n lifetime: 3,\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"feedback\":\n return withNote(\n await createFeedbackNetworkImpl(ctx, {\n seed_type: \"noise\",\n transformations: [\"blur\", \"displace\", \"level\"],\n feedback_gain: 0.95,\n colors: parseColors(args.description),\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"reaction_diffusion\":\n case \"noise_landscape\":\n return withNote(\n await createGenerativeArtImpl(ctx, {\n technique: kind,\n evolution_speed: 1.0,\n parent_path: args.parent_path,\n }),\n note,\n );\n default: {\n // Try to match a recipe by keywords before falling back to generative GLSL.\n const recipe = ctx.recipes.findByTags(significantTerms(args.description));\n if (recipe) {\n return runBuild(async () => {\n const { builder, outputPath } = await buildFromRecipe(ctx, recipe, args.parent_path);\n return withNote(\n await finalize(ctx, {\n summary: `Built \"${recipe.name}\" from a matching recipe.`,\n builder,\n outputPath,\n recipeId: recipe.id,\n }),\n note,\n );\n });\n }\n return withNote(\n await createGenerativeArtImpl(ctx, {\n technique: \"custom_glsl\",\n evolution_speed: 1.0,\n parent_path: args.parent_path,\n }),\n note,\n );\n }\n }\n}\n\nexport const registerCreateVisualSystem: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_visual_system\",\n {\n title: \"Create visual system\",\n description:\n \"Create a complete visual system from a natural-language description. Classifies intent (audio-reactive, particle, feedback, reaction-diffusion, landscape, generative) and builds it in a self-contained COMP, then verifies and previews it.\",\n inputSchema: createVisualSystemSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createVisualSystemImpl(ctx, args),\n );\n};\n","/**\n * Words that describe almost any visual and so must not drive recipe matching.\n * \"generative\", for instance, is a tag on most recipes, so leaving it in makes\n * findByTags pick an unrelated recipe (e.g. \"glowing generative plasma\" → particle galaxy).\n */\nconst GENERIC_TERMS = new Set([\n \"generative\",\n \"visual\",\n \"visuals\",\n \"glow\",\n \"glowing\",\n \"abstract\",\n \"field\",\n \"system\",\n \"animated\",\n \"evolving\",\n \"dynamic\",\n \"background\",\n \"colorful\",\n \"colourful\",\n \"bright\",\n \"beautiful\",\n]);\n\n/** Splits a description into discriminating lowercase terms for recipe tag matching. */\nexport function significantTerms(description: string): string[] {\n return description\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 3 && !GENERIC_TERMS.has(t));\n}\n","import { z } from \"zod\";\nimport { textResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { significantTerms } from \"./intent.js\";\n\nexport const describeProjectSchema = z.object({\n description: z.string().min(1).describe(\"Natural-language description of the visual you want.\"),\n});\ntype DescribeProjectArgs = z.infer<typeof describeProjectSchema>;\n\nexport function describeProjectImpl(ctx: ToolContext, args: DescribeProjectArgs) {\n const d = args.description.toLowerCase();\n const has = (...words: string[]) => words.some((w) => d.includes(w));\n\n let tool: string;\n let summary: string;\n let recipeId: string | undefined;\n\n if (has(\"audio\", \"sound\", \"music\", \"beat\", \"frequenc\", \"spectrum\", \"reactive\")) {\n tool = \"create_audio_reactive\";\n summary = \"audio-reactive visual\";\n } else if (has(\"particle\", \"swarm\", \"galaxy\", \"sparkle\", \"emitter\")) {\n tool = \"create_particle_system\";\n summary = \"particle system\";\n } else if (has(\"reaction\", \"diffusion\", \"gray-scott\", \"gray scott\")) {\n tool = \"create_generative_art\";\n summary = \"reaction-diffusion simulation\";\n recipeId = \"reaction_diffusion\";\n } else if (has(\"landscape\", \"terrain\", \"mountain\", \"heightfield\")) {\n tool = \"create_generative_art\";\n summary = \"3D noise landscape\";\n recipeId = \"noise_landscape\";\n } else if (has(\"feedback\", \"tunnel\", \"echo\", \"trail\", \"kaleido\")) {\n tool = \"create_feedback_network\";\n summary = \"feedback network\";\n } else {\n tool = \"create_generative_art\";\n summary = \"generative visual\";\n recipeId = ctx.recipes.findByTags(significantTerms(d))?.id;\n }\n\n const lines: string[] = [\n `Plan for: \"${args.description}\"`,\n \"\",\n `Interpreted as: ${summary}.`,\n `Recommended tool: ${tool}${recipeId ? ` (recipe: ${recipeId})` : \"\"}.`,\n ];\n\n if (recipeId) {\n const recipe = ctx.recipes.get(recipeId);\n if (recipe) {\n lines.push(\"\", `Recipe \"${recipe.name}\" would create:`);\n for (const node of recipe.nodes) {\n lines.push(` - ${node.name} (${node.type})${node.comment ? ` — ${node.comment}` : \"\"}`);\n }\n }\n }\n\n lines.push(\"\", \"Next: call the recommended tool, then check get_td_node_errors and get_preview.\");\n return textResult(lines.join(\"\\n\"));\n}\n\nexport const registerDescribeProject: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"plan_visual\",\n {\n title: \"Plan a visual from a description\",\n description:\n \"Turn a natural-language description of a visual you WANT into a build plan (which tool/recipe and nodes) — a dry run that creates nothing. Note: this does NOT inspect the current TouchDesigner project; to read existing nodes use get_td_nodes / get_td_topology / find_td_nodes.\",\n inputSchema: describeProjectSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => describeProjectImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { capturePreview } from \"../../feedback/previewCapture.js\";\nimport { guardTd, imageResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getPreviewSchema = z.object({\n node_path: z.string().describe(\"Path of the TOP node to capture.\"),\n width: z.number().int().positive().default(640),\n height: z.number().int().positive().default(360),\n});\ntype GetPreviewArgs = z.infer<typeof getPreviewSchema>;\n\nexport async function getPreviewImpl(ctx: ToolContext, args: GetPreviewArgs) {\n return guardTd(\n () => capturePreview(ctx.client, args.node_path, args.width, args.height),\n (preview) =>\n imageResult(\n preview.base64,\n preview.mimeType,\n `Preview of ${args.node_path} (${preview.width}×${preview.height}).`,\n ),\n );\n}\n\nexport const registerGetPreview: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_preview\",\n {\n title: \"Preview a TOP\",\n description: \"Capture a TOP node as an inline image so you can see what was created.\",\n inputSchema: getPreviewSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getPreviewImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { connectNodesViaBridge } from \"../layer2/connectHelper.js\";\nimport { jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst OUTPUT_MAP = {\n window: \"windowCOMP\",\n ndi: \"ndioutTOP\",\n syphon_spout: \"syphonspoutoutTOP\",\n record: \"moviefileoutTOP\",\n touch_out: \"touchoutTOP\",\n} as const;\n\nconst RESOLUTIONS = {\n \"720p\": [1280, 720],\n \"1080p\": [1920, 1080],\n \"4K\": [3840, 2160],\n} as const;\n\nexport const setupOutputSchema = z.object({\n source_path: z.string().describe(\"Path of the final TOP to output.\"),\n output_type: z.enum([\"window\", \"ndi\", \"syphon_spout\", \"record\", \"touch_out\"]).default(\"window\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\"]).default(\"1080p\"),\n record_format: z.enum([\"mp4\", \"mov\", \"image_sequence\"]).optional(),\n parent_path: z.string().default(\"/project1\"),\n});\ntype SetupOutputArgs = z.infer<typeof setupOutputSchema>;\n\nexport async function setupOutputImpl(ctx: ToolContext, args: SetupOutputArgs) {\n return runBuild(async () => {\n const warnings: string[] = [];\n const node = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: OUTPUT_MAP[args.output_type],\n name: `${args.output_type}_out`,\n });\n\n if (args.output_type === \"window\") {\n const [width, height] = RESOLUTIONS[args.resolution];\n try {\n await ctx.client.executePythonScript(\n `w = op(${q(node.path)})\\nw.par.winop = ${q(args.source_path)}\\nw.par.winw = ${width}\\nw.par.winh = ${height}`,\n false,\n );\n } catch (err) {\n warnings.push(`Could not configure window: ${friendlyTdError(err)}`);\n }\n } else {\n try {\n await connectNodesViaBridge(ctx.client, args.source_path, node.path);\n } catch (err) {\n warnings.push(`Could not connect source to output: ${friendlyTdError(err)}`);\n }\n }\n\n if (args.output_type === \"record\" && args.record_format) {\n try {\n await ctx.client.updateNodeParameters(node.path, { type: args.record_format });\n } catch (err) {\n warnings.push(`Could not set record format: ${friendlyTdError(err)}`);\n }\n }\n\n return jsonResult(`Configured ${args.output_type} output for ${args.source_path}.`, {\n output: node.path,\n output_type: args.output_type,\n source_path: args.source_path,\n resolution: args.resolution,\n warnings,\n });\n });\n}\n\nexport const registerSetupOutput: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"setup_output\",\n {\n title: \"Set up output\",\n description:\n \"Route a TOP to an output: a display window, NDI stream, Syphon/Spout, a recording, or Touch Out.\",\n inputSchema: setupOutputSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => setupOutputImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerApplyPostProcessing } from \"./applyPostProcessing.js\";\nimport { registerCreateAudioReactive } from \"./createAudioReactive.js\";\nimport { registerCreateDataVisualization } from \"./createDataVisualization.js\";\nimport { registerCreateFeedbackNetwork } from \"./createFeedbackNetwork.js\";\nimport { registerCreateGenerativeArt } from \"./createGenerativeArt.js\";\nimport { registerCreateParticleSystem } from \"./createParticleSystem.js\";\nimport { registerCreateVisualSystem } from \"./createVisualSystem.js\";\nimport { registerDescribeProject } from \"./describeProject.js\";\nimport { registerGetPreview } from \"./getPreview.js\";\nimport { registerSetupOutput } from \"./setupOutput.js\";\n\nexport const layer1Registrars: ToolRegistrar[] = [\n registerCreateFeedbackNetwork,\n registerCreateGenerativeArt,\n registerCreateAudioReactive,\n registerCreateParticleSystem,\n registerCreateDataVisualization,\n registerApplyPostProcessing,\n registerSetupOutput,\n registerGetPreview,\n registerDescribeProject,\n registerCreateVisualSystem,\n];\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { connectNodesViaBridge } from \"./connectHelper.js\";\n\nexport const connectNodesSchema = z.object({\n source_path: z.string().describe(\"Path of the source node (output side).\"),\n target_path: z.string().describe(\"Path of the target node (input side).\"),\n source_output: z.number().int().nonnegative().default(0),\n target_input: z.number().int().nonnegative().default(0),\n});\ntype ConnectNodesArgs = z.infer<typeof connectNodesSchema>;\n\nexport async function connectNodesImpl(ctx: ToolContext, args: ConnectNodesArgs) {\n return guardTd(\n () =>\n connectNodesViaBridge(\n ctx.client,\n args.source_path,\n args.target_path,\n args.source_output,\n args.target_input,\n ),\n (result) =>\n jsonResult(`Connected ${args.source_path} → ${args.target_path} (via ${result.method}).`, {\n source: args.source_path,\n target: args.target_path,\n source_output: args.source_output,\n target_input: args.target_input,\n method: result.method,\n }),\n );\n}\n\nexport const registerConnectNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"connect_nodes\",\n {\n title: \"Connect two nodes\",\n description:\n \"Wire one node's output into another node's input. Uses the batch endpoint when available, with a Python fallback.\",\n inputSchema: connectNodesSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => connectNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst COMP_MAP = {\n container: \"containerCOMP\",\n base: \"baseCOMP\",\n} as const;\n\nexport const createContainerSchema = z.object({\n parent_path: z.string().default(\"/project1\").describe(\"Parent COMP to create the container in.\"),\n name: z.string().optional(),\n comp_type: z\n .enum([\"container\", \"base\"])\n .default(\"container\")\n .describe(\"'container' (2D panel COMP) or 'base' (generic COMP).\"),\n});\ntype CreateContainerArgs = z.infer<typeof createContainerSchema>;\n\nexport async function createContainerImpl(ctx: ToolContext, args: CreateContainerArgs) {\n return guardTd(\n () =>\n ctx.client.createNode({\n parent_path: args.parent_path,\n type: COMP_MAP[args.comp_type],\n name: args.name,\n }),\n (node) => jsonResult(`Created ${args.comp_type} COMP at ${node.path}.`, { node }),\n );\n}\n\nexport const registerCreateContainer: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_container\",\n {\n title: \"Create container COMP\",\n description: \"Create a self-contained COMP to hold a visual system.\",\n inputSchema: createContainerSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createContainerImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst UniformSchema = z.object({\n name: z.string(),\n type: z.enum([\"float\", \"vec2\", \"vec3\", \"vec4\", \"int\", \"sampler2D\"]),\n default_value: z.string().optional(),\n});\n\nexport const createGlslShaderSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the GLSL TOP inside.\"),\n name: z.string().optional().describe(\"Name for the GLSL TOP (default 'glsl1').\"),\n fragment_shader: z.string().min(1).describe(\"GLSL fragment (pixel) shader source.\"),\n vertex_shader: z.string().optional().describe(\"Optional GLSL vertex shader source.\"),\n uniforms: z\n .array(UniformSchema)\n .optional()\n .describe(\"Optional uniform declarations to best-effort bind on the GLSL TOP.\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\", \"input\"]).default(\"input\"),\n});\ntype CreateGlslShaderArgs = z.infer<typeof createGlslShaderSchema>;\n\nconst RESOLUTIONS = {\n \"720p\": [1280, 720],\n \"1080p\": [1920, 1080],\n \"4K\": [3840, 2160],\n} as const;\n\nconst q = (value: string): string => JSON.stringify(value);\n\nexport async function createGlslShaderImpl(ctx: ToolContext, args: CreateGlslShaderArgs) {\n const desiredName = args.name ?? \"glsl1\";\n return guardTd(\n async () => {\n const warnings: string[] = [];\n const glsl = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"glslTOP\",\n name: desiredName,\n });\n const glslName = glsl.name || desiredName;\n\n const fragName = `${glslName}_frag`;\n const frag = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"textDAT\",\n name: fragName,\n });\n\n const wiring = [\n `op(${q(frag.path)}).text = ${q(args.fragment_shader)}`,\n `op(${q(glsl.path)}).par.pixeldat = ${q(frag.name || fragName)}`,\n ];\n\n let vertexPath: string | undefined;\n if (args.vertex_shader) {\n const vertName = `${glslName}_vert`;\n const vert = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"textDAT\",\n name: vertName,\n });\n vertexPath = vert.path;\n wiring.push(`op(${q(vert.path)}).text = ${q(args.vertex_shader)}`);\n wiring.push(`op(${q(glsl.path)}).par.vertexdat = ${q(vert.name || vertName)}`);\n }\n\n await ctx.client.executePythonScript(wiring.join(\"\\n\"), false);\n\n if (args.uniforms && args.uniforms.length > 0) {\n const names = JSON.stringify(args.uniforms.map((u) => u.name));\n const values = JSON.stringify(args.uniforms.map((u) => u.default_value ?? \"\"));\n const bind = [\n `g = op(${q(glsl.path)})`,\n `for i, nm in enumerate(${names}):`,\n \" try: setattr(g.par, 'uniname' + str(i), nm)\",\n \" except Exception: pass\",\n `for i, v in enumerate(${values}):`,\n \" try:\",\n \" if v != '': setattr(g.par, 'value' + str(i) + 'x', v)\",\n \" except Exception: pass\",\n ].join(\"\\n\");\n try {\n await ctx.client.executePythonScript(bind, false);\n } catch {\n warnings.push(\n \"Could not auto-bind uniforms; declare them in the shader and set them on the GLSL TOP manually.\",\n );\n }\n }\n\n if (args.resolution !== \"input\") {\n const [width, height] = RESOLUTIONS[args.resolution];\n await ctx.client.updateNodeParameters(glsl.path, {\n outputresolution: \"custom\",\n resolutionw: width,\n resolutionh: height,\n });\n }\n\n return { glsl, fragmentDat: frag.path, vertexDat: vertexPath, warnings };\n },\n (result) => jsonResult(`Created GLSL TOP at ${result.glsl.path}.`, result),\n );\n}\n\nexport const registerCreateGlslShader: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_glsl_shader\",\n {\n title: \"Create GLSL shader\",\n description:\n \"Create a GLSL TOP with a fragment shader (and optional vertex shader) supplied via Text DATs, with optional uniform binding and output resolution.\",\n inputSchema: createGlslShaderSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createGlslShaderImpl(ctx, args),\n );\n};\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { errorResult, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { connectNodesViaBridge } from \"./connectHelper.js\";\n\nconst ChainNodeSchema = z.object({\n type: z.string().describe(\"Operator type, e.g. 'noiseTOP'.\"),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const createNodeChainSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the chain inside.\"),\n nodes: z.array(ChainNodeSchema).min(1).describe(\"Ordered list of nodes to create.\"),\n connect_sequentially: z\n .boolean()\n .default(true)\n .describe(\"Wire output[0] → input[0] for each consecutive pair.\"),\n});\ntype CreateNodeChainArgs = z.infer<typeof createNodeChainSchema>;\n\ninterface CreatedNode {\n path: string;\n type: string;\n name: string;\n}\n\nexport async function createNodeChainImpl(\n ctx: ToolContext,\n args: CreateNodeChainArgs,\n): Promise<CallToolResult> {\n const created: CreatedNode[] = [];\n const warnings: string[] = [];\n\n for (const node of args.nodes) {\n if (!ctx.knowledge.operatorExists(node.type)) {\n warnings.push(`Operator type \"${node.type}\" was not found in the knowledge base.`);\n }\n }\n\n for (const node of args.nodes) {\n try {\n const ref = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: node.type,\n name: node.name,\n parameters: node.parameters,\n });\n created.push({\n path: ref.path,\n type: ref.type || node.type,\n name: ref.name || node.name || \"\",\n });\n } catch (err) {\n return errorResult(\n `Stopped after creating ${created.length}/${args.nodes.length} node(s). ` +\n `Failed to create \"${node.type}\": ${friendlyTdError(err)}. ` +\n `Created so far: ${created.map((c) => c.path).join(\", \") || \"(none)\"}. ` +\n \"No nodes were deleted.\",\n );\n }\n }\n\n const connections: Array<{ from: string; to: string; method: string }> = [];\n if (args.connect_sequentially && created.length > 1) {\n for (let i = 0; i < created.length - 1; i++) {\n const from = created[i];\n const to = created[i + 1];\n if (!from || !to) continue;\n try {\n const result = await connectNodesViaBridge(ctx.client, from.path, to.path);\n connections.push({ from: from.path, to: to.path, method: result.method });\n } catch (err) {\n warnings.push(`Failed to connect ${from.path} → ${to.path}: ${friendlyTdError(err)}`);\n }\n }\n }\n\n return jsonResult(\n `Created ${created.length} node(s) and ${connections.length} connection(s) under ${args.parent_path}.`,\n { created, connections, warnings },\n );\n}\n\nexport const registerCreateNodeChain: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_node_chain\",\n {\n title: \"Create node chain\",\n description:\n \"Create multiple nodes and (optionally) connect them in sequence. Returns all created paths; on failure it stops and reports partial progress without deleting anything.\",\n inputSchema: createNodeChainSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createNodeChainImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst TYPE_MAP = {\n text: \"textDAT\",\n execute: \"executeDAT\",\n script: \"scriptDAT\",\n} as const;\n\nexport const createPythonScriptSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the DAT inside.\"),\n name: z.string().optional(),\n code: z.string().min(1).describe(\"Python source to place in the DAT.\"),\n dat_type: z\n .enum([\"text\", \"execute\", \"script\"])\n .default(\"text\")\n .describe(\"Kind of DAT: 'text' (plain), 'execute' (event hooks), or 'script' (table builder).\"),\n});\ntype CreatePythonScriptArgs = z.infer<typeof createPythonScriptSchema>;\n\nexport async function createPythonScriptImpl(ctx: ToolContext, args: CreatePythonScriptArgs) {\n return guardTd(\n async () => {\n const dat = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: TYPE_MAP[args.dat_type],\n name: args.name,\n });\n await ctx.client.executePythonScript(\n `op(${JSON.stringify(dat.path)}).text = ${JSON.stringify(args.code)}`,\n false,\n );\n return dat;\n },\n (dat) => jsonResult(`Created ${args.dat_type} DAT at ${dat.path}.`, { node: dat }),\n );\n}\n\nexport const registerCreatePythonScript: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_python_script\",\n {\n title: \"Create Python DAT\",\n description: \"Create a DAT (text/execute/script) preloaded with Python code.\",\n inputSchema: createPythonScriptSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createPythonScriptImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nexport const duplicateNetworkSchema = z.object({\n source_path: z.string().describe(\"Path of the node/COMP to duplicate.\"),\n name: z.string().optional().describe(\"Name for the copy (auto-generated if omitted).\"),\n parent_path: z\n .string()\n .optional()\n .describe(\"Where to place the copy (defaults to the source's parent).\"),\n});\ntype DuplicateNetworkArgs = z.infer<typeof duplicateNetworkSchema>;\n\nexport async function duplicateNetworkImpl(ctx: ToolContext, args: DuplicateNetworkArgs) {\n const script = [\n `src = op(${q(args.source_path)})`,\n `if src is None: raise Exception('source not found: ' + ${q(args.source_path)})`,\n args.parent_path ? `parent = op(${q(args.parent_path)})` : \"parent = src.parent()\",\n \"if parent is None: raise Exception('parent not found')\",\n args.name ? `new = parent.copy(src, name=${q(args.name)})` : \"new = parent.copy(src)\",\n \"result = new.path\",\n ].join(\"\\n\");\n\n return guardTd(\n () => ctx.client.executePythonScript(script, true),\n (res) =>\n jsonResult(`Duplicated ${args.source_path} → ${res.result ?? \"(see stdout)\"}.`, {\n source: args.source_path,\n copy: res.result,\n }),\n );\n}\n\nexport const registerDuplicateNetwork: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"duplicate_network\",\n {\n title: \"Duplicate a network\",\n description:\n \"Copy a node or whole COMP (and its contents) to a new node, optionally into another parent.\",\n inputSchema: duplicateNetworkSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => duplicateNetworkImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst UpdateSchema = z.object({\n path: z.string(),\n parameters: z.record(z.string(), z.unknown()),\n});\n\nexport const setParametersBatchSchema = z.object({\n updates: z\n .array(UpdateSchema)\n .min(1)\n .describe(\n \"List of { path, parameters } updates sent in one batch request (per-update results; not transactional — a failed update does not roll back the others).\",\n ),\n});\ntype SetParametersBatchArgs = z.infer<typeof setParametersBatchSchema>;\n\nexport async function setParametersBatchImpl(ctx: ToolContext, args: SetParametersBatchArgs) {\n return guardTd(\n () =>\n ctx.client.batch(\n args.updates.map((update) => ({\n action: \"update\" as const,\n path: update.path,\n parameters: update.parameters,\n })),\n ),\n (result) =>\n jsonResult(`Applied ${args.updates.length} parameter update(s) in one batch.`, result),\n );\n}\n\nexport const registerSetParametersBatch: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"set_parameters_batch\",\n {\n title: \"Set parameters (batch)\",\n description:\n \"Update parameters on multiple nodes in a single batch request. Each update reports its own success; a failure does not roll back the others.\",\n inputSchema: setParametersBatchSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => setParametersBatchImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerConnectNodes } from \"./connectNodes.js\";\nimport { registerCreateContainer } from \"./createContainer.js\";\nimport { registerCreateGlslShader } from \"./createGlslShader.js\";\nimport { registerCreateNodeChain } from \"./createNodeChain.js\";\nimport { registerCreatePythonScript } from \"./createPythonScript.js\";\nimport { registerDuplicateNetwork } from \"./duplicateNetwork.js\";\nimport { registerSetParametersBatch } from \"./setParametersBatch.js\";\n\nexport const layer2Registrars: ToolRegistrar[] = [\n registerCreateNodeChain,\n registerConnectNodes,\n registerCreateGlslShader,\n registerCreatePythonScript,\n registerSetParametersBatch,\n registerCreateContainer,\n registerDuplicateNetwork,\n];\n","import { z } from \"zod\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const compareTdNodesSchema = z.object({\n path_a: z.string().describe(\"First node path.\"),\n path_b: z.string().describe(\"Second node path.\"),\n only_diff: z\n .boolean()\n .default(true)\n .describe(\"Return only the parameters that differ (true) or also list the identical ones.\"),\n});\ntype CompareTdNodesArgs = z.infer<typeof compareTdNodesSchema>;\n\nexport const compareTdNodesOutputSchema = z.object({\n a: z.string(),\n b: z.string(),\n type_a: z.string(),\n type_b: z.string(),\n type_match: z.boolean(),\n differing_count: z.number(),\n same_count: z.number(),\n differing: z.array(z.object({ param: z.string(), a: z.unknown(), b: z.unknown() })),\n identical: z.array(z.string()).optional(),\n});\n\nexport async function compareTdNodesImpl(ctx: ToolContext, args: CompareTdNodesArgs) {\n return guardTd(\n async () => {\n const [a, b] = await Promise.all([\n ctx.client.getNode(args.path_a),\n ctx.client.getNode(args.path_b),\n ]);\n return { a, b };\n },\n ({ a, b }) => {\n const keys = new Set([...Object.keys(a.parameters), ...Object.keys(b.parameters)]);\n const differing: Array<{ param: string; a: unknown; b: unknown }> = [];\n const identical: string[] = [];\n for (const key of [...keys].sort()) {\n const va = a.parameters[key];\n const vb = b.parameters[key];\n if (JSON.stringify(va) === JSON.stringify(vb)) identical.push(key);\n else differing.push({ param: key, a: va, b: vb });\n }\n const data: Record<string, unknown> = {\n a: a.path,\n b: b.path,\n type_a: a.type,\n type_b: b.type,\n type_match: a.type === b.type,\n differing_count: differing.length,\n same_count: identical.length,\n differing,\n };\n if (!args.only_diff) data.identical = identical;\n return structuredResult(\n `${differing.length} differing parameter(s) between ${a.path} and ${b.path}${a.type === b.type ? \"\" : ` (types differ: ${a.type} vs ${b.type})`}.`,\n data,\n );\n },\n );\n}\n\nexport const registerCompareTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"compare_td_nodes\",\n {\n title: \"Compare two nodes\",\n description:\n \"Diff the parameters of two nodes, returning only the values that differ (by default). Useful for aligning settings across similar operators.\",\n inputSchema: compareTdNodesSchema.shape,\n outputSchema: compareTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => compareTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const createTdNodeSchema = z.object({\n parent_path: z\n .string()\n .default(\"/project1\")\n .describe(\"Parent COMP path to create the node inside.\"),\n type: z\n .string()\n .describe(\"Operator type string, e.g. 'noiseTOP', 'feedbackTOP', 'nullTOP', 'constantCHOP'.\"),\n name: z.string().optional().describe(\"Optional node name (auto-generated if omitted).\"),\n parameters: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Optional initial parameter overrides as key→value pairs.\"),\n});\ntype CreateTdNodeArgs = z.infer<typeof createTdNodeSchema>;\n\nexport async function createTdNodeImpl(ctx: ToolContext, args: CreateTdNodeArgs) {\n const warnings: string[] = [];\n if (!ctx.knowledge.operatorExists(args.type)) {\n const suggestions = ctx.knowledge.searchOperators(args.type, 3).map((s) => s.name);\n warnings.push(\n `Operator type \"${args.type}\" was not found in the knowledge base.${\n suggestions.length ? ` Did you mean: ${suggestions.join(\", \")}?` : \"\"\n }`,\n );\n }\n return guardTd(\n () =>\n ctx.client.createNode({\n parent_path: args.parent_path,\n type: args.type,\n name: args.name,\n parameters: args.parameters,\n }),\n (node) => jsonResult(`Created ${node.type || args.type} at ${node.path}.`, { node, warnings }),\n );\n}\n\nexport const registerCreateTdNode: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_td_node\",\n {\n title: \"Create TouchDesigner node\",\n description:\n \"Create a single operator (node) inside a parent COMP. Validates the operator type against the knowledge base and warns (without blocking) on unknown types.\",\n inputSchema: createTdNodeSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createTdNodeImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const deleteTdNodeSchema = z.object({\n path: z.string().describe(\"Full path of the node to delete, e.g. '/project1/noise1'.\"),\n});\ntype DeleteTdNodeArgs = z.infer<typeof deleteTdNodeSchema>;\n\nexport async function deleteTdNodeImpl(ctx: ToolContext, args: DeleteTdNodeArgs) {\n return guardTd(\n () => ctx.client.deleteNode(args.path),\n (result) => jsonResult(`Deleted ${result.deleted}.`, result),\n );\n}\n\nexport const registerDeleteTdNode: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"delete_td_node\",\n {\n title: \"Delete TouchDesigner node\",\n description:\n \"Delete a single node by path. Destructive — only call this when the user explicitly asks to remove a node.\",\n inputSchema: deleteTdNodeSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => deleteTdNodeImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const execNodeMethodSchema = z.object({\n path: z.string().describe(\"Full path of the node to call the method on.\"),\n method: z.string().describe(\"Method name to call, e.g. 'cook', 'par', 'destroy', 'copy'.\"),\n args: z.array(z.unknown()).default([]).describe(\"Positional arguments.\"),\n kwargs: z.record(z.string(), z.unknown()).default({}).describe(\"Keyword arguments.\"),\n});\ntype ExecNodeMethodArgs = z.infer<typeof execNodeMethodSchema>;\n\nexport async function execNodeMethodImpl(ctx: ToolContext, args: ExecNodeMethodArgs) {\n return guardTd(\n () => ctx.client.execNodeMethod(args.path, args.method, args.args, args.kwargs),\n (result) => jsonResult(`Called ${args.path}.${args.method}().`, result),\n );\n}\n\nexport const registerExecNodeMethod: ToolRegistrar = (server, ctx) => {\n if (ctx.allowRawPython === false) return;\n server.registerTool(\n \"exec_node_method\",\n {\n title: \"Call node method\",\n description:\n \"Escape hatch — invoke an arbitrary Python method on a node (operator). Prefer structured tools where one exists; use this for operations they don't cover (e.g. .cook(), .copy(), .destroy()).\",\n inputSchema: execNodeMethodSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => execNodeMethodImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const executePythonScriptSchema = z.object({\n script: z\n .string()\n .min(1)\n .describe(\n \"Python source to execute inside TouchDesigner (runs in the TD process, not locally).\",\n ),\n return_output: z\n .boolean()\n .default(true)\n .describe(\"Capture stdout / the value of the last expression and return it.\"),\n});\ntype ExecutePythonScriptArgs = z.infer<typeof executePythonScriptSchema>;\n\nexport async function executePythonScriptImpl(ctx: ToolContext, args: ExecutePythonScriptArgs) {\n return guardTd(\n () => ctx.client.executePythonScript(args.script, args.return_output),\n (result) => jsonResult(\"Python executed in TouchDesigner.\", result),\n );\n}\n\nexport const registerExecutePythonScript: ToolRegistrar = (server, ctx) => {\n if (ctx.allowRawPython === false) return;\n server.registerTool(\n \"execute_python_script\",\n {\n title: \"Execute Python in TouchDesigner\",\n description:\n \"Escape hatch — run an arbitrary Python script inside the TouchDesigner process. Prefer the structured tools (find_td_nodes, get_td_node_parameters, update_td_node_parameters, summarize_td_errors, snapshot_td_graph, …); reach for this only when no structured tool can express the operation. Code runs in TD only, never on the local machine.\",\n inputSchema: executePythonScriptSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => executePythonScriptImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeRefSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { globToRegExp } from \"./nodeMatch.js\";\n\nexport const findTdNodesSchema = z.object({\n parent_path: z.string().default(\"/project1\").describe(\"Where to search from.\"),\n pattern: z\n .string()\n .optional()\n .describe(\"Case-insensitive name/path filter with '*' wildcards (e.g. 'text*', '*noise*').\"),\n type: z\n .string()\n .optional()\n .describe(\"Case-insensitive operator-type substring (e.g. 'TOP', 'noise').\"),\n recursive: z\n .boolean()\n .default(true)\n .describe(\"Search the whole sub-network (true) or only direct children (false).\"),\n path_only: z.boolean().default(false).describe(\"Return only matching paths.\"),\n limit: z.number().int().positive().default(50).describe(\"Max matches to return.\"),\n});\ntype FindTdNodesArgs = z.infer<typeof findTdNodesSchema>;\n\nexport const findTdNodesOutputSchema = z.object({\n parent_path: z.string(),\n recursive: z.boolean(),\n count: z.number(),\n truncated: z.boolean(),\n paths: z.array(z.string()).optional(),\n matches: z.array(NodeRefSchema).optional(),\n});\n\nexport async function findTdNodesImpl(ctx: ToolContext, args: FindTdNodesArgs) {\n const fetch = args.recursive\n ? async () => (await ctx.client.getNetworkTopology(args.parent_path, true)).nodes\n : async () => (await ctx.client.getNodes(args.parent_path)).nodes;\n\n return guardTd(fetch, (allNodes) => {\n let nodes = allNodes;\n if (args.pattern) {\n const re = globToRegExp(args.pattern);\n nodes = nodes.filter((n) => re.test(n.name) || re.test(n.path));\n }\n if (args.type) {\n const t = args.type.toLowerCase();\n nodes = nodes.filter((n) => n.type.toLowerCase().includes(t));\n }\n const count = nodes.length;\n const truncated = count > args.limit;\n nodes = nodes.slice(0, args.limit);\n const summary = `${count} match(es) under ${args.parent_path}${truncated ? ` (showing ${args.limit})` : \"\"}.`;\n const base = { parent_path: args.parent_path, recursive: args.recursive, count, truncated };\n return args.path_only\n ? structuredResult(summary, { ...base, paths: nodes.map((n) => n.path) })\n : structuredResult(summary, { ...base, matches: nodes });\n });\n}\n\nexport const registerFindTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"find_td_nodes\",\n {\n title: \"Find TouchDesigner nodes\",\n description:\n \"Search a network for nodes by name pattern and/or operator type. Recursive by default; pass path_only:true for a compact path list. Prefer this over get_td_nodes when you are looking for specific nodes.\",\n inputSchema: findTdNodesSchema.shape,\n outputSchema: findTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => findTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\n\n/** Standard response envelope every bridge endpoint returns. */\nexport const ApiEnvelopeSchema = z.object({\n ok: z.boolean(),\n data: z.unknown().optional(),\n error: z.object({ code: z.string().optional(), message: z.string() }).optional(),\n});\nexport type ApiEnvelope = z.infer<typeof ApiEnvelopeSchema>;\n\nexport const NodeRefSchema = z.object({\n path: z.string(),\n type: z.string().default(\"\"),\n name: z.string().default(\"\"),\n});\nexport type TdNodeRef = z.infer<typeof NodeRefSchema>;\n\nexport const NodeDetailSchema = NodeRefSchema.extend({\n parameters: z.record(z.string(), z.unknown()).default({}),\n inputs: z.array(z.string()).optional(),\n outputs: z.array(z.string()).optional(),\n family: z.string().optional(),\n errors: z.array(z.string()).optional(),\n});\nexport type TdNodeDetail = z.infer<typeof NodeDetailSchema>;\n\nexport const NodeListSchema = z.object({ nodes: z.array(NodeRefSchema).default([]) });\nexport type TdNodeList = z.infer<typeof NodeListSchema>;\n\nexport const InfoSchema = z.object({\n td_version: z.string().optional(),\n python_version: z.string().optional(),\n build: z.string().optional(),\n bridge_version: z.string().optional(),\n project: z.string().optional(),\n});\nexport type TdInfo = z.infer<typeof InfoSchema>;\n\nexport const NodeErrorSchema = z.object({\n path: z.string(),\n message: z.string(),\n type: z.string().optional(),\n});\nexport type TdNodeError = z.infer<typeof NodeErrorSchema>;\n\nexport const NodeErrorsSchema = z.object({ errors: z.array(NodeErrorSchema).default([]) });\nexport type TdNodeErrors = z.infer<typeof NodeErrorsSchema>;\n\nexport const PreviewSchema = z.object({\n path: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n format: z.string().default(\"png\"),\n base64: z.string(),\n});\nexport type TdPreview = z.infer<typeof PreviewSchema>;\n\nexport const ExecResultSchema = z.object({\n result: z.unknown().optional(),\n stdout: z.string().optional(),\n printed: z.array(z.string()).optional(),\n});\nexport type TdExecResult = z.infer<typeof ExecResultSchema>;\n\nexport const MethodResultSchema = z.object({ result: z.unknown() });\nexport type TdMethodResult = z.infer<typeof MethodResultSchema>;\n\nexport const DeleteResultSchema = z.object({ deleted: z.string() });\nexport type TdDeleteResult = z.infer<typeof DeleteResultSchema>;\n\nexport const ConnectionSchema = z.object({\n source_path: z.string(),\n source_output: z.number().int().default(0),\n target_path: z.string(),\n target_input: z.number().int().default(0),\n});\nexport type TdConnection = z.infer<typeof ConnectionSchema>;\n\nexport const TopologySchema = z.object({\n nodes: z.array(NodeRefSchema).default([]),\n connections: z.array(ConnectionSchema).default([]),\n});\nexport type TdTopology = z.infer<typeof TopologySchema>;\n\nexport const PerformanceSchema = z.object({\n nodes: z\n .array(\n z.object({\n path: z.string(),\n cook_time_ms: z.number().default(0),\n cook_count: z.number().optional(),\n }),\n )\n .default([]),\n total_cook_time_ms: z.number().optional(),\n gpu_memory_mb: z.number().optional(),\n});\nexport type TdPerformance = z.infer<typeof PerformanceSchema>;\n\nexport const BatchOpResultSchema = z.object({\n action: z.string(),\n ok: z.boolean(),\n path: z.string().optional(),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\nexport const BatchResultSchema = z.object({ results: z.array(BatchOpResultSchema).default([]) });\nexport type TdBatchResult = z.infer<typeof BatchResultSchema>;\n\n/** Input shape for creating a node (used by the client and Layer 3 tool). */\nexport const CreateNodeInputSchema = z.object({\n parent_path: z.string(),\n type: z.string(),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n});\nexport type CreateNodeInput = z.infer<typeof CreateNodeInputSchema>;\n\n/** A single atomic operation accepted by `POST /api/batch`. */\nexport const BatchOperationSchema = z.discriminatedUnion(\"action\", [\n z.object({\n action: z.literal(\"create\"),\n parent_path: z.string(),\n type: z.string(),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n }),\n z.object({\n action: z.literal(\"update\"),\n path: z.string(),\n parameters: z.record(z.string(), z.unknown()),\n }),\n z.object({ action: z.literal(\"delete\"), path: z.string() }),\n z.object({\n action: z.literal(\"connect\"),\n source_path: z.string(),\n target_path: z.string(),\n source_output: z.number().int().default(0),\n target_input: z.number().int().default(0),\n }),\n]);\nexport type TdBatchOperation = z.infer<typeof BatchOperationSchema>;\n","/** Turns a `*`-glob into a case-insensitive RegExp (other regex metachars are escaped). */\nexport function globToRegExp(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(escaped, \"i\");\n}\n\n/** The parent path of a TD node path, e.g. `/project1/moviein1` -> `/project1`. */\nexport function parentOf(path: string): string {\n const idx = path.lastIndexOf(\"/\");\n return idx <= 0 ? \"/\" : path.slice(0, idx);\n}\n","import { z } from \"zod\";\nimport { jsonResult, textResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getModuleHelpSchema = z.object({\n name: z.string().describe(\"Class or module name to get help for, e.g. 'OP', 'App', 'Project'.\"),\n});\ntype GetModuleHelpArgs = z.infer<typeof getModuleHelpSchema>;\n\nexport function getModuleHelpImpl(ctx: ToolContext, args: GetModuleHelpArgs) {\n const cls = ctx.knowledge.getPythonClass(args.name);\n if (!cls) {\n const suggestions = ctx.knowledge\n .listPythonClasses()\n .filter((c) => c.className.toLowerCase().includes(args.name.toLowerCase()))\n .slice(0, 5)\n .map((c) => c.className);\n return jsonResult(`No help found for \"${args.name}\".`, { found: false, suggestions });\n }\n\n const lines: string[] = [`# ${cls.displayName || cls.className}`, \"\"];\n if (cls.description) lines.push(cls.description, \"\");\n if (cls.members && cls.members.length > 0) {\n lines.push(\"## Members\");\n for (const m of cls.members) {\n const ro = m.readOnly ? \" (read-only)\" : \"\";\n lines.push(`- ${m.name}${m.returnType ? `: ${m.returnType}` : \"\"}${ro}`);\n }\n lines.push(\"\");\n }\n if (cls.methods && cls.methods.length > 0) {\n lines.push(\"## Methods\");\n for (const method of cls.methods) {\n const sig = method.signature || method.name || \"\";\n lines.push(`- ${sig}${method.returns ? ` -> ${method.returns}` : \"\"}`);\n }\n }\n return textResult(lines.join(\"\\n\"));\n}\n\nexport const registerGetModuleHelp: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_module_help\",\n {\n title: \"Get module/class help\",\n description:\n \"Human-readable help (description, members, method signatures) for a TouchDesigner Python class or module, from the knowledge base.\",\n inputSchema: getModuleHelpSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getModuleHelpImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdClassDetailsSchema = z.object({\n class_name: z.string().describe(\"Python class name, e.g. 'OP', 'TOP', 'App', 'CHOP'.\"),\n});\ntype GetTdClassDetailsArgs = z.infer<typeof getTdClassDetailsSchema>;\n\nexport function getTdClassDetailsImpl(ctx: ToolContext, args: GetTdClassDetailsArgs) {\n const cls = ctx.knowledge.getPythonClass(args.class_name);\n if (!cls) {\n const suggestions = ctx.knowledge\n .listPythonClasses()\n .filter((c) => c.className.toLowerCase().includes(args.class_name.toLowerCase()))\n .slice(0, 5)\n .map((c) => c.className);\n return structuredResult(`Python class \"${args.class_name}\" not found.`, {\n found: false,\n suggestions,\n });\n }\n return structuredResult(\n `${cls.className} — ${cls.methods?.length ?? 0} methods, ${cls.members?.length ?? 0} members.`,\n cls,\n );\n}\n\nexport const registerGetTdClassDetails: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_class_details\",\n {\n title: \"Get TD Python class details\",\n description:\n \"Full documentation for one TouchDesigner Python class (members + methods) from the knowledge base.\",\n inputSchema: getTdClassDetailsSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getTdClassDetailsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdClassesSchema = z.object({\n filter: z\n .string()\n .optional()\n .describe(\"Optional case-insensitive substring to filter class names by.\"),\n});\ntype GetTdClassesArgs = z.infer<typeof getTdClassesSchema>;\n\nexport function getTdClassesImpl(ctx: ToolContext, args: GetTdClassesArgs) {\n let classes = ctx.knowledge.listPythonClasses();\n if (args.filter) {\n const needle = args.filter.toLowerCase();\n classes = classes.filter(\n (c) =>\n c.className.toLowerCase().includes(needle) || c.displayName.toLowerCase().includes(needle),\n );\n }\n return structuredResult(`Found ${classes.length} TouchDesigner Python API class(es).`, {\n classes,\n });\n}\n\nexport const registerGetTdClasses: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_classes\",\n {\n title: \"List TD Python classes\",\n description:\n \"List TouchDesigner Python API classes from the embedded knowledge base (works offline). Optionally filter by name.\",\n inputSchema: getTdClassesSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getTdClassesImpl(ctx, args),\n );\n};\n","import { friendlyTdError } from \"../../td-client/types.js\";\nimport { jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst DESCRIPTION =\n \"Health check + TouchDesigner server info. Returns TD/Python version and bridge status when connected, plus the embedded knowledge-base stats. Use this first to confirm the bridge is reachable.\";\n\nexport async function getTdInfoImpl(ctx: ToolContext) {\n const knowledge = ctx.knowledge.stats();\n try {\n const info = await ctx.client.getInfo();\n return jsonResult(\"TouchDesigner is connected.\", {\n connected: true,\n endpoint: ctx.client.endpoint,\n touchdesigner: info,\n knowledge,\n });\n } catch (err) {\n return jsonResult(\"TouchDesigner is not reachable (the server is still running).\", {\n connected: false,\n endpoint: ctx.client.endpoint,\n reason: friendlyTdError(err),\n knowledge,\n });\n }\n}\n\nexport const registerGetTdInfo: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_info\",\n {\n title: \"Get TouchDesigner info\",\n description: DESCRIPTION,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n () => getTdInfoImpl(ctx),\n );\n};\n","import { z } from \"zod\";\nimport { NodeErrorSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdNodeErrorsSchema = z.object({\n path: z.string().describe(\"Full path of the node (or network root) to check for errors.\"),\n recursive: z\n .boolean()\n .default(false)\n .describe(\"If true, check the whole network under `path`; otherwise just that node.\"),\n summary: z\n .boolean()\n .default(false)\n .describe(\"Return only counts grouped by error type instead of the full error list.\"),\n});\ntype GetTdNodeErrorsArgs = z.infer<typeof getTdNodeErrorsSchema>;\n\nexport const getTdNodeErrorsOutputSchema = z.object({\n path: z.string(),\n total: z.number(),\n errors: z.array(NodeErrorSchema).optional(),\n by_type: z.record(z.string(), z.number()).optional(),\n});\n\nexport async function getTdNodeErrorsImpl(ctx: ToolContext, args: GetTdNodeErrorsArgs) {\n return guardTd(\n () =>\n args.recursive ? ctx.client.getNetworkErrors(args.path) : ctx.client.getNodeErrors(args.path),\n (result) => {\n const errors = result.errors;\n const total = errors.length;\n const none = total === 0;\n if (args.summary) {\n const byType: Record<string, number> = {};\n for (const e of errors) {\n const key = e.type || \"error\";\n byType[key] = (byType[key] ?? 0) + 1;\n }\n return structuredResult(\n none ? `No errors found at ${args.path}.` : `${total} error(s) at ${args.path}.`,\n { path: args.path, total, by_type: byType },\n );\n }\n return structuredResult(\n none ? `No errors found at ${args.path}.` : `Found ${total} error(s) at ${args.path}.`,\n { path: args.path, total, errors },\n );\n },\n );\n}\n\nexport const registerGetTdNodeErrors: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_node_errors\",\n {\n title: \"Get node errors\",\n description:\n \"Check a node (or its whole sub-network) for cook/compile errors and warnings. Pass `summary:true` for grouped counts instead of the full list.\",\n inputSchema: getTdNodeErrorsSchema.shape,\n outputSchema: getTdNodeErrorsOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodeErrorsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeDetailSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdNodeParametersSchema = z.object({\n path: z.string().describe(\"Full path of the node to inspect.\"),\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Only return these parameter names (case-sensitive). Omit to return all parameters.\"),\n omit_io: z\n .boolean()\n .default(false)\n .describe(\"Drop the inputs/outputs lists from the result to save context.\"),\n});\ntype GetTdNodeParametersArgs = z.infer<typeof getTdNodeParametersSchema>;\n\nexport async function getTdNodeParametersImpl(ctx: ToolContext, args: GetTdNodeParametersArgs) {\n return guardTd(\n () => ctx.client.getNode(args.path),\n (node) => {\n let parameters = node.parameters;\n if (args.keys && args.keys.length > 0) {\n const wanted = new Set(args.keys);\n parameters = Object.fromEntries(\n Object.entries(node.parameters).filter(([k]) => wanted.has(k)),\n );\n }\n const data: Record<string, unknown> = {\n path: node.path,\n type: node.type,\n name: node.name,\n parameters,\n };\n if (!args.omit_io) {\n data.inputs = node.inputs;\n data.outputs = node.outputs;\n }\n const count = Object.keys(parameters).length;\n return structuredResult(`${count} parameter(s) for ${node.path} (${node.type}).`, data);\n },\n );\n}\n\nexport const registerGetTdNodeParameters: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_node_parameters\",\n {\n title: \"Get node parameters\",\n description:\n \"Read the current parameters (and I/O) of a node. Pass `keys` to project specific parameters or `omit_io:true` to drop the inputs/outputs lists.\",\n inputSchema: getTdNodeParametersSchema.shape,\n outputSchema: NodeDetailSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodeParametersImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeRefSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { globToRegExp } from \"./nodeMatch.js\";\n\nexport const getTdNodesSchema = z.object({\n parent_path: z\n .string()\n .default(\"/project1\")\n .describe(\"Parent COMP whose direct children should be listed.\"),\n pattern: z\n .string()\n .optional()\n .describe(\n \"Case-insensitive filter on node name/path. Supports '*' wildcards (e.g. 'text*', '*noise*').\",\n ),\n path_only: z\n .boolean()\n .default(false)\n .describe(\"Return only the list of node paths, dropping type/name.\"),\n limit: z.number().int().positive().optional().describe(\"Cap the number of nodes returned.\"),\n detail_level: z\n .enum([\"summary\", \"full\"])\n .default(\"summary\")\n .describe(\n \"'summary' (default) returns a count, a type breakdown and the first few paths; 'full' returns every node. Use 'full' (or path_only) when you need the complete list.\",\n ),\n});\ntype GetTdNodesArgs = z.infer<typeof getTdNodesSchema>;\n\nconst SAMPLE_SIZE = 10;\n\nexport const getTdNodesOutputSchema = z.object({\n parent_path: z.string(),\n count: z.number(),\n detail_level: z.enum([\"summary\", \"full\"]),\n truncated: z.boolean(),\n by_type: z.record(z.string(), z.number()).optional(),\n sample: z.array(z.string()).optional(),\n paths: z.array(z.string()).optional(),\n nodes: z.array(NodeRefSchema).optional(),\n hint: z.string().optional(),\n});\n\nexport async function getTdNodesImpl(ctx: ToolContext, args: GetTdNodesArgs) {\n return guardTd(\n () => ctx.client.getNodes(args.parent_path),\n (list) => {\n let nodes = list.nodes;\n if (args.pattern) {\n const re = globToRegExp(args.pattern);\n nodes = nodes.filter((n) => re.test(n.name) || re.test(n.path));\n }\n const matched = nodes.length;\n const truncated = args.limit !== undefined && matched > args.limit;\n if (args.limit !== undefined) nodes = nodes.slice(0, args.limit);\n const where = args.pattern ? ` matching \"${args.pattern}\"` : \"\";\n const base = {\n parent_path: args.parent_path,\n count: matched,\n detail_level: args.detail_level,\n truncated,\n };\n\n if (args.path_only) {\n return structuredResult(`${matched} node(s) under ${args.parent_path}${where}.`, {\n ...base,\n paths: nodes.map((n) => n.path),\n });\n }\n\n if (args.detail_level === \"summary\") {\n const byType: Record<string, number> = {};\n for (const n of nodes) {\n const key = n.type || \"unknown\";\n byType[key] = (byType[key] ?? 0) + 1;\n }\n const sample = nodes.slice(0, SAMPLE_SIZE).map((n) => n.path);\n return structuredResult(\n `${matched} node(s) under ${args.parent_path}${where}. Summary only — pass detail_level:\"full\" or path_only:true for the full list.`,\n {\n ...base,\n by_type: byType,\n sample,\n ...(matched > sample.length\n ? {\n hint: `Showing first ${sample.length} of ${matched}. Use detail_level:\"full\" for all.`,\n }\n : {}),\n },\n );\n }\n\n return structuredResult(`${matched} node(s) under ${args.parent_path}${where}.`, {\n ...base,\n nodes,\n });\n },\n );\n}\n\nexport const registerGetTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_nodes\",\n {\n title: \"List TouchDesigner nodes\",\n description:\n 'List the direct child nodes of a COMP. Defaults to a compact summary (count + type breakdown + sample paths); pass detail_level:\"full\" or path_only:true for the complete list, and `pattern` to filter by name.',\n inputSchema: getTdNodesSchema.shape,\n outputSchema: getTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { checkPerformance } from \"../../feedback/performanceMonitor.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdPerformanceSchema = z.object({\n root_path: z.string().default(\"/project1\").describe(\"Network root to measure cook times under.\"),\n target_fps: z\n .number()\n .positive()\n .default(60)\n .describe(\"Frame-rate target used to flag slow nodes.\"),\n});\ntype GetTdPerformanceArgs = z.infer<typeof getTdPerformanceSchema>;\n\nexport const getTdPerformanceOutputSchema = z.object({\n path: z.string(),\n targetFps: z.number(),\n frameBudgetMs: z.number(),\n totalCookMs: z.number(),\n nodes: z.array(\n z.object({\n path: z.string(),\n cook_time_ms: z.number(),\n cook_count: z.number().optional(),\n }),\n ),\n warnings: z.array(z.string()),\n});\n\nexport async function getTdPerformanceImpl(ctx: ToolContext, args: GetTdPerformanceArgs) {\n return guardTd(\n () => checkPerformance(ctx.client, args.root_path, args.target_fps),\n (report) =>\n structuredResult(\n report.warnings.length === 0\n ? `Within budget: ${report.totalCookMs.toFixed(2)}ms total under ${args.root_path} (${args.target_fps}fps).`\n : `${report.warnings.length} performance warning(s) under ${args.root_path}.`,\n report,\n ),\n );\n}\n\nexport const registerGetTdPerformance: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_performance\",\n {\n title: \"Get network performance\",\n description:\n \"Report cook times under a network and warn about nodes that exceed the frame budget.\",\n inputSchema: getTdPerformanceSchema.shape,\n outputSchema: getTdPerformanceOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdPerformanceImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\n\nexport interface PerformanceReport {\n path: string;\n targetFps: number;\n frameBudgetMs: number;\n totalCookMs: number;\n nodes: Array<{ path: string; cook_time_ms: number; cook_count?: number }>;\n warnings: string[];\n}\n\n/** Reports cook times against the frame budget implied by `targetFps`. */\nexport async function checkPerformance(\n client: TouchDesignerClient,\n path: string,\n targetFps = 60,\n): Promise<PerformanceReport> {\n const perf = await client.getNetworkPerformance(path);\n const frameBudgetMs = 1000 / targetFps;\n const warnings: string[] = [];\n\n for (const node of perf.nodes) {\n if (node.cook_time_ms > frameBudgetMs) {\n warnings.push(\n `${node.path} cooks in ${node.cook_time_ms.toFixed(2)}ms, exceeding the ${frameBudgetMs.toFixed(2)}ms budget at ${targetFps}fps.`,\n );\n }\n }\n\n const totalCookMs =\n perf.total_cook_time_ms ?? perf.nodes.reduce((sum, node) => sum + node.cook_time_ms, 0);\n if (totalCookMs > frameBudgetMs) {\n warnings.push(\n `Total cook time ${totalCookMs.toFixed(2)}ms exceeds the ${frameBudgetMs.toFixed(2)}ms budget at ${targetFps}fps.`,\n );\n }\n\n return { path, targetFps, frameBudgetMs, totalCookMs, nodes: perf.nodes, warnings };\n}\n","import { z } from \"zod\";\nimport { verifyNetwork } from \"../../feedback/networkVerifier.js\";\nimport { TopologySchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdTopologySchema = z.object({\n root_path: z.string().default(\"/project1\").describe(\"Network root to map.\"),\n});\ntype GetTdTopologyArgs = z.infer<typeof getTdTopologySchema>;\n\nexport const getTdTopologyOutputSchema = z.object({\n path: z.string(),\n nodeCount: z.number(),\n connectionCount: z.number(),\n issues: z.array(z.string()),\n topology: TopologySchema,\n});\n\nexport async function getTdTopologyImpl(ctx: ToolContext, args: GetTdTopologyArgs) {\n return guardTd(\n () => verifyNetwork(ctx.client, args.root_path),\n (report) =>\n structuredResult(\n `${report.nodeCount} node(s), ${report.connectionCount} connection(s) under ${args.root_path}.`,\n report,\n ),\n );\n}\n\nexport const registerGetTdTopology: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_topology\",\n {\n title: \"Get network topology\",\n description:\n \"Return the nodes and connections under a network root, flagging obvious structural issues.\",\n inputSchema: getTdTopologySchema.shape,\n outputSchema: getTdTopologyOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdTopologyImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport type { TdTopology } from \"../td-client/types.js\";\n\nexport interface VerifyReport {\n path: string;\n nodeCount: number;\n connectionCount: number;\n issues: string[];\n topology: TdTopology;\n}\n\n/** Inspects the topology under `path` and flags obvious structural issues. */\nexport async function verifyNetwork(\n client: TouchDesignerClient,\n path: string,\n): Promise<VerifyReport> {\n const topology = await client.getNetworkTopology(path);\n const issues: string[] = [];\n if (topology.nodes.length === 0) {\n issues.push(`No nodes were found under ${path}.`);\n } else if (topology.nodes.length > 1 && topology.connections.length === 0) {\n issues.push(\"Multiple nodes exist but none are connected.\");\n }\n return {\n path,\n nodeCount: topology.nodes.length,\n connectionCount: topology.connections.length,\n issues,\n topology,\n };\n}\n","import { z } from \"zod\";\nimport { verifyNetwork } from \"../../feedback/networkVerifier.js\";\nimport { ConnectionSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\n/** Cap on per-node parameter fetches so a big graph can't fan out into hundreds of requests. */\nconst MAX_PARAM_NODES = 60;\n\nexport const snapshotTdGraphSchema = z.object({\n path: z.string().default(\"/project1\").describe(\"Network root to snapshot.\"),\n include_params: z\n .boolean()\n .default(false)\n .describe(\"Also fetch each node's parameters (one request per node; capped for large graphs).\"),\n});\ntype SnapshotTdGraphArgs = z.infer<typeof snapshotTdGraphSchema>;\n\nexport const snapshotTdGraphOutputSchema = z.object({\n path: z.string(),\n nodeCount: z.number(),\n connectionCount: z.number(),\n issues: z.array(z.string()),\n params_truncated: z.boolean(),\n nodes: z.array(\n z.object({\n path: z.string(),\n type: z.string(),\n name: z.string(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n }),\n ),\n connections: z.array(ConnectionSchema),\n});\n\nexport async function snapshotTdGraphImpl(ctx: ToolContext, args: SnapshotTdGraphArgs) {\n return guardTd(\n async () => {\n const report = await verifyNetwork(ctx.client, args.path);\n const refs = report.topology.nodes;\n let paramsTruncated = false;\n const params = new Map<string, Record<string, unknown>>();\n if (args.include_params) {\n const targets = refs.slice(0, MAX_PARAM_NODES);\n paramsTruncated = refs.length > MAX_PARAM_NODES;\n // Fail-forward: one unreadable node shouldn't sink the whole snapshot.\n const details = await Promise.allSettled(targets.map((n) => ctx.client.getNode(n.path)));\n for (const detail of details) {\n if (detail.status === \"fulfilled\") params.set(detail.value.path, detail.value.parameters);\n }\n }\n const nodes = refs.map((n) => ({\n path: n.path,\n type: n.type,\n name: n.name,\n ...(args.include_params ? { parameters: params.get(n.path) ?? {} } : {}),\n }));\n return { report, nodes, paramsTruncated };\n },\n ({ report, nodes, paramsTruncated }) =>\n structuredResult(\n `Snapshot of ${args.path}: ${report.nodeCount} node(s), ${report.connectionCount} connection(s)${report.issues.length ? `, ${report.issues.length} issue(s)` : \"\"}.`,\n {\n path: report.path,\n nodeCount: report.nodeCount,\n connectionCount: report.connectionCount,\n issues: report.issues,\n params_truncated: paramsTruncated,\n nodes,\n connections: report.topology.connections,\n },\n ),\n );\n}\n\nexport const registerSnapshotTdGraph: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"snapshot_td_graph\",\n {\n title: \"Snapshot network graph\",\n description:\n \"Capture a compact, serializable snapshot of a network — nodes, connections, structural issues, and optionally each node's parameters — for review, diffing, or documentation.\",\n inputSchema: snapshotTdGraphSchema.shape,\n outputSchema: snapshotTdGraphOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => snapshotTdGraphImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { parentOf } from \"./nodeMatch.js\";\n\nexport const summarizeTdErrorsSchema = z.object({\n path: z.string().default(\"/project1\").describe(\"Network root to collect errors under.\"),\n group_by: z\n .enum([\"message\", \"type\", \"parent\"])\n .default(\"message\")\n .describe(\n \"How to cluster errors: by exact message, by error type, or by parent container (to find a common upstream cause).\",\n ),\n});\ntype SummarizeTdErrorsArgs = z.infer<typeof summarizeTdErrorsSchema>;\n\nexport const summarizeTdErrorsOutputSchema = z.object({\n path: z.string(),\n total: z.number(),\n group_by: z.enum([\"message\", \"type\", \"parent\"]),\n groups: z.array(\n z.object({\n key: z.string(),\n count: z.number(),\n sample: z.object({ path: z.string(), message: z.string() }),\n }),\n ),\n suggestions: z.array(z.string()),\n});\n\nexport async function summarizeTdErrorsImpl(ctx: ToolContext, args: SummarizeTdErrorsArgs) {\n return guardTd(\n () => ctx.client.getNetworkErrors(args.path),\n (result) => {\n const errors = result.errors;\n const total = errors.length;\n if (total === 0) {\n return structuredResult(`No errors found under ${args.path}.`, {\n path: args.path,\n total: 0,\n group_by: args.group_by,\n groups: [],\n suggestions: [],\n });\n }\n\n const keyOf = (e: { path: string; message: string; type?: string }): string =>\n args.group_by === \"message\"\n ? e.message\n : args.group_by === \"type\"\n ? e.type || \"error\"\n : parentOf(e.path);\n\n const grouped = new Map<\n string,\n { count: number; sample: { path: string; message: string } }\n >();\n const byPath = new Map<string, number>();\n for (const e of errors) {\n const key = keyOf(e);\n const g = grouped.get(key);\n if (g) g.count += 1;\n else grouped.set(key, { count: 1, sample: { path: e.path, message: e.message } });\n byPath.set(e.path, (byPath.get(e.path) ?? 0) + 1);\n }\n\n const groups = [...grouped.entries()]\n .map(([key, g]) => ({ key, count: g.count, sample: g.sample }))\n .sort((a, b) => b.count - a.count);\n\n const worstNodes = [...byPath.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([p, c]) => `${p} (${c} error${c === 1 ? \"\" : \"s\"})`);\n\n const suggestions: string[] = [];\n if (groups[0] && groups[0].count > 1) {\n suggestions.push(\n `${groups[0].count} errors share ${args.group_by} \"${groups[0].key}\" — fixing the common cause clears them at once.`,\n );\n }\n if (worstNodes.length > 0) {\n suggestions.push(`Check first: ${worstNodes.join(\", \")}.`);\n }\n\n return structuredResult(\n `${total} error(s) under ${args.path} in ${groups.length} ${args.group_by} group(s).`,\n { path: args.path, total, group_by: args.group_by, groups, suggestions },\n );\n },\n );\n}\n\nexport const registerSummarizeTdErrors: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"summarize_td_errors\",\n {\n title: \"Summarize network errors\",\n description:\n \"Collect errors across a network and cluster them by message, type, or parent container, with the worst-offending nodes and a suggested order to investigate. Use this instead of reading every node's errors one by one.\",\n inputSchema: summarizeTdErrorsSchema.shape,\n outputSchema: summarizeTdErrorsOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => summarizeTdErrorsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const updateTdNodeParametersSchema = z.object({\n path: z.string().describe(\"Full path of the node whose parameters to update.\"),\n parameters: z\n .record(z.string(), z.unknown())\n .describe(\"Parameter overrides as key→value pairs, e.g. { period: 4, amplitude: 0.5 }.\"),\n});\ntype UpdateTdNodeParametersArgs = z.infer<typeof updateTdNodeParametersSchema>;\n\nexport async function updateTdNodeParametersImpl(\n ctx: ToolContext,\n args: UpdateTdNodeParametersArgs,\n) {\n return guardTd(\n () => ctx.client.updateNodeParameters(args.path, args.parameters),\n (node) =>\n jsonResult(`Updated ${Object.keys(args.parameters).length} parameter(s) on ${node.path}.`, {\n node,\n }),\n );\n}\n\nexport const registerUpdateTdNodeParameters: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"update_td_node_parameters\",\n {\n title: \"Update node parameters\",\n description: \"Set one or more parameters on an existing node.\",\n inputSchema: updateTdNodeParametersSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => updateTdNodeParametersImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerCompareTdNodes } from \"./compareTdNodes.js\";\nimport { registerCreateTdNode } from \"./createTdNode.js\";\nimport { registerDeleteTdNode } from \"./deleteTdNode.js\";\nimport { registerExecNodeMethod } from \"./execNodeMethod.js\";\nimport { registerExecutePythonScript } from \"./executePythonScript.js\";\nimport { registerFindTdNodes } from \"./findTdNodes.js\";\nimport { registerGetModuleHelp } from \"./getModuleHelp.js\";\nimport { registerGetTdClassDetails } from \"./getTdClassDetails.js\";\nimport { registerGetTdClasses } from \"./getTdClasses.js\";\nimport { registerGetTdInfo } from \"./getTdInfo.js\";\nimport { registerGetTdNodeErrors } from \"./getTdNodeErrors.js\";\nimport { registerGetTdNodeParameters } from \"./getTdNodeParameters.js\";\nimport { registerGetTdNodes } from \"./getTdNodes.js\";\nimport { registerGetTdPerformance } from \"./getTdPerformance.js\";\nimport { registerGetTdTopology } from \"./getTdTopology.js\";\nimport { registerSnapshotTdGraph } from \"./snapshotTdGraph.js\";\nimport { registerSummarizeTdErrors } from \"./summarizeTdErrors.js\";\nimport { registerUpdateTdNodeParameters } from \"./updateTdNodeParameters.js\";\n\nexport const layer3Registrars: ToolRegistrar[] = [\n registerGetTdInfo,\n registerCreateTdNode,\n registerDeleteTdNode,\n registerUpdateTdNodeParameters,\n registerGetTdNodes,\n registerGetTdNodeParameters,\n registerGetTdNodeErrors,\n registerExecutePythonScript,\n registerExecNodeMethod,\n registerGetTdClasses,\n registerGetTdClassDetails,\n registerGetModuleHelp,\n registerGetTdPerformance,\n registerGetTdTopology,\n registerFindTdNodes,\n registerSummarizeTdErrors,\n registerCompareTdNodes,\n registerSnapshotTdGraph,\n];\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { layer1Registrars } from \"./layer1/index.js\";\nimport { layer2Registrars } from \"./layer2/index.js\";\nimport { layer3Registrars } from \"./layer3/index.js\";\nimport type { ToolContext } from \"./types.js\";\n\n/** Registers every tool (all layers) against the MCP server. */\nexport function registerAllTools(server: McpServer, ctx: ToolContext): void {\n const registrars = [...layer3Registrars, ...layer2Registrars, ...layer1Registrars];\n for (const register of registrars) register(server, ctx);\n}\n\nexport type { ToolContext, ToolRegistrar } from \"./types.js\";\n","import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nlet cached: string | undefined;\n\n/**\n * Resolves the package version by walking up from this module until it finds\n * the `tdmcp` package.json. Works both in dev (tsx, from `src/`) and in\n * the bundled build (from `dist/`). Falls back to \"0.0.0\" if not found.\n */\nexport function getVersion(): string {\n if (cached) return cached;\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n try {\n const raw = readFileSync(resolve(dir, \"package.json\"), \"utf8\");\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n if (pkg.name === \"tdmcp\" && pkg.version) {\n cached = pkg.version;\n return cached;\n }\n } catch {\n // package.json not here — keep walking up\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n cached = \"0.0.0\";\n return cached;\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { bottobotPackageDir, knowledgeDataDir } from \"../utils/paths.js\";\nimport {\n compactKey,\n normalizeGlsl,\n normalizePatterns,\n slugify,\n toOperatorSummary,\n toPythonSummary,\n toTutorialSummary,\n} from \"./normalize.js\";\nimport type {\n GlslSummary,\n GlslTechnique,\n KnowledgeStats,\n OperatorDoc,\n OperatorSummary,\n Pattern,\n PatternSummary,\n PythonClass,\n PythonClassSummary,\n Tutorial,\n TutorialSummary,\n} from \"./types.js\";\n\nexport interface KnowledgeBaseOptions {\n dataDir?: string;\n logger?: Logger;\n}\n\ninterface ResolvedSource {\n kind: \"local\" | \"bottobot\" | \"empty\";\n operatorsDir: string;\n operatorsIndex?: string;\n pythonDir: string;\n tutorialsDir: string;\n patternsFile: string;\n glslFile: string;\n}\n\nconst EMPTY_SOURCE: ResolvedSource = {\n kind: \"empty\",\n operatorsDir: \"\",\n pythonDir: \"\",\n tutorialsDir: \"\",\n patternsFile: \"\",\n glslFile: \"\",\n};\n\n/**\n * Read-only accessor over the embedded TouchDesigner knowledge base. Prefers the\n * imported local data directory; falls back to reading directly from an installed\n * `@bottobot/td-mcp`; otherwise degrades to empty results (never throws on lookup).\n */\nexport class KnowledgeBase {\n private readonly logger: Logger;\n private readonly source: ResolvedSource;\n\n private opIndexCache?: OperatorSummary[];\n private opLookupCache?: Map<string, string>;\n private readonly opDocCache = new Map<string, OperatorDoc | null>();\n private pyIndexCache?: PythonClassSummary[];\n private pyLookupCache?: Map<string, string>;\n private readonly pyDocCache = new Map<string, PythonClass | null>();\n private tutIndexCache?: TutorialSummary[];\n private tutLookupCache?: Map<string, string>;\n private readonly tutDocCache = new Map<string, Tutorial | null>();\n private patternsCache?: Pattern[];\n private glslCache?: GlslTechnique[];\n\n constructor(options: KnowledgeBaseOptions = {}) {\n this.logger = options.logger ?? silentLogger;\n this.source = KnowledgeBase.resolveSource(options.dataDir ?? knowledgeDataDir());\n this.logger.debug(\"knowledge source resolved\", { kind: this.source.kind });\n }\n\n private static resolveSource(localDir: string): ResolvedSource {\n if (existsSync(join(localDir, \"operators\"))) {\n return {\n kind: \"local\",\n operatorsDir: join(localDir, \"operators\"),\n operatorsIndex: join(localDir, \"operators\", \"index.json\"),\n pythonDir: join(localDir, \"python-api\"),\n tutorialsDir: join(localDir, \"tutorials\"),\n patternsFile: join(localDir, \"patterns.json\"),\n glslFile: join(localDir, \"glsl.json\"),\n };\n }\n const bb = bottobotPackageDir();\n if (bb) {\n return {\n kind: \"bottobot\",\n operatorsDir: join(bb, \"wiki/data/processed\"),\n pythonDir: join(bb, \"wiki/data/python-api\"),\n tutorialsDir: join(bb, \"wiki/data/tutorials\"),\n patternsFile: join(bb, \"data/patterns.json\"),\n glslFile: join(bb, \"wiki/data/experimental/glsl.json\"),\n };\n }\n return EMPTY_SOURCE;\n }\n\n private readJson(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch (err) {\n this.logger.debug(\"knowledge readJson failed\", { path, error: String(err) });\n return undefined;\n }\n }\n\n private listJsonFiles(dir: string): string[] {\n if (!dir || !existsSync(dir)) return [];\n try {\n return readdirSync(dir).filter((f) => f.endsWith(\".json\") && f !== \"index.json\");\n } catch {\n return [];\n }\n }\n\n // ---- Operators -----------------------------------------------------------\n\n private operatorIndex(): OperatorSummary[] {\n if (this.opIndexCache) return this.opIndexCache;\n if (this.source.kind === \"empty\") {\n this.opIndexCache = [];\n return this.opIndexCache;\n }\n if (this.source.operatorsIndex && existsSync(this.source.operatorsIndex)) {\n const data = this.readJson(this.source.operatorsIndex);\n if (Array.isArray(data)) {\n this.opIndexCache = data as OperatorSummary[];\n return this.opIndexCache;\n }\n }\n const summaries: OperatorSummary[] = [];\n for (const file of this.listJsonFiles(this.source.operatorsDir)) {\n const doc = this.readJson(join(this.source.operatorsDir, file)) as OperatorDoc | undefined;\n if (doc?.name) summaries.push(toOperatorSummary(file.replace(/\\.json$/, \"\"), doc));\n }\n this.opIndexCache = summaries;\n return this.opIndexCache;\n }\n\n private operatorLookup(): Map<string, string> {\n if (this.opLookupCache) return this.opLookupCache;\n const map = new Map<string, string>();\n for (const summary of this.operatorIndex()) {\n map.set(compactKey(summary.slug), summary.slug);\n map.set(compactKey(summary.name), summary.slug);\n map.set(compactKey(summary.displayName), summary.slug);\n }\n this.opLookupCache = map;\n return map;\n }\n\n listOperatorCategories(): string[] {\n const set = new Set<string>();\n for (const summary of this.operatorIndex()) set.add(summary.category);\n return [...set].sort();\n }\n\n listOperators(category?: string): OperatorSummary[] {\n const all = this.operatorIndex();\n if (!category) return all;\n const wanted = compactKey(category);\n return all.filter((s) => compactKey(s.category) === wanted);\n }\n\n getOperator(nameOrSlug: string): OperatorDoc | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const slug = this.operatorLookup().get(compactKey(nameOrSlug)) ?? slugify(nameOrSlug);\n const cached = this.opDocCache.get(slug);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.operatorsDir, `${slug}.json`);\n const doc = existsSync(file) ? (this.readJson(file) as OperatorDoc | undefined) : undefined;\n this.opDocCache.set(slug, doc ?? null);\n return doc;\n }\n\n /** Soft existence check (by operator type, display name, or slug). */\n operatorExists(typeOrName: string): boolean {\n return this.operatorLookup().has(compactKey(typeOrName));\n }\n\n searchOperators(query: string, limit = 25): OperatorSummary[] {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n const terms = q.split(/\\s+/);\n const scored: Array<{ summary: OperatorSummary; score: number }> = [];\n for (const summary of this.operatorIndex()) {\n const haystack =\n `${summary.name} ${summary.displayName} ${summary.summary} ${summary.keywords.join(\" \")}`.toLowerCase();\n let score = 0;\n for (const term of terms) {\n if (haystack.includes(term)) score += 1;\n if (summary.name.toLowerCase().includes(term)) score += 1;\n }\n if (score > 0) scored.push({ summary, score });\n }\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit).map((s) => s.summary);\n }\n\n // ---- Python API ----------------------------------------------------------\n\n private pythonIndex(): PythonClassSummary[] {\n if (this.pyIndexCache) return this.pyIndexCache;\n if (this.source.kind === \"empty\") {\n this.pyIndexCache = [];\n return this.pyIndexCache;\n }\n const indexPath = join(this.source.pythonDir, \"index.json\");\n if (existsSync(indexPath)) {\n const data = this.readJson(indexPath);\n if (Array.isArray(data)) {\n this.pyIndexCache = data as PythonClassSummary[];\n return this.pyIndexCache;\n }\n }\n const summaries: PythonClassSummary[] = [];\n for (const file of this.listJsonFiles(this.source.pythonDir)) {\n const cls = this.readJson(join(this.source.pythonDir, file)) as PythonClass | undefined;\n if (cls?.className) summaries.push(toPythonSummary(cls));\n }\n this.pyIndexCache = summaries;\n return this.pyIndexCache;\n }\n\n private pythonLookup(): Map<string, string> {\n if (this.pyLookupCache) return this.pyLookupCache;\n const map = new Map<string, string>();\n for (const summary of this.pythonIndex()) {\n map.set(compactKey(summary.className), summary.className);\n map.set(compactKey(summary.displayName), summary.className);\n }\n this.pyLookupCache = map;\n return map;\n }\n\n listPythonClasses(): PythonClassSummary[] {\n return this.pythonIndex();\n }\n\n getPythonClass(name: string): PythonClass | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const className = this.pythonLookup().get(compactKey(name)) ?? name;\n const cached = this.pyDocCache.get(className);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.pythonDir, `${className}.json`);\n const cls = existsSync(file) ? (this.readJson(file) as PythonClass | undefined) : undefined;\n this.pyDocCache.set(className, cls ?? null);\n return cls;\n }\n\n // ---- Patterns ------------------------------------------------------------\n\n private patterns(): Pattern[] {\n if (this.patternsCache) return this.patternsCache;\n if (this.source.kind === \"empty\") {\n this.patternsCache = [];\n return this.patternsCache;\n }\n const data = this.readJson(this.source.patternsFile);\n if (Array.isArray(data) && data.length > 0 && typeof (data[0] as Pattern).id === \"string\") {\n this.patternsCache = data as Pattern[];\n } else {\n this.patternsCache = normalizePatterns(data);\n }\n return this.patternsCache;\n }\n\n listPatterns(): PatternSummary[] {\n return this.patterns().map((p) => ({\n id: p.id,\n name: p.name,\n category: p.category ?? \"Unknown\",\n description: p.description ?? \"\",\n }));\n }\n\n getPattern(name: string): Pattern | undefined {\n const key = compactKey(name);\n return this.patterns().find((p) => compactKey(p.id) === key || compactKey(p.name) === key);\n }\n\n // ---- GLSL ----------------------------------------------------------------\n\n private glsl(): GlslTechnique[] {\n if (this.glslCache) return this.glslCache;\n if (this.source.kind === \"empty\") {\n this.glslCache = [];\n return this.glslCache;\n }\n const data = this.readJson(this.source.glslFile);\n this.glslCache = Array.isArray(data) ? (data as GlslTechnique[]) : normalizeGlsl(data);\n return this.glslCache;\n }\n\n listGlslPatterns(): GlslSummary[] {\n return this.glsl().map((g) => ({\n id: g.id,\n name: g.name,\n description: g.description ?? \"\",\n difficulty: g.difficulty ?? \"unknown\",\n }));\n }\n\n getGlslPattern(name: string): GlslTechnique | undefined {\n const key = compactKey(name);\n return this.glsl().find((g) => compactKey(g.id) === key || compactKey(g.name) === key);\n }\n\n // ---- Tutorials -----------------------------------------------------------\n\n private tutorialIndex(): TutorialSummary[] {\n if (this.tutIndexCache) return this.tutIndexCache;\n if (this.source.kind === \"empty\") {\n this.tutIndexCache = [];\n return this.tutIndexCache;\n }\n const indexPath = join(this.source.tutorialsDir, \"index.json\");\n if (existsSync(indexPath)) {\n const data = this.readJson(indexPath);\n if (Array.isArray(data)) {\n this.tutIndexCache = data as TutorialSummary[];\n return this.tutIndexCache;\n }\n }\n const summaries: TutorialSummary[] = [];\n for (const file of this.listJsonFiles(this.source.tutorialsDir)) {\n const tut = this.readJson(join(this.source.tutorialsDir, file)) as Tutorial | undefined;\n if (tut?.id || tut?.name) {\n const normalized: Tutorial = {\n ...tut,\n id: tut.id ?? file.replace(/\\.json$/, \"\"),\n name: tut.name ?? file,\n };\n summaries.push(toTutorialSummary(normalized));\n }\n }\n this.tutIndexCache = summaries;\n return this.tutIndexCache;\n }\n\n private tutorialLookup(): Map<string, string> {\n if (this.tutLookupCache) return this.tutLookupCache;\n const map = new Map<string, string>();\n for (const file of this.listJsonFiles(this.source.tutorialsDir)) {\n const slug = file.replace(/\\.json$/, \"\");\n map.set(compactKey(slug), slug);\n }\n for (const summary of this.tutorialIndex()) {\n map.set(compactKey(summary.id), summary.id);\n map.set(compactKey(summary.name), summary.id);\n }\n this.tutLookupCache = map;\n return map;\n }\n\n listTutorials(): TutorialSummary[] {\n return this.tutorialIndex();\n }\n\n getTutorial(name: string): Tutorial | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const slug = this.tutorialLookup().get(compactKey(name)) ?? slugify(name);\n const cached = this.tutDocCache.get(slug);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.tutorialsDir, `${slug}.json`);\n const tut = existsSync(file) ? (this.readJson(file) as Tutorial | undefined) : undefined;\n this.tutDocCache.set(slug, tut ?? null);\n return tut;\n }\n\n // ---- Meta ----------------------------------------------------------------\n\n get sourceKind(): KnowledgeStats[\"source\"] {\n return this.source.kind;\n }\n\n stats(): KnowledgeStats {\n return {\n source: this.source.kind,\n operators: this.operatorIndex().length,\n pythonClasses: this.pythonIndex().length,\n patterns: this.patterns().length,\n glsl: this.glsl().length,\n tutorials: this.tutorialIndex().length,\n };\n }\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LEVELS: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: 99,\n};\n\nexport interface Logger {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Creates a leveled logger. All output goes to **stderr** so that stdout stays\n * reserved for the MCP stdio protocol stream.\n */\nexport function createLogger(level: LogLevel = \"info\"): Logger {\n const threshold = LEVELS[level];\n\n const emit = (\n lvl: Exclude<LogLevel, \"silent\">,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n if (LEVELS[lvl] < threshold) return;\n const stamp = new Date().toISOString();\n const suffix = meta && Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : \"\";\n process.stderr.write(`[tdmcp] ${stamp} ${lvl.toUpperCase()} ${message}${suffix}\\n`);\n };\n\n return {\n debug: (message, meta) => emit(\"debug\", message, meta),\n info: (message, meta) => emit(\"info\", message, meta),\n warn: (message, meta) => emit(\"warn\", message, meta),\n error: (message, meta) => emit(\"error\", message, meta),\n };\n}\n\n/** A logger that discards everything — handy for tests. */\nexport const silentLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { compactKey } from \"../knowledge/normalize.js\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { recipesDir } from \"../utils/paths.js\";\nimport { type Recipe, RecipeSchema, type RecipeSummary } from \"./schema.js\";\n\nexport interface RecipeLibraryOptions {\n dir?: string;\n logger?: Logger;\n}\n\n/** Loads and validates recipe JSON files from the recipes directory. */\nexport class RecipeLibrary {\n private readonly dir: string;\n private readonly logger: Logger;\n private cache?: Recipe[];\n\n constructor(options: RecipeLibraryOptions = {}) {\n this.dir = options.dir ?? recipesDir();\n this.logger = options.logger ?? silentLogger;\n }\n\n private load(): Recipe[] {\n if (this.cache) return this.cache;\n const recipes: Recipe[] = [];\n if (existsSync(this.dir)) {\n for (const file of readdirSync(this.dir)) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const raw = JSON.parse(readFileSync(join(this.dir, file), \"utf8\"));\n const parsed = RecipeSchema.safeParse(raw);\n if (parsed.success) {\n recipes.push(parsed.data);\n } else {\n this.logger.warn(`Invalid recipe ${file}`, { issues: parsed.error.issues.length });\n }\n } catch (err) {\n this.logger.warn(`Failed to read recipe ${file}`, { error: String(err) });\n }\n }\n }\n this.cache = recipes;\n return recipes;\n }\n\n all(): Recipe[] {\n return this.load();\n }\n\n list(): RecipeSummary[] {\n return this.load().map((r) => ({\n id: r.id,\n name: r.name,\n description: r.description,\n tags: r.tags,\n difficulty: r.difficulty,\n }));\n }\n\n get(id: string): Recipe | undefined {\n const key = compactKey(id);\n return this.load().find((r) => compactKey(r.id) === key || compactKey(r.name) === key);\n }\n\n /** Finds the best recipe whose tags/name/description match any of the given terms. */\n findByTags(terms: string[]): Recipe | undefined {\n const wanted = terms.map((t) => t.toLowerCase()).filter(Boolean);\n if (wanted.length === 0) return undefined;\n let best: { recipe: Recipe; score: number } | undefined;\n for (const recipe of this.load()) {\n const haystack =\n `${recipe.name} ${recipe.description} ${recipe.tags.join(\" \")}`.toLowerCase();\n let score = 0;\n for (const term of wanted) {\n if (recipe.tags.some((tag) => tag.toLowerCase() === term)) score += 2;\n else if (haystack.includes(term)) score += 1;\n }\n if (score > 0 && (!best || score > best.score)) best = { recipe, score };\n }\n return best?.recipe;\n }\n}\n","import { z } from \"zod\";\n\nexport const RecipeNodeSchema = z.object({\n name: z.string().describe(\"Unique node name within the recipe (used for wiring).\"),\n type: z.string().describe(\"Operator type, e.g. 'noiseTOP'.\"),\n parameters: z.record(z.string(), z.unknown()).default({}),\n parent: z\n .string()\n .optional()\n .describe(\n \"Name of another recipe node (a COMP, e.g. a geometryCOMP) to nest this node inside of. \" +\n \"The parent must appear earlier in `nodes`. Used to place SOPs inside a Geometry COMP.\",\n ),\n render: z\n .boolean()\n .optional()\n .describe(\n \"For a SOP nested in a geometryCOMP: make this the rendered geometry. Sets the render/display \" +\n \"flags on it and clears its siblings, so the COMP renders this instead of its default torus.\",\n ),\n comment: z.string().optional(),\n});\n\nexport const RecipeConnectionSchema = z.object({\n from: z.string().describe(\"Source node name.\"),\n to: z.string().describe(\"Target node name.\"),\n from_output: z.number().int().nonnegative().default(0),\n to_input: z.number().int().nonnegative().default(0),\n});\n\nexport const RecipeParameterSchema = z.object({\n name: z.string().describe(\"Friendly name of the exposed control.\"),\n node: z.string().describe(\"Recipe node name the parameter belongs to.\"),\n param: z.string().describe(\"TD parameter name on that node.\"),\n value: z.unknown().optional(),\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n description: z.string().optional(),\n});\n\n/**\n * A uniform exposed by a GLSL TOP. On the GLSL TOP these live in *parameter\n * sequences*, not normal parameters, so they cannot be set the usual way: the block\n * count (`op.seq.<seq>.numBlocks`) has to be raised first, after which the per-block\n * name/value sub-parameters exist. `float`/`vec` uniforms bind through the \"Vectors\"\n * page (the `vec` sequence); `color` binds through the \"Colors\" page (the `color`\n * sequence). The \"Constants\" page does NOT feed a runtime `uniform float`, so it is\n * not used here. `buildFromRecipe` handles the translation; authors just declare the\n * uniform.\n */\nexport const RecipeGlslUniformSchema = z.object({\n node: z.string().describe(\"Recipe node name of the GLSL TOP that declares the uniform.\"),\n name: z.string().describe(\"Uniform name as referenced in the shader, e.g. 'uFeed'.\"),\n kind: z\n .enum([\"float\", \"vec\", \"color\"])\n .default(\"float\")\n .describe(\n \"Uniform kind: float (uniform float), vec (uniform vec2/3/4), color (rgba). \" +\n \"float/vec use the Vectors page; color uses the Colors page.\",\n ),\n value: z\n .union([z.number(), z.array(z.number())])\n .optional()\n .describe(\"Initial value: a number for float, or an array of components for vec/color.\"),\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n description: z.string().optional(),\n});\nexport type RecipeGlslUniform = z.infer<typeof RecipeGlslUniformSchema>;\n\nexport const RecipeSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().default(\"\"),\n tags: z.array(z.string()).default([]),\n difficulty: z.enum([\"beginner\", \"intermediate\", \"advanced\"]).default(\"intermediate\"),\n td_version_min: z.string().default(\"2023\"),\n nodes: z.array(RecipeNodeSchema).min(1),\n connections: z.array(RecipeConnectionSchema).default([]),\n parameters: z.array(RecipeParameterSchema).default([]),\n glsl_uniforms: z.array(RecipeGlslUniformSchema).default([]),\n glsl_code: z.record(z.string(), z.string()).optional(),\n python_code: z.record(z.string(), z.string()).optional(),\n preview_description: z.string().default(\"\"),\n});\nexport type Recipe = z.infer<typeof RecipeSchema>;\n\nexport interface RecipeSummary {\n id: string;\n name: string;\n description: string;\n tags: string[];\n difficulty: Recipe[\"difficulty\"];\n}\n","import type { z } from \"zod\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { TdApiError, TdConnectionError, TdTimeoutError } from \"./types.js\";\nimport {\n ApiEnvelopeSchema,\n BatchResultSchema,\n type CreateNodeInput,\n CreateNodeInputSchema,\n DeleteResultSchema,\n ExecResultSchema,\n InfoSchema,\n MethodResultSchema,\n NodeDetailSchema,\n NodeErrorsSchema,\n NodeListSchema,\n NodeRefSchema,\n PerformanceSchema,\n PreviewSchema,\n type TdBatchOperation,\n TopologySchema,\n} from \"./validators.js\";\n\nexport interface TouchDesignerClientOptions {\n baseUrl: string;\n timeoutMs?: number;\n logger?: Logger;\n /** Optional shared bearer token; sent as `Authorization: Bearer <token>` when set. */\n token?: string;\n /** Overridable for tests (defaults to global `fetch`). */\n fetchImpl?: typeof fetch;\n}\n\ntype QueryParams = Record<string, string | number | boolean | undefined>;\n\nfunction extractErrorMessage(json: unknown): string | undefined {\n if (json && typeof json === \"object\") {\n const obj = json as Record<string, unknown>;\n const error = obj.error;\n if (\n error &&\n typeof error === \"object\" &&\n typeof (error as Record<string, unknown>).message === \"string\"\n ) {\n return (error as Record<string, string>).message;\n }\n if (typeof obj.message === \"string\") return obj.message;\n }\n return undefined;\n}\n\n/** Encodes a TD node path (which contains slashes) into a single URL segment. */\nfunction segment(path: string): string {\n return encodeURIComponent(path);\n}\n\n/**\n * HTTP client for the TouchDesigner REST bridge. Every method maps to one of the\n * endpoints in the bridge spec. All failures surface as typed `TdError`s so MCP\n * tool handlers can convert them into friendly messages without crashing.\n */\nexport class TouchDesignerClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly logger: Logger;\n private readonly token: string | undefined;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: TouchDesignerClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.timeoutMs = options.timeoutMs ?? 10000;\n this.logger = options.logger ?? silentLogger;\n this.token = options.token;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n get endpoint(): string {\n return this.baseUrl;\n }\n\n private async request<T>(\n method: string,\n path: string,\n schema: z.ZodType<T>,\n body?: unknown,\n query?: QueryParams,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let response: Response;\n try {\n this.logger.debug(`TD ${method} ${path}`);\n const headers: Record<string, string> = {};\n if (body !== undefined) headers[\"content-type\"] = \"application/json\";\n if (this.token) headers.authorization = `Bearer ${this.token}`;\n response = await this.fetchImpl(url, {\n method,\n signal: controller.signal,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TdTimeoutError(\n `TouchDesigner request timed out after ${this.timeoutMs}ms (${method} ${path}).`,\n { cause: err },\n );\n }\n throw new TdConnectionError(\n `Cannot reach TouchDesigner at ${this.baseUrl}. Make sure TD is running with the tdmcp bridge (WebServer DAT) installed and listening on that port.`,\n { cause: err },\n );\n } finally {\n clearTimeout(timer);\n }\n\n const text = await response.text();\n let json: unknown;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n json = undefined;\n }\n }\n\n if (!response.ok) {\n const message =\n extractErrorMessage(json) ??\n `TouchDesigner bridge returned HTTP ${response.status} for ${method} ${path}.`;\n throw new TdApiError(message, { status: response.status });\n }\n\n const envelope = ApiEnvelopeSchema.safeParse(json);\n if (!envelope.success) {\n throw new TdApiError(`Malformed response from TouchDesigner bridge for ${method} ${path}.`, {\n status: response.status,\n });\n }\n if (!envelope.data.ok) {\n throw new TdApiError(\n envelope.data.error?.message ?? `TouchDesigner reported an error for ${method} ${path}.`,\n { status: response.status, apiCode: envelope.data.error?.code },\n );\n }\n\n const parsed = schema.safeParse(envelope.data.data);\n if (!parsed.success) {\n throw new TdApiError(\n `Unexpected data shape from TouchDesigner bridge for ${method} ${path}: ${parsed.error.message}`,\n { status: response.status },\n );\n }\n return parsed.data;\n }\n\n getInfo() {\n return this.request(\"GET\", \"/api/info\", InfoSchema);\n }\n\n createNode(input: CreateNodeInput) {\n return this.request(\"POST\", \"/api/nodes\", NodeRefSchema, CreateNodeInputSchema.parse(input));\n }\n\n deleteNode(path: string) {\n return this.request(\"DELETE\", `/api/nodes/${segment(path)}`, DeleteResultSchema);\n }\n\n getNodes(parentPath?: string) {\n return this.request(\"GET\", \"/api/nodes\", NodeListSchema, undefined, { parent: parentPath });\n }\n\n getNode(path: string) {\n return this.request(\"GET\", `/api/nodes/${segment(path)}`, NodeDetailSchema);\n }\n\n updateNodeParameters(path: string, parameters: Record<string, unknown>) {\n return this.request(\"PATCH\", `/api/nodes/${segment(path)}`, NodeDetailSchema, { parameters });\n }\n\n executePythonScript(script: string, returnOutput = true) {\n return this.request(\"POST\", \"/api/exec\", ExecResultSchema, {\n script,\n return_output: returnOutput,\n });\n }\n\n execNodeMethod(\n path: string,\n method: string,\n args: unknown[] = [],\n kwargs: Record<string, unknown> = {},\n ) {\n return this.request(\"POST\", `/api/nodes/${segment(path)}/method`, MethodResultSchema, {\n method,\n args,\n kwargs,\n });\n }\n\n getNodeErrors(path: string) {\n return this.request(\"GET\", `/api/nodes/${segment(path)}/errors`, NodeErrorsSchema);\n }\n\n getPreview(path: string, width = 640, height = 360) {\n return this.request(\"GET\", `/api/preview/${segment(path)}`, PreviewSchema, undefined, {\n width,\n height,\n });\n }\n\n batch(operations: TdBatchOperation[]) {\n return this.request(\"POST\", \"/api/batch\", BatchResultSchema, { operations });\n }\n\n getNetworkErrors(path: string) {\n return this.request(\"GET\", `/api/network/${segment(path)}/errors`, NodeErrorsSchema);\n }\n\n getNetworkTopology(path: string, recursive = false) {\n return this.request(\n \"GET\",\n `/api/network/${segment(path)}/topology`,\n TopologySchema,\n undefined,\n recursive ? { recursive: true } : undefined,\n );\n }\n\n getNetworkPerformance(path: string) {\n return this.request(\"GET\", `/api/network/${segment(path)}/performance`, PerformanceSchema);\n }\n}\n","import { z } from \"zod\";\n\nexport const ConfigSchema = z.object({\n /** TouchDesigner bridge host. */\n tdHost: z.string().min(1).default(\"127.0.0.1\"),\n /** TouchDesigner bridge port (WebServer DAT). */\n tdPort: z.coerce.number().int().positive().max(65535).default(9980),\n /** MCP transport: `stdio` (default, for local clients) or `http` (Streamable HTTP, loopback-only). */\n transport: z.enum([\"stdio\", \"http\"]).default(\"stdio\"),\n /** Log verbosity (written to stderr). */\n logLevel: z.enum([\"debug\", \"info\", \"warn\", \"error\", \"silent\"]).default(\"info\"),\n /** Per-request timeout against the TD bridge, in milliseconds. */\n requestTimeoutMs: z.coerce.number().int().positive().default(10000),\n /** HTTP transport port (only used when transport=http). */\n httpPort: z.coerce.number().int().positive().max(65535).default(3939),\n /** Subscribe to TD WebSocket events and forward them as MCP logging notifications. */\n events: z.enum([\"on\", \"off\"]).default(\"on\"),\n /**\n * Raw Python escape-hatch tools (`execute_python_script`, `exec_node_method`).\n * Set to \"off\" to lock them out for restricted setups; on by default.\n */\n rawPython: z.enum([\"on\", \"off\"]).default(\"on\"),\n /**\n * Optional shared bearer token for the TD bridge. When set, the server sends it\n * as `Authorization: Bearer <token>` and the bridge requires a match. Leave unset\n * (default) for the zero-config local flow. Set the SAME value in TouchDesigner's\n * environment (`TDMCP_BRIDGE_TOKEN`) to turn enforcement on.\n */\n bridgeToken: z.string().min(1).optional(),\n});\n\nexport type TdmcpConfig = z.infer<typeof ConfigSchema>;\n\n/**\n * Loads and validates configuration from environment variables. Missing values\n * fall back to sensible defaults; invalid values throw a descriptive ZodError.\n */\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): TdmcpConfig {\n return ConfigSchema.parse({\n tdHost: env.TDMCP_TD_HOST,\n tdPort: env.TDMCP_TD_PORT,\n transport: env.TDMCP_TRANSPORT,\n logLevel: env.TDMCP_LOG_LEVEL,\n requestTimeoutMs: env.TDMCP_REQUEST_TIMEOUT_MS,\n httpPort: env.TDMCP_HTTP_PORT,\n events: env.TDMCP_EVENTS,\n rawPython: env.TDMCP_RAW_PYTHON,\n bridgeToken: env.TDMCP_BRIDGE_TOKEN || undefined,\n });\n}\n\n/** Base URL for the TouchDesigner REST bridge. */\nexport function tdBaseUrl(config: Pick<TdmcpConfig, \"tdHost\" | \"tdPort\">): string {\n return `http://${config.tdHost}:${config.tdPort}`;\n}\n","import { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport { type TdmcpConfig, tdBaseUrl } from \"../utils/config.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\n/**\n * Owns the TouchDesigner client and exposes a cheap health probe. The MCP server\n * stays alive whether or not TD is reachable.\n */\nexport class ConnectionManager {\n readonly client: TouchDesignerClient;\n\n constructor(config: TdmcpConfig, logger: Logger) {\n this.client = new TouchDesignerClient({\n baseUrl: tdBaseUrl(config),\n timeoutMs: config.requestTimeoutMs,\n token: config.bridgeToken,\n logger,\n });\n }\n\n async isReachable(): Promise<boolean> {\n try {\n await this.client.getInfo();\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { KnowledgeBase } from \"../knowledge/index.js\";\nimport { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { ToolContext } from \"../tools/types.js\";\nimport type { TdmcpConfig } from \"../utils/config.js\";\nimport { createLogger, type Logger } from \"../utils/logger.js\";\nimport { ConnectionManager } from \"./connectionManager.js\";\n\nexport interface ToolContextOverrides {\n logger?: Logger;\n knowledge?: KnowledgeBase;\n recipes?: RecipeLibrary;\n connection?: ConnectionManager;\n}\n\n/**\n * Assembles the shared {@link ToolContext} that backs every tool handler. Both\n * the MCP server and the agent CLI build their context here, so the two surfaces\n * stay on the same core (client + knowledge + recipes) without duplicating wiring.\n */\nexport function buildToolContext(\n config: TdmcpConfig,\n overrides: ToolContextOverrides = {},\n): ToolContext {\n const logger = overrides.logger ?? createLogger(config.logLevel);\n const connection = overrides.connection ?? new ConnectionManager(config, logger);\n const knowledge = overrides.knowledge ?? new KnowledgeBase({ logger });\n const recipes = overrides.recipes ?? new RecipeLibrary({ logger });\n return {\n client: connection.client,\n knowledge,\n recipes,\n logger,\n allowRawPython: config.rawPython !== \"off\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { type TdEvent, TdEventStream } from \"../td-client/eventStream.js\";\nimport { type TdmcpConfig, tdBaseUrl } from \"../utils/config.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\n/** A running transport plus a way to shut it down cleanly. */\nexport interface TransportHandle {\n close: () => Promise<void>;\n}\n\nconst MCP_PATH = \"/mcp\";\n\n/** Forwards one TD event to a connected MCP client as a logging notification. */\nfunction forwardEvent(server: McpServer, event: TdEvent): void {\n const level = event.event === \"node.error\" ? \"error\" : \"info\";\n void server.sendLoggingMessage({ level, logger: \"touchdesigner\", data: event }).catch(() => {\n // client may not support logging or not be connected yet — ignore\n });\n}\n\n/** Opens the TD event stream (if enabled) and routes each event to `onEvent`. */\nfunction createEventStream(\n config: TdmcpConfig,\n logger: Logger,\n onEvent: (event: TdEvent) => void,\n): TdEventStream | undefined {\n if (config.events !== \"on\") return undefined;\n const url = `${tdBaseUrl(config).replace(/^http/, \"ws\")}/`;\n const stream = new TdEventStream({ url, logger, onEvent });\n stream.start();\n return stream;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, payload: unknown): void {\n res.writeHead(status, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify(payload));\n}\n\nfunction startStdio(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): TransportHandle {\n const server = createMcpServer();\n const transport = new StdioServerTransport();\n void server.connect(transport);\n logger.info(\"tdmcp connected over stdio\");\n\n const events = createEventStream(config, logger, (event) => forwardEvent(server, event));\n\n return {\n close: async () => {\n events?.close();\n await server.close();\n },\n };\n}\n\n/**\n * Stateful Streamable HTTP transport: one MCP server + transport per session,\n * keyed by the `mcp-session-id` header. Sessions are created on an `initialize`\n * POST and torn down on transport close or DELETE.\n */\nfunction startHttp(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): TransportHandle {\n const transports = new Map<string, StreamableHTTPServerTransport>();\n const servers = new Map<string, McpServer>();\n const events = createEventStream(config, logger, (event) => {\n for (const sessionServer of servers.values()) forwardEvent(sessionServer, event);\n });\n\n const httpServer: Server = createServer((req, res) => {\n void handle(req, res).catch((err) => {\n logger.error(\"HTTP request failed\", { error: String(err) });\n if (!res.headersSent) {\n sendJson(res, 500, {\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal server error\" },\n id: null,\n });\n }\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n if (url.pathname !== MCP_PATH) {\n sendJson(res, 404, { error: \"Not found. MCP endpoint is at /mcp.\" });\n return;\n }\n const sessionId = req.headers[\"mcp-session-id\"];\n const existing = typeof sessionId === \"string\" ? transports.get(sessionId) : undefined;\n\n if (req.method === \"POST\") {\n const body = await readBody(req);\n if (!existing) {\n if (!isInitializeRequest(body)) {\n sendJson(res, 400, {\n jsonrpc: \"2.0\",\n error: { code: -32000, message: \"No valid session; send an initialize request first.\" },\n id: null,\n });\n return;\n }\n const sessionServer = createMcpServer();\n const created: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n transports.set(id, created);\n servers.set(id, sessionServer);\n },\n // Reject Host headers other than loopback to block DNS-rebinding attacks.\n enableDnsRebindingProtection: true,\n allowedHosts: [`127.0.0.1:${config.httpPort}`, `localhost:${config.httpPort}`],\n });\n created.onclose = () => {\n if (created.sessionId) {\n transports.delete(created.sessionId);\n servers.delete(created.sessionId);\n }\n };\n await sessionServer.connect(created);\n await created.handleRequest(req, res, body);\n return;\n }\n await existing.handleRequest(req, res, body);\n return;\n }\n\n if (req.method === \"GET\" || req.method === \"DELETE\") {\n if (!existing) {\n sendJson(res, 400, { error: \"Unknown or missing mcp-session-id.\" });\n return;\n }\n await existing.handleRequest(req, res);\n return;\n }\n\n sendJson(res, 405, { error: \"Method not allowed.\" });\n }\n\n // Bind to loopback by default so HTTP isn't unexpectedly exposed.\n httpServer.listen(config.httpPort, \"127.0.0.1\", () => {\n logger.info(\"tdmcp listening over Streamable HTTP\", { port: config.httpPort, path: MCP_PATH });\n });\n\n return {\n close: async () => {\n events?.close();\n for (const transport of transports.values()) await transport.close();\n transports.clear();\n servers.clear();\n await new Promise<void>((resolve) => httpServer.close(() => resolve()));\n },\n };\n}\n\n/**\n * Connects the MCP server to a transport based on config. `stdio` is the default;\n * `http` serves Streamable HTTP. Returns a handle for clean shutdown.\n */\nexport async function startTransport(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): Promise<TransportHandle> {\n if (config.transport === \"http\") {\n return startHttp(createMcpServer, config, logger);\n }\n return startStdio(createMcpServer, config, logger);\n}\n","import { type Logger, silentLogger } from \"../utils/logger.js\";\n\nexport interface TdEvent {\n event: string;\n data?: unknown;\n}\n\nexport type TdEventHandler = (event: TdEvent) => void;\n\n/** High-frequency events are dropped unless explicitly opted in, to avoid flooding. */\nconst HIGH_FREQUENCY = new Set([\"timeline.frame\", \"node.cook\"]);\n\n/**\n * Parses a raw WebSocket message into a `TdEvent`, applying the high-frequency\n * filter. Returns `undefined` for messages that should be ignored.\n */\nexport function parseEventMessage(raw: unknown, includeHighFrequency = false): TdEvent | undefined {\n if (typeof raw !== \"string\") return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n if (!parsed || typeof parsed !== \"object\") return undefined;\n const event = (parsed as { event?: unknown }).event;\n if (typeof event !== \"string\") return undefined;\n if (!includeHighFrequency && HIGH_FREQUENCY.has(event)) return undefined;\n return { event, data: (parsed as { data?: unknown }).data };\n}\n\nexport interface TdEventStreamOptions {\n url: string;\n onEvent: TdEventHandler;\n logger?: Logger;\n includeHighFrequency?: boolean;\n}\n\n/**\n * Connects to the TouchDesigner bridge WebSocket and forwards events. Uses the\n * built-in global `WebSocket` (Node 22+), reconnects with exponential backoff,\n * and is fully optional — the server works whether or not this connects.\n */\nexport class TdEventStream {\n private socket?: WebSocket;\n private closed = false;\n private backoffMs = 1000;\n private readonly url: string;\n private readonly onEvent: TdEventHandler;\n private readonly logger: Logger;\n private readonly includeHighFrequency: boolean;\n\n constructor(options: TdEventStreamOptions) {\n this.url = options.url;\n this.onEvent = options.onEvent;\n this.logger = options.logger ?? silentLogger;\n this.includeHighFrequency = options.includeHighFrequency ?? false;\n }\n\n start(): void {\n this.connect();\n }\n\n private connect(): void {\n if (this.closed) return;\n let socket: WebSocket;\n try {\n socket = new WebSocket(this.url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.socket = socket;\n socket.addEventListener(\"open\", () => {\n this.backoffMs = 1000;\n this.logger.debug(\"event stream connected\", { url: this.url });\n });\n socket.addEventListener(\"message\", (ev) => {\n const event = parseEventMessage((ev as { data?: unknown }).data, this.includeHighFrequency);\n if (!event) return;\n try {\n this.onEvent(event);\n } catch (err) {\n this.logger.debug(\"event handler failed\", { error: String(err) });\n }\n });\n socket.addEventListener(\"close\", () => this.scheduleReconnect());\n socket.addEventListener(\"error\", () => {\n // a \"close\" event follows; reconnection is handled there\n });\n }\n\n private scheduleReconnect(): void {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 2, 30000);\n const timer = setTimeout(() => this.connect(), delay);\n timer.unref?.();\n }\n\n close(): void {\n this.closed = true;\n try {\n this.socket?.close();\n } catch {\n // ignore\n }\n }\n}\n","import { runInstallBridge } from \"./cli/installBridge.js\";\nimport { createTdmcpServer } from \"./server/tdmcpServer.js\";\nimport { startTransport } from \"./server/transportFactory.js\";\nimport { loadConfig } from \"./utils/config.js\";\nimport { createLogger } from \"./utils/logger.js\";\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n if (argv[0] === \"install-bridge\") {\n runInstallBridge(argv.slice(1));\n return;\n }\n\n const config = loadConfig();\n const logger = createLogger(config.logLevel);\n\n try {\n const handle = await startTransport(\n () => createTdmcpServer(config, { logger }),\n config,\n logger,\n );\n\n const shutdown = () => {\n logger.info(\"tdmcp shutting down\");\n void handle.close().finally(() => process.exit(0));\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n } catch (err) {\n logger.error(\"Failed to start tdmcp server\", { error: String(err) });\n process.exitCode = 1;\n }\n}\n\nvoid main();\n"],"mappings":"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","names":["existsSync","existsSync","z","z","z","z","z","z","z","z","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","z","parentPath","q","z","z","q","z","z","q","z","z","q","z","z","q","z","builder","z","q","z","z","z","z","z","z","z","z","q","z","z","z","z","z","z","z","RESOLUTIONS","q","z","z","z","z","z","q","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","fetch","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","dirname","resolve","fileURLToPath","existsSync","readFileSync","join","existsSync","join","readFileSync","cached","q","existsSync","readdirSync","readFileSync","join","z","existsSync","readdirSync","readFileSync","join","z","resolve"]}
1
+ {"version":3,"sources":["../src/cli/installBridge.ts","../src/utils/paths.ts","../src/server/tdmcpServer.ts","../src/prompts/debugNetwork.ts","../src/prompts/types.ts","../src/prompts/explainNetwork.ts","../src/prompts/optimizePerformance.ts","../src/prompts/remixVisual.ts","../src/prompts/visualArtistMode.ts","../src/prompts/index.ts","../src/resources/glslPatternResource.ts","../src/resources/shared.ts","../src/resources/operatorResource.ts","../src/knowledge/normalize.ts","../src/resources/patternResource.ts","../src/resources/pythonApiResource.ts","../src/resources/recipeResource.ts","../src/resources/tutorialResource.ts","../src/resources/index.ts","../src/tools/layer1/applyPostProcessing.ts","../src/feedback/errorChecker.ts","../src/feedback/previewCapture.ts","../src/td-client/types.ts","../src/tools/layer2/connectHelper.ts","../src/tools/layer2/createControlPanel.ts","../src/tools/pythonReport.ts","../src/tools/result.ts","../src/tools/layout.ts","../src/tools/layer1/orchestration.ts","../src/tools/layer1/createAudioReactive.ts","../src/tools/layer1/createDataVisualization.ts","../src/tools/layer1/createFeedbackNetwork.ts","../src/tools/layer1/createGenerativeArt.ts","../src/tools/layer1/createParticleSystem.ts","../src/tools/layer1/createVisualSystem.ts","../src/tools/layer1/intent.ts","../src/tools/layer1/describeProject.ts","../src/tools/layer1/getPreview.ts","../src/tools/layer1/setupOutput.ts","../src/tools/layer1/index.ts","../src/tools/layer2/animateParameter.ts","../src/tools/layer2/arrangeNetwork.ts","../src/tools/layer2/connectNodes.ts","../src/tools/layer2/createContainer.ts","../src/tools/layer2/createExternalIo.ts","../src/tools/layer2/createGlslShader.ts","../src/tools/layer2/createNodeChain.ts","../src/tools/layer2/createPythonScript.ts","../src/tools/layer2/duplicateNetwork.ts","../src/tools/layer2/manageComponent.ts","../src/tools/layer2/managePresets.ts","../src/tools/layer2/setParametersBatch.ts","../src/tools/layer2/index.ts","../src/tools/layer3/compareTdNodes.ts","../src/tools/layer3/createTdNode.ts","../src/tools/layer3/deleteTdNode.ts","../src/tools/layer3/execNodeMethod.ts","../src/tools/layer3/executePythonScript.ts","../src/tools/layer3/findTdNodes.ts","../src/td-client/validators.ts","../src/tools/layer3/nodeMatch.ts","../src/tools/layer3/getModuleHelp.ts","../src/tools/layer3/getTdClassDetails.ts","../src/tools/layer3/getTdClasses.ts","../src/tools/layer3/getTdInfo.ts","../src/tools/layer3/getTdNodeErrors.ts","../src/tools/layer3/getTdNodeParameters.ts","../src/tools/layer3/getTdNodes.ts","../src/tools/layer3/getTdPerformance.ts","../src/feedback/performanceMonitor.ts","../src/tools/layer3/getTdTopology.ts","../src/feedback/networkVerifier.ts","../src/tools/layer3/snapshotTdGraph.ts","../src/tools/layer3/summarizeTdErrors.ts","../src/tools/layer3/updateTdNodeParameters.ts","../src/tools/layer3/index.ts","../src/tools/index.ts","../src/utils/version.ts","../src/knowledge/index.ts","../src/utils/logger.ts","../src/recipes/loader.ts","../src/recipes/schema.ts","../src/td-client/touchDesignerClient.ts","../src/utils/config.ts","../src/server/connectionManager.ts","../src/server/context.ts","../src/server/transportFactory.ts","../src/td-client/eventStream.ts","../src/index.ts"],"sourcesContent":["import { cpSync, existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { bridgeModulesDir } from \"../utils/paths.js\";\n\n/**\n * `tdmcp install-bridge [--dir <path>]`\n *\n * Copies the packaged TouchDesigner bridge modules (`td/modules`) to a friendly,\n * stable folder on disk and prints the two things the artist needs to turn the\n * bridge on inside TouchDesigner. This is what makes the `npx` flow work without\n * cloning the repo: the modules live in the npm cache otherwise.\n */\nexport function runInstallBridge(args: string[]): void {\n const dirFlag = args.indexOf(\"--dir\");\n const explicitDir = dirFlag !== -1 ? args[dirFlag + 1] : undefined;\n const targetRoot = explicitDir ?? join(homedir(), \"tdmcp-bridge\");\n const dest = join(targetRoot, \"modules\");\n\n const src = bridgeModulesDir();\n if (!existsSync(src)) {\n console.error(\n `[tdmcp] Could not find the bridge modules to copy (looked in ${src}).\\n` +\n \"If you're running from source, build first with `npm run build`.\",\n );\n process.exitCode = 1;\n return;\n }\n\n cpSync(src, dest, { recursive: true });\n\n const oneLiner = \"from mcp import install; install.run()\";\n const noPrefs = `import sys; sys.path.insert(0, ${JSON.stringify(dest)})\\n${oneLiner.replace(\"install.run()\", `install.run(modules_dir=${JSON.stringify(dest)})`)}`;\n\n console.log(\n [\n \"\",\n \" tdmcp bridge installed.\",\n ` Modules copied to: ${dest}`,\n \"\",\n \" Now switch the bridge on inside TouchDesigner:\",\n \"\",\n \" 1. Open Preferences (Edit > Preferences, or the TouchDesigner menu on macOS).\",\n ' In \"Python 64-bit Module Path\", add this folder:',\n \"\",\n ` ${dest}`,\n \"\",\n \" 2. Open the Textport (Dialogs > Textport and DATs) and run:\",\n \"\",\n ` ${oneLiner}`,\n \"\",\n \" You should see: [tdmcp] bridge running on port 9980 (/project1/tdmcp_bridge)\",\n \"\",\n \" ⚠ Security: the bridge runs arbitrary Python inside TouchDesigner and the\",\n \" Web Server DAT listens on all network interfaces with no auth. Only run it\",\n \" on a trusted network, or firewall port 9980 to localhost.\",\n \"\",\n \" Prefer not to touch Preferences? Paste this in the Textport instead:\",\n \"\",\n ...noPrefs.split(\"\\n\").map((line) => ` ${line}`),\n \"\",\n ].join(\"\\n\"),\n );\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst moduleDir = dirname(fileURLToPath(import.meta.url));\n\nfunction firstExisting(candidates: string[], fallback: string): string {\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return fallback;\n}\n\n/**\n * Directory holding the imported knowledge base JSON.\n * - dev (tsx): `<root>/src/knowledge/data`\n * - build (node): `<root>/dist/knowledge/data` (copied by `copy-assets.mjs`)\n */\nexport function knowledgeDataDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../knowledge/data\"), resolve(moduleDir, \"knowledge/data\")],\n resolve(moduleDir, \"../knowledge/data\"),\n );\n}\n\n/**\n * Directory holding recipe JSON files.\n * - dev: `<root>/recipes`\n * - build: `<root>/dist/recipes`\n */\nexport function recipesDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../../recipes\"), resolve(moduleDir, \"recipes\")],\n resolve(moduleDir, \"../../recipes\"),\n );\n}\n\n/**\n * Directory holding the TouchDesigner-side Python bridge modules that ship with\n * the package (the `td/modules` tree). Used by the `install-bridge` CLI to copy\n * them somewhere TouchDesigner can import from.\n * - dev (tsx): `<root>/td/modules`\n * - installed package (node): `<pkgroot>/td/modules`\n */\nexport function bridgeModulesDir(): string {\n return firstExisting(\n [resolve(moduleDir, \"../td/modules\"), resolve(moduleDir, \"../../td/modules\")],\n resolve(moduleDir, \"../td/modules\"),\n );\n}\n\n/**\n * Resolves the installed `@bottobot/td-mcp` package root (the source of operator\n * data), if present. Used as a fallback when local knowledge data is missing.\n */\nexport function bottobotPackageDir(): string | undefined {\n const candidates = [\n resolve(moduleDir, \"../../node_modules/@bottobot/td-mcp\"),\n resolve(moduleDir, \"../node_modules/@bottobot/td-mcp\"),\n resolve(process.cwd(), \"node_modules/@bottobot/td-mcp\"),\n ];\n for (const candidate of candidates) {\n if (existsSync(resolve(candidate, \"wiki/data/processed\"))) return candidate;\n }\n return undefined;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAllPrompts } from \"../prompts/index.js\";\nimport { registerAllResources } from \"../resources/index.js\";\nimport { registerAllTools } from \"../tools/index.js\";\nimport type { TdmcpConfig } from \"../utils/config.js\";\nimport { getVersion } from \"../utils/version.js\";\nimport { buildToolContext, type ToolContextOverrides } from \"./context.js\";\n\nconst INSTRUCTIONS = `tdmcp lets you build visual systems in TouchDesigner.\n\nWorkflow:\n1. Call get_td_info first to confirm the bridge is reachable.\n2. Consult the knowledge base resources (tdmcp://operators/..., tdmcp://recipes/...) before creating nodes — never invent operator types.\n3. Build with the highest-level tool that fits, dropping to Layer 2/3 for fine control.\n4. After building, check get_td_node_errors and capture get_preview so the artist can see the result.\n5. Prefer structured inspection/edit tools (find_td_nodes, get_td_node_parameters, summarize_td_errors, compare_td_nodes, snapshot_td_graph, update_td_node_parameters) and process their structuredContent with code. Treat execute_python_script and exec_node_method as a last resort, only when no structured tool fits.\n\nThe server stays usable even when TouchDesigner is offline; tools return a friendly error in that case.`;\n\nexport type TdmcpServerOverrides = ToolContextOverrides;\n\n/** Builds a fully wired (but not yet connected) MCP server. */\nexport function createTdmcpServer(\n config: TdmcpConfig,\n overrides: TdmcpServerOverrides = {},\n): McpServer {\n const ctx = buildToolContext(config, overrides);\n const { knowledge, recipes, logger } = ctx;\n\n const server = new McpServer(\n { name: \"tdmcp\", version: getVersion() },\n { instructions: INSTRUCTIONS },\n );\n\n registerAllTools(server, ctx);\n registerAllResources(server, { knowledge, recipes, logger });\n registerAllPrompts(server, { knowledge, recipes, logger });\n\n logger.info(\"tdmcp server initialized\", {\n version: getVersion(),\n knowledge: knowledge.stats(),\n recipes: recipes.list().length,\n });\n\n return server;\n}\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerDebugNetwork: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"debug_network\",\n {\n title: \"Debug network\",\n description:\n \"Systematically debug a TD network: check errors, verify connections, inspect cook times, and suggest fixes.\",\n argsSchema: { root_path: z.string().describe(\"Root path to debug from, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Debug the TouchDesigner network under ${root_path}. Work step by step:`,\n `1. Call get_td_node_errors with path \"${root_path}\" and recursive=true. List every error/warning.`,\n `2. Call get_td_nodes for \"${root_path}\" to map the children, and get_td_node_parameters on any node that errored.`,\n \"3. For each error, explain the likely cause (missing input, bad parameter, unsupported operator, resolution mismatch) and the concrete fix.\",\n \"4. Apply fixes with update_td_node_parameters or connect_nodes, then re-run get_td_node_errors to confirm.\",\n \"5. Finish with get_preview on the output TOP to confirm it renders.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { KnowledgeBase } from \"../knowledge/index.js\";\nimport type { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\nexport interface PromptContext {\n knowledge: KnowledgeBase;\n recipes: RecipeLibrary;\n logger: Logger;\n}\n\nexport type PromptRegistrar = (server: McpServer, ctx: PromptContext) => void;\n\n/** Builds a single user-message prompt result. */\nexport function userPrompt(text: string) {\n return { messages: [{ role: \"user\" as const, content: { type: \"text\" as const, text } }] };\n}\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerExplainNetwork: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"explain_network\",\n {\n title: \"Explain network\",\n description:\n \"Generate a human-readable explanation of what a TD network does: data flow, key parameters, and artistic intent.\",\n argsSchema: { root_path: z.string().describe(\"Root path to explain, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Explain the TouchDesigner network under ${root_path} for someone learning TouchDesigner.`,\n `1. Call get_td_nodes for \"${root_path}\" and follow the connections to understand the data flow.`,\n \"2. Describe the signal path from input to output in plain language (what each stage does and why).\",\n \"3. Call out the key parameters an artist would tweak and what visual effect they have.\",\n \"4. Summarize the artistic intent — what the piece looks like and the technique it uses.\",\n \"Keep it concise and friendly; avoid dumping raw parameter lists.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerOptimizePerformance: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"optimize_performance\",\n {\n title: \"Optimize performance\",\n description:\n \"Analyze a TD network for performance: identify bottlenecks, suggest resolution changes, and recommend cooking optimizations.\",\n argsSchema: { root_path: z.string().describe(\"Root path to optimize, e.g. /project1.\") },\n },\n ({ root_path }) =>\n userPrompt(\n [\n `Optimize the TouchDesigner network under ${root_path} for real-time performance.`,\n `1. Inspect cook times: read tdmcp://operators for any heavy operators and use get_td_node_parameters under \"${root_path}\".`,\n \"2. Identify the most expensive nodes and explain why (resolution too high, cooking every frame, large blurs/feedback, CPU SOPs).\",\n \"3. Recommend concrete fixes: lower TOP resolution, use Null/Select for caching, reduce blur sizes, move CPU work to GPU, limit cook rate, bypass unused branches.\",\n \"4. Apply the safe changes with update_td_node_parameters and report the expected FPS impact. Do not delete nodes unless asked.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerRemixVisual: PromptRegistrar = (server) => {\n server.registerPrompt(\n \"remix_visual\",\n {\n title: \"Remix visual\",\n description:\n \"Take an existing visual system and create variations — change colors, swap techniques, add effects, alter timing.\",\n argsSchema: {\n source_path: z.string().describe(\"Path of the visual system to remix.\"),\n remix_direction: z\n .string()\n .describe(\"What to change, e.g. 'make it darker', 'add glitch', 'slow it down'.\"),\n },\n },\n ({ source_path, remix_direction }) =>\n userPrompt(\n [\n `Remix the visual system at ${source_path}. Direction: \"${remix_direction}\".`,\n `1. Inspect it first: get_td_nodes and get_td_node_parameters under \"${source_path}\" to understand the current setup.`,\n \"2. Plan changes that match the direction (palette via level/hsv_adjust, motion via transform/feedback gain, texture via added effects).\",\n \"3. Prefer non-destructive edits: update parameters, or use apply_post_processing to add effects after the output. Do not delete the original unless asked.\",\n \"4. After editing, run get_td_node_errors and get_preview to show the remixed result, and describe what changed.\",\n ].join(\"\\n\"),\n ),\n );\n};\n","import { z } from \"zod\";\nimport { type PromptRegistrar, userPrompt } from \"./types.js\";\n\nexport const registerVisualArtistMode: PromptRegistrar = (server, ctx) => {\n server.registerPrompt(\n \"visual_artist_mode\",\n {\n title: \"Visual artist mode\",\n description:\n \"Think in terms of visual composition, color, motion and aesthetics rather than code while building in TouchDesigner.\",\n argsSchema: {\n style: z\n .string()\n .optional()\n .describe(\"Artistic style: abstract, geometric, organic, glitch, minimal, maximal.\"),\n },\n },\n ({ style }) => {\n const recipes = ctx.recipes\n .list()\n .map((r) => r.id)\n .join(\", \");\n return userPrompt(\n [\n \"You are in Visual Artist Mode for TouchDesigner via the tdmcp server.\",\n \"Think like a VJ / installation artist — composition, color, motion, rhythm, negative space — not code.\",\n \"\",\n \"Working method:\",\n \"1. Prefer high-level tools: create_visual_system (from a description) or create_feedback_network / create_generative_art / create_audio_reactive / create_particle_system.\",\n \"2. Before creating nodes, consult the knowledge resources: tdmcp://operators/{category|name} and tdmcp://recipes/{name}. Never invent operator types.\",\n \"3. Build inside a new container; keep the project tidy.\",\n \"4. After building, run get_td_node_errors, then get_preview so we can SEE the result, and iterate on the aesthetics.\",\n `Available recipes: ${recipes || \"(none yet)\"}.`,\n style ? `\\nLean into a \"${style}\" aesthetic in your choices.` : \"\",\n ].join(\"\\n\"),\n );\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerDebugNetwork } from \"./debugNetwork.js\";\nimport { registerExplainNetwork } from \"./explainNetwork.js\";\nimport { registerOptimizePerformance } from \"./optimizePerformance.js\";\nimport { registerRemixVisual } from \"./remixVisual.js\";\nimport type { PromptContext } from \"./types.js\";\nimport { registerVisualArtistMode } from \"./visualArtistMode.js\";\n\n/** Registers every MCP prompt against the server. */\nexport function registerAllPrompts(server: McpServer, ctx: PromptContext): void {\n registerVisualArtistMode(server, ctx);\n registerDebugNetwork(server, ctx);\n registerOptimizePerformance(server, ctx);\n registerExplainNetwork(server, ctx);\n registerRemixVisual(server, ctx);\n}\n\nexport type { PromptContext } from \"./types.js\";\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerGlslPatternResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://glsl/{pattern_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listGlslPatterns().map((pattern) => ({\n uri: `tdmcp://glsl/${pattern.id}`,\n name: pattern.name,\n description: `${pattern.difficulty} — ${pattern.description}`,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-glsl\",\n template,\n {\n title: \"GLSL shader patterns\",\n description: \"Named GLSL shader techniques with ready-to-use fragment shader snippets.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.pattern_name);\n const pattern = ctx.knowledge.getGlslPattern(name);\n if (!pattern) return jsonContents(uri, { error: `GLSL pattern \"${name}\" not found.` });\n return jsonContents(uri, pattern);\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { KnowledgeBase } from \"../knowledge/index.js\";\nimport type { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\nexport interface ResourceContext {\n knowledge: KnowledgeBase;\n recipes: RecipeLibrary;\n logger: Logger;\n}\n\nexport type ResourceRegistrar = (server: McpServer, ctx: ResourceContext) => void;\n\n/** URI template variables may be string or string[]; this returns the first scalar. */\nexport function firstVar(value: string | string[] | undefined): string {\n if (Array.isArray(value)) return value[0] ?? \"\";\n return value ?? \"\";\n}\n\nexport function jsonContents(uri: URL, data: unknown): ReadResourceResult {\n return {\n contents: [\n { uri: uri.href, mimeType: \"application/json\", text: JSON.stringify(data, null, 2) },\n ],\n };\n}\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { compactKey } from \"../knowledge/normalize.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerOperatorResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://operators/{name}\", {\n list: async () => ({\n resources: ctx.knowledge.listOperatorCategories().map((category) => ({\n uri: `tdmcp://operators/${category}`,\n name: `Operators: ${category}`,\n description: `All ${category} operators`,\n mimeType: \"application/json\",\n })),\n }),\n complete: {\n name: async (value) => {\n const categories = ctx.knowledge.listOperatorCategories();\n const operators = ctx.knowledge.searchOperators(value, 20).map((o) => o.slug);\n return [...categories, ...operators].slice(0, 50);\n },\n },\n });\n\n server.registerResource(\n \"td-operators\",\n template,\n {\n title: \"TouchDesigner operators\",\n description:\n \"Operator catalog. Read a category (TOP, CHOP, SOP, DAT, COMP, MAT, POP) to list its operators, or an operator name/slug for full documentation.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.name);\n const isCategory = ctx.knowledge\n .listOperatorCategories()\n .some((category) => compactKey(category) === compactKey(name));\n\n if (isCategory) {\n const operators = ctx.knowledge.listOperators(name);\n return jsonContents(uri, { category: name, count: operators.length, operators });\n }\n\n const doc = ctx.knowledge.getOperator(name);\n if (!doc) {\n const suggestions = ctx.knowledge.searchOperators(name, 5).map((o) => o.name);\n return jsonContents(uri, { error: `Operator \"${name}\" not found.`, suggestions });\n }\n return jsonContents(uri, doc);\n },\n );\n};\n","import type {\n GlslTechnique,\n OperatorDoc,\n OperatorSummary,\n Pattern,\n PythonClass,\n PythonClassSummary,\n Tutorial,\n TutorialSummary,\n} from \"./types.js\";\n\n/** Filename-style slug: lowercase, non-alphanumerics collapse to underscores. */\nexport function slugify(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n\n/** Lookup key that unifies \"Noise TOP\", \"noiseTOP\" and \"noise_top\" → \"noisetop\". */\nexport function compactKey(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nexport function toOperatorSummary(slug: string, doc: OperatorDoc): OperatorSummary {\n return {\n slug,\n name: doc.name,\n displayName: doc.displayName ?? doc.name,\n category: doc.category ?? \"Unknown\",\n subcategory: doc.subcategory ?? \"\",\n summary: doc.summary ?? doc.description ?? \"\",\n keywords: doc.keywords ?? [],\n };\n}\n\nexport function toPythonSummary(cls: PythonClass): PythonClassSummary {\n return {\n className: cls.className,\n displayName: cls.displayName ?? cls.className,\n category: cls.category ?? \"Unknown\",\n methodCount: cls.methods?.length ?? 0,\n memberCount: cls.members?.length ?? 0,\n };\n}\n\nexport function toTutorialSummary(tut: Tutorial): TutorialSummary {\n return {\n id: tut.id,\n name: tut.name,\n category: tut.category ?? \"Unknown\",\n summary: tut.summary ?? tut.description ?? \"\",\n };\n}\n\ninterface RawPattern {\n name?: string;\n description?: string;\n category?: string;\n workflow?: string[];\n use_case?: string;\n}\n\n/**\n * The bottobot patterns file is an object with a `patterns` array (plus extra\n * metadata keys). Normalizes it into a flat, id-keyed array.\n */\nexport function normalizePatterns(raw: unknown): Pattern[] {\n let list: RawPattern[] = [];\n if (Array.isArray(raw)) {\n list = raw as RawPattern[];\n } else if (raw && typeof raw === \"object\") {\n const obj = raw as Record<string, unknown>;\n if (Array.isArray(obj.patterns)) {\n list = obj.patterns as RawPattern[];\n } else {\n list = Object.values(obj).filter((v): v is RawPattern => !!v && typeof v === \"object\");\n }\n }\n return list\n .filter((p) => typeof p.name === \"string\")\n .map((p) => ({\n id: slugify(p.name as string),\n name: p.name as string,\n description: p.description,\n category: p.category,\n workflow: Array.isArray(p.workflow) ? p.workflow : undefined,\n use_case: p.use_case,\n }));\n}\n\ninterface RawGlslFile {\n techniques?: unknown;\n}\n\n/** Extracts GLSL techniques from bottobot's `experimental/glsl.json`. */\nexport function normalizeGlsl(raw: unknown): GlslTechnique[] {\n const file = (raw ?? {}) as RawGlslFile;\n const techniques = Array.isArray(file.techniques) ? file.techniques : [];\n return techniques\n .filter((t): t is Record<string, unknown> => !!t && typeof t === \"object\")\n .map((t) => {\n const name = typeof t.name === \"string\" ? t.name : \"Untitled\";\n const id = typeof t.id === \"string\" && t.id.length > 0 ? t.id : slugify(name);\n return {\n id,\n name,\n subcategory: typeof t.subcategory === \"string\" ? t.subcategory : undefined,\n description: typeof t.description === \"string\" ? t.description : undefined,\n difficulty: typeof t.difficulty === \"string\" ? t.difficulty : undefined,\n operators: Array.isArray(t.operators) ? (t.operators as string[]) : undefined,\n tags: Array.isArray(t.tags) ? (t.tags as string[]) : undefined,\n notes: typeof t.notes === \"string\" ? t.notes : undefined,\n code: (t.code ?? undefined) as GlslTechnique[\"code\"],\n setup: typeof t.setup === \"string\" ? t.setup : undefined,\n };\n });\n}\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerPatternResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://patterns/{pattern_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listPatterns().map((pattern) => ({\n uri: `tdmcp://patterns/${pattern.id}`,\n name: pattern.name,\n description: pattern.description,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-patterns\",\n template,\n {\n title: \"TouchDesigner workflow patterns\",\n description: \"Named operator-chain workflow patterns (recommended wiring for common tasks).\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.pattern_name);\n const pattern = ctx.knowledge.getPattern(name);\n if (!pattern) return jsonContents(uri, { error: `Pattern \"${name}\" not found.` });\n return jsonContents(uri, pattern);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerPythonApiResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://python-api/{class_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listPythonClasses().map((cls) => ({\n uri: `tdmcp://python-api/${cls.className}`,\n name: `Python: ${cls.className}`,\n description: `${cls.methodCount} methods, ${cls.memberCount} members`,\n mimeType: \"application/json\",\n })),\n }),\n complete: {\n class_name: async (value) =>\n ctx.knowledge\n .listPythonClasses()\n .map((c) => c.className)\n .filter((n) => n.toLowerCase().includes(value.toLowerCase()))\n .slice(0, 50),\n },\n });\n\n server.registerResource(\n \"td-python-api\",\n template,\n {\n title: \"TouchDesigner Python API\",\n description: \"Python class reference (members + methods) for the TouchDesigner API.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const className = firstVar(variables.class_name);\n const cls = ctx.knowledge.getPythonClass(className);\n if (!cls) return jsonContents(uri, { error: `Python class \"${className}\" not found.` });\n return jsonContents(uri, cls);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerRecipeResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://recipes/{recipe_name}\", {\n list: async () => ({\n resources: ctx.recipes.list().map((recipe) => ({\n uri: `tdmcp://recipes/${recipe.id}`,\n name: recipe.name,\n description: `${recipe.difficulty} — ${recipe.description}`,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-recipes\",\n template,\n {\n title: \"Composite network recipes\",\n description: \"Pre-validated composite network templates (nodes + connections + parameters).\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.recipe_name);\n const recipe = ctx.recipes.get(name);\n if (!recipe) {\n return jsonContents(uri, {\n error: `Recipe \"${name}\" not found.`,\n available: ctx.recipes.list().map((r) => r.id),\n });\n }\n return jsonContents(uri, recipe);\n },\n );\n};\n","import { ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { firstVar, jsonContents, type ResourceRegistrar } from \"./shared.js\";\n\nexport const registerTutorialResource: ResourceRegistrar = (server, ctx) => {\n const template = new ResourceTemplate(\"tdmcp://tutorials/{tutorial_name}\", {\n list: async () => ({\n resources: ctx.knowledge.listTutorials().map((tutorial) => ({\n uri: `tdmcp://tutorials/${tutorial.id}`,\n name: tutorial.name,\n description: tutorial.summary,\n mimeType: \"application/json\",\n })),\n }),\n });\n\n server.registerResource(\n \"td-tutorials\",\n template,\n {\n title: \"TouchDesigner tutorials\",\n description: \"Long-form tutorial content covering TD fundamentals and workflows.\",\n mimeType: \"application/json\",\n },\n async (uri, variables) => {\n const name = firstVar(variables.tutorial_name);\n const tutorial = ctx.knowledge.getTutorial(name);\n if (!tutorial) return jsonContents(uri, { error: `Tutorial \"${name}\" not found.` });\n return jsonContents(uri, tutorial);\n },\n );\n};\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerGlslPatternResource } from \"./glslPatternResource.js\";\nimport { registerOperatorResource } from \"./operatorResource.js\";\nimport { registerPatternResource } from \"./patternResource.js\";\nimport { registerPythonApiResource } from \"./pythonApiResource.js\";\nimport { registerRecipeResource } from \"./recipeResource.js\";\nimport type { ResourceContext } from \"./shared.js\";\nimport { registerTutorialResource } from \"./tutorialResource.js\";\n\n/** Registers every MCP resource (knowledge base) against the server. */\nexport function registerAllResources(server: McpServer, ctx: ResourceContext): void {\n registerOperatorResource(server, ctx);\n registerPythonApiResource(server, ctx);\n registerPatternResource(server, ctx);\n registerGlslPatternResource(server, ctx);\n registerRecipeResource(server, ctx);\n registerTutorialResource(server, ctx);\n}\n\nexport type { ResourceContext } from \"./shared.js\";\n","import { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, type NetworkBuilder, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst DIRECT_EFFECTS: Record<string, { type: string; parameters?: Record<string, unknown> }> = {\n // bloomTOP defaults bloom everything above 0.01 and adds it back, which blows bright\n // sources out to solid white. Raise the threshold so only highlights bloom, and soften the\n // intensity for a tasteful glow that preserves the underlying image.\n bloom: {\n type: \"bloomTOP\",\n parameters: { bloomthreshold: 0.8, bloomintensity: 0.6, bloomfill: 0.5 },\n },\n blur: { type: \"blurTOP\", parameters: { size: 4 } },\n edge_detect: { type: \"edgeTOP\" },\n sharpen: { type: \"sharpenTOP\" },\n threshold: { type: \"thresholdTOP\", parameters: { threshold: 0.5 } },\n invert: { type: \"levelTOP\", parameters: { invert: 1 } },\n color_grade: { type: \"levelTOP\", parameters: { gamma1: 1.1, blacklevel: 0.02 } },\n};\n\nconst GLSL_EFFECTS: Record<string, string> = {\n rgb_split: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec2 o=vec2(0.004,0.0);\n float r=texture(sTD2DInputs[0],uv+o).r; float g=texture(sTD2DInputs[0],uv).g; float b=texture(sTD2DInputs[0],uv-o).b;\n fragColor=TDOutputSwizzle(vec4(r,g,b,1.0)); }\n`,\n chromatic_aberration: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec2 o=(uv-0.5)*0.02;\n float r=texture(sTD2DInputs[0],uv+o).r; float g=texture(sTD2DInputs[0],uv).g; float b=texture(sTD2DInputs[0],uv-o).b;\n fragColor=TDOutputSwizzle(vec4(r,g,b,1.0)); }\n`,\n scanlines: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float s=0.85+0.15*step(0.5,fract(uv.y*uTD2DInfos[0].res.w*0.5));\n fragColor=TDOutputSwizzle(vec4(c.rgb*s,c.a)); }\n`,\n vignette: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float v=smoothstep(0.8,0.35,distance(uv,vec2(0.5)));\n fragColor=TDOutputSwizzle(vec4(c.rgb*v,c.a)); }\n`,\n posterize: `out vec4 fragColor;\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n vec3 p=floor(c.rgb*6.0)/6.0; fragColor=TDOutputSwizzle(vec4(p,c.a)); }\n`,\n film_grain: `out vec4 fragColor;\nfloat hash(vec2 p){return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453);}\nvoid main(){ vec2 uv=vUV.st; vec4 c=texture(sTD2DInputs[0],uv);\n float g=hash(uv*uTD2DInfos[0].res.zw)*0.12-0.06; fragColor=TDOutputSwizzle(vec4(c.rgb+g,c.a)); }\n`,\n glitch: `out vec4 fragColor;\nfloat hash(float x){return fract(sin(x*127.1)*43758.5453);}\nvoid main(){ vec2 uv=vUV.st; float band=floor(uv.y*24.0);\n float off=(hash(band)-0.5)*0.06*step(0.7,hash(band*1.7));\n fragColor=TDOutputSwizzle(texture(sTD2DInputs[0],uv+vec2(off,0.0))); }\n`,\n};\n\nconst EFFECTS = [\n \"bloom\",\n \"chromatic_aberration\",\n \"film_grain\",\n \"vignette\",\n \"color_grade\",\n \"sharpen\",\n \"blur\",\n \"edge_detect\",\n \"invert\",\n \"threshold\",\n \"posterize\",\n \"glitch\",\n \"rgb_split\",\n \"scanlines\",\n] as const;\n\nexport const applyPostProcessingSchema = z.object({\n source_path: z.string().describe(\"Path of the TOP to post-process.\"),\n effects: z.array(z.enum(EFFECTS)).min(1).describe(\"Effects to apply in order.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype ApplyPostProcessingArgs = z.infer<typeof applyPostProcessingSchema>;\n\nasync function addGlslEffect(\n builder: NetworkBuilder,\n name: string,\n fragment: string,\n): Promise<string> {\n const glsl = await builder.add(\"glslTOP\", name);\n const frag = await builder.add(\"textDAT\", `${name}_frag`);\n await builder.python(\n `op(${q(frag)}).text = ${q(fragment)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n return glsl;\n}\n\nexport async function applyPostProcessingImpl(ctx: ToolContext, args: ApplyPostProcessingArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"post_fx\");\n // Wires can't cross COMPs, so pull the external source in via a Select TOP (references by path).\n const source = await builder.add(\"selectTOP\", \"source\");\n await builder.setParams(source, { top: args.source_path });\n let previous = source;\n let applied = 0;\n\n for (let i = 0; i < args.effects.length; i++) {\n const effect = args.effects[i];\n if (!effect) continue;\n let nodePath: string | undefined;\n const direct = DIRECT_EFFECTS[effect];\n if (direct) {\n nodePath = await builder.add(direct.type, `${effect}${i}`, direct.parameters);\n } else if (GLSL_EFFECTS[effect]) {\n nodePath = await addGlslEffect(builder, `${effect}${i}`, GLSL_EFFECTS[effect]);\n }\n if (!nodePath) {\n builder.warnings.push(`Effect \"${effect}\" is not supported and was skipped.`);\n continue;\n }\n await builder.connect(previous, nodePath);\n previous = nodePath;\n applied++;\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(previous, out);\n\n return finalize(ctx, {\n summary: `Applied ${applied}/${args.effects.length} post-processing effect(s) to ${args.source_path}.`,\n builder,\n outputPath: out,\n extra: { source_path: args.source_path, effects: args.effects },\n });\n });\n}\n\nexport const registerApplyPostProcessing: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"apply_post_processing\",\n {\n title: \"Apply post-processing\",\n description:\n \"Chain post-processing effects (bloom, glitch, rgb_split, vignette, etc.) onto an existing TOP. Returns the processed output.\",\n inputSchema: applyPostProcessingSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => applyPostProcessingImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport type { TdNodeError } from \"../td-client/types.js\";\n\nexport interface ErrorReport {\n path: string;\n hasErrors: boolean;\n errors: TdNodeError[];\n}\n\n/** Checks a node (or its whole sub-network) for errors after building. */\nexport async function checkErrors(\n client: TouchDesignerClient,\n path: string,\n recursive = true,\n): Promise<ErrorReport> {\n const result = recursive ? await client.getNetworkErrors(path) : await client.getNodeErrors(path);\n return { path, hasErrors: result.errors.length > 0, errors: result.errors };\n}\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\n\nexport interface PreviewResult {\n path: string;\n width: number;\n height: number;\n base64: string;\n mimeType: string;\n}\n\n/** Captures a TOP as a base64 image via the bridge preview endpoint. */\nexport async function capturePreview(\n client: TouchDesignerClient,\n path: string,\n width = 640,\n height = 360,\n): Promise<PreviewResult> {\n const preview = await client.getPreview(path, width, height);\n return {\n path: preview.path,\n width: preview.width,\n height: preview.height,\n base64: preview.base64,\n mimeType: `image/${preview.format || \"png\"}`,\n };\n}\n","/** Base error for all TouchDesigner bridge failures. */\nexport class TdError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"TdError\";\n this.code = code;\n }\n}\n\n/** The bridge could not be reached (TD not running, wrong host/port, etc.). */\nexport class TdConnectionError extends TdError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, \"TD_CONNECTION\", options);\n this.name = \"TdConnectionError\";\n }\n}\n\n/** The request exceeded the configured timeout. */\nexport class TdTimeoutError extends TdError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, \"TD_TIMEOUT\", options);\n this.name = \"TdTimeoutError\";\n }\n}\n\n/** The bridge responded but reported an error (HTTP non-2xx or `ok: false`). */\nexport class TdApiError extends TdError {\n readonly status: number | undefined;\n readonly apiCode: string | undefined;\n\n constructor(message: string, options?: { status?: number; apiCode?: string; cause?: unknown }) {\n super(message, \"TD_API\", options);\n this.name = \"TdApiError\";\n this.status = options?.status;\n this.apiCode = options?.apiCode;\n }\n}\n\n/** Produces a human-friendly, single-line description of any error. */\nexport function friendlyTdError(err: unknown): string {\n if (err instanceof TdError) return err.message;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nexport type {\n ApiEnvelope,\n CreateNodeInput,\n TdBatchOperation,\n TdBatchResult,\n TdConnection,\n TdDeleteResult,\n TdExecResult,\n TdInfo,\n TdMethodResult,\n TdNodeDetail,\n TdNodeError,\n TdNodeErrors,\n TdNodeList,\n TdNodeRef,\n TdPerformance,\n TdPreview,\n TdTopology,\n} from \"./validators.js\";\n","import type { TouchDesignerClient } from \"../../td-client/touchDesignerClient.js\";\nimport { TdApiError } from \"../../td-client/types.js\";\n\nexport interface ConnectResult {\n method: \"batch\" | \"python\";\n}\n\n/**\n * Connects two nodes. Prefers the bridge `/api/batch` connect op; if the bridge\n * responds with an API error (e.g. batch not supported), falls back to a Python\n * `inputConnectors[...].connect(...)` call. Connection/timeout errors propagate.\n */\nexport async function connectNodesViaBridge(\n client: TouchDesignerClient,\n sourcePath: string,\n targetPath: string,\n sourceOutput = 0,\n targetInput = 0,\n): Promise<ConnectResult> {\n try {\n const result = await client.batch([\n {\n action: \"connect\",\n source_path: sourcePath,\n target_path: targetPath,\n source_output: sourceOutput,\n target_input: targetInput,\n },\n ]);\n if (result.results[0]?.ok) return { method: \"batch\" };\n } catch (err) {\n if (!(err instanceof TdApiError)) throw err;\n }\n\n // Fallback: wire via Python inside TD. Validate first so a cross-container\n // wire (which TD silently no-ops) or a missing op raises instead of reporting\n // a phantom success.\n const src = JSON.stringify(sourcePath);\n const dst = JSON.stringify(targetPath);\n const python = [\n `__s = op(${src}); __d = op(${dst})`,\n `if __s is None or __d is None: raise LookupError('connect: source or target not found (%s -> %s)' % (${src}, ${dst}))`,\n `if __s.parent() is None or __d.parent() is None or __s.parent().path != __d.parent().path: raise ValueError('connect: cannot wire across containers (%s -> %s); use a Select/In OP to bring an operator across networks' % (${src}, ${dst}))`,\n `__d.inputConnectors[${targetInput}].connect(__s.outputConnectors[${sourceOutput}])`,\n ].join(\"\\n\");\n await client.executePythonScript(python, false);\n return { method: \"python\" };\n}\n","import { z } from \"zod\";\nimport { buildPayloadScript, parsePythonReport } from \"../pythonReport.js\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const controlSchema = z.object({\n name: z\n .string()\n .describe(\n \"Control label; also sanitized into a valid TD custom-parameter name (e.g. 'blur amount' → 'Bluramount').\",\n ),\n type: z\n .enum([\"float\", \"int\", \"toggle\", \"menu\", \"rgb\", \"pulse\", \"string\"])\n .default(\"float\")\n .describe(\n \"Widget kind: float/int sliders, a toggle, a dropdown menu, an RGB swatch, a momentary pulse, or a text field.\",\n ),\n label: z.string().optional().describe(\"Display label (defaults to `name`).\"),\n min: z.coerce.number().optional().describe(\"Slider lower bound (float/int) — also hard-clamped.\"),\n max: z.coerce.number().optional().describe(\"Slider upper bound (float/int) — also hard-clamped.\"),\n default: z.union([z.number(), z.boolean(), z.string()]).optional().describe(\"Initial value.\"),\n menu_items: z.array(z.string()).optional().describe(\"Options for a 'menu' control.\"),\n bind_to: z\n .array(z.string())\n .optional()\n .describe(\n \"Parameters this control should drive, each written as 'nodePath.parName' (e.g. '/project1/sys/blur1.size'). Each target is switched to expression mode so moving the control moves the parameter live. Not supported for 'rgb'/'pulse'.\",\n ),\n});\n\n/** One control spec (knob/slider/toggle/menu/…), reused by Layer 1 tools that auto-expose a panel. */\nexport type ControlSpec = z.infer<typeof controlSchema>;\n\nexport const createControlPanelSchema = z.object({\n comp_path: z\n .string()\n .default(\"/project1\")\n .describe(\n \"COMP that will receive the custom parameters — usually a generated system's container.\",\n ),\n page: z\n .string()\n .default(\"Controls\")\n .describe(\"Name of the custom-parameter page to add the controls to.\"),\n controls: z\n .array(controlSchema)\n .min(1)\n .describe(\"The controls (knobs/sliders/toggles/menus) to expose.\"),\n});\ntype CreateControlPanelArgs = z.infer<typeof createControlPanelSchema>;\n\ninterface ControlReport {\n comp: string;\n page: string;\n created: Array<{ control: string; name: string; type: string; pars: string[]; value: unknown }>;\n bound: Array<{ control: string; target: string }>;\n warnings: string[];\n fatal?: string;\n}\n\n// The whole panel is built in one Python pass: appending custom parameters is an\n// attribute-level operation with no structured bridge endpoint, and doing it in a\n// single script keeps the page/parameter/binding work atomic. `ParMode` is *not*\n// injected into the bridge's exec globals, so the expression-mode enum is derived\n// from a live parameter (`type(par.mode)`) instead of imported.\nconst PANEL_SCRIPT = `\nimport json, base64, traceback\n_payload = json.loads(base64.b64decode(\"__PAYLOAD_B64__\").decode(\"utf-8\"))\n_comp = op(_payload[\"comp\"]); _page_name = _payload[\"page\"]; _controls = _payload[\"controls\"]\nreport = {\"comp\": _payload[\"comp\"], \"page\": _page_name, \"created\": [], \"bound\": [], \"warnings\": []}\n\ndef _parname(s):\n s = \"\".join(ch for ch in s if ch.isalnum())\n if not s:\n s = \"Par\"\n if not s[0].isalpha():\n s = \"P\" + s\n # TD custom-parameter names must be a leading uppercase letter followed by lowercase\n # letters/digits only, so lowercase the tail — otherwise camelCase input like \"CamZoom\"\n # keeps its internal capital and TouchDesigner rejects the name.\n return s[0].upper() + s[1:].lower()\n\nif _comp is None:\n report[\"fatal\"] = \"COMP not found: \" + _payload[\"comp\"]\nelif not hasattr(_comp, \"appendCustomPage\"):\n report[\"fatal\"] = _payload[\"comp\"] + \" is not a COMP, so it cannot hold custom parameters.\"\nelse:\n _page = None\n for _pg in _comp.customPages:\n if _pg.name == _page_name:\n _page = _pg\n break\n if _page is None:\n _page = _comp.appendCustomPage(_page_name)\n for _spec in _controls:\n try:\n _name = _parname(_spec[\"name\"]); _typ = _spec.get(\"type\", \"float\"); _label = _spec.get(\"label\") or _spec[\"name\"]\n if _typ == \"float\":\n _pg = _page.appendFloat(_name, label=_label)\n elif _typ == \"int\":\n _pg = _page.appendInt(_name, label=_label)\n elif _typ == \"toggle\":\n _pg = _page.appendToggle(_name, label=_label)\n elif _typ == \"menu\":\n _pg = _page.appendMenu(_name, label=_label)\n elif _typ == \"rgb\":\n _pg = _page.appendRGB(_name, label=_label)\n elif _typ == \"pulse\":\n _pg = _page.appendPulse(_name, label=_label)\n elif _typ in (\"string\", \"str\"):\n _pg = _page.appendStr(_name, label=_label)\n else:\n report[\"warnings\"].append(\"Unknown control type '%s' for '%s'.\" % (_typ, _spec[\"name\"]))\n continue\n _p0 = _pg[0]; _dflt = _spec.get(\"default\", None)\n if _typ in (\"float\", \"int\"):\n _mn = _spec.get(\"min\", None); _mx = _spec.get(\"max\", None)\n if _mn is not None:\n _p0.normMin = _mn; _p0.min = _mn; _p0.clampMin = True\n if _mx is not None:\n _p0.normMax = _mx; _p0.max = _mx; _p0.clampMax = True\n if _dflt is not None:\n _p0.default = _dflt; _p0.val = _dflt\n elif _typ == \"toggle\":\n if _dflt is not None:\n _p0.default = bool(_dflt); _p0.val = bool(_dflt)\n elif _typ == \"menu\":\n _items = _spec.get(\"menu_items\") or []\n if _items:\n _names = [str(x) for x in _items]\n _p0.menuNames = _names; _p0.menuLabels = _names\n if _dflt is not None and str(_dflt) in [str(x) for x in _items]:\n _p0.default = str(_dflt); _p0.val = str(_dflt)\n elif _typ in (\"string\", \"str\"):\n if _dflt is not None:\n _p0.default = str(_dflt); _p0.val = str(_dflt)\n report[\"created\"].append({\"control\": _spec[\"name\"], \"name\": _name, \"type\": _typ, \"pars\": [pp.name for pp in _pg], \"value\": _p0.eval()})\n _binds = _spec.get(\"bind_to\") or []\n if _binds and _typ in (\"rgb\", \"pulse\"):\n report[\"warnings\"].append(\"bind_to ignored for '%s' (a %s control cannot drive a single parameter).\" % (_spec[\"name\"], _typ))\n _binds = []\n for _t in _binds:\n try:\n _dot = _t.rfind(\".\")\n if _dot <= 0:\n report[\"warnings\"].append(\"Invalid bind target '%s' (expected 'nodePath.parName').\" % _t)\n continue\n _np = _t[:_dot]; _pn = _t[_dot + 1:]; _tn = op(_np)\n if _tn is None:\n report[\"warnings\"].append(\"Bind target node not found: %s\" % _np)\n continue\n _tp = getattr(_tn.par, _pn, None)\n if _tp is None:\n report[\"warnings\"].append(\"Bind target parameter not found: %s.%s\" % (_np, _pn))\n continue\n _PM = type(_tp.mode)\n _tp.expr = \"op(%s).par.%s\" % (repr(_payload[\"comp\"]), _name)\n _tp.mode = _PM.EXPRESSION\n report[\"bound\"].append({\"control\": _name, \"target\": _np + \".\" + _pn})\n except Exception:\n report[\"warnings\"].append(\"Failed to bind '%s' to '%s': %s\" % (_name, _t, traceback.format_exc().splitlines()[-1]))\n except Exception:\n report[\"warnings\"].append(\"Failed to create control '%s': %s\" % (_spec.get(\"name\", \"?\"), traceback.format_exc().splitlines()[-1]))\nprint(json.dumps(report))\n`;\n\nexport function buildPanelScript(payload: object): string {\n return buildPayloadScript(PANEL_SCRIPT, payload);\n}\n\nexport function parseReport(stdout: string | undefined): ControlReport {\n return parsePythonReport<ControlReport>(stdout);\n}\n\nexport async function createControlPanelImpl(ctx: ToolContext, args: CreateControlPanelArgs) {\n return guardTd(\n async () => {\n const script = buildPanelScript({\n comp: args.comp_path,\n page: args.page,\n controls: args.controls,\n });\n const exec = await ctx.client.executePythonScript(script, true);\n return parseReport(exec.stdout);\n },\n (report) => {\n if (report.fatal) {\n return jsonResult(`Could not build control panel: ${report.fatal}`, report);\n }\n const summary = `Added ${report.created.length} control(s) on page \"${report.page}\" of ${report.comp}, ${report.bound.length} bound to live parameter(s)${\n report.warnings.length ? `, ${report.warnings.length} warning(s)` : \"\"\n }.`;\n return jsonResult(summary, report);\n },\n );\n}\n\nexport const registerCreateControlPanel: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_control_panel\",\n {\n title: \"Create control panel\",\n description:\n \"Expose live controls on a COMP: append custom parameters (sliders, toggles, menus, RGB, pulse) and bind them to node parameters so the artist can drive a generated system in real time. Point `comp_path` at a system container and list the controls; use each control's `bind_to` to wire it to one or more 'nodePath.parName' targets.\",\n inputSchema: createControlPanelSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createControlPanelImpl(ctx, args),\n );\n};\n","import { TdApiError } from \"../td-client/types.js\";\n\n/**\n * Helpers for tools that drive a single Python pass inside TouchDesigner and read\n * back a structured JSON report. The payload travels as base64 so arbitrary user\n * strings (quotes, newlines, unicode) can never break Python's quoting; the report\n * is recovered from stdout even if TD interleaves its own log lines.\n */\n\n/** Base64-embeds a JSON payload into a Python template (replacing `__PAYLOAD_B64__`). */\nexport function buildPayloadScript(template: string, payload: object): string {\n const b64 = Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64\");\n return template.replace(\"__PAYLOAD_B64__\", b64);\n}\n\n/** Pulls the JSON report object out of a script's stdout. */\nexport function parsePythonReport<T>(stdout: string | undefined): T {\n if (!stdout) throw new TdApiError(\"The TouchDesigner script returned no output.\");\n // The report is emitted as the final `print(json.dumps(...))`, so it is the\n // last non-empty line. Parse that first: it is robust to TD interleaving its\n // own log lines before the report — lines that may carry stray braces that\n // would otherwise widen (and corrupt) the `{` … `}` span heuristic below.\n const lines = stdout.split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]?.trim();\n if (!line) continue;\n if (line.startsWith(\"{\") && line.endsWith(\"}\")) {\n try {\n return JSON.parse(line) as T;\n } catch {\n // not valid JSON on its own — fall through to the span heuristic\n }\n }\n break; // only the last non-empty line qualifies for the single-line fast path\n }\n // Fallback: widest `{` … `}` span (covers a report printed across lines).\n const start = stdout.indexOf(\"{\");\n const end = stdout.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n try {\n return JSON.parse(stdout.slice(start, end + 1)) as T;\n } catch {\n // fall through to the shared error below\n }\n }\n throw new TdApiError(`Could not parse the TouchDesigner script result: ${stdout.slice(0, 200)}`);\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { friendlyTdError } from \"../td-client/types.js\";\n\ntype Content = CallToolResult[\"content\"];\n\nexport function textResult(text: string): CallToolResult {\n return { content: [{ type: \"text\", text }] };\n}\n\nexport function errorResult(message: string): CallToolResult {\n return { isError: true, content: [{ type: \"text\", text: message }] };\n}\n\n/** A text block followed by a pretty-printed JSON code fence. */\nexport function jsonResult(summary: string, data: unknown): CallToolResult {\n const text = `${summary}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``;\n return { content: [{ type: \"text\", text }] };\n}\n\n/**\n * A short text summary plus a machine-readable `structuredContent` payload.\n *\n * Use this (with an `outputSchema` on the tool) for read tools so agents can\n * process the data with code instead of re-parsing a JSON code fence out of the\n * conversation. The text block stays small on purpose — it is only a summary;\n * the full data travels on the `structuredContent` channel.\n */\nexport function structuredResult(summary: string, data: object): CallToolResult {\n return {\n content: [{ type: \"text\", text: summary }],\n structuredContent: data as { [key: string]: unknown },\n };\n}\n\n/** An image block (base64), optionally preceded by a caption. */\nexport function imageResult(\n base64: string,\n mimeType = \"image/png\",\n caption?: string,\n): CallToolResult {\n const content: Content = [];\n if (caption) content.push({ type: \"text\", text: caption });\n content.push({ type: \"image\", data: base64, mimeType });\n return { content };\n}\n\n/**\n * Runs a client call and formats the result, converting any TD error into a\n * friendly `isError` result instead of throwing out of the MCP handler.\n */\nexport async function guardTd<T>(\n fn: () => Promise<T>,\n onOk: (value: T) => CallToolResult,\n): Promise<CallToolResult> {\n try {\n return onOk(await fn());\n } catch (err) {\n return errorResult(friendlyTdError(err));\n }\n}\n","/**\n * Network-editor auto-layout. Arranges nodes left→right along their data flow so\n * a generated (or existing) network reads as sources-on-the-left, output-on-the-right\n * instead of every node piling up at the same coordinate.\n *\n * Positions are written through TouchDesigner's `nodeX`/`nodeY` *attributes* (not\n * parameters), so they have no structured setter and are applied via a small Python\n * snippet — the same exec-for-attributes pattern used elsewhere for `numBlocks`.\n */\n\n/** Horizontal gap between successive data-flow layers, in TD network units. */\nconst X_STEP = 200;\n/** Vertical gap between sibling nodes within a layer, in TD network units. */\nconst Y_STEP = 140;\n/** Breathing room left between an existing cluster and a newly placed node. */\nconst SIBLING_GAP = 80;\n\nexport interface LayoutEdge {\n from: string;\n to: string;\n}\n\n/** Map of node path → `[nodeX, nodeY]`. */\nexport type Positions = Record<string, [number, number]>;\n\nfunction pushTo<K, V>(map: Map<K, V[]>, key: K, value: V): void {\n const existing = map.get(key);\n if (existing) existing.push(value);\n else map.set(key, [value]);\n}\n\n/** Parent network path of a node path (everything before the last \"/\"). */\nexport function parentOf(path: string): string {\n const i = path.lastIndexOf(\"/\");\n return i <= 0 ? \"/\" : path.slice(0, i);\n}\n\n/**\n * Assigns each node a layer = the longest data-flow path leading into it, so\n * sources land at layer 0 and each node sits one column right of its deepest input.\n * Back-edges (feedback loops) contribute nothing, which keeps cyclic networks\n * finite and readable.\n */\nfunction layerByLongestPath(\n nodes: readonly string[],\n preds: Map<string, string[]>,\n): Map<string, number> {\n const memo = new Map<string, number>();\n const visiting = new Set<string>();\n const depth = (node: string): number => {\n const cached = memo.get(node);\n if (cached !== undefined) return cached;\n if (visiting.has(node)) return 0; // back-edge inside a cycle\n visiting.add(node);\n let best = 0;\n for (const pred of preds.get(node) ?? []) best = Math.max(best, depth(pred) + 1);\n visiting.delete(node);\n memo.set(node, best);\n return best;\n };\n const layers = new Map<string, number>();\n for (const node of nodes) layers.set(node, depth(node));\n return layers;\n}\n\n/**\n * Computes left→right data-flow coordinates for one set of sibling nodes. Edges\n * touching a node outside the set are ignored, so callers spanning nested COMPs\n * must group by parent first (see {@link computeLayoutByParent}). Within a layer,\n * nodes are stacked vertically and centered, preserving their input order.\n */\nexport function computeDataflowLayout(\n nodes: readonly string[],\n edges: readonly LayoutEdge[],\n): Positions {\n const set = new Set(nodes);\n const preds = new Map<string, string[]>();\n for (const { from, to } of edges) {\n if (from === to || !set.has(from) || !set.has(to)) continue;\n pushTo(preds, to, from);\n }\n\n const layerOf = layerByLongestPath(nodes, preds);\n const byLayer = new Map<number, string[]>();\n for (const node of nodes) pushTo(byLayer, layerOf.get(node) ?? 0, node);\n\n const positions: Positions = {};\n for (const [layer, members] of byLayer) {\n const center = (members.length - 1) / 2;\n members.forEach((node, i) => {\n positions[node] = [layer * X_STEP, (center - i) * Y_STEP];\n });\n }\n return positions;\n}\n\n/**\n * Groups node paths by parent network and lays out each group independently,\n * merging the results. Use when a node set may span nested COMPs (e.g. a system\n * container holding child COMPs that have their own internal networks).\n */\nexport function computeLayoutByParent(\n nodes: readonly string[],\n edges: readonly LayoutEdge[],\n): Positions {\n const groups = new Map<string, string[]>();\n for (const node of nodes) pushTo(groups, parentOf(node), node);\n\n const merged: Positions = {};\n for (const members of groups.values()) {\n Object.assign(merged, computeDataflowLayout(members, edges));\n }\n return merged;\n}\n\n/**\n * Builds a Python snippet that writes `nodeX`/`nodeY` for each path. The position\n * map is JSON-encoded (a valid Python literal for this string/number subset) and\n * applied defensively, so a stale path can't abort the rest of the batch.\n */\nexport function layoutScript(positions: Positions): string {\n return [\n `_pos = ${JSON.stringify(positions)}`,\n \"for _p, _xy in _pos.items():\",\n \" _n = op(_p)\",\n \" if _n is not None:\",\n \" _n.nodeX = _xy[0]\",\n \" _n.nodeY = _xy[1]\",\n ].join(\"\\n\");\n}\n\n/**\n * Builds a Python snippet that drops a just-created node clear of its existing\n * siblings — left-aligned with the current cluster and one gap below its lowest\n * node — so repeated top-level creations stack into a tidy column instead of\n * piling up at the origin. The first node in an empty network lands at (0, 0).\n */\nexport function placeBelowSiblingsScript(parentPath: string, nodePath: string): string {\n const q = JSON.stringify;\n return [\n `_parent = op(${q(parentPath)})`,\n `_new = op(${q(nodePath)})`,\n \"if _parent is not None and _new is not None:\",\n \" _sibs = [c for c in _parent.children if c is not _new]\",\n \" if _sibs:\",\n \" _new.nodeX = min(c.nodeX for c in _sibs)\",\n ` _new.nodeY = min(c.nodeY for c in _sibs) - _new.nodeHeight - ${SIBLING_GAP}`,\n \" else:\",\n \" _new.nodeX = 0\",\n \" _new.nodeY = 0\",\n ].join(\"\\n\");\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { checkErrors } from \"../../feedback/errorChecker.js\";\nimport { capturePreview } from \"../../feedback/previewCapture.js\";\nimport type { Recipe, RecipeGlslUniform } from \"../../recipes/schema.js\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { connectNodesViaBridge } from \"../layer2/connectHelper.js\";\nimport { buildPanelScript, type ControlSpec } from \"../layer2/createControlPanel.js\";\nimport {\n computeLayoutByParent,\n type LayoutEdge,\n layoutScript,\n placeBelowSiblingsScript,\n} from \"../layout.js\";\nimport { parsePythonReport } from \"../pythonReport.js\";\nimport { errorResult } from \"../result.js\";\nimport type { ToolContext } from \"../types.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\n/**\n * Maps each GLSL TOP uniform kind to the parameter *sequence* that binds it and the\n * per-block value sub-parameter suffixes (verified against a live GLSL TOP). A scalar\n * `uniform float` and a `uniform vecN` both bind through the \"Vectors\" page (the `vec`\n * sequence) — a float just fills the first (`valuex`) component; `color` binds through\n * the \"Colors\" page (the `color` sequence). The block name lives at `<seq><i>name`,\n * the values at `<seq><i><suffix>`. (The \"Constants\" page does not feed `uniform float`.)\n */\nconst UNIFORM_KINDS: Record<\n RecipeGlslUniform[\"kind\"],\n { seq: \"vec\" | \"color\"; fields: readonly string[] }\n> = {\n float: { seq: \"vec\", fields: [\"valuex\"] },\n vec: { seq: \"vec\", fields: [\"valuex\", \"valuey\", \"valuez\", \"valuew\"] },\n color: { seq: \"color\", fields: [\"rgbr\", \"rgbg\", \"rgbb\", \"alpha\"] },\n};\n\ninterface UniformGroup {\n node: string;\n seq: \"vec\" | \"color\";\n items: RecipeGlslUniform[];\n}\n\n/**\n * Groups uniforms by node + binding sequence, preserving order (block index = position\n * in group). `float` and `vec` share the `vec` sequence, so they land in one group and\n * receive distinct block indices.\n */\nfunction groupUniforms(uniforms: readonly RecipeGlslUniform[]): UniformGroup[] {\n const groups = new Map<string, UniformGroup>();\n for (const uniform of uniforms) {\n const { seq } = UNIFORM_KINDS[uniform.kind];\n const key = `${uniform.node} ${seq}`;\n let group = groups.get(key);\n if (!group) {\n group = { node: uniform.node, seq, items: [] };\n groups.set(key, group);\n }\n group.items.push(uniform);\n }\n return [...groups.values()];\n}\n\n/**\n * Conversion operators (e.g. `choptoTOP`, `dattoCHOP`, `toptoCHOP`, `soptoDAT`)\n * read their source from a parameter named after the source family, not from a\n * connector wire. Returns that parameter name (`chop`/`dat`/`top`/`sop`) or undefined.\n */\nfunction converterSourceParam(type: string): string | undefined {\n const match = /^(chop|dat|top|sop)to/i.exec(type);\n return match?.[1]?.toLowerCase();\n}\n\n/** Wraps a Layer 1 build, converting any thrown TD error into a friendly result. */\nexport async function runBuild(fn: () => Promise<CallToolResult>): Promise<CallToolResult> {\n try {\n return await fn();\n } catch (err) {\n return errorResult(friendlyTdError(err));\n }\n}\n\nexport interface CreatedNode {\n name: string;\n path: string;\n type: string;\n}\n\n/**\n * Stateful helper for building a network inside a container. Connection / param\n * failures are collected as warnings rather than thrown, so a partial build still\n * returns useful information (fail-forward).\n */\nexport class NetworkBuilder {\n readonly created: CreatedNode[] = [];\n readonly warnings: string[] = [];\n private readonly nameToPath = new Map<string, string>();\n private readonly pathToType = new Map<string, string>();\n // Intended data-flow wires, recorded even when the physical connect fails or is\n // satisfied via a source parameter, so auto-layout still reflects the flow.\n private readonly edges: LayoutEdge[] = [];\n\n constructor(\n private readonly ctx: ToolContext,\n readonly containerPath: string,\n ) {}\n\n async add(\n type: string,\n name?: string,\n parameters?: Record<string, unknown>,\n parentPath?: string,\n ): Promise<string> {\n const ref = await this.ctx.client.createNode({\n parent_path: parentPath ?? this.containerPath,\n type,\n name,\n parameters,\n });\n if (name) this.nameToPath.set(name, ref.path);\n if (ref.name) this.nameToPath.set(ref.name, ref.path);\n this.pathToType.set(ref.path, ref.type || type);\n this.created.push({ name: ref.name || name || \"\", path: ref.path, type: ref.type || type });\n // A fresh geometryCOMP ships with a default torus1 that renders over the real\n // geometry; clear its default children before the builder populates it.\n if (/geometrycomp/i.test(type)) {\n await this.python(`_g = op(${q(ref.path)})\\nfor _c in list(_g.children):\\n _c.destroy()`);\n }\n return ref.path;\n }\n\n pathOf(name: string): string | undefined {\n return this.nameToPath.get(name);\n }\n\n async connect(fromPath: string, toPath: string, fromOutput = 0, toInput = 0): Promise<void> {\n this.edges.push({ from: fromPath, to: toPath });\n // Conversion ops (choptoTOP, dattoCHOP, …) take their source via a parameter.\n const targetType = this.pathToType.get(toPath);\n const param = targetType ? converterSourceParam(targetType) : undefined;\n if (param) {\n await this.setParams(toPath, { [param]: fromPath });\n return;\n }\n try {\n await connectNodesViaBridge(this.ctx.client, fromPath, toPath, fromOutput, toInput);\n } catch (err) {\n this.warnings.push(`Failed to connect ${fromPath} → ${toPath}: ${friendlyTdError(err)}`);\n }\n }\n\n async setParams(path: string, parameters: Record<string, unknown>): Promise<void> {\n try {\n await this.ctx.client.updateNodeParameters(path, parameters);\n } catch (err) {\n this.warnings.push(`Failed to set parameters on ${path}: ${friendlyTdError(err)}`);\n }\n }\n\n async python(code: string): Promise<void> {\n try {\n await this.ctx.client.executePythonScript(code, false);\n } catch (err) {\n this.warnings.push(`Python step failed: ${friendlyTdError(err)}`);\n }\n }\n\n /** Arranges every created node left→right along the recorded data flow. */\n async layout(): Promise<void> {\n const positions = computeLayoutByParent(\n this.created.map((c) => c.path),\n this.edges,\n );\n if (Object.keys(positions).length === 0) return;\n try {\n await this.ctx.client.executePythonScript(layoutScript(positions), false);\n } catch (err) {\n this.warnings.push(`Auto-layout skipped: ${friendlyTdError(err)}`);\n }\n }\n}\n\n/** Creates a fresh base COMP to hold a visual system and returns a builder for it. */\nexport async function createSystemContainer(\n ctx: ToolContext,\n parentPath: string,\n name: string,\n): Promise<NetworkBuilder> {\n const container = await ctx.client.createNode({\n parent_path: parentPath,\n type: \"baseCOMP\",\n name,\n });\n // Drop the container clear of any existing siblings so repeated generations\n // stack into a column instead of overlapping at the origin. Cosmetic only —\n // a failure here must never abort the build.\n try {\n await ctx.client.executePythonScript(\n placeBelowSiblingsScript(parentPath, container.path),\n false,\n );\n } catch (err) {\n ctx.logger.debug(\"container placement skipped\", { err: String(err) });\n }\n return new NetworkBuilder(ctx, container.path);\n}\n\nexport interface RecipeBuildResult {\n builder: NetworkBuilder;\n outputPath?: string;\n /** Controls to auto-expose, with `bind_to` already resolved to real node paths. */\n controls?: ControlSpec[];\n}\n\n/** Instantiates a recipe inside a new container under `parentPath`. */\nexport async function buildFromRecipe(\n ctx: ToolContext,\n recipe: Recipe,\n parentPath: string,\n): Promise<RecipeBuildResult> {\n const builder = await createSystemContainer(ctx, parentPath, recipe.id);\n\n for (const node of recipe.nodes) {\n let parentPath: string | undefined;\n if (node.parent) {\n parentPath = builder.pathOf(node.parent);\n if (!parentPath) {\n builder.warnings.push(\n `Node \"${node.name}\" references unknown parent \"${node.parent}\" (it must appear earlier in nodes).`,\n );\n }\n }\n await builder.add(node.type, node.name, node.parameters, parentPath);\n }\n\n // Inline GLSL: place each shader in a Text DAT and point the GLSL TOP's pixeldat at it.\n if (recipe.glsl_code) {\n for (const [nodeName, code] of Object.entries(recipe.glsl_code)) {\n const target = builder.pathOf(nodeName);\n if (!target) {\n builder.warnings.push(`glsl_code references unknown node \"${nodeName}\".`);\n continue;\n }\n const fragPath = await builder.add(\"textDAT\", `${nodeName}_frag`);\n await builder.python(\n `op(${q(fragPath)}).text = ${q(code)}\\nop(${q(target)}).par.pixeldat = op(${q(fragPath)}).name`,\n );\n }\n }\n\n // GLSL TOP uniforms: these live in parameter sequences, so the block count must be\n // raised (op.seq.<seq>.numBlocks, which has no structured setter) before the\n // per-block name/value sub-parameters exist and can be set the normal way.\n for (const group of groupUniforms(recipe.glsl_uniforms)) {\n const target = builder.pathOf(group.node);\n if (!target) {\n builder.warnings.push(`glsl_uniforms references unknown node \"${group.node}\".`);\n continue;\n }\n await builder.python(\n `_seq = op(${q(target)}).seq.${group.seq}\\n_seq.numBlocks = max(_seq.numBlocks, ${group.items.length})`,\n );\n for (const [i, uniform] of group.items.entries()) {\n const { fields } = UNIFORM_KINDS[uniform.kind];\n const params: Record<string, unknown> = { [`${group.seq}${i}name`]: uniform.name };\n const values = Array.isArray(uniform.value)\n ? uniform.value\n : uniform.value === undefined\n ? []\n : [uniform.value];\n for (const [j, field] of fields.entries()) {\n const value = values[j];\n if (value !== undefined) params[`${group.seq}${i}${field}`] = value;\n }\n await builder.setParams(target, params);\n }\n }\n\n // Inline Python: set the target DAT's text.\n if (recipe.python_code) {\n for (const [nodeName, code] of Object.entries(recipe.python_code)) {\n const target = builder.pathOf(nodeName);\n if (!target) {\n builder.warnings.push(`python_code references unknown node \"${nodeName}\".`);\n continue;\n }\n await builder.python(`op(${q(target)}).text = ${q(code)}`);\n }\n }\n\n // Exposed parameters; a string value matching a node name resolves to that node's path.\n for (const param of recipe.parameters) {\n const target = builder.pathOf(param.node);\n if (!target) {\n builder.warnings.push(`Parameter \"${param.name}\" references unknown node \"${param.node}\".`);\n continue;\n }\n if (param.value === undefined) continue;\n let value = param.value;\n if (typeof value === \"string\") {\n const referenced = builder.pathOf(value);\n if (referenced) value = referenced;\n }\n await builder.setParams(target, { [param.param]: value });\n }\n\n for (const connection of recipe.connections) {\n const from = builder.pathOf(connection.from);\n const to = builder.pathOf(connection.to);\n if (!from || !to) {\n builder.warnings.push(\n `Connection ${connection.from} → ${connection.to} references an unknown node.`,\n );\n continue;\n }\n await builder.connect(from, to, connection.from_output, connection.to_input);\n }\n\n // Nested render geometry: make each flagged SOP the one its parent COMP renders,\n // clearing its siblings (including the COMP's default torus).\n for (const node of recipe.nodes) {\n if (!node.render) continue;\n const target = builder.pathOf(node.name);\n if (!target) continue;\n await builder.python(\n `_n = op(${q(target)})\\n_p = _n.parent()\\nfor _c in _p.children:\\n _c.render = False\\n _c.display = False\\n_n.render = True\\n_n.display = True`,\n );\n }\n\n const outNode =\n recipe.nodes.find((n) => /^out/i.test(n.name)) ?? recipe.nodes[recipe.nodes.length - 1];\n const outputPath = outNode ? builder.pathOf(outNode.name) : undefined;\n\n // Resolve each control's bind targets from recipe node *names* to the real created\n // paths, so the panel can bind them. An unresolved name is left as-is (it surfaces as\n // a warning when the panel runs).\n const controls: ControlSpec[] = recipe.controls.map((control) => ({\n ...control,\n bind_to: control.bind_to?.map((target) => {\n const dot = target.lastIndexOf(\".\");\n if (dot <= 0) return target;\n const path = builder.pathOf(target.slice(0, dot));\n return path ? `${path}.${target.slice(dot + 1)}` : target;\n }),\n }));\n\n return { builder, outputPath, controls };\n}\n\nexport interface FinalizeOptions {\n summary: string;\n builder: NetworkBuilder;\n outputPath?: string;\n recipeId?: string;\n capturePreviewImage?: boolean;\n /**\n * Controls to expose on the system container so the generated network is immediately\n * playable (knobs/sliders bound to its key parameters). Failures are folded into the\n * response warnings — they never abort the build.\n */\n controls?: ControlSpec[];\n extra?: Record<string, unknown>;\n}\n\ninterface ExposeControlsResult {\n created: Array<{ name: string }>;\n bound: Array<{ control: string; target: string }>;\n warnings: string[];\n fatal?: string;\n}\n\n/**\n * Appends a control panel (custom parameters bound to node parameters) to the system\n * container, reusing the same Python pass as the create_control_panel tool. Fail-forward:\n * any error is returned as a warning rather than thrown.\n */\nasync function exposeControls(\n ctx: ToolContext,\n compPath: string,\n controls: ControlSpec[],\n): Promise<ExposeControlsResult> {\n try {\n const script = buildPanelScript({ comp: compPath, page: \"Controls\", controls });\n const exec = await ctx.client.executePythonScript(script, true);\n return parsePythonReport<ExposeControlsResult>(exec.stdout);\n } catch (err) {\n return { created: [], bound: [], warnings: [`Control panel skipped: ${friendlyTdError(err)}`] };\n }\n}\n\n/**\n * Shared \"verify → preview → respond\" step for Layer 1 tools: runs an error check,\n * captures a preview of the output TOP, and returns a structured result with an\n * inline preview image when available.\n */\nexport async function finalize(\n ctx: ToolContext,\n options: FinalizeOptions,\n): Promise<CallToolResult> {\n const { builder } = options;\n await builder.layout();\n const warnings = [...builder.warnings];\n\n // Expose live controls on the container so the generated system is playable on arrival.\n let controlsSummary: { added: string[]; bound: number } | undefined;\n if (options.controls?.length) {\n const result = await exposeControls(ctx, builder.containerPath, options.controls);\n warnings.push(...result.warnings);\n if (result.fatal) warnings.push(`Control panel skipped: ${result.fatal}`);\n else controlsSummary = { added: result.created.map((c) => c.name), bound: result.bound.length };\n }\n\n let errors: Array<{ path: string; message: string }> = [];\n try {\n const report = await checkErrors(ctx.client, builder.containerPath);\n errors = report.errors;\n if (report.hasErrors)\n warnings.push(`${report.errors.length} node error(s) detected after build.`);\n } catch (err) {\n warnings.push(`Error check unavailable: ${friendlyTdError(err)}`);\n }\n\n let previewBase64: string | undefined;\n let previewMime: string | undefined;\n if (options.capturePreviewImage !== false && options.outputPath) {\n try {\n const preview = await capturePreview(ctx.client, options.outputPath);\n previewBase64 = preview.base64;\n previewMime = preview.mimeType;\n } catch (err) {\n warnings.push(`Preview unavailable: ${friendlyTdError(err)}`);\n }\n }\n\n const data = {\n container: builder.containerPath,\n created: builder.created.map((c) => c.path),\n output: options.outputPath,\n recipe: options.recipeId,\n controls: controlsSummary,\n errors,\n warnings,\n ...options.extra,\n };\n\n const content: CallToolResult[\"content\"] = [\n {\n type: \"text\",\n text: `${options.summary}\\n\\n\\`\\`\\`json\\n${JSON.stringify(data, null, 2)}\\n\\`\\`\\``,\n },\n ];\n if (previewBase64) {\n content.push({ type: \"image\", data: previewBase64, mimeType: previewMime ?? \"image/png\" });\n }\n return { content };\n}\n","import { z } from \"zod\";\nimport type { ControlSpec } from \"../layer2/createControlPanel.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, type NetworkBuilder, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst AUDIO_SPECTRUM_SHADER = `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n // Audio Spectrum CHOP magnitudes are tiny (~0.01–0.1); scale into the [0,1] bar\n // range so realistic input renders visible bars instead of a near-black frame.\n float amp = texture(sTD2DInputs[0], vec2(uv.x, 0.5)).r * 20.0;\n float bar = step(uv.y, clamp(amp, 0.0, 1.0));\n vec3 col = mix(vec3(0.02, 0.0, 0.08), vec3(0.1, 0.8, 1.0), uv.x) * bar;\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\n// Each non-\"glsl\" style gets its own spectrum visual (so they are not all the same shape).\n// All sample the spectrum texture (sTD2DInputs[0]); the *20 lifts the tiny magnitudes into a\n// visible range. Validated live in TD (all compile and render distinct content).\nconst STYLE_SHADERS: Record<string, string> = {\n // Radial spectrum bars emanating from the centre by angle.\n geometric: `out vec4 fragColor;\nvoid main(){\n vec2 pos = vUV.st - 0.5;\n float ang = atan(pos.y, pos.x) * 0.159155 + 0.5;\n float rad = length(pos) * 2.0;\n float amp = texture(sTD2DInputs[0], vec2(ang, 0.5)).r * 20.0;\n float bar = step(rad, clamp(amp, 0.0, 1.0));\n vec3 col = mix(vec3(0.05, 0.0, 0.15), vec3(0.2, 0.9, 1.0), ang) * bar;\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`,\n // A grid of dots whose size tracks each column's spectrum bin.\n particle: `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n vec2 cell = fract(uv * 16.0) - 0.5;\n float colx = floor(uv.x * 16.0) / 16.0;\n float amp = texture(sTD2DInputs[0], vec2(colx, 0.5)).r * 20.0;\n float dot = smoothstep(0.45 * clamp(amp, 0.05, 1.0), 0.0, length(cell));\n vec3 col = dot * mix(vec3(0.1, 0.4, 1.0), vec3(1.0, 0.3, 0.6), uv.y);\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`,\n // Concentric rings warped by the spectrum — a tunnel/echo look.\n feedback: `out vec4 fragColor;\nvoid main(){\n vec2 pos = vUV.st - 0.5;\n float rad = length(pos);\n float ang = atan(pos.y, pos.x);\n float amp = texture(sTD2DInputs[0], vec2(rad, 0.5)).r * 20.0;\n float rings = 0.5 + 0.5 * sin(rad * 40.0 - amp * 12.0 + ang * 3.0);\n vec3 col = rings * mix(vec3(0.6, 0.1, 0.8), vec3(0.1, 0.8, 0.9), rad * 2.0);\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`,\n // An LED matrix: columns light up to a height set by their spectrum bin.\n instancing: `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n vec2 cell = floor(uv * vec2(16.0, 8.0));\n vec2 fr = fract(uv * vec2(16.0, 8.0));\n float amp = texture(sTD2DInputs[0], vec2(cell.x / 16.0, 0.5)).r * 20.0;\n float lit = step((cell.y + 0.5) / 8.0, clamp(amp, 0.0, 1.0));\n float pad = step(0.1, fr.x) * step(fr.x, 0.9) * step(0.1, fr.y) * step(fr.y, 0.9);\n vec3 col = lit * pad * mix(vec3(0.0, 1.0, 0.4), vec3(1.0, 0.8, 0.0), cell.y / 8.0);\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`,\n};\n\nexport const createAudioReactiveSchema = z.object({\n audio_source: z.enum([\"microphone\", \"file\", \"device_in\", \"existing_chop\"]).default(\"microphone\"),\n audio_file_path: z.string().optional().describe(\"Audio file path (audio_source='file').\"),\n existing_chop_path: z\n .string()\n .optional()\n .describe(\"Existing CHOP path (audio_source='existing_chop').\"),\n visual_style: z.enum([\"geometric\", \"particle\", \"feedback\", \"glsl\", \"instancing\"]),\n frequency_bands: z.coerce\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\n \"Spectrum resolution: sets the Audio Spectrum CHOP output length (TouchDesigner clamps it to 128–4096 bins). Higher = finer spectrum.\",\n ),\n beat_detection: z.boolean().default(true),\n expose_controls: z\n .boolean()\n .default(true)\n .describe(\"Expose a live 'Sensitivity' knob (how strongly the audio drives the visual).\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateAudioReactiveArgs = z.infer<typeof createAudioReactiveSchema>;\n\nasync function buildAudioSource(\n builder: NetworkBuilder,\n args: CreateAudioReactiveArgs,\n): Promise<string> {\n if (args.audio_source === \"existing_chop\" && args.existing_chop_path) {\n return args.existing_chop_path;\n }\n if (args.audio_source === \"file\") {\n return builder.add(\"audiofileinCHOP\", \"audioin\", {\n ...(args.audio_file_path ? { file: args.audio_file_path } : {}),\n play: 1,\n });\n }\n return builder.add(\"audiodeviceinCHOP\", \"audioin\");\n}\n\nexport async function createAudioReactiveImpl(ctx: ToolContext, args: CreateAudioReactiveArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"audio_reactive\");\n\n const audioSource = await buildAudioSource(builder, args);\n // Cap the spectrum output length so the downstream CHOP-to-TOP texture stays within\n // GPU limits. Left on \"Match Length To Frequency\", the spectrum emits ~22050 samples,\n // which overflows the 16384 max texture width and triggers a clamp warning. TouchDesigner\n // clamps outlength to 128–4096, so frequency_bands maps into that range.\n const outLength = Math.min(Math.max(args.frequency_bands, 128), 4096);\n const spectrum = await builder.add(\"audiospectrumCHOP\", \"spectrum\", {\n outputmenu: \"setmanually\",\n outlength: outLength,\n });\n await builder.connect(audioSource, spectrum);\n\n const analyze = await builder.add(\"analyzeCHOP\", \"level\", { function: 6 });\n await builder.connect(audioSource, analyze);\n\n if (args.beat_detection) {\n const beat = await builder.add(\"beatCHOP\", \"beat\");\n await builder.connect(audioSource, beat);\n }\n\n const audioTex = await builder.add(\"choptoTOP\", \"audio_tex\");\n await builder.connect(spectrum, audioTex);\n // A Sensitivity gain on the spectrum texture lets one knob scale how strongly the audio\n // drives every visual style — it multiplies the bins before the shaders' fixed *20 lift.\n // brightness1 = 1 is a passthrough, so the default leaves the look unchanged.\n const sensitivity = await builder.add(\"levelTOP\", \"sensitivity\", { brightness1: 1 });\n await builder.connect(audioTex, sensitivity);\n\n // Every style renders a GLSL spectrum visual: \"glsl\" is the classic horizontal bars;\n // geometric/particle/feedback/instancing each get their own shader (radial bars / dot\n // field / ring tunnel / LED grid). A fixed RGBA canvas avoids inheriting the audio\n // texture's Nx1 mono resolution, which would collapse the output to a 1px gray strip.\n const shader =\n args.visual_style === \"glsl\"\n ? AUDIO_SPECTRUM_SHADER\n : (STYLE_SHADERS[args.visual_style] ?? AUDIO_SPECTRUM_SHADER);\n const visual = await builder.add(\"glslTOP\", \"visual\", {\n outputresolution: \"custom\",\n resolutionw: 1280,\n resolutionh: 720,\n format: \"rgba8fixed\",\n });\n const frag = await builder.add(\"textDAT\", \"visual_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(shader)}\\nop(${q(visual)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(sensitivity, visual);\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(visual, out);\n\n const controls: ControlSpec[] = args.expose_controls\n ? [\n {\n name: \"Sensitivity\",\n type: \"float\",\n min: 0,\n max: 4,\n default: 1,\n bind_to: [`${sensitivity}.brightness1`],\n },\n ]\n : [];\n\n return finalize(ctx, {\n summary: `Created an audio-reactive system (source: ${args.audio_source}, style: ${args.visual_style}, ${args.frequency_bands} bands).`,\n builder,\n outputPath: out,\n controls,\n extra: {\n audio_source: args.audio_source,\n visual_style: args.visual_style,\n beat_detection: args.beat_detection,\n },\n });\n });\n}\n\nexport const registerCreateAudioReactive: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_audio_reactive\",\n {\n title: \"Create audio-reactive visual\",\n description:\n \"Build an audio analysis chain (spectrum + level + optional beat) and a spectrum visual driven by it. Each visual_style renders the spectrum its own way: glsl=horizontal bars, geometric=radial bars, particle=dot field, feedback=ring tunnel, instancing=LED grid.\",\n inputSchema: createAudioReactiveSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createAudioReactiveImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ControlSpec } from \"../layer2/createControlPanel.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst BARS_SHADER = `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n float v = texture(sTD2DInputs[0], vec2(uv.x, 0.5)).r;\n float bar = step(uv.y, clamp(v, 0.0, 1.0));\n vec3 col = mix(vec3(0.03, 0.05, 0.1), vec3(0.2, 0.9, 0.6), uv.x) * bar;\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nconst SOURCE_TYPE = {\n table: \"tableDAT\",\n file: \"fileinDAT\",\n chop: \"constantCHOP\",\n} as const;\n\nexport const createDataVisualizationSchema = z.object({\n data_source: z.enum([\"table\", \"file\", \"chop\"]).default(\"table\"),\n chart_style: z.enum([\"bars\", \"graph\", \"points\"]).default(\"bars\"),\n expose_controls: z\n .boolean()\n .default(true)\n .describe(\"Expose a live 'Scale' knob that amplifies the data values feeding the chart.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateDataVisualizationArgs = z.infer<typeof createDataVisualizationSchema>;\n\nexport async function createDataVisualizationImpl(\n ctx: ToolContext,\n args: CreateDataVisualizationArgs,\n) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"data_viz\");\n const source = await builder.add(SOURCE_TYPE[args.data_source], \"data\");\n\n // Seed the placeholder table so the chart shows sample bars immediately instead of a\n // blank 1x1 output; an empty table yields a single zero-valued sample.\n if (args.data_source === \"table\") {\n const rows = Array.from({ length: 16 }, (_, i) =>\n (0.5 + 0.45 * Math.sin(i * 0.6)).toFixed(3),\n );\n await builder.python(\n `d = op(${q(source)})\\nd.clear()\\nfor v in ${JSON.stringify(rows)}:\\n d.appendRow([v])`,\n );\n }\n\n let chop = source;\n if (args.data_source !== \"chop\") {\n // dattoCHOP defaults firstcolumn to \"names\", which turns a single numeric column into\n // channel *names* with value 0; read the column as values (one channel, N samples).\n chop = await builder.add(\"dattoCHOP\", \"datto\", {\n firstrow: \"values\",\n firstcolumn: \"values\",\n output: \"chanpercol\",\n });\n await builder.connect(source, chop);\n }\n\n const tex = await builder.add(\"choptoTOP\", \"data_tex\");\n await builder.connect(chop, tex);\n // A Scale gain on the data texture lets one knob amplify the values feeding the chart;\n // brightness1 = 1 is a passthrough, so the default leaves the chart unchanged.\n const scale = await builder.add(\"levelTOP\", \"scale\", { brightness1: 1 });\n await builder.connect(tex, scale);\n\n let visual = scale;\n if (args.chart_style === \"bars\") {\n // Fixed canvas + RGBA. Left on \"use input\", the chart inherits the data texture's\n // tiny Nx1 mono resolution, collapsing the output to a grayscale speck.\n const glsl = await builder.add(\"glslTOP\", \"chart\", {\n outputresolution: \"custom\",\n resolutionw: 1280,\n resolutionh: 720,\n format: \"rgba8fixed\",\n });\n const frag = await builder.add(\"textDAT\", \"chart_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(BARS_SHADER)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(scale, glsl);\n visual = glsl;\n } else {\n builder.warnings.push(\n `Chart style \"${args.chart_style}\" renders the data as a texture strip; richer plotting needs customization.`,\n );\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(visual, out);\n builder.warnings.push(\n \"Wire your real data into the 'data' node — a placeholder source was created.\",\n );\n\n const controls: ControlSpec[] = args.expose_controls\n ? [\n {\n name: \"Scale\",\n type: \"float\",\n min: 0,\n max: 4,\n default: 1,\n bind_to: [`${scale}.brightness1`],\n },\n ]\n : [];\n\n return finalize(ctx, {\n summary: `Created a data visualization (source: ${args.data_source}, style: ${args.chart_style}).`,\n builder,\n outputPath: out,\n controls,\n extra: { data_source: args.data_source, chart_style: args.chart_style },\n });\n });\n}\n\nexport const registerCreateDataVisualization: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_data_visualization\",\n {\n title: \"Create data visualization\",\n description:\n \"Build a data-driven visualization: a data source feeds a CHOP that drives a chart TOP. Wire your real data into the created 'data' node.\",\n inputSchema: createDataVisualizationSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createDataVisualizationImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ControlSpec } from \"../layer2/createControlPanel.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\n// Builds a GLSL fragment that maps the grayscale luminance through a 1- or 2-color\n// gradient, so a described palette (\"blues and magentas\") survives to the output.\nfunction colorizeShader(colors: string[]): string {\n const toVec3 = (hex: string | undefined): string => {\n const m = hex ? /^#?([0-9a-fA-F]{6})$/.exec(hex.trim()) : null;\n if (!m?.[1]) return \"vec3(1.0)\";\n const n = Number.parseInt(m[1], 16);\n const r = ((n >> 16) & 255) / 255;\n const g = ((n >> 8) & 255) / 255;\n const b = (n & 255) / 255;\n return `vec3(${r.toFixed(4)}, ${g.toFixed(4)}, ${b.toFixed(4)})`;\n };\n const lo = colors.length >= 2 ? toVec3(colors[0]) : \"vec3(0.0)\";\n const hi = toVec3(colors[colors.length - 1]);\n return `out vec4 fragColor;\nvoid main(){\n float l = texture(sTD2DInputs[0], vUV.st).r;\n fragColor = TDOutputSwizzle(vec4(mix(${lo}, ${hi}, l), 1.0));\n}\n`;\n}\n\n// A self-contained generative pattern for the \"glsl\" seed type. A bare glslTOP ships TD's\n// boilerplate shader (solid white `vec4(1.0)`), which would feed the loop pure white; this\n// gives it a varied colour field to evolve instead.\nconst SEED_GLSL = `out vec4 fragColor;\nvoid main(){\n vec2 uv = vUV.st;\n float v = sin(uv.x * 12.0) + sin(uv.y * 12.0) + sin((uv.x + uv.y) * 8.0);\n vec3 col = 0.5 + 0.5 * cos(vec3(0.0, 2.0, 4.0) + v);\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\nconst SEED_TYPES = {\n noise: \"noiseTOP\",\n shape: \"circleTOP\",\n image: \"moviefileinTOP\",\n video: \"moviefileinTOP\",\n webcam: \"videodeviceinTOP\",\n glsl: \"glslTOP\",\n} as const;\n\nconst TRANSFORM_TYPES = {\n blur: \"blurTOP\",\n displace: \"displaceTOP\",\n edge: \"edgeTOP\",\n level: \"levelTOP\",\n hsv_adjust: \"hsvadjustTOP\",\n transform: \"transformTOP\",\n mirror: \"mirrorTOP\",\n tile: \"tileTOP\",\n luma_blur: \"lumablurTOP\",\n} as const;\n\nexport const createFeedbackNetworkSchema = z.object({\n seed_type: z.enum([\"noise\", \"shape\", \"image\", \"video\", \"webcam\", \"glsl\"]).default(\"noise\"),\n transformations: z\n .array(\n z.enum([\n \"blur\",\n \"displace\",\n \"edge\",\n \"level\",\n \"hsv_adjust\",\n \"transform\",\n \"mirror\",\n \"tile\",\n \"luma_blur\",\n ]),\n )\n .default([\"blur\", \"displace\", \"level\"]),\n feedback_gain: z.coerce.number().min(0).max(1).default(0.95),\n colors: z\n .array(z.string())\n .max(2)\n .optional()\n .describe(\"Up to two hex colors to colorize the otherwise-grayscale output.\"),\n expose_controls: z\n .boolean()\n .default(true)\n .describe(\"Expose a live 'Feedback' knob on the system container, bound to the loop's decay.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateFeedbackNetworkArgs = z.infer<typeof createFeedbackNetworkSchema>;\n\nexport async function createFeedbackNetworkImpl(ctx: ToolContext, args: CreateFeedbackNetworkArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"feedback_system\");\n\n const seed = await builder.add(SEED_TYPES[args.seed_type], \"seed\", {\n ...(args.seed_type === \"noise\" ? { monochrome: 1, period: 4 } : {}),\n });\n if (args.seed_type === \"glsl\") {\n // Replace the glslTOP's default white boilerplate with a real generative pattern.\n const seedFrag = await builder.add(\"textDAT\", \"seed_frag\");\n await builder.python(\n `op(${q(seedFrag)}).text = ${q(SEED_GLSL)}\\nop(${q(seed)}).par.pixeldat = op(${q(seedFrag)}).name`,\n );\n }\n const feedback = await builder.add(\"feedbackTOP\", \"feedback1\");\n const comp = await builder.add(\"compositeTOP\", \"comp1\");\n // The TD default operand (multiply) collapses the loop to black; an additive\n // operand injects the seed each frame, and \"maximum\" stays bounded under feedback gain.\n await builder.setParams(comp, { operand: \"maximum\" });\n await builder.connect(seed, comp, 0, 0);\n await builder.connect(feedback, comp, 0, 1);\n // feedbackTOP needs an input for its first frame; seed it before the loop closes.\n await builder.connect(seed, feedback);\n\n let last = comp;\n for (const transformation of args.transformations) {\n const node = await builder.add(TRANSFORM_TYPES[transformation], transformation);\n await builder.connect(last, node);\n // displaceTOP and lumablurTOP need a second input (the displacement / luma map).\n if (transformation === \"displace\" || transformation === \"luma_blur\") {\n await builder.connect(seed, node, 0, 1);\n }\n last = node;\n }\n\n const gain = await builder.add(\"levelTOP\", \"gain\");\n // A levelTOP has no \"gain\" parameter (setting it is a silent no-op), so the loop never\n // decayed and the \"maximum\" composite saturated to solid white. \"brightness1\" multiplies\n // RGB, so set it to feedback_gain to actually fade the fed-back frame each cycle.\n await builder.setParams(gain, { brightness1: args.feedback_gain });\n await builder.connect(last, gain);\n\n // Colorize only the final output; the loop keeps sampling the grayscale gain node\n // so the feedback stays clean.\n let output = gain;\n if (args.colors && args.colors.length > 0) {\n const colorize = await builder.add(\"glslTOP\", \"colorize\");\n const frag = await builder.add(\"textDAT\", \"colorize_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(colorizeShader(args.colors))}\\nop(${q(colorize)}).par.pixeldat = op(${q(frag)}).name`,\n );\n await builder.connect(gain, colorize);\n output = colorize;\n }\n\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(output, out);\n\n // Close the loop: feedbackTOP samples the gain node's output.\n await builder.python(`op(${q(feedback)}).par.top = op(${q(gain)}).name`);\n\n // The decay multiplier (gain.brightness1) is the one knob a feedback system lives by.\n const controls: ControlSpec[] = args.expose_controls\n ? [\n {\n name: \"Feedback\",\n type: \"float\",\n min: 0,\n max: 1,\n default: args.feedback_gain,\n bind_to: [`${gain}.brightness1`],\n },\n ]\n : [];\n\n return finalize(ctx, {\n summary: `Created a feedback network (seed: ${args.seed_type}, gain: ${args.feedback_gain}, ${args.transformations.length} transform(s)).`,\n builder,\n outputPath: out,\n controls,\n extra: { seed_type: args.seed_type, transformations: args.transformations },\n });\n });\n}\n\nexport const registerCreateFeedbackNetwork: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_feedback_network\",\n {\n title: \"Create feedback network\",\n description:\n \"Build a feedback-based visual system: a seed feeds a loop that is transformed (blur/displace/etc.) and fed back each frame. Great for evolving, hypnotic visuals.\",\n inputSchema: createFeedbackNetworkSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createFeedbackNetworkImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ControlSpec } from \"../layer2/createControlPanel.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport {\n buildFromRecipe,\n createSystemContainer,\n finalize,\n type NetworkBuilder,\n runBuild,\n} from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst DEFAULT_PLASMA = `out vec4 fragColor;\nuniform float uTime;\nvoid main(){\n vec2 uv = vUV.st;\n float v = sin(uv.x * 10.0 + uTime) + sin(uv.y * 10.0 + uTime * 0.7);\n v += sin((uv.x + uv.y) * 8.0 + uTime * 1.3);\n vec3 col = 0.5 + 0.5 * cos(vec3(0.0, 2.0, 4.0) + v);\n fragColor = TDOutputSwizzle(vec4(col, 1.0));\n}\n`;\n\n// Self-contained, TouchDesigner-ready generative shaders, keyed by technique. They each\n// declare their own `out vec4 fragColor` and read a `uTime` uniform (bound to absTime by\n// buildGlslGenerative). Variable names avoid single letters / F1-style names that collide\n// with macros in TD's auto-prepended GLSL preamble. These replace the knowledge-base GLSL\n// snippets, which are documentation fragments (no output declaration, unbound uniforms) and\n// are not directly compilable.\nconst VORONOI_SHADER = `out vec4 fragColor;\nuniform float uTime;\nvec2 hash2(vec2 p){ return fract(sin(vec2(dot(p,vec2(127.1,311.7)),dot(p,vec2(269.5,183.3))))*43758.5453); }\nvec2 cellNoise(vec2 p){\n vec2 ip=floor(p); vec2 fp=fract(p);\n float d1=8.0; float d2=8.0;\n for(int yy=-1; yy<=1; yy++){\n for(int xx=-1; xx<=1; xx++){\n vec2 nb=vec2(float(xx),float(yy));\n vec2 pt=hash2(ip+nb);\n pt=0.5+0.5*sin(uTime*0.5+6.2831*pt);\n vec2 diff=nb+pt-fp; float dd=length(diff);\n if(dd<d1){ d2=d1; d1=dd; } else if(dd<d2){ d2=dd; }\n }\n }\n return vec2(d1,d2);\n}\nvoid main(){\n vec2 uv=vUV.st*8.0;\n vec2 fc=cellNoise(uv);\n float edge=smoothstep(0.0,0.08,fc.y-fc.x);\n float cell=fc.x;\n vec3 col=mix(vec3(0.02),vec3(0.5+0.5*cell,0.7,0.9),edge);\n fragColor=TDOutputSwizzle(vec4(col,1.0));\n}\n`;\n\nconst FBM_SHADER = `out vec4 fragColor;\nuniform float uTime;\nfloat hashF(vec2 p){ return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453); }\nfloat vnoise(vec2 p){\n vec2 ip=floor(p); vec2 fp=fract(p);\n vec2 uu=fp*fp*(3.0-2.0*fp);\n float na=hashF(ip+vec2(0.0,0.0));\n float nb=hashF(ip+vec2(1.0,0.0));\n float nc=hashF(ip+vec2(0.0,1.0));\n float nd=hashF(ip+vec2(1.0,1.0));\n return mix(mix(na,nb,uu.x),mix(nc,nd,uu.x),uu.y);\n}\nfloat fbm(vec2 p){\n float acc=0.0; float amp=0.5;\n for(int oc=0; oc<6; oc++){ acc+=amp*vnoise(p); p*=2.0; amp*=0.5; }\n return acc;\n}\nvoid main(){\n vec2 uv=vUV.st*3.0;\n float val=fbm(uv+vec2(uTime*0.1, uTime*0.05));\n vec3 col=mix(vec3(0.02,0.05,0.15), vec3(0.95,0.6,0.25), val);\n fragColor=TDOutputSwizzle(vec4(col,1.0));\n}\n`;\n\n// Techniques that map to a faithful inline shader. The rest fall back to animated noise.\nconst TECHNIQUE_SHADERS: Record<string, string> = {\n voronoi: VORONOI_SHADER,\n fractal: FBM_SHADER,\n};\n\nconst RECIPE_FOR = new Map<string, string>([\n [\"reaction_diffusion\", \"reaction_diffusion\"],\n [\"noise_landscape\", \"noise_landscape\"],\n]);\n\nexport const createGenerativeArtSchema = z.object({\n technique: z.enum([\n \"noise_landscape\",\n \"reaction_diffusion\",\n \"strange_attractor\",\n \"l_system\",\n \"cellular_automata\",\n \"flow_field\",\n \"voronoi\",\n \"fractal\",\n \"custom_glsl\",\n ]),\n color_palette: z.string().optional().describe(\"Free-text palette hint (best-effort).\"),\n evolution_speed: z.coerce.number().positive().default(1.0),\n custom_glsl_code: z\n .string()\n .optional()\n .describe(\"Fragment shader (only for technique 'custom_glsl').\"),\n expose_controls: z\n .boolean()\n .default(true)\n .describe(\"Expose a live 'Speed' knob (evolution speed) on the system container.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateGenerativeArtArgs = z.infer<typeof createGenerativeArtSchema>;\n\nasync function buildGlslGenerative(\n ctx: ToolContext,\n parentPath: string,\n name: string,\n fragment: string,\n speed = 1.0,\n): Promise<{ builder: NetworkBuilder; outputPath: string }> {\n const builder = await createSystemContainer(ctx, parentPath, name);\n const glsl = await builder.add(\"glslTOP\", \"glsl1\");\n const frag = await builder.add(\"textDAT\", \"glsl1_frag\");\n await builder.python(\n `op(${q(frag)}).text = ${q(fragment)}\\nop(${q(glsl)}).par.pixeldat = op(${q(frag)}).name`,\n );\n // Bind a `uTime` uniform to absTime so time-driven shaders animate. The uniform lives in\n // the GLSL TOP's \"Vectors\" sequence, whose block count has no structured setter; raise it\n // via numBlocks, then set the block name and an expression on its first component.\n // uTime advances with absTime; a defensive `Speed` lookup lets an auto-exposed control\n // (parent().par.Speed) drive evolution speed live, and falls back to the build-time constant\n // when no control is present — so the expression never errors.\n await builder.python(\n `_g = op(${q(glsl)})\\n_g.seq.vec.numBlocks = max(_g.seq.vec.numBlocks, 1)\\n_g.par.vec0name = 'uTime'\\n_g.par.vec0valuex.expr = ${q(`absTime.seconds * (parent().par.Speed.eval() if hasattr(parent().par, 'Speed') else ${speed})`)}`,\n );\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(glsl, out);\n return { builder, outputPath: out };\n}\n\nexport async function createGenerativeArtImpl(ctx: ToolContext, args: CreateGenerativeArtArgs) {\n return runBuild(async () => {\n // A single \"Speed\" knob drives evolution speed (the time-driving expressions reference it).\n // Recipe-built techniques don't use that expression, so they don't get the control.\n const speedControls: ControlSpec[] = args.expose_controls\n ? [{ name: \"Speed\", type: \"float\", min: 0, max: 4, default: args.evolution_speed }]\n : [];\n const recipeId = RECIPE_FOR.get(args.technique);\n if (recipeId) {\n const recipe = ctx.recipes.get(recipeId);\n if (recipe) {\n const { builder, outputPath, controls } = await buildFromRecipe(\n ctx,\n recipe,\n args.parent_path,\n );\n return finalize(ctx, {\n summary: `Created \"${recipe.name}\" generative system.`,\n builder,\n outputPath,\n recipeId,\n controls,\n extra: { technique: args.technique, color_palette: args.color_palette },\n });\n }\n }\n\n if (args.technique === \"custom_glsl\") {\n const fragment = args.custom_glsl_code ?? DEFAULT_PLASMA;\n const { builder, outputPath } = await buildGlslGenerative(\n ctx,\n args.parent_path,\n \"generative_custom_glsl\",\n fragment,\n args.evolution_speed,\n );\n if (!args.custom_glsl_code) {\n builder.warnings.push(\"No custom_glsl_code provided; used a default plasma shader.\");\n }\n return finalize(ctx, {\n summary: \"Created a custom GLSL generative system.\",\n builder,\n outputPath,\n controls: speedControls,\n extra: { technique: args.technique },\n });\n }\n\n // Techniques with a faithful inline shader render the real thing (animated via uTime);\n // the rest fall back to animated noise below.\n const inlineShader = TECHNIQUE_SHADERS[args.technique];\n if (inlineShader) {\n const { builder, outputPath } = await buildGlslGenerative(\n ctx,\n args.parent_path,\n `generative_${args.technique}`,\n inlineShader,\n args.evolution_speed,\n );\n return finalize(ctx, {\n summary: `Created a \"${args.technique}\" generative system (GLSL).`,\n builder,\n outputPath,\n controls: speedControls,\n extra: { technique: args.technique, color_palette: args.color_palette },\n });\n }\n\n const builder = await createSystemContainer(\n ctx,\n args.parent_path,\n `generative_${args.technique}`,\n );\n const noise = await builder.add(\"noiseTOP\", \"noise1\", { monochrome: 0, period: 6 });\n const level = await builder.add(\"levelTOP\", \"level1\");\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(noise, level);\n await builder.connect(level, out);\n await builder.python(\n `p = op(${q(noise)}).par.tz\\np.expr = ${q(`absTime.seconds * (parent().par.Speed.eval() if hasattr(parent().par, 'Speed') else ${args.evolution_speed})`)}`,\n );\n builder.warnings.push(\n `Technique \"${args.technique}\" is approximated with an animated-noise generator in this version.`,\n );\n return finalize(ctx, {\n summary: `Created an approximate \"${args.technique}\" generative system.`,\n builder,\n outputPath: out,\n controls: speedControls,\n extra: { technique: args.technique, evolution_speed: args.evolution_speed },\n });\n });\n}\n\nexport const registerCreateGenerativeArt: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_generative_art\",\n {\n title: \"Create generative art\",\n description:\n \"Create an evolving generative visual. Known techniques (reaction_diffusion, noise_landscape) use validated recipes; custom_glsl uses your shader; others fall back to a knowledge GLSL pattern or animated noise.\",\n inputSchema: createGenerativeArtSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createGenerativeArtImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport type { ControlSpec } from \"../layer2/createControlPanel.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createSystemContainer, finalize, runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst EMITTER_SOP = {\n point: \"addSOP\",\n line: \"lineSOP\",\n circle: \"circleSOP\",\n sphere: \"sphereSOP\",\n mesh: \"boxSOP\",\n image: \"gridSOP\",\n} as const;\n\nconst q2 = (n: number): string => (Number.isFinite(n) ? n.toString() : \"0\");\n\n/**\n * Builds the Python that turns a bare Particle SOP into a real, immediately-visible system:\n * - `normals = True` makes each particle inherit its source point's normal as initial\n * velocity, so a sphere/circle/box emitter actually sprays into a cloud (a single-point\n * emitter has no normal, so it stays a turbulence-driven stream — that's expected).\n * - `timepreroll = lifetime` pre-simulates the sim so frame 1 is already fully populated\n * instead of slowly filling in over the first few seconds.\n * - A baseline drag keeps the cloud contained within the camera frame.\n * - `birth` is derived from particle_count so the requested count is honored at steady state.\n * Forces map to native params where the legacy Particle SOP supports them (gravity → external,\n * noise/turbulence → turbulence, drag → drag); attract/repel/vortex have no native equivalent\n * and are approximated with turbulence (+ a little wind for vortex).\n */\ninterface ParticleDynamics {\n birth: number;\n drag: number;\n turb: number;\n gravity: number;\n wind: number;\n lifevar: number;\n}\n\n/** Single source of truth for the Particle SOP dynamics derived from the requested forces. */\nfunction computeParticleDynamics(args: CreateParticleSystemArgs): ParticleDynamics {\n const f = new Set(args.forces);\n const birth = Math.max(1, Math.round(args.particle_count / args.lifetime));\n let drag = 2.0;\n if (f.has(\"drag\")) drag = 3.5;\n if (f.has(\"repel\")) drag = 1.0;\n let turb = 0;\n if (f.has(\"noise\")) turb = 1.0;\n if (f.has(\"turbulence\")) turb = 1.8;\n if (f.has(\"attract\") || f.has(\"repel\") || f.has(\"vortex\")) turb = Math.max(turb, 1.2);\n const gravity = f.has(\"gravity\") ? -0.6 : 0;\n const wind = f.has(\"vortex\") ? 0.5 : 0;\n const lifevar = Number((args.lifetime * 0.25).toFixed(3));\n return { birth, drag, turb, gravity, wind, lifevar };\n}\n\nfunction particleDynamicsPython(\n particlePath: string,\n args: CreateParticleSystemArgs,\n dyn: ParticleDynamics,\n): string {\n return [\n `_p = op(${q(particlePath)})`,\n `_p.par.birth = ${dyn.birth}`,\n `_p.par.lifevar = ${q2(dyn.lifevar)}`,\n \"_p.par.normals = True\",\n \"_p.par.jitter = True\",\n `_p.par.timepreroll = ${q2(args.lifetime)}`,\n \"_p.par.dodrag = True\",\n `_p.par.drag = ${q2(dyn.drag)}`,\n `_p.par.turbx = ${q2(dyn.turb)}`,\n `_p.par.turby = ${q2(dyn.turb)}`,\n `_p.par.turbz = ${q2(dyn.turb)}`,\n \"_p.par.period = 3.0\",\n `_p.par.externaly = ${q2(dyn.gravity)}`,\n `_p.par.windx = ${q2(dyn.wind)}`,\n \"_p.par.reset.pulse()\",\n ].join(\"\\n\");\n}\n\nexport const createParticleSystemSchema = z.object({\n // Default to \"sphere\": its varied normals give particles a radial initial velocity, so the\n // out-of-the-box system is a full cloud. (\"point\" has no normals and stays a thin stream.)\n emitter_shape: z.enum([\"point\", \"line\", \"circle\", \"sphere\", \"mesh\", \"image\"]).default(\"sphere\"),\n particle_count: z.coerce.number().int().positive().default(10000),\n forces: z\n .array(z.enum([\"gravity\", \"noise\", \"attract\", \"repel\", \"vortex\", \"turbulence\", \"drag\"]))\n .default([\"noise\", \"gravity\"]),\n render_style: z\n .enum([\"points\", \"sprites\", \"lines\", \"trails\", \"instanced_geo\"])\n .default(\"sprites\"),\n lifetime: z.coerce.number().positive().default(3),\n expose_controls: z\n .boolean()\n .default(true)\n .describe(\"Expose live Drag / Turbulence / Gravity / Lifetime knobs on the system container.\"),\n parent_path: z.string().default(\"/project1\"),\n});\ntype CreateParticleSystemArgs = z.infer<typeof createParticleSystemSchema>;\n\nexport async function createParticleSystemImpl(ctx: ToolContext, args: CreateParticleSystemArgs) {\n return runBuild(async () => {\n const builder = await createSystemContainer(ctx, args.parent_path, \"particle_system\");\n\n // Geometry COMP holds the particle SOP chain so the renderer can see it.\n const geo = await builder.add(\"geometryCOMP\", \"geo\");\n\n const emitter = await ctx.client.createNode({\n parent_path: geo,\n type: EMITTER_SOP[args.emitter_shape],\n name: \"emitter\",\n });\n const particle = await ctx.client.createNode({\n parent_path: geo,\n type: \"particleSOP\",\n name: \"particle\",\n parameters: { life: args.lifetime },\n });\n builder.created.push(\n { name: \"emitter\", path: emitter.path, type: emitter.type },\n { name: \"particle\", path: particle.path, type: particle.type },\n );\n // The \"point\" emitter is an Add SOP, which ships with zero points — so the particle\n // SOP would have no source to birth from and the system renders empty. Enable a point\n // (its count is a parameter *sequence*, set via numBlocks rather than a plain par).\n if (args.emitter_shape === \"point\") {\n await builder.python(\n `_e = op(${q(emitter.path)})\\n_e.par.addpts = True\\n_e.seq.point.numBlocks = max(_e.seq.point.numBlocks, 1)`,\n );\n }\n await builder.connect(emitter.path, particle.path);\n\n // Turn the bare Particle SOP into an immediately-visible, moving system (initial velocity\n // from normals, pre-roll population, force mapping, containment drag).\n const dynamics = computeParticleDynamics(args);\n await builder.python(particleDynamicsPython(particle.path, args, dynamics));\n\n const mat = await builder.add(\n args.render_style === \"sprites\" ? \"pointspriteMAT\" : \"constantMAT\",\n \"mat\",\n );\n const cam = await builder.add(\"cameraCOMP\", \"cam\", { tz: 6 });\n const light = await builder.add(\"lightCOMP\", \"light\", { tx: 3, ty: 4, tz: 4 });\n // Opaque near-black background so the (white, point-sized) particles are visible.\n // Left transparent, white particles vanish against a light compositing backdrop; set\n // bgcolora back to 0 if you want to composite the particles over other layers.\n const render = await builder.add(\"renderTOP\", \"render\", {\n bgcolorr: 0.02,\n bgcolorg: 0.02,\n bgcolorb: 0.05,\n bgcolora: 1,\n });\n const out = await builder.add(\"nullTOP\", \"out1\");\n await builder.connect(render, out);\n\n await builder.python(\n [\n `g = op(${q(geo)})`,\n \"p = op(g.path + '/particle')\",\n \"p.render = True\",\n \"p.display = True\",\n `g.par.material = ${q(mat)}`,\n `r = op(${q(render)})`,\n `r.par.geometry = ${q(geo)}`,\n `r.par.camera = ${q(cam)}`,\n `r.par.lights = ${q(light)}`,\n ].join(\"\\n\"),\n );\n\n const approximated = args.forces.filter(\n (x) => x === \"attract\" || x === \"repel\" || x === \"vortex\",\n );\n if (approximated.length > 0) {\n builder.warnings.push(\n `Forces ${approximated.join(\", \")} have no native Particle SOP equivalent and are approximated with turbulence.`,\n );\n }\n if (args.render_style !== \"points\" && args.render_style !== \"sprites\") {\n builder.warnings.push(\n `Render style \"${args.render_style}\" falls back to point/sprite rendering in this version.`,\n );\n }\n\n const controls: ControlSpec[] = args.expose_controls\n ? [\n {\n name: \"Drag\",\n type: \"float\",\n min: 0,\n max: 8,\n default: dynamics.drag,\n bind_to: [`${particle.path}.drag`],\n },\n {\n name: \"Turbulence\",\n type: \"float\",\n min: 0,\n max: 4,\n default: dynamics.turb,\n bind_to: [`${particle.path}.turbx`, `${particle.path}.turby`, `${particle.path}.turbz`],\n },\n {\n name: \"Gravity\",\n type: \"float\",\n min: -3,\n max: 3,\n default: dynamics.gravity,\n bind_to: [`${particle.path}.externaly`],\n },\n {\n name: \"Lifetime\",\n type: \"float\",\n min: 0.1,\n max: 10,\n default: args.lifetime,\n bind_to: [`${particle.path}.life`],\n },\n ]\n : [];\n\n return finalize(ctx, {\n summary: `Created a particle system (emitter: ${args.emitter_shape}, ~${args.particle_count} particles, render: ${args.render_style}).`,\n builder,\n outputPath: out,\n controls,\n extra: {\n emitter_shape: args.emitter_shape,\n forces: args.forces,\n render_style: args.render_style,\n },\n });\n });\n}\n\nexport const registerCreateParticleSystem: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_particle_system\",\n {\n title: \"Create particle system\",\n description:\n \"Build a particle system: an emitter feeds a particle SOP inside a Geometry COMP, rendered with a camera + light. Forces and render style are scaffolded for further tuning.\",\n inputSchema: createParticleSystemSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createParticleSystemImpl(ctx, args),\n );\n};\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { createAudioReactiveImpl } from \"./createAudioReactive.js\";\nimport { createFeedbackNetworkImpl } from \"./createFeedbackNetwork.js\";\nimport { createGenerativeArtImpl } from \"./createGenerativeArt.js\";\nimport { createParticleSystemImpl } from \"./createParticleSystem.js\";\nimport { significantTerms } from \"./intent.js\";\nimport { buildFromRecipe, finalize, runBuild } from \"./orchestration.js\";\n\nexport const createVisualSystemSchema = z.object({\n description: z.string().min(1).describe(\"Natural-language description of the visual system.\"),\n parent_path: z.string().default(\"/project1\"),\n resolution: z\n .enum([\"720p\", \"1080p\", \"4K\", \"custom\"])\n .default(\"1080p\")\n .describe(\n \"Advisory target resolution. Recorded in the build note; the sub-builders use their own internal sizes and do not enforce this per-node.\",\n ),\n target_fps: z.coerce\n .number()\n .positive()\n .default(60)\n .describe(\n \"Advisory target frame rate (informational only — TD's real cook rate is a project-level setting, not set here).\",\n ),\n});\ntype CreateVisualSystemArgs = z.infer<typeof createVisualSystemSchema>;\n\ntype Kind =\n | \"audio\"\n | \"particle\"\n | \"feedback\"\n | \"reaction_diffusion\"\n | \"noise_landscape\"\n | \"default\";\n\nfunction classify(description: string): { kind: Kind; label: string } {\n const d = description.toLowerCase();\n const has = (...words: string[]) => words.some((w) => d.includes(w));\n if (has(\"audio\", \"sound\", \"music\", \"beat\", \"frequenc\", \"spectrum\", \"reactive\")) {\n return { kind: \"audio\", label: \"audio-reactive\" };\n }\n if (has(\"particle\", \"swarm\", \"galaxy\", \"sparkle\", \"emitter\")) {\n return { kind: \"particle\", label: \"particle\" };\n }\n if (has(\"reaction\", \"diffusion\", \"gray-scott\", \"gray scott\")) {\n return { kind: \"reaction_diffusion\", label: \"reaction-diffusion\" };\n }\n if (has(\"landscape\", \"terrain\", \"mountain\", \"heightfield\")) {\n return { kind: \"noise_landscape\", label: \"noise landscape\" };\n }\n if (has(\"feedback\", \"tunnel\", \"echo\", \"trail\", \"infinite\", \"kaleido\")) {\n return { kind: \"feedback\", label: \"feedback\" };\n }\n return { kind: \"default\", label: \"generative\" };\n}\n\nfunction pickAudioStyle(\n description: string,\n): \"geometric\" | \"particle\" | \"feedback\" | \"glsl\" | \"instancing\" {\n const d = description.toLowerCase();\n if (d.includes(\"particle\")) return \"particle\";\n if (d.includes(\"feedback\") || d.includes(\"tunnel\")) return \"feedback\";\n if (d.includes(\"geometr\") || d.includes(\"shape\")) return \"geometric\";\n if (d.includes(\"instanc\")) return \"instancing\";\n return \"glsl\";\n}\n\nfunction pickEmitter(\n description: string,\n): \"point\" | \"line\" | \"circle\" | \"sphere\" | \"mesh\" | \"image\" {\n const d = description.toLowerCase();\n if (d.includes(\"galaxy\") || d.includes(\"sphere\") || d.includes(\"orbit\")) return \"sphere\";\n if (d.includes(\"ring\") || d.includes(\"circle\")) return \"circle\";\n if (d.includes(\"line\")) return \"line\";\n return \"point\";\n}\n\nconst COLOR_WORDS: Record<string, string> = {\n red: \"#e03030\",\n crimson: \"#c01040\",\n orange: \"#ff7a18\",\n amber: \"#ffb000\",\n yellow: \"#f5e050\",\n gold: \"#e8c020\",\n green: \"#30c050\",\n lime: \"#9be025\",\n teal: \"#10b0a0\",\n cyan: \"#20d0e0\",\n blue: \"#1840d0\",\n navy: \"#0a1a66\",\n indigo: \"#3010a0\",\n purple: \"#7a20c0\",\n violet: \"#8a40e0\",\n magenta: \"#d020a0\",\n pink: \"#ff60b0\",\n white: \"#f0f0f0\",\n black: \"#101015\",\n};\n\n// Best-effort: pull up to two named colors from the description so a feedback system\n// can honor a requested palette instead of rendering grayscale.\nfunction parseColors(description: string): string[] {\n const d = description.toLowerCase();\n const found: string[] = [];\n for (const [word, hex] of Object.entries(COLOR_WORDS)) {\n if (new RegExp(`\\\\b${word}`).test(d) && !found.includes(hex)) found.push(hex);\n if (found.length >= 2) break;\n }\n return found;\n}\n\nfunction withNote(result: CallToolResult, note: string): CallToolResult {\n return { ...result, content: [{ type: \"text\", text: note }, ...result.content] };\n}\n\nexport async function createVisualSystemImpl(ctx: ToolContext, args: CreateVisualSystemArgs) {\n const { kind, label } = classify(args.description);\n const note = `Interpreted \"${args.description}\" as a ${label} system (advisory target ${args.resolution} @ ${args.target_fps}fps).`;\n ctx.logger.info(\"create_visual_system classified\", { kind, description: args.description });\n\n switch (kind) {\n case \"audio\":\n return withNote(\n await createAudioReactiveImpl(ctx, {\n audio_source: \"microphone\",\n visual_style: pickAudioStyle(args.description),\n frequency_bands: 8,\n beat_detection: true,\n expose_controls: true,\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"particle\":\n return withNote(\n await createParticleSystemImpl(ctx, {\n emitter_shape: pickEmitter(args.description),\n particle_count: 10000,\n forces: [\"noise\", \"gravity\"],\n render_style: \"sprites\",\n lifetime: 3,\n expose_controls: true,\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"feedback\":\n return withNote(\n await createFeedbackNetworkImpl(ctx, {\n seed_type: \"noise\",\n transformations: [\"blur\", \"displace\", \"level\"],\n feedback_gain: 0.95,\n colors: parseColors(args.description),\n expose_controls: true,\n parent_path: args.parent_path,\n }),\n note,\n );\n case \"reaction_diffusion\":\n case \"noise_landscape\":\n return withNote(\n await createGenerativeArtImpl(ctx, {\n technique: kind,\n evolution_speed: 1.0,\n expose_controls: true,\n parent_path: args.parent_path,\n }),\n note,\n );\n default: {\n // Try to match a recipe by keywords before falling back to generative GLSL.\n const recipe = ctx.recipes.findByTags(significantTerms(args.description));\n if (recipe) {\n return runBuild(async () => {\n const { builder, outputPath, controls } = await buildFromRecipe(\n ctx,\n recipe,\n args.parent_path,\n );\n return withNote(\n await finalize(ctx, {\n summary: `Built \"${recipe.name}\" from a matching recipe.`,\n builder,\n outputPath,\n recipeId: recipe.id,\n controls,\n }),\n note,\n );\n });\n }\n return withNote(\n await createGenerativeArtImpl(ctx, {\n technique: \"custom_glsl\",\n evolution_speed: 1.0,\n expose_controls: true,\n parent_path: args.parent_path,\n }),\n note,\n );\n }\n }\n}\n\nexport const registerCreateVisualSystem: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_visual_system\",\n {\n title: \"Create visual system\",\n description:\n \"Create a complete visual system from a natural-language description. Classifies intent (audio-reactive, particle, feedback, reaction-diffusion, landscape, generative) and builds it in a self-contained COMP, then verifies and previews it.\",\n inputSchema: createVisualSystemSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createVisualSystemImpl(ctx, args),\n );\n};\n","/**\n * Words that describe almost any visual and so must not drive recipe matching.\n * \"generative\", for instance, is a tag on most recipes, so leaving it in makes\n * findByTags pick an unrelated recipe (e.g. \"glowing generative plasma\" → particle galaxy).\n */\nconst GENERIC_TERMS = new Set([\n \"generative\",\n \"visual\",\n \"visuals\",\n \"glow\",\n \"glowing\",\n \"abstract\",\n \"field\",\n \"system\",\n \"animated\",\n \"evolving\",\n \"dynamic\",\n \"background\",\n \"colorful\",\n \"colourful\",\n \"bright\",\n \"beautiful\",\n]);\n\n/** Splits a description into discriminating lowercase terms for recipe tag matching. */\nexport function significantTerms(description: string): string[] {\n return description\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 3 && !GENERIC_TERMS.has(t));\n}\n","import { z } from \"zod\";\nimport { textResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { significantTerms } from \"./intent.js\";\n\nexport const describeProjectSchema = z.object({\n description: z.string().min(1).describe(\"Natural-language description of the visual you want.\"),\n});\ntype DescribeProjectArgs = z.infer<typeof describeProjectSchema>;\n\nexport function describeProjectImpl(ctx: ToolContext, args: DescribeProjectArgs) {\n const d = args.description.toLowerCase();\n const has = (...words: string[]) => words.some((w) => d.includes(w));\n\n let tool: string;\n let summary: string;\n let recipeId: string | undefined;\n\n if (has(\"audio\", \"sound\", \"music\", \"beat\", \"frequenc\", \"spectrum\", \"reactive\")) {\n tool = \"create_audio_reactive\";\n summary = \"audio-reactive visual\";\n } else if (has(\"particle\", \"swarm\", \"galaxy\", \"sparkle\", \"emitter\")) {\n tool = \"create_particle_system\";\n summary = \"particle system\";\n } else if (has(\"reaction\", \"diffusion\", \"gray-scott\", \"gray scott\")) {\n tool = \"create_generative_art\";\n summary = \"reaction-diffusion simulation\";\n recipeId = \"reaction_diffusion\";\n } else if (has(\"landscape\", \"terrain\", \"mountain\", \"heightfield\")) {\n tool = \"create_generative_art\";\n summary = \"3D noise landscape\";\n recipeId = \"noise_landscape\";\n } else if (has(\"feedback\", \"tunnel\", \"echo\", \"trail\", \"kaleido\")) {\n tool = \"create_feedback_network\";\n summary = \"feedback network\";\n } else {\n tool = \"create_visual_system\";\n summary = \"generative visual\";\n recipeId = ctx.recipes.findByTags(significantTerms(d))?.id;\n }\n\n const lines: string[] = [\n `Plan for: \"${args.description}\"`,\n \"\",\n `Interpreted as: ${summary}.`,\n `Recommended tool: ${tool}${recipeId ? ` (recipe: ${recipeId})` : \"\"}.`,\n ];\n\n if (recipeId) {\n const recipe = ctx.recipes.get(recipeId);\n if (recipe) {\n lines.push(\"\", `Recipe \"${recipe.name}\" would create:`);\n for (const node of recipe.nodes) {\n lines.push(` - ${node.name} (${node.type})${node.comment ? ` — ${node.comment}` : \"\"}`);\n }\n }\n }\n\n lines.push(\"\", \"Next: call the recommended tool, then check get_td_node_errors and get_preview.\");\n return textResult(lines.join(\"\\n\"));\n}\n\nexport const registerDescribeProject: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"plan_visual\",\n {\n title: \"Plan a visual from a description\",\n description:\n \"Turn a natural-language description of a visual you WANT into a build plan (which tool/recipe and nodes) — a dry run that creates nothing. Note: this does NOT inspect the current TouchDesigner project; to read existing nodes use get_td_nodes / get_td_topology / find_td_nodes.\",\n inputSchema: describeProjectSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => describeProjectImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { capturePreview } from \"../../feedback/previewCapture.js\";\nimport { guardTd, imageResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getPreviewSchema = z.object({\n node_path: z.string().describe(\"Path of the TOP node to capture.\"),\n width: z.coerce.number().int().positive().default(640),\n height: z.coerce.number().int().positive().default(360),\n});\ntype GetPreviewArgs = z.infer<typeof getPreviewSchema>;\n\nexport async function getPreviewImpl(ctx: ToolContext, args: GetPreviewArgs) {\n return guardTd(\n () => capturePreview(ctx.client, args.node_path, args.width, args.height),\n (preview) =>\n imageResult(\n preview.base64,\n preview.mimeType,\n `Preview of ${args.node_path} (${preview.width}×${preview.height}).`,\n ),\n );\n}\n\nexport const registerGetPreview: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_preview\",\n {\n title: \"Preview a TOP\",\n description: \"Capture a TOP node as an inline image so you can see what was created.\",\n inputSchema: getPreviewSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getPreviewImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { connectNodesViaBridge } from \"../layer2/connectHelper.js\";\nimport { jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { runBuild } from \"./orchestration.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nconst OUTPUT_MAP = {\n window: \"windowCOMP\",\n ndi: \"ndioutTOP\",\n syphon_spout: \"syphonspoutoutTOP\",\n record: \"moviefileoutTOP\",\n touch_out: \"touchoutTOP\",\n} as const;\n\nconst RESOLUTIONS = {\n \"720p\": [1280, 720],\n \"1080p\": [1920, 1080],\n \"4K\": [3840, 2160],\n} as const;\n\nexport const setupOutputSchema = z.object({\n source_path: z.string().describe(\"Path of the final TOP to output.\"),\n output_type: z.enum([\"window\", \"ndi\", \"syphon_spout\", \"record\", \"touch_out\"]).default(\"window\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\"]).default(\"1080p\"),\n record_format: z.enum([\"mp4\", \"mov\", \"image_sequence\"]).optional(),\n parent_path: z.string().default(\"/project1\"),\n});\ntype SetupOutputArgs = z.infer<typeof setupOutputSchema>;\n\nexport async function setupOutputImpl(ctx: ToolContext, args: SetupOutputArgs) {\n return runBuild(async () => {\n const warnings: string[] = [];\n const node = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: OUTPUT_MAP[args.output_type],\n name: `${args.output_type}_out`,\n });\n\n if (args.output_type === \"window\") {\n // windowCOMP references its source via the `winop` path parameter, which\n // works across COMP boundaries — no wire needed.\n const [width, height] = RESOLUTIONS[args.resolution];\n try {\n await ctx.client.executePythonScript(\n `w = op(${q(node.path)})\\nw.par.winop = ${q(args.source_path)}\\nw.par.winw = ${width}\\nw.par.winh = ${height}`,\n false,\n );\n } catch (err) {\n warnings.push(`Could not configure window: ${friendlyTdError(err)}`);\n }\n } else {\n // The other outputs need a real wired input. A direct wire fails when the\n // source lives in a different COMP (TD wires can't cross COMP boundaries),\n // so bridge it through a Select TOP that references the source by path.\n try {\n const select = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"selectTOP\",\n name: `${args.output_type}_src`,\n });\n await ctx.client.updateNodeParameters(select.path, { top: args.source_path });\n await connectNodesViaBridge(ctx.client, select.path, node.path);\n } catch (err) {\n warnings.push(`Could not connect source to output: ${friendlyTdError(err)}`);\n }\n }\n\n if (args.output_type === \"record\" && args.record_format) {\n try {\n await ctx.client.updateNodeParameters(node.path, { type: args.record_format });\n } catch (err) {\n warnings.push(`Could not set record format: ${friendlyTdError(err)}`);\n }\n }\n\n return jsonResult(`Configured ${args.output_type} output for ${args.source_path}.`, {\n output: node.path,\n output_type: args.output_type,\n source_path: args.source_path,\n resolution: args.resolution,\n warnings,\n });\n });\n}\n\nexport const registerSetupOutput: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"setup_output\",\n {\n title: \"Set up output\",\n description:\n \"Route a TOP to an output: a display window, NDI stream, Syphon/Spout, a recording, or Touch Out.\",\n inputSchema: setupOutputSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => setupOutputImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerApplyPostProcessing } from \"./applyPostProcessing.js\";\nimport { registerCreateAudioReactive } from \"./createAudioReactive.js\";\nimport { registerCreateDataVisualization } from \"./createDataVisualization.js\";\nimport { registerCreateFeedbackNetwork } from \"./createFeedbackNetwork.js\";\nimport { registerCreateGenerativeArt } from \"./createGenerativeArt.js\";\nimport { registerCreateParticleSystem } from \"./createParticleSystem.js\";\nimport { registerCreateVisualSystem } from \"./createVisualSystem.js\";\nimport { registerDescribeProject } from \"./describeProject.js\";\nimport { registerGetPreview } from \"./getPreview.js\";\nimport { registerSetupOutput } from \"./setupOutput.js\";\n\nexport const layer1Registrars: ToolRegistrar[] = [\n registerCreateFeedbackNetwork,\n registerCreateGenerativeArt,\n registerCreateAudioReactive,\n registerCreateParticleSystem,\n registerCreateDataVisualization,\n registerApplyPostProcessing,\n registerSetupOutput,\n registerGetPreview,\n registerDescribeProject,\n registerCreateVisualSystem,\n];\n","import { z } from \"zod\";\nimport { buildPayloadScript, parsePythonReport } from \"../pythonReport.js\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\n/** Friendly waveform names → the lfoCHOP `wavetype` menu values. */\nconst WAVE_MAP = {\n sine: \"sin\",\n triangle: \"tri\",\n ramp: \"ramp\",\n square: \"square\",\n pulse: \"pulse\",\n random: \"normal\",\n} as const;\n\nexport const animateParameterSchema = z.object({\n targets: z\n .array(z.string())\n .min(1)\n .describe(\n \"Parameters to animate, each written as 'nodePath.parName' (e.g. '/project1/sys/blur1.size'). Each is switched to expression mode so it tracks the oscillator live.\",\n ),\n waveform: z\n .enum([\"sine\", \"triangle\", \"ramp\", \"square\", \"pulse\", \"random\"])\n .default(\"sine\")\n .describe(\"Oscillator shape. Every waveform sweeps the full min–max range.\"),\n min: z.coerce.number().default(0).describe(\"Low end of the value sweep.\"),\n max: z.coerce.number().default(1).describe(\"High end of the value sweep.\"),\n period_seconds: z.coerce\n .number()\n .positive()\n .default(4)\n .describe(\"Seconds for one full cycle (lower = faster).\"),\n container_path: z\n .string()\n .optional()\n .describe(\"Where to create the LFO CHOP; defaults to the first target's parent network.\"),\n name: z.string().default(\"lfo_anim\").describe(\"Name for the LFO CHOP.\"),\n});\ntype AnimateParameterArgs = z.infer<typeof animateParameterSchema>;\n\ninterface AnimateReport {\n lfo?: string;\n container?: string;\n channel?: string;\n frequency?: number;\n targets_bound: string[];\n warnings: string[];\n fatal?: string;\n}\n\n// One Python pass creates the lfoCHOP and binds each target parameter to its channel\n// value by expression. `ParMode` is not in the bridge's exec globals, so the\n// expression-mode enum is derived from a live parameter (`type(par.mode)`).\nconst ANIMATE_SCRIPT = `\nimport json, base64, traceback\n_p = json.loads(base64.b64decode(\"__PAYLOAD_B64__\").decode(\"utf-8\"))\nreport = {\"targets_bound\": [], \"warnings\": []}\ntry:\n _targets = _p[\"targets\"]\n _first = _targets[0]; _dot0 = _first.rfind(\".\")\n if _dot0 <= 0:\n report[\"fatal\"] = \"Invalid target '%s' (expected 'nodePath.parName').\" % _first\n else:\n _np0 = _first[:_dot0]; _firstnode = op(_np0)\n if _firstnode is None:\n report[\"fatal\"] = \"Target node not found: %s\" % _np0\n else:\n _cont = _p.get(\"container\") or _firstnode.parent().path\n _parent = op(_cont)\n if _parent is None:\n report[\"fatal\"] = \"Container not found: %s\" % _cont\n else:\n _lfo = _parent.create(lfoCHOP, _p[\"name\"])\n _lfo.par.wavetype = _p[\"wavetype\"]\n _lfo.par.frequency = _p[\"frequency\"]\n _lfo.par.amp = _p[\"amp\"]\n _lfo.par.offset = _p[\"offset\"]\n _ch = _lfo.par.channelname.eval() or \"chan1\"\n report[\"lfo\"] = _lfo.path; report[\"container\"] = _cont\n report[\"channel\"] = _ch; report[\"frequency\"] = _p[\"frequency\"]\n for _t in _targets:\n try:\n _dot = _t.rfind(\".\")\n if _dot <= 0:\n report[\"warnings\"].append(\"Invalid target '%s' (expected 'nodePath.parName').\" % _t); continue\n _npth = _t[:_dot]; _pn = _t[_dot + 1:]; _tn = op(_npth)\n if _tn is None:\n report[\"warnings\"].append(\"Target node not found: %s\" % _npth); continue\n _tp = getattr(_tn.par, _pn, None)\n if _tp is None:\n report[\"warnings\"].append(\"Target parameter not found: %s.%s\" % (_npth, _pn)); continue\n _PM = type(_tp.mode)\n _tp.expr = \"op(%s)[%s]\" % (repr(_lfo.path), repr(_ch))\n _tp.mode = _PM.EXPRESSION\n report[\"targets_bound\"].append(_npth + \".\" + _pn)\n except Exception:\n report[\"warnings\"].append(\"Failed to bind '%s': %s\" % (_t, traceback.format_exc().splitlines()[-1]))\nexcept Exception:\n report[\"fatal\"] = traceback.format_exc().splitlines()[-1]\nprint(json.dumps(report))\n`;\n\nexport function buildAnimateScript(payload: object): string {\n return buildPayloadScript(ANIMATE_SCRIPT, payload);\n}\n\n// lfoCHOP wave shapes are not uniformly bipolar: sin/tri/square swing [-1, 1],\n// but ramp/pulse/random(normal) output [0, 1] (verified live, build 2025.32820).\n// amp/offset must branch on that, else unipolar waves only sweep [midpoint, max].\nconst BIPOLAR_WAVEFORMS = new Set([\"sine\", \"triangle\", \"square\"]);\n\nexport async function animateParameterImpl(ctx: ToolContext, args: AnimateParameterArgs) {\n const span = args.max - args.min;\n const bipolar = BIPOLAR_WAVEFORMS.has(args.waveform);\n const amp = bipolar ? span / 2 : span;\n const offset = bipolar ? (args.max + args.min) / 2 : args.min;\n const frequency = 1 / args.period_seconds;\n return guardTd(\n async () => {\n const script = buildAnimateScript({\n targets: args.targets,\n name: args.name,\n wavetype: WAVE_MAP[args.waveform],\n frequency,\n amp,\n offset,\n container: args.container_path ?? null,\n });\n const exec = await ctx.client.executePythonScript(script, true);\n return parsePythonReport<AnimateReport>(exec.stdout);\n },\n (report) => {\n if (report.fatal) {\n return jsonResult(`Could not set up animation: ${report.fatal}`, report);\n }\n const summary = `Animating ${report.targets_bound.length} parameter(s) with a ${args.waveform} LFO (period ${args.period_seconds}s, range ${args.min}–${args.max}) at ${report.lfo}${\n report.warnings.length ? `, ${report.warnings.length} warning(s)` : \"\"\n }.`;\n return jsonResult(summary, report);\n },\n );\n}\n\nexport const registerAnimateParameter: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"animate_parameter\",\n {\n title: \"Animate parameter\",\n description:\n \"Drive one or more node parameters over time with an LFO (sine/triangle/ramp/square/pulse/random). Creates an LFO CHOP and binds each target so it oscillates between min and max with the given period — movement without manual keyframing.\",\n inputSchema: animateParameterSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => animateParameterImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { computeLayoutByParent, layoutScript } from \"../layout.js\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const arrangeNetworkSchema = z.object({\n path: z\n .string()\n .describe(\"COMP whose children to arrange, e.g. '/project1' or a container path.\"),\n recursive: z\n .boolean()\n .default(false)\n .describe(\"Also arrange the nodes inside nested COMPs (each network is tidied on its own).\"),\n});\ntype ArrangeNetworkArgs = z.infer<typeof arrangeNetworkSchema>;\n\nexport async function arrangeNetworkImpl(ctx: ToolContext, args: ArrangeNetworkArgs) {\n return guardTd(\n async () => {\n const topology = await ctx.client.getNetworkTopology(args.path, args.recursive);\n const nodes = topology.nodes.map((n) => n.path);\n const edges = topology.connections.map((c) => ({ from: c.source_path, to: c.target_path }));\n const positions = computeLayoutByParent(nodes, edges);\n if (nodes.length > 0) {\n await ctx.client.executePythonScript(layoutScript(positions), false);\n }\n return Object.keys(positions).length;\n },\n (arranged) =>\n jsonResult(\n arranged === 0\n ? `No nodes to arrange under ${args.path}.`\n : `Arranged ${arranged} node(s) under ${args.path} into a left→right data-flow layout.`,\n { path: args.path, arranged, recursive: args.recursive },\n ),\n );\n}\n\nexport const registerArrangeNetwork: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"arrange_network\",\n {\n title: \"Arrange network layout\",\n description:\n \"Tidy an existing network: reposition a COMP's children into a readable left→right data-flow layout (sources on the left, output on the right). Use this to clean up nodes that are piled on top of each other. Set recursive to also arrange the contents of nested COMPs.\",\n inputSchema: arrangeNetworkSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => arrangeNetworkImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { connectNodesViaBridge } from \"./connectHelper.js\";\n\nexport const connectNodesSchema = z.object({\n source_path: z.string().describe(\"Path of the source node (output side).\"),\n target_path: z.string().describe(\"Path of the target node (input side).\"),\n source_output: z.number().int().nonnegative().default(0),\n target_input: z.number().int().nonnegative().default(0),\n});\ntype ConnectNodesArgs = z.infer<typeof connectNodesSchema>;\n\nexport async function connectNodesImpl(ctx: ToolContext, args: ConnectNodesArgs) {\n return guardTd(\n () =>\n connectNodesViaBridge(\n ctx.client,\n args.source_path,\n args.target_path,\n args.source_output,\n args.target_input,\n ),\n (result) =>\n jsonResult(`Connected ${args.source_path} → ${args.target_path} (via ${result.method}).`, {\n source: args.source_path,\n target: args.target_path,\n source_output: args.source_output,\n target_input: args.target_input,\n method: result.method,\n }),\n );\n}\n\nexport const registerConnectNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"connect_nodes\",\n {\n title: \"Connect two nodes\",\n description:\n \"Wire one node's output into another node's input. Uses the batch endpoint when available, with a Python fallback.\",\n inputSchema: connectNodesSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => connectNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { placeBelowSiblingsScript } from \"../layout.js\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst COMP_MAP = {\n container: \"containerCOMP\",\n base: \"baseCOMP\",\n} as const;\n\nexport const createContainerSchema = z.object({\n parent_path: z.string().default(\"/project1\").describe(\"Parent COMP to create the container in.\"),\n name: z.string().optional(),\n comp_type: z\n .enum([\"container\", \"base\"])\n .default(\"container\")\n .describe(\"'container' (2D panel COMP) or 'base' (generic COMP).\"),\n});\ntype CreateContainerArgs = z.infer<typeof createContainerSchema>;\n\nexport async function createContainerImpl(ctx: ToolContext, args: CreateContainerArgs) {\n return guardTd(\n async () => {\n const node = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: COMP_MAP[args.comp_type],\n name: args.name,\n });\n // Place it clear of existing siblings (cosmetic — never block creation).\n try {\n await ctx.client.executePythonScript(\n placeBelowSiblingsScript(args.parent_path, node.path),\n false,\n );\n } catch (err) {\n ctx.logger.debug(\"container placement skipped\", { err: String(err) });\n }\n return node;\n },\n (node) => jsonResult(`Created ${args.comp_type} COMP at ${node.path}.`, { node }),\n );\n}\n\nexport const registerCreateContainer: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_container\",\n {\n title: \"Create container COMP\",\n description: \"Create a self-contained COMP to hold a visual system.\",\n inputSchema: createContainerSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createContainerImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { buildPayloadScript, parsePythonReport } from \"../pythonReport.js\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst bindSchema = z.object({\n channel: z\n .string()\n .describe(\n \"Channel name produced by the input (e.g. an OSC address tail 'fader1', or a MIDI channel name).\",\n ),\n target: z.string().describe(\"Parameter to drive, written as 'nodePath.parName'.\"),\n});\n\nexport const createExternalIoSchema = z.object({\n kind: z\n .enum([\"osc_in\", \"midi_in\", \"dmx_out\", \"ndi_in\", \"syphon_spout_in\"])\n .describe(\n \"What to bridge: OSC input, MIDI input, DMX/Art-Net output (lighting), or NDI / Syphon-Spout video input. (Video/NDI/Syphon *outputs* live in setup_output.)\",\n ),\n parent_path: z.string().default(\"/project1\").describe(\"COMP to create the I/O operator in.\"),\n name: z.string().optional(),\n port: z.coerce\n .number()\n .int()\n .optional()\n .describe(\"(osc_in) UDP port to listen on. Defaults to 7000.\"),\n normalize: z\n .enum([\"off\", \"0to1\", \"-1to1\", \"onoff\"])\n .default(\"0to1\")\n .describe(\"(midi_in) How to scale incoming MIDI values.\"),\n bind_to: z\n .array(bindSchema)\n .optional()\n .describe(\n \"(osc_in/midi_in) Map incoming channels to parameters. Each binding tolerates a channel that hasn't arrived yet (falls back to 0 instead of erroring).\",\n ),\n source_path: z\n .string()\n .optional()\n .describe(\"(dmx_out) CHOP whose channel values are sent out as DMX.\"),\n interface: z\n .enum([\"artnet\", \"sacn\", \"enttecusbpro\", \"enttecusbpromk2\", \"serial\", \"kinet\"])\n .default(\"artnet\")\n .describe(\"(dmx_out) DMX transport.\"),\n universe: z.coerce.number().int().default(1).describe(\"(dmx_out) DMX universe.\"),\n net_address: z.string().optional().describe(\"(dmx_out) Target IP address for Art-Net / sACN.\"),\n source_name: z\n .string()\n .optional()\n .describe(\"(ndi_in/syphon_spout_in) Name of the NDI source or Spout sender to receive.\"),\n});\ntype CreateExternalIoArgs = z.infer<typeof createExternalIoSchema>;\n\ninterface IoReport {\n kind: string;\n node?: string;\n type?: string;\n source?: string;\n bound?: Array<{ channel: string; target: string }>;\n errors?: string[];\n warnings: string[];\n fatal?: string;\n}\n\n// One Python pass creates and configures the right operator per kind. Control-surface\n// inputs (OSC/MIDI) bind channels to parameters with a guard so a channel that hasn't\n// arrived yet evaluates to 0 instead of leaving the target in an error state. The\n// expression-mode enum is derived from a live parameter (`ParMode` is not in scope here).\nconst IO_SCRIPT = `\nimport json, base64, traceback\n_p = json.loads(base64.b64decode(\"__PAYLOAD_B64__\").decode(\"utf-8\"))\nreport = {\"kind\": _p[\"kind\"], \"warnings\": []}\n_TYPEMAP = {\"osc_in\": oscinCHOP, \"midi_in\": midiinCHOP, \"dmx_out\": dmxoutCHOP, \"ndi_in\": ndiinTOP, \"syphon_spout_in\": syphonspoutinTOP}\ntry:\n _kind = _p[\"kind\"]; _parent = op(_p[\"parent\"])\n if _parent is None:\n report[\"fatal\"] = \"Parent COMP not found: \" + str(_p[\"parent\"])\n else:\n _name = _p.get(\"name\")\n _node = _parent.create(_TYPEMAP[_kind], _name) if _name else _parent.create(_TYPEMAP[_kind])\n report[\"node\"] = _node.path; report[\"type\"] = _node.type\n def _setpar(parname, val):\n if val is None:\n return\n pr = getattr(_node.par, parname, None)\n if pr is None:\n report[\"warnings\"].append(\"No parameter '%s' on %s\" % (parname, _node.type)); return\n try:\n pr.val = val\n except Exception:\n report[\"warnings\"].append(\"Could not set parameter '%s'\" % parname)\n if _kind == \"osc_in\":\n _setpar(\"port\", _p.get(\"port\"))\n elif _kind == \"midi_in\":\n _setpar(\"norm\", _p.get(\"normalize\"))\n elif _kind == \"dmx_out\":\n _setpar(\"interface\", _p.get(\"interface\")); _setpar(\"universe\", _p.get(\"universe\")); _setpar(\"netaddress\", _p.get(\"net_address\"))\n _src = _p.get(\"source\")\n if _src:\n _s = op(_src)\n if _s is None:\n report[\"warnings\"].append(\"Source CHOP not found: \" + _src)\n else:\n try:\n _node.inputConnectors[0].connect(_s); report[\"source\"] = _s.path\n except Exception:\n report[\"warnings\"].append(\"Could not connect source \" + _src)\n elif _kind == \"ndi_in\":\n _setpar(\"name\", _p.get(\"source_name\"))\n elif _kind == \"syphon_spout_in\":\n _setpar(\"sendername\", _p.get(\"source_name\"))\n _bound = []\n if _kind in (\"osc_in\", \"midi_in\"):\n for _b in (_p.get(\"bind_to\") or []):\n try:\n _ch = _b[\"channel\"]; _t = _b[\"target\"]; _dot = _t.rfind(\".\")\n if _dot <= 0:\n report[\"warnings\"].append(\"Invalid bind target '%s' (expected 'nodePath.parName').\" % _t); continue\n _np = _t[:_dot]; _pn = _t[_dot + 1:]; _tn = op(_np)\n if _tn is None:\n report[\"warnings\"].append(\"Bind target node not found: \" + _np); continue\n _tp = getattr(_tn.par, _pn, None)\n if _tp is None:\n report[\"warnings\"].append(\"Bind target parameter not found: %s.%s\" % (_np, _pn)); continue\n _expr = \"op(%r)[%r] if %r in [c.name for c in op(%r).chans()] else 0\" % (_node.path, _ch, _ch, _node.path)\n _PM = type(_tp.mode); _tp.expr = _expr; _tp.mode = _PM.EXPRESSION\n _bound.append({\"channel\": _ch, \"target\": _np + \".\" + _pn})\n except Exception:\n report[\"warnings\"].append(\"Bind failed: \" + traceback.format_exc().splitlines()[-1])\n report[\"bound\"] = _bound\n report[\"errors\"] = [str(e) for e in _node.errors()][:3]\nexcept Exception:\n report[\"fatal\"] = traceback.format_exc().splitlines()[-1]\nprint(json.dumps(report))\n`;\n\nexport function buildIoScript(payload: object): string {\n return buildPayloadScript(IO_SCRIPT, payload);\n}\n\nexport async function createExternalIoImpl(ctx: ToolContext, args: CreateExternalIoArgs) {\n return guardTd(\n async () => {\n const script = buildIoScript({\n kind: args.kind,\n parent: args.parent_path,\n name: args.name ?? null,\n port: args.kind === \"osc_in\" ? (args.port ?? 7000) : null,\n normalize: args.normalize,\n bind_to: args.bind_to ?? null,\n source: args.source_path ?? null,\n interface: args.interface,\n universe: args.universe,\n net_address: args.net_address ?? null,\n source_name: args.source_name ?? null,\n });\n const exec = await ctx.client.executePythonScript(script, true);\n return parsePythonReport<IoReport>(exec.stdout);\n },\n (report) => {\n if (report.fatal) {\n return jsonResult(`Could not create ${report.kind}: ${report.fatal}`, report);\n }\n const bound = report.bound?.length ? `, ${report.bound.length} binding(s)` : \"\";\n const errs = report.errors?.length ? `, ${report.errors.length} node error(s)` : \"\";\n const warns = report.warnings.length ? `, ${report.warnings.length} warning(s)` : \"\";\n return jsonResult(\n `Created ${report.kind} (${report.type}) at ${report.node}${bound}${errs}${warns}.`,\n report,\n );\n },\n );\n}\n\nexport const registerCreateExternalIo: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_external_io\",\n {\n title: \"Create external I/O\",\n description:\n \"Bridge TouchDesigner to the outside world: OSC input or MIDI input (a control surface — bind incoming channels straight to parameters), DMX/Art-Net output for lighting, or NDI / Syphon-Spout video input. Validate live where possible, but real signal needs the hardware/sender present.\",\n inputSchema: createExternalIoSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createExternalIoImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst UniformSchema = z.object({\n name: z.string(),\n type: z.enum([\"float\", \"vec2\", \"vec3\", \"vec4\", \"int\", \"sampler2D\"]),\n default_value: z.string().optional(),\n});\n\nexport const createGlslShaderSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the GLSL TOP inside.\"),\n name: z.string().optional().describe(\"Name for the GLSL TOP (default 'glsl1').\"),\n fragment_shader: z.string().min(1).describe(\"GLSL fragment (pixel) shader source.\"),\n vertex_shader: z.string().optional().describe(\"Optional GLSL vertex shader source.\"),\n uniforms: z\n .array(UniformSchema)\n .optional()\n .describe(\"Optional uniform declarations to best-effort bind on the GLSL TOP.\"),\n resolution: z.enum([\"720p\", \"1080p\", \"4K\", \"input\"]).default(\"input\"),\n});\ntype CreateGlslShaderArgs = z.infer<typeof createGlslShaderSchema>;\n\nconst RESOLUTIONS = {\n \"720p\": [1280, 720],\n \"1080p\": [1920, 1080],\n \"4K\": [3840, 2160],\n} as const;\n\nconst q = (value: string): string => JSON.stringify(value);\n\nexport async function createGlslShaderImpl(ctx: ToolContext, args: CreateGlslShaderArgs) {\n const desiredName = args.name ?? \"glsl1\";\n return guardTd(\n async () => {\n const warnings: string[] = [];\n const glsl = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"glslTOP\",\n name: desiredName,\n });\n const glslName = glsl.name || desiredName;\n\n const fragName = `${glslName}_frag`;\n const frag = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"textDAT\",\n name: fragName,\n });\n\n const wiring = [\n `op(${q(frag.path)}).text = ${q(args.fragment_shader)}`,\n `op(${q(glsl.path)}).par.pixeldat = ${q(frag.name || fragName)}`,\n ];\n\n let vertexPath: string | undefined;\n if (args.vertex_shader) {\n const vertName = `${glslName}_vert`;\n const vert = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: \"textDAT\",\n name: vertName,\n });\n vertexPath = vert.path;\n wiring.push(`op(${q(vert.path)}).text = ${q(args.vertex_shader)}`);\n wiring.push(`op(${q(glsl.path)}).par.vertexdat = ${q(vert.name || vertName)}`);\n }\n\n await ctx.client.executePythonScript(wiring.join(\"\\n\"), false);\n\n if (args.uniforms && args.uniforms.length > 0) {\n // sampler2D uniforms bind to TOP inputs (the Samplers page), not numeric\n // values, so they can't be auto-set here — flag them for manual wiring.\n const samplers = args.uniforms.filter((u) => u.type === \"sampler2D\");\n if (samplers.length > 0) {\n warnings.push(\n `sampler2D uniform(s) ${samplers.map((u) => u.name).join(\", \")} must be wired manually (GLSL TOP Samplers page / TOP inputs).`,\n );\n }\n // Numeric uniforms bind through the GLSL TOP \"Vectors\" sequence\n // (vec<i>name + vec<i>value{x,y,z,w}). The flat uniname<i>/value<i>x params\n // the old path targeted don't exist on the GLSL TOP, so it silently\n // no-opped multi-component uniforms (only the X channel ever stuck).\n const specs = args.uniforms\n .filter((u) => u.type !== \"sampler2D\")\n .map((u) => ({\n name: u.name,\n comps: (u.default_value ?? \"\")\n .split(\",\")\n .map((s) => Number(s.trim()))\n .filter((n) => Number.isFinite(n))\n .slice(0, 4),\n }))\n .filter((s) => s.comps.length > 0);\n if (specs.length > 0) {\n const bind = [\n `g = op(${q(glsl.path)})`,\n `_specs = ${JSON.stringify(specs)}`,\n \"g.seq.vec.numBlocks = max(g.seq.vec.numBlocks, len(_specs))\",\n \"for i, s in enumerate(_specs):\",\n \" setattr(g.par, 'vec%dname' % i, s['name'])\",\n \" for axis, val in zip('xyzw', s['comps']):\",\n \" try: setattr(g.par, 'vec%dvalue%s' % (i, axis), val)\",\n \" except Exception: pass\",\n ].join(\"\\n\");\n try {\n await ctx.client.executePythonScript(bind, false);\n } catch {\n warnings.push(\n \"Could not auto-bind uniforms; declare them in the shader and set them on the GLSL TOP's Vectors page manually.\",\n );\n }\n }\n }\n\n if (args.resolution !== \"input\") {\n const [width, height] = RESOLUTIONS[args.resolution];\n await ctx.client.updateNodeParameters(glsl.path, {\n outputresolution: \"custom\",\n resolutionw: width,\n resolutionh: height,\n });\n }\n\n return { glsl, fragmentDat: frag.path, vertexDat: vertexPath, warnings };\n },\n (result) => jsonResult(`Created GLSL TOP at ${result.glsl.path}.`, result),\n );\n}\n\nexport const registerCreateGlslShader: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_glsl_shader\",\n {\n title: \"Create GLSL shader\",\n description:\n \"Create a GLSL TOP with a fragment shader (and optional vertex shader) supplied via Text DATs, with optional uniform binding and output resolution.\",\n inputSchema: createGlslShaderSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createGlslShaderImpl(ctx, args),\n );\n};\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport { friendlyTdError } from \"../../td-client/types.js\";\nimport { computeDataflowLayout, type LayoutEdge, layoutScript } from \"../layout.js\";\nimport { errorResult, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { connectNodesViaBridge } from \"./connectHelper.js\";\n\nconst ChainNodeSchema = z.object({\n type: z.string().describe(\"Operator type, e.g. 'noiseTOP'.\"),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const createNodeChainSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the chain inside.\"),\n nodes: z.array(ChainNodeSchema).min(1).describe(\"Ordered list of nodes to create.\"),\n connect_sequentially: z\n .boolean()\n .default(true)\n .describe(\"Wire output[0] → input[0] for each consecutive pair.\"),\n});\ntype CreateNodeChainArgs = z.infer<typeof createNodeChainSchema>;\n\ninterface CreatedNode {\n path: string;\n type: string;\n name: string;\n}\n\nexport async function createNodeChainImpl(\n ctx: ToolContext,\n args: CreateNodeChainArgs,\n): Promise<CallToolResult> {\n const created: CreatedNode[] = [];\n const warnings: string[] = [];\n\n for (const node of args.nodes) {\n if (!ctx.knowledge.operatorExists(node.type)) {\n warnings.push(`Operator type \"${node.type}\" was not found in the knowledge base.`);\n }\n }\n\n for (const node of args.nodes) {\n try {\n const ref = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: node.type,\n name: node.name,\n parameters: node.parameters,\n });\n created.push({\n path: ref.path,\n type: ref.type || node.type,\n name: ref.name || node.name || \"\",\n });\n } catch (err) {\n return errorResult(\n `Stopped after creating ${created.length}/${args.nodes.length} node(s). ` +\n `Failed to create \"${node.type}\": ${friendlyTdError(err)}. ` +\n `Created so far: ${created.map((c) => c.path).join(\", \") || \"(none)\"}. ` +\n \"No nodes were deleted.\",\n );\n }\n }\n\n const connections: Array<{ from: string; to: string; method: string }> = [];\n if (args.connect_sequentially && created.length > 1) {\n for (let i = 0; i < created.length - 1; i++) {\n const from = created[i];\n const to = created[i + 1];\n if (!from || !to) continue;\n try {\n const result = await connectNodesViaBridge(ctx.client, from.path, to.path);\n connections.push({ from: from.path, to: to.path, method: result.method });\n } catch (err) {\n warnings.push(`Failed to connect ${from.path} → ${to.path}: ${friendlyTdError(err)}`);\n }\n }\n }\n\n const edges: LayoutEdge[] = [];\n if (args.connect_sequentially) {\n for (let i = 0; i < created.length - 1; i++) {\n const from = created[i];\n const to = created[i + 1];\n if (from && to) edges.push({ from: from.path, to: to.path });\n }\n }\n const positions = computeDataflowLayout(\n created.map((c) => c.path),\n edges,\n );\n if (Object.keys(positions).length > 0) {\n try {\n await ctx.client.executePythonScript(layoutScript(positions), false);\n } catch (err) {\n warnings.push(`Auto-layout skipped: ${friendlyTdError(err)}`);\n }\n }\n\n return jsonResult(\n `Created ${created.length} node(s) and ${connections.length} connection(s) under ${args.parent_path}.`,\n { created, connections, warnings },\n );\n}\n\nexport const registerCreateNodeChain: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_node_chain\",\n {\n title: \"Create node chain\",\n description:\n \"Create multiple nodes and (optionally) connect them in sequence. Returns all created paths; on failure it stops and reports partial progress without deleting anything.\",\n inputSchema: createNodeChainSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createNodeChainImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst TYPE_MAP = {\n text: \"textDAT\",\n execute: \"executeDAT\",\n script: \"scriptDAT\",\n} as const;\n\nexport const createPythonScriptSchema = z.object({\n parent_path: z.string().describe(\"Parent COMP to create the DAT inside.\"),\n name: z.string().optional(),\n code: z.string().min(1).describe(\"Python source to place in the DAT.\"),\n dat_type: z\n .enum([\"text\", \"execute\", \"script\"])\n .default(\"text\")\n .describe(\"Kind of DAT: 'text' (plain), 'execute' (event hooks), or 'script' (table builder).\"),\n});\ntype CreatePythonScriptArgs = z.infer<typeof createPythonScriptSchema>;\n\nexport async function createPythonScriptImpl(ctx: ToolContext, args: CreatePythonScriptArgs) {\n return guardTd(\n async () => {\n const dat = await ctx.client.createNode({\n parent_path: args.parent_path,\n type: TYPE_MAP[args.dat_type],\n name: args.name,\n });\n const path = JSON.stringify(dat.path);\n const code = JSON.stringify(args.code);\n // A Script DAT's own .text is read-only (\"operator is not editable\").\n // Creating a scriptDAT auto-creates a companion text-editable callbacks\n // DAT (<name>_callbacks) referenced by its `callbacks` parameter, so the\n // code must be written there. text/execute DATs are .text-editable.\n const script =\n args.dat_type === \"script\"\n ? [\n `_op = op(${path})`,\n \"_cb = None\",\n \"try:\",\n \" _cb = _op.par.callbacks.eval()\",\n \"except Exception:\",\n \" _cb = None\",\n \"if _cb is None:\",\n \" _cb = _op.parent().op(_op.name + '_callbacks')\",\n `_cb.text = ${code}`,\n ].join(\"\\n\")\n : `op(${path}).text = ${code}`;\n await ctx.client.executePythonScript(script, false);\n return dat;\n },\n (dat) => jsonResult(`Created ${args.dat_type} DAT at ${dat.path}.`, { node: dat }),\n );\n}\n\nexport const registerCreatePythonScript: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_python_script\",\n {\n title: \"Create Python DAT\",\n description: \"Create a DAT (text/execute/script) preloaded with Python code.\",\n inputSchema: createPythonScriptSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createPythonScriptImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst q = (value: string): string => JSON.stringify(value);\n\nexport const duplicateNetworkSchema = z.object({\n source_path: z.string().describe(\"Path of the node/COMP to duplicate.\"),\n name: z.string().optional().describe(\"Name for the copy (auto-generated if omitted).\"),\n parent_path: z\n .string()\n .optional()\n .describe(\"Where to place the copy (defaults to the source's parent).\"),\n});\ntype DuplicateNetworkArgs = z.infer<typeof duplicateNetworkSchema>;\n\nexport async function duplicateNetworkImpl(ctx: ToolContext, args: DuplicateNetworkArgs) {\n const script = [\n `src = op(${q(args.source_path)})`,\n `if src is None: raise Exception('source not found: ' + ${q(args.source_path)})`,\n args.parent_path ? `parent = op(${q(args.parent_path)})` : \"parent = src.parent()\",\n \"if parent is None: raise Exception('parent not found')\",\n args.name ? `new = parent.copy(src, name=${q(args.name)})` : \"new = parent.copy(src)\",\n \"result = new.path\",\n ].join(\"\\n\");\n\n return guardTd(\n () => ctx.client.executePythonScript(script, true),\n (res) =>\n jsonResult(`Duplicated ${args.source_path} → ${res.result ?? \"(see stdout)\"}.`, {\n source: args.source_path,\n copy: res.result,\n }),\n );\n}\n\nexport const registerDuplicateNetwork: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"duplicate_network\",\n {\n title: \"Duplicate a network\",\n description:\n \"Copy a node or whole COMP (and its contents) to a new node, optionally into another parent.\",\n inputSchema: duplicateNetworkSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => duplicateNetworkImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { buildPayloadScript, parsePythonReport } from \"../pythonReport.js\";\nimport { errorResult, guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const manageComponentSchema = z.object({\n action: z\n .enum([\"save\", \"load\"])\n .describe(\"save a COMP to a .tox file, or load a .tox into the project.\"),\n file_path: z\n .string()\n .describe(\"Absolute path to the .tox file (e.g. '/Users/me/components/widget.tox').\"),\n comp_path: z\n .string()\n .optional()\n .describe(\"(save) The COMP to save as a reusable .tox component.\"),\n parent_path: z\n .string()\n .default(\"/project1\")\n .describe(\"(load) COMP to place the loaded component inside.\"),\n linked: z\n .boolean()\n .default(false)\n .describe(\n \"(load) Create a live-linked instance (externaltox) that re-reads the file on change, instead of an independent copy.\",\n ),\n name: z\n .string()\n .optional()\n .describe(\"(load, linked) Name for the linked COMP; defaults to the file name.\"),\n create_folders: z\n .boolean()\n .default(false)\n .describe(\"(save) Create the parent folders if they do not exist.\"),\n});\ntype ManageComponentArgs = z.infer<typeof manageComponentSchema>;\n\ninterface ComponentReport {\n action: string;\n file_path: string;\n saved?: string;\n size?: number | null;\n loaded?: string;\n linked?: boolean;\n type?: string;\n children?: string[];\n warnings: string[];\n fatal?: string;\n}\n\n// .tox save/load is a COMP file operation with no structured bridge endpoint.\n// `loadTox` drops an independent copy under the parent; `externaltox` makes a\n// live-linked instance that re-reads the file. The file runs inside TouchDesigner,\n// so paths are on the machine running TD.\nconst COMPONENT_SCRIPT = `\nimport json, base64, traceback, os\n_p = json.loads(base64.b64decode(\"__PAYLOAD_B64__\").decode(\"utf-8\"))\nreport = {\"action\": _p[\"action\"], \"file_path\": _p[\"file_path\"], \"warnings\": []}\ntry:\n _action = _p[\"action\"]; _fp = _p[\"file_path\"]\n if _action == \"save\":\n _c = op(_p.get(\"comp\"))\n if _c is None:\n report[\"fatal\"] = \"COMP not found: \" + str(_p.get(\"comp\"))\n elif not _c.isCOMP:\n report[\"fatal\"] = str(_p.get(\"comp\")) + \" is not a COMP, so it cannot be saved as a .tox.\"\n else:\n _saved = _c.save(_fp, createFolders=bool(_p.get(\"create_folders\")))\n report[\"saved\"] = str(_saved)\n report[\"size\"] = os.path.getsize(_fp) if os.path.isfile(_fp) else None\n elif _action == \"load\":\n if not os.path.isfile(_fp):\n report[\"fatal\"] = \"File not found: \" + _fp\n else:\n _parent = op(_p[\"parent\"])\n if _parent is None:\n report[\"fatal\"] = \"Parent COMP not found: \" + str(_p[\"parent\"])\n elif _p.get(\"linked\"):\n _stem = os.path.splitext(os.path.basename(_fp))[0]\n _new = _parent.create(baseCOMP, _p.get(\"name\") or _stem)\n _new.par.externaltox = _fp\n try:\n _new.par.reinitnet.pulse()\n except Exception:\n pass\n report[\"loaded\"] = _new.path; report[\"linked\"] = True\n report[\"type\"] = _new.type; report[\"children\"] = sorted([c.name for c in _new.children])\n else:\n _new = _parent.loadTox(_fp)\n if _new is None:\n report[\"fatal\"] = \"loadTox produced no component from \" + _fp\n else:\n report[\"loaded\"] = _new.path; report[\"linked\"] = False\n report[\"type\"] = _new.type; report[\"children\"] = sorted([c.name for c in _new.children])\n else:\n report[\"fatal\"] = \"Unknown action: \" + str(_action)\nexcept Exception:\n report[\"fatal\"] = traceback.format_exc().splitlines()[-1]\nprint(json.dumps(report))\n`;\n\nexport function buildComponentScript(payload: object): string {\n return buildPayloadScript(COMPONENT_SCRIPT, payload);\n}\n\nexport async function manageComponentImpl(ctx: ToolContext, args: ManageComponentArgs) {\n if (args.action === \"save\" && !args.comp_path) {\n return errorResult(\"A `comp_path` is required to save a component.\");\n }\n return guardTd(\n async () => {\n const script = buildComponentScript({\n action: args.action,\n file_path: args.file_path,\n comp: args.comp_path ?? null,\n parent: args.parent_path,\n linked: args.linked,\n name: args.name ?? null,\n create_folders: args.create_folders,\n });\n const exec = await ctx.client.executePythonScript(script, true);\n return parsePythonReport<ComponentReport>(exec.stdout);\n },\n (report) => {\n if (report.fatal) {\n return jsonResult(`Component ${report.action} failed: ${report.fatal}`, report);\n }\n const summary =\n report.action === \"save\"\n ? `Saved ${args.comp_path} to ${report.saved}${report.size != null ? ` (${report.size} bytes)` : \"\"}.`\n : `Loaded ${report.loaded}${report.linked ? \" (live-linked)\" : \"\"} from ${report.file_path}${\n report.children?.length ? ` — ${report.children.length} child node(s)` : \"\"\n }.`;\n return jsonResult(summary, report);\n },\n );\n}\n\nexport const registerManageComponent: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"manage_component\",\n {\n title: \"Save / load component (.tox)\",\n description:\n \"Build a reusable component library: save any COMP as a .tox file, or load a .tox back into the project (as an independent copy, or a live-linked instance via `linked`). Paths are on the machine running TouchDesigner.\",\n inputSchema: manageComponentSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => manageComponentImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { buildPayloadScript, parsePythonReport } from \"../pythonReport.js\";\nimport { errorResult, guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const managePresetsSchema = z.object({\n action: z\n .enum([\"store\", \"recall\", \"list\", \"delete\"])\n .describe(\"store a snapshot, recall one, list all, or delete one.\"),\n comp_path: z\n .string()\n .default(\"/project1\")\n .describe(\n \"COMP whose parameter values the preset captures — usually a control-panel container.\",\n ),\n name: z.string().optional().describe(\"Preset name (required for store/recall/delete).\"),\n params: z\n .array(z.string())\n .optional()\n .describe(\n \"Specific custom-parameter names to capture/restore. Defaults to every custom parameter on the COMP.\",\n ),\n});\ntype ManagePresetsArgs = z.infer<typeof managePresetsSchema>;\n\ninterface PresetReport {\n action: string;\n comp: string;\n name?: string;\n captured?: string[];\n restored?: string[];\n deleted?: string;\n presets?: string[];\n warnings: string[];\n fatal?: string;\n}\n\n// Presets live in the COMP's storage under one key, as { presetName: { parName: value } }.\n// Storage persists with the .toe, so snapshots survive a save/reload. Recalling writes\n// values back onto the (constant-mode) custom parameters, which propagates through any\n// bindings created by create_control_panel.\nconst PRESETS_SCRIPT = `\nimport json, base64, traceback\n_p = json.loads(base64.b64decode(\"__PAYLOAD_B64__\").decode(\"utf-8\"))\nKEY = \"tdmcp_presets\"\nreport = {\"action\": _p[\"action\"], \"comp\": _p[\"comp\"], \"warnings\": []}\n_c = op(_p[\"comp\"])\ntry:\n if _c is None:\n report[\"fatal\"] = \"COMP not found: \" + _p[\"comp\"]\n elif not hasattr(_c, \"customPars\"):\n report[\"fatal\"] = _p[\"comp\"] + \" is not a COMP, so it has no custom parameters to snapshot.\"\n else:\n _store = dict(_c.fetch(KEY, {}))\n _action = _p[\"action\"]; _name = _p.get(\"name\")\n if _action == \"list\":\n report[\"presets\"] = sorted(_store.keys())\n elif _action == \"store\":\n _wanted = _p.get(\"params\") or None\n _pars = list(_c.customPars) if _wanted is None else [getattr(_c.par, n, None) for n in _wanted]\n _vals = {}\n for _pr in _pars:\n if _pr is None:\n continue\n _vals[_pr.name] = _pr.eval()\n _store[_name] = _vals; _c.store(KEY, _store)\n report[\"name\"] = _name; report[\"captured\"] = sorted(_vals.keys()); report[\"presets\"] = sorted(_store.keys())\n elif _action == \"recall\":\n if _name not in _store:\n report[\"fatal\"] = \"Preset not found: '%s' (available: %s)\" % (_name, \", \".join(sorted(_store.keys())) or \"none\")\n else:\n _restored = []\n for _nm, _v in _store[_name].items():\n _pr = getattr(_c.par, _nm, None)\n if _pr is None:\n report[\"warnings\"].append(\"Parameter no longer exists: \" + _nm); continue\n if _pr.readOnly:\n report[\"warnings\"].append(\"Parameter is read-only: \" + _nm); continue\n try:\n _pr.val = _v; _restored.append(_nm)\n except Exception:\n report[\"warnings\"].append(\"Could not restore \" + _nm)\n report[\"name\"] = _name; report[\"restored\"] = sorted(_restored)\n elif _action == \"delete\":\n if _name in _store:\n _store.pop(_name, None); _c.store(KEY, _store); report[\"deleted\"] = _name\n else:\n report[\"warnings\"].append(\"Preset not found: \" + str(_name))\n report[\"presets\"] = sorted(_store.keys())\n else:\n report[\"fatal\"] = \"Unknown action: \" + str(_action)\nexcept Exception:\n report[\"fatal\"] = traceback.format_exc().splitlines()[-1]\nprint(json.dumps(report))\n`;\n\nexport function buildPresetsScript(payload: object): string {\n return buildPayloadScript(PRESETS_SCRIPT, payload);\n}\n\nexport async function managePresetsImpl(ctx: ToolContext, args: ManagePresetsArgs) {\n if (args.action !== \"list\" && !args.name) {\n return errorResult(`A preset name is required for the '${args.action}' action.`);\n }\n return guardTd(\n async () => {\n const script = buildPresetsScript({\n action: args.action,\n comp: args.comp_path,\n name: args.name,\n params: args.params ?? null,\n });\n const exec = await ctx.client.executePythonScript(script, true);\n return parsePythonReport<PresetReport>(exec.stdout);\n },\n (report) => {\n if (report.fatal) {\n return jsonResult(`Preset ${report.action} failed: ${report.fatal}`, report);\n }\n let summary: string;\n switch (report.action) {\n case \"store\":\n summary = `Stored preset \"${report.name}\" (${report.captured?.length ?? 0} parameter(s)) on ${report.comp}.`;\n break;\n case \"recall\":\n summary = `Recalled preset \"${report.name}\" (${report.restored?.length ?? 0} parameter(s) restored) on ${report.comp}.`;\n break;\n case \"delete\":\n summary = report.deleted\n ? `Deleted preset \"${report.deleted}\" on ${report.comp}.`\n : `No preset to delete on ${report.comp}.`;\n break;\n default:\n summary = `${report.presets?.length ?? 0} preset(s) on ${report.comp}: ${report.presets?.join(\", \") || \"none\"}.`;\n }\n if (report.warnings.length) summary += ` ${report.warnings.length} warning(s).`;\n return jsonResult(summary, report);\n },\n );\n}\n\nexport const registerManagePresets: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"manage_presets\",\n {\n title: \"Manage presets\",\n description:\n \"Store, recall, list, or delete named snapshots of a COMP's parameter values — the live-performance preset system. Pair with create_control_panel: snapshot the knob positions and jump between looks. Snapshots are saved in the COMP's storage so they persist with the project.\",\n inputSchema: managePresetsSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => managePresetsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst UpdateSchema = z.object({\n path: z.string(),\n parameters: z.record(z.string(), z.unknown()),\n});\n\nexport const setParametersBatchSchema = z.object({\n updates: z\n .array(UpdateSchema)\n .min(1)\n .describe(\n \"List of { path, parameters } updates sent in one batch request (per-update results; not transactional — a failed update does not roll back the others).\",\n ),\n});\ntype SetParametersBatchArgs = z.infer<typeof setParametersBatchSchema>;\n\nexport async function setParametersBatchImpl(ctx: ToolContext, args: SetParametersBatchArgs) {\n return guardTd(\n () =>\n ctx.client.batch(\n args.updates.map((update) => ({\n action: \"update\" as const,\n path: update.path,\n parameters: update.parameters,\n })),\n ),\n (result) => {\n const failed = result.results.filter((r) => !r.ok);\n const okCount = result.results.length - failed.length;\n const summary = failed.length\n ? `Applied ${okCount}/${result.results.length} parameter update(s); ${failed.length} failed (see results).`\n : `Applied ${okCount} parameter update(s) in one batch.`;\n return jsonResult(summary, result);\n },\n );\n}\n\nexport const registerSetParametersBatch: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"set_parameters_batch\",\n {\n title: \"Set parameters (batch)\",\n description:\n \"Update parameters on multiple nodes in a single batch request. Each update reports its own success; a failure does not roll back the others.\",\n inputSchema: setParametersBatchSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => setParametersBatchImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerAnimateParameter } from \"./animateParameter.js\";\nimport { registerArrangeNetwork } from \"./arrangeNetwork.js\";\nimport { registerConnectNodes } from \"./connectNodes.js\";\nimport { registerCreateContainer } from \"./createContainer.js\";\nimport { registerCreateControlPanel } from \"./createControlPanel.js\";\nimport { registerCreateExternalIo } from \"./createExternalIo.js\";\nimport { registerCreateGlslShader } from \"./createGlslShader.js\";\nimport { registerCreateNodeChain } from \"./createNodeChain.js\";\nimport { registerCreatePythonScript } from \"./createPythonScript.js\";\nimport { registerDuplicateNetwork } from \"./duplicateNetwork.js\";\nimport { registerManageComponent } from \"./manageComponent.js\";\nimport { registerManagePresets } from \"./managePresets.js\";\nimport { registerSetParametersBatch } from \"./setParametersBatch.js\";\n\nexport const layer2Registrars: ToolRegistrar[] = [\n registerCreateNodeChain,\n registerConnectNodes,\n registerCreateGlslShader,\n registerCreatePythonScript,\n registerSetParametersBatch,\n registerCreateContainer,\n registerCreateControlPanel,\n registerAnimateParameter,\n registerManagePresets,\n registerManageComponent,\n registerCreateExternalIo,\n registerDuplicateNetwork,\n registerArrangeNetwork,\n];\n","import { z } from \"zod\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const compareTdNodesSchema = z.object({\n path_a: z.string().describe(\"First node path.\"),\n path_b: z.string().describe(\"Second node path.\"),\n only_diff: z\n .boolean()\n .default(true)\n .describe(\"Return only the parameters that differ (true) or also list the identical ones.\"),\n});\ntype CompareTdNodesArgs = z.infer<typeof compareTdNodesSchema>;\n\nexport const compareTdNodesOutputSchema = z.object({\n a: z.string(),\n b: z.string(),\n type_a: z.string(),\n type_b: z.string(),\n type_match: z.boolean(),\n differing_count: z.number(),\n same_count: z.number(),\n differing: z.array(z.object({ param: z.string(), a: z.unknown(), b: z.unknown() })),\n identical: z.array(z.string()).optional(),\n});\n\nexport async function compareTdNodesImpl(ctx: ToolContext, args: CompareTdNodesArgs) {\n return guardTd(\n async () => {\n const [a, b] = await Promise.all([\n ctx.client.getNode(args.path_a),\n ctx.client.getNode(args.path_b),\n ]);\n return { a, b };\n },\n ({ a, b }) => {\n const keys = new Set([...Object.keys(a.parameters), ...Object.keys(b.parameters)]);\n const differing: Array<{ param: string; a: unknown; b: unknown }> = [];\n const identical: string[] = [];\n for (const key of [...keys].sort()) {\n const va = a.parameters[key];\n const vb = b.parameters[key];\n if (JSON.stringify(va) === JSON.stringify(vb)) identical.push(key);\n else differing.push({ param: key, a: va, b: vb });\n }\n const data: Record<string, unknown> = {\n a: a.path,\n b: b.path,\n type_a: a.type,\n type_b: b.type,\n type_match: a.type === b.type,\n differing_count: differing.length,\n same_count: identical.length,\n differing,\n };\n if (!args.only_diff) data.identical = identical;\n return structuredResult(\n `${differing.length} differing parameter(s) between ${a.path} and ${b.path}${a.type === b.type ? \"\" : ` (types differ: ${a.type} vs ${b.type})`}.`,\n data,\n );\n },\n );\n}\n\nexport const registerCompareTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"compare_td_nodes\",\n {\n title: \"Compare two nodes\",\n description:\n \"Diff the parameters of two nodes, returning only the values that differ (by default). Useful for aligning settings across similar operators.\",\n inputSchema: compareTdNodesSchema.shape,\n outputSchema: compareTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => compareTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const createTdNodeSchema = z.object({\n parent_path: z\n .string()\n .default(\"/project1\")\n .describe(\"Parent COMP path to create the node inside.\"),\n type: z\n .string()\n .describe(\"Operator type string, e.g. 'noiseTOP', 'feedbackTOP', 'nullTOP', 'constantCHOP'.\"),\n name: z.string().optional().describe(\"Optional node name (auto-generated if omitted).\"),\n parameters: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Optional initial parameter overrides as key→value pairs.\"),\n});\ntype CreateTdNodeArgs = z.infer<typeof createTdNodeSchema>;\n\nexport async function createTdNodeImpl(ctx: ToolContext, args: CreateTdNodeArgs) {\n const warnings: string[] = [];\n if (!ctx.knowledge.operatorExists(args.type)) {\n const suggestions = ctx.knowledge.searchOperators(args.type, 3).map((s) => s.name);\n warnings.push(\n `Operator type \"${args.type}\" was not found in the knowledge base.${\n suggestions.length ? ` Did you mean: ${suggestions.join(\", \")}?` : \"\"\n }`,\n );\n }\n return guardTd(\n () =>\n ctx.client.createNode({\n parent_path: args.parent_path,\n type: args.type,\n name: args.name,\n parameters: args.parameters,\n }),\n (node) => {\n const allWarnings = [...warnings];\n if (node.parameter_warnings?.length) {\n allWarnings.push(\n `These parameter(s) were not applied (unknown name or bad value): ${node.parameter_warnings.join(\", \")}.`,\n );\n }\n return jsonResult(`Created ${node.type || args.type} at ${node.path}.`, {\n node,\n warnings: allWarnings,\n });\n },\n );\n}\n\nexport const registerCreateTdNode: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"create_td_node\",\n {\n title: \"Create TouchDesigner node\",\n description:\n \"Create a single operator (node) inside a parent COMP. Validates the operator type against the knowledge base and warns (without blocking) on unknown types.\",\n inputSchema: createTdNodeSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => createTdNodeImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const deleteTdNodeSchema = z.object({\n path: z.string().describe(\"Full path of the node to delete, e.g. '/project1/noise1'.\"),\n});\ntype DeleteTdNodeArgs = z.infer<typeof deleteTdNodeSchema>;\n\nexport async function deleteTdNodeImpl(ctx: ToolContext, args: DeleteTdNodeArgs) {\n return guardTd(\n () => ctx.client.deleteNode(args.path),\n (result) => jsonResult(`Deleted ${result.deleted}.`, result),\n );\n}\n\nexport const registerDeleteTdNode: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"delete_td_node\",\n {\n title: \"Delete TouchDesigner node\",\n description:\n \"Delete a single node by path. Destructive — only call this when the user explicitly asks to remove a node.\",\n inputSchema: deleteTdNodeSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => deleteTdNodeImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const execNodeMethodSchema = z.object({\n path: z.string().describe(\"Full path of the node to call the method on.\"),\n method: z.string().describe(\"Method name to call, e.g. 'cook', 'par', 'destroy', 'copy'.\"),\n args: z.array(z.unknown()).default([]).describe(\"Positional arguments.\"),\n kwargs: z.record(z.string(), z.unknown()).default({}).describe(\"Keyword arguments.\"),\n});\ntype ExecNodeMethodArgs = z.infer<typeof execNodeMethodSchema>;\n\nexport async function execNodeMethodImpl(ctx: ToolContext, args: ExecNodeMethodArgs) {\n return guardTd(\n () => ctx.client.execNodeMethod(args.path, args.method, args.args, args.kwargs),\n (result) => jsonResult(`Called ${args.path}.${args.method}().`, result),\n );\n}\n\nexport const registerExecNodeMethod: ToolRegistrar = (server, ctx) => {\n if (ctx.allowRawPython === false) return;\n server.registerTool(\n \"exec_node_method\",\n {\n title: \"Call node method\",\n description:\n \"Escape hatch — invoke an arbitrary Python method on a node (operator). Prefer structured tools where one exists; use this for operations they don't cover (e.g. .cook(), .copy(), .destroy()).\",\n inputSchema: execNodeMethodSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => execNodeMethodImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const executePythonScriptSchema = z.object({\n script: z\n .string()\n .min(1)\n .describe(\n \"Python source to execute inside TouchDesigner (runs in the TD process, not locally).\",\n ),\n return_output: z\n .boolean()\n .default(true)\n .describe(\"Capture stdout / the value of the last expression and return it.\"),\n});\ntype ExecutePythonScriptArgs = z.infer<typeof executePythonScriptSchema>;\n\nexport async function executePythonScriptImpl(ctx: ToolContext, args: ExecutePythonScriptArgs) {\n return guardTd(\n () => ctx.client.executePythonScript(args.script, args.return_output),\n (result) => jsonResult(\"Python executed in TouchDesigner.\", result),\n );\n}\n\nexport const registerExecutePythonScript: ToolRegistrar = (server, ctx) => {\n if (ctx.allowRawPython === false) return;\n server.registerTool(\n \"execute_python_script\",\n {\n title: \"Execute Python in TouchDesigner\",\n description:\n \"Escape hatch — run an arbitrary Python script inside the TouchDesigner process. Prefer the structured tools (find_td_nodes, get_td_node_parameters, update_td_node_parameters, summarize_td_errors, snapshot_td_graph, …); reach for this only when no structured tool can express the operation. Code runs in TD only, never on the local machine.\",\n inputSchema: executePythonScriptSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },\n },\n (args) => executePythonScriptImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeRefSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { globToRegExp } from \"./nodeMatch.js\";\n\nexport const findTdNodesSchema = z.object({\n parent_path: z.string().default(\"/project1\").describe(\"Where to search from.\"),\n pattern: z\n .string()\n .optional()\n .describe(\"Case-insensitive name/path filter with '*' wildcards (e.g. 'text*', '*noise*').\"),\n type: z\n .string()\n .optional()\n .describe(\"Case-insensitive operator-type substring (e.g. 'TOP', 'noise').\"),\n recursive: z\n .boolean()\n .default(true)\n .describe(\"Search the whole sub-network (true) or only direct children (false).\"),\n path_only: z.boolean().default(false).describe(\"Return only matching paths.\"),\n limit: z.number().int().positive().default(50).describe(\"Max matches to return.\"),\n});\ntype FindTdNodesArgs = z.infer<typeof findTdNodesSchema>;\n\nexport const findTdNodesOutputSchema = z.object({\n parent_path: z.string(),\n recursive: z.boolean(),\n count: z.number(),\n truncated: z.boolean(),\n paths: z.array(z.string()).optional(),\n matches: z.array(NodeRefSchema).optional(),\n});\n\nexport async function findTdNodesImpl(ctx: ToolContext, args: FindTdNodesArgs) {\n const fetch = args.recursive\n ? async () => (await ctx.client.getNetworkTopology(args.parent_path, true)).nodes\n : async () => (await ctx.client.getNodes(args.parent_path)).nodes;\n\n return guardTd(fetch, (allNodes) => {\n let nodes = allNodes;\n if (args.pattern) {\n const re = globToRegExp(args.pattern);\n nodes = nodes.filter((n) => re.test(n.name) || re.test(n.path));\n }\n if (args.type) {\n const t = args.type.toLowerCase();\n nodes = nodes.filter((n) => n.type.toLowerCase().includes(t));\n }\n const count = nodes.length;\n const truncated = count > args.limit;\n nodes = nodes.slice(0, args.limit);\n const summary = `${count} match(es) under ${args.parent_path}${truncated ? ` (showing ${args.limit})` : \"\"}.`;\n const base = { parent_path: args.parent_path, recursive: args.recursive, count, truncated };\n return args.path_only\n ? structuredResult(summary, { ...base, paths: nodes.map((n) => n.path) })\n : structuredResult(summary, { ...base, matches: nodes });\n });\n}\n\nexport const registerFindTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"find_td_nodes\",\n {\n title: \"Find TouchDesigner nodes\",\n description:\n \"Search a network for nodes by name pattern and/or operator type. Recursive by default; pass path_only:true for a compact path list. Prefer this over get_td_nodes when you are looking for specific nodes.\",\n inputSchema: findTdNodesSchema.shape,\n outputSchema: findTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => findTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\n\n/** Standard response envelope every bridge endpoint returns. */\nexport const ApiEnvelopeSchema = z.object({\n ok: z.boolean(),\n data: z.unknown().optional(),\n error: z.object({ code: z.string().optional(), message: z.string() }).optional(),\n});\nexport type ApiEnvelope = z.infer<typeof ApiEnvelopeSchema>;\n\nexport const NodeRefSchema = z.object({\n path: z.string(),\n type: z.string().default(\"\"),\n name: z.string().default(\"\"),\n /** Parameters that could not be applied at create time (unknown name or bad value). */\n parameter_warnings: z.array(z.string()).optional(),\n});\nexport type TdNodeRef = z.infer<typeof NodeRefSchema>;\n\nexport const NodeDetailSchema = NodeRefSchema.extend({\n parameters: z.record(z.string(), z.unknown()).default({}),\n inputs: z.array(z.string()).optional(),\n outputs: z.array(z.string()).optional(),\n family: z.string().optional(),\n errors: z.array(z.string()).optional(),\n});\nexport type TdNodeDetail = z.infer<typeof NodeDetailSchema>;\n\nexport const NodeListSchema = z.object({ nodes: z.array(NodeRefSchema).default([]) });\nexport type TdNodeList = z.infer<typeof NodeListSchema>;\n\nexport const InfoSchema = z.object({\n td_version: z.string().optional(),\n python_version: z.string().optional(),\n build: z.string().optional(),\n bridge_version: z.string().optional(),\n project: z.string().optional(),\n});\nexport type TdInfo = z.infer<typeof InfoSchema>;\n\nexport const NodeErrorSchema = z.object({\n path: z.string(),\n message: z.string(),\n type: z.string().optional(),\n});\nexport type TdNodeError = z.infer<typeof NodeErrorSchema>;\n\nexport const NodeErrorsSchema = z.object({ errors: z.array(NodeErrorSchema).default([]) });\nexport type TdNodeErrors = z.infer<typeof NodeErrorsSchema>;\n\nexport const PreviewSchema = z.object({\n path: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n format: z.string().default(\"png\"),\n base64: z.string(),\n});\nexport type TdPreview = z.infer<typeof PreviewSchema>;\n\nexport const ExecResultSchema = z.object({\n result: z.unknown().optional(),\n stdout: z.string().optional(),\n printed: z.array(z.string()).optional(),\n});\nexport type TdExecResult = z.infer<typeof ExecResultSchema>;\n\nexport const MethodResultSchema = z.object({ result: z.unknown() });\nexport type TdMethodResult = z.infer<typeof MethodResultSchema>;\n\nexport const DeleteResultSchema = z.object({ deleted: z.string() });\nexport type TdDeleteResult = z.infer<typeof DeleteResultSchema>;\n\nexport const ConnectionSchema = z.object({\n source_path: z.string(),\n source_output: z.number().int().default(0),\n target_path: z.string(),\n target_input: z.number().int().default(0),\n});\nexport type TdConnection = z.infer<typeof ConnectionSchema>;\n\nexport const TopologySchema = z.object({\n nodes: z.array(NodeRefSchema).default([]),\n connections: z.array(ConnectionSchema).default([]),\n});\nexport type TdTopology = z.infer<typeof TopologySchema>;\n\nexport const PerformanceSchema = z.object({\n nodes: z\n .array(\n z.object({\n path: z.string(),\n cook_time_ms: z.number().default(0),\n cook_count: z.number().optional(),\n }),\n )\n .default([]),\n total_cook_time_ms: z.number().optional(),\n gpu_memory_mb: z.number().optional(),\n});\nexport type TdPerformance = z.infer<typeof PerformanceSchema>;\n\nexport const BatchOpResultSchema = z.object({\n action: z.string(),\n ok: z.boolean(),\n path: z.string().optional(),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\nexport const BatchResultSchema = z.object({ results: z.array(BatchOpResultSchema).default([]) });\nexport type TdBatchResult = z.infer<typeof BatchResultSchema>;\n\n/** Input shape for creating a node (used by the client and Layer 3 tool). */\nexport const CreateNodeInputSchema = z.object({\n parent_path: z.string(),\n type: z.string(),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n});\nexport type CreateNodeInput = z.infer<typeof CreateNodeInputSchema>;\n\n/** A single atomic operation accepted by `POST /api/batch`. */\nexport const BatchOperationSchema = z.discriminatedUnion(\"action\", [\n z.object({\n action: z.literal(\"create\"),\n parent_path: z.string(),\n type: z.string(),\n name: z.string().optional(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n }),\n z.object({\n action: z.literal(\"update\"),\n path: z.string(),\n parameters: z.record(z.string(), z.unknown()),\n }),\n z.object({ action: z.literal(\"delete\"), path: z.string() }),\n z.object({\n action: z.literal(\"connect\"),\n source_path: z.string(),\n target_path: z.string(),\n source_output: z.number().int().default(0),\n target_input: z.number().int().default(0),\n }),\n]);\nexport type TdBatchOperation = z.infer<typeof BatchOperationSchema>;\n","/** Turns a `*`-glob into a case-insensitive RegExp (other regex metachars are escaped). */\nexport function globToRegExp(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(escaped, \"i\");\n}\n\n/** The parent path of a TD node path, e.g. `/project1/moviein1` -> `/project1`. */\nexport function parentOf(path: string): string {\n const idx = path.lastIndexOf(\"/\");\n return idx <= 0 ? \"/\" : path.slice(0, idx);\n}\n","import { z } from \"zod\";\nimport { jsonResult, textResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getModuleHelpSchema = z.object({\n name: z.string().describe(\"Class or module name to get help for, e.g. 'OP', 'App', 'Project'.\"),\n});\ntype GetModuleHelpArgs = z.infer<typeof getModuleHelpSchema>;\n\nexport function getModuleHelpImpl(ctx: ToolContext, args: GetModuleHelpArgs) {\n const cls = ctx.knowledge.getPythonClass(args.name);\n if (!cls) {\n const suggestions = ctx.knowledge\n .listPythonClasses()\n .filter((c) => c.className.toLowerCase().includes(args.name.toLowerCase()))\n .slice(0, 5)\n .map((c) => c.className);\n return jsonResult(`No help found for \"${args.name}\".`, { found: false, suggestions });\n }\n\n const lines: string[] = [`# ${cls.displayName || cls.className}`, \"\"];\n if (cls.description) lines.push(cls.description, \"\");\n if (cls.members && cls.members.length > 0) {\n lines.push(\"## Members\");\n for (const m of cls.members) {\n const ro = m.readOnly ? \" (read-only)\" : \"\";\n lines.push(`- ${m.name}${m.returnType ? `: ${m.returnType}` : \"\"}${ro}`);\n }\n lines.push(\"\");\n }\n if (cls.methods && cls.methods.length > 0) {\n lines.push(\"## Methods\");\n for (const method of cls.methods) {\n const sig = method.signature || method.name || \"\";\n lines.push(`- ${sig}${method.returns ? ` -> ${method.returns}` : \"\"}`);\n }\n }\n return textResult(lines.join(\"\\n\"));\n}\n\nexport const registerGetModuleHelp: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_module_help\",\n {\n title: \"Get module/class help\",\n description:\n \"Human-readable help (description, members, method signatures) for a TouchDesigner Python class or module, from the knowledge base.\",\n inputSchema: getModuleHelpSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getModuleHelpImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdClassDetailsSchema = z.object({\n class_name: z.string().describe(\"Python class name, e.g. 'OP', 'TOP', 'App', 'CHOP'.\"),\n});\ntype GetTdClassDetailsArgs = z.infer<typeof getTdClassDetailsSchema>;\n\nexport function getTdClassDetailsImpl(ctx: ToolContext, args: GetTdClassDetailsArgs) {\n const cls = ctx.knowledge.getPythonClass(args.class_name);\n if (!cls) {\n const suggestions = ctx.knowledge\n .listPythonClasses()\n .filter((c) => c.className.toLowerCase().includes(args.class_name.toLowerCase()))\n .slice(0, 5)\n .map((c) => c.className);\n return structuredResult(`Python class \"${args.class_name}\" not found.`, {\n found: false,\n suggestions,\n });\n }\n return structuredResult(\n `${cls.className} — ${cls.methods?.length ?? 0} methods, ${cls.members?.length ?? 0} members.`,\n cls,\n );\n}\n\nexport const registerGetTdClassDetails: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_class_details\",\n {\n title: \"Get TD Python class details\",\n description:\n \"Full documentation for one TouchDesigner Python class (members + methods) from the knowledge base.\",\n inputSchema: getTdClassDetailsSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getTdClassDetailsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdClassesSchema = z.object({\n filter: z\n .string()\n .optional()\n .describe(\"Optional case-insensitive substring to filter class names by.\"),\n});\ntype GetTdClassesArgs = z.infer<typeof getTdClassesSchema>;\n\nexport function getTdClassesImpl(ctx: ToolContext, args: GetTdClassesArgs) {\n let classes = ctx.knowledge.listPythonClasses();\n if (args.filter) {\n const needle = args.filter.toLowerCase();\n classes = classes.filter(\n (c) =>\n c.className.toLowerCase().includes(needle) || c.displayName.toLowerCase().includes(needle),\n );\n }\n return structuredResult(`Found ${classes.length} TouchDesigner Python API class(es).`, {\n classes,\n });\n}\n\nexport const registerGetTdClasses: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_classes\",\n {\n title: \"List TD Python classes\",\n description:\n \"List TouchDesigner Python API classes from the embedded knowledge base (works offline). Optionally filter by name.\",\n inputSchema: getTdClassesSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: false },\n },\n (args) => getTdClassesImpl(ctx, args),\n );\n};\n","import { friendlyTdError } from \"../../td-client/types.js\";\nimport { jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nconst DESCRIPTION =\n \"Health check + TouchDesigner server info. Returns TD/Python version and bridge status when connected, plus the embedded knowledge-base stats. Use this first to confirm the bridge is reachable.\";\n\nexport async function getTdInfoImpl(ctx: ToolContext) {\n const knowledge = ctx.knowledge.stats();\n try {\n const info = await ctx.client.getInfo();\n return jsonResult(\"TouchDesigner is connected.\", {\n connected: true,\n endpoint: ctx.client.endpoint,\n touchdesigner: info,\n knowledge,\n });\n } catch (err) {\n return jsonResult(\"TouchDesigner is not reachable (the server is still running).\", {\n connected: false,\n endpoint: ctx.client.endpoint,\n reason: friendlyTdError(err),\n knowledge,\n });\n }\n}\n\nexport const registerGetTdInfo: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_info\",\n {\n title: \"Get TouchDesigner info\",\n description: DESCRIPTION,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n () => getTdInfoImpl(ctx),\n );\n};\n","import { z } from \"zod\";\nimport { NodeErrorSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdNodeErrorsSchema = z.object({\n path: z.string().describe(\"Full path of the node (or network root) to check for errors.\"),\n recursive: z\n .boolean()\n .default(false)\n .describe(\"If true, check the whole network under `path`; otherwise just that node.\"),\n summary: z\n .boolean()\n .default(false)\n .describe(\"Return only counts grouped by error type instead of the full error list.\"),\n});\ntype GetTdNodeErrorsArgs = z.infer<typeof getTdNodeErrorsSchema>;\n\nexport const getTdNodeErrorsOutputSchema = z.object({\n path: z.string(),\n total: z.number(),\n errors: z.array(NodeErrorSchema).optional(),\n by_type: z.record(z.string(), z.number()).optional(),\n});\n\nexport async function getTdNodeErrorsImpl(ctx: ToolContext, args: GetTdNodeErrorsArgs) {\n return guardTd(\n () =>\n args.recursive ? ctx.client.getNetworkErrors(args.path) : ctx.client.getNodeErrors(args.path),\n (result) => {\n const errors = result.errors;\n const total = errors.length;\n const none = total === 0;\n if (args.summary) {\n const byType: Record<string, number> = {};\n for (const e of errors) {\n const key = e.type || \"error\";\n byType[key] = (byType[key] ?? 0) + 1;\n }\n return structuredResult(\n none ? `No errors found at ${args.path}.` : `${total} error(s) at ${args.path}.`,\n { path: args.path, total, by_type: byType },\n );\n }\n return structuredResult(\n none ? `No errors found at ${args.path}.` : `Found ${total} error(s) at ${args.path}.`,\n { path: args.path, total, errors },\n );\n },\n );\n}\n\nexport const registerGetTdNodeErrors: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_node_errors\",\n {\n title: \"Get node errors\",\n description:\n \"Check a node (or its whole sub-network) for cook/compile errors and warnings. Pass `summary:true` for grouped counts instead of the full list.\",\n inputSchema: getTdNodeErrorsSchema.shape,\n outputSchema: getTdNodeErrorsOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodeErrorsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeDetailSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdNodeParametersSchema = z.object({\n path: z.string().describe(\"Full path of the node to inspect.\"),\n keys: z\n .array(z.string())\n .optional()\n .describe(\"Only return these parameter names (case-sensitive). Omit to return all parameters.\"),\n omit_io: z\n .boolean()\n .default(false)\n .describe(\"Drop the inputs/outputs lists from the result to save context.\"),\n});\ntype GetTdNodeParametersArgs = z.infer<typeof getTdNodeParametersSchema>;\n\nexport async function getTdNodeParametersImpl(ctx: ToolContext, args: GetTdNodeParametersArgs) {\n return guardTd(\n () => ctx.client.getNode(args.path),\n (node) => {\n let parameters = node.parameters;\n if (args.keys && args.keys.length > 0) {\n const wanted = new Set(args.keys);\n parameters = Object.fromEntries(\n Object.entries(node.parameters).filter(([k]) => wanted.has(k)),\n );\n }\n const data: Record<string, unknown> = {\n path: node.path,\n type: node.type,\n name: node.name,\n parameters,\n };\n if (!args.omit_io) {\n data.inputs = node.inputs;\n data.outputs = node.outputs;\n }\n const count = Object.keys(parameters).length;\n return structuredResult(`${count} parameter(s) for ${node.path} (${node.type}).`, data);\n },\n );\n}\n\nexport const registerGetTdNodeParameters: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_node_parameters\",\n {\n title: \"Get node parameters\",\n description:\n \"Read the current parameters (and I/O) of a node. Pass `keys` to project specific parameters or `omit_io:true` to drop the inputs/outputs lists.\",\n inputSchema: getTdNodeParametersSchema.shape,\n outputSchema: NodeDetailSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodeParametersImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { NodeRefSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { globToRegExp } from \"./nodeMatch.js\";\n\nexport const getTdNodesSchema = z.object({\n parent_path: z\n .string()\n .default(\"/project1\")\n .describe(\"Parent COMP whose direct children should be listed.\"),\n pattern: z\n .string()\n .optional()\n .describe(\n \"Case-insensitive filter on node name/path. Supports '*' wildcards (e.g. 'text*', '*noise*').\",\n ),\n path_only: z\n .boolean()\n .default(false)\n .describe(\"Return only the list of node paths, dropping type/name.\"),\n limit: z.number().int().positive().optional().describe(\"Cap the number of nodes returned.\"),\n detail_level: z\n .enum([\"summary\", \"full\"])\n .default(\"summary\")\n .describe(\n \"'summary' (default) returns a count, a type breakdown and the first few paths; 'full' returns every node. Use 'full' (or path_only) when you need the complete list.\",\n ),\n});\ntype GetTdNodesArgs = z.infer<typeof getTdNodesSchema>;\n\nconst SAMPLE_SIZE = 10;\n\nexport const getTdNodesOutputSchema = z.object({\n parent_path: z.string(),\n count: z.number(),\n detail_level: z.enum([\"summary\", \"full\"]),\n truncated: z.boolean(),\n by_type: z.record(z.string(), z.number()).optional(),\n sample: z.array(z.string()).optional(),\n paths: z.array(z.string()).optional(),\n nodes: z.array(NodeRefSchema).optional(),\n hint: z.string().optional(),\n});\n\nexport async function getTdNodesImpl(ctx: ToolContext, args: GetTdNodesArgs) {\n return guardTd(\n () => ctx.client.getNodes(args.parent_path),\n (list) => {\n let nodes = list.nodes;\n if (args.pattern) {\n const re = globToRegExp(args.pattern);\n nodes = nodes.filter((n) => re.test(n.name) || re.test(n.path));\n }\n const matched = nodes.length;\n const truncated = args.limit !== undefined && matched > args.limit;\n if (args.limit !== undefined) nodes = nodes.slice(0, args.limit);\n const where = args.pattern ? ` matching \"${args.pattern}\"` : \"\";\n const base = {\n parent_path: args.parent_path,\n count: matched,\n detail_level: args.detail_level,\n truncated,\n };\n\n if (args.path_only) {\n return structuredResult(`${matched} node(s) under ${args.parent_path}${where}.`, {\n ...base,\n paths: nodes.map((n) => n.path),\n });\n }\n\n if (args.detail_level === \"summary\") {\n const byType: Record<string, number> = {};\n for (const n of nodes) {\n const key = n.type || \"unknown\";\n byType[key] = (byType[key] ?? 0) + 1;\n }\n const sample = nodes.slice(0, SAMPLE_SIZE).map((n) => n.path);\n return structuredResult(\n `${matched} node(s) under ${args.parent_path}${where}. Summary only — pass detail_level:\"full\" or path_only:true for the full list.`,\n {\n ...base,\n by_type: byType,\n sample,\n ...(matched > sample.length\n ? {\n hint: `Showing first ${sample.length} of ${matched}. Use detail_level:\"full\" for all.`,\n }\n : {}),\n },\n );\n }\n\n return structuredResult(`${matched} node(s) under ${args.parent_path}${where}.`, {\n ...base,\n nodes,\n });\n },\n );\n}\n\nexport const registerGetTdNodes: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_nodes\",\n {\n title: \"List TouchDesigner nodes\",\n description:\n 'List the direct child nodes of a COMP. Defaults to a compact summary (count + type breakdown + sample paths); pass detail_level:\"full\" or path_only:true for the complete list, and `pattern` to filter by name.',\n inputSchema: getTdNodesSchema.shape,\n outputSchema: getTdNodesOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdNodesImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { checkPerformance } from \"../../feedback/performanceMonitor.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdPerformanceSchema = z.object({\n root_path: z.string().default(\"/project1\").describe(\"Network root to measure cook times under.\"),\n target_fps: z\n .number()\n .positive()\n .default(60)\n .describe(\"Frame-rate target used to flag slow nodes.\"),\n recursive: z\n .boolean()\n .default(true)\n .describe(\n \"Measure every descendant (true, default) so cook time inside generated containers is counted, not just the root's direct children.\",\n ),\n});\ntype GetTdPerformanceArgs = z.infer<typeof getTdPerformanceSchema>;\n\nexport const getTdPerformanceOutputSchema = z.object({\n path: z.string(),\n targetFps: z.number(),\n frameBudgetMs: z.number(),\n totalCookMs: z.number(),\n nodes: z.array(\n z.object({\n path: z.string(),\n cook_time_ms: z.number(),\n cook_count: z.number().optional(),\n }),\n ),\n warnings: z.array(z.string()),\n});\n\nexport async function getTdPerformanceImpl(ctx: ToolContext, args: GetTdPerformanceArgs) {\n return guardTd(\n () => checkPerformance(ctx.client, args.root_path, args.target_fps, args.recursive),\n (report) =>\n structuredResult(\n report.warnings.length === 0\n ? `Within budget: ${report.totalCookMs.toFixed(2)}ms total under ${args.root_path} (${args.target_fps}fps).`\n : `${report.warnings.length} performance warning(s) under ${args.root_path}.`,\n report,\n ),\n );\n}\n\nexport const registerGetTdPerformance: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_performance\",\n {\n title: \"Get network performance\",\n description:\n \"Report cook times under a network (recursively by default, slowest node first) and warn about nodes that exceed the frame budget.\",\n inputSchema: getTdPerformanceSchema.shape,\n outputSchema: getTdPerformanceOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdPerformanceImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\n\nexport interface PerformanceReport {\n path: string;\n targetFps: number;\n frameBudgetMs: number;\n totalCookMs: number;\n nodes: Array<{ path: string; cook_time_ms: number; cook_count?: number }>;\n warnings: string[];\n}\n\n/**\n * Reports cook times against the frame budget implied by `targetFps`. `recursive`\n * measures every descendant (so cook time inside generated containers is counted, not\n * just the root's direct children). Nodes are returned slowest-first.\n */\nexport async function checkPerformance(\n client: TouchDesignerClient,\n path: string,\n targetFps = 60,\n recursive = true,\n): Promise<PerformanceReport> {\n const perf = await client.getNetworkPerformance(path, recursive);\n const frameBudgetMs = 1000 / targetFps;\n const warnings: string[] = [];\n\n for (const node of perf.nodes) {\n if (node.cook_time_ms > frameBudgetMs) {\n warnings.push(\n `${node.path} cooks in ${node.cook_time_ms.toFixed(2)}ms, exceeding the ${frameBudgetMs.toFixed(2)}ms budget at ${targetFps}fps.`,\n );\n }\n }\n\n const totalCookMs =\n perf.total_cook_time_ms ?? perf.nodes.reduce((sum, node) => sum + node.cook_time_ms, 0);\n if (totalCookMs > frameBudgetMs) {\n warnings.push(\n `Total cook time ${totalCookMs.toFixed(2)}ms exceeds the ${frameBudgetMs.toFixed(2)}ms budget at ${targetFps}fps.`,\n );\n }\n\n // Surface the slowest nodes first so the real bottlenecks are obvious.\n const nodes = [...perf.nodes].sort((a, b) => b.cook_time_ms - a.cook_time_ms);\n return { path, targetFps, frameBudgetMs, totalCookMs, nodes, warnings };\n}\n","import { z } from \"zod\";\nimport { verifyNetwork } from \"../../feedback/networkVerifier.js\";\nimport { TopologySchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const getTdTopologySchema = z.object({\n root_path: z.string().default(\"/project1\").describe(\"Network root to map.\"),\n});\ntype GetTdTopologyArgs = z.infer<typeof getTdTopologySchema>;\n\nexport const getTdTopologyOutputSchema = z.object({\n path: z.string(),\n nodeCount: z.number(),\n connectionCount: z.number(),\n issues: z.array(z.string()),\n topology: TopologySchema,\n});\n\nexport async function getTdTopologyImpl(ctx: ToolContext, args: GetTdTopologyArgs) {\n return guardTd(\n () => verifyNetwork(ctx.client, args.root_path),\n (report) =>\n structuredResult(\n `${report.nodeCount} node(s), ${report.connectionCount} connection(s) under ${args.root_path}.`,\n report,\n ),\n );\n}\n\nexport const registerGetTdTopology: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"get_td_topology\",\n {\n title: \"Get network topology\",\n description:\n \"Return the nodes and connections under a network root, flagging obvious structural issues.\",\n inputSchema: getTdTopologySchema.shape,\n outputSchema: getTdTopologyOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => getTdTopologyImpl(ctx, args),\n );\n};\n","import type { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport type { TdTopology } from \"../td-client/types.js\";\n\nexport interface VerifyReport {\n path: string;\n nodeCount: number;\n connectionCount: number;\n issues: string[];\n topology: TdTopology;\n}\n\n/** Inspects the topology under `path` and flags obvious structural issues. */\nexport async function verifyNetwork(\n client: TouchDesignerClient,\n path: string,\n): Promise<VerifyReport> {\n const topology = await client.getNetworkTopology(path);\n const issues: string[] = [];\n if (topology.nodes.length === 0) {\n issues.push(`No nodes were found under ${path}.`);\n } else if (topology.nodes.length > 1 && topology.connections.length === 0) {\n issues.push(\"Multiple nodes exist but none are connected.\");\n }\n return {\n path,\n nodeCount: topology.nodes.length,\n connectionCount: topology.connections.length,\n issues,\n topology,\n };\n}\n","import { z } from \"zod\";\nimport { verifyNetwork } from \"../../feedback/networkVerifier.js\";\nimport { ConnectionSchema } from \"../../td-client/validators.js\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\n/** Cap on per-node parameter fetches so a big graph can't fan out into hundreds of requests. */\nconst MAX_PARAM_NODES = 60;\n\nexport const snapshotTdGraphSchema = z.object({\n path: z.string().default(\"/project1\").describe(\"Network root to snapshot.\"),\n include_params: z\n .boolean()\n .default(false)\n .describe(\"Also fetch each node's parameters (one request per node; capped for large graphs).\"),\n});\ntype SnapshotTdGraphArgs = z.infer<typeof snapshotTdGraphSchema>;\n\nexport const snapshotTdGraphOutputSchema = z.object({\n path: z.string(),\n nodeCount: z.number(),\n connectionCount: z.number(),\n issues: z.array(z.string()),\n params_truncated: z.boolean(),\n nodes: z.array(\n z.object({\n path: z.string(),\n type: z.string(),\n name: z.string(),\n parameters: z.record(z.string(), z.unknown()).optional(),\n }),\n ),\n connections: z.array(ConnectionSchema),\n});\n\nexport async function snapshotTdGraphImpl(ctx: ToolContext, args: SnapshotTdGraphArgs) {\n return guardTd(\n async () => {\n const report = await verifyNetwork(ctx.client, args.path);\n const refs = report.topology.nodes;\n let paramsTruncated = false;\n const params = new Map<string, Record<string, unknown>>();\n if (args.include_params) {\n const targets = refs.slice(0, MAX_PARAM_NODES);\n paramsTruncated = refs.length > MAX_PARAM_NODES;\n // Fail-forward: one unreadable node shouldn't sink the whole snapshot.\n const details = await Promise.allSettled(targets.map((n) => ctx.client.getNode(n.path)));\n for (const detail of details) {\n if (detail.status === \"fulfilled\") params.set(detail.value.path, detail.value.parameters);\n }\n }\n const nodes = refs.map((n) => ({\n path: n.path,\n type: n.type,\n name: n.name,\n ...(args.include_params ? { parameters: params.get(n.path) ?? {} } : {}),\n }));\n return { report, nodes, paramsTruncated };\n },\n ({ report, nodes, paramsTruncated }) =>\n structuredResult(\n `Snapshot of ${args.path}: ${report.nodeCount} node(s), ${report.connectionCount} connection(s)${report.issues.length ? `, ${report.issues.length} issue(s)` : \"\"}.`,\n {\n path: report.path,\n nodeCount: report.nodeCount,\n connectionCount: report.connectionCount,\n issues: report.issues,\n params_truncated: paramsTruncated,\n nodes,\n connections: report.topology.connections,\n },\n ),\n );\n}\n\nexport const registerSnapshotTdGraph: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"snapshot_td_graph\",\n {\n title: \"Snapshot network graph\",\n description:\n \"Capture a compact, serializable snapshot of a network — nodes, connections, structural issues, and optionally each node's parameters — for review, diffing, or documentation.\",\n inputSchema: snapshotTdGraphSchema.shape,\n outputSchema: snapshotTdGraphOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => snapshotTdGraphImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, structuredResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\nimport { parentOf } from \"./nodeMatch.js\";\n\nexport const summarizeTdErrorsSchema = z.object({\n path: z.string().default(\"/project1\").describe(\"Network root to collect errors under.\"),\n group_by: z\n .enum([\"message\", \"type\", \"parent\"])\n .default(\"message\")\n .describe(\n \"How to cluster errors: by exact message, by error type, or by parent container (to find a common upstream cause).\",\n ),\n});\ntype SummarizeTdErrorsArgs = z.infer<typeof summarizeTdErrorsSchema>;\n\nexport const summarizeTdErrorsOutputSchema = z.object({\n path: z.string(),\n total: z.number(),\n group_by: z.enum([\"message\", \"type\", \"parent\"]),\n groups: z.array(\n z.object({\n key: z.string(),\n count: z.number(),\n sample: z.object({ path: z.string(), message: z.string() }),\n }),\n ),\n suggestions: z.array(z.string()),\n});\n\nexport async function summarizeTdErrorsImpl(ctx: ToolContext, args: SummarizeTdErrorsArgs) {\n return guardTd(\n () => ctx.client.getNetworkErrors(args.path),\n (result) => {\n const errors = result.errors;\n const total = errors.length;\n if (total === 0) {\n return structuredResult(`No errors found under ${args.path}.`, {\n path: args.path,\n total: 0,\n group_by: args.group_by,\n groups: [],\n suggestions: [],\n });\n }\n\n const keyOf = (e: { path: string; message: string; type?: string }): string =>\n args.group_by === \"message\"\n ? e.message\n : args.group_by === \"type\"\n ? e.type || \"error\"\n : parentOf(e.path);\n\n const grouped = new Map<\n string,\n { count: number; sample: { path: string; message: string } }\n >();\n const byPath = new Map<string, number>();\n for (const e of errors) {\n const key = keyOf(e);\n const g = grouped.get(key);\n if (g) g.count += 1;\n else grouped.set(key, { count: 1, sample: { path: e.path, message: e.message } });\n byPath.set(e.path, (byPath.get(e.path) ?? 0) + 1);\n }\n\n const groups = [...grouped.entries()]\n .map(([key, g]) => ({ key, count: g.count, sample: g.sample }))\n .sort((a, b) => b.count - a.count);\n\n const worstNodes = [...byPath.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([p, c]) => `${p} (${c} error${c === 1 ? \"\" : \"s\"})`);\n\n const suggestions: string[] = [];\n if (groups[0] && groups[0].count > 1) {\n suggestions.push(\n `${groups[0].count} errors share ${args.group_by} \"${groups[0].key}\" — fixing the common cause clears them at once.`,\n );\n }\n if (worstNodes.length > 0) {\n suggestions.push(`Check first: ${worstNodes.join(\", \")}.`);\n }\n\n return structuredResult(\n `${total} error(s) under ${args.path} in ${groups.length} ${args.group_by} group(s).`,\n { path: args.path, total, group_by: args.group_by, groups, suggestions },\n );\n },\n );\n}\n\nexport const registerSummarizeTdErrors: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"summarize_td_errors\",\n {\n title: \"Summarize network errors\",\n description:\n \"Collect errors across a network and cluster them by message, type, or parent container, with the worst-offending nodes and a suggested order to investigate. Use this instead of reading every node's errors one by one.\",\n inputSchema: summarizeTdErrorsSchema.shape,\n outputSchema: summarizeTdErrorsOutputSchema.shape,\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n (args) => summarizeTdErrorsImpl(ctx, args),\n );\n};\n","import { z } from \"zod\";\nimport { guardTd, jsonResult } from \"../result.js\";\nimport type { ToolContext, ToolRegistrar } from \"../types.js\";\n\nexport const updateTdNodeParametersSchema = z.object({\n path: z.string().describe(\"Full path of the node whose parameters to update.\"),\n parameters: z\n .record(z.string(), z.unknown())\n .describe(\"Parameter overrides as key→value pairs, e.g. { period: 4, amplitude: 0.5 }.\"),\n});\ntype UpdateTdNodeParametersArgs = z.infer<typeof updateTdNodeParametersSchema>;\n\nexport async function updateTdNodeParametersImpl(\n ctx: ToolContext,\n args: UpdateTdNodeParametersArgs,\n) {\n return guardTd(\n () => ctx.client.updateNodeParameters(args.path, args.parameters),\n (node) =>\n jsonResult(`Updated ${Object.keys(args.parameters).length} parameter(s) on ${node.path}.`, {\n node,\n }),\n );\n}\n\nexport const registerUpdateTdNodeParameters: ToolRegistrar = (server, ctx) => {\n server.registerTool(\n \"update_td_node_parameters\",\n {\n title: \"Update node parameters\",\n description: \"Set one or more parameters on an existing node.\",\n inputSchema: updateTdNodeParametersSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },\n },\n (args) => updateTdNodeParametersImpl(ctx, args),\n );\n};\n","import type { ToolRegistrar } from \"../types.js\";\nimport { registerCompareTdNodes } from \"./compareTdNodes.js\";\nimport { registerCreateTdNode } from \"./createTdNode.js\";\nimport { registerDeleteTdNode } from \"./deleteTdNode.js\";\nimport { registerExecNodeMethod } from \"./execNodeMethod.js\";\nimport { registerExecutePythonScript } from \"./executePythonScript.js\";\nimport { registerFindTdNodes } from \"./findTdNodes.js\";\nimport { registerGetModuleHelp } from \"./getModuleHelp.js\";\nimport { registerGetTdClassDetails } from \"./getTdClassDetails.js\";\nimport { registerGetTdClasses } from \"./getTdClasses.js\";\nimport { registerGetTdInfo } from \"./getTdInfo.js\";\nimport { registerGetTdNodeErrors } from \"./getTdNodeErrors.js\";\nimport { registerGetTdNodeParameters } from \"./getTdNodeParameters.js\";\nimport { registerGetTdNodes } from \"./getTdNodes.js\";\nimport { registerGetTdPerformance } from \"./getTdPerformance.js\";\nimport { registerGetTdTopology } from \"./getTdTopology.js\";\nimport { registerSnapshotTdGraph } from \"./snapshotTdGraph.js\";\nimport { registerSummarizeTdErrors } from \"./summarizeTdErrors.js\";\nimport { registerUpdateTdNodeParameters } from \"./updateTdNodeParameters.js\";\n\nexport const layer3Registrars: ToolRegistrar[] = [\n registerGetTdInfo,\n registerCreateTdNode,\n registerDeleteTdNode,\n registerUpdateTdNodeParameters,\n registerGetTdNodes,\n registerGetTdNodeParameters,\n registerGetTdNodeErrors,\n registerExecutePythonScript,\n registerExecNodeMethod,\n registerGetTdClasses,\n registerGetTdClassDetails,\n registerGetModuleHelp,\n registerGetTdPerformance,\n registerGetTdTopology,\n registerFindTdNodes,\n registerSummarizeTdErrors,\n registerCompareTdNodes,\n registerSnapshotTdGraph,\n];\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { layer1Registrars } from \"./layer1/index.js\";\nimport { layer2Registrars } from \"./layer2/index.js\";\nimport { layer3Registrars } from \"./layer3/index.js\";\nimport type { ToolContext } from \"./types.js\";\n\n/** Registers every tool (all layers) against the MCP server. */\nexport function registerAllTools(server: McpServer, ctx: ToolContext): void {\n const registrars = [...layer3Registrars, ...layer2Registrars, ...layer1Registrars];\n for (const register of registrars) register(server, ctx);\n}\n\nexport type { ToolContext, ToolRegistrar } from \"./types.js\";\n","import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nlet cached: string | undefined;\n\n/**\n * Resolves the package version by walking up from this module until it finds\n * the `tdmcp` package.json. Works both in dev (tsx, from `src/`) and in\n * the bundled build (from `dist/`). Falls back to \"0.0.0\" if not found.\n */\nexport function getVersion(): string {\n if (cached) return cached;\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n try {\n const raw = readFileSync(resolve(dir, \"package.json\"), \"utf8\");\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n // The published name is scoped (`@dpantani/tdmcp`); accept the legacy\n // unscoped name too so a rename can't silently drop us to the fallback.\n if (pkg.version && (pkg.name === \"@dpantani/tdmcp\" || pkg.name === \"tdmcp\")) {\n cached = pkg.version;\n return cached;\n }\n } catch {\n // package.json not here — keep walking up\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n cached = \"0.0.0\";\n return cached;\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { bottobotPackageDir, knowledgeDataDir } from \"../utils/paths.js\";\nimport {\n compactKey,\n normalizeGlsl,\n normalizePatterns,\n slugify,\n toOperatorSummary,\n toPythonSummary,\n toTutorialSummary,\n} from \"./normalize.js\";\nimport type {\n GlslSummary,\n GlslTechnique,\n KnowledgeStats,\n OperatorDoc,\n OperatorSummary,\n Pattern,\n PatternSummary,\n PythonClass,\n PythonClassSummary,\n Tutorial,\n TutorialSummary,\n} from \"./types.js\";\n\nexport interface KnowledgeBaseOptions {\n dataDir?: string;\n logger?: Logger;\n}\n\ninterface ResolvedSource {\n kind: \"local\" | \"bottobot\" | \"empty\";\n operatorsDir: string;\n operatorsIndex?: string;\n pythonDir: string;\n tutorialsDir: string;\n patternsFile: string;\n glslFile: string;\n}\n\nconst EMPTY_SOURCE: ResolvedSource = {\n kind: \"empty\",\n operatorsDir: \"\",\n pythonDir: \"\",\n tutorialsDir: \"\",\n patternsFile: \"\",\n glslFile: \"\",\n};\n\n/**\n * Read-only accessor over the embedded TouchDesigner knowledge base. Prefers the\n * imported local data directory; falls back to reading directly from an installed\n * `@bottobot/td-mcp`; otherwise degrades to empty results (never throws on lookup).\n */\nexport class KnowledgeBase {\n private readonly logger: Logger;\n private readonly source: ResolvedSource;\n\n private opIndexCache?: OperatorSummary[];\n private opLookupCache?: Map<string, string>;\n private readonly opDocCache = new Map<string, OperatorDoc | null>();\n private pyIndexCache?: PythonClassSummary[];\n private pyLookupCache?: Map<string, string>;\n private readonly pyDocCache = new Map<string, PythonClass | null>();\n private tutIndexCache?: TutorialSummary[];\n private tutLookupCache?: Map<string, string>;\n private readonly tutDocCache = new Map<string, Tutorial | null>();\n private patternsCache?: Pattern[];\n private glslCache?: GlslTechnique[];\n\n constructor(options: KnowledgeBaseOptions = {}) {\n this.logger = options.logger ?? silentLogger;\n this.source = KnowledgeBase.resolveSource(options.dataDir ?? knowledgeDataDir());\n this.logger.debug(\"knowledge source resolved\", { kind: this.source.kind });\n }\n\n private static resolveSource(localDir: string): ResolvedSource {\n if (existsSync(join(localDir, \"operators\"))) {\n return {\n kind: \"local\",\n operatorsDir: join(localDir, \"operators\"),\n operatorsIndex: join(localDir, \"operators\", \"index.json\"),\n pythonDir: join(localDir, \"python-api\"),\n tutorialsDir: join(localDir, \"tutorials\"),\n patternsFile: join(localDir, \"patterns.json\"),\n glslFile: join(localDir, \"glsl.json\"),\n };\n }\n const bb = bottobotPackageDir();\n if (bb) {\n return {\n kind: \"bottobot\",\n operatorsDir: join(bb, \"wiki/data/processed\"),\n pythonDir: join(bb, \"wiki/data/python-api\"),\n tutorialsDir: join(bb, \"wiki/data/tutorials\"),\n patternsFile: join(bb, \"data/patterns.json\"),\n glslFile: join(bb, \"wiki/data/experimental/glsl.json\"),\n };\n }\n return EMPTY_SOURCE;\n }\n\n private readJson(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch (err) {\n this.logger.debug(\"knowledge readJson failed\", { path, error: String(err) });\n return undefined;\n }\n }\n\n private listJsonFiles(dir: string): string[] {\n if (!dir || !existsSync(dir)) return [];\n try {\n return readdirSync(dir).filter((f) => f.endsWith(\".json\") && f !== \"index.json\");\n } catch {\n return [];\n }\n }\n\n // ---- Operators -----------------------------------------------------------\n\n private operatorIndex(): OperatorSummary[] {\n if (this.opIndexCache) return this.opIndexCache;\n if (this.source.kind === \"empty\") {\n this.opIndexCache = [];\n return this.opIndexCache;\n }\n if (this.source.operatorsIndex && existsSync(this.source.operatorsIndex)) {\n const data = this.readJson(this.source.operatorsIndex);\n if (Array.isArray(data)) {\n this.opIndexCache = data as OperatorSummary[];\n return this.opIndexCache;\n }\n }\n const summaries: OperatorSummary[] = [];\n for (const file of this.listJsonFiles(this.source.operatorsDir)) {\n const doc = this.readJson(join(this.source.operatorsDir, file)) as OperatorDoc | undefined;\n if (doc?.name) summaries.push(toOperatorSummary(file.replace(/\\.json$/, \"\"), doc));\n }\n this.opIndexCache = summaries;\n return this.opIndexCache;\n }\n\n private operatorLookup(): Map<string, string> {\n if (this.opLookupCache) return this.opLookupCache;\n const map = new Map<string, string>();\n for (const summary of this.operatorIndex()) {\n map.set(compactKey(summary.slug), summary.slug);\n map.set(compactKey(summary.name), summary.slug);\n map.set(compactKey(summary.displayName), summary.slug);\n }\n this.opLookupCache = map;\n return map;\n }\n\n listOperatorCategories(): string[] {\n const set = new Set<string>();\n for (const summary of this.operatorIndex()) set.add(summary.category);\n return [...set].sort();\n }\n\n listOperators(category?: string): OperatorSummary[] {\n const all = this.operatorIndex();\n if (!category) return all;\n const wanted = compactKey(category);\n return all.filter((s) => compactKey(s.category) === wanted);\n }\n\n getOperator(nameOrSlug: string): OperatorDoc | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const slug = this.operatorLookup().get(compactKey(nameOrSlug)) ?? slugify(nameOrSlug);\n const cached = this.opDocCache.get(slug);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.operatorsDir, `${slug}.json`);\n const doc = existsSync(file) ? (this.readJson(file) as OperatorDoc | undefined) : undefined;\n this.opDocCache.set(slug, doc ?? null);\n return doc;\n }\n\n /** Soft existence check (by operator type, display name, or slug). */\n operatorExists(typeOrName: string): boolean {\n return this.operatorLookup().has(compactKey(typeOrName));\n }\n\n searchOperators(query: string, limit = 25): OperatorSummary[] {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n const terms = q.split(/\\s+/);\n const scored: Array<{ summary: OperatorSummary; score: number }> = [];\n for (const summary of this.operatorIndex()) {\n const haystack =\n `${summary.name} ${summary.displayName} ${summary.summary} ${summary.keywords.join(\" \")}`.toLowerCase();\n let score = 0;\n for (const term of terms) {\n if (haystack.includes(term)) score += 1;\n if (summary.name.toLowerCase().includes(term)) score += 1;\n }\n if (score > 0) scored.push({ summary, score });\n }\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit).map((s) => s.summary);\n }\n\n // ---- Python API ----------------------------------------------------------\n\n private pythonIndex(): PythonClassSummary[] {\n if (this.pyIndexCache) return this.pyIndexCache;\n if (this.source.kind === \"empty\") {\n this.pyIndexCache = [];\n return this.pyIndexCache;\n }\n const indexPath = join(this.source.pythonDir, \"index.json\");\n if (existsSync(indexPath)) {\n const data = this.readJson(indexPath);\n if (Array.isArray(data)) {\n this.pyIndexCache = data as PythonClassSummary[];\n return this.pyIndexCache;\n }\n }\n const summaries: PythonClassSummary[] = [];\n for (const file of this.listJsonFiles(this.source.pythonDir)) {\n const cls = this.readJson(join(this.source.pythonDir, file)) as PythonClass | undefined;\n if (cls?.className) summaries.push(toPythonSummary(cls));\n }\n this.pyIndexCache = summaries;\n return this.pyIndexCache;\n }\n\n private pythonLookup(): Map<string, string> {\n if (this.pyLookupCache) return this.pyLookupCache;\n const map = new Map<string, string>();\n for (const summary of this.pythonIndex()) {\n map.set(compactKey(summary.className), summary.className);\n map.set(compactKey(summary.displayName), summary.className);\n }\n this.pyLookupCache = map;\n return map;\n }\n\n listPythonClasses(): PythonClassSummary[] {\n return this.pythonIndex();\n }\n\n getPythonClass(name: string): PythonClass | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const className = this.pythonLookup().get(compactKey(name)) ?? name;\n const cached = this.pyDocCache.get(className);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.pythonDir, `${className}.json`);\n const cls = existsSync(file) ? (this.readJson(file) as PythonClass | undefined) : undefined;\n this.pyDocCache.set(className, cls ?? null);\n return cls;\n }\n\n // ---- Patterns ------------------------------------------------------------\n\n private patterns(): Pattern[] {\n if (this.patternsCache) return this.patternsCache;\n if (this.source.kind === \"empty\") {\n this.patternsCache = [];\n return this.patternsCache;\n }\n const data = this.readJson(this.source.patternsFile);\n if (Array.isArray(data) && data.length > 0 && typeof (data[0] as Pattern).id === \"string\") {\n this.patternsCache = data as Pattern[];\n } else {\n this.patternsCache = normalizePatterns(data);\n }\n return this.patternsCache;\n }\n\n listPatterns(): PatternSummary[] {\n return this.patterns().map((p) => ({\n id: p.id,\n name: p.name,\n category: p.category ?? \"Unknown\",\n description: p.description ?? \"\",\n }));\n }\n\n getPattern(name: string): Pattern | undefined {\n const key = compactKey(name);\n return this.patterns().find((p) => compactKey(p.id) === key || compactKey(p.name) === key);\n }\n\n // ---- GLSL ----------------------------------------------------------------\n\n private glsl(): GlslTechnique[] {\n if (this.glslCache) return this.glslCache;\n if (this.source.kind === \"empty\") {\n this.glslCache = [];\n return this.glslCache;\n }\n const data = this.readJson(this.source.glslFile);\n this.glslCache = Array.isArray(data) ? (data as GlslTechnique[]) : normalizeGlsl(data);\n return this.glslCache;\n }\n\n listGlslPatterns(): GlslSummary[] {\n return this.glsl().map((g) => ({\n id: g.id,\n name: g.name,\n description: g.description ?? \"\",\n difficulty: g.difficulty ?? \"unknown\",\n }));\n }\n\n getGlslPattern(name: string): GlslTechnique | undefined {\n const key = compactKey(name);\n return this.glsl().find((g) => compactKey(g.id) === key || compactKey(g.name) === key);\n }\n\n // ---- Tutorials -----------------------------------------------------------\n\n private tutorialIndex(): TutorialSummary[] {\n if (this.tutIndexCache) return this.tutIndexCache;\n if (this.source.kind === \"empty\") {\n this.tutIndexCache = [];\n return this.tutIndexCache;\n }\n const indexPath = join(this.source.tutorialsDir, \"index.json\");\n if (existsSync(indexPath)) {\n const data = this.readJson(indexPath);\n if (Array.isArray(data)) {\n this.tutIndexCache = data as TutorialSummary[];\n return this.tutIndexCache;\n }\n }\n const summaries: TutorialSummary[] = [];\n for (const file of this.listJsonFiles(this.source.tutorialsDir)) {\n const tut = this.readJson(join(this.source.tutorialsDir, file)) as Tutorial | undefined;\n if (tut?.id || tut?.name) {\n const normalized: Tutorial = {\n ...tut,\n id: tut.id ?? file.replace(/\\.json$/, \"\"),\n name: tut.name ?? file,\n };\n summaries.push(toTutorialSummary(normalized));\n }\n }\n this.tutIndexCache = summaries;\n return this.tutIndexCache;\n }\n\n private tutorialLookup(): Map<string, string> {\n if (this.tutLookupCache) return this.tutLookupCache;\n const map = new Map<string, string>();\n for (const file of this.listJsonFiles(this.source.tutorialsDir)) {\n const slug = file.replace(/\\.json$/, \"\");\n map.set(compactKey(slug), slug);\n }\n for (const summary of this.tutorialIndex()) {\n map.set(compactKey(summary.id), summary.id);\n map.set(compactKey(summary.name), summary.id);\n }\n this.tutLookupCache = map;\n return map;\n }\n\n listTutorials(): TutorialSummary[] {\n return this.tutorialIndex();\n }\n\n getTutorial(name: string): Tutorial | undefined {\n if (this.source.kind === \"empty\") return undefined;\n const slug = this.tutorialLookup().get(compactKey(name)) ?? slugify(name);\n const cached = this.tutDocCache.get(slug);\n if (cached !== undefined) return cached ?? undefined;\n const file = join(this.source.tutorialsDir, `${slug}.json`);\n const tut = existsSync(file) ? (this.readJson(file) as Tutorial | undefined) : undefined;\n this.tutDocCache.set(slug, tut ?? null);\n return tut;\n }\n\n // ---- Meta ----------------------------------------------------------------\n\n get sourceKind(): KnowledgeStats[\"source\"] {\n return this.source.kind;\n }\n\n stats(): KnowledgeStats {\n return {\n source: this.source.kind,\n operators: this.operatorIndex().length,\n pythonClasses: this.pythonIndex().length,\n patterns: this.patterns().length,\n glsl: this.glsl().length,\n tutorials: this.tutorialIndex().length,\n };\n }\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LEVELS: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: 99,\n};\n\nexport interface Logger {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Creates a leveled logger. All output goes to **stderr** so that stdout stays\n * reserved for the MCP stdio protocol stream.\n */\nexport function createLogger(level: LogLevel = \"info\"): Logger {\n const threshold = LEVELS[level];\n\n const emit = (\n lvl: Exclude<LogLevel, \"silent\">,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n if (LEVELS[lvl] < threshold) return;\n const stamp = new Date().toISOString();\n const suffix = meta && Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : \"\";\n process.stderr.write(`[tdmcp] ${stamp} ${lvl.toUpperCase()} ${message}${suffix}\\n`);\n };\n\n return {\n debug: (message, meta) => emit(\"debug\", message, meta),\n info: (message, meta) => emit(\"info\", message, meta),\n warn: (message, meta) => emit(\"warn\", message, meta),\n error: (message, meta) => emit(\"error\", message, meta),\n };\n}\n\n/** A logger that discards everything — handy for tests. */\nexport const silentLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { compactKey } from \"../knowledge/normalize.js\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { recipesDir } from \"../utils/paths.js\";\nimport { type Recipe, RecipeSchema, type RecipeSummary } from \"./schema.js\";\n\nexport interface RecipeLibraryOptions {\n dir?: string;\n logger?: Logger;\n}\n\n/** Loads and validates recipe JSON files from the recipes directory. */\nexport class RecipeLibrary {\n private readonly dir: string;\n private readonly logger: Logger;\n private cache?: Recipe[];\n\n constructor(options: RecipeLibraryOptions = {}) {\n this.dir = options.dir ?? recipesDir();\n this.logger = options.logger ?? silentLogger;\n }\n\n private load(): Recipe[] {\n if (this.cache) return this.cache;\n const recipes: Recipe[] = [];\n if (existsSync(this.dir)) {\n for (const file of readdirSync(this.dir)) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const raw = JSON.parse(readFileSync(join(this.dir, file), \"utf8\"));\n const parsed = RecipeSchema.safeParse(raw);\n if (parsed.success) {\n recipes.push(parsed.data);\n } else {\n this.logger.warn(`Invalid recipe ${file}`, { issues: parsed.error.issues.length });\n }\n } catch (err) {\n this.logger.warn(`Failed to read recipe ${file}`, { error: String(err) });\n }\n }\n }\n this.cache = recipes;\n return recipes;\n }\n\n all(): Recipe[] {\n return this.load();\n }\n\n list(): RecipeSummary[] {\n return this.load().map((r) => ({\n id: r.id,\n name: r.name,\n description: r.description,\n tags: r.tags,\n difficulty: r.difficulty,\n }));\n }\n\n get(id: string): Recipe | undefined {\n const key = compactKey(id);\n return this.load().find((r) => compactKey(r.id) === key || compactKey(r.name) === key);\n }\n\n /** Finds the best recipe whose tags/name/description match any of the given terms. */\n findByTags(terms: string[]): Recipe | undefined {\n const wanted = terms.map((t) => t.toLowerCase()).filter(Boolean);\n if (wanted.length === 0) return undefined;\n let best: { recipe: Recipe; score: number } | undefined;\n for (const recipe of this.load()) {\n const haystack =\n `${recipe.name} ${recipe.description} ${recipe.tags.join(\" \")}`.toLowerCase();\n let score = 0;\n for (const term of wanted) {\n if (recipe.tags.some((tag) => tag.toLowerCase() === term)) score += 2;\n else if (haystack.includes(term)) score += 1;\n }\n if (score > 0 && (!best || score > best.score)) best = { recipe, score };\n }\n return best?.recipe;\n }\n}\n","import { z } from \"zod\";\nimport { controlSchema } from \"../tools/layer2/createControlPanel.js\";\n\nexport const RecipeNodeSchema = z.object({\n name: z.string().describe(\"Unique node name within the recipe (used for wiring).\"),\n type: z.string().describe(\"Operator type, e.g. 'noiseTOP'.\"),\n parameters: z.record(z.string(), z.unknown()).default({}),\n parent: z\n .string()\n .optional()\n .describe(\n \"Name of another recipe node (a COMP, e.g. a geometryCOMP) to nest this node inside of. \" +\n \"The parent must appear earlier in `nodes`. Used to place SOPs inside a Geometry COMP.\",\n ),\n render: z\n .boolean()\n .optional()\n .describe(\n \"For a SOP nested in a geometryCOMP: make this the rendered geometry. Sets the render/display \" +\n \"flags on it and clears its siblings, so the COMP renders this instead of its default torus.\",\n ),\n comment: z.string().optional(),\n});\n\nexport const RecipeConnectionSchema = z.object({\n from: z.string().describe(\"Source node name.\"),\n to: z.string().describe(\"Target node name.\"),\n from_output: z.number().int().nonnegative().default(0),\n to_input: z.number().int().nonnegative().default(0),\n});\n\nexport const RecipeParameterSchema = z.object({\n name: z.string().describe(\"Friendly name of the exposed control.\"),\n node: z.string().describe(\"Recipe node name the parameter belongs to.\"),\n param: z.string().describe(\"TD parameter name on that node.\"),\n value: z.unknown().optional(),\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n description: z.string().optional(),\n});\n\n/**\n * A uniform exposed by a GLSL TOP. On the GLSL TOP these live in *parameter\n * sequences*, not normal parameters, so they cannot be set the usual way: the block\n * count (`op.seq.<seq>.numBlocks`) has to be raised first, after which the per-block\n * name/value sub-parameters exist. `float`/`vec` uniforms bind through the \"Vectors\"\n * page (the `vec` sequence); `color` binds through the \"Colors\" page (the `color`\n * sequence). The \"Constants\" page does NOT feed a runtime `uniform float`, so it is\n * not used here. `buildFromRecipe` handles the translation; authors just declare the\n * uniform.\n */\nexport const RecipeGlslUniformSchema = z.object({\n node: z.string().describe(\"Recipe node name of the GLSL TOP that declares the uniform.\"),\n name: z.string().describe(\"Uniform name as referenced in the shader, e.g. 'uFeed'.\"),\n kind: z\n .enum([\"float\", \"vec\", \"color\"])\n .default(\"float\")\n .describe(\n \"Uniform kind: float (uniform float), vec (uniform vec2/3/4), color (rgba). \" +\n \"float/vec use the Vectors page; color uses the Colors page.\",\n ),\n value: z\n .union([z.number(), z.array(z.number())])\n .optional()\n .describe(\"Initial value: a number for float, or an array of components for vec/color.\"),\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n description: z.string().optional(),\n});\nexport type RecipeGlslUniform = z.infer<typeof RecipeGlslUniformSchema>;\n\nexport const RecipeSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().default(\"\"),\n tags: z.array(z.string()).default([]),\n difficulty: z.enum([\"beginner\", \"intermediate\", \"advanced\"]).default(\"intermediate\"),\n td_version_min: z.string().default(\"2023\"),\n nodes: z.array(RecipeNodeSchema).min(1),\n connections: z.array(RecipeConnectionSchema).default([]),\n parameters: z.array(RecipeParameterSchema).default([]),\n glsl_uniforms: z.array(RecipeGlslUniformSchema).default([]),\n glsl_code: z.record(z.string(), z.string()).optional(),\n python_code: z.record(z.string(), z.string()).optional(),\n /**\n * Live controls to auto-expose on the system container: custom parameters (knobs/\n * sliders/toggles) bound to node parameters so the built system is immediately\n * playable. Each control's `bind_to` uses recipe node *names* (\"nodeName.parName\");\n * buildFromRecipe rewrites them to the real created paths.\n */\n controls: z.array(controlSchema).default([]),\n preview_description: z.string().default(\"\"),\n});\nexport type Recipe = z.infer<typeof RecipeSchema>;\n\nexport interface RecipeSummary {\n id: string;\n name: string;\n description: string;\n tags: string[];\n difficulty: Recipe[\"difficulty\"];\n}\n","import type { z } from \"zod\";\nimport { type Logger, silentLogger } from \"../utils/logger.js\";\nimport { TdApiError, TdConnectionError, TdTimeoutError } from \"./types.js\";\nimport {\n ApiEnvelopeSchema,\n BatchResultSchema,\n type CreateNodeInput,\n CreateNodeInputSchema,\n DeleteResultSchema,\n ExecResultSchema,\n InfoSchema,\n MethodResultSchema,\n NodeDetailSchema,\n NodeErrorsSchema,\n NodeListSchema,\n NodeRefSchema,\n PerformanceSchema,\n PreviewSchema,\n type TdBatchOperation,\n TopologySchema,\n} from \"./validators.js\";\n\nexport interface TouchDesignerClientOptions {\n baseUrl: string;\n timeoutMs?: number;\n logger?: Logger;\n /** Optional shared bearer token; sent as `Authorization: Bearer <token>` when set. */\n token?: string;\n /** Overridable for tests (defaults to global `fetch`). */\n fetchImpl?: typeof fetch;\n}\n\ntype QueryParams = Record<string, string | number | boolean | undefined>;\n\nfunction extractErrorMessage(json: unknown): string | undefined {\n if (json && typeof json === \"object\") {\n const obj = json as Record<string, unknown>;\n const error = obj.error;\n if (\n error &&\n typeof error === \"object\" &&\n typeof (error as Record<string, unknown>).message === \"string\"\n ) {\n return (error as Record<string, string>).message;\n }\n if (typeof obj.message === \"string\") return obj.message;\n }\n return undefined;\n}\n\n/** Encodes a TD node path (which contains slashes) into a single URL segment. */\nfunction segment(path: string): string {\n return encodeURIComponent(path);\n}\n\n/**\n * HTTP client for the TouchDesigner REST bridge. Every method maps to one of the\n * endpoints in the bridge spec. All failures surface as typed `TdError`s so MCP\n * tool handlers can convert them into friendly messages without crashing.\n */\nexport class TouchDesignerClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly logger: Logger;\n private readonly token: string | undefined;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: TouchDesignerClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.timeoutMs = options.timeoutMs ?? 10000;\n this.logger = options.logger ?? silentLogger;\n this.token = options.token;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n get endpoint(): string {\n return this.baseUrl;\n }\n\n private async request<T>(\n method: string,\n path: string,\n schema: z.ZodType<T>,\n body?: unknown,\n query?: QueryParams,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let response: Response;\n try {\n this.logger.debug(`TD ${method} ${path}`);\n const headers: Record<string, string> = {};\n if (body !== undefined) headers[\"content-type\"] = \"application/json\";\n if (this.token) headers.authorization = `Bearer ${this.token}`;\n response = await this.fetchImpl(url, {\n method,\n signal: controller.signal,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TdTimeoutError(\n `TouchDesigner request timed out after ${this.timeoutMs}ms (${method} ${path}).`,\n { cause: err },\n );\n }\n throw new TdConnectionError(\n `Cannot reach TouchDesigner at ${this.baseUrl}. Make sure TD is running with the tdmcp bridge (WebServer DAT) installed and listening on that port.`,\n { cause: err },\n );\n } finally {\n clearTimeout(timer);\n }\n\n const text = await response.text();\n let json: unknown;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n json = undefined;\n }\n }\n\n if (!response.ok) {\n const message =\n extractErrorMessage(json) ??\n `TouchDesigner bridge returned HTTP ${response.status} for ${method} ${path}.`;\n throw new TdApiError(message, { status: response.status });\n }\n\n const envelope = ApiEnvelopeSchema.safeParse(json);\n if (!envelope.success) {\n throw new TdApiError(`Malformed response from TouchDesigner bridge for ${method} ${path}.`, {\n status: response.status,\n });\n }\n if (!envelope.data.ok) {\n throw new TdApiError(\n envelope.data.error?.message ?? `TouchDesigner reported an error for ${method} ${path}.`,\n { status: response.status, apiCode: envelope.data.error?.code },\n );\n }\n\n const parsed = schema.safeParse(envelope.data.data);\n if (!parsed.success) {\n throw new TdApiError(\n `Unexpected data shape from TouchDesigner bridge for ${method} ${path}: ${parsed.error.message}`,\n { status: response.status },\n );\n }\n return parsed.data;\n }\n\n getInfo() {\n return this.request(\"GET\", \"/api/info\", InfoSchema);\n }\n\n createNode(input: CreateNodeInput) {\n return this.request(\"POST\", \"/api/nodes\", NodeRefSchema, CreateNodeInputSchema.parse(input));\n }\n\n deleteNode(path: string) {\n return this.request(\"DELETE\", `/api/nodes/${segment(path)}`, DeleteResultSchema);\n }\n\n getNodes(parentPath?: string) {\n return this.request(\"GET\", \"/api/nodes\", NodeListSchema, undefined, { parent: parentPath });\n }\n\n getNode(path: string) {\n return this.request(\"GET\", `/api/nodes/${segment(path)}`, NodeDetailSchema);\n }\n\n updateNodeParameters(path: string, parameters: Record<string, unknown>) {\n return this.request(\"PATCH\", `/api/nodes/${segment(path)}`, NodeDetailSchema, { parameters });\n }\n\n executePythonScript(script: string, returnOutput = true) {\n return this.request(\"POST\", \"/api/exec\", ExecResultSchema, {\n script,\n return_output: returnOutput,\n });\n }\n\n execNodeMethod(\n path: string,\n method: string,\n args: unknown[] = [],\n kwargs: Record<string, unknown> = {},\n ) {\n return this.request(\"POST\", `/api/nodes/${segment(path)}/method`, MethodResultSchema, {\n method,\n args,\n kwargs,\n });\n }\n\n getNodeErrors(path: string) {\n return this.request(\"GET\", `/api/nodes/${segment(path)}/errors`, NodeErrorsSchema);\n }\n\n getPreview(path: string, width = 640, height = 360) {\n return this.request(\"GET\", `/api/preview/${segment(path)}`, PreviewSchema, undefined, {\n width,\n height,\n });\n }\n\n batch(operations: TdBatchOperation[]) {\n return this.request(\"POST\", \"/api/batch\", BatchResultSchema, { operations });\n }\n\n getNetworkErrors(path: string) {\n return this.request(\"GET\", `/api/network/${segment(path)}/errors`, NodeErrorsSchema);\n }\n\n getNetworkTopology(path: string, recursive = false) {\n return this.request(\n \"GET\",\n `/api/network/${segment(path)}/topology`,\n TopologySchema,\n undefined,\n recursive ? { recursive: true } : undefined,\n );\n }\n\n getNetworkPerformance(path: string, recursive = false) {\n return this.request(\n \"GET\",\n `/api/network/${segment(path)}/performance`,\n PerformanceSchema,\n undefined,\n recursive ? { recursive: true } : undefined,\n );\n }\n}\n","import { z } from \"zod\";\n\nexport const ConfigSchema = z.object({\n /** TouchDesigner bridge host. */\n tdHost: z.string().min(1).default(\"127.0.0.1\"),\n /** TouchDesigner bridge port (WebServer DAT). */\n tdPort: z.coerce.number().int().positive().max(65535).default(9980),\n /** MCP transport: `stdio` (default, for local clients) or `http` (Streamable HTTP, loopback-only). */\n transport: z.enum([\"stdio\", \"http\"]).default(\"stdio\"),\n /** Log verbosity (written to stderr). */\n logLevel: z.enum([\"debug\", \"info\", \"warn\", \"error\", \"silent\"]).default(\"info\"),\n /** Per-request timeout against the TD bridge, in milliseconds. */\n requestTimeoutMs: z.coerce.number().int().positive().default(10000),\n /** HTTP transport port (only used when transport=http). */\n httpPort: z.coerce.number().int().positive().max(65535).default(3939),\n /** Subscribe to TD WebSocket events and forward them as MCP logging notifications. */\n events: z.enum([\"on\", \"off\"]).default(\"on\"),\n /**\n * Raw Python escape-hatch tools (`execute_python_script`, `exec_node_method`).\n * Set to \"off\" to lock them out for restricted setups; on by default.\n */\n rawPython: z.enum([\"on\", \"off\"]).default(\"on\"),\n /**\n * Optional shared bearer token for the TD bridge. When set, the server sends it\n * as `Authorization: Bearer <token>` and the bridge requires a match. Leave unset\n * (default) for the zero-config local flow. Set the SAME value in TouchDesigner's\n * environment (`TDMCP_BRIDGE_TOKEN`) to turn enforcement on.\n */\n bridgeToken: z.string().min(1).optional(),\n});\n\nexport type TdmcpConfig = z.infer<typeof ConfigSchema>;\n\n/**\n * Loads and validates configuration from environment variables. Missing values\n * fall back to sensible defaults; invalid values throw a descriptive ZodError.\n */\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): TdmcpConfig {\n return ConfigSchema.parse({\n tdHost: env.TDMCP_TD_HOST,\n tdPort: env.TDMCP_TD_PORT,\n transport: env.TDMCP_TRANSPORT,\n logLevel: env.TDMCP_LOG_LEVEL,\n requestTimeoutMs: env.TDMCP_REQUEST_TIMEOUT_MS,\n httpPort: env.TDMCP_HTTP_PORT,\n events: env.TDMCP_EVENTS,\n rawPython: env.TDMCP_RAW_PYTHON,\n bridgeToken: env.TDMCP_BRIDGE_TOKEN || undefined,\n });\n}\n\n/** Base URL for the TouchDesigner REST bridge. */\nexport function tdBaseUrl(config: Pick<TdmcpConfig, \"tdHost\" | \"tdPort\">): string {\n return `http://${config.tdHost}:${config.tdPort}`;\n}\n","import { TouchDesignerClient } from \"../td-client/touchDesignerClient.js\";\nimport { type TdmcpConfig, tdBaseUrl } from \"../utils/config.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\n/**\n * Owns the TouchDesigner client and exposes a cheap health probe. The MCP server\n * stays alive whether or not TD is reachable.\n */\nexport class ConnectionManager {\n readonly client: TouchDesignerClient;\n\n constructor(config: TdmcpConfig, logger: Logger) {\n this.client = new TouchDesignerClient({\n baseUrl: tdBaseUrl(config),\n timeoutMs: config.requestTimeoutMs,\n token: config.bridgeToken,\n logger,\n });\n }\n\n async isReachable(): Promise<boolean> {\n try {\n await this.client.getInfo();\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { KnowledgeBase } from \"../knowledge/index.js\";\nimport { RecipeLibrary } from \"../recipes/loader.js\";\nimport type { ToolContext } from \"../tools/types.js\";\nimport type { TdmcpConfig } from \"../utils/config.js\";\nimport { createLogger, type Logger } from \"../utils/logger.js\";\nimport { ConnectionManager } from \"./connectionManager.js\";\n\nexport interface ToolContextOverrides {\n logger?: Logger;\n knowledge?: KnowledgeBase;\n recipes?: RecipeLibrary;\n connection?: ConnectionManager;\n}\n\n/**\n * Assembles the shared {@link ToolContext} that backs every tool handler. Both\n * the MCP server and the agent CLI build their context here, so the two surfaces\n * stay on the same core (client + knowledge + recipes) without duplicating wiring.\n */\nexport function buildToolContext(\n config: TdmcpConfig,\n overrides: ToolContextOverrides = {},\n): ToolContext {\n const logger = overrides.logger ?? createLogger(config.logLevel);\n const connection = overrides.connection ?? new ConnectionManager(config, logger);\n const knowledge = overrides.knowledge ?? new KnowledgeBase({ logger });\n const recipes = overrides.recipes ?? new RecipeLibrary({ logger });\n return {\n client: connection.client,\n knowledge,\n recipes,\n logger,\n allowRawPython: config.rawPython !== \"off\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { type TdEvent, TdEventStream } from \"../td-client/eventStream.js\";\nimport { type TdmcpConfig, tdBaseUrl } from \"../utils/config.js\";\nimport type { Logger } from \"../utils/logger.js\";\n\n/** A running transport plus a way to shut it down cleanly. */\nexport interface TransportHandle {\n close: () => Promise<void>;\n}\n\nconst MCP_PATH = \"/mcp\";\n\n/** Forwards one TD event to a connected MCP client as a logging notification. */\nfunction forwardEvent(server: McpServer, event: TdEvent): void {\n const level = event.event === \"node.error\" ? \"error\" : \"info\";\n void server.sendLoggingMessage({ level, logger: \"touchdesigner\", data: event }).catch(() => {\n // client may not support logging or not be connected yet — ignore\n });\n}\n\n/** Opens the TD event stream (if enabled) and routes each event to `onEvent`. */\nfunction createEventStream(\n config: TdmcpConfig,\n logger: Logger,\n onEvent: (event: TdEvent) => void,\n): TdEventStream | undefined {\n if (config.events !== \"on\") return undefined;\n const url = `${tdBaseUrl(config).replace(/^http/, \"ws\")}/`;\n const stream = new TdEventStream({ url, logger, onEvent });\n stream.start();\n return stream;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, payload: unknown): void {\n res.writeHead(status, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify(payload));\n}\n\nfunction startStdio(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): TransportHandle {\n const server = createMcpServer();\n const transport = new StdioServerTransport();\n void server.connect(transport);\n logger.info(\"tdmcp connected over stdio\");\n\n const events = createEventStream(config, logger, (event) => forwardEvent(server, event));\n\n return {\n close: async () => {\n events?.close();\n await server.close();\n },\n };\n}\n\n/**\n * Stateful Streamable HTTP transport: one MCP server + transport per session,\n * keyed by the `mcp-session-id` header. Sessions are created on an `initialize`\n * POST and torn down on transport close or DELETE.\n */\nfunction startHttp(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): TransportHandle {\n const transports = new Map<string, StreamableHTTPServerTransport>();\n const servers = new Map<string, McpServer>();\n const events = createEventStream(config, logger, (event) => {\n for (const sessionServer of servers.values()) forwardEvent(sessionServer, event);\n });\n\n const httpServer: Server = createServer((req, res) => {\n void handle(req, res).catch((err) => {\n logger.error(\"HTTP request failed\", { error: String(err) });\n if (!res.headersSent) {\n sendJson(res, 500, {\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal server error\" },\n id: null,\n });\n }\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n if (url.pathname !== MCP_PATH) {\n sendJson(res, 404, { error: \"Not found. MCP endpoint is at /mcp.\" });\n return;\n }\n const sessionId = req.headers[\"mcp-session-id\"];\n const existing = typeof sessionId === \"string\" ? transports.get(sessionId) : undefined;\n\n if (req.method === \"POST\") {\n const body = await readBody(req);\n if (!existing) {\n if (!isInitializeRequest(body)) {\n sendJson(res, 400, {\n jsonrpc: \"2.0\",\n error: { code: -32000, message: \"No valid session; send an initialize request first.\" },\n id: null,\n });\n return;\n }\n const sessionServer = createMcpServer();\n const created: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n transports.set(id, created);\n servers.set(id, sessionServer);\n },\n // Reject Host headers other than loopback to block DNS-rebinding attacks.\n enableDnsRebindingProtection: true,\n allowedHosts: [`127.0.0.1:${config.httpPort}`, `localhost:${config.httpPort}`],\n });\n created.onclose = () => {\n if (created.sessionId) {\n transports.delete(created.sessionId);\n servers.delete(created.sessionId);\n }\n };\n await sessionServer.connect(created);\n await created.handleRequest(req, res, body);\n return;\n }\n await existing.handleRequest(req, res, body);\n return;\n }\n\n if (req.method === \"GET\" || req.method === \"DELETE\") {\n if (!existing) {\n sendJson(res, 400, { error: \"Unknown or missing mcp-session-id.\" });\n return;\n }\n await existing.handleRequest(req, res);\n return;\n }\n\n sendJson(res, 405, { error: \"Method not allowed.\" });\n }\n\n // Bind to loopback by default so HTTP isn't unexpectedly exposed.\n httpServer.listen(config.httpPort, \"127.0.0.1\", () => {\n logger.info(\"tdmcp listening over Streamable HTTP\", { port: config.httpPort, path: MCP_PATH });\n });\n\n return {\n close: async () => {\n events?.close();\n for (const transport of transports.values()) await transport.close();\n transports.clear();\n servers.clear();\n await new Promise<void>((resolve) => httpServer.close(() => resolve()));\n },\n };\n}\n\n/**\n * Connects the MCP server to a transport based on config. `stdio` is the default;\n * `http` serves Streamable HTTP. Returns a handle for clean shutdown.\n */\nexport async function startTransport(\n createMcpServer: () => McpServer,\n config: TdmcpConfig,\n logger: Logger,\n): Promise<TransportHandle> {\n if (config.transport === \"http\") {\n return startHttp(createMcpServer, config, logger);\n }\n return startStdio(createMcpServer, config, logger);\n}\n","import { type Logger, silentLogger } from \"../utils/logger.js\";\n\nexport interface TdEvent {\n event: string;\n data?: unknown;\n}\n\nexport type TdEventHandler = (event: TdEvent) => void;\n\n/** High-frequency events are dropped unless explicitly opted in, to avoid flooding. */\nconst HIGH_FREQUENCY = new Set([\"timeline.frame\", \"node.cook\"]);\n\n/**\n * Parses a raw WebSocket message into a `TdEvent`, applying the high-frequency\n * filter. Returns `undefined` for messages that should be ignored.\n */\nexport function parseEventMessage(raw: unknown, includeHighFrequency = false): TdEvent | undefined {\n if (typeof raw !== \"string\") return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n if (!parsed || typeof parsed !== \"object\") return undefined;\n const event = (parsed as { event?: unknown }).event;\n if (typeof event !== \"string\") return undefined;\n if (!includeHighFrequency && HIGH_FREQUENCY.has(event)) return undefined;\n return { event, data: (parsed as { data?: unknown }).data };\n}\n\nexport interface TdEventStreamOptions {\n url: string;\n onEvent: TdEventHandler;\n logger?: Logger;\n includeHighFrequency?: boolean;\n}\n\n/**\n * Connects to the TouchDesigner bridge WebSocket and forwards events. Uses the\n * built-in global `WebSocket` (Node 22+), reconnects with exponential backoff,\n * and is fully optional — the server works whether or not this connects.\n */\nexport class TdEventStream {\n private socket?: WebSocket;\n private closed = false;\n private backoffMs = 1000;\n private readonly url: string;\n private readonly onEvent: TdEventHandler;\n private readonly logger: Logger;\n private readonly includeHighFrequency: boolean;\n\n constructor(options: TdEventStreamOptions) {\n this.url = options.url;\n this.onEvent = options.onEvent;\n this.logger = options.logger ?? silentLogger;\n this.includeHighFrequency = options.includeHighFrequency ?? false;\n }\n\n start(): void {\n this.connect();\n }\n\n private connect(): void {\n if (this.closed) return;\n let socket: WebSocket;\n try {\n socket = new WebSocket(this.url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.socket = socket;\n socket.addEventListener(\"open\", () => {\n this.backoffMs = 1000;\n this.logger.debug(\"event stream connected\", { url: this.url });\n });\n socket.addEventListener(\"message\", (ev) => {\n const event = parseEventMessage((ev as { data?: unknown }).data, this.includeHighFrequency);\n if (!event) return;\n try {\n this.onEvent(event);\n } catch (err) {\n this.logger.debug(\"event handler failed\", { error: String(err) });\n }\n });\n socket.addEventListener(\"close\", () => this.scheduleReconnect());\n socket.addEventListener(\"error\", () => {\n // a \"close\" event follows; reconnection is handled there\n });\n }\n\n private scheduleReconnect(): void {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 2, 30000);\n const timer = setTimeout(() => this.connect(), delay);\n timer.unref?.();\n }\n\n close(): void {\n this.closed = true;\n try {\n this.socket?.close();\n } catch {\n // ignore\n }\n }\n}\n","import { runInstallBridge } from \"./cli/installBridge.js\";\nimport { createTdmcpServer } from \"./server/tdmcpServer.js\";\nimport { startTransport } from \"./server/transportFactory.js\";\nimport { loadConfig } from \"./utils/config.js\";\nimport { createLogger } from \"./utils/logger.js\";\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n if (argv[0] === \"install-bridge\") {\n runInstallBridge(argv.slice(1));\n return;\n }\n\n const config = loadConfig();\n const logger = createLogger(config.logLevel);\n\n try {\n const handle = await startTransport(\n () => createTdmcpServer(config, { logger }),\n config,\n logger,\n );\n\n const shutdown = () => {\n logger.info(\"tdmcp shutting down\");\n void handle.close().finally(() => process.exit(0));\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n } catch (err) {\n logger.error(\"Failed to start tdmcp server\", { error: String(err) });\n process.exitCode = 1;\n }\n}\n\nvoid main();\n"],"mappings":"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","names":["existsSync","existsSync","z","z","z","z","z","z","z","z","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","ResourceTemplate","z","z","z","cached","q","parentPath","q","z","z","q","z","z","q","z","z","q","z","z","q","z","builder","z","q","q2","z","z","z","z","z","z","z","z","q","z","z","z","z","z","z","z","z","z","z","z","z","z","RESOLUTIONS","q","z","z","z","z","z","q","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","parentOf","z","fetch","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","parentOf","z","z","dirname","resolve","fileURLToPath","existsSync","readFileSync","join","existsSync","join","readFileSync","cached","q","existsSync","readdirSync","readFileSync","join","z","z","existsSync","readdirSync","readFileSync","join","z","resolve"]}