@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/uiStore.ts","../src/stores/settingsStore.ts","../src/stores/execution/helpers/outputHelpers.ts","../src/stores/execution/helpers/sseSubscription.ts","../src/stores/execution/slices/executionSlice.ts","../src/stores/execution/slices/jobSlice.ts","../src/stores/execution/executionStore.ts"],"names":["create","useWorkflowStore","API_BASE_URL","NodeStatusEnum"],"mappings":"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","file":"chunk-R5L7WB7F.mjs","sourcesContent":["import type { HandleType } from '@genfeedai/types';\nimport { create } from 'zustand';\n\nexport type ModalType =\n | 'templates'\n | 'cost'\n | 'welcome'\n | 'settings'\n | 'promptLibrary'\n | 'modelBrowser'\n | 'nodeDetail'\n | 'shortcutHelp'\n | 'nodeSearch'\n | null;\n\nexport type NodeDetailTab = 'preview' | 'history';\n\nexport interface ConnectionDropMenuState {\n position: { x: number; y: number };\n screenPosition: { x: number; y: number };\n sourceNodeId: string;\n sourceHandleId: string;\n sourceHandleType: HandleType;\n}\n\ninterface UIStore {\n // Panel visibility\n showPalette: boolean;\n showMinimap: boolean;\n showAIGenerator: boolean;\n showDebugPanel: boolean;\n\n // Selection\n selectedNodeId: string | null;\n selectedEdgeId: string | null;\n\n // Focus mode (highlight connected nodes)\n highlightedNodeIds: string[];\n\n // Modals\n activeModal: ModalType;\n\n // Connection drop menu\n connectionDropMenu: ConnectionDropMenuState | null;\n\n // Node detail modal\n nodeDetailNodeId: string | null;\n nodeDetailActiveTab: NodeDetailTab;\n nodeDetailStartIndex: number;\n\n // Notifications\n notifications: Notification[];\n\n // Actions\n togglePalette: () => void;\n toggleMinimap: () => void;\n toggleAIGenerator: () => void;\n toggleDebugPanel: () => void;\n setShowDebugPanel: (show: boolean) => void;\n selectNode: (nodeId: string | null) => void;\n selectEdge: (edgeId: string | null) => void;\n setHighlightedNodeIds: (ids: string[]) => void;\n openModal: (modal: ModalType) => void;\n closeModal: () => void;\n openConnectionDropMenu: (params: ConnectionDropMenuState) => void;\n closeConnectionDropMenu: () => void;\n openNodeDetailModal: (\n nodeId: string,\n tab?: NodeDetailTab,\n startIndex?: number,\n ) => void;\n closeNodeDetailModal: () => void;\n setNodeDetailTab: (tab: NodeDetailTab) => void;\n addNotification: (notification: Omit<Notification, 'id'>) => void;\n removeNotification: (id: string) => void;\n}\n\ninterface Notification {\n id: string;\n type: 'success' | 'error' | 'warning' | 'info';\n title: string;\n message?: string;\n duration?: number;\n}\n\nlet notificationId = 0;\n\nexport const useUIStore = create<UIStore>((set) => ({\n activeModal: null,\n\n addNotification: (notification) => {\n const id = `notification-${++notificationId}`;\n set((state) => ({\n notifications: [...state.notifications, { ...notification, id }],\n }));\n\n // Auto-remove after duration\n if (notification.duration !== 0) {\n setTimeout(() => {\n set((state) => ({\n notifications: state.notifications.filter((n) => n.id !== id),\n }));\n }, notification.duration ?? 5000);\n }\n },\n\n closeConnectionDropMenu: () => {\n set({ connectionDropMenu: null });\n },\n\n closeModal: () => {\n set({ activeModal: null });\n },\n\n closeNodeDetailModal: () => {\n set({\n activeModal: null,\n nodeDetailActiveTab: 'preview',\n nodeDetailNodeId: null,\n nodeDetailStartIndex: 0,\n });\n },\n connectionDropMenu: null,\n highlightedNodeIds: [],\n nodeDetailActiveTab: 'preview',\n nodeDetailNodeId: null,\n nodeDetailStartIndex: 0,\n notifications: [],\n\n openConnectionDropMenu: (params) => {\n set({ connectionDropMenu: params });\n },\n\n openModal: (modal) => {\n set({ activeModal: modal });\n },\n\n openNodeDetailModal: (nodeId, tab = 'preview', startIndex = 0) => {\n set({\n activeModal: 'nodeDetail',\n nodeDetailActiveTab: tab,\n nodeDetailNodeId: nodeId,\n nodeDetailStartIndex: startIndex,\n });\n },\n\n removeNotification: (id) => {\n set((state) => ({\n notifications: state.notifications.filter((n) => n.id !== id),\n }));\n },\n\n selectEdge: (edgeId) => {\n set({ selectedEdgeId: edgeId, selectedNodeId: null });\n },\n selectedEdgeId: null,\n selectedNodeId: null,\n\n selectNode: (nodeId) => {\n set({ selectedEdgeId: null, selectedNodeId: nodeId });\n },\n\n setHighlightedNodeIds: (ids) => {\n set({ highlightedNodeIds: ids });\n },\n\n setNodeDetailTab: (tab) => {\n set({ nodeDetailActiveTab: tab });\n },\n\n setShowDebugPanel: (show) => {\n set({ showDebugPanel: show });\n },\n showAIGenerator: false,\n showDebugPanel: false,\n showMinimap: true,\n showPalette: true,\n\n toggleAIGenerator: () => {\n set((state) => ({ showAIGenerator: !state.showAIGenerator }));\n },\n\n toggleDebugPanel: () => {\n set((state) => ({ showDebugPanel: !state.showDebugPanel }));\n },\n\n toggleMinimap: () => {\n set((state) => ({ showMinimap: !state.showMinimap }));\n },\n\n togglePalette: () => {\n set((state) => ({ showPalette: !state.showPalette }));\n },\n}));\n","import type { EdgeStyle, ProviderType } from '@genfeedai/types';\nimport { ProviderTypeEnum } from '@genfeedai/types';\nimport { create } from 'zustand';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type { EdgeStyle, ProviderType };\n\nexport interface ProviderConfig {\n apiKey: string | null;\n enabled: boolean;\n}\n\nexport interface ProviderSettings {\n replicate: ProviderConfig;\n fal: ProviderConfig;\n huggingface: ProviderConfig;\n 'genfeed-ai': ProviderConfig;\n}\n\nexport interface DefaultModelSettings {\n imageModel: string;\n imageProvider: ProviderType;\n videoModel: string;\n videoProvider: ProviderType;\n}\n\nexport interface RecentModel {\n id: string;\n displayName: string;\n provider: ProviderType;\n timestamp: number;\n}\n\ninterface SettingsStore {\n // Provider API Keys\n providers: ProviderSettings;\n\n // Default Models\n defaults: DefaultModelSettings;\n\n // UI Preferences\n edgeStyle: EdgeStyle;\n showMinimap: boolean;\n autoSaveEnabled: boolean;\n\n // Recent models (for model browser)\n recentModels: RecentModel[];\n\n // Onboarding\n hasSeenWelcome: boolean;\n\n // Developer\n debugMode: boolean;\n\n // Actions\n toggleAutoSave: () => void;\n setDebugMode: (enabled: boolean) => void;\n setProviderKey: (provider: ProviderType, key: string | null) => void;\n setProviderEnabled: (provider: ProviderType, enabled: boolean) => void;\n setDefaultModel: (\n type: 'image' | 'video',\n model: string,\n provider: ProviderType,\n ) => void;\n setEdgeStyle: (style: EdgeStyle) => void;\n setShowMinimap: (show: boolean) => void;\n addRecentModel: (model: Omit<RecentModel, 'timestamp'>) => void;\n clearProviderKey: (provider: ProviderType) => void;\n clearAllKeys: () => void;\n setHasSeenWelcome: (seen: boolean) => void;\n\n // Computed\n isProviderConfigured: (provider: ProviderType) => boolean;\n getProviderHeader: (provider: ProviderType) => Record<string, string>;\n\n // API Sync (no-ops in shared package - consuming app overrides these)\n isSyncing: boolean;\n syncFromServer: () => Promise<void>;\n syncToServer: () => Promise<void>;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst STORAGE_KEY = 'genfeed-settings';\nconst MAX_RECENT_MODELS = 8;\n\nconst DEFAULT_SETTINGS = {\n autoSaveEnabled: true,\n debugMode: false,\n defaults: {\n imageModel: 'nano-banana-pro',\n imageProvider: 'replicate' as ProviderType,\n videoModel: 'veo-3.1',\n videoProvider: 'replicate' as ProviderType,\n },\n edgeStyle: 'default' as EdgeStyle,\n hasSeenWelcome: false,\n providers: {\n fal: { apiKey: null, enabled: false },\n 'genfeed-ai': { apiKey: null, enabled: true },\n huggingface: { apiKey: null, enabled: false },\n replicate: { apiKey: null, enabled: true },\n },\n recentModels: [] as RecentModel[],\n showMinimap: true,\n};\n\n// =============================================================================\n// PERSISTENCE\n// =============================================================================\n\nfunction loadFromStorage(): Partial<typeof DEFAULT_SETTINGS> {\n if (typeof window === 'undefined') return {};\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n return {\n autoSaveEnabled: parsed.autoSaveEnabled ?? true,\n debugMode: parsed.debugMode ?? false,\n defaults: { ...DEFAULT_SETTINGS.defaults, ...parsed.defaults },\n edgeStyle:\n parsed.edgeStyle === 'bezier'\n ? 'default'\n : (parsed.edgeStyle ?? DEFAULT_SETTINGS.edgeStyle),\n hasSeenWelcome: parsed.hasSeenWelcome ?? false,\n providers: { ...DEFAULT_SETTINGS.providers, ...parsed.providers },\n recentModels: parsed.recentModels ?? [],\n showMinimap: parsed.showMinimap ?? DEFAULT_SETTINGS.showMinimap,\n };\n }\n } catch {\n // Invalid JSON or storage error\n }\n return {};\n}\n\nfunction saveToStorage(state: {\n providers: ProviderSettings;\n defaults: DefaultModelSettings;\n edgeStyle: EdgeStyle;\n showMinimap: boolean;\n autoSaveEnabled: boolean;\n recentModels: RecentModel[];\n hasSeenWelcome: boolean;\n debugMode: boolean;\n}) {\n if (typeof window === 'undefined') return;\n\n try {\n // Don't persist API keys in plain text - only enabled status and non-sensitive settings\n const toSave = {\n autoSaveEnabled: state.autoSaveEnabled,\n debugMode: state.debugMode,\n defaults: state.defaults,\n edgeStyle: state.edgeStyle,\n hasSeenWelcome: state.hasSeenWelcome,\n providers: {\n fal: {\n apiKey: state.providers.fal.apiKey,\n enabled: state.providers.fal.enabled,\n },\n huggingface: {\n apiKey: state.providers.huggingface.apiKey,\n enabled: state.providers.huggingface.enabled,\n },\n replicate: {\n apiKey: state.providers.replicate.apiKey,\n enabled: state.providers.replicate.enabled,\n },\n },\n recentModels: state.recentModels.slice(0, MAX_RECENT_MODELS),\n showMinimap: state.showMinimap,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(toSave));\n } catch {\n // Storage error (quota exceeded, etc.)\n }\n}\n\n// =============================================================================\n// STORE\n// =============================================================================\n\nconst initialState = { ...DEFAULT_SETTINGS, ...loadFromStorage() };\n\nexport const useSettingsStore = create<SettingsStore>((set, get) => {\n // Helper to set state and persist in one call\n const setAndPersist = (\n updater: (state: SettingsStore) => Partial<SettingsStore>,\n ) => {\n set((state) => {\n const newState = updater(state);\n saveToStorage({ ...state, ...newState } as Parameters<\n typeof saveToStorage\n >[0]);\n return newState;\n });\n };\n\n return {\n addRecentModel: (model) => {\n setAndPersist((state) => {\n // Remove existing entry for same model\n const filtered = state.recentModels.filter(\n (m) => !(m.id === model.id && m.provider === model.provider),\n );\n // Add to front with timestamp\n const newRecentModels = [\n { ...model, timestamp: Date.now() },\n ...filtered,\n ].slice(0, MAX_RECENT_MODELS);\n return { recentModels: newRecentModels };\n });\n },\n autoSaveEnabled: initialState.autoSaveEnabled,\n\n clearAllKeys: () => {\n setAndPersist((state) => ({\n providers: {\n fal: { ...state.providers.fal, apiKey: null },\n 'genfeed-ai': { ...state.providers['genfeed-ai'], apiKey: null },\n huggingface: { ...state.providers.huggingface, apiKey: null },\n replicate: { ...state.providers.replicate, apiKey: null },\n },\n }));\n },\n\n clearProviderKey: (provider) => {\n setAndPersist((state) => ({\n providers: {\n ...state.providers,\n [provider]: {\n ...state.providers[provider],\n apiKey: null,\n },\n },\n }));\n },\n debugMode: initialState.debugMode,\n defaults: initialState.defaults,\n edgeStyle: initialState.edgeStyle,\n\n getProviderHeader: (provider) => {\n const state = get();\n const key = state.providers[provider].apiKey;\n if (!key) return {};\n\n const headerMap: Record<ProviderType, string> = {\n [ProviderTypeEnum.REPLICATE]: 'X-Replicate-Key',\n [ProviderTypeEnum.FAL]: 'X-Fal-Key',\n [ProviderTypeEnum.HUGGINGFACE]: 'X-HF-Key',\n [ProviderTypeEnum.GENFEED_AI]: 'X-Genfeed-Key',\n };\n\n return { [headerMap[provider]]: key };\n },\n hasSeenWelcome: initialState.hasSeenWelcome,\n\n isProviderConfigured: (provider) => {\n const state = get();\n return !!state.providers[provider].apiKey;\n },\n\n // API Sync - stubbed as no-ops (consuming app provides real implementations)\n isSyncing: false,\n providers: initialState.providers,\n recentModels: initialState.recentModels,\n\n setDebugMode: (enabled) => {\n setAndPersist(() => ({ debugMode: enabled }));\n },\n\n setDefaultModel: (type, model, provider) => {\n setAndPersist((state) => ({\n defaults: {\n ...state.defaults,\n ...(type === 'image'\n ? { imageModel: model, imageProvider: provider }\n : { videoModel: model, videoProvider: provider }),\n },\n }));\n },\n\n setEdgeStyle: (style) => {\n setAndPersist(() => ({ edgeStyle: style }));\n // Dynamic import to avoid circular dependency\n // Consuming app must provide workflowStore at this path\n import('./workflowStore').then(({ useWorkflowStore }) => {\n useWorkflowStore.getState().setEdgeStyle(style);\n });\n },\n\n setHasSeenWelcome: (seen) => {\n setAndPersist(() => ({ hasSeenWelcome: seen }));\n },\n\n setProviderEnabled: (provider, enabled) => {\n setAndPersist((state) => ({\n providers: {\n ...state.providers,\n [provider]: {\n ...state.providers[provider],\n enabled,\n },\n },\n }));\n },\n\n setProviderKey: (provider, key) => {\n setAndPersist((state) => ({\n providers: {\n ...state.providers,\n [provider]: {\n ...state.providers[provider],\n apiKey: key,\n enabled: key ? true : state.providers[provider].enabled,\n },\n },\n }));\n },\n\n setShowMinimap: (show) => {\n setAndPersist(() => ({ showMinimap: show }));\n },\n showMinimap: initialState.showMinimap,\n\n syncFromServer: async () => {\n // No-op: consuming app should override with real API sync\n },\n\n syncToServer: async () => {\n // No-op: consuming app should override with real API sync\n },\n\n toggleAutoSave: () => {\n setAndPersist((state) => ({ autoSaveEnabled: !state.autoSaveEnabled }));\n },\n };\n});\n\n// =============================================================================\n// PROVIDER DISPLAY INFO\n// =============================================================================\n\nexport const PROVIDER_INFO: Record<\n ProviderType,\n { name: string; description: string; docsUrl: string }\n> = {\n [ProviderTypeEnum.REPLICATE]: {\n description: 'Access thousands of open-source AI models',\n docsUrl: 'https://replicate.com/docs',\n name: 'Replicate',\n },\n [ProviderTypeEnum.FAL]: {\n description: 'Fast inference for image and video generation',\n docsUrl: 'https://fal.ai/docs',\n name: 'fal.ai',\n },\n [ProviderTypeEnum.HUGGINGFACE]: {\n description: 'The AI community platform with 500k+ models',\n docsUrl: 'https://huggingface.co/docs/api-inference',\n name: 'Hugging Face',\n },\n [ProviderTypeEnum.GENFEED_AI]: {\n description: 'Built-in models powered by Genfeed',\n docsUrl: 'https://genfeed.ai/docs',\n name: 'Genfeed AI',\n },\n};\n","import type { useWorkflowStore } from '../../workflow/workflowStore';\n\n/**\n * Extract the actual URL/value from various Replicate output formats\n * Replicate outputs can be:\n * - A string URL directly: \"https://...\"\n * - An array with one URL: [\"https://...\"]\n * - An object with a url field: { url: \"https://...\" }\n * - An object with image/video field: { image: \"https://...\" } or { video: \"https://...\" }\n */\nfunction extractOutputValue(output: unknown): string | null {\n if (!output) return null;\n\n // Direct string URL\n if (typeof output === 'string') {\n return output;\n }\n\n // Array of URLs - take the first one\n if (Array.isArray(output) && output.length > 0) {\n const first = output[0];\n if (typeof first === 'string') return first;\n if (first && typeof first === 'object' && 'url' in first) {\n return String((first as { url: unknown }).url);\n }\n }\n\n // Object with url, image, video, or audio field (backend normalizes to these formats)\n if (typeof output === 'object' && output !== null) {\n const obj = output as Record<string, unknown>;\n if ('url' in obj) return String(obj.url);\n if ('image' in obj) return String(obj.image);\n if ('video' in obj) return String(obj.video);\n if ('audio' in obj) return String(obj.audio);\n }\n\n return null;\n}\n\n/**\n * Extract ALL output URLs from various formats\n * Used for multi-image outputs (e.g., SeedDream 4.5)\n */\nfunction extractAllOutputValues(output: unknown): string[] {\n if (!output) return [];\n\n // Direct string URL\n if (typeof output === 'string') {\n return [output];\n }\n\n // Array of URLs - return all\n if (Array.isArray(output)) {\n return output.filter((item): item is string => typeof item === 'string');\n }\n\n // Object with images array (backend normalizes multi-image outputs to this format)\n if (typeof output === 'object' && output !== null) {\n const obj = output as Record<string, unknown>;\n if ('images' in obj && Array.isArray(obj.images)) {\n return obj.images.filter(\n (item): item is string => typeof item === 'string',\n );\n }\n // Fallback to single image field\n if ('image' in obj && typeof obj.image === 'string') {\n return [obj.image];\n }\n }\n\n return [];\n}\n\n/**\n * Map output to correct node data field based on node type\n */\nexport function getOutputUpdate(\n nodeId: string,\n output: unknown,\n workflowStore: ReturnType<typeof useWorkflowStore.getState>,\n): Record<string, unknown> {\n const node = workflowStore.getNodeById(nodeId);\n if (!node) return {};\n\n const nodeType = node.type;\n const outputValue = extractOutputValue(output);\n\n // Image output nodes - handle multiple images\n if (['imageGen'].includes(nodeType)) {\n const allImages = extractAllOutputValues(output);\n return {\n outputImage: allImages[0] ?? null,\n outputImages: allImages,\n };\n }\n\n // Unified nodes - output type matches input type\n if (['reframe', 'upscale'].includes(nodeType)) {\n const inputType = (node.data as { inputType?: string }).inputType;\n if (inputType === 'video') {\n return { outputVideo: outputValue };\n }\n return { outputImage: outputValue };\n }\n\n // Video output nodes\n if (\n [\n 'videoGen',\n 'animation',\n 'videoStitch',\n 'lipSync',\n 'voiceChange',\n 'motionControl',\n ].includes(nodeType)\n ) {\n return { outputVideo: outputValue };\n }\n\n // Audio output nodes\n if (nodeType === 'textToSpeech') {\n return { outputAudio: outputValue };\n }\n\n // LLM nodes - keep original for text (might be array of strings)\n if (nodeType === 'llm') {\n const textOutput = Array.isArray(output) ? output.join('') : outputValue;\n return { outputText: textOutput };\n }\n\n // Resize nodes\n if (nodeType === 'resize') {\n return { outputMedia: outputValue };\n }\n\n return { output: outputValue };\n}\n","import type { NodeStatus } from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { StoreApi } from 'zustand';\nimport { useUIStore } from '../../uiStore';\nimport { useWorkflowStore } from '../../workflow/workflowStore';\nimport type {\n DebugPayload,\n ExecutionData,\n ExecutionStore,\n Job,\n} from '../types';\nimport { getOutputUpdate } from './outputHelpers';\n\nconst API_BASE_URL =\n process.env.NEXT_PUBLIC_API_URL || 'http://local.genfeed.ai:3001/api';\n\n/**\n * Status map for converting execution statuses to node statuses\n */\nconst statusMap: Record<string, NodeStatus> = {\n complete: NodeStatusEnum.COMPLETE,\n error: NodeStatusEnum.ERROR,\n pending: NodeStatusEnum.IDLE,\n processing: NodeStatusEnum.PROCESSING,\n succeeded: NodeStatusEnum.COMPLETE,\n};\n\nfunction applyJobUpdates(\n jobs: ExecutionData['jobs'] | undefined,\n workflowStore: ReturnType<typeof useWorkflowStore.getState>,\n debugMode: boolean | undefined,\n set: StoreApi<ExecutionStore>['setState'],\n filterNodeId?: string,\n): void {\n if (!jobs || jobs.length === 0) return;\n\n set((state) => {\n let didChange = false;\n const newJobs = new Map(state.jobs);\n const newDebugPayloads: DebugPayload[] = [];\n\n for (const job of jobs) {\n if (filterNodeId && job.nodeId !== filterNodeId) continue;\n\n const status = job.status as Job['status'];\n const output = job.output ?? null;\n const error = job.error ?? null;\n const existing = state.jobs.get(job.predictionId);\n\n if (!existing) {\n didChange = true;\n newJobs.set(job.predictionId, {\n createdAt: new Date().toISOString(),\n error,\n nodeId: job.nodeId,\n output,\n predictionId: job.predictionId,\n progress: 0,\n status,\n });\n } else if (\n existing.status !== status ||\n existing.output !== output ||\n existing.error !== error\n ) {\n didChange = true;\n newJobs.set(job.predictionId, {\n ...existing,\n error,\n output,\n status,\n });\n }\n\n if (job.result?.debugPayload) {\n const node = workflowStore.getNodeById(job.nodeId);\n newDebugPayloads.push({\n input: job.result.debugPayload.input,\n model: job.result.debugPayload.model,\n nodeId: job.nodeId,\n nodeName: String(node?.data?.label || node?.data?.name || job.nodeId),\n nodeType: node?.type || 'unknown',\n timestamp: job.result.debugPayload.timestamp,\n });\n }\n }\n\n if (!didChange && newDebugPayloads.length === 0) return state;\n\n if (newDebugPayloads.length > 0 && debugMode) {\n useUIStore.getState().setShowDebugPanel(true);\n }\n\n return {\n debugPayloads:\n newDebugPayloads.length > 0\n ? [\n ...state.debugPayloads.filter(\n (existing) =>\n !newDebugPayloads.some(\n (newP) => newP.nodeId === existing.nodeId,\n ),\n ),\n ...newDebugPayloads,\n ]\n : state.debugPayloads,\n jobs: didChange ? newJobs : state.jobs,\n };\n });\n}\n\n/**\n * Fetch the final execution state via REST and reconcile all node statuses.\n * This recovers from missed SSE deltas (e.g. dropped connections, race conditions).\n */\nasync function reconcileNodeStatuses(executionId: string): Promise<void> {\n try {\n const response = await fetch(`${API_BASE_URL}/executions/${executionId}`);\n if (!response.ok) return;\n\n const execution = await response.json();\n const workflowStore = useWorkflowStore.getState();\n\n for (const nodeResult of execution.nodeResults || []) {\n const nodeStatus = statusMap[nodeResult.status] ?? NodeStatusEnum.IDLE;\n const isSuccess =\n nodeResult.status === 'complete' || nodeResult.status === 'succeeded';\n\n workflowStore.updateNodeData(nodeResult.nodeId, {\n error: isSuccess ? undefined : nodeResult.error,\n status: nodeStatus,\n ...(nodeResult.output &&\n getOutputUpdate(nodeResult.nodeId, nodeResult.output, workflowStore)),\n });\n\n if (isSuccess && nodeResult.output) {\n workflowStore.propagateOutputsDownstream(nodeResult.nodeId);\n }\n }\n } catch {\n // Silent fail -- best effort reconciliation\n }\n}\n\n/**\n * Create an SSE subscription for execution updates\n */\nexport function createExecutionSubscription(\n executionId: string,\n set: StoreApi<ExecutionStore>['setState'],\n): EventSource {\n const eventSource = new EventSource(\n `${API_BASE_URL}/executions/${executionId}/stream`,\n );\n\n // Track nodes that have already propagated to prevent duplicate cascades\n const propagatedNodeIds = new Set<string>();\n\n set({ eventSource });\n\n eventSource.onmessage = (event) => {\n void (async () => {\n try {\n const data = JSON.parse(event.data) as ExecutionData;\n const workflowStore = useWorkflowStore.getState();\n\n // Update node statuses from execution data\n const nodeResults = data.nodeResults || [];\n for (const nodeResult of nodeResults) {\n const nodeStatus =\n statusMap[nodeResult.status] ?? NodeStatusEnum.IDLE;\n const isSuccess =\n nodeResult.status === 'complete' ||\n nodeResult.status === 'succeeded';\n\n workflowStore.updateNodeData(nodeResult.nodeId, {\n error: isSuccess ? undefined : nodeResult.error,\n status: nodeStatus,\n ...(nodeResult.output &&\n getOutputUpdate(\n nodeResult.nodeId,\n nodeResult.output,\n workflowStore,\n )),\n });\n\n // Propagate output to downstream nodes when complete\n if (\n (nodeResult.status === 'complete' ||\n nodeResult.status === 'succeeded') &&\n nodeResult.output &&\n !propagatedNodeIds.has(nodeResult.nodeId)\n ) {\n propagatedNodeIds.add(nodeResult.nodeId);\n workflowStore.propagateOutputsDownstream(nodeResult.nodeId);\n }\n\n // Track failed node for resume capability\n if (nodeResult.status === 'error') {\n set({ lastFailedNodeId: nodeResult.nodeId });\n }\n }\n\n applyJobUpdates(data.jobs, workflowStore, data.debugMode, set);\n\n // Check if execution is complete\n const isComplete = [\n 'completed',\n 'failed',\n 'cancelled',\n 'error',\n ].includes(data.status);\n const hasFailedNode = (data.nodeResults || []).some(\n (r) => r.status === 'error',\n );\n const hasPendingNodes = (data.pendingNodes || []).length > 0;\n const hasProcessingNodes = (data.nodeResults || []).some(\n (r) => r.status === 'processing',\n );\n const isDone =\n isComplete ||\n (hasFailedNode && !hasPendingNodes && !hasProcessingNodes);\n\n if (isDone) {\n propagatedNodeIds.clear();\n eventSource.close();\n\n await reconcileNodeStatuses(executionId);\n\n set({\n currentNodeId: null,\n eventSource: null,\n isRunning: false,\n jobs: new Map(),\n });\n\n if (data.status === 'failed' || hasFailedNode) {\n // Execution failed - consuming app can handle error reporting\n }\n }\n } catch {\n // Failed to parse SSE message\n }\n })();\n };\n\n eventSource.onerror = () => {\n eventSource.close();\n void reconcileNodeStatuses(executionId).then(() => {\n set({ eventSource: null, isRunning: false });\n });\n };\n\n return eventSource;\n}\n\n/**\n * Create a node-scoped SSE subscription for independent node execution.\n * Does NOT set global isRunning/eventSource state -- only manages per-node state\n * via the activeNodeExecutions map.\n */\nexport function createNodeExecutionSubscription(\n executionId: string,\n nodeId: string,\n set: StoreApi<ExecutionStore>['setState'],\n _get: StoreApi<ExecutionStore>['getState'],\n): EventSource {\n const eventSource = new EventSource(\n `${API_BASE_URL}/executions/${executionId}/stream`,\n );\n const propagatedNodeIds = new Set<string>();\n\n eventSource.onmessage = (event) => {\n void (async () => {\n try {\n const data = JSON.parse(event.data) as ExecutionData;\n const workflowStore = useWorkflowStore.getState();\n\n const nodeResults = data.nodeResults || [];\n for (const nodeResult of nodeResults) {\n const nodeStatus =\n statusMap[nodeResult.status] ?? NodeStatusEnum.IDLE;\n const isSuccess =\n nodeResult.status === 'complete' ||\n nodeResult.status === 'succeeded';\n\n workflowStore.updateNodeData(nodeResult.nodeId, {\n error: isSuccess ? undefined : nodeResult.error,\n status: nodeStatus,\n ...(nodeResult.output &&\n getOutputUpdate(\n nodeResult.nodeId,\n nodeResult.output,\n workflowStore,\n )),\n });\n\n if (\n (nodeResult.status === 'complete' ||\n nodeResult.status === 'succeeded') &&\n nodeResult.output &&\n !propagatedNodeIds.has(nodeResult.nodeId)\n ) {\n propagatedNodeIds.add(nodeResult.nodeId);\n workflowStore.propagateOutputsDownstream(nodeResult.nodeId);\n }\n\n if (nodeResult.status === 'error') {\n set({ lastFailedNodeId: nodeResult.nodeId });\n }\n }\n\n applyJobUpdates(data.jobs, workflowStore, data.debugMode, set, nodeId);\n\n const isComplete = [\n 'completed',\n 'failed',\n 'cancelled',\n 'error',\n ].includes(data.status);\n const hasFailedNode = (data.nodeResults || []).some(\n (r) => r.status === 'error',\n );\n const hasPendingNodes = (data.pendingNodes || []).length > 0;\n const hasProcessingNodes = (data.nodeResults || []).some(\n (r) => r.status === 'processing',\n );\n const isDone =\n isComplete ||\n (hasFailedNode && !hasPendingNodes && !hasProcessingNodes);\n\n if (isDone) {\n propagatedNodeIds.clear();\n eventSource.close();\n\n await reconcileNodeStatuses(executionId);\n\n // Remove this node execution from the active map\n set((state) => {\n const newMap = new Map(state.activeNodeExecutions);\n newMap.delete(nodeId);\n return { activeNodeExecutions: newMap };\n });\n }\n } catch {\n // Failed to parse SSE message (node execution)\n }\n })();\n };\n\n eventSource.onerror = () => {\n eventSource.close();\n void reconcileNodeStatuses(executionId).then(() => {\n set((state) => {\n const newMap = new Map(state.activeNodeExecutions);\n newMap.delete(nodeId);\n return { activeNodeExecutions: newMap };\n });\n });\n };\n\n return eventSource;\n}\n","import { NodeStatusEnum } from '@genfeedai/types';\nimport type { StateCreator } from 'zustand';\nimport { useSettingsStore } from '../../settingsStore';\nimport { useUIStore } from '../../uiStore';\nimport { useWorkflowStore } from '../../workflow/workflowStore';\nimport {\n createExecutionSubscription,\n createNodeExecutionSubscription,\n} from '../helpers/sseSubscription';\nimport type { ExecutionData, ExecutionStore, NodeExecution } from '../types';\n\nconst API_BASE_URL =\n process.env.NEXT_PUBLIC_API_URL || 'http://local.genfeed.ai:3001/api';\n\n/**\n * Simple fetch-based API client for execution operations.\n * Consuming apps can override by providing their own execution store.\n */\nasync function apiPost<T>(\n path: string,\n body?: Record<string, unknown>,\n): Promise<T> {\n const response = await fetch(`${API_BASE_URL}${path}`, {\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n ...(body && { body: JSON.stringify(body) }),\n });\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n (errorData as { message?: string }).message ||\n `API error: ${response.status}`,\n );\n }\n return response.json() as Promise<T>;\n}\n\nexport interface ExecutionSlice {\n executeWorkflow: () => Promise<void>;\n executeSelectedNodes: () => Promise<void>;\n executeNode: (nodeId: string) => Promise<void>;\n resumeFromFailed: () => Promise<void>;\n stopExecution: () => void;\n stopNodeExecution: (nodeId: string) => void;\n isNodeExecuting: (nodeId: string) => boolean;\n clearValidationErrors: () => void;\n resetExecution: () => void;\n canResumeFromFailed: () => boolean;\n setEstimatedCost: (cost: number) => void;\n}\n\nexport const createExecutionSlice: StateCreator<\n ExecutionStore,\n [],\n [],\n ExecutionSlice\n> = (set, get) => ({\n canResumeFromFailed: () => {\n const { executionId, lastFailedNodeId, isRunning } = get();\n return !isRunning && Boolean(executionId) && Boolean(lastFailedNodeId);\n },\n\n clearValidationErrors: () => {\n set({ validationErrors: null });\n },\n\n executeNode: async (nodeId: string) => {\n const workflowStore = useWorkflowStore.getState();\n const debugMode = useSettingsStore.getState().debugMode;\n\n // Save workflow if dirty\n if (workflowStore.isDirty || !workflowStore.workflowId) {\n try {\n await workflowStore.saveWorkflow();\n } catch {\n workflowStore.updateNodeData(nodeId, {\n error: 'Failed to save workflow',\n status: NodeStatusEnum.ERROR,\n });\n return;\n }\n }\n\n const workflowId = workflowStore.workflowId;\n if (!workflowId) {\n workflowStore.updateNodeData(nodeId, {\n error: 'Workflow must be saved first',\n status: NodeStatusEnum.ERROR,\n });\n return;\n }\n\n if (debugMode) {\n useUIStore.getState().setShowDebugPanel(true);\n }\n\n try {\n const execution = await apiPost<ExecutionData>(\n `/workflows/${workflowId}/execute`,\n {\n debugMode,\n selectedNodeIds: [nodeId],\n },\n );\n const executionId = execution._id;\n\n const eventSource = createNodeExecutionSubscription(\n executionId,\n nodeId,\n set,\n get,\n );\n\n const nodeExecution: NodeExecution = {\n eventSource,\n executionId,\n nodeIds: [nodeId],\n };\n\n set((state) => {\n const newMap = new Map(state.activeNodeExecutions);\n newMap.set(nodeId, nodeExecution);\n return { activeNodeExecutions: newMap };\n });\n } catch (error) {\n workflowStore.updateNodeData(nodeId, {\n error: error instanceof Error ? error.message : 'Node execution failed',\n status: NodeStatusEnum.ERROR,\n });\n }\n },\n\n executeSelectedNodes: async () => {\n const { isRunning, resetExecution } = get();\n if (isRunning) return;\n\n const workflowStore = useWorkflowStore.getState();\n const debugMode = useSettingsStore.getState().debugMode;\n const { selectedNodeIds } = workflowStore;\n\n if (selectedNodeIds.length === 0) {\n set({\n validationErrors: {\n errors: [\n { message: 'No nodes selected', nodeId: '', severity: 'error' },\n ],\n isValid: false,\n warnings: [],\n },\n });\n return;\n }\n\n set({ validationErrors: null });\n resetExecution();\n\n if (workflowStore.isDirty || !workflowStore.workflowId) {\n try {\n await workflowStore.saveWorkflow();\n } catch {\n set({\n validationErrors: {\n errors: [\n {\n message: 'Failed to save workflow',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n return;\n }\n }\n\n const workflowId = workflowStore.workflowId;\n if (!workflowId) {\n set({\n validationErrors: {\n errors: [\n {\n message: 'Workflow must be saved first',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n return;\n }\n\n // Track which nodes are being executed for edge highlighting\n set({ executingNodeIds: selectedNodeIds, isRunning: true });\n\n // Open debug panel if debug mode is active\n if (debugMode) {\n useUIStore.getState().setShowDebugPanel(true);\n }\n\n for (const nodeId of selectedNodeIds) {\n workflowStore.updateNodeData(nodeId, {\n error: undefined,\n progress: undefined,\n status: NodeStatusEnum.IDLE,\n });\n }\n\n try {\n const execution = await apiPost<ExecutionData>(\n `/workflows/${workflowId}/execute`,\n {\n debugMode,\n selectedNodeIds,\n },\n );\n const executionId = execution._id;\n\n set({ executionId });\n\n createExecutionSubscription(executionId, set);\n } catch (error) {\n set({\n isRunning: false,\n validationErrors: {\n errors: [\n {\n message:\n error instanceof Error\n ? error.message\n : 'Partial execution failed',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n }\n },\n executeWorkflow: async () => {\n const { isRunning, resetExecution } = get();\n if (isRunning) return;\n\n const workflowStore = useWorkflowStore.getState();\n const debugMode = useSettingsStore.getState().debugMode;\n\n const validation = workflowStore.validateWorkflow();\n if (!validation.isValid) {\n set({ validationErrors: validation });\n return;\n }\n\n set({ validationErrors: null });\n resetExecution();\n\n // Open debug panel if debug mode is active\n if (debugMode) {\n useUIStore.getState().setShowDebugPanel(true);\n }\n\n if (workflowStore.isDirty || !workflowStore.workflowId) {\n try {\n await workflowStore.saveWorkflow();\n } catch {\n set({\n validationErrors: {\n errors: [\n {\n message: 'Failed to save workflow',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n return;\n }\n }\n\n const workflowId = workflowStore.workflowId;\n if (!workflowId) {\n set({\n validationErrors: {\n errors: [\n {\n message: 'Workflow must be saved first',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n return;\n }\n\n set({ isRunning: true });\n\n for (const node of workflowStore.nodes) {\n workflowStore.updateNodeData(node.id, {\n error: undefined,\n progress: undefined,\n status: NodeStatusEnum.IDLE,\n });\n }\n\n try {\n const execution = await apiPost<ExecutionData>(\n `/workflows/${workflowId}/execute`,\n {\n debugMode,\n },\n );\n const executionId = execution._id;\n\n set({ executionId });\n\n createExecutionSubscription(executionId, set);\n } catch (error) {\n set({\n isRunning: false,\n validationErrors: {\n errors: [\n {\n message:\n error instanceof Error ? error.message : 'Execution failed',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n }\n },\n\n isNodeExecuting: (nodeId: string) => {\n const { activeNodeExecutions } = get();\n return activeNodeExecutions.has(nodeId);\n },\n\n resetExecution: () => {\n const { eventSource, activeNodeExecutions } = get();\n\n if (eventSource) {\n eventSource.close();\n }\n\n // Close all active node execution SSE connections\n for (const nodeExecution of activeNodeExecutions.values()) {\n nodeExecution.eventSource.close();\n }\n\n set({\n activeNodeExecutions: new Map(),\n actualCost: 0,\n currentNodeId: null,\n debugPayloads: [],\n eventSource: null,\n executingNodeIds: [],\n executionId: null,\n isRunning: false,\n jobs: new Map(),\n lastFailedNodeId: null,\n });\n\n const workflowStore = useWorkflowStore.getState();\n for (const node of workflowStore.nodes) {\n workflowStore.updateNodeData(node.id, {\n error: undefined,\n progress: undefined,\n status: NodeStatusEnum.IDLE,\n });\n }\n },\n\n resumeFromFailed: async () => {\n const { isRunning, executionId, lastFailedNodeId } = get();\n if (isRunning || !executionId || !lastFailedNodeId) return;\n\n const workflowStore = useWorkflowStore.getState();\n const debugMode = useSettingsStore.getState().debugMode;\n const workflowId = workflowStore.workflowId;\n\n if (!workflowId) {\n set({\n validationErrors: {\n errors: [\n {\n message: 'Workflow must be saved first',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n return;\n }\n\n set({ isRunning: true, validationErrors: null });\n\n // Open debug panel if debug mode is active\n if (debugMode) {\n useUIStore.getState().setShowDebugPanel(true);\n }\n\n workflowStore.updateNodeData(lastFailedNodeId, {\n error: undefined,\n progress: undefined,\n status: NodeStatusEnum.IDLE,\n });\n\n try {\n const execution = await apiPost<ExecutionData>(\n `/workflows/${workflowId}/execute`,\n {\n debugMode,\n },\n );\n const newExecutionId = execution._id;\n\n set({ executionId: newExecutionId, lastFailedNodeId: null });\n\n createExecutionSubscription(newExecutionId, set);\n } catch (error) {\n set({\n isRunning: false,\n validationErrors: {\n errors: [\n {\n message: error instanceof Error ? error.message : 'Resume failed',\n nodeId: '',\n severity: 'error',\n },\n ],\n isValid: false,\n warnings: [],\n },\n });\n }\n },\n\n setEstimatedCost: (cost: number) => {\n set({ estimatedCost: cost });\n },\n\n stopExecution: () => {\n const { eventSource, executionId } = get();\n\n if (eventSource) {\n eventSource.close();\n }\n\n if (executionId) {\n apiPost(`/executions/${executionId}/stop`).catch(() => {\n // Failed to stop execution\n });\n }\n\n set({\n currentNodeId: null,\n eventSource: null,\n isRunning: false,\n });\n },\n\n stopNodeExecution: (nodeId: string) => {\n const { activeNodeExecutions } = get();\n const nodeExecution = activeNodeExecutions.get(nodeId);\n\n if (nodeExecution) {\n nodeExecution.eventSource.close();\n\n apiPost(`/executions/${nodeExecution.executionId}/stop`).catch(() => {\n // Failed to stop node execution\n });\n\n set((state) => {\n const newMap = new Map(state.activeNodeExecutions);\n newMap.delete(nodeId);\n return { activeNodeExecutions: newMap };\n });\n }\n\n const workflowStore = useWorkflowStore.getState();\n workflowStore.updateNodeData(nodeId, {\n error: undefined,\n status: NodeStatusEnum.IDLE,\n });\n },\n});\n","import type { StateCreator } from 'zustand';\nimport type { ExecutionStore, Job } from '../types';\n\nexport interface JobSlice {\n addJob: (nodeId: string, predictionId: string) => void;\n updateJob: (predictionId: string, updates: Partial<Job>) => void;\n getJobByNodeId: (nodeId: string) => Job | undefined;\n}\n\nexport const createJobSlice: StateCreator<ExecutionStore, [], [], JobSlice> = (\n set,\n get,\n) => ({\n addJob: (nodeId, predictionId) => {\n set((state) => {\n const newJobs = new Map(state.jobs);\n newJobs.set(predictionId, {\n createdAt: new Date().toISOString(),\n error: null,\n nodeId,\n output: null,\n predictionId,\n progress: 0,\n status: 'pending',\n });\n return { jobs: newJobs };\n });\n },\n\n getJobByNodeId: (nodeId) => {\n const { jobs } = get();\n for (const job of jobs.values()) {\n if (job.nodeId === nodeId) return job;\n }\n return undefined;\n },\n\n updateJob: (predictionId, updates) => {\n set((state) => {\n const newJobs = new Map(state.jobs);\n const job = newJobs.get(predictionId);\n if (job) {\n newJobs.set(predictionId, { ...job, ...updates });\n }\n return { jobs: newJobs };\n });\n },\n});\n","import { create } from 'zustand';\nimport { createExecutionSlice } from './slices/executionSlice';\nimport { createJobSlice } from './slices/jobSlice';\nimport type { DebugPayload, ExecutionStore } from './types';\n\n/**\n * Execution Store\n *\n * Manages workflow execution state including jobs, validation, and SSE subscriptions.\n * Split into slices for maintainability:\n *\n * - executionSlice: Core execution operations (run, stop, resume)\n * - jobSlice: Job tracking and management\n */\nexport const useExecutionStore = create<ExecutionStore>()((...args) => {\n const [set] = args;\n\n return {\n activeNodeExecutions: new Map(),\n actualCost: 0,\n\n // Debug payload actions\n addDebugPayload: (payload: DebugPayload) => {\n set((state) => ({\n debugPayloads: [...state.debugPayloads, payload],\n }));\n },\n\n clearDebugPayloads: () => {\n set({ debugPayloads: [] });\n },\n currentNodeId: null,\n debugPayloads: [],\n estimatedCost: 0,\n eventSource: null,\n executingNodeIds: [],\n executionId: null,\n // Initial state\n isRunning: false,\n jobs: new Map(),\n lastFailedNodeId: null,\n pausedAtNodeId: null,\n validationErrors: null,\n\n // Compose slices\n ...createJobSlice(...args),\n ...createExecutionSlice(...args),\n };\n});\n\n// Re-export types for convenience\nexport type { ExecutionStore, Job } from './types';\n"]}
@@ -55,3 +55,5 @@ function Button({
55
55
  }
56
56
 
57
57
  export { Button, buttonVariants, cn };
58
+ //# sourceMappingURL=chunk-SBB2YW3Y.mjs.map
59
+ //# sourceMappingURL=chunk-SBB2YW3Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/utils.ts","../src/ui/button.tsx"],"names":[],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,weAAA;AAAA,EACA;AAAA,IACE,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,+BAAA;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EAAW,SAAA;AAAA,QACX,SAAA,EAAW,QAAA;AAAA,QACX,EAAA,EAAI,sCAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,uCAAA;AAAA,QACT,WAAA,EACE,mJAAA;AAAA,QACF,KAAA,EACE,sEAAA;AAAA,QACF,IAAA,EAAM,iDAAA;AAAA,QACN,OAAA,EACE,uIAAA;AAAA,QACF,SAAA,EACE;AAAA;AACJ;AACF;AAEJ;AAEA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV,GAAG;AACL,CAAA,EAGK;AACH,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAE9B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,cAAA,EAAc,OAAA;AAAA,MACd,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,CAAC,CAAA;AAAA,MACzD,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-SBB2YW3Y.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nimport { cn } from './utils';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n variants: {\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n icon: 'size-9',\n 'icon-lg': 'size-10',\n 'icon-sm': 'size-8',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n },\n variant: {\n default: 'bg-white text-black hover:bg-white/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n },\n },\n },\n);\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ className, size, variant }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n"]}
@@ -1,8 +1,8 @@
1
- import { Button } from './chunk-B4EAAKYF.mjs';
2
- import { extractEnumValues, supportsImageInput, validateRequiredSchemaFields, CONNECTION_FIELDS, getSchemaDefaults, getImageDimensions, getVideoMetadata } from './chunk-VVQ4CH77.mjs';
3
- import { useWorkflowUIConfig } from './chunk-YUIK4AHM.mjs';
4
- import { useExecutionStore } from './chunk-OJWVEEMM.mjs';
5
- import { useWorkflowStore } from './chunk-GPYIIWD5.mjs';
1
+ import { Button } from './chunk-SBB2YW3Y.mjs';
2
+ import { extractEnumValues, supportsImageInput, validateRequiredSchemaFields, CONNECTION_FIELDS, getSchemaDefaults, getImageDimensions, getVideoMetadata } from './chunk-X3XNTD4R.mjs';
3
+ import { useWorkflowUIConfig } from './chunk-JSF4FHBH.mjs';
4
+ import { useExecutionStore } from './chunk-R5L7WB7F.mjs';
5
+ import { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
6
6
  import { useMemo, useCallback, useRef, useEffect, useState } from 'react';
7
7
  import { ChevronDown, Expand, Square, Play } from 'lucide-react';
8
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -557,3 +557,5 @@ function usePromptAutocomplete({
557
557
  }
558
558
 
559
559
  export { useAIGenNode, useAIGenNodeHeader, useAutoLoadModelSchema, useCanGenerate, useMediaUpload, useModelSelection, useNodeExecution, usePromptAutocomplete, useRequiredInputs };
560
+ //# sourceMappingURL=chunk-SHU7JPQY.mjs.map
561
+ //# sourceMappingURL=chunk-SHU7JPQY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useAIGenNode.ts","../src/hooks/useAIGenNodeHeader.tsx","../src/hooks/useAutoLoadModelSchema.ts","../src/hooks/useRequiredInputs.ts","../src/hooks/useCanGenerate.ts","../src/hooks/useModelSelection.ts","../src/hooks/useNodeExecution.ts","../src/hooks/useMediaUpload.ts","../src/hooks/usePromptAutocomplete.ts"],"names":["useMemo","useCallback","NODE_DEFINITIONS","useRef","useState"],"mappings":"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","file":"chunk-SHU7JPQY.mjs","sourcesContent":["import type { SelectedModel, WorkflowNodeData } from '@genfeedai/types';\nimport { useCallback, useMemo } from 'react';\nimport { extractEnumValues, supportsImageInput } from '../lib/schemaUtils';\nimport type { SchemaInputs } from '../nodes/SchemaInputs';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\ninterface UseAIGenNodeOptions {\n nodeId: string;\n selectedModel: SelectedModel | undefined;\n schemaParams: Record<string, unknown> | undefined;\n}\n\nexport function useAIGenNode<TNodeData extends WorkflowNodeData>({\n nodeId,\n selectedModel,\n schemaParams,\n}: UseAIGenNodeOptions) {\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n\n const schemaProperties = useMemo(() => {\n const schema = selectedModel?.inputSchema as\n | { properties?: Record<string, unknown> }\n | undefined;\n return schema?.properties as Parameters<typeof SchemaInputs>[0]['schema'];\n }, [selectedModel?.inputSchema]);\n\n const enumValues = useMemo(\n () =>\n extractEnumValues(\n selectedModel?.componentSchemas as\n | Record<string, { enum?: unknown[]; type?: string }>\n | undefined,\n ),\n [selectedModel?.componentSchemas],\n );\n\n const modelSupportsImageInput = useMemo(\n () => supportsImageInput(selectedModel?.inputSchema),\n [selectedModel?.inputSchema],\n );\n\n const componentSchemas = selectedModel?.componentSchemas as\n | Record<string, { enum?: unknown[]; type?: string }>\n | undefined;\n\n const handleSchemaParamChange = useCallback(\n (key: string, value: unknown) => {\n // Get fresh state to avoid stale closure issues with rapid changes\n const currentNode = useWorkflowStore.getState().getNodeById(nodeId);\n const currentData = currentNode?.data as TNodeData | undefined;\n updateNodeData<TNodeData>(nodeId, {\n schemaParams: {\n ...(((currentData as Record<string, unknown> | undefined)\n ?.schemaParams as Record<string, unknown> | undefined) ?? {}),\n [key]: value,\n },\n } as Partial<TNodeData>);\n },\n [nodeId, updateNodeData],\n );\n\n return {\n componentSchemas,\n enumValues,\n handleSchemaParamChange,\n modelSupportsImageInput,\n schemaProperties,\n };\n}\n","import { ChevronDown, Expand, Play, Square } from 'lucide-react';\nimport { type ReactNode, useMemo } from 'react';\nimport { Button } from '../ui/button';\n\ninterface UseAIGenNodeHeaderOptions {\n modelDisplayName: string;\n isProcessing: boolean;\n canGenerate: boolean;\n hasOutput: boolean;\n onModelBrowse: () => void;\n onGenerate: () => void;\n onStop: () => void;\n onExpand: () => void;\n}\n\nexport function useAIGenNodeHeader({\n modelDisplayName,\n isProcessing,\n canGenerate,\n hasOutput,\n onModelBrowse,\n onGenerate,\n onStop,\n onExpand,\n}: UseAIGenNodeHeaderOptions): {\n titleElement: ReactNode;\n headerActions: ReactNode;\n} {\n const titleElement = useMemo(\n () => (\n <button\n className={`flex flex-1 items-center gap-1 text-sm font-medium text-left text-foreground ${isProcessing ? 'opacity-50 cursor-default' : 'hover:text-foreground/80 cursor-pointer'}`}\n onClick={() => !isProcessing && onModelBrowse()}\n title=\"Browse models\"\n disabled={isProcessing}\n >\n <span className=\"truncate\">{modelDisplayName}</span>\n <ChevronDown className=\"h-3 w-3 shrink-0\" />\n </button>\n ),\n [modelDisplayName, isProcessing, onModelBrowse],\n );\n\n const headerActions = useMemo(\n () => (\n <>\n {hasOutput && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n )}\n {isProcessing ? (\n <Button variant=\"destructive\" size=\"sm\" onClick={onStop}>\n <Square className=\"h-4 w-4 fill-current\" />\n Generating\n </Button>\n ) : (\n <Button\n variant={canGenerate ? 'default' : 'secondary'}\n size=\"sm\"\n onClick={onGenerate}\n disabled={!canGenerate}\n >\n <Play className=\"h-4 w-4 fill-current\" />\n Generate\n </Button>\n )}\n </>\n ),\n [hasOutput, isProcessing, canGenerate, onGenerate, onStop, onExpand],\n );\n\n return { headerActions, titleElement };\n}\n","import type { ProviderModel, SelectedModel } from '@genfeedai/types';\nimport { useEffect, useRef } from 'react';\nimport { useWorkflowUIConfig } from '../provider/WorkflowUIProvider';\n\ninterface UseAutoLoadModelSchemaOptions<TModel extends string> {\n /** Current model type from node data */\n currentModel: TModel | undefined;\n /** Selected model with full schema (if already loaded) */\n selectedModel: SelectedModel | undefined;\n /** Map from internal model type to API model ID */\n modelIdMap: Record<TModel, string>;\n /** Callback when model is loaded from API */\n onModelSelect: (model: ProviderModel) => void;\n}\n\n/**\n * Hook that auto-loads model schema for a node when the selectedModel is not set\n * but a model type is already selected.\n *\n * This handles the case where a node has a default model but hasn't loaded\n * the full schema yet.\n *\n * Uses the WorkflowUIProvider's modelSchema service to fetch the schema.\n * Falls back to no-op if the service is not configured.\n */\nexport function useAutoLoadModelSchema<TModel extends string>({\n currentModel,\n selectedModel,\n modelIdMap,\n onModelSelect,\n}: UseAutoLoadModelSchemaOptions<TModel>): void {\n const { modelSchema } = useWorkflowUIConfig();\n // Track if we've already attempted to load the default model schema\n const hasAttemptedSchemaLoad = useRef(false);\n\n useEffect(() => {\n // Only run once per node, and only if we have a model but no selectedModel\n if (\n hasAttemptedSchemaLoad.current ||\n selectedModel ||\n !currentModel ||\n !modelSchema\n ) {\n return;\n }\n\n const modelId = modelIdMap[currentModel];\n if (!modelId) return;\n\n const controller = new AbortController();\n let isCancelled = false;\n\n const loadSchema = async () => {\n try {\n const model = await modelSchema.fetchModelSchema(\n modelId,\n controller.signal,\n );\n\n if (model && !isCancelled) {\n hasAttemptedSchemaLoad.current = true;\n onModelSelect(model);\n }\n } catch {\n // Ignore abort errors and other failures - allows retry on next effect run\n }\n };\n\n loadSchema();\n\n return () => {\n isCancelled = true;\n controller.abort();\n };\n }, [currentModel, selectedModel, modelIdMap, onModelSelect, modelSchema]);\n}\n","import type { NodeType } from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport { useMemo } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\ninterface RequiredInputsResult {\n /** Whether all required inputs have connections */\n hasRequiredInputs: boolean;\n /** List of missing required input handle IDs */\n missingInputs: string[];\n /** Map of handle ID to whether it's connected */\n connectionStatus: Map<string, boolean>;\n}\n\n/**\n * Hook that checks if all required inputs for a node are connected.\n * Uses edge connections, not actual data values.\n *\n * @param nodeId - The node ID to check\n * @param nodeType - The node type (to look up required inputs from NODE_DEFINITIONS)\n * @returns Object with hasRequiredInputs boolean and details about missing inputs\n */\nexport function useRequiredInputs(\n nodeId: string,\n nodeType: NodeType,\n): RequiredInputsResult {\n const edges = useWorkflowStore((state) => state.edges);\n\n return useMemo(() => {\n const nodeDef = NODE_DEFINITIONS[nodeType];\n if (!nodeDef) {\n return {\n connectionStatus: new Map(),\n hasRequiredInputs: true,\n missingInputs: [],\n };\n }\n\n // Get edges that target this node\n const incomingEdges = edges.filter((e) => e.target === nodeId);\n const connectedHandles = new Set(\n incomingEdges.map((e) => e.targetHandle).filter(Boolean),\n );\n\n // Check each input handle\n const connectionStatus = new Map<string, boolean>();\n const missingInputs: string[] = [];\n\n for (const input of nodeDef.inputs) {\n const isConnected = connectedHandles.has(input.id);\n connectionStatus.set(input.id, isConnected);\n\n if (input.required && !isConnected) {\n missingInputs.push(input.id);\n }\n }\n\n return {\n connectionStatus,\n hasRequiredInputs: missingInputs.length === 0,\n missingInputs,\n };\n }, [nodeId, nodeType, edges]);\n}\n","import type { NodeType, WorkflowEdge, WorkflowNode } from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport { useCallback, useMemo } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport {\n CONNECTION_FIELDS,\n validateRequiredSchemaFields,\n} from '../lib/schemaValidation';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport { useRequiredInputs } from './useRequiredInputs';\n\ninterface MissingItem {\n type: 'connection' | 'data' | 'schema';\n field: string;\n message: string;\n}\n\ninterface CanGenerateResult {\n /** Whether all validation passes and generation can proceed */\n canGenerate: boolean;\n /** List of missing items with details */\n missingItems: MissingItem[];\n /** Whether all required connections exist */\n hasRequiredConnections: boolean;\n /** Whether all connected nodes have actual data */\n hasConnectedData: boolean;\n /** Whether all required schema fields are filled */\n hasRequiredSchemaFields: boolean;\n}\n\ninterface UseCanGenerateOptions {\n /** The node ID to validate */\n nodeId: string;\n /** The node type (to look up required inputs from NODE_DEFINITIONS) */\n nodeType: NodeType;\n /** The model's input schema with required array */\n inputSchema?: Record<string, unknown>;\n /** Current schema parameter values */\n schemaParams?: Record<string, unknown>;\n}\n\n/**\n * Extract output value from a node based on handle type.\n */\nfunction extractOutputValue(\n node: WorkflowNode,\n handleType: string | null | undefined,\n): string | undefined {\n const data = node.data as Record<string, unknown>;\n if (handleType === 'text') {\n return (data.outputText ?? data.prompt) as string | undefined;\n } else if (handleType === 'image') {\n return (data.outputImage ?? data.image) as string | undefined;\n } else if (handleType === 'video') {\n return (data.outputVideo ?? data.video) as string | undefined;\n } else if (handleType === 'audio') {\n return (data.outputAudio ?? data.audio) as string | undefined;\n }\n return undefined;\n}\n\n/**\n * Hook that performs comprehensive validation for the Generate button.\n *\n * Validates:\n * 1. Required connections exist (from NODE_DEFINITIONS)\n * 2. Connected nodes have actual data values (not just edges)\n * 3. Required schema fields from model inputSchema are filled\n *\n * @returns Object with canGenerate boolean and detailed breakdown\n */\nexport function useCanGenerate({\n nodeId,\n nodeType,\n inputSchema,\n schemaParams,\n}: UseCanGenerateOptions): CanGenerateResult {\n const { hasRequiredInputs, missingInputs } = useRequiredInputs(\n nodeId,\n nodeType,\n );\n const getConnectedInputs = useWorkflowStore(\n (state) => state.getConnectedInputs,\n );\n\n // Optimized selector: only get edges targeting this node\n // Uses useShallow to prevent re-renders when unrelated edges change\n const incomingEdgesSelector = useCallback(\n (state: { edges: WorkflowEdge[] }) =>\n state.edges.filter((e) => e.target === nodeId),\n [nodeId],\n );\n const incomingEdges = useWorkflowStore(useShallow(incomingEdgesSelector));\n\n // Optimized selector: only get source nodes connected to this node\n // Returns a stable object with just the output data we need\n const connectedOutputsSelector = useCallback(\n (state: { nodes: WorkflowNode[] }) => {\n const outputs: Record<string, string | undefined> = {};\n for (const edge of incomingEdges) {\n const sourceNode = state.nodes.find((n) => n.id === edge.source);\n if (sourceNode) {\n outputs[edge.source] = extractOutputValue(\n sourceNode,\n edge.sourceHandle,\n );\n }\n }\n return outputs;\n },\n [incomingEdges],\n );\n useWorkflowStore(useShallow(connectedOutputsSelector));\n\n return useMemo(() => {\n const missingItems: MissingItem[] = [];\n\n // 1. Check required connections exist\n for (const inputId of missingInputs) {\n missingItems.push({\n field: inputId,\n message: `Missing connection: ${inputId}`,\n type: 'connection',\n });\n }\n\n // 2. Check connected nodes targeting required handles have actual data\n const connectedInputs = getConnectedInputs(nodeId);\n const nodeDef = NODE_DEFINITIONS[nodeType];\n const requiredHandleIds = new Set(\n nodeDef?.inputs.filter((h) => h.required).map((h) => h.id) ?? [],\n );\n let hasRequiredData = true;\n let hasConnectedData = true;\n\n if (hasRequiredInputs) {\n for (const edge of incomingEdges) {\n const handleId = edge.targetHandle;\n if (!handleId) continue;\n\n if (!connectedInputs.has(handleId)) {\n hasConnectedData = false;\n if (requiredHandleIds.has(handleId)) {\n hasRequiredData = false;\n }\n }\n }\n }\n\n // 3. Validate required schema fields\n const schemaValidation = validateRequiredSchemaFields(\n inputSchema,\n schemaParams ?? {},\n CONNECTION_FIELDS,\n );\n\n for (const field of schemaValidation.missingFields) {\n missingItems.push({\n field,\n message: `Required field: ${field}`,\n type: 'schema',\n });\n }\n\n const canGenerate =\n hasRequiredInputs && hasRequiredData && schemaValidation.isValid;\n\n return {\n canGenerate,\n hasConnectedData,\n hasRequiredConnections: hasRequiredInputs,\n hasRequiredSchemaFields: schemaValidation.isValid,\n missingItems,\n };\n }, [\n nodeId,\n nodeType,\n hasRequiredInputs,\n missingInputs,\n inputSchema,\n schemaParams,\n getConnectedInputs,\n incomingEdges,\n ]);\n}\n","import type { ProviderModel, WorkflowNodeData } from '@genfeedai/types';\nimport { useCallback } from 'react';\nimport { getSchemaDefaults } from '../lib/schemaUtils';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\ntype ModelMap = Record<string, string>;\n\ninterface SelectedModelData {\n provider: string;\n modelId: string;\n displayName: string;\n inputSchema: Record<string, unknown> | undefined;\n componentSchemas: Record<string, unknown> | undefined;\n}\n\ninterface UseModelSelectionOptions<TModel extends string> {\n /** Node ID to update */\n nodeId: string;\n /** Map of provider model IDs to internal model types */\n modelMap: ModelMap;\n /** Fallback internal model if not found in map */\n fallbackModel: TModel;\n}\n\n/**\n * Hook for handling model selection in AI generator nodes.\n * Consolidates the common pattern from ImageGenNode and VideoGenNode.\n *\n * @returns handleModelSelect callback to pass to ModelBrowserModal\n */\nexport function useModelSelection<\n TModel extends string,\n TNodeData extends WorkflowNodeData & { model?: TModel },\n>({ nodeId, modelMap, fallbackModel }: UseModelSelectionOptions<TModel>) {\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n\n const handleModelSelect = useCallback(\n (model: ProviderModel) => {\n const internalModel = (modelMap[model.id] ?? fallbackModel) as TModel;\n\n // Extract defaults from the new model's schema\n const schemaDefaults = getSchemaDefaults(model.inputSchema);\n\n const selectedModel: SelectedModelData = {\n componentSchemas: model.componentSchemas,\n displayName: model.displayName,\n inputSchema: model.inputSchema,\n modelId: model.id,\n provider: model.provider,\n };\n\n updateNodeData<TNodeData>(nodeId, {\n model: internalModel,\n provider: model.provider,\n schemaParams: schemaDefaults,\n selectedModel,\n } as Partial<TNodeData>);\n },\n [nodeId, modelMap, fallbackModel, updateNodeData],\n );\n\n return { handleModelSelect };\n}\n","import { NodeStatusEnum } from '@genfeedai/types';\nimport { useCallback } from 'react';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\n/**\n * Hook for triggering and stopping node execution\n *\n * Encapsulates the common pattern of:\n * 1. Setting node status to processing\n * 2. Triggering execution\n * 3. Stopping execution and resetting status\n *\n * @param nodeId - The ID of the node to execute\n * @returns handleGenerate - Callback to trigger node execution\n * @returns handleStop - Callback to stop node execution\n */\nexport function useNodeExecution(nodeId: string) {\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const stopNodeExecution = useExecutionStore(\n (state) => state.stopNodeExecution,\n );\n\n const handleGenerate = useCallback(() => {\n updateNodeData(nodeId, { status: NodeStatusEnum.PROCESSING });\n executeNode(nodeId);\n }, [nodeId, executeNode, updateNodeData]);\n\n const handleStop = useCallback(() => {\n stopNodeExecution(nodeId);\n }, [nodeId, stopNodeExecution]);\n\n return { handleGenerate, handleStop };\n}\n","import type { WorkflowNodeData } from '@genfeedai/types';\nimport { useCallback, useRef, useState } from 'react';\nimport { getImageDimensions, getVideoMetadata } from '../lib/media';\nimport { useWorkflowUIConfig } from '../provider/WorkflowUIProvider';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\ninterface UseMediaUploadOptions<T extends WorkflowNodeData> {\n nodeId: string;\n mediaType: 'image' | 'video';\n initialUrl?: string;\n getMetadata: (src: string) => Promise<Record<string, unknown>>;\n buildUploadUpdate: (\n url: string,\n filename: string,\n metadata: Record<string, unknown>,\n ) => Partial<T>;\n buildUrlUpdate: (\n url: string,\n metadata: Record<string, unknown> | null,\n ) => Partial<T>;\n buildRemoveUpdate: () => Partial<T>;\n}\n\n/**\n * Read a file as base64 data URL and apply metadata + update.\n */\nfunction readFileAsBase64<T extends WorkflowNodeData>(\n file: File,\n nodeId: string,\n getMetadata: (src: string) => Promise<Record<string, unknown>>,\n buildUploadUpdate: (\n url: string,\n filename: string,\n metadata: Record<string, unknown>,\n ) => Partial<T>,\n updateNodeData: <U extends WorkflowNodeData>(\n id: string,\n data: Partial<U>,\n ) => void,\n onComplete?: () => void,\n): void {\n const reader = new FileReader();\n reader.onload = async (event) => {\n const dataUrl = event.target?.result as string;\n const metadata = await getMetadata(dataUrl);\n updateNodeData<T>(nodeId, buildUploadUpdate(dataUrl, file.name, metadata));\n onComplete?.();\n };\n reader.readAsDataURL(file);\n}\n\nexport function useMediaUpload<T extends WorkflowNodeData>({\n nodeId,\n mediaType,\n initialUrl = '',\n getMetadata,\n buildUploadUpdate,\n buildUrlUpdate,\n buildRemoveUpdate,\n}: UseMediaUploadOptions<T>) {\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const workflowId = useWorkflowStore((state) => state.workflowId);\n const { fileUpload } = useWorkflowUIConfig();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [showUrlInput, setShowUrlInput] = useState(false);\n const [urlValue, setUrlValue] = useState(initialUrl);\n const [isUploading, setIsUploading] = useState(false);\n\n // Refs for builder functions to keep callbacks stable\n const getMetadataRef = useRef(getMetadata);\n getMetadataRef.current = getMetadata;\n const buildUploadUpdateRef = useRef(buildUploadUpdate);\n buildUploadUpdateRef.current = buildUploadUpdate;\n const buildUrlUpdateRef = useRef(buildUrlUpdate);\n buildUrlUpdateRef.current = buildUrlUpdate;\n const buildRemoveUpdateRef = useRef(buildRemoveUpdate);\n buildRemoveUpdateRef.current = buildRemoveUpdate;\n\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (workflowId && fileUpload) {\n setIsUploading(true);\n try {\n const result = await fileUpload.uploadFile(\n `/files/workflows/${workflowId}/input/${mediaType}`,\n file,\n );\n\n const metadata = await getMetadataRef.current(result.url);\n updateNodeData<T>(\n nodeId,\n buildUploadUpdateRef.current(result.url, result.filename, metadata),\n );\n } catch (_error) {\n // Fallback to Base64 if upload fails\n readFileAsBase64<T>(\n file,\n nodeId,\n getMetadataRef.current,\n buildUploadUpdateRef.current,\n updateNodeData,\n );\n } finally {\n setIsUploading(false);\n }\n } else {\n // Workflow not saved yet or no upload service - use Base64\n readFileAsBase64<T>(\n file,\n nodeId,\n getMetadataRef.current,\n buildUploadUpdateRef.current,\n updateNodeData,\n );\n }\n },\n [nodeId, updateNodeData, workflowId, mediaType, fileUpload],\n );\n\n const handleRemove = useCallback(() => {\n updateNodeData<T>(nodeId, buildRemoveUpdateRef.current());\n setUrlValue('');\n }, [nodeId, updateNodeData]);\n\n const handleUrlSubmit = useCallback(async () => {\n if (!urlValue.trim()) return;\n\n try {\n let metadata: Record<string, unknown>;\n if (mediaType === 'image') {\n metadata = await getImageDimensions(urlValue);\n } else {\n const meta = await getVideoMetadata(urlValue);\n metadata = {\n duration: meta.duration,\n height: meta.dimensions.height,\n width: meta.dimensions.width,\n };\n }\n updateNodeData<T>(nodeId, buildUrlUpdateRef.current(urlValue, metadata));\n } catch (_error) {\n updateNodeData<T>(nodeId, buildUrlUpdateRef.current(urlValue, null));\n }\n setShowUrlInput(false);\n }, [nodeId, updateNodeData, urlValue, mediaType]);\n\n const handleUrlKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleUrlSubmit();\n } else if (e.key === 'Escape') {\n setShowUrlInput(false);\n setUrlValue(initialUrl);\n }\n },\n [handleUrlSubmit, initialUrl],\n );\n\n return {\n fileInputRef,\n handleFileSelect,\n handleRemove,\n handleUrlKeyDown,\n handleUrlSubmit,\n isUploading,\n setShowUrlInput,\n setUrlValue,\n showUrlInput,\n urlValue,\n };\n}\n","import type { AvailableVariable } from '@genfeedai/types';\nimport type { RefObject } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\n\ninterface UsePromptAutocompleteOptions {\n availableVariables: AvailableVariable[];\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n localTemplate: string;\n setLocalTemplate: (value: string) => void;\n onTemplateCommit?: (newTemplate: string) => void;\n}\n\ninterface UsePromptAutocompleteReturn {\n showAutocomplete: boolean;\n autocompletePosition: { top: number; left: number };\n filteredAutocompleteVars: AvailableVariable[];\n selectedAutocompleteIndex: number;\n handleChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleAutocompleteSelect: (varName: string) => void;\n closeAutocomplete: () => void;\n}\n\nexport function usePromptAutocomplete({\n availableVariables,\n textareaRef,\n localTemplate,\n setLocalTemplate,\n onTemplateCommit,\n}: UsePromptAutocompleteOptions): UsePromptAutocompleteReturn {\n const [showAutocomplete, setShowAutocomplete] = useState(false);\n const [autocompletePosition, setAutocompletePosition] = useState({\n left: 0,\n top: 0,\n });\n const [autocompleteFilter, setAutocompleteFilter] = useState('');\n const [selectedAutocompleteIndex, setSelectedAutocompleteIndex] = useState(0);\n\n const filteredAutocompleteVars = useMemo(() => {\n return availableVariables.filter((v) =>\n v.name.toLowerCase().includes(autocompleteFilter.toLowerCase()),\n );\n }, [availableVariables, autocompleteFilter]);\n\n const handleAutocompleteSelect = useCallback(\n (varName: string) => {\n if (!textareaRef.current) return;\n\n const cursorPos = textareaRef.current.selectionStart;\n const textBeforeCursor = localTemplate.slice(0, cursorPos);\n const textAfterCursor = localTemplate.slice(cursorPos);\n\n const match = textBeforeCursor.match(/@(\\w*)$/);\n if (!match) return;\n\n const atPosition = cursorPos - match[0].length;\n const newTemplate = `${localTemplate.slice(0, atPosition)}@${varName}${textAfterCursor}`;\n\n setLocalTemplate(newTemplate);\n onTemplateCommit?.(newTemplate);\n setShowAutocomplete(false);\n\n const newCursorPos = atPosition + varName.length + 1;\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.focus();\n textareaRef.current.setSelectionRange(newCursorPos, newCursorPos);\n }\n }, 0);\n },\n [localTemplate, textareaRef, setLocalTemplate, onTemplateCommit],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setLocalTemplate(newValue);\n\n const cursorPos = e.target.selectionStart;\n const textBeforeCursor = newValue.slice(0, cursorPos);\n const match = textBeforeCursor.match(/@(\\w*)$/);\n\n if (match && textareaRef.current) {\n setAutocompleteFilter(match[1] || '');\n setSelectedAutocompleteIndex(0);\n\n const lineHeight = 20;\n const lines = textBeforeCursor.split('\\n');\n const currentLine = lines.length - 1;\n const top = currentLine * lineHeight + 30;\n const left = 10;\n\n setAutocompletePosition({ left, top });\n setShowAutocomplete(true);\n } else {\n setShowAutocomplete(false);\n }\n },\n [textareaRef, setLocalTemplate],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!showAutocomplete) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedAutocompleteIndex(\n (prev) => (prev + 1) % filteredAutocompleteVars.length,\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedAutocompleteIndex(\n (prev) =>\n (prev - 1 + filteredAutocompleteVars.length) %\n filteredAutocompleteVars.length,\n );\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n if (filteredAutocompleteVars.length > 0) {\n e.preventDefault();\n handleAutocompleteSelect(\n filteredAutocompleteVars[selectedAutocompleteIndex].name,\n );\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n setShowAutocomplete(false);\n }\n },\n [\n showAutocomplete,\n filteredAutocompleteVars,\n selectedAutocompleteIndex,\n handleAutocompleteSelect,\n ],\n );\n\n const closeAutocomplete = useCallback(() => {\n setShowAutocomplete(false);\n }, []);\n\n return {\n autocompletePosition,\n closeAutocomplete,\n filteredAutocompleteVars,\n handleAutocompleteSelect,\n handleChange,\n handleKeyDown,\n selectedAutocompleteIndex,\n showAutocomplete,\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-SRPSHHHV.mjs.map
3
+ //# sourceMappingURL=chunk-SRPSHHHV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-SRPSHHHV.mjs"}
@@ -1,4 +1,4 @@
1
- import { useWorkflowStore } from './chunk-GPYIIWD5.mjs';
1
+ import { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
2
2
  import { useMemo, useCallback } from 'react';
3
3
 
4
4
  function useCommentNavigation(nodeId) {
@@ -56,3 +56,5 @@ function useCommentNavigation(nodeId) {
56
56
  }
57
57
 
58
58
  export { useCommentNavigation };
59
+ //# sourceMappingURL=chunk-TOFB4BTA.mjs.map
60
+ //# sourceMappingURL=chunk-TOFB4BTA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useCommentNavigation.ts"],"names":[],"mappings":";;;AAcO,SAAS,qBAAqB,MAAA,EAA0C;AAC7E,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AACrD,EAAA,MAAM,oBAAA,GAAuB,gBAAA;AAAA,IAC3B,CAAC,UAAU,KAAA,CAAM;AAAA,GACnB;AACA,EAAA,MAAM,iBAAA,GAAoB,gBAAA;AAAA,IACxB,CAAC,UAAU,KAAA,CAAM;AAAA,GACnB;AACA,EAAA,MAAM,mBAAA,GAAsB,gBAAA;AAAA,IAC1B,CAAC,UAAU,KAAA,CAAM;AAAA,GACnB;AAEA,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC9C,IAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,IAAA,OAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK,IAAK,IAAA;AAAA,EAClC,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAM;AACtC,IAAA,OAAO,oBAAA,EAAqB;AAAA,EAC9B,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAEzB,EAAA,MAAM,YAAA,GAAe,QAAQ,MAAM;AACjC,IAAA,OAAO,kBAAkB,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAE9B,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,WAAA,KAAwB;AACvB,MAAA,MAAM,UAAA,GAAa,kBAAkB,WAAW,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,iBAAA,CAAkB,WAAW,EAAE,CAAA;AAC/B,QAAA,mBAAA,CAAoB,WAAW,EAAE,CAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,mBAAmB;AAAA,GAC5D;AAEA,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AACpC,IAAA,MAAM,WACJ,YAAA,IAAgB,CAAA,GAAI,iBAAA,CAAkB,MAAA,GAAS,IAAI,YAAA,GAAe,CAAA;AACpE,IAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,EACrB,GAAG,CAAC,YAAA,EAAc,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEvD,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AACpC,IAAA,MAAM,QAAA,GAAA,CAAY,YAAA,GAAe,CAAA,IAAK,iBAAA,CAAkB,MAAA;AACxD,IAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,EACrB,GAAG,CAAC,YAAA,EAAc,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEvD,EAAA,IAAI,CAAC,WAAA,IAAe,YAAA,KAAiB,EAAA,EAAI;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,cAAc,YAAA,GAAe,CAAA;AAAA;AAAA,IAC7B,MAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAY,iBAAA,CAAkB;AAAA,GAChC;AACF","file":"chunk-TOFB4BTA.mjs","sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nexport interface CommentNavigation {\n currentIndex: number;\n totalCount: number;\n onPrevious: () => void;\n onNext: () => void;\n}\n\n/**\n * Hook that provides navigation props for nodes with comments.\n * Returns null if the node has no comment.\n */\nexport function useCommentNavigation(nodeId: string): CommentNavigation | null {\n const nodes = useWorkflowStore((state) => state.nodes);\n const getNodesWithComments = useWorkflowStore(\n (state) => state.getNodesWithComments,\n );\n const markCommentViewed = useWorkflowStore(\n (state) => state.markCommentViewed,\n );\n const setNavigationTarget = useWorkflowStore(\n (state) => state.setNavigationTarget,\n );\n\n const nodeComment = useMemo(() => {\n const node = nodes.find((n) => n.id === nodeId);\n const data = node?.data as { comment?: string } | undefined;\n return data?.comment?.trim() || null;\n }, [nodes, nodeId]);\n\n const nodesWithComments = useMemo(() => {\n return getNodesWithComments();\n }, [getNodesWithComments]);\n\n const currentIndex = useMemo(() => {\n return nodesWithComments.findIndex((n) => n.id === nodeId);\n }, [nodesWithComments, nodeId]);\n\n const navigateTo = useCallback(\n (targetIndex: number) => {\n const targetNode = nodesWithComments[targetIndex];\n if (targetNode) {\n markCommentViewed(targetNode.id);\n setNavigationTarget(targetNode.id);\n }\n },\n [nodesWithComments, markCommentViewed, setNavigationTarget],\n );\n\n const onPrevious = useCallback(() => {\n if (nodesWithComments.length === 0) return;\n const newIndex =\n currentIndex <= 0 ? nodesWithComments.length - 1 : currentIndex - 1;\n navigateTo(newIndex);\n }, [currentIndex, nodesWithComments.length, navigateTo]);\n\n const onNext = useCallback(() => {\n if (nodesWithComments.length === 0) return;\n const newIndex = (currentIndex + 1) % nodesWithComments.length;\n navigateTo(newIndex);\n }, [currentIndex, nodesWithComments.length, navigateTo]);\n\n if (!nodeComment || currentIndex === -1) {\n return null;\n }\n\n return {\n currentIndex: currentIndex + 1, // 1-based for display\n onNext,\n onPrevious,\n totalCount: nodesWithComments.length,\n };\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { useWorkflowUIConfig } from './chunk-YUIK4AHM.mjs';
2
- import { selectNodes, selectEdges, selectRemoveNode, selectDuplicateNode, selectAddNode, useContextMenuStore, selectToggleNodeLock, selectCreateGroup, selectWorkflowId, selectSetSelectedNodeIds, selectUpdateNodeData } from './chunk-7LV4UAUS.mjs';
3
- import { useSettingsStore } from './chunk-OJWVEEMM.mjs';
4
- import { useWorkflowStore } from './chunk-GPYIIWD5.mjs';
1
+ import { useWorkflowUIConfig } from './chunk-JSF4FHBH.mjs';
2
+ import { selectNodes, selectEdges, selectRemoveNode, selectDuplicateNode, selectAddNode, useContextMenuStore, selectToggleNodeLock, selectCreateGroup, selectWorkflowId, selectSetSelectedNodeIds, selectUpdateNodeData } from './chunk-IKR6GVZ4.mjs';
3
+ import { useSettingsStore } from './chunk-R5L7WB7F.mjs';
4
+ import { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
5
5
  import { useEffect, useState, useCallback, useRef, useMemo } from 'react';
6
6
  import { nanoid } from 'nanoid';
7
7
  import { useReactFlow } from '@xyflow/react';
@@ -1338,3 +1338,5 @@ function useContextMenu() {
1338
1338
  }
1339
1339
 
1340
1340
  export { ContextMenu, useCanvasKeyboardShortcuts, useContextMenu, useNodeActions, usePaneActions };
1341
+ //# sourceMappingURL=chunk-VKXTPLM7.mjs.map
1342
+ //# sourceMappingURL=chunk-VKXTPLM7.mjs.map