From fea2b6d3d0a8534d34d5fa4a3d1ac5d42df1960b Mon Sep 17 00:00:00 2001 From: shrimbly Date: Sat, 14 Feb 2026 23:33:58 +1300 Subject: [PATCH] feat: register generate3d node type across codebase Register in execution index, workflowStore (executeWorkflow, regenerateNode, executeSelectedNodes), nodes index, WorkflowCanvas (nodeTypes, getNodeHandles, minimap color, findCompatibleHandle). Co-Authored-By: Claude Opus 4.6 --- src/components/WorkflowCanvas.tsx | 9 ++++++++- src/components/nodes/index.ts | 1 + src/store/execution/index.ts | 3 +++ src/store/workflowStore.ts | 9 +++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/components/WorkflowCanvas.tsx b/src/components/WorkflowCanvas.tsx index d07c40b5..3f651c27 100644 --- a/src/components/WorkflowCanvas.tsx +++ b/src/components/WorkflowCanvas.tsx @@ -28,6 +28,7 @@ import { PromptConstructorNode, GenerateImageNode, GenerateVideoNode, + Generate3DNode, LLMGenerateNode, SplitGridNode, OutputNode, @@ -63,6 +64,7 @@ const nodeTypes: NodeTypes = { promptConstructor: PromptConstructorNode, nanoBanana: GenerateImageNode, generateVideo: GenerateVideoNode, + generate3d: Generate3DNode, llmGenerate: LLMGenerateNode, splitGrid: SplitGridNode, output: OutputNode, @@ -118,6 +120,8 @@ const getNodeHandles = (nodeType: string): { inputs: string[]; outputs: string[] return { inputs: ["image", "text"], outputs: ["image"] }; case "generateVideo": return { inputs: ["image", "text"], outputs: ["video"] }; + case "generate3d": + return { inputs: ["image", "text"], outputs: ["3d"] }; case "llmGenerate": return { inputs: ["text", "image"], outputs: ["text"] }; case "splitGrid": @@ -488,8 +492,9 @@ export function WorkflowCanvas() { return null; } } - // Output handle - check for video or image type + // Output handle - check for video, 3d, or image type if (handleType === "video") return "video"; + if (handleType === "3d") return "3d"; return handleType === "image" ? "image" : null; } @@ -1663,6 +1668,8 @@ export function WorkflowCanvas() { return "#22c55e"; case "generateVideo": return "#9333ea"; + case "generate3d": + return "#fb923c"; case "llmGenerate": return "#06b6d4"; case "splitGrid": diff --git a/src/components/nodes/index.ts b/src/components/nodes/index.ts index c161655d..5a42793b 100644 --- a/src/components/nodes/index.ts +++ b/src/components/nodes/index.ts @@ -5,6 +5,7 @@ export { PromptNode } from "./PromptNode"; export { PromptConstructorNode } from "./PromptConstructorNode"; export { GenerateImageNode, NanoBananaNode } from "./GenerateImageNode"; export { GenerateVideoNode } from "./GenerateVideoNode"; +export { Generate3DNode } from "./Generate3DNode"; export { LLMGenerateNode } from "./LLMGenerateNode"; export { SplitGridNode } from "./SplitGridNode"; export { OutputNode } from "./OutputNode"; diff --git a/src/store/execution/index.ts b/src/store/execution/index.ts index 9354dd51..bac0ad55 100644 --- a/src/store/execution/index.ts +++ b/src/store/execution/index.ts @@ -24,6 +24,9 @@ export type { NanoBananaOptions } from "./nanoBananaExecutor"; export { executeGenerateVideo } from "./generateVideoExecutor"; export type { GenerateVideoOptions } from "./generateVideoExecutor"; +export { executeGenerate3D } from "./generate3dExecutor"; +export type { Generate3DOptions } from "./generate3dExecutor"; + export { executeLlmGenerate } from "./llmGenerateExecutor"; export type { LlmGenerateOptions } from "./llmGenerateExecutor"; diff --git a/src/store/workflowStore.ts b/src/store/workflowStore.ts index fad8e449..8d57e4b2 100644 --- a/src/store/workflowStore.ts +++ b/src/store/workflowStore.ts @@ -67,6 +67,7 @@ import { executeImageCompare, executeNanoBanana, executeGenerateVideo, + executeGenerate3D, executeLlmGenerate, executeSplitGrid, executeVideoStitch, @@ -889,6 +890,9 @@ export const useWorkflowStore = create((set, get) => ({ case "generateVideo": await executeGenerateVideo(executionCtx); break; + case "generate3d": + await executeGenerate3D(executionCtx); + break; case "llmGenerate": await executeLlmGenerate(executionCtx); break; @@ -1042,6 +1046,8 @@ export const useWorkflowStore = create((set, get) => ({ await executeLlmGenerate(executionCtx, regenOptions); } else if (node.type === "generateVideo") { await executeGenerateVideo(executionCtx, regenOptions); + } else if (node.type === "generate3d") { + await executeGenerate3D(executionCtx, regenOptions); } else if (node.type === "splitGrid") { await executeSplitGrid(executionCtx); } else if (node.type === "videoStitch") { @@ -1171,6 +1177,9 @@ export const useWorkflowStore = create((set, get) => ({ case "generateVideo": await executeGenerateVideo(executionCtx, regenOptions); break; + case "generate3d": + await executeGenerate3D(executionCtx, regenOptions); + break; case "llmGenerate": await executeLlmGenerate(executionCtx, regenOptions); break;