@genfeedai/workflow-ui 0.2.4 → 0.2.6

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.
Files changed (67) hide show
  1. package/dist/canvas.mjs +19 -17
  2. package/dist/canvas.mjs.map +1 -0
  3. package/dist/{chunk-MGLAKMDP.mjs → chunk-2BHILUF7.mjs} +2 -0
  4. package/dist/chunk-2BHILUF7.mjs.map +1 -0
  5. package/dist/{chunk-U4QPE4CY.mjs → chunk-2C2AAXJP.mjs} +2 -0
  6. package/dist/chunk-2C2AAXJP.mjs.map +1 -0
  7. package/dist/{chunk-ZSITTZ4S.mjs → chunk-3GWH2ZOH.mjs} +5 -3
  8. package/dist/chunk-3GWH2ZOH.mjs.map +1 -0
  9. package/dist/{chunk-XRC3O5GK.mjs → chunk-4JOFNZW6.mjs} +2 -0
  10. package/dist/chunk-4JOFNZW6.mjs.map +1 -0
  11. package/dist/{chunk-2FUPL67V.mjs → chunk-72UIUFXH.mjs} +23 -13
  12. package/dist/chunk-72UIUFXH.mjs.map +1 -0
  13. package/dist/{chunk-GPYIIWD5.mjs → chunk-7DJHFOIW.mjs} +3 -1
  14. package/dist/chunk-7DJHFOIW.mjs.map +1 -0
  15. package/dist/{chunk-QQVHGJ2G.mjs → chunk-AZJFDWBF.mjs} +2 -0
  16. package/dist/chunk-AZJFDWBF.mjs.map +1 -0
  17. package/dist/{chunk-C6MQBJFC.mjs → chunk-G3HCTMAZ.mjs} +3 -1
  18. package/dist/chunk-G3HCTMAZ.mjs.map +1 -0
  19. package/dist/{chunk-IYFWAJBB.mjs → chunk-HMTYPFOT.mjs} +3 -1
  20. package/dist/chunk-HMTYPFOT.mjs.map +1 -0
  21. package/dist/{chunk-7LV4UAUS.mjs → chunk-IKR6GVZ4.mjs} +2 -0
  22. package/dist/chunk-IKR6GVZ4.mjs.map +1 -0
  23. package/dist/{chunk-YUIK4AHM.mjs → chunk-JSF4FHBH.mjs} +3 -1
  24. package/dist/chunk-JSF4FHBH.mjs.map +1 -0
  25. package/dist/{chunk-53XDE62A.mjs → chunk-NDDAL2OG.mjs} +8 -6
  26. package/dist/chunk-NDDAL2OG.mjs.map +1 -0
  27. package/dist/{chunk-OJWVEEMM.mjs → chunk-R5L7WB7F.mjs} +4 -2
  28. package/dist/chunk-R5L7WB7F.mjs.map +1 -0
  29. package/dist/{chunk-B4EAAKYF.mjs → chunk-SBB2YW3Y.mjs} +2 -0
  30. package/dist/chunk-SBB2YW3Y.mjs.map +1 -0
  31. package/dist/{chunk-FWJIAW2E.mjs → chunk-SHU7JPQY.mjs} +7 -5
  32. package/dist/chunk-SHU7JPQY.mjs.map +1 -0
  33. package/dist/chunk-SRPSHHHV.mjs +3 -0
  34. package/dist/chunk-SRPSHHHV.mjs.map +1 -0
  35. package/dist/{chunk-ESVULCFY.mjs → chunk-TOFB4BTA.mjs} +3 -1
  36. package/dist/chunk-TOFB4BTA.mjs.map +1 -0
  37. package/dist/{chunk-ORVDYXDP.mjs → chunk-VKXTPLM7.mjs} +6 -4
  38. package/dist/chunk-VKXTPLM7.mjs.map +1 -0
  39. package/dist/{chunk-VVQ4CH77.mjs → chunk-X3XNTD4R.mjs} +5 -2
  40. package/dist/chunk-X3XNTD4R.mjs.map +1 -0
  41. package/dist/chunk-YYFM6P4C.mjs +3 -0
  42. package/dist/chunk-YYFM6P4C.mjs.map +1 -0
  43. package/dist/hooks.mjs +13 -11
  44. package/dist/hooks.mjs.map +1 -0
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.mjs +34 -26
  47. package/dist/index.mjs.map +1 -0
  48. package/dist/lib.mjs +6 -4
  49. package/dist/lib.mjs.map +1 -0
  50. package/dist/nodes.mjs +15 -13
  51. package/dist/nodes.mjs.map +1 -0
  52. package/dist/panels.mjs +5 -3
  53. package/dist/panels.mjs.map +1 -0
  54. package/dist/provider.mjs +5 -3
  55. package/dist/provider.mjs.map +1 -0
  56. package/dist/stores.mjs +8 -6
  57. package/dist/stores.mjs.map +1 -0
  58. package/dist/toolbar.mjs +7 -5
  59. package/dist/toolbar.mjs.map +1 -0
  60. package/dist/ui.mjs +4 -2
  61. package/dist/ui.mjs.map +1 -0
  62. package/dist/workflowStore-XYPHB6DS.mjs +4 -0
  63. package/dist/workflowStore-XYPHB6DS.mjs.map +1 -0
  64. package/package.json +3 -3
  65. package/dist/chunk-LDN7IX4Y.mjs +0 -1
  66. package/dist/chunk-MLJJBBTB.mjs +0 -1
  67. package/dist/workflowStore-N2F7WIG3.mjs +0 -2
@@ -184,7 +184,7 @@ var createEdgeSlice = (set, get) => ({
184
184
  },
185
185
  onNodesChange: (changes) => {
186
186
  const hasMeaningfulChange = changes.some(
187
- (change) => change.type === "add" || change.type === "remove" || change.type === "replace"
187
+ (change) => change.type === "add" || change.type === "remove" || change.type === "replace" || change.type === "position"
188
188
  );
189
189
  set((state) => ({
190
190
  nodes: applyNodeChanges(changes, state.nodes),
@@ -1155,3 +1155,5 @@ var useWorkflowStore = create()(
1155
1155
  );
1156
1156
 
1157
1157
  export { getHandleType, useWorkflowStore };
1158
+ //# sourceMappingURL=chunk-7DJHFOIW.mjs.map
1159
+ //# sourceMappingURL=chunk-7DJHFOIW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/workflow/helpers/equality.ts","../src/stores/workflow/slices/chatSlice.ts","../src/stores/workflow/helpers/nodeHelpers.ts","../src/stores/workflow/slices/edgeSlice.ts","../src/stores/workflow/slices/groupSlice.ts","../src/stores/workflow/helpers/propagation.ts","../src/stores/workflow/slices/lockingSlice.ts","../src/stores/workflow/slices/nodeSlice.ts","../src/stores/workflow/slices/persistenceSlice.ts","../src/stores/workflow/slices/selectionSlice.ts","../src/stores/workflow/slices/snapshotSlice.ts","../src/stores/workflow/workflowStore.ts"],"names":["NODE_DEFINITIONS","rfAddEdge"],"mappings":"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","file":"chunk-7DJHFOIW.mjs","sourcesContent":["import type { NodeGroup, WorkflowEdge, WorkflowNode } from '@genfeedai/types';\n\ninterface TemporalState {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n groups: NodeGroup[];\n}\n\n/**\n * Shallow equality check for temporal state.\n * Optimized for the specific shape of workflow state to avoid expensive JSON.stringify.\n *\n * Checks:\n * 1. Array length equality (fast early exit)\n * 2. Reference equality for arrays (no change)\n * 3. Individual item id + key property comparisons\n */\nexport function temporalStateEquals(\n a: TemporalState,\n b: TemporalState,\n): boolean {\n // Reference equality (same object)\n if (a === b) return true;\n\n // Check nodes\n if (!arraysShallowEqual(a.nodes, b.nodes, nodeEquals)) return false;\n\n // Check edges\n if (!arraysShallowEqual(a.edges, b.edges, edgeEquals)) return false;\n\n // Check groups\n if (!arraysShallowEqual(a.groups, b.groups, groupEquals)) return false;\n\n return true;\n}\n\n/**\n * Compare two arrays using a custom equality function for items.\n * Returns true if arrays have same length and all items are equal.\n */\nfunction arraysShallowEqual<T>(\n a: T[],\n b: T[],\n itemEquals: (a: T, b: T) => boolean,\n): boolean {\n // Reference equality\n if (a === b) return true;\n\n // Length check (fast exit)\n if (a.length !== b.length) return false;\n\n // Check each item\n for (let i = 0; i < a.length; i++) {\n if (!itemEquals(a[i], b[i])) return false;\n }\n\n return true;\n}\n\n/**\n * Compare two nodes for equality.\n * Checks id, type, position, and key data properties.\n */\nfunction nodeEquals(a: WorkflowNode, b: WorkflowNode): boolean {\n if (a === b) return true;\n\n // Basic properties\n if (a.id !== b.id) return false;\n if (a.type !== b.type) return false;\n\n // Position\n if (a.position.x !== b.position.x || a.position.y !== b.position.y)\n return false;\n\n // Dimensions (if set)\n if (a.width !== b.width || a.height !== b.height) return false;\n\n // Data comparison - compare key fields that affect undo/redo\n const aData = a.data as Record<string, unknown>;\n const bData = b.data as Record<string, unknown>;\n\n // Compare status and outputs (the main things that change)\n if (aData.status !== bData.status) return false;\n if (aData.outputImage !== bData.outputImage) return false;\n if (aData.outputVideo !== bData.outputVideo) return false;\n if (aData.outputText !== bData.outputText) return false;\n if (aData.outputAudio !== bData.outputAudio) return false;\n\n // Compare input fields\n if (aData.prompt !== bData.prompt) return false;\n if (aData.image !== bData.image) return false;\n if (aData.video !== bData.video) return false;\n if (aData.audio !== bData.audio) return false;\n if (aData.inputPrompt !== bData.inputPrompt) return false;\n if (aData.inputImage !== bData.inputImage) return false;\n if (aData.inputVideo !== bData.inputVideo) return false;\n if (aData.inputAudio !== bData.inputAudio) return false;\n if (aData.inputText !== bData.inputText) return false;\n\n // Compare model selection\n if (aData.model !== bData.model) return false;\n\n // Schema params need JSON comparison (complex objects)\n if (aData.schemaParams !== bData.schemaParams) {\n if (\n JSON.stringify(aData.schemaParams) !== JSON.stringify(bData.schemaParams)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Compare two edges for equality.\n */\nfunction edgeEquals(a: WorkflowEdge, b: WorkflowEdge): boolean {\n if (a === b) return true;\n\n return (\n a.id === b.id &&\n a.source === b.source &&\n a.target === b.target &&\n a.sourceHandle === b.sourceHandle &&\n a.targetHandle === b.targetHandle\n );\n}\n\n/**\n * Compare two groups for equality.\n */\nfunction groupEquals(a: NodeGroup, b: NodeGroup): boolean {\n if (a === b) return true;\n\n if (a.id !== b.id) return false;\n if (a.name !== b.name) return false;\n if (a.color !== b.color) return false;\n\n // Compare nodeIds array\n if (a.nodeIds.length !== b.nodeIds.length) return false;\n for (let i = 0; i < a.nodeIds.length; i++) {\n if (a.nodeIds[i] !== b.nodeIds[i]) return false;\n }\n\n return true;\n}\n","import type { StateCreator } from 'zustand';\nimport type { WorkflowStore } from '../types';\nimport type { EditOperation, SnapshotSlice } from './snapshotSlice';\n\nexport interface ChatMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: number;\n}\n\nexport interface ChatSlice {\n chatMessages: ChatMessage[];\n isChatOpen: boolean;\n addChatMessage: (role: 'user' | 'assistant', content: string) => void;\n clearChatMessages: () => void;\n toggleChat: () => void;\n setChatOpen: (open: boolean) => void;\n applyChatEditOperations: (operations: EditOperation[]) => {\n applied: number;\n skipped: string[];\n };\n}\n\nexport const createChatSlice: StateCreator<\n WorkflowStore & SnapshotSlice & ChatSlice,\n [],\n [],\n ChatSlice\n> = (set, get) => ({\n addChatMessage: (role, content) => {\n set((state) => ({\n chatMessages: [\n ...state.chatMessages,\n {\n content,\n id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n role,\n timestamp: Date.now(),\n },\n ],\n }));\n },\n\n applyChatEditOperations: (operations) => {\n const state = get();\n\n // Capture snapshot before AI edits for one-click revert\n state.captureSnapshot();\n\n return state.applyEditOperations(operations);\n },\n chatMessages: [],\n\n clearChatMessages: () => {\n set({ chatMessages: [] });\n },\n isChatOpen: false,\n\n setChatOpen: (open) => {\n set({ isChatOpen: open });\n },\n\n toggleChat: () => {\n set((state) => ({ isChatOpen: !state.isChatOpen }));\n },\n});\n","import type { HandleType, NodeType } from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport { nanoid } from 'nanoid';\n\n/**\n * Generate a unique ID for nodes and edges\n */\nexport function generateId(): string {\n return nanoid(8);\n}\n\n/**\n * Get handle type from node type and handle id\n */\nexport function getHandleType(\n nodeType: NodeType,\n handleId: string | null,\n direction: 'source' | 'target',\n): HandleType | null {\n const nodeDef = NODE_DEFINITIONS[nodeType];\n if (!nodeDef) return null;\n\n const handles = direction === 'source' ? nodeDef.outputs : nodeDef.inputs;\n const handle = handles.find((h) => h.id === handleId);\n\n return handle?.type ?? null;\n}\n","import type {\n EdgeStyle,\n NodeType,\n WorkflowEdge,\n WorkflowNode,\n} from '@genfeedai/types';\nimport { CONNECTION_RULES, NODE_DEFINITIONS } from '@genfeedai/types';\nimport type { Connection, EdgeChange, NodeChange } from '@xyflow/react';\nimport {\n applyEdgeChanges,\n applyNodeChanges,\n addEdge as rfAddEdge,\n} from '@xyflow/react';\nimport type { StateCreator } from 'zustand';\nimport { generateId, getHandleType } from '../helpers/nodeHelpers';\nimport type { WorkflowStore } from '../types';\n\nexport interface EdgeSlice {\n onNodesChange: (changes: NodeChange<WorkflowNode>[]) => void;\n onEdgesChange: (changes: EdgeChange<WorkflowEdge>[]) => void;\n onConnect: (connection: Connection) => void;\n removeEdge: (edgeId: string) => void;\n setEdgeStyle: (style: EdgeStyle) => void;\n toggleEdgePause: (edgeId: string) => void;\n isValidConnection: (connection: Connection) => boolean;\n findCompatibleHandle: (\n sourceNodeId: string,\n sourceHandleId: string | null,\n targetNodeId: string,\n ) => string | null;\n}\n\nexport const createEdgeSlice: StateCreator<WorkflowStore, [], [], EdgeSlice> = (\n set,\n get,\n) => ({\n findCompatibleHandle: (sourceNodeId, sourceHandleId, targetNodeId) => {\n const { nodes, edges } = get();\n\n const sourceNode = nodes.find((n) => n.id === sourceNodeId);\n const targetNode = nodes.find((n) => n.id === targetNodeId);\n\n if (!sourceNode || !targetNode) return null;\n\n const sourceType = getHandleType(\n sourceNode.type as NodeType,\n sourceHandleId,\n 'source',\n );\n\n if (!sourceType) return null;\n\n const targetDef = NODE_DEFINITIONS[targetNode.type as NodeType];\n if (!targetDef) return null;\n\n const existingTargetHandles = new Set(\n edges.filter((e) => e.target === targetNodeId).map((e) => e.targetHandle),\n );\n\n for (const input of targetDef.inputs) {\n // Skip handles that already have connections, unless they support multiple connections\n const hasExistingConnection = existingTargetHandles.has(input.id);\n if (hasExistingConnection && !input.multiple) continue;\n\n if (CONNECTION_RULES[sourceType]?.includes(input.type)) {\n return input.id;\n }\n }\n\n return null;\n },\n\n isValidConnection: (connection) => {\n const { nodes } = get();\n\n const sourceNode = nodes.find((n) => n.id === connection.source);\n const targetNode = nodes.find((n) => n.id === connection.target);\n\n if (!sourceNode || !targetNode) return false;\n\n const sourceType = getHandleType(\n sourceNode.type as NodeType,\n connection.sourceHandle ?? null,\n 'source',\n );\n const targetType = getHandleType(\n targetNode.type as NodeType,\n connection.targetHandle ?? null,\n 'target',\n );\n\n if (!sourceType || !targetType) return false;\n\n return CONNECTION_RULES[sourceType]?.includes(targetType) ?? false;\n },\n\n onConnect: (connection) => {\n const { isValidConnection, propagateOutputsDownstream } = get();\n if (!isValidConnection(connection)) return;\n\n set((state) => ({\n edges: rfAddEdge(\n {\n ...connection,\n id: generateId(),\n type: state.edgeStyle,\n },\n state.edges,\n ) as WorkflowEdge[],\n isDirty: true,\n }));\n\n // Propagate outputs when a connection is made\n // This handles both input nodes (prompt, image, etc.) and generation nodes\n // that already have output (e.g., TTS with generated audio -> LipSync)\n if (connection.source) {\n propagateOutputsDownstream(connection.source);\n }\n },\n\n onEdgesChange: (changes) => {\n const hasMeaningfulChange = changes.some(\n (change) =>\n change.type === 'add' ||\n change.type === 'remove' ||\n change.type === 'replace',\n );\n\n set((state) => ({\n edges: applyEdgeChanges(changes, state.edges) as WorkflowEdge[],\n ...(hasMeaningfulChange && { isDirty: true }),\n }));\n },\n onNodesChange: (changes) => {\n const hasMeaningfulChange = changes.some(\n (change) =>\n change.type === 'add' ||\n change.type === 'remove' ||\n change.type === 'replace' ||\n change.type === 'position',\n );\n\n set((state) => ({\n nodes: applyNodeChanges(changes, state.nodes) as WorkflowNode[],\n ...(hasMeaningfulChange && { isDirty: true }),\n }));\n },\n\n removeEdge: (edgeId) => {\n set((state) => ({\n edges: state.edges.filter((edge) => edge.id !== edgeId),\n isDirty: true,\n }));\n },\n\n setEdgeStyle: (style) => {\n set((state) => ({\n edgeStyle: style,\n edges: state.edges.map((edge) => ({ ...edge, type: style })),\n isDirty: true,\n }));\n },\n\n toggleEdgePause: (edgeId) => {\n set((state) => ({\n edges: state.edges.map((edge) =>\n edge.id === edgeId\n ? {\n ...edge,\n data: {\n ...edge.data,\n hasPause: !edge.data?.hasPause,\n },\n }\n : edge,\n ),\n isDirty: true,\n }));\n },\n});\n","import type { GroupColor, NodeGroup } from '@genfeedai/types';\nimport type { StateCreator } from 'zustand';\nimport { generateId } from '../helpers/nodeHelpers';\nimport type { WorkflowStore } from '../types';\n\nconst DEFAULT_GROUP_COLORS: GroupColor[] = [\n 'purple',\n 'blue',\n 'green',\n 'yellow',\n 'orange',\n 'red',\n 'pink',\n 'gray',\n];\n\nexport interface GroupSlice {\n createGroup: (nodeIds: string[], name?: string) => string;\n deleteGroup: (groupId: string) => void;\n addToGroup: (groupId: string, nodeIds: string[]) => void;\n removeFromGroup: (groupId: string, nodeIds: string[]) => void;\n toggleGroupLock: (groupId: string) => void;\n renameGroup: (groupId: string, name: string) => void;\n setGroupColor: (groupId: string, color: GroupColor) => void;\n getGroupByNodeId: (nodeId: string) => NodeGroup | undefined;\n getGroupById: (groupId: string) => NodeGroup | undefined;\n}\n\nexport const createGroupSlice: StateCreator<\n WorkflowStore,\n [],\n [],\n GroupSlice\n> = (set, get) => ({\n addToGroup: (groupId, nodeIds) => {\n set((state) => ({\n groups: state.groups.map((g) =>\n g.id === groupId\n ? { ...g, nodeIds: [...new Set([...g.nodeIds, ...nodeIds])] }\n : g,\n ),\n isDirty: true,\n }));\n },\n createGroup: (nodeIds, name) => {\n if (nodeIds.length === 0) return '';\n\n const groupId = generateId();\n const { groups } = get();\n const colorIndex = groups.length % DEFAULT_GROUP_COLORS.length;\n\n const newGroup: NodeGroup = {\n color: DEFAULT_GROUP_COLORS[colorIndex],\n id: groupId,\n isLocked: false,\n name: name ?? `Group ${groups.length + 1}`,\n nodeIds,\n };\n\n set((state) => ({\n groups: [...state.groups, newGroup],\n isDirty: true,\n }));\n\n return groupId;\n },\n\n deleteGroup: (groupId) => {\n set((state) => ({\n groups: state.groups.filter((g) => g.id !== groupId),\n isDirty: true,\n }));\n },\n\n getGroupById: (groupId) => {\n return get().groups.find((g) => g.id === groupId);\n },\n\n getGroupByNodeId: (nodeId) => {\n return get().groups.find((g) => g.nodeIds.includes(nodeId));\n },\n\n removeFromGroup: (groupId, nodeIds) => {\n set((state) => ({\n groups: state.groups.map((g) =>\n g.id === groupId\n ? { ...g, nodeIds: g.nodeIds.filter((id) => !nodeIds.includes(id)) }\n : g,\n ),\n isDirty: true,\n }));\n },\n\n renameGroup: (groupId, name) => {\n set((state) => ({\n groups: state.groups.map((g) => (g.id === groupId ? { ...g, name } : g)),\n isDirty: true,\n }));\n },\n\n setGroupColor: (groupId, color) => {\n set((state) => ({\n groups: state.groups.map((g) => (g.id === groupId ? { ...g, color } : g)),\n isDirty: true,\n }));\n },\n\n toggleGroupLock: (groupId) => {\n const { groups, lockMultipleNodes, unlockMultipleNodes } = get();\n const group = groups.find((g) => g.id === groupId);\n if (!group) return;\n\n set((state) => ({\n groups: state.groups.map((g) =>\n g.id === groupId ? { ...g, isLocked: !g.isLocked } : g,\n ),\n isDirty: true,\n }));\n\n if (!group.isLocked) {\n lockMultipleNodes(group.nodeIds);\n } else {\n unlockMultipleNodes(group.nodeIds);\n }\n },\n});\n","/**\n * Propagation helpers for downstream output routing in the workflow graph.\n *\n * Data flow pipeline:\n * getNodeOutput -> computeDownstreamUpdates -> hasStateChanged -> applyNodeUpdates\n *\n * Key invariants:\n * - Cycle prevention via BFS visited set\n * - Gallery dedup via Set-based image merging\n * - Passthrough semantics: nodes with existing output re-enqueue for further propagation\n * - Change detection avoids unnecessary Zustand state updates\n * - `outputImages` array is checked BEFORE `outputImage` (multi-output nodes use the array)\n */\n\nimport type { WorkflowEdge, WorkflowNode } from '@genfeedai/types';\n\n/**\n * Extract the primary output value from a node's data, following the priority chain.\n *\n * Priority order:\n * 1. `outputImages` (array -> first element)\n * 2. `outputImage`\n * 3. `outputVideo`\n * 4. `outputText`\n * 5. `outputAudio`\n * 6. `prompt`\n * 7. `extractedTweet`\n * 8. `image`\n * 9. `video`\n * 10. `audio`\n */\nexport function getNodeOutput(node: WorkflowNode): string | null {\n const data = node.data as Record<string, unknown>;\n // outputImages array before outputImage -- multi-output nodes store results in array\n const outputImages = data.outputImages as string[] | undefined;\n if (outputImages?.length) return outputImages[0];\n\n const output =\n data.outputImage ??\n data.outputVideo ??\n data.outputText ??\n data.outputAudio ??\n data.prompt ??\n data.extractedTweet ??\n data.image ??\n data.video ??\n data.audio ??\n null;\n if (output === null) return null;\n if (typeof output === 'string') return output;\n if (Array.isArray(output) && output.length > 0) return String(output[0]);\n return null;\n}\n\n/**\n * Classify a node type into its media output category.\n *\n * @returns The media type ('text' | 'image' | 'video' | 'audio') or null for unknown types.\n */\nexport function getOutputType(\n sourceType: string,\n): 'text' | 'image' | 'video' | 'audio' | null {\n if (['prompt', 'llm', 'tweetParser', 'transcribe'].includes(sourceType)) {\n return 'text';\n }\n if (\n [\n 'imageGen',\n 'image',\n 'imageInput',\n 'upscale',\n 'resize',\n 'reframe',\n 'imageGridSplit',\n ].includes(sourceType)\n ) {\n return 'image';\n }\n if (\n [\n 'videoGen',\n 'video',\n 'videoInput',\n 'animation',\n 'videoStitch',\n 'lipSync',\n 'voiceChange',\n 'motionControl',\n 'videoTrim',\n 'videoFrameExtract',\n 'subtitle',\n ].includes(sourceType)\n ) {\n return 'video';\n }\n if (['textToSpeech', 'audio', 'audioInput'].includes(sourceType)) {\n return 'audio';\n }\n return null;\n}\n\n/**\n * Map a source node's output to the correct input field(s) on a target node.\n *\n * Uses `getOutputType` to classify the source, then applies type-aware routing rules.\n *\n * @returns An object with the input field(s) to set, or null if incompatible.\n */\nexport function mapOutputToInput(\n output: string,\n sourceType: string,\n targetType: string,\n): Record<string, unknown> | null {\n const outputType = getOutputType(sourceType);\n\n // Handle download node\n if (targetType === 'download') {\n if (outputType === 'video') {\n return { inputImage: null, inputType: 'video', inputVideo: output };\n }\n if (outputType === 'image') {\n return { inputImage: output, inputType: 'image', inputVideo: null };\n }\n return null;\n }\n\n if (outputType === 'text') {\n if (['textToSpeech', 'subtitle'].includes(targetType)) {\n return { inputText: output };\n }\n if (['imageGen', 'videoGen', 'llm', 'motionControl'].includes(targetType)) {\n return { inputPrompt: output };\n }\n }\n\n if (outputType === 'image') {\n if (['upscale', 'reframe'].includes(targetType)) {\n return { inputImage: output, inputType: 'image', inputVideo: null };\n }\n if (\n [\n 'videoGen',\n 'lipSync',\n 'voiceChange',\n 'motionControl',\n 'resize',\n 'animation',\n ].includes(targetType)\n ) {\n return { inputImage: output };\n }\n if (targetType === 'imageGen') {\n return { inputImages: [output] };\n }\n }\n\n if (outputType === 'video') {\n if (['upscale', 'reframe'].includes(targetType)) {\n return { inputImage: null, inputType: 'video', inputVideo: output };\n }\n if (\n [\n 'lipSync',\n 'voiceChange',\n 'resize',\n 'videoStitch',\n 'videoTrim',\n 'videoFrameExtract',\n 'subtitle',\n 'transcribe',\n ].includes(targetType)\n ) {\n return { inputVideo: output };\n }\n }\n\n if (outputType === 'audio') {\n if (['lipSync', 'voiceChange', 'transcribe'].includes(targetType)) {\n return { inputAudio: output };\n }\n }\n\n return null;\n}\n\n/**\n * Collect images for a gallery node, deduplicating across existing gallery images,\n * pending update images (from other edges in the same BFS pass), and new source images.\n *\n * @param sourceData - The source node's data record\n * @param currentOutput - The current BFS output string\n * @param existingGalleryImages - Images already in the gallery node's data\n * @param pendingUpdateImages - Images accumulated from earlier edges in this propagation\n * @returns An update object with deduplicated `images` array, or null if no images to add.\n */\nexport function collectGalleryUpdate(\n sourceData: Record<string, unknown>,\n currentOutput: string,\n existingGalleryImages: string[],\n pendingUpdateImages: string[],\n): Record<string, unknown> | null {\n const allImages: string[] = [];\n\n const outputImagesArr = sourceData.outputImages as string[] | undefined;\n if (outputImagesArr?.length) {\n allImages.push(...outputImagesArr);\n } else if (typeof currentOutput === 'string') {\n allImages.push(currentOutput);\n }\n\n if (allImages.length === 0) return null;\n\n return {\n images: [\n ...new Set([\n ...existingGalleryImages,\n ...pendingUpdateImages,\n ...allImages,\n ]),\n ],\n };\n}\n\n/**\n * Compute all downstream node updates via BFS traversal from a source node.\n *\n * Pure function -- reads `nodes` and `edges` as snapshot parameters, never touches the store.\n *\n * @returns A Map of nodeId -> partial data updates to apply.\n */\nexport function computeDownstreamUpdates(\n sourceNodeId: string,\n initialOutput: string,\n nodes: WorkflowNode[],\n edges: WorkflowEdge[],\n): Map<string, Record<string, unknown>> {\n const updates: Map<string, Record<string, unknown>> = new Map();\n const visited = new Set<string>();\n const queue: Array<{ nodeId: string; output: string }> = [\n { nodeId: sourceNodeId, output: initialOutput },\n ];\n\n // --- BFS traversal ---\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n // --- Cycle prevention ---\n if (visited.has(current.nodeId)) continue;\n visited.add(current.nodeId);\n\n const currentNode = nodes.find((n) => n.id === current.nodeId);\n if (!currentNode) continue;\n\n const downstreamEdges = edges.filter((e) => e.source === current.nodeId);\n\n for (const edge of downstreamEdges) {\n const targetNode = nodes.find((n) => n.id === edge.target);\n if (!targetNode) continue;\n\n // --- Gallery aggregation (outputGallery special case) ---\n if (targetNode.type === 'outputGallery') {\n const sourceData = currentNode.data as Record<string, unknown>;\n const existing = updates.get(edge.target) ?? {};\n const pendingImages = (existing.images as string[]) ?? [];\n const targetData = targetNode.data as Record<string, unknown>;\n const galleryExisting = (targetData.images as string[]) ?? [];\n\n const galleryUpdate = collectGalleryUpdate(\n sourceData,\n current.output,\n galleryExisting,\n pendingImages,\n );\n\n if (galleryUpdate) {\n updates.set(edge.target, { ...existing, ...galleryUpdate });\n }\n continue;\n }\n\n // --- Type-aware routing ---\n const inputUpdate = mapOutputToInput(\n current.output,\n currentNode.type,\n targetNode.type,\n );\n if (inputUpdate) {\n const existing = updates.get(edge.target) ?? {};\n updates.set(edge.target, { ...existing, ...inputUpdate });\n\n // --- Passthrough: re-enqueue if target already has output ---\n const targetOutput = getNodeOutput(targetNode);\n if (targetOutput && !visited.has(edge.target)) {\n queue.push({ nodeId: edge.target, output: targetOutput });\n }\n }\n }\n }\n\n return updates;\n}\n\n/**\n * Check whether any of the computed updates differ from the current node data.\n *\n * Uses element-wise array comparison for arrays and strict equality for primitives.\n * Short-circuits on the first detected change.\n */\nexport function hasStateChanged(\n updates: Map<string, Record<string, unknown>>,\n nodes: WorkflowNode[],\n): boolean {\n for (const [nodeId, update] of updates) {\n const existingNode = nodes.find((n) => n.id === nodeId);\n if (!existingNode) continue;\n const existingData = existingNode.data as Record<string, unknown>;\n for (const [key, value] of Object.entries(update)) {\n const prev = existingData[key];\n if (Array.isArray(prev) && Array.isArray(value)) {\n if (\n prev.length !== value.length ||\n prev.some((v, i) => v !== value[i])\n ) {\n return true;\n }\n } else if (prev !== value) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Apply computed updates to the nodes array immutably.\n *\n * Nodes without updates are returned by reference (no new object allocation).\n */\nexport function applyNodeUpdates(\n nodes: WorkflowNode[],\n updates: Map<string, Record<string, unknown>>,\n): WorkflowNode[] {\n return nodes.map((n) => {\n const update = updates.get(n.id);\n if (update) {\n return { ...n, data: { ...n.data, ...update } };\n }\n return n;\n });\n}\n\n/**\n * Propagate existing outputs to downstream nodes after loading a workflow.\n * Uses `getNodeOutput` to check for any output value, ensuring the same\n * priority chain is used everywhere (outputImages, outputImage, etc.).\n *\n * Used by both `loadWorkflow` and `loadWorkflowById` in the persistence slice.\n */\nexport function propagateExistingOutputs(\n nodes: WorkflowNode[],\n propagateFn: (nodeId: string) => void,\n): void {\n for (const node of nodes) {\n if (getNodeOutput(node) !== null) {\n propagateFn(node.id);\n }\n }\n}\n","import type { StateCreator } from 'zustand';\nimport { getNodeOutput } from '../helpers/propagation';\nimport type { WorkflowStore } from '../types';\n\nexport interface LockingSlice {\n _setNodeLockState: (\n predicate: (nodeId: string) => boolean,\n lock: boolean,\n ) => void;\n toggleNodeLock: (nodeId: string) => void;\n lockNode: (nodeId: string) => void;\n unlockNode: (nodeId: string) => void;\n lockMultipleNodes: (nodeIds: string[]) => void;\n unlockMultipleNodes: (nodeIds: string[]) => void;\n unlockAllNodes: () => void;\n isNodeLocked: (nodeId: string) => boolean;\n}\n\nexport const createLockingSlice: StateCreator<\n WorkflowStore,\n [],\n [],\n LockingSlice\n> = (set, get) => ({\n _setNodeLockState: (predicate, lock) => {\n set((state) => ({\n isDirty: true,\n nodes: state.nodes.map((n) =>\n predicate(n.id)\n ? {\n ...n,\n data: {\n ...n.data,\n isLocked: lock,\n lockTimestamp: lock ? Date.now() : undefined,\n ...(lock && { cachedOutput: getNodeOutput(n) }),\n },\n draggable: !lock,\n }\n : n,\n ),\n }));\n },\n\n isNodeLocked: (nodeId) => {\n const { nodes, groups } = get();\n const node = nodes.find((n) => n.id === nodeId);\n if (!node) return false;\n\n if (node.data.isLocked) return true;\n\n return groups.some(\n (group) => group.isLocked && group.nodeIds.includes(nodeId),\n );\n },\n\n lockMultipleNodes: (nodeIds) => {\n get()._setNodeLockState((id) => nodeIds.includes(id), true);\n },\n\n lockNode: (nodeId) => {\n const node = get().getNodeById(nodeId);\n if (!node || node.data.isLocked) return;\n get()._setNodeLockState((id) => id === nodeId, true);\n },\n\n toggleNodeLock: (nodeId) => {\n const node = get().getNodeById(nodeId);\n if (!node) return;\n const shouldLock = !(node.data.isLocked ?? false);\n get()._setNodeLockState((id) => id === nodeId, shouldLock);\n },\n\n unlockAllNodes: () => {\n get()._setNodeLockState(() => true, false);\n },\n\n unlockMultipleNodes: (nodeIds) => {\n get()._setNodeLockState((id) => nodeIds.includes(id), false);\n },\n\n unlockNode: (nodeId) => {\n get()._setNodeLockState((id) => id === nodeId, false);\n },\n});\n","import type {\n NodeType,\n WorkflowEdge,\n WorkflowNode,\n WorkflowNodeData,\n} from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport type { XYPosition } from '@xyflow/react';\nimport type { StateCreator } from 'zustand';\nimport { generateId } from '../helpers/nodeHelpers';\nimport {\n applyNodeUpdates,\n computeDownstreamUpdates,\n getNodeOutput,\n hasStateChanged,\n} from '../helpers/propagation';\nimport type { ImageHistoryItem, WorkflowStore } from '../types';\n\nexport interface NodeSlice {\n addNode: (type: NodeType, position: XYPosition) => string;\n addNodesAndEdges: (nodes: WorkflowNode[], edges: WorkflowEdge[]) => void;\n updateNodeData: <T extends WorkflowNodeData>(\n nodeId: string,\n data: Partial<T>,\n ) => void;\n removeNode: (nodeId: string) => void;\n duplicateNode: (nodeId: string) => string | null;\n propagateOutputsDownstream: (\n sourceNodeId: string,\n outputValue?: string,\n ) => void;\n addToGlobalHistory: (item: Omit<ImageHistoryItem, 'id'>) => void;\n clearGlobalHistory: () => void;\n}\n\nexport const createNodeSlice: StateCreator<WorkflowStore, [], [], NodeSlice> = (\n set,\n get,\n) => ({\n addNode: (type, position) => {\n const nodeDef = NODE_DEFINITIONS[type];\n if (!nodeDef) return '';\n\n const id = generateId();\n const newNode: WorkflowNode = {\n data: {\n ...nodeDef.defaultData,\n label: nodeDef.label,\n status: 'idle',\n } as WorkflowNodeData,\n id,\n position,\n type,\n ...(type === 'download' && { height: 320, width: 280 }),\n };\n\n set((state) => ({\n isDirty: true,\n nodes: [...state.nodes, newNode],\n }));\n\n return id;\n },\n\n addNodesAndEdges: (newNodes, newEdges) => {\n if (newNodes.length === 0) return;\n\n set((state) => ({\n edges: [...state.edges, ...newEdges],\n isDirty: true,\n nodes: [...state.nodes, ...newNodes],\n }));\n\n // Propagate outputs for nodes that have existing connections\n const { propagateOutputsDownstream } = get();\n const sourceNodeIds = new Set(newEdges.map((e) => e.source));\n for (const sourceId of sourceNodeIds) {\n propagateOutputsDownstream(sourceId);\n }\n },\n\n addToGlobalHistory: (item) => {\n const id = `history-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n set((state) => ({\n globalImageHistory: [{ ...item, id }, ...state.globalImageHistory].slice(\n 0,\n 100,\n ),\n }));\n },\n\n clearGlobalHistory: () => {\n set({ globalImageHistory: [] });\n },\n\n duplicateNode: (nodeId) => {\n const { nodes, edges, edgeStyle, propagateOutputsDownstream } = get();\n const node = nodes.find((n) => n.id === nodeId);\n if (!node) return null;\n\n const newId = generateId();\n const newNode: WorkflowNode = {\n ...node,\n data: {\n ...node.data,\n jobId: null,\n status: 'idle',\n } as WorkflowNodeData,\n id: newId,\n position: {\n x: node.position.x + 50,\n y: node.position.y + 50,\n },\n };\n\n const incomingEdges = edges.filter(\n (e) => e.target === nodeId && e.source !== nodeId,\n );\n const clonedEdges: WorkflowEdge[] = incomingEdges.map((edge) => ({\n ...edge,\n id: generateId(),\n target: newId,\n type: edgeStyle,\n }));\n\n set((state) => ({\n edges: [...state.edges, ...clonedEdges],\n isDirty: true,\n nodes: [...state.nodes, newNode],\n }));\n\n const sourcesNotified = new Set<string>();\n for (const edge of incomingEdges) {\n if (!sourcesNotified.has(edge.source)) {\n sourcesNotified.add(edge.source);\n propagateOutputsDownstream(edge.source);\n }\n }\n\n return newId;\n },\n\n propagateOutputsDownstream: (sourceNodeId, outputValue?) => {\n const { nodes, edges } = get();\n const sourceNode = nodes.find((n) => n.id === sourceNodeId);\n if (!sourceNode) return;\n\n const output = outputValue ?? getNodeOutput(sourceNode);\n if (!output) return;\n\n const updates = computeDownstreamUpdates(\n sourceNodeId,\n output,\n nodes,\n edges,\n );\n if (updates.size === 0) return;\n if (!hasStateChanged(updates, nodes)) return;\n\n set((state) => ({\n isDirty: true,\n nodes: applyNodeUpdates(state.nodes, updates),\n }));\n },\n\n removeNode: (nodeId) => {\n set((state) => ({\n edges: state.edges.filter(\n (edge) => edge.source !== nodeId && edge.target !== nodeId,\n ),\n isDirty: true,\n nodes: state.nodes.filter((node) => node.id !== nodeId),\n }));\n },\n\n updateNodeData: (nodeId, data) => {\n const { nodes, propagateOutputsDownstream } = get();\n const node = nodes.find((n) => n.id === nodeId);\n\n const TRANSIENT_KEYS = new Set(['status', 'progress', 'error', 'jobId']);\n const dataKeys = Object.keys(data as Record<string, unknown>);\n const hasPersistedChange = dataKeys.some((key) => !TRANSIENT_KEYS.has(key));\n\n set((state) => ({\n nodes: state.nodes.map((n) =>\n n.id === nodeId ? { ...n, data: { ...n.data, ...data } } : n,\n ),\n ...(hasPersistedChange && { isDirty: true }),\n }));\n\n const inputNodeTypes = [\n 'prompt',\n 'image',\n 'imageInput',\n 'video',\n 'videoInput',\n 'audio',\n 'audioInput',\n 'tweetParser',\n ];\n const hasOutputUpdate =\n 'outputImage' in data ||\n 'outputImages' in data ||\n 'outputVideo' in data ||\n 'outputAudio' in data ||\n 'outputText' in data;\n\n if (\n node &&\n (inputNodeTypes.includes(node.type as string) || hasOutputUpdate)\n ) {\n if (hasOutputUpdate) {\n const dataRecord = data as Record<string, unknown>;\n if ('outputImages' in dataRecord) {\n propagateOutputsDownstream(nodeId);\n } else {\n const outputValue =\n dataRecord.outputImage ??\n dataRecord.outputVideo ??\n dataRecord.outputAudio ??\n dataRecord.outputText;\n if (typeof outputValue === 'string') {\n propagateOutputsDownstream(nodeId, outputValue);\n }\n }\n } else {\n propagateOutputsDownstream(nodeId);\n }\n }\n },\n});\n","import type {\n EdgeStyle,\n NodeType,\n ValidationResult,\n WorkflowEdge,\n WorkflowFile,\n WorkflowNode,\n WorkflowNodeData,\n WorkflowRefNodeData,\n} from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport type { StateCreator } from 'zustand';\nimport { propagateExistingOutputs } from '../helpers/propagation';\nimport type { WorkflowData, WorkflowStore } from '../types';\n\n/**\n * Normalize edges loaded from storage to use React Flow edge types.\n * Migrates legacy 'bezier' type to 'default'.\n */\nfunction normalizeEdgeTypes(edges: WorkflowEdge[]): WorkflowEdge[] {\n return edges.map((edge) => ({\n ...edge,\n type: edge.type === 'bezier' ? 'default' : edge.type,\n }));\n}\n\n/**\n * Hydrate workflow nodes with default data from NODE_DEFINITIONS.\n * Ensures all required fields exist even for nodes saved before new fields were added.\n * Inlined from @/lib/utils/nodeHydration to avoid app-specific import.\n */\nfunction hydrateWorkflowNodes(nodes: WorkflowNode[]): WorkflowNode[] {\n return nodes.map((node) => {\n const nodeDef = NODE_DEFINITIONS[node.type as NodeType];\n if (!nodeDef) return node;\n\n return {\n ...node,\n data: {\n ...nodeDef.defaultData,\n ...node.data,\n } as WorkflowNodeData,\n };\n });\n}\n\nexport interface PersistenceSlice {\n loadWorkflow: (workflow: WorkflowFile) => void;\n clearWorkflow: () => void;\n exportWorkflow: () => WorkflowFile;\n saveWorkflow: (signal?: AbortSignal) => Promise<WorkflowData>;\n loadWorkflowById: (id: string, signal?: AbortSignal) => Promise<void>;\n listWorkflows: (signal?: AbortSignal) => Promise<WorkflowData[]>;\n deleteWorkflow: (id: string, signal?: AbortSignal) => Promise<void>;\n duplicateWorkflowApi: (\n id: string,\n signal?: AbortSignal,\n ) => Promise<WorkflowData>;\n createNewWorkflow: (signal?: AbortSignal) => Promise<string>;\n setWorkflowName: (name: string) => void;\n getNodeById: (id: string) => WorkflowNode | undefined;\n getConnectedInputs: (nodeId: string) => Map<string, string | string[]>;\n getConnectedNodeIds: (nodeIds: string[]) => string[];\n validateWorkflow: () => ValidationResult;\n setDirty: (dirty: boolean) => void;\n getNodesWithComments: () => WorkflowNode[];\n markCommentViewed: (nodeId: string) => void;\n setNavigationTarget: (nodeId: string | null) => void;\n getUnviewedCommentCount: () => number;\n}\n\nexport const createPersistenceSlice: StateCreator<\n WorkflowStore,\n [],\n [],\n PersistenceSlice\n> = (set, get) => ({\n clearWorkflow: () => {\n set({\n edges: [],\n groups: [],\n isDirty: false,\n nodes: [],\n selectedNodeIds: [],\n workflowId: null,\n workflowName: 'Untitled Workflow',\n });\n },\n\n createNewWorkflow: async () => {\n throw new Error(\n 'createNewWorkflow not implemented - consuming app must provide API integration',\n );\n },\n\n deleteWorkflow: async () => {\n throw new Error(\n 'deleteWorkflow not implemented - consuming app must provide API integration',\n );\n },\n\n duplicateWorkflowApi: async () => {\n throw new Error(\n 'duplicateWorkflowApi not implemented - consuming app must provide API integration',\n );\n },\n\n exportWorkflow: () => {\n const { nodes, edges, edgeStyle, workflowName, groups } = get();\n return {\n createdAt: new Date().toISOString(),\n description: '',\n edgeStyle,\n edges,\n groups,\n name: workflowName,\n nodes,\n updatedAt: new Date().toISOString(),\n version: 1,\n };\n },\n\n getConnectedInputs: (nodeId) => {\n const { nodes, edges } = get();\n const inputs = new Map<string, string | string[]>();\n\n const incomingEdges = edges.filter((edge) => edge.target === nodeId);\n\n for (const edge of incomingEdges) {\n const sourceNode = nodes.find((n) => n.id === edge.source);\n if (!sourceNode) continue;\n\n const handleId = edge.targetHandle;\n if (!handleId) continue;\n\n const sourceData = sourceNode.data as WorkflowNodeData & {\n outputImage?: string;\n outputVideo?: string;\n outputText?: string;\n outputAudio?: string;\n prompt?: string;\n image?: string;\n video?: string;\n audio?: string;\n };\n\n let value: string | null = null;\n\n if (edge.sourceHandle === 'image') {\n value = sourceData.outputImage ?? sourceData.image ?? null;\n } else if (edge.sourceHandle === 'video') {\n value = sourceData.outputVideo ?? sourceData.video ?? null;\n } else if (edge.sourceHandle === 'text') {\n value = sourceData.outputText ?? sourceData.prompt ?? null;\n } else if (edge.sourceHandle === 'audio') {\n value = sourceData.outputAudio ?? sourceData.audio ?? null;\n }\n\n if (value) {\n const existing = inputs.get(handleId);\n if (existing) {\n if (Array.isArray(existing)) {\n inputs.set(handleId, [...existing, value]);\n } else {\n inputs.set(handleId, [existing, value]);\n }\n } else {\n inputs.set(handleId, value);\n }\n }\n }\n\n return inputs;\n },\n\n getConnectedNodeIds: (nodeIds) => {\n const { edges } = get();\n const connected = new Set<string>(nodeIds);\n const visited = new Set<string>();\n\n // Traverse UPSTREAM only - find all nodes that feed into the selected nodes\n // This way selecting a node shows its dependencies, not what depends on it\n const queue = [...nodeIds];\n while (queue.length > 0) {\n const currentId = queue.shift()!;\n if (visited.has(currentId)) continue;\n visited.add(currentId);\n\n const upstreamEdges = edges.filter((e) => e.target === currentId);\n for (const edge of upstreamEdges) {\n if (!connected.has(edge.source)) {\n connected.add(edge.source);\n queue.push(edge.source);\n }\n }\n }\n\n return Array.from(connected);\n },\n\n getNodeById: (id) => {\n return get().nodes.find((node) => node.id === id);\n },\n\n getNodesWithComments: () => {\n const { nodes } = get();\n return nodes\n .filter((node) => {\n const data = node.data as WorkflowNodeData;\n return data.comment?.trim();\n })\n .sort((a, b) => {\n if (Math.abs(a.position.y - b.position.y) < 50) {\n return a.position.x - b.position.x;\n }\n return a.position.y - b.position.y;\n });\n },\n\n getUnviewedCommentCount: () => {\n const { nodes, viewedCommentIds } = get();\n return nodes.filter((node) => {\n const data = node.data as WorkflowNodeData;\n return data.comment?.trim() && !viewedCommentIds.has(node.id);\n }).length;\n },\n\n listWorkflows: async () => {\n throw new Error(\n 'listWorkflows not implemented - consuming app must provide API integration',\n );\n },\n loadWorkflow: (workflow) => {\n const hydratedNodes = hydrateWorkflowNodes(workflow.nodes);\n\n set({\n edgeStyle: workflow.edgeStyle,\n edges: normalizeEdgeTypes(workflow.edges),\n groups: workflow.groups ?? [],\n isDirty: true,\n nodes: hydratedNodes,\n selectedNodeIds: [],\n workflowId: null,\n workflowName: workflow.name,\n });\n\n // Propagate existing outputs to downstream nodes after load\n propagateExistingOutputs(hydratedNodes, get().propagateOutputsDownstream);\n\n // Propagation after load is idempotent; don't trigger save cycle\n set({ isDirty: false });\n },\n\n loadWorkflowById: async () => {\n throw new Error(\n 'loadWorkflowById not implemented - consuming app must provide API integration',\n );\n },\n\n markCommentViewed: (nodeId: string) => {\n set((state) => {\n const newSet = new Set(state.viewedCommentIds);\n newSet.add(nodeId);\n return { viewedCommentIds: newSet };\n });\n },\n\n // API operations - stubs that throw by default.\n // Consuming apps override these via the store creator or by extending the slice.\n saveWorkflow: async () => {\n throw new Error(\n 'saveWorkflow not implemented - consuming app must provide API integration',\n );\n },\n\n setDirty: (dirty) => {\n set({ isDirty: dirty });\n },\n\n setNavigationTarget: (nodeId: string | null) => {\n set({ navigationTargetId: nodeId });\n },\n\n setWorkflowName: (name) => {\n set({ isDirty: true, workflowName: name });\n },\n\n validateWorkflow: () => {\n const { nodes, edges } = get();\n const errors: {\n nodeId: string;\n message: string;\n severity: 'error' | 'warning';\n }[] = [];\n const warnings: {\n nodeId: string;\n message: string;\n severity: 'error' | 'warning';\n }[] = [];\n\n if (nodes.length === 0) {\n errors.push({\n message: 'Workflow is empty - add some nodes first',\n nodeId: '',\n severity: 'error',\n });\n return { errors, isValid: false, warnings };\n }\n\n if (edges.length === 0 && nodes.length > 1) {\n errors.push({\n message: 'No connections - connect your nodes together',\n nodeId: '',\n severity: 'error',\n });\n return { errors, isValid: false, warnings };\n }\n\n const hasNodeOutput = (node: WorkflowNode): boolean => {\n const data = node.data as WorkflowNodeData & {\n prompt?: string;\n image?: string;\n video?: string;\n audio?: string;\n outputImage?: string;\n outputVideo?: string;\n outputText?: string;\n };\n\n switch (node.type as NodeType) {\n case 'prompt':\n return Boolean(data.prompt?.trim());\n case 'imageInput':\n return Boolean(data.image);\n case 'videoInput':\n return Boolean(data.video);\n case 'audioInput':\n return Boolean(data.audio);\n default:\n return true;\n }\n };\n\n for (const node of nodes) {\n const nodeDef = NODE_DEFINITIONS[node.type as NodeType];\n if (!nodeDef) continue;\n\n const incomingEdges = edges.filter((e) => e.target === node.id);\n\n for (const input of nodeDef.inputs) {\n if (input.required) {\n const connectionEdge = incomingEdges.find(\n (e) => e.targetHandle === input.id,\n );\n if (!connectionEdge) {\n errors.push({\n message: `Missing required input: ${input.label}`,\n nodeId: node.id,\n severity: 'error',\n });\n } else {\n const sourceNode = nodes.find(\n (n) => n.id === connectionEdge.source,\n );\n if (sourceNode && !hasNodeOutput(sourceNode)) {\n errors.push({\n message: `${(sourceNode.data as WorkflowNodeData).label} is empty`,\n nodeId: sourceNode.id,\n severity: 'error',\n });\n }\n }\n }\n }\n }\n\n const visited = new Set<string>();\n const recStack = new Set<string>();\n\n function hasCycle(nodeId: string): boolean {\n if (recStack.has(nodeId)) return true;\n if (visited.has(nodeId)) return false;\n\n visited.add(nodeId);\n recStack.add(nodeId);\n\n const outgoing = edges.filter((e) => e.source === nodeId);\n for (const edge of outgoing) {\n if (hasCycle(edge.target)) return true;\n }\n\n recStack.delete(nodeId);\n return false;\n }\n\n for (const node of nodes) {\n if (hasCycle(node.id)) {\n errors.push({\n message: 'Workflow contains a cycle',\n nodeId: node.id,\n severity: 'error',\n });\n break;\n }\n }\n\n for (const node of nodes) {\n if (node.type === 'workflowRef') {\n const refData = node.data as WorkflowRefNodeData;\n if (!refData.referencedWorkflowId) {\n errors.push({\n message: 'Subworkflow node must reference a workflow',\n nodeId: node.id,\n severity: 'error',\n });\n } else if (!refData.cachedInterface) {\n warnings.push({\n message:\n 'Subworkflow interface not loaded - refresh to update handles',\n nodeId: node.id,\n severity: 'warning',\n });\n }\n }\n }\n\n return {\n errors,\n isValid: errors.length === 0,\n warnings,\n };\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { WorkflowStore } from '../types';\n\nexport interface SelectionSlice {\n setSelectedNodeIds: (nodeIds: string[]) => void;\n addToSelection: (nodeId: string) => void;\n removeFromSelection: (nodeId: string) => void;\n clearSelection: () => void;\n}\n\nexport const createSelectionSlice: StateCreator<\n WorkflowStore,\n [],\n [],\n SelectionSlice\n> = (set) => ({\n addToSelection: (nodeId) => {\n set((state) => ({\n selectedNodeIds: state.selectedNodeIds.includes(nodeId)\n ? state.selectedNodeIds\n : [...state.selectedNodeIds, nodeId],\n }));\n },\n\n clearSelection: () => {\n set({ selectedNodeIds: [] });\n },\n\n removeFromSelection: (nodeId) => {\n set((state) => ({\n selectedNodeIds: state.selectedNodeIds.filter((id) => id !== nodeId),\n }));\n },\n setSelectedNodeIds: (nodeIds) => {\n set({ selectedNodeIds: nodeIds });\n },\n});\n","import type {\n EdgeStyle,\n NodeGroup,\n WorkflowEdge,\n WorkflowNode,\n} from '@genfeedai/types';\nimport type { StateCreator } from 'zustand';\nimport type { WorkflowStore } from '../types';\n\n/**\n * EditOperation type inlined from @/lib/chat/editOperations.\n * The consuming app provides the actual applyEditOperations implementation.\n */\nexport interface EditOperation {\n type: 'add_node' | 'remove_node' | 'update_node' | 'add_edge' | 'remove_edge';\n [key: string]: unknown;\n}\n\n/**\n * Stub applyEditOperations - consuming app should override via the store creator.\n * Returns unchanged nodes/edges by default.\n */\nfunction defaultApplyEditOperations(\n _operations: EditOperation[],\n state: { nodes: WorkflowNode[]; edges: WorkflowEdge[] },\n): {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n applied: number;\n skipped: string[];\n} {\n return { applied: 0, edges: state.edges, nodes: state.nodes, skipped: [] };\n}\n\nexport interface WorkflowSnapshot {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n groups: NodeGroup[];\n edgeStyle: EdgeStyle;\n}\n\nexport interface SnapshotSlice {\n previousWorkflowSnapshot: WorkflowSnapshot | null;\n manualChangeCount: number;\n captureSnapshot: () => void;\n revertToSnapshot: () => void;\n clearSnapshot: () => void;\n incrementManualChangeCount: () => void;\n applyEditOperations: (operations: EditOperation[]) => {\n applied: number;\n skipped: string[];\n };\n}\n\nexport const createSnapshotSlice: StateCreator<\n WorkflowStore & SnapshotSlice,\n [],\n [],\n SnapshotSlice\n> = (set, get) => ({\n applyEditOperations: (operations) => {\n const state = get();\n const result = defaultApplyEditOperations(operations, {\n edges: state.edges,\n nodes: state.nodes,\n });\n\n set({\n edges: result.edges,\n isDirty: true,\n nodes: result.nodes,\n });\n\n return { applied: result.applied, skipped: result.skipped };\n },\n\n captureSnapshot: () => {\n const state = get();\n const snapshot: WorkflowSnapshot = {\n edgeStyle: state.edgeStyle,\n edges: JSON.parse(JSON.stringify(state.edges)),\n groups: JSON.parse(JSON.stringify(state.groups)),\n nodes: JSON.parse(JSON.stringify(state.nodes)),\n };\n set({\n manualChangeCount: 0,\n previousWorkflowSnapshot: snapshot,\n });\n },\n\n clearSnapshot: () => {\n set({\n manualChangeCount: 0,\n previousWorkflowSnapshot: null,\n });\n },\n\n incrementManualChangeCount: () => {\n const state = get();\n const newCount = state.manualChangeCount + 1;\n\n // Automatically clear snapshot after 3 manual changes\n if (newCount >= 3) {\n set({\n manualChangeCount: 0,\n previousWorkflowSnapshot: null,\n });\n } else {\n set({ manualChangeCount: newCount });\n }\n },\n manualChangeCount: 0,\n previousWorkflowSnapshot: null,\n\n revertToSnapshot: () => {\n const state = get();\n if (state.previousWorkflowSnapshot) {\n set({\n edgeStyle: state.previousWorkflowSnapshot.edgeStyle,\n edges: state.previousWorkflowSnapshot.edges,\n groups: state.previousWorkflowSnapshot.groups,\n isDirty: true,\n manualChangeCount: 0,\n nodes: state.previousWorkflowSnapshot.nodes,\n previousWorkflowSnapshot: null,\n });\n }\n },\n});\n","import { temporal } from 'zundo';\nimport type { StateCreator } from 'zustand';\nimport { create } from 'zustand';\nimport { temporalStateEquals } from './helpers/equality';\nimport { createChatSlice } from './slices/chatSlice';\nimport { createEdgeSlice } from './slices/edgeSlice';\nimport { createGroupSlice } from './slices/groupSlice';\nimport { createLockingSlice } from './slices/lockingSlice';\nimport { createNodeSlice } from './slices/nodeSlice';\nimport { createPersistenceSlice } from './slices/persistenceSlice';\nimport { createSelectionSlice } from './slices/selectionSlice';\nimport { createSnapshotSlice } from './slices/snapshotSlice';\nimport type { WorkflowStore } from './types';\n\n/**\n * Workflow Store\n *\n * Manages workflow state including nodes, edges, groups, and persistence.\n * Split into slices for maintainability:\n *\n * - nodeSlice: Node CRUD operations\n * - edgeSlice: Edge operations and React Flow handlers\n * - lockingSlice: Node locking functionality\n * - groupSlice: Node grouping operations\n * - selectionSlice: Multi-selection state\n * - persistenceSlice: Save/load, validation, and API operations\n *\n * Wrapped with zundo temporal middleware for undo/redo support.\n * Only tracks meaningful state (nodes, edges, groups) - not UI flags.\n */\n\n// Slice composition requires type assertion because createSnapshotSlice and\n// createChatSlice return types are lost through the `as unknown` casts needed\n// to unify their signatures. The runtime correctly composes all slices.\nconst storeCreator = ((...args: Parameters<StateCreator<WorkflowStore>>) => ({\n edgeStyle: 'default',\n edges: [],\n globalImageHistory: [],\n groups: [],\n isDirty: false,\n isLoading: false,\n isSaving: false,\n navigationTargetId: null,\n // Initial state\n nodes: [],\n selectedNodeIds: [],\n viewedCommentIds: new Set<string>(),\n workflowId: null,\n workflowName: 'Untitled Workflow',\n\n // Compose slices\n ...createNodeSlice(...args),\n ...createEdgeSlice(...args),\n ...createLockingSlice(...args),\n ...createGroupSlice(...args),\n ...createSelectionSlice(...args),\n ...createPersistenceSlice(...args),\n ...(createSnapshotSlice as unknown as typeof createNodeSlice)(...args),\n ...(createChatSlice as unknown as typeof createNodeSlice)(...args),\n})) as unknown as StateCreator<WorkflowStore, [['temporal', unknown]]>;\n\nexport const useWorkflowStore = create<WorkflowStore>()(\n temporal(storeCreator, {\n // Optimized equality check using shallow comparison instead of JSON.stringify\n equality: temporalStateEquals,\n // Limit history to prevent memory issues\n limit: 50,\n // Only track meaningful state (not UI flags like isDirty, isSaving, etc.)\n partialize: (state) => ({\n edges: state.edges,\n groups: state.groups,\n nodes: state.nodes,\n }),\n }),\n);\n"]}
@@ -256,3 +256,5 @@ function isValidShape(shape) {
256
256
  }
257
257
 
258
258
  export { useAnnotationStore, usePromptEditorStore };
259
+ //# sourceMappingURL=chunk-AZJFDWBF.mjs.map
260
+ //# sourceMappingURL=chunk-AZJFDWBF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/promptEditorStore.ts","../src/stores/annotationStore.ts"],"names":["create"],"mappings":"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","file":"chunk-AZJFDWBF.mjs","sourcesContent":["import { create } from 'zustand';\n\ninterface PromptEditorStore {\n isOpen: boolean;\n nodeId: string | null;\n prompt: string;\n fontSize: number;\n\n openEditor: (nodeId: string, prompt: string) => void;\n closeEditor: () => void;\n setPrompt: (prompt: string) => void;\n setFontSize: (size: number) => void;\n saveAndClose: () => { nodeId: string; prompt: string } | null;\n}\n\nexport const usePromptEditorStore = create<PromptEditorStore>((set, get) => ({\n closeEditor: () => {\n set({\n isOpen: false,\n nodeId: null,\n prompt: '',\n });\n },\n fontSize: 14,\n isOpen: false,\n nodeId: null,\n\n openEditor: (nodeId, prompt) => {\n set({\n isOpen: true,\n nodeId,\n prompt,\n });\n },\n prompt: '',\n\n saveAndClose: () => {\n const { nodeId, prompt } = get();\n if (!nodeId) return null;\n\n const result = { nodeId, prompt };\n\n set({\n isOpen: false,\n nodeId: null,\n prompt: '',\n });\n\n return result;\n },\n\n setFontSize: (fontSize) => {\n set({ fontSize });\n },\n\n setPrompt: (prompt) => {\n set({ prompt });\n },\n}));\n","import { create } from 'zustand';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type AnnotationTool =\n | 'select'\n | 'rectangle'\n | 'circle'\n | 'arrow'\n | 'freehand'\n | 'text';\n\nexport interface ToolOptions {\n strokeColor: string;\n strokeWidth: number;\n fillColor: string | null;\n fontSize: number;\n}\n\nexport interface BaseShape {\n id: string;\n type: AnnotationTool;\n strokeColor: string;\n strokeWidth: number;\n fillColor: string | null;\n}\n\nexport interface RectangleShape extends BaseShape {\n type: 'rectangle';\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface CircleShape extends BaseShape {\n type: 'circle';\n x: number;\n y: number;\n radius: number;\n}\n\nexport interface ArrowShape extends BaseShape {\n type: 'arrow';\n points: number[]; // [x1, y1, x2, y2]\n}\n\nexport interface FreehandShape extends BaseShape {\n type: 'freehand';\n points: number[]; // Flattened array of [x, y] pairs\n}\n\nexport interface TextShape extends BaseShape {\n type: 'text';\n x: number;\n y: number;\n text: string;\n fontSize: number;\n}\n\nexport type AnnotationShape =\n | RectangleShape\n | CircleShape\n | ArrowShape\n | FreehandShape\n | TextShape;\n\n// =============================================================================\n// STORE\n// =============================================================================\n\ninterface AnnotationStore {\n // State\n isOpen: boolean;\n nodeId: string | null;\n sourceImage: string | null;\n shapes: AnnotationShape[];\n selectedShapeId: string | null;\n currentTool: AnnotationTool;\n toolOptions: ToolOptions;\n\n // History for undo/redo\n history: AnnotationShape[][];\n historyIndex: number;\n\n // Drawing state\n isDrawing: boolean;\n drawingShape: Partial<AnnotationShape> | null;\n\n // Actions\n openAnnotation: (\n nodeId: string,\n image: string,\n existingShapes?: AnnotationShape[],\n ) => void;\n closeAnnotation: () => void;\n saveAndClose: () => { nodeId: string; shapes: AnnotationShape[] } | null;\n\n // Shape operations\n addShape: (shape: AnnotationShape) => void;\n updateShape: (id: string, updates: Partial<AnnotationShape>) => void;\n deleteShape: (id: string) => void;\n selectShape: (id: string | null) => void;\n clearShapes: () => void;\n\n // Tool operations\n setTool: (tool: AnnotationTool) => void;\n setToolOptions: (options: Partial<ToolOptions>) => void;\n\n // Drawing operations\n startDrawing: (shape: Partial<AnnotationShape>) => void;\n updateDrawing: (updates: Partial<AnnotationShape>) => void;\n finishDrawing: () => void;\n cancelDrawing: () => void;\n\n // History operations\n undo: () => void;\n redo: () => void;\n canUndo: () => boolean;\n canRedo: () => boolean;\n}\n\nconst DEFAULT_TOOL_OPTIONS: ToolOptions = {\n fillColor: null,\n fontSize: 16,\n strokeColor: '#ef4444', // Red\n strokeWidth: 3,\n};\n\nconst MAX_HISTORY = 50;\n\nlet shapeIdCounter = 0;\nfunction generateShapeId(): string {\n return `shape-${Date.now()}-${++shapeIdCounter}`;\n}\n\nexport const useAnnotationStore = create<AnnotationStore>((set, get) => ({\n addShape: (shape) => {\n set((state) => {\n const newShapes = [...state.shapes, shape];\n const newHistory = [\n ...state.history.slice(0, state.historyIndex + 1),\n newShapes,\n ].slice(-MAX_HISTORY);\n return {\n history: newHistory,\n historyIndex: newHistory.length - 1,\n shapes: newShapes,\n };\n });\n },\n\n cancelDrawing: () => {\n set({ drawingShape: null, isDrawing: false });\n },\n\n canRedo: () => {\n const { historyIndex, history } = get();\n return historyIndex < history.length - 1;\n },\n\n canUndo: () => {\n const { historyIndex } = get();\n return historyIndex > 0;\n },\n\n clearShapes: () => {\n set((state) => {\n const newHistory = [\n ...state.history.slice(0, state.historyIndex + 1),\n [],\n ].slice(-MAX_HISTORY);\n return {\n history: newHistory,\n historyIndex: newHistory.length - 1,\n selectedShapeId: null,\n shapes: [],\n };\n });\n },\n\n closeAnnotation: () => {\n set({\n drawingShape: null,\n history: [],\n historyIndex: -1,\n isDrawing: false,\n isOpen: false,\n nodeId: null,\n selectedShapeId: null,\n shapes: [],\n sourceImage: null,\n });\n },\n currentTool: 'rectangle',\n\n deleteShape: (id) => {\n set((state) => {\n const newShapes = state.shapes.filter((s) => s.id !== id);\n const newHistory = [\n ...state.history.slice(0, state.historyIndex + 1),\n newShapes,\n ].slice(-MAX_HISTORY);\n return {\n history: newHistory,\n historyIndex: newHistory.length - 1,\n selectedShapeId:\n state.selectedShapeId === id ? null : state.selectedShapeId,\n shapes: newShapes,\n };\n });\n },\n drawingShape: null,\n\n finishDrawing: () => {\n const { drawingShape, addShape } = get();\n if (drawingShape && isValidShape(drawingShape)) {\n addShape(drawingShape as AnnotationShape);\n }\n set({ drawingShape: null, isDrawing: false });\n },\n history: [],\n historyIndex: -1,\n isDrawing: false,\n isOpen: false,\n nodeId: null,\n\n openAnnotation: (nodeId, image, existingShapes = []) => {\n set({\n currentTool: 'rectangle',\n drawingShape: null,\n history: [existingShapes],\n historyIndex: 0,\n isDrawing: false,\n isOpen: true,\n nodeId,\n selectedShapeId: null,\n shapes: existingShapes,\n sourceImage: image,\n toolOptions: DEFAULT_TOOL_OPTIONS,\n });\n },\n\n redo: () => {\n set((state) => {\n if (state.historyIndex < state.history.length - 1) {\n const newIndex = state.historyIndex + 1;\n return {\n historyIndex: newIndex,\n selectedShapeId: null,\n shapes: state.history[newIndex],\n };\n }\n return state;\n });\n },\n\n saveAndClose: () => {\n const { nodeId, shapes } = get();\n if (!nodeId) return null;\n\n const result = { nodeId, shapes: [...shapes] };\n\n set({\n drawingShape: null,\n history: [],\n historyIndex: -1,\n isDrawing: false,\n isOpen: false,\n nodeId: null,\n selectedShapeId: null,\n shapes: [],\n sourceImage: null,\n });\n\n return result;\n },\n selectedShapeId: null,\n\n selectShape: (id) => {\n set({ selectedShapeId: id });\n },\n\n setTool: (tool) => {\n set({ currentTool: tool, selectedShapeId: null });\n },\n\n setToolOptions: (options) => {\n set((state) => ({\n toolOptions: { ...state.toolOptions, ...options },\n }));\n },\n shapes: [],\n sourceImage: null,\n\n startDrawing: (shape) => {\n set({\n drawingShape: {\n id: generateShapeId(),\n ...shape,\n },\n isDrawing: true,\n });\n },\n toolOptions: DEFAULT_TOOL_OPTIONS,\n\n undo: () => {\n set((state) => {\n if (state.historyIndex > 0) {\n const newIndex = state.historyIndex - 1;\n return {\n historyIndex: newIndex,\n selectedShapeId: null,\n shapes: state.history[newIndex],\n };\n }\n return state;\n });\n },\n\n updateDrawing: (updates) => {\n set((state) => ({\n drawingShape: state.drawingShape\n ? { ...state.drawingShape, ...updates }\n : null,\n }));\n },\n\n updateShape: (id, updates) => {\n set((state) => {\n const newShapes = state.shapes.map((s) =>\n s.id === id ? ({ ...s, ...updates } as AnnotationShape) : s,\n );\n const newHistory = [\n ...state.history.slice(0, state.historyIndex + 1),\n newShapes,\n ].slice(-MAX_HISTORY);\n return {\n history: newHistory,\n historyIndex: newHistory.length - 1,\n shapes: newShapes,\n };\n });\n },\n}));\n\n// Validate that a shape has all required properties\nfunction isValidShape(shape: Partial<AnnotationShape>): boolean {\n if (!shape.id || !shape.type) return false;\n\n switch (shape.type) {\n case 'rectangle':\n return (\n typeof shape.x === 'number' &&\n typeof shape.y === 'number' &&\n typeof shape.width === 'number' &&\n typeof shape.height === 'number' &&\n Math.abs(shape.width) > 5 &&\n Math.abs(shape.height) > 5\n );\n case 'circle':\n return (\n typeof shape.x === 'number' &&\n typeof shape.y === 'number' &&\n typeof shape.radius === 'number' &&\n shape.radius > 5\n );\n case 'arrow':\n return (\n Array.isArray(shape.points) &&\n shape.points.length >= 4 &&\n Math.hypot(\n shape.points[2] - shape.points[0],\n shape.points[3] - shape.points[1],\n ) > 10\n );\n case 'freehand':\n return Array.isArray(shape.points) && shape.points.length >= 4;\n case 'text':\n return (\n typeof shape.x === 'number' &&\n typeof shape.y === 'number' &&\n typeof shape.text === 'string' &&\n shape.text.length > 0\n );\n default:\n return false;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { cn } from './chunk-B4EAAKYF.mjs';
1
+ import { cn } from './chunk-SBB2YW3Y.mjs';
2
2
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
3
3
  import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -448,3 +448,5 @@ function ComparisonSliderComponent({
448
448
  var ComparisonSlider = memo(ComparisonSliderComponent);
449
449
 
450
450
  export { Checkbox, ComparisonSlider, GridPositionSelector, Input, Label2 as Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Slider };
451
+ //# sourceMappingURL=chunk-G3HCTMAZ.mjs.map
452
+ //# sourceMappingURL=chunk-G3HCTMAZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/checkbox.tsx","../src/ui/select.tsx","../src/ui/slider.tsx","../src/ui/label.tsx","../src/ui/input.tsx","../src/ui/grid-position-selector.tsx","../src/ui/comparison-slider.tsx"],"names":["jsx","CheckIcon","jsxs","Label","useCallback","memo"],"mappings":"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","file":"chunk-G3HCTMAZ.mjs","sourcesContent":["'use client';\n\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { CheckIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from './utils';\n\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none\"\n >\n <CheckIcon className=\"size-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n","'use client';\n\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';\nimport type * as React from 'react';\n\nimport { cn } from './utils';\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: 'sm' | 'default';\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'item-aligned',\n align = 'center',\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className,\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('text-muted-foreground px-2 py-1.5 text-xs', className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className,\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('bg-border pointer-events-none -mx-1 my-1 h-px', className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className,\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n 'flex cursor-default items-center justify-center py-1',\n className,\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","'use client';\n\nimport * as SliderPrimitive from '@radix-ui/react-slider';\nimport * as React from 'react';\n\nimport { cn } from './utils';\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max],\n );\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n 'relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className={cn(\n 'bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5',\n )}\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className={cn(\n 'bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full',\n )}\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n );\n}\n\nexport { Slider };\n","'use client';\n\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport type * as React from 'react';\n\nimport { cn } from './utils';\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import type * as React from 'react';\n\nimport { cn } from './utils';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","'use client';\n\nimport { memo, useCallback } from 'react';\nimport { cn } from './utils';\n\ninterface GridPosition {\n x: number;\n y: number;\n}\n\ninterface GridPositionSelectorProps {\n position: GridPosition;\n onPositionChange: (position: GridPosition) => void;\n className?: string;\n}\n\nconst GRID_POSITIONS: GridPosition[] = [\n { x: 0, y: 0 },\n { x: 0.5, y: 0 },\n { x: 1, y: 0 },\n { x: 0, y: 0.5 },\n { x: 0.5, y: 0.5 },\n { x: 1, y: 0.5 },\n { x: 0, y: 1 },\n { x: 0.5, y: 1 },\n { x: 1, y: 1 },\n];\n\nconst X_LABELS: Record<number, string> = {\n 0: 'left',\n 0.5: 'center',\n 1: 'right',\n};\nconst Y_LABELS: Record<number, string> = {\n 0: 'top',\n 0.5: 'middle',\n 1: 'bottom',\n};\n\nfunction getPositionTitle(pos: GridPosition): string {\n return `Position: ${X_LABELS[pos.x] ?? 'center'}, ${Y_LABELS[pos.y] ?? 'middle'}`;\n}\n\nfunction GridPositionSelectorComponent({\n position,\n onPositionChange,\n className,\n}: GridPositionSelectorProps) {\n const isSelected = useCallback(\n (pos: GridPosition) =>\n Math.abs(pos.x - position.x) < 0.01 &&\n Math.abs(pos.y - position.y) < 0.01,\n [position],\n );\n\n return (\n <div className={cn('space-y-1.5', className)}>\n <label className=\"text-xs text-muted-foreground\">Content Position</label>\n <div className=\"grid grid-cols-3 gap-1 p-2 bg-background border border-input rounded-md\">\n {GRID_POSITIONS.map((pos, idx) => (\n <button\n key={idx}\n type=\"button\"\n onClick={() => onPositionChange(pos)}\n className={cn(\n 'w-5 h-5 rounded-sm border transition-all',\n isSelected(pos)\n ? 'bg-primary border-primary'\n : 'bg-secondary border-input hover:border-primary',\n )}\n title={getPositionTitle(pos)}\n />\n ))}\n </div>\n <span className=\"text-[10px] text-muted-foreground\">\n Where original content appears in the new frame\n </span>\n </div>\n );\n}\n\nexport const GridPositionSelector = memo(GridPositionSelectorComponent);\n","'use client';\n\nimport { memo, useCallback, useRef, useState } from 'react';\nimport { cn } from './utils';\n\ninterface ComparisonSliderProps {\n beforeSrc: string;\n afterSrc: string;\n beforeLabel?: string;\n afterLabel?: string;\n position: number;\n onPositionChange: (position: number) => void;\n height?: number;\n className?: string;\n}\n\nfunction ComparisonSliderComponent({\n beforeSrc,\n afterSrc,\n beforeLabel = 'Before',\n afterLabel = 'After',\n position,\n onPositionChange,\n height = 128,\n className,\n}: ComparisonSliderProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleMove = useCallback(\n (clientX: number) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const newPosition = Math.max(0, Math.min(100, (x / rect.width) * 100));\n onPositionChange(newPosition);\n },\n [onPositionChange],\n );\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n setIsDragging(true);\n handleMove(e.clientX);\n },\n [handleMove],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isDragging) return;\n handleMove(e.clientX);\n },\n [isDragging, handleMove],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n setIsDragging(true);\n handleMove(e.touches[0].clientX);\n },\n [handleMove],\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n if (!isDragging) return;\n handleMove(e.touches[0].clientX);\n },\n [isDragging, handleMove],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'relative overflow-hidden rounded-md cursor-ew-resize select-none',\n className,\n )}\n style={{ height }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleMouseUp}\n >\n {/* After image (full width background) */}\n <img\n src={afterSrc}\n alt={afterLabel}\n className=\"absolute inset-0 w-full h-full object-cover pointer-events-none\"\n draggable={false}\n />\n\n {/* Before image (clipped) */}\n <div\n className=\"absolute inset-0 overflow-hidden pointer-events-none\"\n style={{ width: `${position}%` }}\n >\n <img\n src={beforeSrc}\n alt={beforeLabel}\n className=\"absolute inset-0 h-full object-cover\"\n style={{ width: containerRef.current?.offsetWidth ?? '100%' }}\n draggable={false}\n />\n </div>\n\n {/* Divider line */}\n <div\n className=\"absolute top-0 bottom-0 w-0.5 bg-white shadow-lg pointer-events-none\"\n style={{ left: `${position}%`, transform: 'translateX(-50%)' }}\n >\n {/* Handle */}\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-6 h-6 bg-white rounded-full shadow-lg flex items-center justify-center\">\n <svg viewBox=\"0 0 24 24\" className=\"w-3 h-3 text-gray-600\">\n <path fill=\"currentColor\" d=\"M8 5v14l-7-7 7-7m8 0v14l7-7-7-7\" />\n </svg>\n </div>\n </div>\n\n {/* Labels */}\n <div className=\"absolute top-1.5 left-1.5 px-1 py-0.5 bg-black/60 rounded text-[9px] text-white font-medium pointer-events-none\">\n {beforeLabel}\n </div>\n <div className=\"absolute top-1.5 right-1.5 px-1 py-0.5 bg-black/60 rounded text-[9px] text-white font-medium pointer-events-none\">\n {afterLabel}\n </div>\n </div>\n );\n}\n\nexport const ComparisonSlider = memo(ComparisonSliderComponent);\n"]}
@@ -1,4 +1,4 @@
1
- import { useExecutionStore, useUIStore } from './chunk-OJWVEEMM.mjs';
1
+ import { useExecutionStore, useUIStore } from './chunk-R5L7WB7F.mjs';
2
2
  import { Bug, Trash2, X, ChevronDown, ChevronRight, Copy, PanelLeftClose, Search, Wand2, Volume2, Video, Subtitles, Sparkles, Scissors, Puzzle, Pencil, Navigation, Mic, MessageSquare, Maximize2, Maximize, LayoutGrid, Layers, Image, Grid3X3, GitBranch, Film, FileVideo, FileText, Eye, Download, Crop, Columns2, CheckCircle, Brain, AudioLines, ArrowRightToLine, ArrowLeftFromLine } from 'lucide-react';
3
3
  import { forwardRef, memo, useCallback, useState, useMemo } from 'react';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -374,3 +374,5 @@ function NodePalette() {
374
374
  }
375
375
 
376
376
  export { DebugPanel, NodePalette, PanelContainer };
377
+ //# sourceMappingURL=chunk-HMTYPFOT.mjs.map
378
+ //# sourceMappingURL=chunk-HMTYPFOT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/panels/PanelContainer.tsx","../src/panels/DebugPanel.tsx","../src/panels/NodePalette.tsx"],"names":["jsx","useCallback","jsxs","ChevronDown","ChevronRight","useState"],"mappings":"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","file":"chunk-HMTYPFOT.mjs","sourcesContent":["'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\ninterface PanelContainerProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\n/**\n * Wrapper for side panels that isolates them from React Flow canvas events.\n * Prevents clicks, drags, and pointer events from bubbling to the canvas.\n *\n * Use this for any panel rendered alongside the WorkflowCanvas to prevent\n * double-click issues and event interference.\n */\nexport const PanelContainer = forwardRef<HTMLDivElement, PanelContainerProps>(\n ({ children, className, ...props }, ref) => {\n const stopPropagation = (e: React.SyntheticEvent) => {\n e.stopPropagation();\n };\n\n return (\n <div\n ref={ref}\n className={className}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onPointerDown={stopPropagation}\n onDoubleClick={stopPropagation}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nPanelContainer.displayName = 'PanelContainer';\n","'use client';\n\nimport { Bug, ChevronDown, ChevronRight, Copy, Trash2, X } from 'lucide-react';\nimport { memo, useCallback, useState } from 'react';\nimport type { DebugPayload } from '../stores/execution/types';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useUIStore } from '../stores/uiStore';\nimport { PanelContainer } from './PanelContainer';\n\ninterface PayloadCardProps {\n payload: DebugPayload;\n}\n\nfunction PayloadCard({ payload }: PayloadCardProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(\n async (e: React.MouseEvent) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(\n JSON.stringify(payload.input, null, 2),\n );\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard access denied - fallback to execCommand\n const textArea = document.createElement('textarea');\n textArea.value = JSON.stringify(payload.input, null, 2);\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n document.body.appendChild(textArea);\n textArea.select();\n try {\n document.execCommand('copy');\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Both methods failed\n }\n document.body.removeChild(textArea);\n }\n },\n [payload.input],\n );\n\n const timestamp = new Date(payload.timestamp).toLocaleTimeString();\n\n return (\n <div className=\"border border-[var(--border)] rounded-lg overflow-hidden\">\n {/* Header - always visible */}\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full flex items-center gap-2 p-3 text-left hover:bg-[var(--muted)]/50 transition\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-4 h-4 text-[var(--muted-foreground)] shrink-0\" />\n ) : (\n <ChevronRight className=\"w-4 h-4 text-[var(--muted-foreground)] shrink-0\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-[var(--foreground)] truncate\">\n {payload.nodeName || payload.nodeId}\n </span>\n <span className=\"text-[10px] px-1.5 py-0.5 bg-amber-500/10 text-amber-500 rounded\">\n {payload.nodeType}\n </span>\n </div>\n <div className=\"text-[10px] text-[var(--muted-foreground)] mt-0.5\">\n {payload.model} &bull; {timestamp}\n </div>\n </div>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div className=\"border-t border-[var(--border)] p-3 bg-[var(--muted)]/30\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[10px] font-medium text-[var(--muted-foreground)] uppercase\">\n Payload\n </span>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1 text-[10px] text-[var(--primary)] hover:underline\"\n >\n <Copy className=\"w-3 h-3\" />\n {copied ? 'Copied!' : 'Copy'}\n </button>\n </div>\n <pre className=\"text-[11px] font-mono text-[var(--muted-foreground)] bg-[var(--background)] p-2 rounded border border-[var(--border)] overflow-x-auto max-h-64 overflow-y-auto\">\n {JSON.stringify(payload.input, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n}\n\nfunction DebugPanelComponent() {\n const debugPayloads = useExecutionStore((s) => s.debugPayloads);\n const clearDebugPayloads = useExecutionStore((s) => s.clearDebugPayloads);\n const setShowDebugPanel = useUIStore((s) => s.setShowDebugPanel);\n\n const handleClose = useCallback(() => {\n setShowDebugPanel(false);\n }, [setShowDebugPanel]);\n\n return (\n <PanelContainer className=\"w-80 h-full border-l border-[var(--border)] bg-[var(--background)] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-3 border-b border-[var(--border)]\">\n <div className=\"flex items-center gap-2\">\n <Bug className=\"w-4 h-4 text-amber-500\" />\n <span className=\"font-medium text-sm\">Debug Console</span>\n {debugPayloads.length > 0 && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-amber-500/10 text-amber-500 rounded-full\">\n {debugPayloads.length}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n {debugPayloads.length > 0 && (\n <button\n onClick={clearDebugPayloads}\n className=\"p-1.5 hover:bg-[var(--muted)] rounded transition\"\n title=\"Clear all payloads\"\n >\n <Trash2 className=\"w-4 h-4 text-[var(--muted-foreground)]\" />\n </button>\n )}\n <button\n onClick={handleClose}\n className=\"p-1.5 hover:bg-[var(--muted)] rounded transition\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-3 space-y-2\">\n {debugPayloads.length === 0 ? (\n <div className=\"text-center py-8 text-[var(--muted-foreground)]\">\n <Bug className=\"w-12 h-12 mx-auto mb-3 opacity-50 text-amber-500/50\" />\n <p className=\"text-sm font-medium mb-2\">No payloads captured</p>\n <p className=\"text-xs\">\n Run a workflow with debug mode enabled to capture API payloads.\n </p>\n </div>\n ) : (\n debugPayloads.map((payload, index) => (\n <PayloadCard\n key={`${payload.nodeId}-${payload.timestamp}-${index}`}\n payload={payload}\n />\n ))\n )}\n </div>\n\n {/* Footer info */}\n {debugPayloads.length > 0 && (\n <div className=\"p-3 border-t border-[var(--border)] bg-[var(--muted)]/30\">\n <p className=\"text-[10px] text-[var(--muted-foreground)]\">\n {debugPayloads.length} payload\n {debugPayloads.length !== 1 ? 's' : ''} captured. Click to expand\n and view details.\n </p>\n </div>\n )}\n </PanelContainer>\n );\n}\n\nconst MemoizedDebugPanel = memo(DebugPanelComponent);\n\nexport function DebugPanel() {\n return <MemoizedDebugPanel />;\n}\n","'use client';\n\nimport {\n getNodesByCategory,\n type NodeCategory,\n type NodeType,\n} from '@genfeedai/types';\nimport {\n ArrowLeftFromLine,\n ArrowRightToLine,\n AudioLines,\n Brain,\n CheckCircle,\n ChevronDown,\n ChevronRight,\n Columns2,\n Crop,\n Download,\n Eye,\n FileText,\n FileVideo,\n Film,\n GitBranch,\n Grid3X3,\n Image,\n Layers,\n LayoutGrid,\n Maximize,\n Maximize2,\n MessageSquare,\n Mic,\n Navigation,\n PanelLeftClose,\n Pencil,\n Puzzle,\n Scissors,\n Search,\n Sparkles,\n Subtitles,\n Video,\n Volume2,\n Wand2,\n} from 'lucide-react';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useUIStore } from '../stores/uiStore';\n\n// Icon mapping\nconst ICONS: Record<string, typeof Image> = {\n ArrowLeftFromLine,\n // Composition\n ArrowRightToLine,\n AudioLines,\n Brain,\n // Output\n CheckCircle,\n Columns2,\n Crop,\n Download,\n Eye,\n FileText,\n FileVideo,\n Film,\n GitBranch,\n Grid3X3,\n // Input\n Image,\n Layers,\n LayoutGrid,\n Maximize,\n // Processing\n Maximize2,\n MessageSquare,\n Mic,\n Navigation,\n Pencil,\n Puzzle,\n Scissors,\n // AI\n Sparkles,\n Subtitles,\n Video,\n Volume2,\n Wand2,\n};\n\nconst CATEGORY_LABELS: Record<NodeCategory, string> = {\n ai: 'AI Generation',\n composition: 'Composition',\n input: 'Input',\n output: 'Output',\n processing: 'Processing',\n};\n\nconst CATEGORY_COLORS: Record<\n NodeCategory,\n { icon: string; hover: string; cssVar: string }\n> = {\n ai: {\n cssVar: 'var(--category-ai)',\n hover: 'hover:border-[var(--category-ai)]',\n icon: 'bg-[var(--category-ai)]/20 text-[var(--category-ai)]',\n },\n composition: {\n cssVar: 'var(--category-composition)',\n hover: 'hover:border-[var(--category-composition)]',\n icon: 'bg-[var(--category-composition)]/20 text-[var(--category-composition)]',\n },\n input: {\n cssVar: 'var(--category-input)',\n hover: 'hover:border-[var(--category-input)]',\n icon: 'bg-[var(--category-input)]/20 text-[var(--category-input)]',\n },\n output: {\n cssVar: 'var(--category-output)',\n hover: 'hover:border-[var(--category-output)]',\n icon: 'bg-[var(--category-output)]/20 text-[var(--category-output)]',\n },\n processing: {\n cssVar: 'var(--category-processing)',\n hover: 'hover:border-[var(--category-processing)]',\n icon: 'bg-[var(--category-processing)]/20 text-[var(--category-processing)]',\n },\n};\n\ninterface NodeCardProps {\n type: NodeType;\n label: string;\n description: string;\n icon: string;\n category: NodeCategory;\n}\n\nfunction NodeCard({ type, label, description, icon, category }: NodeCardProps) {\n const Icon = ICONS[icon] ?? Sparkles;\n\n const handleDragStart = useCallback(\n (event: React.DragEvent) => {\n event.dataTransfer.setData('nodeType', type);\n event.dataTransfer.effectAllowed = 'move';\n },\n [type],\n );\n\n const colors = CATEGORY_COLORS[category];\n\n return (\n <div\n draggable\n onDragStart={handleDragStart}\n className={`p-3 bg-[var(--card)] border border-[var(--border)] rounded-lg cursor-grab transition-colors group ${colors.hover}`}\n >\n <div className=\"flex items-start gap-3\">\n <div className={`p-2 rounded ${colors.icon}`}>\n <Icon className=\"w-4 h-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-[var(--foreground)] truncate\">\n {label}\n </div>\n <div className=\"text-xs text-[var(--muted-foreground)] mt-0.5 line-clamp-2\">\n {description}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ninterface CategorySectionProps {\n category: NodeCategory;\n isExpanded: boolean;\n onToggle: () => void;\n}\n\nfunction CategorySection({\n category,\n isExpanded,\n onToggle,\n}: CategorySectionProps) {\n const nodes = getNodesByCategory()[category];\n\n return (\n <div className=\"border-b border-[var(--border)] last:border-0\">\n <button\n onClick={onToggle}\n className=\"w-full flex items-center gap-2 px-4 py-3 text-left hover:bg-[var(--secondary)] transition cursor-pointer\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-4 h-4 text-[var(--muted-foreground)]\" />\n ) : (\n <ChevronRight className=\"w-4 h-4 text-[var(--muted-foreground)]\" />\n )}\n <span className=\"font-medium text-sm text-[var(--foreground)]\">\n {CATEGORY_LABELS[category]}\n </span>\n <span className=\"text-xs text-[var(--muted-foreground)] ml-auto\">\n {nodes.length}\n </span>\n </button>\n\n {isExpanded && (\n <div className=\"px-4 pb-4 space-y-2\">\n {nodes.map((node) => (\n <NodeCard\n key={node.type}\n type={node.type}\n label={node.label}\n description={node.description}\n icon={node.icon}\n category={node.category}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport function NodePalette() {\n const { togglePalette } = useUIStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [expandedCategories, setExpandedCategories] = useState<\n Set<NodeCategory>\n >(new Set(['input']));\n\n const nodesByCategory = useMemo(() => getNodesByCategory(), []);\n\n // Filter nodes across all categories when searching\n const filteredNodes = useMemo(() => {\n if (!searchQuery.trim()) return null;\n\n const query = searchQuery.toLowerCase();\n const results: Array<{\n type: NodeType;\n label: string;\n description: string;\n icon: string;\n category: NodeCategory;\n }> = [];\n\n for (const category of Object.keys(nodesByCategory) as NodeCategory[]) {\n for (const node of nodesByCategory[category]) {\n if (\n node.label.toLowerCase().includes(query) ||\n node.description.toLowerCase().includes(query)\n ) {\n results.push(node);\n }\n }\n }\n\n return results;\n }, [searchQuery, nodesByCategory]);\n\n const toggleCategory = useCallback((category: NodeCategory) => {\n setExpandedCategories((prev) => {\n const next = new Set(prev);\n if (next.has(category)) {\n next.delete(category);\n } else {\n next.add(category);\n }\n return next;\n });\n }, []);\n\n // Filter out categories with no nodes (e.g., deprecated 'output' category)\n const categories = useMemo(\n () =>\n (\n ['input', 'ai', 'processing', 'output', 'composition'] as NodeCategory[]\n ).filter((cat) => nodesByCategory[cat].length > 0),\n [nodesByCategory],\n );\n\n return (\n <div className=\"w-64 min-w-64 h-full bg-[var(--background)] border-r border-[var(--border)] flex flex-col overflow-hidden\">\n <div className=\"px-4 py-3 border-b border-[var(--border)] flex items-start justify-between gap-2\">\n <div>\n <h2 className=\"font-semibold text-sm text-[var(--foreground)]\">\n Nodes\n </h2>\n <p className=\"text-xs text-[var(--muted-foreground)] mt-1\">\n Drag to canvas\n </p>\n </div>\n <button\n onClick={togglePalette}\n className=\"p-1.5 hover:bg-[var(--secondary)] rounded-md transition-colors group\"\n title=\"Close sidebar (M)\"\n >\n <PanelLeftClose className=\"w-4 h-4 text-[var(--muted-foreground)] group-hover:text-[var(--foreground)]\" />\n </button>\n </div>\n\n {/* Search bar */}\n <div className=\"px-4 py-3 border-b border-[var(--border)]\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--muted-foreground)]\" />\n <input\n type=\"text\"\n placeholder=\"Search nodes...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-8 pr-3 py-1.5 text-sm bg-[var(--secondary)] border border-[var(--border)] rounded-md placeholder:text-[var(--muted-foreground)] focus:outline-none focus:ring-1 focus:ring-[var(--ring)]\"\n />\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {filteredNodes ? (\n // Search results\n <div className=\"px-4 py-3 space-y-2\">\n {filteredNodes.length === 0 ? (\n <p className=\"text-sm text-[var(--muted-foreground)] text-center py-4\">\n No nodes found\n </p>\n ) : (\n filteredNodes.map((node) => (\n <NodeCard\n key={node.type}\n type={node.type}\n label={node.label}\n description={node.description}\n icon={node.icon}\n category={node.category}\n />\n ))\n )}\n </div>\n ) : (\n // Category view\n categories.map((category) => (\n <CategorySection\n key={category}\n category={category}\n isExpanded={expandedCategories.has(category)}\n onToggle={() => toggleCategory(category)}\n />\n ))\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -88,3 +88,5 @@ var createSelectIsNodeSelected = (id) => (state) => state.selectedNodeIds.includ
88
88
  var createSelectGroupByNodeId = (nodeId) => (state) => state.groups.find((g) => g.nodeIds.includes(nodeId));
89
89
 
90
90
  export { createSelectGroupByNodeId, createSelectIsNodeSelected, createSelectNodeById, selectAddNode, selectAddNodesAndEdges, selectCreateGroup, selectDeleteGroup, selectDuplicateNode, selectEdgeStyle, selectEdges, selectFindCompatibleHandle, selectGetConnectedNodeIds, selectGetNodeById, selectGroups, selectIsDirty, selectIsLoading, selectIsSaving, selectIsValidConnection, selectNavigationTargetId, selectNodes, selectOnConnect, selectOnEdgesChange, selectOnNodesChange, selectRemoveEdge, selectRemoveNode, selectSelectedNodeIds, selectSetDirty, selectSetSelectedNodeIds, selectToggleNodeLock, selectUnlockAllNodes, selectUpdateNodeData, selectWorkflowId, selectWorkflowName, useContextMenuStore };
91
+ //# sourceMappingURL=chunk-IKR6GVZ4.mjs.map
92
+ //# sourceMappingURL=chunk-IKR6GVZ4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/contextMenuStore.ts","../src/stores/workflow/selectors.ts"],"names":[],"mappings":"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","file":"chunk-IKR6GVZ4.mjs","sourcesContent":["import { create } from 'zustand';\n\nexport type ContextMenuType = 'node' | 'edge' | 'pane' | 'selection' | null;\n\nexport interface ContextMenuPosition {\n x: number;\n y: number;\n}\n\ninterface ContextMenuState {\n isOpen: boolean;\n position: ContextMenuPosition;\n menuType: ContextMenuType;\n targetId: string | null;\n targetIds: string[] | null;\n\n openNodeMenu: (nodeId: string, x: number, y: number) => void;\n openEdgeMenu: (edgeId: string, x: number, y: number) => void;\n openPaneMenu: (x: number, y: number) => void;\n openSelectionMenu: (nodeIds: string[], x: number, y: number) => void;\n close: () => void;\n}\n\nexport const useContextMenuStore = create<ContextMenuState>((set) => ({\n close: () => {\n set({\n isOpen: false,\n menuType: null,\n targetId: null,\n targetIds: null,\n });\n },\n isOpen: false,\n menuType: null,\n\n openEdgeMenu: (edgeId, x, y) => {\n set({\n isOpen: true,\n menuType: 'edge',\n position: { x, y },\n targetId: edgeId,\n targetIds: null,\n });\n },\n\n openNodeMenu: (nodeId, x, y) => {\n set({\n isOpen: true,\n menuType: 'node',\n position: { x, y },\n targetId: nodeId,\n targetIds: null,\n });\n },\n\n openPaneMenu: (x, y) => {\n set({\n isOpen: true,\n menuType: 'pane',\n position: { x, y },\n targetId: null,\n targetIds: null,\n });\n },\n\n openSelectionMenu: (nodeIds, x, y) => {\n set({\n isOpen: true,\n menuType: 'selection',\n position: { x, y },\n targetId: null,\n targetIds: nodeIds,\n });\n },\n position: { x: 0, y: 0 },\n targetId: null,\n targetIds: null,\n}));\n","import type { WorkflowStore } from './types';\n\n/**\n * Stable Zustand Selectors\n *\n * Pre-defined selectors to avoid inline function recreation in components.\n * Using stable selector references prevents unnecessary re-subscriptions\n * and improves React Flow performance.\n *\n * Usage:\n * import { selectNodes, selectUpdateNodeData } from '../stores/workflow/selectors';\n * const nodes = useWorkflowStore(selectNodes);\n * const updateNodeData = useWorkflowStore(selectUpdateNodeData);\n */\n\n// =============================================================================\n// STATE SELECTORS\n// =============================================================================\n\n/** Select all nodes */\nexport const selectNodes = (state: WorkflowStore) => state.nodes;\n\n/** Select all edges */\nexport const selectEdges = (state: WorkflowStore) => state.edges;\n\n/** Select all groups */\nexport const selectGroups = (state: WorkflowStore) => state.groups;\n\n/** Select selected node IDs */\nexport const selectSelectedNodeIds = (state: WorkflowStore) =>\n state.selectedNodeIds;\n\n/** Select workflow name */\nexport const selectWorkflowName = (state: WorkflowStore) => state.workflowName;\n\n/** Select workflow ID */\nexport const selectWorkflowId = (state: WorkflowStore) => state.workflowId;\n\n/** Select dirty state */\nexport const selectIsDirty = (state: WorkflowStore) => state.isDirty;\n\n/** Select saving state */\nexport const selectIsSaving = (state: WorkflowStore) => state.isSaving;\n\n/** Select loading state */\nexport const selectIsLoading = (state: WorkflowStore) => state.isLoading;\n\n/** Select edge style */\nexport const selectEdgeStyle = (state: WorkflowStore) => state.edgeStyle;\n\n/** Select navigation target ID */\nexport const selectNavigationTargetId = (state: WorkflowStore) =>\n state.navigationTargetId;\n\n// =============================================================================\n// ACTION SELECTORS\n// =============================================================================\n\n/** Select updateNodeData action */\nexport const selectUpdateNodeData = (state: WorkflowStore) =>\n state.updateNodeData;\n\n/** Select addNode action */\nexport const selectAddNode = (state: WorkflowStore) => state.addNode;\n\n/** Select removeNode action */\nexport const selectRemoveNode = (state: WorkflowStore) => state.removeNode;\n\n/** Select duplicateNode action */\nexport const selectDuplicateNode = (state: WorkflowStore) =>\n state.duplicateNode;\n\n/** Select onNodesChange action */\nexport const selectOnNodesChange = (state: WorkflowStore) =>\n state.onNodesChange;\n\n/** Select onEdgesChange action */\nexport const selectOnEdgesChange = (state: WorkflowStore) =>\n state.onEdgesChange;\n\n/** Select onConnect action */\nexport const selectOnConnect = (state: WorkflowStore) => state.onConnect;\n\n/** Select setSelectedNodeIds action */\nexport const selectSetSelectedNodeIds = (state: WorkflowStore) =>\n state.setSelectedNodeIds;\n\n/** Select toggleNodeLock action */\nexport const selectToggleNodeLock = (state: WorkflowStore) =>\n state.toggleNodeLock;\n\n/** Select createGroup action */\nexport const selectCreateGroup = (state: WorkflowStore) => state.createGroup;\n\n/** Select deleteGroup action */\nexport const selectDeleteGroup = (state: WorkflowStore) => state.deleteGroup;\n\n/** Select unlockAllNodes action */\nexport const selectUnlockAllNodes = (state: WorkflowStore) =>\n state.unlockAllNodes;\n\n/** Select setDirty action */\nexport const selectSetDirty = (state: WorkflowStore) => state.setDirty;\n\n/** Select removeEdge action */\nexport const selectRemoveEdge = (state: WorkflowStore) => state.removeEdge;\n\n/** Select addNodesAndEdges action */\nexport const selectAddNodesAndEdges = (state: WorkflowStore) =>\n state.addNodesAndEdges;\n\n// =============================================================================\n// HELPER SELECTORS\n// =============================================================================\n\n/** Select getNodeById helper */\nexport const selectGetNodeById = (state: WorkflowStore) => state.getNodeById;\n\n/** Select getConnectedNodeIds helper */\nexport const selectGetConnectedNodeIds = (state: WorkflowStore) =>\n state.getConnectedNodeIds;\n\n/** Select isValidConnection helper */\nexport const selectIsValidConnection = (state: WorkflowStore) =>\n state.isValidConnection;\n\n/** Select findCompatibleHandle helper */\nexport const selectFindCompatibleHandle = (state: WorkflowStore) =>\n state.findCompatibleHandle;\n\n// =============================================================================\n// PARAMETERIZED SELECTORS (Factory Functions)\n// =============================================================================\n\n/**\n * Create a selector for a specific node by ID\n * Note: Creates new function each call - memoize at call site if needed\n */\nexport const createSelectNodeById = (id: string) => (state: WorkflowStore) =>\n state.nodes.find((n) => n.id === id);\n\n/**\n * Create a selector for checking if a node is in selection\n */\nexport const createSelectIsNodeSelected =\n (id: string) => (state: WorkflowStore) =>\n state.selectedNodeIds.includes(id);\n\n/**\n * Create a selector for a group containing a node\n */\nexport const createSelectGroupByNodeId =\n (nodeId: string) => (state: WorkflowStore) =>\n state.groups.find((g) => g.nodeIds.includes(nodeId));\n"]}
@@ -1,4 +1,4 @@
1
- import { configurePromptLibrary } from './chunk-XRC3O5GK.mjs';
1
+ import { configurePromptLibrary } from './chunk-4JOFNZW6.mjs';
2
2
  import { createContext, useEffect, useContext } from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
@@ -19,3 +19,5 @@ function useWorkflowUIConfig() {
19
19
  }
20
20
 
21
21
  export { WorkflowUIProvider, useWorkflowUIConfig };
22
+ //# sourceMappingURL=chunk-JSF4FHBH.mjs.map
23
+ //# sourceMappingURL=chunk-JSF4FHBH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/WorkflowUIProvider.tsx"],"names":[],"mappings":";;;;AAMA,IAAM,iBAAA,GAAoB,aAAA,CAAgC,EAAE,CAAA;AAcrD,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,sBAAA,CAAuB,OAAO,aAAa,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,CAAO,aAAa,CAAC,CAAA;AAEzB,EAAA,2BACG,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,KAAA,EAAO,QAChC,QAAA,EACH,CAAA;AAEJ;AAMO,SAAS,mBAAA,GAAwC;AACtD,EAAA,OAAO,WAAW,iBAAiB,CAAA;AACrC","file":"chunk-JSF4FHBH.mjs","sourcesContent":["'use client';\n\nimport { createContext, type ReactNode, useContext, useEffect } from 'react';\nimport { configurePromptLibrary } from '../stores/promptLibraryStore';\nimport type { WorkflowUIConfig } from './types';\n\nconst WorkflowUIContext = createContext<WorkflowUIConfig>({});\n\n/**\n * Provider that injects app-specific dependencies into workflow-ui components.\n *\n * Nodes use `useWorkflowUIConfig()` to access:\n * - File upload service (ImageInputNode, VideoInputNode)\n * - Model schema service (AI gen nodes)\n * - Prompt library service (PromptNode)\n * - ModelBrowserModal component (ImageGenNode, VideoGenNode, LLMNode)\n * - PromptPicker component (PromptNode)\n *\n * Components gracefully degrade when services are not provided.\n */\nexport function WorkflowUIProvider({\n config,\n children,\n}: {\n config: WorkflowUIConfig;\n children: ReactNode;\n}) {\n // Configure the prompt library store with the injected API service\n useEffect(() => {\n if (config.promptLibrary) {\n configurePromptLibrary(config.promptLibrary);\n }\n }, [config.promptLibrary]);\n\n return (\n <WorkflowUIContext.Provider value={config}>\n {children}\n </WorkflowUIContext.Provider>\n );\n}\n\n/**\n * Hook to access the workflow UI configuration from the provider.\n * Returns an empty config object if used outside a WorkflowUIProvider.\n */\nexport function useWorkflowUIConfig(): WorkflowUIConfig {\n return useContext(WorkflowUIContext);\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { useContextMenu, useCanvasKeyboardShortcuts, ContextMenu } from './chunk-ORVDYXDP.mjs';
2
- import { calculateWorkflowCost, formatCost } from './chunk-MGLAKMDP.mjs';
3
- import { nodeTypes, NodeDetailModal } from './chunk-2FUPL67V.mjs';
4
- import { useUIStore, useSettingsStore, useExecutionStore } from './chunk-OJWVEEMM.mjs';
5
- import { useWorkflowStore, getHandleType } from './chunk-GPYIIWD5.mjs';
1
+ import { useContextMenu, useCanvasKeyboardShortcuts, ContextMenu } from './chunk-VKXTPLM7.mjs';
2
+ import { calculateWorkflowCost, formatCost } from './chunk-2BHILUF7.mjs';
3
+ import { nodeTypes, NodeDetailModal } from './chunk-72UIUFXH.mjs';
4
+ import { useUIStore, useSettingsStore, useExecutionStore } from './chunk-R5L7WB7F.mjs';
5
+ import { useWorkflowStore, getHandleType } from './chunk-7DJHFOIW.mjs';
6
6
  import { CONNECTION_RULES, getNodesByCategory, NODE_DEFINITIONS } from '@genfeedai/types';
7
7
  import { useReactFlow, getBezierPath, BaseEdge, useNodes, ViewportPortal, useViewport, useStore, ReactFlow, SelectionMode, ConnectionMode, Background, BackgroundVariant, Controls, MiniMap } from '@xyflow/react';
8
8
  import { Plus, Search, Play, Pause, Trash2, AlignHorizontalSpaceAround, AlignVerticalSpaceAround, Grid3X3, Ungroup, Group, Palette, Lock, Unlock, X, Keyboard, PanelLeft, AlertTriangle, CheckCircle, Info, XCircle, Check, Copy, DollarSign } from 'lucide-react';
@@ -2148,7 +2148,7 @@ function supportsImageInput(schema) {
2148
2148
  if (!schema) return true;
2149
2149
  const properties = schema.properties;
2150
2150
  if (!properties) return true;
2151
- return !!(properties.image || properties.image_input || properties.start_image || properties.first_frame_image || properties.reference_images);
2151
+ return !!(properties.image || properties.image_input || properties.image_url || properties.image_urls || properties.start_image || properties.first_frame_image || properties.reference_images);
2152
2152
  }
2153
2153
  function getEdgeDataType(edge, nodeMap) {
2154
2154
  const sourceNode = nodeMap.get(edge.source);
@@ -2670,3 +2670,5 @@ function WorkflowCanvas({
2670
2670
  }
2671
2671
 
2672
2672
  export { ConnectionDropMenu, DEFAULT_GROUP_COLORS, EdgeToolbar, EditableEdge, GROUP_COLORS, GlobalImageHistory, GroupOverlay, HelperLines, NodeSearch, NotificationToast, PauseEdge, ReferenceEdge, ShortcutHelpModal, WorkflowCanvas };
2673
+ //# sourceMappingURL=chunk-NDDAL2OG.mjs.map
2674
+ //# sourceMappingURL=chunk-NDDAL2OG.mjs.map