@genfeedai/workflow-ui 0.2.5 → 0.2.7

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 (66) 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-55JFUNLR.mjs} +253 -237
  12. package/dist/chunk-55JFUNLR.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-OJWVEEMM.mjs → chunk-R5L7WB7F.mjs} +4 -2
  26. package/dist/chunk-R5L7WB7F.mjs.map +1 -0
  27. package/dist/{chunk-53XDE62A.mjs → chunk-RY6OZJ7A.mjs} +8 -6
  28. package/dist/chunk-RY6OZJ7A.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.mjs +27 -25
  46. package/dist/index.mjs.map +1 -0
  47. package/dist/lib.mjs +6 -4
  48. package/dist/lib.mjs.map +1 -0
  49. package/dist/nodes.mjs +15 -13
  50. package/dist/nodes.mjs.map +1 -0
  51. package/dist/panels.mjs +5 -3
  52. package/dist/panels.mjs.map +1 -0
  53. package/dist/provider.mjs +5 -3
  54. package/dist/provider.mjs.map +1 -0
  55. package/dist/stores.mjs +8 -6
  56. package/dist/stores.mjs.map +1 -0
  57. package/dist/toolbar.mjs +7 -5
  58. package/dist/toolbar.mjs.map +1 -0
  59. package/dist/ui.mjs +4 -2
  60. package/dist/ui.mjs.map +1 -0
  61. package/dist/workflowStore-XYPHB6DS.mjs +4 -0
  62. package/dist/workflowStore-XYPHB6DS.mjs.map +1 -0
  63. package/package.json +24 -24
  64. package/dist/chunk-LDN7IX4Y.mjs +0 -1
  65. package/dist/chunk-MLJJBBTB.mjs +0 -1
  66. package/dist/workflowStore-N2F7WIG3.mjs +0 -2
package/dist/canvas.mjs CHANGED
@@ -1,17 +1,19 @@
1
- export { ConnectionDropMenu, EdgeToolbar, EditableEdge, GroupOverlay, HelperLines, NodeSearch, PauseEdge, ReferenceEdge, ShortcutHelpModal, WorkflowCanvas } from './chunk-53XDE62A.mjs';
2
- import './chunk-ORVDYXDP.mjs';
3
- import './chunk-MGLAKMDP.mjs';
4
- import './chunk-2FUPL67V.mjs';
5
- import './chunk-C6MQBJFC.mjs';
6
- import './chunk-FWJIAW2E.mjs';
7
- import './chunk-B4EAAKYF.mjs';
8
- import './chunk-U4QPE4CY.mjs';
9
- import './chunk-VVQ4CH77.mjs';
10
- import './chunk-MLJJBBTB.mjs';
11
- import './chunk-YUIK4AHM.mjs';
12
- import './chunk-7LV4UAUS.mjs';
13
- import './chunk-QQVHGJ2G.mjs';
14
- import './chunk-LDN7IX4Y.mjs';
15
- import './chunk-OJWVEEMM.mjs';
16
- import './chunk-GPYIIWD5.mjs';
17
- import './chunk-XRC3O5GK.mjs';
1
+ export { ConnectionDropMenu, EdgeToolbar, EditableEdge, GroupOverlay, HelperLines, NodeSearch, PauseEdge, ReferenceEdge, ShortcutHelpModal, WorkflowCanvas } from './chunk-RY6OZJ7A.mjs';
2
+ import './chunk-VKXTPLM7.mjs';
3
+ import './chunk-2BHILUF7.mjs';
4
+ import './chunk-55JFUNLR.mjs';
5
+ import './chunk-G3HCTMAZ.mjs';
6
+ import './chunk-SHU7JPQY.mjs';
7
+ import './chunk-SBB2YW3Y.mjs';
8
+ import './chunk-2C2AAXJP.mjs';
9
+ import './chunk-X3XNTD4R.mjs';
10
+ import './chunk-SRPSHHHV.mjs';
11
+ import './chunk-JSF4FHBH.mjs';
12
+ import './chunk-IKR6GVZ4.mjs';
13
+ import './chunk-AZJFDWBF.mjs';
14
+ import './chunk-YYFM6P4C.mjs';
15
+ import './chunk-R5L7WB7F.mjs';
16
+ import './chunk-7DJHFOIW.mjs';
17
+ import './chunk-4JOFNZW6.mjs';
18
+ //# sourceMappingURL=canvas.mjs.map
19
+ //# sourceMappingURL=canvas.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"canvas.mjs"}
@@ -146,3 +146,5 @@ function formatCost(amount) {
146
146
  }
147
147
 
148
148
  export { calculateWorkflowCost, formatCost };
149
+ //# sourceMappingURL=chunk-2BHILUF7.mjs.map
150
+ //# sourceMappingURL=chunk-2BHILUF7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/costCalculator.ts"],"names":[],"mappings":"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","file":"chunk-2BHILUF7.mjs","sourcesContent":["import {\n DEFAULT_VIDEO_DURATION,\n IMAGE_NODE_TYPES,\n LUMA_NODE_TYPES,\n PRICING,\n TOPAZ_NODE_TYPES,\n VIDEO_NODE_TYPES,\n} from '@genfeedai/core';\nimport type {\n CostBreakdown,\n NodeCostEstimate,\n WorkflowNode,\n} from '@genfeedai/types';\n\nexport type { CostBreakdown, NodeCostEstimate };\n\ntype TopazImageUpscaleTier = (typeof PRICING)['topaz-image-upscale'][number];\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction isNodeType(type: string, list: readonly string[]): boolean {\n return list.includes(type);\n}\n\nfunction getDataField<T>(\n data: Record<string, unknown>,\n key: string,\n fallback: T,\n): T {\n return (data[key] as T) ?? fallback;\n}\n\n// =============================================================================\n// COST CALCULATOR\n// =============================================================================\n\nexport function calculateWorkflowCost(nodes: WorkflowNode[]): CostBreakdown {\n const estimates: NodeCostEstimate[] = [];\n\n for (const node of nodes) {\n const data = node.data as Record<string, unknown>;\n const type = node.type ?? '';\n const label = getDataField(data, 'label', type);\n\n // Image generation\n if (isNodeType(type, IMAGE_NODE_TYPES)) {\n const model = getDataField(data, 'model', 'nano-banana');\n const resolution = getDataField(data, 'resolution', '2K');\n let cost = 0;\n\n const priceEntry = PRICING[model as keyof typeof PRICING];\n if (typeof priceEntry === 'number') {\n cost = priceEntry;\n } else if (\n priceEntry &&\n typeof priceEntry === 'object' &&\n !Array.isArray(priceEntry)\n ) {\n cost =\n (priceEntry as Record<string, number>)[resolution] ??\n Object.values(priceEntry as Record<string, number>)[0] ??\n 0;\n }\n\n estimates.push({\n model,\n nodeId: node.id,\n nodeLabel: label,\n nodeType: type,\n quantity: 1,\n subtotal: cost,\n unit: 'per image',\n unitPrice: cost,\n });\n continue;\n }\n\n // Video generation\n if (isNodeType(type, VIDEO_NODE_TYPES)) {\n const model = getDataField(data, 'model', 'veo-3.1-fast');\n const duration = getDataField(data, 'duration', DEFAULT_VIDEO_DURATION);\n const generateAudio = getDataField(data, 'generateAudio', true);\n\n const priceEntry = PRICING[model as keyof typeof PRICING];\n let perSecond = 0;\n\n if (\n priceEntry &&\n typeof priceEntry === 'object' &&\n !Array.isArray(priceEntry)\n ) {\n const entry = priceEntry as {\n withAudio?: number;\n withoutAudio?: number;\n };\n perSecond = generateAudio\n ? (entry.withAudio ?? 0)\n : (entry.withoutAudio ?? 0);\n }\n\n const subtotal = perSecond * duration;\n estimates.push({\n duration,\n model,\n nodeId: node.id,\n nodeLabel: label,\n nodeType: type,\n quantity: duration,\n subtotal,\n unit: `${duration}s video`,\n unitPrice: perSecond,\n withAudio: generateAudio,\n });\n continue;\n }\n\n // Luma reframe\n if (isNodeType(type, LUMA_NODE_TYPES)) {\n const model = getDataField(data, 'model', 'photon-flash-1');\n const inputType = getDataField<string>(data, 'inputType', 'image');\n\n let subtotal = 0;\n if (inputType === 'video') {\n subtotal =\n (PRICING['luma-reframe-video'] as number) * DEFAULT_VIDEO_DURATION;\n } else {\n const imageEntry = PRICING['luma-reframe-image'];\n subtotal = (imageEntry as Record<string, number>)[model] ?? 0.01;\n }\n\n estimates.push({\n model,\n nodeId: node.id,\n nodeLabel: label,\n nodeType: type,\n quantity: 1,\n subtotal,\n unit: inputType === 'video' ? 'per video' : 'per image',\n unitPrice: subtotal,\n });\n continue;\n }\n\n // Topaz upscale\n if (isNodeType(type, TOPAZ_NODE_TYPES)) {\n const inputType = getDataField<string>(data, 'inputType', 'image');\n\n if (inputType === 'video') {\n const resolution = getDataField(data, 'targetResolution', '1080p');\n const fps = getDataField(data, 'targetFps', 30);\n const key =\n `${resolution}-${fps}` as keyof (typeof PRICING)['topaz-video-upscale'];\n const pricePerChunk = PRICING['topaz-video-upscale'][key] ?? 0.101;\n const duration = DEFAULT_VIDEO_DURATION;\n const chunks = Math.ceil(duration / 5);\n\n estimates.push({\n duration,\n model: 'topaz-video',\n nodeId: node.id,\n nodeLabel: label,\n nodeType: type,\n quantity: chunks,\n subtotal: pricePerChunk * chunks,\n unit: `${duration}s video`,\n unitPrice: pricePerChunk,\n });\n } else {\n // Image upscale - default to ~1MP tier\n const tier =\n PRICING['topaz-image-upscale'].find(\n (t: TopazImageUpscaleTier) => 1 <= t.maxMP,\n ) ?? PRICING['topaz-image-upscale'][0];\n\n estimates.push({\n model: getDataField(data, 'model', 'topaz-standard-v2'),\n nodeId: node.id,\n nodeLabel: label,\n nodeType: type,\n quantity: 1,\n subtotal: tier.price,\n unit: 'per image',\n unitPrice: tier.price,\n });\n }\n continue;\n }\n\n // LLM\n if (type === 'llm') {\n const maxTokens = getDataField(data, 'maxTokens', 1024);\n // Rough estimate: input tokens ~= 2x maxTokens (system prompt + input)\n const estimatedTokens = maxTokens * 3;\n const subtotal = estimatedTokens * PRICING.llama;\n\n estimates.push({\n model: getDataField(data, 'model', 'llama'),\n nodeId: node.id,\n nodeLabel: label,\n nodeType: type,\n quantity: estimatedTokens,\n subtotal,\n unit: `~${estimatedTokens} tokens`,\n unitPrice: PRICING.llama,\n });\n }\n }\n\n return {\n items: estimates,\n total: estimates.reduce((sum, e) => sum + e.subtotal, 0),\n };\n}\n\nexport function formatCost(amount: number): string {\n if (amount === 0) return '$0.00';\n if (amount < 0.01) return `$${amount.toFixed(4)}`;\n return `$${amount.toFixed(2)}`;\n}\n"]}
@@ -676,3 +676,5 @@ function getEasingDisplayName(preset) {
676
676
  }
677
677
 
678
678
  export { CubicBezierEditor, DEFAULT_CUSTOM_BEZIER, DEFAULT_IMAGE_MODEL, DEFAULT_LIPSYNC_MODEL, DEFAULT_LLM_MODEL, DEFAULT_VIDEO_MODEL, EASING_BEZIER_MAP, EASING_PRESETS, IMAGE_MODELS, IMAGE_MODEL_ID_MAP, IMAGE_MODEL_MAP, LIPSYNC_MODELS, LIPSYNC_SYNC_MODES, LLM_MODELS, LLM_MODEL_ID_MAP, LLM_MODEL_MAP, PRESET_BEZIERS, VIDEO_MODELS, VIDEO_MODEL_ID_MAP, VIDEO_MODEL_MAP, applySpeedCurve, createAsymmetricEase, createBezierEasing, easing, evaluateBezier, generateHandlesFromSchema, getAllEasingNames, getEasingBezier, getEasingDisplayName, getEasingFunction, getImageModelLabel, getLLMModelLabel, getLipSyncModelLabel, getMediaFromNode, getPresetBezier, getVideoModelLabel, isSchemaHandle, lipSyncModelSupportsImage };
679
+ //# sourceMappingURL=chunk-2C2AAXJP.mjs.map
680
+ //# sourceMappingURL=chunk-2C2AAXJP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/models/registry.ts","../src/lib/schemaHandles.ts","../src/lib/mediaExtraction.ts","../src/lib/CubicBezierEditor.tsx","../src/lib/easing.ts"],"names":[],"mappings":"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","file":"chunk-2C2AAXJP.mjs","sourcesContent":["import type {\n ImageModel,\n LipSyncModel,\n TextModel,\n VideoModel,\n} from '@genfeedai/types';\n\n// =============================================================================\n// IMAGE MODELS\n// =============================================================================\n\nexport interface ImageModelConfig {\n value: ImageModel;\n label: string;\n apiId: string;\n}\n\nexport const IMAGE_MODELS: ImageModelConfig[] = [\n { apiId: 'google/nano-banana', label: 'Nano Banana', value: 'nano-banana' },\n {\n apiId: 'google/nano-banana-pro',\n label: 'Nano Banana Pro',\n value: 'nano-banana-pro',\n },\n];\n\nexport const IMAGE_MODEL_MAP: Record<string, ImageModel> = Object.fromEntries(\n IMAGE_MODELS.map((m) => [m.apiId, m.value]),\n) as Record<string, ImageModel>;\n\nexport const IMAGE_MODEL_ID_MAP: Record<ImageModel, string> =\n Object.fromEntries(IMAGE_MODELS.map((m) => [m.value, m.apiId])) as Record<\n ImageModel,\n string\n >;\n\nexport const DEFAULT_IMAGE_MODEL: ImageModel = 'nano-banana-pro';\n\n// =============================================================================\n// VIDEO MODELS\n// =============================================================================\n\nexport interface VideoModelConfig {\n value: VideoModel;\n label: string;\n description: string;\n apiId: string;\n}\n\nexport const VIDEO_MODELS: VideoModelConfig[] = [\n {\n apiId: 'google/veo-3.1-fast',\n description: 'Fast',\n label: 'Veo 3.1 Fast',\n value: 'veo-3.1-fast',\n },\n {\n apiId: 'google/veo-3.1',\n description: 'High quality',\n label: 'Veo 3.1',\n value: 'veo-3.1',\n },\n];\n\nexport const VIDEO_MODEL_MAP: Record<string, VideoModel> = Object.fromEntries(\n VIDEO_MODELS.map((m) => [m.apiId, m.value]),\n) as Record<string, VideoModel>;\n\nexport const VIDEO_MODEL_ID_MAP: Record<VideoModel, string> =\n Object.fromEntries(VIDEO_MODELS.map((m) => [m.value, m.apiId])) as Record<\n VideoModel,\n string\n >;\n\nexport const DEFAULT_VIDEO_MODEL: VideoModel = 'veo-3.1-fast';\n\n// =============================================================================\n// LIP SYNC MODELS\n// =============================================================================\n\nexport interface LipSyncModelConfig {\n value: LipSyncModel;\n label: string;\n supportsImage: boolean;\n}\n\nexport const LIPSYNC_MODELS: LipSyncModelConfig[] = [\n {\n label: 'OmniHuman (Image)',\n supportsImage: true,\n value: 'bytedance/omni-human',\n },\n {\n label: 'VEED Fabric (Image)',\n supportsImage: true,\n value: 'veed/fabric-1.0',\n },\n {\n label: 'Sync Labs Pro (Video)',\n supportsImage: false,\n value: 'sync/lipsync-2-pro',\n },\n { label: 'Sync Labs (Video)', supportsImage: false, value: 'sync/lipsync-2' },\n { label: 'Pixverse', supportsImage: true, value: 'pixverse/lipsync' },\n];\n\nexport const LIPSYNC_SYNC_MODES = [\n { label: 'Loop', value: 'loop' as const },\n { label: 'Bounce', value: 'bounce' as const },\n { label: 'Cut Off', value: 'cut_off' as const },\n { label: 'Silence', value: 'silence' as const },\n { label: 'Remap', value: 'remap' as const },\n];\n\nexport const DEFAULT_LIPSYNC_MODEL: LipSyncModel = 'bytedance/omni-human';\n\n// =============================================================================\n// LLM (TEXT) MODELS\n// =============================================================================\n\nexport interface TextModelConfig {\n value: TextModel;\n label: string;\n apiId: string;\n}\n\nexport const LLM_MODELS: TextModelConfig[] = [\n {\n apiId: 'meta/meta-llama-3.1-405b-instruct',\n label: 'Llama 3.1 405B',\n value: 'meta-llama-3.1-405b-instruct',\n },\n {\n apiId: 'anthropic/claude-4.5-sonnet',\n label: 'Claude 4.5 Sonnet',\n value: 'claude-4.5-sonnet',\n },\n];\n\nexport const LLM_MODEL_MAP: Record<string, TextModel> = Object.fromEntries(\n LLM_MODELS.map((m) => [m.apiId, m.value]),\n) as Record<string, TextModel>;\n\nexport const LLM_MODEL_ID_MAP: Record<TextModel, string> = Object.fromEntries(\n LLM_MODELS.map((m) => [m.value, m.apiId]),\n) as Record<TextModel, string>;\n\nexport const DEFAULT_LLM_MODEL: TextModel = 'meta-llama-3.1-405b-instruct';\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\nexport function getImageModelLabel(model: ImageModel): string {\n return IMAGE_MODELS.find((m) => m.value === model)?.label ?? model;\n}\n\nexport function getVideoModelLabel(model: VideoModel): string {\n return VIDEO_MODELS.find((m) => m.value === model)?.label ?? model;\n}\n\nexport function getLipSyncModelLabel(model: LipSyncModel): string {\n return LIPSYNC_MODELS.find((m) => m.value === model)?.label ?? model;\n}\n\nexport function getLLMModelLabel(model: TextModel): string {\n return LLM_MODELS.find((m) => m.value === model)?.label ?? model;\n}\n\nexport function lipSyncModelSupportsImage(model: LipSyncModel): boolean {\n return LIPSYNC_MODELS.find((m) => m.value === model)?.supportsImage ?? false;\n}\n","import type { HandleDefinition, HandleType } from '@genfeedai/types';\n\n/**\n * Schema fields that should be exposed as connectable handles.\n * These are inputs that commonly accept connections from other nodes.\n */\nconst HANDLE_FIELDS = new Set([\n // Text inputs\n 'prompt',\n 'negative_prompt',\n 'subject_reference',\n // Image inputs (single)\n 'image',\n 'image_input',\n 'start_image',\n 'first_frame_image',\n 'end_image',\n 'last_frame',\n 'mask',\n 'mask_image',\n 'control_image',\n 'init_image',\n 'subject_image',\n 'face_image',\n 'style_image',\n 'pose_image',\n 'image_url',\n 'tail_image_url',\n // Image inputs (array)\n 'reference_images',\n // Video inputs\n 'video',\n 'video_url',\n // Audio inputs\n 'audio',\n 'audio_url',\n]);\n\n/**\n * Maps schema field names to their corresponding handle types.\n */\nconst FIELD_TO_HANDLE_TYPE: Record<string, HandleType> = {\n // Audio fields\n audio: 'audio',\n audio_url: 'audio',\n control_image: 'image',\n end_image: 'image',\n face_image: 'image',\n first_frame_image: 'image',\n // Image fields (single)\n image: 'image',\n image_input: 'image',\n image_url: 'image',\n init_image: 'image',\n last_frame: 'image',\n mask: 'image',\n mask_image: 'image',\n negative_prompt: 'text',\n pose_image: 'image',\n // Text fields\n prompt: 'text',\n // Image fields (array)\n reference_images: 'image',\n start_image: 'image',\n style_image: 'image',\n subject_image: 'image',\n subject_reference: 'text',\n tail_image_url: 'image',\n // Video fields\n video: 'video',\n video_url: 'video',\n};\n\ninterface SchemaProperty {\n title?: string;\n type?: string;\n description?: string;\n}\n\ninterface InputSchema {\n properties?: Record<string, SchemaProperty>;\n required?: string[];\n}\n\n/**\n * Generates dynamic input handles from a model's input schema.\n *\n * Merges dynamically discovered handles with static handles defined in NODE_DEFINITIONS.\n * Static handles take precedence - dynamic handles are only added if not already present.\n *\n * @param inputSchema - The model's input schema containing properties\n * @param staticHandles - Static handles from NODE_DEFINITIONS\n * @returns Combined array of handles (static + dynamic)\n */\nexport function generateHandlesFromSchema(\n inputSchema: Record<string, unknown> | undefined,\n staticHandles: HandleDefinition[],\n): HandleDefinition[] {\n if (!inputSchema) return staticHandles;\n\n const schema = inputSchema as InputSchema;\n if (!schema.properties) return staticHandles;\n\n // Build set of existing static handle IDs to avoid duplicates\n const staticIds = new Set(staticHandles.map((h) => h.id));\n const dynamicHandles: HandleDefinition[] = [];\n\n for (const [fieldName, prop] of Object.entries(schema.properties)) {\n // Skip if not a handle-able field or already defined statically\n if (!HANDLE_FIELDS.has(fieldName) || staticIds.has(fieldName)) continue;\n\n const handleType = FIELD_TO_HANDLE_TYPE[fieldName];\n if (!handleType) continue;\n\n // Generate a display label from field name or schema title\n const label =\n prop.title ||\n fieldName.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n\n dynamicHandles.push({\n fromSchema: true,\n id: fieldName,\n label,\n multiple: prop.type === 'array',\n required: schema.required?.includes(fieldName),\n type: handleType,\n });\n }\n\n return [...staticHandles, ...dynamicHandles];\n}\n\n/**\n * Check if a handle was dynamically generated from schema.\n */\nexport function isSchemaHandle(handle: HandleDefinition): boolean {\n return handle.fromSchema === true;\n}\n","import type {\n DownloadNodeData,\n ImageGenNodeData,\n ImageInputNodeData,\n MotionControlNodeData,\n NodeType,\n VideoGenNodeData,\n VideoInputNodeData,\n WorkflowNodeData,\n} from '@genfeedai/types';\n\nexport interface MediaInfo {\n url: string | null;\n urls?: string[];\n type: 'image' | 'video' | null;\n}\n\n/**\n * Extract media URL and type from node data\n */\nexport function getMediaFromNode(\n nodeType: NodeType,\n data: WorkflowNodeData,\n): MediaInfo {\n switch (nodeType) {\n case 'imageGen': {\n const imgData = data as ImageGenNodeData;\n const urls = imgData.outputImages?.length ? imgData.outputImages : [];\n return {\n type: imgData.outputImage || urls.length ? 'image' : null,\n url: imgData.outputImage,\n urls,\n };\n }\n case 'videoGen': {\n const vidData = data as VideoGenNodeData;\n return {\n type: vidData.outputVideo ? 'video' : null,\n url: vidData.outputVideo,\n };\n }\n case 'imageInput': {\n const inputData = data as ImageInputNodeData;\n return { type: inputData.image ? 'image' : null, url: inputData.image };\n }\n case 'videoInput': {\n const vidInputData = data as VideoInputNodeData;\n return {\n type: vidInputData.video ? 'video' : null,\n url: vidInputData.video,\n };\n }\n case 'motionControl': {\n const mcData = data as MotionControlNodeData;\n return {\n type: mcData.outputVideo ? 'video' : null,\n url: mcData.outputVideo,\n };\n }\n case 'download': {\n const outData = data as DownloadNodeData;\n if (outData.inputVideo) {\n return { type: 'video', url: outData.inputVideo };\n }\n if (outData.inputImage) {\n return { type: 'image', url: outData.inputImage };\n }\n return { type: null, url: null };\n }\n default:\n return { type: null, url: null };\n }\n}\n","'use client';\n\nimport type { CubicBezier } from '@genfeedai/types';\nimport { memo, useCallback, useRef, useState } from 'react';\n\ninterface CubicBezierEditorProps {\n value: CubicBezier;\n onChange: (value: CubicBezier) => void;\n onCommit?: (value: CubicBezier) => void;\n disabled?: boolean;\n width?: number;\n height?: number;\n}\n\nconst PADDING = 16;\nconst POINT_RADIUS = 8;\n\nfunction CubicBezierEditorComponent({\n value,\n onChange,\n onCommit,\n disabled = false,\n width = 240,\n height = 240,\n}: CubicBezierEditorProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [dragging, setDragging] = useState<1 | 2 | null>(null);\n\n const plotW = width - PADDING * 2;\n const plotH = height - PADDING * 2;\n\n // Convert bezier values (0-1 range) to SVG coordinates\n const toSVG = useCallback(\n (x: number, y: number): [number, number] => [\n PADDING + x * plotW,\n PADDING + (1 - y) * plotH,\n ],\n [plotW, plotH],\n );\n\n // Convert SVG coordinates to bezier values (0-1 range)\n const fromSVG = useCallback(\n (svgX: number, svgY: number): [number, number] => {\n const x = Math.max(0, Math.min(1, (svgX - PADDING) / plotW));\n const y = Math.max(-0.5, Math.min(1.5, 1 - (svgY - PADDING) / plotH));\n return [x, y];\n },\n [plotW, plotH],\n );\n\n const getSVGPoint = useCallback(\n (e: React.PointerEvent<SVGSVGElement>): [number, number] => {\n const svg = svgRef.current;\n if (!svg) return [0, 0];\n const rect = svg.getBoundingClientRect();\n return [e.clientX - rect.left, e.clientY - rect.top];\n },\n [],\n );\n\n const handlePointerDown = useCallback(\n (point: 1 | 2) => (e: React.PointerEvent<SVGCircleElement>) => {\n if (disabled) return;\n e.preventDefault();\n e.stopPropagation();\n setDragging(point);\n (e.target as SVGCircleElement).setPointerCapture(e.pointerId);\n },\n [disabled],\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent<SVGSVGElement>) => {\n if (!dragging || disabled) return;\n const [svgX, svgY] = getSVGPoint(e);\n const [x, y] = fromSVG(svgX, svgY);\n\n const next: CubicBezier = [...value];\n if (dragging === 1) {\n next[0] = x;\n next[1] = y;\n } else {\n next[2] = x;\n next[3] = y;\n }\n onChange(next);\n },\n [dragging, disabled, getSVGPoint, fromSVG, value, onChange],\n );\n\n const handlePointerUp = useCallback(() => {\n if (dragging) {\n setDragging(null);\n onCommit?.(value);\n }\n }, [dragging, onCommit, value]);\n\n // Coordinates\n const [p0x, p0y] = toSVG(0, 0);\n const [p1x, p1y] = toSVG(value[0], value[1]);\n const [p2x, p2y] = toSVG(value[2], value[3]);\n const [p3x, p3y] = toSVG(1, 1);\n\n // Bezier curve path\n const curvePath = `M ${p0x} ${p0y} C ${p1x} ${p1y}, ${p2x} ${p2y}, ${p3x} ${p3y}`;\n\n // Linear reference path\n const linearPath = `M ${p0x} ${p0y} L ${p3x} ${p3y}`;\n\n // Grid lines\n const gridLines = [];\n for (let i = 0; i <= 4; i++) {\n const t = i / 4;\n const [gx] = toSVG(t, 0);\n const [, gy] = toSVG(0, t);\n gridLines.push(\n <line\n key={`v-${i}`}\n x1={gx}\n y1={PADDING}\n x2={gx}\n y2={height - PADDING}\n stroke=\"var(--border)\"\n strokeWidth={1}\n strokeDasharray={i === 0 || i === 4 ? undefined : '2 4'}\n />,\n <line\n key={`h-${i}`}\n x1={PADDING}\n y1={gy}\n x2={width - PADDING}\n y2={gy}\n stroke=\"var(--border)\"\n strokeWidth={1}\n strokeDasharray={i === 0 || i === 4 ? undefined : '2 4'}\n />,\n );\n }\n\n return (\n <div className=\"nodrag space-y-2\">\n <svg\n ref={svgRef}\n width={width}\n height={height}\n className={`bg-[var(--background)] rounded border border-[var(--border)] ${\n disabled ? 'opacity-50 pointer-events-none' : 'cursor-crosshair'\n }`}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n >\n {/* Grid */}\n {gridLines}\n\n {/* Linear reference */}\n <path\n d={linearPath}\n fill=\"none\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n opacity={0.3}\n />\n\n {/* Control point lines */}\n <line\n x1={p0x}\n y1={p0y}\n x2={p1x}\n y2={p1y}\n stroke=\"var(--primary)\"\n strokeWidth={1}\n opacity={0.5}\n />\n <line\n x1={p3x}\n y1={p3y}\n x2={p2x}\n y2={p2y}\n stroke=\"var(--primary)\"\n strokeWidth={1}\n opacity={0.5}\n />\n\n {/* Bezier curve */}\n <path\n d={curvePath}\n fill=\"none\"\n stroke=\"var(--primary)\"\n strokeWidth={2.5}\n />\n\n {/* Endpoints */}\n <circle cx={p0x} cy={p0y} r={3} fill=\"var(--foreground)\" />\n <circle cx={p3x} cy={p3y} r={3} fill=\"var(--foreground)\" />\n\n {/* Control point 1 */}\n <circle\n cx={p1x}\n cy={p1y}\n r={POINT_RADIUS}\n fill=\"var(--primary)\"\n stroke=\"var(--background)\"\n strokeWidth={2}\n className={disabled ? '' : 'cursor-grab active:cursor-grabbing'}\n onPointerDown={handlePointerDown(1)}\n />\n\n {/* Control point 2 */}\n <circle\n cx={p2x}\n cy={p2y}\n r={POINT_RADIUS}\n fill=\"var(--accent)\"\n stroke=\"var(--background)\"\n strokeWidth={2}\n className={disabled ? '' : 'cursor-grab active:cursor-grabbing'}\n onPointerDown={handlePointerDown(2)}\n />\n </svg>\n\n {/* Coordinate display */}\n <div className=\"flex justify-between text-[10px] text-[var(--muted-foreground)] font-mono px-1\">\n <span>\n P1: ({value[0].toFixed(2)}, {value[1].toFixed(2)})\n </span>\n <span>\n P2: ({value[2].toFixed(2)}, {value[3].toFixed(2)})\n </span>\n </div>\n </div>\n );\n}\n\nexport const CubicBezierEditor = memo(CubicBezierEditorComponent);\n","import type { CubicBezier, EasingPreset } from '@genfeedai/types';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EasingFunction = (t: number) => number;\n\n// =============================================================================\n// CUBIC BEZIER PRESETS (original - typed to EasingPreset union)\n// =============================================================================\n\n/**\n * Easing presets based on easy-peasy-ease patterns\n * Each preset is a cubic bezier curve: [x1, y1, x2, y2]\n */\nexport const EASING_PRESETS: Record<EasingPreset, CubicBezier> = {\n // Standard easing functions\n easeIn: [0.42, 0, 1, 1],\n\n // Cubic easing\n easeInCubic: [0.55, 0.055, 0.675, 0.19],\n\n // Exponential easing\n easeInExpo: [0.95, 0.05, 0.795, 0.035],\n easeInOut: [0.42, 0, 0.58, 1],\n easeInOutCubic: [0.645, 0.045, 0.355, 1],\n easeInOutExpo: [1, 0, 0, 1],\n easeInOutQuad: [0.455, 0.03, 0.515, 0.955],\n\n // Quadratic easing\n easeInQuad: [0.55, 0.085, 0.68, 0.53],\n easeOut: [0, 0, 0.58, 1],\n easeOutCubic: [0.215, 0.61, 0.355, 1],\n easeOutExpo: [0.19, 1, 0.22, 1],\n easeOutQuad: [0.25, 0.46, 0.45, 0.94],\n // Linear - no easing\n linear: [0, 0, 1, 1],\n};\n\n// =============================================================================\n// EXTENDED BEZIER MAPS (from easing-presets.ts)\n// =============================================================================\n\nexport const DEFAULT_CUSTOM_BEZIER: CubicBezier = [0.42, 0, 0.58, 1];\n\n/** Named presets for the CubicBezierEditor */\nexport const PRESET_BEZIERS = {\n easeInExpoOutCubic: [0.85, 0, 0.15, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuartOutQuad: [0.8, 0, 0.2, 1],\n} as const satisfies Record<string, CubicBezier>;\n\nexport type EasingPresetName = keyof typeof PRESET_BEZIERS;\n\n/**\n * Full bezier map covering all standard easings from easings.net.\n * Hybrid easings (easeInExpoOutCubic, easeInQuartOutQuad) are approximations\n * since asymmetric compositions can't be exactly represented by a single cubic bezier.\n */\nexport const EASING_BEZIER_MAP: Record<string, CubicBezier> = {\n ...PRESET_BEZIERS,\n easeInCirc: [0.55, 0, 1, 0.45],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeOutSine: [0.61, 1, 0.88, 1],\n linear: [0, 0, 1, 1],\n};\n\n/** Look up a preset bezier from PRESET_BEZIERS by name */\nexport function getPresetBezier(preset?: string | null): CubicBezier {\n const handles = preset ? PRESET_BEZIERS[preset as EasingPresetName] : null;\n const source = handles ?? DEFAULT_CUSTOM_BEZIER;\n return [...source] as CubicBezier;\n}\n\n/** Look up any easing bezier from the full EASING_BEZIER_MAP */\nexport function getEasingBezier(name?: string | null): CubicBezier {\n const handles = name ? EASING_BEZIER_MAP[name] : null;\n const source = handles ?? DEFAULT_CUSTOM_BEZIER;\n return [...source] as CubicBezier;\n}\n\n// =============================================================================\n// PARAMETRIC EASING FUNCTIONS (from easing-functions.ts)\n// =============================================================================\n\nexport function createAsymmetricEase(\n easeIn: EasingFunction,\n easeOut: EasingFunction,\n): EasingFunction {\n return (t: number): number => {\n if (t <= 0.5) {\n return 0.5 * easeIn(t * 2);\n }\n return 0.5 + 0.5 * easeOut((t - 0.5) * 2);\n };\n}\n\nconst baseEasing = {\n easeInCirc: (t: number): number => 1 - Math.sqrt(1 - t ** 2),\n easeInCubic: (t: number): number => t * t * t,\n easeInExpo: (t: number): number => (t === 0 ? 0 : 2 ** (10 * t - 10)),\n easeInOutCirc: (t: number): number =>\n t < 0.5\n ? (1 - Math.sqrt(1 - (2 * t) ** 2)) / 2\n : (Math.sqrt(1 - (-2 * t + 2) ** 2) + 1) / 2,\n easeInOutCubic: (t: number): number =>\n t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2,\n easeInOutExpo: (t: number): number =>\n t === 0\n ? 0\n : t === 1\n ? 1\n : t < 0.5\n ? 2 ** (20 * t - 10) / 2\n : (2 - 2 ** (-20 * t + 10)) / 2,\n easeInOutQuad: (t: number): number =>\n t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t,\n easeInOutQuart: (t: number): number =>\n t < 0.5 ? 8 * t * t * t * t : 1 - (-2 * t + 2) ** 4 / 2,\n easeInOutQuint: (t: number): number =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 - (-2 * t + 2) ** 5 / 2,\n easeInOutSine: (t: number): number => -(Math.cos(Math.PI * t) - 1) / 2,\n easeInQuad: (t: number): number => t * t,\n easeInQuart: (t: number): number => t * t * t * t,\n easeInQuint: (t: number): number => t * t * t * t * t,\n easeInSine: (t: number): number => 1 - Math.cos((t * Math.PI) / 2),\n easeOutCirc: (t: number): number => Math.sqrt(1 - (t - 1) ** 2),\n easeOutCubic: (t: number): number => {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n },\n easeOutExpo: (t: number): number => (t === 1 ? 1 : 1 - 2 ** (-10 * t)),\n easeOutQuad: (t: number): number => t * (2 - t),\n easeOutQuart: (t: number): number => {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n },\n easeOutQuint: (t: number): number => {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n },\n easeOutSine: (t: number): number => Math.sin((t * Math.PI) / 2),\n linear: (t: number): number => t,\n} as const;\n\nconst hybridEasing = {\n easeInExpoOutCubic: createAsymmetricEase(\n baseEasing.easeInExpo,\n baseEasing.easeOutCubic,\n ),\n easeInQuartOutQuad: createAsymmetricEase(\n baseEasing.easeInQuart,\n baseEasing.easeOutQuad,\n ),\n} as const;\n\n/** All parametric easing functions (22 base + 2 hybrids) */\nexport const easing = {\n ...baseEasing,\n ...hybridEasing,\n} as const;\n\n/**\n * Create an easing function from cubic bezier control points\n */\nexport function createBezierEasing(\n p1x: number,\n p1y: number,\n p2x: number,\n p2y: number,\n): EasingFunction {\n const clamp = (value: number) => Math.min(1, Math.max(0, value));\n const x1 = clamp(p1x);\n const y1 = clamp(p1y);\n const x2 = clamp(p2x);\n const y2 = clamp(p2y);\n const cx = 3 * x1;\n const bx = 3 * (x2 - x1) - cx;\n const ax = 1 - cx - bx;\n const cy = 3 * y1;\n const by = 3 * (y2 - y1) - cy;\n const ay = 1 - cy - by;\n const sampleCurveX = (t: number) => ((ax * t + bx) * t + cx) * t;\n const sampleCurveY = (t: number) => ((ay * t + by) * t + cy) * t;\n const sampleDerivativeX = (t: number) => (3 * ax * t + 2 * bx) * t + cx;\n const solveCurveX = (x: number) => {\n let t2 = x;\n const epsilon = 1e-6;\n for (let i = 0; i < 8; i++) {\n const x2err = sampleCurveX(t2) - x;\n if (Math.abs(x2err) < epsilon) return t2;\n const d2 = sampleDerivativeX(t2);\n if (Math.abs(d2) < epsilon) break;\n t2 -= x2err / d2;\n }\n let t0 = 0;\n let t1 = 1;\n t2 = x;\n while (t0 < t1) {\n const x2err = sampleCurveX(t2);\n if (Math.abs(x2err - x) < epsilon) return t2;\n if (x > x2err) t0 = t2;\n else t1 = t2;\n t2 = (t1 + t0) / 2;\n }\n return t2;\n };\n return (t: number) => {\n const clamped = clamp(t);\n return sampleCurveY(solveCurveX(clamped));\n };\n}\n\n/** Resolve easing function by name */\nexport function getEasingFunction(name: string): EasingFunction {\n const func = easing[name as keyof typeof easing];\n if (!func) return easing.linear;\n return func;\n}\n\n/** List all available easing function names */\nexport function getAllEasingNames(): string[] {\n return Object.keys(easing);\n}\n\n// =============================================================================\n// BEZIER EVALUATION (original)\n// =============================================================================\n\n/**\n * Evaluate a cubic bezier curve at parameter t\n */\nexport function evaluateBezier(t: number, curve: CubicBezier): number {\n const [x1, y1, x2, y2] = curve;\n\n // Newton-Raphson iteration to find t for given x\n const epsilon = 1e-6;\n let guess = t;\n\n for (let i = 0; i < 8; i++) {\n const x =\n 3 * (1 - guess) * (1 - guess) * guess * x1 +\n 3 * (1 - guess) * guess * guess * x2 +\n guess * guess * guess -\n t;\n\n if (Math.abs(x) < epsilon) break;\n\n const dx =\n 3 * (1 - guess) * (1 - guess) * x1 +\n 6 * (1 - guess) * guess * (x2 - x1) +\n 3 * guess * guess * (1 - x2);\n\n guess -= x / dx;\n }\n\n // Evaluate y at the found t\n return (\n 3 * (1 - guess) * (1 - guess) * guess * y1 +\n 3 * (1 - guess) * guess * guess * y2 +\n guess * guess * guess\n );\n}\n\n/**\n * Apply speed curve to video timestamps\n * Returns an array of warped timestamps\n */\nexport function applySpeedCurve(\n duration: number,\n curve: CubicBezier,\n sampleRate: number = 60,\n): number[] {\n const timestamps: number[] = [];\n\n for (let i = 0; i <= sampleRate; i++) {\n const t = i / sampleRate;\n const easedT = evaluateBezier(t, curve);\n timestamps.push(easedT * duration);\n }\n\n return timestamps;\n}\n\n// =============================================================================\n// DISPLAY NAMES\n// =============================================================================\n\nconst EASING_DISPLAY_NAMES: Record<string, string> = {\n easeIn: 'Ease In',\n easeInCirc: 'Ease In Circular',\n easeInCubic: 'Ease In Cubic',\n easeInExpo: 'Ease In Exponential',\n easeInExpoOutCubic: 'Expo In → Cubic Out',\n easeInOut: 'Ease In Out',\n easeInOutCirc: 'Ease In Out Circular',\n easeInOutCubic: 'Ease In Out Cubic',\n easeInOutExpo: 'Ease In Out Exponential',\n easeInOutQuad: 'Ease In Out Quadratic',\n easeInOutQuart: 'Ease In Out Quartic',\n easeInOutQuint: 'Ease In Out Quintic',\n easeInOutSine: 'Ease In Out Sine',\n easeInQuad: 'Ease In Quadratic',\n easeInQuart: 'Ease In Quartic',\n easeInQuartOutQuad: 'Quart In → Quad Out',\n easeInQuint: 'Ease In Quintic',\n easeInSine: 'Ease In Sine',\n easeOut: 'Ease Out',\n easeOutCirc: 'Ease Out Circular',\n easeOutCubic: 'Ease Out Cubic',\n easeOutExpo: 'Ease Out Exponential',\n easeOutQuad: 'Ease Out Quadratic',\n easeOutQuart: 'Ease Out Quartic',\n easeOutQuint: 'Ease Out Quintic',\n easeOutSine: 'Ease Out Sine',\n linear: 'Linear',\n};\n\n/**\n * Get display name for easing preset\n */\nexport function getEasingDisplayName(preset: EasingPreset | string): string {\n return EASING_DISPLAY_NAMES[preset] || preset;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { calculateWorkflowCost, formatCost } from './chunk-MGLAKMDP.mjs';
2
- import { useExecutionStore, useUIStore, useSettingsStore } from './chunk-OJWVEEMM.mjs';
3
- import { useWorkflowStore } from './chunk-GPYIIWD5.mjs';
1
+ import { calculateWorkflowCost, formatCost } from './chunk-2BHILUF7.mjs';
2
+ import { useExecutionStore, useUIStore, useSettingsStore } from './chunk-R5L7WB7F.mjs';
3
+ import { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
4
4
  import { Minus, Plus, Square, Play, ChevronUp, PlayCircle, RotateCcw, DollarSign, MoreVertical, X, CloudOff, Loader2, Cloud, Check, ChevronDown, SaveAll, Save, FolderOpen, Bug, LayoutGrid, Undo2, Redo2, HelpCircle, Settings, AlertCircle } from 'lucide-react';
5
5
  import { useState, useRef, useMemo, useCallback, useEffect } from 'react';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -819,3 +819,5 @@ function Toolbar({
819
819
  }
820
820
 
821
821
  export { BottomBar, CostIndicator, OverflowMenu, SaveAsDialog, SaveIndicator, Toolbar, ToolbarDropdown };
822
+ //# sourceMappingURL=chunk-3GWH2ZOH.mjs.map
823
+ //# sourceMappingURL=chunk-3GWH2ZOH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/toolbar/BottomBar.tsx","../src/toolbar/CostIndicator.tsx","../src/toolbar/OverflowMenu.tsx","../src/toolbar/SaveAsDialog.tsx","../src/toolbar/SaveIndicator.tsx","../src/toolbar/ToolbarDropdown.tsx","../src/toolbar/Toolbar.tsx"],"names":["useMemo","jsxs","jsx","useState","useRef","useEffect","useCallback","X"],"mappings":"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","file":"chunk-3GWH2ZOH.mjs","sourcesContent":["'use client';\n\nimport {\n ChevronUp,\n Minus,\n Play,\n PlayCircle,\n Plus,\n RotateCcw,\n Square,\n} from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nconst MIN_BATCH = 1;\nconst MAX_BATCH = 10;\n\nexport function BottomBar() {\n const [batchCount, setBatchCount] = useState(1);\n const [currentBatchRun, setCurrentBatchRun] = useState(0);\n const [isBatchRunning, setIsBatchRunning] = useState(false);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const batchCancelledRef = useRef(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const isRunning = useExecutionStore((s) => s.isRunning);\n const executeWorkflow = useExecutionStore((s) => s.executeWorkflow);\n const executeSelectedNodes = useExecutionStore((s) => s.executeSelectedNodes);\n const resumeFromFailed = useExecutionStore((s) => s.resumeFromFailed);\n const canResumeFromFailed = useExecutionStore((s) => s.canResumeFromFailed);\n const stopExecution = useExecutionStore((s) => s.stopExecution);\n const _lastFailedNodeId = useExecutionStore((s) => s.lastFailedNodeId);\n\n const selectedNodeIds = useWorkflowStore((s) => s.selectedNodeIds);\n const nodes = useWorkflowStore((s) => s.nodes);\n const validateWorkflow = useWorkflowStore((s) => s.validateWorkflow);\n\n const canRunWorkflow = useMemo(() => {\n if (nodes.length === 0) return false;\n const validation = validateWorkflow();\n return validation.isValid;\n }, [nodes, validateWorkflow]);\n\n const hasSelection = selectedNodeIds.length > 0;\n const showResume = canResumeFromFailed();\n\n const decrementBatch = useCallback(() => {\n setBatchCount((prev) => Math.max(MIN_BATCH, prev - 1));\n }, []);\n\n const incrementBatch = useCallback(() => {\n setBatchCount((prev) => Math.min(MAX_BATCH, prev + 1));\n }, []);\n\n const waitForExecutionEnd = useCallback((): Promise<void> => {\n return new Promise((resolve) => {\n // If not running, resolve immediately\n if (!useExecutionStore.getState().isRunning) {\n resolve();\n return;\n }\n const unsubscribe = useExecutionStore.subscribe((state) => {\n if (!state.isRunning) {\n unsubscribe();\n resolve();\n }\n });\n });\n }, []);\n\n const runBatch = useCallback(async () => {\n batchCancelledRef.current = false;\n setIsBatchRunning(true);\n\n const accumulatedImages = new Map<string, string[]>();\n\n for (let i = 0; i < batchCount; i++) {\n if (batchCancelledRef.current) break;\n\n setCurrentBatchRun(i + 1);\n executeWorkflow();\n\n // Wait a tick for isRunning to be set\n await new Promise((r) => setTimeout(r, 50));\n\n // If execution didn't start (validation error), abort\n if (!useExecutionStore.getState().isRunning) break;\n\n await waitForExecutionEnd();\n\n // Check if execution failed\n if (useExecutionStore.getState().lastFailedNodeId) break;\n\n // Accumulate outputImages from imageGen nodes across batch runs\n const { nodes: currentNodes, updateNodeData } =\n useWorkflowStore.getState();\n for (const node of currentNodes) {\n if (node.type !== 'imageGen') continue;\n const nodeData = node.data as Record<string, unknown>;\n const newImages = nodeData.outputImages as string[] | undefined;\n if (!newImages?.length) continue;\n\n const existing = accumulatedImages.get(node.id) || [];\n const merged = [...existing, ...newImages];\n accumulatedImages.set(node.id, merged);\n updateNodeData(node.id, { outputImages: merged });\n }\n }\n\n setIsBatchRunning(false);\n setCurrentBatchRun(0);\n }, [batchCount, executeWorkflow, waitForExecutionEnd]);\n\n const handlePrimaryClick = useCallback(() => {\n if (isRunning || isBatchRunning) {\n batchCancelledRef.current = true;\n stopExecution();\n return;\n }\n\n if (batchCount > 1) {\n runBatch();\n } else {\n executeWorkflow();\n }\n }, [\n isRunning,\n isBatchRunning,\n batchCount,\n runBatch,\n executeWorkflow,\n stopExecution,\n ]);\n\n const handleRunSelected = useCallback(() => {\n if (!isRunning && hasSelection) {\n executeSelectedNodes();\n setDropdownOpen(false);\n }\n }, [isRunning, hasSelection, executeSelectedNodes]);\n\n const handleResume = useCallback(() => {\n if (canResumeFromFailed()) {\n resumeFromFailed();\n setDropdownOpen(false);\n }\n }, [canResumeFromFailed, resumeFromFailed]);\n\n const isActive = isRunning || isBatchRunning;\n\n return (\n <div\n className=\"fixed bottom-5 left-1/2 z-50 -translate-x-1/2\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center gap-1 rounded-md border border-neutral-700/80 bg-neutral-800/95 px-2 py-1 shadow-lg backdrop-blur-sm\">\n {/* Batch Counter */}\n <div className=\"flex items-center gap-0.5\">\n <span className=\"mr-0.5 text-[11px] text-neutral-400\">Batch</span>\n <button\n onClick={decrementBatch}\n disabled={batchCount <= MIN_BATCH || isActive}\n className=\"flex h-5 w-5 items-center justify-center rounded text-neutral-400 transition hover:bg-neutral-700 hover:text-white disabled:opacity-40 disabled:hover:bg-transparent\"\n >\n <Minus className=\"h-2.5 w-2.5\" />\n </button>\n <span className=\"w-4 text-center text-xs font-medium tabular-nums text-white\">\n {batchCount}\n </span>\n <button\n onClick={incrementBatch}\n disabled={batchCount >= MAX_BATCH || isActive}\n className=\"flex h-5 w-5 items-center justify-center rounded text-neutral-400 transition hover:bg-neutral-700 hover:text-white disabled:opacity-40 disabled:hover:bg-transparent\"\n >\n <Plus className=\"h-2.5 w-2.5\" />\n </button>\n </div>\n\n {/* Divider */}\n <div className=\"mx-1 h-4 w-px bg-neutral-600\" />\n\n {/* Run Button with Dropdown */}\n <div className=\"relative flex items-center\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handlePrimaryClick();\n }}\n disabled={!isActive && !canRunWorkflow}\n className={`flex h-7 items-center gap-1.5 rounded-l px-3 text-xs font-medium transition ${\n isActive\n ? 'bg-red-500/90 text-white hover:bg-red-500'\n : canRunWorkflow\n ? 'bg-white text-black hover:bg-neutral-200'\n : 'bg-neutral-600 text-neutral-400'\n } disabled:cursor-not-allowed`}\n >\n {isActive ? (\n <>\n <Square className=\"h-3.5 w-3.5\" />\n Stop\n </>\n ) : (\n <>\n <Play className=\"h-3.5 w-3.5 fill-current\" />\n Run\n </>\n )}\n </button>\n <button\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n onClick={(e) => {\n e.stopPropagation();\n setDropdownOpen((prev) => !prev);\n }}\n disabled={isActive}\n className={`flex h-7 items-center rounded-r border-l px-1.5 transition ${\n isActive\n ? 'border-red-400/30 bg-red-500/90 text-white'\n : canRunWorkflow\n ? 'border-neutral-300 bg-white text-black hover:bg-neutral-200'\n : 'border-neutral-500 bg-neutral-600 text-neutral-400'\n } disabled:cursor-not-allowed`}\n >\n <ChevronUp className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Dropdown Menu (opens upward) */}\n {dropdownOpen && (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setDropdownOpen(false)}\n />\n <div\n ref={dropdownRef}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n className=\"absolute bottom-full left-0 z-50 mb-1.5 min-w-[180px] rounded-md border border-neutral-700 bg-neutral-800 py-0.5 shadow-xl\"\n >\n <button\n onClick={() => {\n executeWorkflow();\n setDropdownOpen(false);\n }}\n disabled={!canRunWorkflow}\n className=\"flex w-full items-center gap-1.5 px-2.5 py-1.5 text-left text-xs text-neutral-200 transition hover:bg-neutral-700 disabled:text-neutral-500 disabled:hover:bg-transparent\"\n >\n <Play className=\"h-3 w-3\" />\n Run Workflow\n </button>\n <button\n onClick={handleRunSelected}\n disabled={!hasSelection || isRunning}\n className=\"flex w-full items-center gap-1.5 px-2.5 py-1.5 text-left text-xs text-neutral-200 transition hover:bg-neutral-700 disabled:text-neutral-500 disabled:hover:bg-transparent\"\n >\n <PlayCircle className=\"h-3 w-3\" />\n Run Selected ({selectedNodeIds.length})\n </button>\n {showResume && (\n <>\n <div className=\"mx-2 my-0.5 h-px bg-neutral-700\" />\n <button\n onClick={handleResume}\n className=\"flex w-full items-center gap-1.5 px-2.5 py-1.5 text-left text-xs text-neutral-200 transition hover:bg-neutral-700\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Resume from Failed\n </button>\n </>\n )}\n </div>\n </>\n )}\n </div>\n\n {/* Batch Progress */}\n {isBatchRunning && (\n <>\n <div className=\"mx-1 h-4 w-px bg-neutral-600\" />\n <span className=\"text-[11px] tabular-nums text-neutral-400\">\n {currentBatchRun}/{batchCount}\n </span>\n </>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { DollarSign } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { calculateWorkflowCost, formatCost } from '../lib/costCalculator';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nexport function CostIndicator() {\n const nodes = useWorkflowStore((state) => state.nodes);\n const isRunning = useExecutionStore((state) => state.isRunning);\n const actualCost = useExecutionStore((state) => state.actualCost);\n const { openModal } = useUIStore();\n\n const breakdown = useMemo(() => calculateWorkflowCost(nodes), [nodes]);\n\n const displayCost =\n isRunning && actualCost > 0 ? actualCost : breakdown.total;\n\n if (breakdown.items.length === 0) return null;\n\n return (\n <button\n onClick={() => openModal('cost')}\n title=\"View cost breakdown\"\n className=\"flex items-center gap-1.5 rounded-md border border-[var(--border)] px-2 py-1 text-sm text-[var(--muted-foreground)] transition hover:bg-[var(--secondary)] hover:text-[var(--foreground)]\"\n >\n <DollarSign className=\"h-3.5 w-3.5\" />\n <span className=\"font-mono text-xs\">{formatCost(displayCost)}</span>\n {isRunning && actualCost > 0 && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-green-500 animate-pulse\" />\n )}\n </button>\n );\n}\n","'use client';\n\nimport { MoreVertical } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { OverflowMenuProps } from './types';\n\n/**\n * Overflow menu with icon trigger\n */\nexport function OverflowMenu({ items }: OverflowMenuProps) {\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n return (\n <div ref={menuRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n title=\"More options\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground\"\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n\n {isOpen && (\n <div className=\"absolute right-0 top-full z-50 mt-1 min-w-[180px] rounded-lg border border-border bg-card py-1 shadow-lg\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={() => {\n item.onClick?.();\n setIsOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-sm text-foreground transition hover:bg-secondary\"\n >\n <span className=\"h-4 w-4 shrink-0\">{item.icon}</span>\n <span>{item.label}</span>\n {item.external && (\n <span className=\"ml-auto text-xs text-muted-foreground\">↗</span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { X } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface SaveAsDialogProps {\n isOpen: boolean;\n currentName: string;\n onSave: (newName: string) => void;\n onClose: () => void;\n}\n\nexport function SaveAsDialog({\n isOpen,\n currentName,\n onSave,\n onClose,\n}: SaveAsDialogProps) {\n const [name, setName] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (isOpen) {\n setName(`${currentName} (copy)`);\n setTimeout(() => inputRef.current?.select(), 0);\n }\n }, [isOpen, currentName]);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n const trimmed = name.trim();\n if (trimmed) {\n onSave(trimmed);\n }\n },\n [name, onSave],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n },\n [onClose],\n );\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div className=\"absolute inset-0 bg-black/60\" onClick={onClose} />\n <div\n className=\"relative z-10 w-full max-w-md rounded-lg border border-border bg-card p-6 shadow-xl\"\n onKeyDown={handleKeyDown}\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Save As</h2>\n <button\n onClick={onClose}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <form onSubmit={handleSubmit}>\n <div className=\"mb-4\">\n <label\n htmlFor=\"workflow-name\"\n className=\"mb-2 block text-sm font-medium text-foreground\"\n >\n Workflow Name\n </label>\n <input\n ref={inputRef}\n id=\"workflow-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Enter workflow name\"\n autoFocus\n className=\"w-full rounded-md border border-border bg-secondary px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground outline-none focus:ring-1 focus:ring-ring\"\n />\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground transition hover:bg-secondary\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={!name.trim()}\n className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Save\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Check, Cloud, CloudOff, Loader2 } from 'lucide-react';\nimport { useSettingsStore } from '../stores/settingsStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport type { SaveIndicatorProps } from './types';\n\n/**\n * Auto-save status indicator\n */\nexport function SaveIndicator({\n isDirty: isDirtyProp,\n isSaving: isSavingProp,\n variant = 'default',\n}: SaveIndicatorProps) {\n const storeIsDirty = useWorkflowStore((state) => state.isDirty);\n const storeIsSaving = useWorkflowStore((state) => state.isSaving);\n const autoSaveEnabled = useSettingsStore((state) => state.autoSaveEnabled);\n const toggleAutoSave = useSettingsStore((state) => state.toggleAutoSave);\n const isDirty = isDirtyProp ?? storeIsDirty;\n const isSaving = isSavingProp ?? storeIsSaving;\n const isPill = variant === 'pill';\n\n if (!autoSaveEnabled) {\n return (\n <button\n onClick={toggleAutoSave}\n title=\"Click to enable auto-save\"\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground transition-colors hover:text-foreground\"\n >\n <CloudOff className=\"h-3.5 w-3.5\" />\n <span>Auto-save off</span>\n </button>\n );\n }\n\n if (isSaving) {\n return (\n <div\n className={\n isPill\n ? 'flex items-center gap-1.5 rounded-full border border-blue-500/20 bg-blue-500/10 px-2.5 py-1 text-xs text-blue-400'\n : 'flex items-center gap-1.5 text-xs text-blue-500'\n }\n >\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n <span>Saving...</span>\n </div>\n );\n }\n\n if (isDirty) {\n return (\n <div\n className={\n isPill\n ? 'flex items-center gap-1.5 rounded-full border border-border bg-secondary/40 px-2.5 py-1 text-xs text-muted-foreground'\n : 'flex items-center gap-1.5 text-xs text-muted-foreground'\n }\n >\n <Cloud className=\"h-3.5 w-3.5\" />\n <span>Unsaved</span>\n </div>\n );\n }\n\n return (\n <button\n onClick={toggleAutoSave}\n title=\"Click to disable auto-save\"\n className={\n isPill\n ? 'flex items-center gap-1.5 rounded-full border border-emerald-500/20 bg-emerald-500/10 px-2.5 py-1 text-xs text-emerald-400 transition-colors hover:text-emerald-300'\n : 'flex items-center gap-1.5 text-xs text-green-500 transition-colors hover:text-green-400'\n }\n >\n <Check className=\"h-3.5 w-3.5\" />\n <span>Saved</span>\n </button>\n );\n}\n","'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { ToolbarDropdownProps } from './types';\n\n/**\n * Toolbar dropdown menu component\n */\nexport function ToolbarDropdown({ label, items }: ToolbarDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n return (\n <div ref={menuRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"flex items-center gap-1 rounded-md px-2.5 py-1.5 text-sm font-medium text-muted-foreground transition hover:bg-secondary hover:text-foreground\"\n >\n {label}\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </button>\n\n {isOpen && (\n <div className=\"absolute left-0 top-full z-50 mt-1 min-w-[180px] rounded-lg border border-border bg-card py-1 shadow-lg whitespace-nowrap\">\n {items.map((item) => {\n if (item.separator) {\n return <div key={item.id} className=\"my-1 h-px bg-border\" />;\n }\n\n return (\n <button\n key={item.id}\n onClick={() => {\n if (item.disabled || !item.onClick) return;\n item.onClick();\n setIsOpen(false);\n }}\n disabled={item.disabled}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-sm text-foreground transition hover:bg-secondary disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n >\n <span className=\"h-4 w-4 shrink-0\">{item.icon}</span>\n <span>{item.label}</span>\n {item.external && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n ↗\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { WorkflowFile } from '@genfeedai/types';\nimport {\n AlertCircle,\n Bug,\n FolderOpen,\n HelpCircle,\n LayoutGrid,\n Redo2,\n Save,\n SaveAll,\n Settings,\n Undo2,\n X,\n} from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useSettingsStore } from '../stores/settingsStore';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport { SaveAsDialog } from './SaveAsDialog';\nimport { SaveIndicator } from './SaveIndicator';\nimport { ToolbarDropdown } from './ToolbarDropdown';\nimport type { DropdownItem, ToolbarProps } from './types';\n\n/**\n * Validates workflow JSON structure before loading\n */\nfunction isValidWorkflow(data: unknown): data is WorkflowFile {\n if (!data || typeof data !== 'object') return false;\n\n const workflow = data as Record<string, unknown>;\n\n if (typeof workflow.name !== 'string') return false;\n if (!Array.isArray(workflow.nodes)) return false;\n if (!Array.isArray(workflow.edges)) return false;\n\n for (const node of workflow.nodes) {\n if (!node || typeof node !== 'object') return false;\n const n = node as Record<string, unknown>;\n if (typeof n.id !== 'string') return false;\n if (typeof n.type !== 'string') return false;\n if (!n.position || typeof n.position !== 'object') return false;\n }\n\n for (const edge of workflow.edges) {\n if (!edge || typeof edge !== 'object') return false;\n const e = edge as Record<string, unknown>;\n if (typeof e.id !== 'string') return false;\n if (typeof e.source !== 'string') return false;\n if (typeof e.target !== 'string') return false;\n }\n\n return true;\n}\n\nexport function Toolbar({\n onAutoLayout,\n onSaveAs,\n fileMenuItemsPrepend,\n fileMenuItemsAppend,\n additionalMenus,\n branding,\n leftContent,\n middleContent,\n saveIndicator,\n logoHref = '/',\n logoSrc = 'https://cdn.genfeed.ai/assets/branding/logo-white.png',\n showSettings = true,\n showShortcutHelp = false,\n rightContent,\n}: ToolbarProps) {\n const { exportWorkflow, workflowName } = useWorkflowStore();\n const { undo, redo } = useWorkflowStore.temporal.getState();\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [showSaveAsDialog, setShowSaveAsDialog] = useState(false);\n const validationErrors = useExecutionStore((state) => state.validationErrors);\n const clearValidationErrors = useExecutionStore(\n (state) => state.clearValidationErrors,\n );\n const { openModal } = useUIStore();\n const debugMode = useSettingsStore((s) => s.debugMode);\n\n const uniqueErrorMessages = useMemo(() => {\n if (!validationErrors?.errors.length) return [];\n return [...new Set(validationErrors.errors.map((e) => e.message))];\n }, [validationErrors]);\n\n // Subscribe to temporal state changes for undo/redo button states\n useEffect(() => {\n const unsubscribe = useWorkflowStore.temporal.subscribe((state) => {\n setCanUndo(state.pastStates.length > 0);\n setCanRedo(state.futureStates.length > 0);\n });\n // Initialize state\n const temporal = useWorkflowStore.temporal.getState();\n setCanUndo(temporal.pastStates.length > 0);\n setCanRedo(temporal.futureStates.length > 0);\n return unsubscribe;\n }, []);\n\n const handleExport = useCallback(() => {\n const workflow = exportWorkflow();\n const blob = new Blob([JSON.stringify(workflow, null, 2)], {\n type: 'application/json',\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `${workflow.name.toLowerCase().replace(/\\s+/g, '-')}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }, [exportWorkflow]);\n\n const handleImport = useCallback(() => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (event) => {\n try {\n const data = JSON.parse(event.target?.result as string);\n\n if (!isValidWorkflow(data)) {\n console.warn('[Toolbar] Invalid workflow file structure');\n return;\n }\n\n useWorkflowStore.getState().loadWorkflow(data);\n } catch {\n console.warn('[Toolbar] Failed to parse workflow file');\n }\n };\n reader.readAsText(file);\n };\n input.click();\n }, []);\n\n const handleSaveAs = useCallback(\n (newName: string) => {\n if (onSaveAs) {\n onSaveAs(newName);\n }\n setShowSaveAsDialog(false);\n },\n [onSaveAs],\n );\n\n const fileMenuItems: DropdownItem[] = useMemo(() => {\n const items: DropdownItem[] = [];\n\n // Prepend custom items\n if (fileMenuItemsPrepend?.length) {\n items.push(...fileMenuItemsPrepend);\n items.push({ id: 'separator-prepend', separator: true });\n }\n\n // Save As (only if callback is provided)\n if (onSaveAs) {\n items.push({\n icon: <SaveAll className=\"h-4 w-4\" />,\n id: 'saveAs',\n label: 'Save As...',\n onClick: () => setShowSaveAsDialog(true),\n });\n items.push({ id: 'separator-saveas', separator: true });\n }\n\n // Export/Import\n items.push(\n {\n icon: <Save className=\"h-4 w-4\" />,\n id: 'export',\n label: 'Export Workflow',\n onClick: handleExport,\n },\n {\n icon: <FolderOpen className=\"h-4 w-4\" />,\n id: 'import',\n label: 'Import Workflow',\n onClick: handleImport,\n },\n );\n\n // Append custom items\n if (fileMenuItemsAppend?.length) {\n items.push({ id: 'separator-append', separator: true });\n items.push(...fileMenuItemsAppend);\n }\n\n return items;\n }, [\n handleExport,\n handleImport,\n onSaveAs,\n fileMenuItemsPrepend,\n fileMenuItemsAppend,\n ]);\n\n return (\n <div className=\"flex h-14 items-center gap-3 border-b border-border bg-card px-4\">\n {/* Logo / Home Link */}\n {branding ?? (\n <a\n href={logoHref}\n title=\"Go to Dashboard\"\n className=\"flex h-6 w-6 items-center justify-center transition hover:opacity-90\"\n >\n <img src={logoSrc} alt=\"Genfeed\" className=\"h-6 w-6 object-contain\" />\n </a>\n )}\n\n {leftContent}\n\n {/* Divider */}\n <div className=\"h-8 w-px bg-border\" />\n\n {/* File Menu */}\n <ToolbarDropdown label=\"File\" items={fileMenuItems} />\n\n {/* Additional Menus */}\n {additionalMenus?.map((menu) => (\n <ToolbarDropdown\n key={menu.label}\n label={menu.label}\n items={menu.items}\n />\n ))}\n\n {/* Divider */}\n <div className=\"h-8 w-px bg-border\" />\n\n {/* Debug Mode Badge */}\n {debugMode && (\n <button\n onClick={() => openModal('settings')}\n title=\"Debug mode active - API calls are mocked\"\n className=\"flex items-center gap-1.5 rounded-md border border-amber-500/30 bg-amber-500/10 px-2 py-1 text-sm text-amber-500 transition hover:bg-amber-500/20\"\n >\n <Bug className=\"h-4 w-4\" />\n <span className=\"font-medium\">Debug</span>\n </button>\n )}\n\n {/* Auto-layout Button */}\n {onAutoLayout && (\n <button\n onClick={() => onAutoLayout('LR')}\n title=\"Auto-layout nodes\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground\"\n >\n <LayoutGrid className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Undo/Redo Buttons */}\n <button\n onClick={() => undo()}\n disabled={!canUndo}\n title=\"Undo (Ctrl+Z)\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n >\n <Undo2 className=\"h-4 w-4\" />\n </button>\n <button\n onClick={() => redo()}\n disabled={!canRedo}\n title=\"Redo (Ctrl+Shift+Z)\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\"\n >\n <Redo2 className=\"h-4 w-4\" />\n </button>\n\n {/* Auto-Save Indicator */}\n {saveIndicator ?? <SaveIndicator />}\n\n {middleContent}\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Additional right-side content */}\n {rightContent}\n\n {/* Shortcut Help */}\n {showShortcutHelp && (\n <button\n onClick={() => openModal('shortcutHelp')}\n title=\"Keyboard shortcuts\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground\"\n >\n <HelpCircle className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Settings */}\n {showSettings && (\n <button\n onClick={() => openModal('settings')}\n title=\"Settings\"\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground\"\n >\n <Settings className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Validation Errors Toast */}\n {uniqueErrorMessages.length > 0 && (\n <div className=\"fixed right-4 top-20 z-50 max-w-sm rounded-lg border border-destructive/30 bg-destructive/10 p-4 shadow-xl\">\n <div className=\"flex items-start gap-3\">\n <AlertCircle className=\"mt-0.5 h-5 w-5 shrink-0 text-destructive\" />\n <div className=\"min-w-0 flex-1\">\n <h4 className=\"mb-2 text-sm font-medium text-destructive\">\n Cannot run workflow\n </h4>\n <ul className=\"space-y-1\">\n {uniqueErrorMessages.slice(0, 5).map((message) => (\n <li key={message} className=\"text-xs text-destructive/80\">\n {message}\n </li>\n ))}\n {uniqueErrorMessages.length > 5 && (\n <li className=\"text-xs text-destructive/60\">\n +{uniqueErrorMessages.length - 5} more errors\n </li>\n )}\n </ul>\n </div>\n <button\n onClick={clearValidationErrors}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-destructive transition hover:bg-destructive/20\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n\n {/* Save As Dialog */}\n <SaveAsDialog\n isOpen={showSaveAsDialog}\n currentName={workflowName}\n onSave={handleSaveAs}\n onClose={() => setShowSaveAsDialog(false)}\n />\n </div>\n );\n}\n"]}
@@ -136,3 +136,5 @@ var usePromptLibraryStore = create((set, get) => ({
136
136
  }));
137
137
 
138
138
  export { configurePromptLibrary, usePromptLibraryStore };
139
+ //# sourceMappingURL=chunk-4JOFNZW6.mjs.map
140
+ //# sourceMappingURL=chunk-4JOFNZW6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/promptLibraryStore.ts"],"names":[],"mappings":"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","file":"chunk-4JOFNZW6.mjs","sourcesContent":["import type {\n ICreatePrompt,\n IPrompt,\n IQueryPrompts,\n PromptCategory,\n} from '@genfeedai/types';\nimport { create } from 'zustand';\nimport type { PromptLibraryService } from '../provider/types';\n\n// =============================================================================\n// Module-level API configuration\n// =============================================================================\n\nlet _promptApi: PromptLibraryService | null = null;\n\n/**\n * Configure the prompt library store with an API service.\n * Called by WorkflowUIProvider when a promptLibrary service is provided.\n *\n * This pattern is used because Zustand stores exist outside the React tree\n * and cannot use useContext directly.\n */\nexport function configurePromptLibrary(api: PromptLibraryService): void {\n _promptApi = api;\n}\n\n// =============================================================================\n// Store\n// =============================================================================\n\ninterface PromptLibraryStore {\n // State\n items: IPrompt[];\n featuredItems: IPrompt[];\n selectedItem: IPrompt | null;\n isLoading: boolean;\n error: string | null;\n\n // Filters\n searchQuery: string;\n categoryFilter: PromptCategory | null;\n\n // Quick picker state (for dropdown in nodes)\n isPickerOpen: boolean;\n\n // Modal state\n isCreateModalOpen: boolean;\n editingItem: IPrompt | null;\n\n // Actions - UI\n setSearchQuery: (query: string) => void;\n setCategoryFilter: (category: PromptCategory | null) => void;\n setSelectedItem: (item: IPrompt | null) => void;\n openPicker: () => void;\n closePicker: () => void;\n openCreateModal: (editItem?: IPrompt) => void;\n closeCreateModal: () => void;\n\n // Actions - API\n loadItems: (query?: IQueryPrompts, signal?: AbortSignal) => Promise<void>;\n loadFeatured: (signal?: AbortSignal) => Promise<void>;\n createItem: (data: ICreatePrompt, signal?: AbortSignal) => Promise<IPrompt>;\n updateItem: (\n id: string,\n data: Partial<ICreatePrompt>,\n signal?: AbortSignal,\n ) => Promise<IPrompt>;\n deleteItem: (id: string, signal?: AbortSignal) => Promise<void>;\n duplicateItem: (id: string, signal?: AbortSignal) => Promise<IPrompt>;\n recordItemUsage: (id: string, signal?: AbortSignal) => Promise<IPrompt>;\n}\n\nexport const usePromptLibraryStore = create<PromptLibraryStore>((set, get) => ({\n categoryFilter: null,\n\n closeCreateModal: () =>\n set({\n editingItem: null,\n isCreateModalOpen: false,\n }),\n\n closePicker: () => set({ isPickerOpen: false }),\n\n createItem: async (data, signal) => {\n if (!_promptApi) throw new Error('Prompt library not configured');\n set({ error: null, isLoading: true });\n try {\n const item = await _promptApi.create(data, signal);\n set((state) => ({\n editingItem: null,\n isCreateModalOpen: false,\n isLoading: false,\n items: [item, ...state.items],\n }));\n return item;\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n throw error;\n }\n },\n\n deleteItem: async (id, signal) => {\n if (!_promptApi) throw new Error('Prompt library not configured');\n try {\n await _promptApi.delete(id, signal);\n set((state) => ({\n items: state.items.filter((i) => i._id !== id),\n selectedItem:\n state.selectedItem?._id === id ? null : state.selectedItem,\n }));\n } catch (error) {\n set({ error: (error as Error).message });\n throw error;\n }\n },\n\n duplicateItem: async (id, signal) => {\n if (!_promptApi) throw new Error('Prompt library not configured');\n try {\n const item = await _promptApi.duplicate(id, signal);\n set((state) => ({\n items: [item, ...state.items],\n }));\n return item;\n } catch (error) {\n set({ error: (error as Error).message });\n throw error;\n }\n },\n editingItem: null,\n error: null,\n featuredItems: [],\n isCreateModalOpen: false,\n isLoading: false,\n isPickerOpen: false,\n // Initial state\n items: [],\n\n loadFeatured: async (signal) => {\n if (!_promptApi) return;\n try {\n const featuredItems = await _promptApi.getFeatured(10, signal);\n set({ featuredItems });\n } catch (error) {\n if ((error as Error).name !== 'AbortError') {\n // Silently fail for featured items\n }\n }\n },\n\n // API Actions — all no-op if _promptApi is not configured\n loadItems: async (query, signal) => {\n if (!_promptApi) return;\n set({ error: null, isLoading: true });\n try {\n const { searchQuery, categoryFilter } = get();\n const finalQuery: IQueryPrompts = {\n ...query,\n category: query?.category ?? categoryFilter ?? undefined,\n search: query?.search ?? (searchQuery || undefined),\n };\n const items = await _promptApi.getAll(finalQuery, signal);\n set({ isLoading: false, items });\n } catch (error) {\n if ((error as Error).name !== 'AbortError') {\n set({ error: (error as Error).message, isLoading: false });\n }\n }\n },\n\n openCreateModal: (editItem) =>\n set({\n editingItem: editItem ?? null,\n isCreateModalOpen: true,\n }),\n\n openPicker: () => set({ isPickerOpen: true }),\n\n recordItemUsage: async (id, signal) => {\n if (!_promptApi) throw new Error('Prompt library not configured');\n try {\n const item = await _promptApi.use(id, signal);\n set((state) => ({\n isPickerOpen: false,\n items: state.items.map((i) => (i._id === id ? item : i)),\n }));\n return item;\n } catch (error) {\n set({ error: (error as Error).message });\n throw error;\n }\n },\n searchQuery: '',\n selectedItem: null,\n\n setCategoryFilter: (category) => set({ categoryFilter: category }),\n\n // UI Actions\n setSearchQuery: (query) => set({ searchQuery: query }),\n\n setSelectedItem: (item) => set({ selectedItem: item }),\n\n updateItem: async (id, data, signal) => {\n if (!_promptApi) throw new Error('Prompt library not configured');\n set({ error: null, isLoading: true });\n try {\n const item = await _promptApi.update(id, data, signal);\n set((state) => ({\n editingItem: null,\n isCreateModalOpen: false,\n isLoading: false,\n items: state.items.map((i) => (i._id === id ? item : i)),\n selectedItem:\n state.selectedItem?._id === id ? item : state.selectedItem,\n }));\n return item;\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n throw error;\n }\n },\n}));\n"]}