@genfeedai/types 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/{chunk-KXAKQO3U.js → chunk-74STGUJY.js} +2 -0
  2. package/dist/chunk-74STGUJY.js.map +1 -0
  3. package/dist/{chunk-WT2F5CAF.mjs → chunk-CVFAILC4.mjs} +2 -0
  4. package/dist/chunk-CVFAILC4.mjs.map +1 -0
  5. package/dist/chunk-DVR3GE4F.js +4 -0
  6. package/dist/chunk-DVR3GE4F.js.map +1 -0
  7. package/dist/chunk-G2BD5ZTF.mjs +3 -0
  8. package/dist/chunk-G2BD5ZTF.mjs.map +1 -0
  9. package/dist/{chunk-P4XY3T5T.js → chunk-MRTGK3CK.js} +601 -578
  10. package/dist/chunk-MRTGK3CK.js.map +1 -0
  11. package/dist/{chunk-QNWQE2LJ.mjs → chunk-ZMENGANG.mjs} +601 -578
  12. package/dist/chunk-ZMENGANG.mjs.map +1 -0
  13. package/dist/comfyui.d.mts +44 -44
  14. package/dist/comfyui.d.ts +44 -44
  15. package/dist/comfyui.js +3 -1
  16. package/dist/comfyui.js.map +1 -0
  17. package/dist/comfyui.mjs +3 -1
  18. package/dist/comfyui.mjs.map +1 -0
  19. package/dist/index.d.mts +341 -3
  20. package/dist/index.d.ts +341 -3
  21. package/dist/index.js +28 -26
  22. package/dist/index.js.map +1 -0
  23. package/dist/index.mjs +11 -9
  24. package/dist/index.mjs.map +1 -0
  25. package/dist/nodes.d.mts +2 -2
  26. package/dist/nodes.d.ts +2 -2
  27. package/dist/nodes.js +15 -13
  28. package/dist/nodes.js.map +1 -0
  29. package/dist/nodes.mjs +3 -1
  30. package/dist/nodes.mjs.map +1 -0
  31. package/dist/replicate.js +2 -0
  32. package/dist/replicate.js.map +1 -0
  33. package/dist/replicate.mjs +2 -0
  34. package/dist/replicate.mjs.map +1 -0
  35. package/dist/{union-BVaWc1Cx.d.mts → union-D5EesBEB.d.mts} +142 -142
  36. package/dist/{union-BVaWc1Cx.d.ts → union-D5EesBEB.d.ts} +142 -142
  37. package/dist/{workflow-B_Q38s-U.d.ts → workflow-Cd_F9hZk.d.ts} +1 -1
  38. package/dist/{workflow-BbAp7VSK.d.mts → workflow-D9M1Yoiy.d.mts} +1 -1
  39. package/dist/workflow.d.mts +2 -2
  40. package/dist/workflow.d.ts +2 -2
  41. package/dist/workflow.js +4 -2
  42. package/dist/workflow.js.map +1 -0
  43. package/dist/workflow.mjs +3 -1
  44. package/dist/workflow.mjs.map +1 -0
  45. package/package.json +37 -37
  46. package/src/replicate/schemas.json +319 -319
  47. package/dist/chunk-7NJUD2WZ.mjs +0 -1
  48. package/dist/chunk-RNGYPX4W.js +0 -2
@@ -1,45 +1,45 @@
1
- // src/nodes/handles.ts
2
- var HandleTypeEnum = /* @__PURE__ */ ((HandleTypeEnum2) => {
3
- HandleTypeEnum2["IMAGE"] = "image";
4
- HandleTypeEnum2["TEXT"] = "text";
5
- HandleTypeEnum2["VIDEO"] = "video";
6
- HandleTypeEnum2["NUMBER"] = "number";
7
- HandleTypeEnum2["AUDIO"] = "audio";
8
- return HandleTypeEnum2;
9
- })(HandleTypeEnum || {});
10
- var CONNECTION_RULES = {
11
- image: ["image"],
12
- text: ["text"],
13
- video: ["video"],
14
- number: ["number"],
15
- audio: ["audio"]
16
- };
17
-
18
- // src/nodes/providers.ts
19
- var ProviderTypeEnum = /* @__PURE__ */ ((ProviderTypeEnum2) => {
20
- ProviderTypeEnum2["REPLICATE"] = "replicate";
21
- ProviderTypeEnum2["FAL"] = "fal";
22
- ProviderTypeEnum2["HUGGINGFACE"] = "huggingface";
23
- ProviderTypeEnum2["GENFEED_AI"] = "genfeed-ai";
24
- return ProviderTypeEnum2;
25
- })(ProviderTypeEnum || {});
26
- var ModelCapabilityEnum = /* @__PURE__ */ ((ModelCapabilityEnum2) => {
27
- ModelCapabilityEnum2["TEXT_TO_IMAGE"] = "text-to-image";
28
- ModelCapabilityEnum2["IMAGE_TO_IMAGE"] = "image-to-image";
29
- ModelCapabilityEnum2["TEXT_TO_VIDEO"] = "text-to-video";
30
- ModelCapabilityEnum2["IMAGE_TO_VIDEO"] = "image-to-video";
31
- ModelCapabilityEnum2["TEXT_GENERATION"] = "text-generation";
32
- return ModelCapabilityEnum2;
33
- })(ModelCapabilityEnum || {});
34
- var ModelUseCaseEnum = /* @__PURE__ */ ((ModelUseCaseEnum2) => {
35
- ModelUseCaseEnum2["STYLE_TRANSFER"] = "style-transfer";
36
- ModelUseCaseEnum2["CHARACTER_CONSISTENT"] = "character-consistent";
37
- ModelUseCaseEnum2["IMAGE_VARIATION"] = "image-variation";
38
- ModelUseCaseEnum2["INPAINTING"] = "inpainting";
39
- ModelUseCaseEnum2["UPSCALE"] = "upscale";
40
- ModelUseCaseEnum2["GENERAL"] = "general";
41
- return ModelUseCaseEnum2;
42
- })(ModelUseCaseEnum || {});
1
+ // src/enums.ts
2
+ var WorkflowTemplateCategory = /* @__PURE__ */ ((WorkflowTemplateCategory2) => {
3
+ WorkflowTemplateCategory2["IMAGE"] = "image";
4
+ WorkflowTemplateCategory2["VIDEO"] = "video";
5
+ WorkflowTemplateCategory2["AUDIO"] = "audio";
6
+ WorkflowTemplateCategory2["FULL_PIPELINE"] = "full-pipeline";
7
+ return WorkflowTemplateCategory2;
8
+ })(WorkflowTemplateCategory || {});
9
+ var ReframeNodeType = /* @__PURE__ */ ((ReframeNodeType2) => {
10
+ ReframeNodeType2["REFRAME"] = "reframe";
11
+ ReframeNodeType2["LUMA_REFRAME_IMAGE"] = "lumaReframeImage";
12
+ ReframeNodeType2["LUMA_REFRAME_VIDEO"] = "lumaReframeVideo";
13
+ return ReframeNodeType2;
14
+ })(ReframeNodeType || {});
15
+ var UpscaleNodeType = /* @__PURE__ */ ((UpscaleNodeType2) => {
16
+ UpscaleNodeType2["UPSCALE"] = "upscale";
17
+ UpscaleNodeType2["TOPAZ_IMAGE_UPSCALE"] = "topazImageUpscale";
18
+ UpscaleNodeType2["TOPAZ_VIDEO_UPSCALE"] = "topazVideoUpscale";
19
+ return UpscaleNodeType2;
20
+ })(UpscaleNodeType || {});
21
+ var KlingQuality = /* @__PURE__ */ ((KlingQuality2) => {
22
+ KlingQuality2["STANDARD"] = "std";
23
+ KlingQuality2["PRO"] = "pro";
24
+ return KlingQuality2;
25
+ })(KlingQuality || {});
26
+ var ProcessingNodeType = /* @__PURE__ */ ((ProcessingNodeType2) => {
27
+ ProcessingNodeType2["REFRAME"] = "reframe";
28
+ ProcessingNodeType2["LUMA_REFRAME_IMAGE"] = "lumaReframeImage";
29
+ ProcessingNodeType2["LUMA_REFRAME_VIDEO"] = "lumaReframeVideo";
30
+ ProcessingNodeType2["UPSCALE"] = "upscale";
31
+ ProcessingNodeType2["TOPAZ_IMAGE_UPSCALE"] = "topazImageUpscale";
32
+ ProcessingNodeType2["TOPAZ_VIDEO_UPSCALE"] = "topazVideoUpscale";
33
+ ProcessingNodeType2["VIDEO_FRAME_EXTRACT"] = "videoFrameExtract";
34
+ ProcessingNodeType2["LIP_SYNC"] = "lipSync";
35
+ ProcessingNodeType2["TEXT_TO_SPEECH"] = "textToSpeech";
36
+ ProcessingNodeType2["VOICE_CHANGE"] = "voiceChange";
37
+ ProcessingNodeType2["TRANSCRIBE"] = "transcribe";
38
+ ProcessingNodeType2["SUBTITLE"] = "subtitle";
39
+ ProcessingNodeType2["VIDEO_STITCH"] = "videoStitch";
40
+ ProcessingNodeType2["WORKFLOW_REF"] = "workflowRef";
41
+ return ProcessingNodeType2;
42
+ })(ProcessingNodeType || {});
43
43
 
44
44
  // src/nodes/base.ts
45
45
  var NodeTypeEnum = /* @__PURE__ */ ((NodeTypeEnum2) => {
@@ -91,677 +91,691 @@ var NodeStatusEnum = /* @__PURE__ */ ((NodeStatusEnum2) => {
91
91
  return NodeStatusEnum2;
92
92
  })(NodeStatusEnum || {});
93
93
 
94
- // src/enums.ts
95
- var WorkflowTemplateCategory = /* @__PURE__ */ ((WorkflowTemplateCategory2) => {
96
- WorkflowTemplateCategory2["IMAGE"] = "image";
97
- WorkflowTemplateCategory2["VIDEO"] = "video";
98
- WorkflowTemplateCategory2["AUDIO"] = "audio";
99
- WorkflowTemplateCategory2["FULL_PIPELINE"] = "full-pipeline";
100
- return WorkflowTemplateCategory2;
101
- })(WorkflowTemplateCategory || {});
102
- var ReframeNodeType = /* @__PURE__ */ ((ReframeNodeType2) => {
103
- ReframeNodeType2["REFRAME"] = "reframe";
104
- ReframeNodeType2["LUMA_REFRAME_IMAGE"] = "lumaReframeImage";
105
- ReframeNodeType2["LUMA_REFRAME_VIDEO"] = "lumaReframeVideo";
106
- return ReframeNodeType2;
107
- })(ReframeNodeType || {});
108
- var UpscaleNodeType = /* @__PURE__ */ ((UpscaleNodeType2) => {
109
- UpscaleNodeType2["UPSCALE"] = "upscale";
110
- UpscaleNodeType2["TOPAZ_IMAGE_UPSCALE"] = "topazImageUpscale";
111
- UpscaleNodeType2["TOPAZ_VIDEO_UPSCALE"] = "topazVideoUpscale";
112
- return UpscaleNodeType2;
113
- })(UpscaleNodeType || {});
114
- var KlingQuality = /* @__PURE__ */ ((KlingQuality2) => {
115
- KlingQuality2["STANDARD"] = "std";
116
- KlingQuality2["PRO"] = "pro";
117
- return KlingQuality2;
118
- })(KlingQuality || {});
119
- var ProcessingNodeType = /* @__PURE__ */ ((ProcessingNodeType2) => {
120
- ProcessingNodeType2["REFRAME"] = "reframe";
121
- ProcessingNodeType2["LUMA_REFRAME_IMAGE"] = "lumaReframeImage";
122
- ProcessingNodeType2["LUMA_REFRAME_VIDEO"] = "lumaReframeVideo";
123
- ProcessingNodeType2["UPSCALE"] = "upscale";
124
- ProcessingNodeType2["TOPAZ_IMAGE_UPSCALE"] = "topazImageUpscale";
125
- ProcessingNodeType2["TOPAZ_VIDEO_UPSCALE"] = "topazVideoUpscale";
126
- ProcessingNodeType2["VIDEO_FRAME_EXTRACT"] = "videoFrameExtract";
127
- ProcessingNodeType2["LIP_SYNC"] = "lipSync";
128
- ProcessingNodeType2["TEXT_TO_SPEECH"] = "textToSpeech";
129
- ProcessingNodeType2["VOICE_CHANGE"] = "voiceChange";
130
- ProcessingNodeType2["TRANSCRIBE"] = "transcribe";
131
- ProcessingNodeType2["SUBTITLE"] = "subtitle";
132
- ProcessingNodeType2["VIDEO_STITCH"] = "videoStitch";
133
- ProcessingNodeType2["WORKFLOW_REF"] = "workflowRef";
134
- return ProcessingNodeType2;
135
- })(ProcessingNodeType || {});
94
+ // src/nodes/handles.ts
95
+ var HandleTypeEnum = /* @__PURE__ */ ((HandleTypeEnum2) => {
96
+ HandleTypeEnum2["IMAGE"] = "image";
97
+ HandleTypeEnum2["TEXT"] = "text";
98
+ HandleTypeEnum2["VIDEO"] = "video";
99
+ HandleTypeEnum2["NUMBER"] = "number";
100
+ HandleTypeEnum2["AUDIO"] = "audio";
101
+ return HandleTypeEnum2;
102
+ })(HandleTypeEnum || {});
103
+ var CONNECTION_RULES = {
104
+ audio: ["audio"],
105
+ image: ["image"],
106
+ number: ["number"],
107
+ text: ["text"],
108
+ video: ["video"]
109
+ };
110
+
111
+ // src/nodes/providers.ts
112
+ var ProviderTypeEnum = /* @__PURE__ */ ((ProviderTypeEnum2) => {
113
+ ProviderTypeEnum2["REPLICATE"] = "replicate";
114
+ ProviderTypeEnum2["FAL"] = "fal";
115
+ ProviderTypeEnum2["HUGGINGFACE"] = "huggingface";
116
+ ProviderTypeEnum2["GENFEED_AI"] = "genfeed-ai";
117
+ return ProviderTypeEnum2;
118
+ })(ProviderTypeEnum || {});
119
+ var ModelCapabilityEnum = /* @__PURE__ */ ((ModelCapabilityEnum2) => {
120
+ ModelCapabilityEnum2["TEXT_TO_IMAGE"] = "text-to-image";
121
+ ModelCapabilityEnum2["IMAGE_TO_IMAGE"] = "image-to-image";
122
+ ModelCapabilityEnum2["TEXT_TO_VIDEO"] = "text-to-video";
123
+ ModelCapabilityEnum2["IMAGE_TO_VIDEO"] = "image-to-video";
124
+ ModelCapabilityEnum2["TEXT_GENERATION"] = "text-generation";
125
+ return ModelCapabilityEnum2;
126
+ })(ModelCapabilityEnum || {});
127
+ var ModelUseCaseEnum = /* @__PURE__ */ ((ModelUseCaseEnum2) => {
128
+ ModelUseCaseEnum2["STYLE_TRANSFER"] = "style-transfer";
129
+ ModelUseCaseEnum2["CHARACTER_CONSISTENT"] = "character-consistent";
130
+ ModelUseCaseEnum2["IMAGE_VARIATION"] = "image-variation";
131
+ ModelUseCaseEnum2["INPAINTING"] = "inpainting";
132
+ ModelUseCaseEnum2["UPSCALE"] = "upscale";
133
+ ModelUseCaseEnum2["GENERAL"] = "general";
134
+ return ModelUseCaseEnum2;
135
+ })(ModelUseCaseEnum || {});
136
136
 
137
137
  // src/nodes/registry.ts
138
138
  var NODE_DEFINITIONS = {
139
- // Input nodes
140
- imageInput: {
141
- type: "imageInput",
142
- label: "Image",
143
- description: "Upload or reference an image",
144
- category: "input",
145
- icon: "Image",
146
- inputs: [],
147
- outputs: [{ id: "image", type: "image", label: "Image" }],
139
+ animation: {
140
+ category: "processing",
148
141
  defaultData: {
149
- label: "Image",
150
- status: "idle",
151
- image: null,
152
- filename: null,
153
- dimensions: null,
154
- source: "upload"
155
- }
142
+ curveType: "preset",
143
+ customCurve: [0.645, 0.045, 0.355, 1],
144
+ inputVideo: null,
145
+ label: "Animation",
146
+ outputVideo: null,
147
+ preset: "easeInOutCubic",
148
+ speedMultiplier: 1,
149
+ status: "idle"
150
+ },
151
+ description: "Apply easing curve to video",
152
+ icon: "Wand2",
153
+ inputs: [{ id: "video", label: "Video", required: true, type: "video" }],
154
+ label: "Animation",
155
+ outputs: [{ id: "video", label: "Animated Video", type: "video" }],
156
+ type: "animation"
156
157
  },
157
- prompt: {
158
- type: "prompt",
159
- label: "Prompt",
160
- description: "Text prompt for AI generation",
161
- category: "input",
162
- icon: "MessageSquare",
163
- inputs: [],
164
- outputs: [{ id: "text", type: "text", label: "Prompt" }],
158
+ annotation: {
159
+ category: "processing",
165
160
  defaultData: {
166
- label: "Prompt",
167
- status: "idle",
168
- prompt: "",
169
- variables: {}
170
- }
161
+ annotations: [],
162
+ hasAnnotations: false,
163
+ inputImage: null,
164
+ label: "Annotation",
165
+ outputImage: null,
166
+ status: "idle"
167
+ },
168
+ description: "Add shapes, arrows, and text to images",
169
+ icon: "Pencil",
170
+ inputs: [{ id: "image", label: "Image", required: true, type: "image" }],
171
+ label: "Annotation",
172
+ outputs: [{ id: "image", label: "Annotated Image", type: "image" }],
173
+ type: "annotation"
171
174
  },
172
175
  audioInput: {
173
- type: "audioInput",
174
- label: "Audio",
175
- description: "Upload an audio file (MP3, WAV)",
176
176
  category: "input",
177
- icon: "Volume2",
178
- inputs: [],
179
- outputs: [{ id: "audio", type: "audio", label: "Audio" }],
180
177
  defaultData: {
181
- label: "Audio",
182
- status: "idle",
183
178
  audio: null,
184
- filename: null,
185
179
  duration: null,
186
- source: "upload"
187
- }
188
- },
189
- videoInput: {
190
- type: "videoInput",
191
- label: "Video",
192
- description: "Upload or reference a video file",
193
- category: "input",
194
- icon: "FileVideo",
180
+ filename: null,
181
+ label: "Audio",
182
+ source: "upload",
183
+ status: "idle"
184
+ },
185
+ description: "Upload an audio file (MP3, WAV)",
186
+ icon: "Volume2",
195
187
  inputs: [],
196
- outputs: [{ id: "video", type: "video", label: "Video" }],
188
+ label: "Audio",
189
+ outputs: [{ id: "audio", label: "Audio", type: "audio" }],
190
+ type: "audioInput"
191
+ },
192
+ // Output nodes
193
+ download: {
194
+ category: "output",
197
195
  defaultData: {
198
- label: "Video",
199
- status: "idle",
200
- video: null,
201
- filename: null,
202
- duration: null,
203
- dimensions: null,
204
- source: "upload"
205
- }
196
+ inputImage: null,
197
+ inputType: null,
198
+ inputVideo: null,
199
+ label: "Download",
200
+ outputName: "output",
201
+ status: "idle"
202
+ },
203
+ description: "Download workflow output with custom filename",
204
+ icon: "Download",
205
+ inputs: [
206
+ { id: "image", label: "Image", type: "image" },
207
+ { id: "video", label: "Video", type: "video" }
208
+ ],
209
+ label: "Download",
210
+ outputs: [],
211
+ type: "download"
206
212
  },
207
- promptConstructor: {
208
- type: "promptConstructor",
209
- label: "Prompt Constructor",
210
- description: "Template-based prompt with @variable interpolation from connected Prompt nodes",
211
- category: "input",
212
- icon: "Puzzle",
213
- inputs: [{ id: "text", type: "text", label: "Variables", multiple: true }],
214
- outputs: [{ id: "text", type: "text", label: "Prompt" }],
213
+ imageCompare: {
214
+ category: "output",
215
215
  defaultData: {
216
- label: "Prompt Constructor",
217
- status: "idle",
218
- template: "",
219
- outputText: null,
220
- unresolvedVars: []
221
- }
216
+ imageA: null,
217
+ imageB: null,
218
+ label: "Image Compare",
219
+ status: "idle"
220
+ },
221
+ description: "Side-by-side A/B comparison with draggable slider",
222
+ icon: "Columns2",
223
+ inputs: [
224
+ { id: "image", label: "Image A", type: "image" },
225
+ { id: "image-1", label: "Image B", type: "image" }
226
+ ],
227
+ label: "Image Compare",
228
+ outputs: [],
229
+ type: "imageCompare"
222
230
  },
223
231
  // AI nodes
224
232
  imageGen: {
225
- type: "imageGen",
226
- label: "Image Generator",
227
- description: "Generate images with nano-banana models",
228
233
  category: "ai",
229
- icon: "Sparkles",
230
- inputs: [
231
- { id: "prompt", type: "text", label: "Prompt", required: true },
232
- { id: "images", type: "image", label: "Reference Images", multiple: true }
233
- ],
234
- outputs: [{ id: "image", type: "image", label: "Generated Image" }],
235
234
  defaultData: {
236
- label: "Image Generator",
237
- status: "idle",
235
+ aspectRatio: "1:1",
238
236
  inputImages: [],
239
237
  inputPrompt: null,
238
+ jobId: null,
239
+ label: "Image Generator",
240
+ model: "nano-banana-pro",
241
+ outputFormat: "jpg",
240
242
  outputImage: null,
241
243
  outputImages: [],
242
- model: "nano-banana-pro",
243
- aspectRatio: "1:1",
244
244
  resolution: "2K",
245
+ status: "idle"
246
+ },
247
+ description: "Generate images with nano-banana models",
248
+ icon: "Sparkles",
249
+ inputs: [
250
+ { id: "prompt", label: "Prompt", required: true, type: "text" },
251
+ {
252
+ id: "images",
253
+ label: "Reference Images",
254
+ multiple: true,
255
+ type: "image"
256
+ }
257
+ ],
258
+ label: "Image Generator",
259
+ outputs: [{ id: "image", label: "Generated Image", type: "image" }],
260
+ type: "imageGen"
261
+ },
262
+ imageGridSplit: {
263
+ category: "processing",
264
+ defaultData: {
265
+ borderInset: 10,
266
+ gridCols: 3,
267
+ gridRows: 2,
268
+ inputImage: null,
269
+ label: "Grid Split",
245
270
  outputFormat: "jpg",
246
- jobId: null
247
- }
271
+ outputImages: [],
272
+ quality: 95,
273
+ status: "idle"
274
+ },
275
+ description: "Split image into grid cells",
276
+ icon: "Grid3X3",
277
+ inputs: [{ id: "image", label: "Image", required: true, type: "image" }],
278
+ label: "Grid Split",
279
+ outputs: [
280
+ { id: "images", label: "Split Images", multiple: true, type: "image" }
281
+ ],
282
+ type: "imageGridSplit"
248
283
  },
249
- videoGen: {
250
- type: "videoGen",
251
- label: "Video Generator",
252
- description: "Generate videos with veo-3.1 models",
284
+ // Input nodes
285
+ imageInput: {
286
+ category: "input",
287
+ defaultData: {
288
+ dimensions: null,
289
+ filename: null,
290
+ image: null,
291
+ label: "Image",
292
+ source: "upload",
293
+ status: "idle"
294
+ },
295
+ description: "Upload or reference an image",
296
+ icon: "Image",
297
+ inputs: [],
298
+ label: "Image",
299
+ outputs: [{ id: "image", label: "Image", type: "image" }],
300
+ type: "imageInput"
301
+ },
302
+ lipSync: {
253
303
  category: "ai",
254
- icon: "Video",
255
- inputs: [
256
- { id: "prompt", type: "text", label: "Prompt", required: true },
257
- { id: "image", type: "image", label: "Starting Frame" },
258
- { id: "lastFrame", type: "image", label: "Last Frame (interpolation)" }
259
- ],
260
- outputs: [{ id: "video", type: "video", label: "Generated Video" }],
261
304
  defaultData: {
262
- label: "Video Generator",
263
- status: "idle",
305
+ activeSpeaker: false,
306
+ inputAudio: null,
264
307
  inputImage: null,
265
- lastFrame: null,
266
- referenceImages: [],
267
- inputPrompt: null,
268
- negativePrompt: "",
308
+ inputVideo: null,
309
+ jobId: null,
310
+ label: "Lip Sync",
311
+ model: "sync/lipsync-2",
269
312
  outputVideo: null,
270
- model: "veo-3.1-fast",
271
- duration: 8,
272
- aspectRatio: "16:9",
273
- resolution: "1080p",
274
- generateAudio: true,
275
- jobId: null
276
- }
313
+ status: "idle",
314
+ syncMode: "loop",
315
+ temperature: 0.5
316
+ },
317
+ description: "Generate talking-head video from image/video and audio using Replicate",
318
+ icon: "Mic",
319
+ inputs: [
320
+ { id: "image", label: "Face Image", type: "image" },
321
+ { id: "video", label: "Source Video", type: "video" },
322
+ { id: "audio", label: "Audio", required: true, type: "audio" }
323
+ ],
324
+ label: "Lip Sync",
325
+ outputs: [{ id: "video", label: "Generated Video", type: "video" }],
326
+ type: "lipSync"
277
327
  },
278
328
  llm: {
279
- type: "llm",
280
- label: "LLM",
281
- description: "Generate text with meta-llama",
282
329
  category: "ai",
283
- icon: "Brain",
284
- inputs: [{ id: "prompt", type: "text", label: "Prompt", required: true }],
285
- outputs: [{ id: "text", type: "text", label: "Generated Text" }],
286
330
  defaultData: {
287
- label: "LLM",
288
- status: "idle",
289
331
  inputPrompt: null,
290
- outputText: null,
332
+ jobId: null,
333
+ label: "LLM",
334
+ maxTokens: 1024,
291
335
  model: "meta-llama-3.1-405b-instruct",
336
+ outputText: null,
337
+ status: "idle",
292
338
  systemPrompt: "You are a creative assistant helping generate content prompts.",
293
339
  temperature: 0.7,
294
- maxTokens: 1024,
295
- topP: 0.9,
296
- jobId: null
297
- }
340
+ topP: 0.9
341
+ },
342
+ description: "Generate text with meta-llama",
343
+ icon: "Brain",
344
+ inputs: [{ id: "prompt", label: "Prompt", required: true, type: "text" }],
345
+ label: "LLM",
346
+ outputs: [{ id: "text", label: "Generated Text", type: "text" }],
347
+ type: "llm"
298
348
  },
299
- lipSync: {
300
- type: "lipSync",
301
- label: "Lip Sync",
302
- description: "Generate talking-head video from image/video and audio using Replicate",
349
+ motionControl: {
303
350
  category: "ai",
304
- icon: "Mic",
305
- inputs: [
306
- { id: "image", type: "image", label: "Face Image" },
307
- { id: "video", type: "video", label: "Source Video" },
308
- { id: "audio", type: "audio", label: "Audio", required: true }
309
- ],
310
- outputs: [{ id: "video", type: "video", label: "Generated Video" }],
311
351
  defaultData: {
312
- label: "Lip Sync",
313
- status: "idle",
352
+ aspectRatio: "16:9",
353
+ cameraIntensity: 50,
354
+ cameraMovement: "static",
355
+ characterOrientation: "image",
356
+ duration: 5,
314
357
  inputImage: null,
358
+ inputPrompt: null,
315
359
  inputVideo: null,
316
- inputAudio: null,
360
+ jobId: null,
361
+ keepOriginalSound: true,
362
+ label: "Motion Control",
363
+ mode: "video_transfer",
364
+ motionStrength: 50,
365
+ negativePrompt: "",
317
366
  outputVideo: null,
318
- model: "sync/lipsync-2",
319
- syncMode: "loop",
320
- temperature: 0.5,
321
- activeSpeaker: false,
322
- jobId: null
323
- }
324
- },
325
- voiceChange: {
326
- type: "voiceChange",
327
- label: "Voice Change",
328
- description: "Replace or mix audio track in a video",
329
- category: "ai",
330
- icon: "AudioLines",
367
+ qualityMode: "pro",
368
+ seed: null,
369
+ status: "idle",
370
+ trajectoryPoints: []
371
+ },
372
+ description: "Generate video with precise motion control using Kling AI",
373
+ icon: "Navigation",
331
374
  inputs: [
332
- { id: "video", type: "video", label: "Video", required: true },
333
- { id: "audio", type: "audio", label: "New Audio", required: true }
375
+ { id: "image", label: "Image", required: true, type: "image" },
376
+ { id: "video", label: "Motion Video", type: "video" },
377
+ { id: "prompt", label: "Prompt", type: "text" }
334
378
  ],
335
- outputs: [{ id: "video", type: "video", label: "Output Video" }],
379
+ label: "Motion Control",
380
+ outputs: [{ id: "video", label: "Video", type: "video" }],
381
+ type: "motionControl"
382
+ },
383
+ outputGallery: {
384
+ category: "output",
336
385
  defaultData: {
337
- label: "Voice Change",
338
- status: "idle",
339
- inputVideo: null,
340
- inputAudio: null,
341
- outputVideo: null,
342
- preserveOriginalAudio: false,
343
- audioMixLevel: 0.5,
344
- jobId: null
345
- }
386
+ images: [],
387
+ label: "Output Gallery",
388
+ status: "idle"
389
+ },
390
+ description: "Thumbnail grid with lightbox for multi-image outputs",
391
+ icon: "LayoutGrid",
392
+ inputs: [{ id: "image", label: "Images", multiple: true, type: "image" }],
393
+ label: "Output Gallery",
394
+ outputs: [],
395
+ type: "outputGallery"
346
396
  },
347
- textToSpeech: {
348
- type: "textToSpeech",
349
- label: "Text to Speech",
350
- description: "Convert text to natural-sounding speech using ElevenLabs",
351
- category: "ai",
352
- icon: "AudioLines",
353
- inputs: [{ id: "text", type: "text", label: "Text", required: true }],
354
- outputs: [{ id: "audio", type: "audio", label: "Audio" }],
397
+ prompt: {
398
+ category: "input",
355
399
  defaultData: {
356
- label: "Text to Speech",
400
+ label: "Prompt",
401
+ prompt: "",
357
402
  status: "idle",
358
- inputText: null,
359
- outputAudio: null,
360
- provider: "elevenlabs",
361
- voice: "rachel",
362
- stability: 0.5,
363
- similarityBoost: 0.75,
364
- speed: 1,
365
- jobId: null
366
- }
403
+ variables: {}
404
+ },
405
+ description: "Text prompt for AI generation",
406
+ icon: "MessageSquare",
407
+ inputs: [],
408
+ label: "Prompt",
409
+ outputs: [{ id: "text", label: "Prompt", type: "text" }],
410
+ type: "prompt"
367
411
  },
368
- transcribe: {
369
- type: "transcribe",
370
- label: "Transcribe",
371
- description: "Convert video or audio to text transcript",
372
- category: "ai",
373
- icon: "FileText",
374
- inputs: [
375
- { id: "video", type: "video", label: "Video" },
376
- { id: "audio", type: "audio", label: "Audio" }
377
- ],
378
- outputs: [{ id: "text", type: "text", label: "Transcript" }],
412
+ promptConstructor: {
413
+ category: "input",
379
414
  defaultData: {
380
- label: "Transcribe",
381
- status: "idle",
382
- inputVideo: null,
383
- inputAudio: null,
415
+ label: "Prompt Constructor",
384
416
  outputText: null,
385
- language: "auto",
386
- timestamps: false,
387
- jobId: null
388
- }
417
+ status: "idle",
418
+ template: "",
419
+ unresolvedVars: []
420
+ },
421
+ description: "Template-based prompt with @variable interpolation from connected Prompt nodes",
422
+ icon: "Puzzle",
423
+ inputs: [{ id: "text", label: "Variables", multiple: true, type: "text" }],
424
+ label: "Prompt Constructor",
425
+ outputs: [{ id: "text", label: "Prompt", type: "text" }],
426
+ type: "promptConstructor"
389
427
  },
390
- motionControl: {
391
- type: "motionControl",
392
- label: "Motion Control",
393
- description: "Generate video with precise motion control using Kling AI",
394
- category: "ai",
395
- icon: "Navigation",
396
- inputs: [
397
- { id: "image", type: "image", label: "Image", required: true },
398
- { id: "video", type: "video", label: "Motion Video" },
399
- { id: "prompt", type: "text", label: "Prompt" }
400
- ],
401
- outputs: [{ id: "video", type: "video", label: "Video" }],
428
+ reframe: {
429
+ category: "processing",
402
430
  defaultData: {
403
- label: "Motion Control",
404
- status: "idle",
431
+ aspectRatio: "16:9",
432
+ gridPosition: { x: 0.5, y: 0.5 },
405
433
  inputImage: null,
434
+ inputType: null,
406
435
  inputVideo: null,
407
- inputPrompt: null,
436
+ jobId: null,
437
+ label: "Reframe",
438
+ model: "photon-flash-1",
439
+ outputImage: null,
408
440
  outputVideo: null,
409
- mode: "video_transfer",
410
- duration: 5,
411
- aspectRatio: "16:9",
412
- trajectoryPoints: [],
413
- cameraMovement: "static",
414
- cameraIntensity: 50,
415
- qualityMode: "pro",
416
- characterOrientation: "image",
417
- keepOriginalSound: true,
418
- motionStrength: 50,
419
- negativePrompt: "",
420
- seed: null,
421
- jobId: null
422
- }
441
+ prompt: "",
442
+ status: "idle"
443
+ },
444
+ description: "Reframe images or videos to different aspect ratios with AI outpainting",
445
+ icon: "Crop",
446
+ inputs: [
447
+ { id: "image", label: "Image", type: "image" },
448
+ { id: "video", label: "Video", type: "video" }
449
+ ],
450
+ label: "Reframe",
451
+ outputs: [
452
+ { id: "image", label: "Reframed Image", type: "image" },
453
+ { id: "video", label: "Reframed Video", type: "video" }
454
+ ],
455
+ type: "reframe"
423
456
  },
424
457
  // Processing nodes
425
458
  resize: {
426
- type: "resize",
427
- label: "Resize",
428
- description: "Resize images or videos to different aspect ratios using Luma AI",
429
459
  category: "processing",
430
- icon: "Maximize2",
431
- inputs: [{ id: "media", type: "image", label: "Media", required: true }],
432
- outputs: [{ id: "media", type: "image", label: "Resized Media" }],
433
460
  defaultData: {
434
- label: "Resize",
435
- status: "idle",
461
+ gridPosition: { x: 0.5, y: 0.5 },
436
462
  inputMedia: null,
437
463
  inputType: null,
464
+ jobId: null,
465
+ label: "Resize",
438
466
  outputMedia: null,
439
- targetAspectRatio: "16:9",
440
467
  prompt: "",
441
- gridPosition: { x: 0.5, y: 0.5 },
442
- jobId: null
443
- }
468
+ status: "idle",
469
+ targetAspectRatio: "16:9"
470
+ },
471
+ description: "Resize images or videos to different aspect ratios using Luma AI",
472
+ icon: "Maximize2",
473
+ inputs: [{ id: "media", label: "Media", required: true, type: "image" }],
474
+ label: "Resize",
475
+ outputs: [{ id: "media", label: "Resized Media", type: "image" }],
476
+ type: "resize"
444
477
  },
445
- animation: {
446
- type: "animation",
447
- label: "Animation",
448
- description: "Apply easing curve to video",
478
+ subtitle: {
449
479
  category: "processing",
450
- icon: "Wand2",
451
- inputs: [{ id: "video", type: "video", label: "Video", required: true }],
452
- outputs: [{ id: "video", type: "video", label: "Animated Video" }],
453
480
  defaultData: {
454
- label: "Animation",
455
- status: "idle",
481
+ backgroundColor: "rgba(0,0,0,0.7)",
482
+ fontColor: "#FFFFFF",
483
+ fontFamily: "Arial",
484
+ fontSize: 24,
485
+ inputText: null,
456
486
  inputVideo: null,
487
+ jobId: null,
488
+ label: "Subtitle",
457
489
  outputVideo: null,
458
- curveType: "preset",
459
- preset: "easeInOutCubic",
460
- customCurve: [0.645, 0.045, 0.355, 1],
461
- speedMultiplier: 1
462
- }
463
- },
464
- videoStitch: {
465
- type: "videoStitch",
466
- label: "Video Stitch",
467
- description: "Concatenate multiple videos",
468
- category: "processing",
469
- icon: "Layers",
470
- inputs: [{ id: "videos", type: "video", label: "Videos", multiple: true, required: true }],
471
- outputs: [{ id: "video", type: "video", label: "Stitched Video" }],
472
- defaultData: {
473
- label: "Video Stitch",
490
+ position: "bottom",
474
491
  status: "idle",
475
- inputVideos: [],
476
- outputVideo: null,
477
- transitionType: "crossfade",
478
- transitionDuration: 0.5,
479
- seamlessLoop: false
480
- }
492
+ style: "modern"
493
+ },
494
+ description: "Burn subtitles into video using FFmpeg",
495
+ icon: "Subtitles",
496
+ inputs: [
497
+ { id: "video", label: "Video", required: true, type: "video" },
498
+ { id: "text", label: "Subtitle Text", required: true, type: "text" }
499
+ ],
500
+ label: "Subtitle",
501
+ outputs: [{ id: "video", label: "Video with Subtitles", type: "video" }],
502
+ type: "subtitle"
481
503
  },
482
- videoTrim: {
483
- type: "videoTrim",
484
- label: "Video Trim",
485
- description: "Trim video to a specific time range",
486
- category: "processing",
487
- icon: "Scissors",
488
- inputs: [{ id: "video", type: "video", label: "Video", required: true }],
489
- outputs: [{ id: "video", type: "video", label: "Trimmed Video" }],
504
+ textToSpeech: {
505
+ category: "ai",
490
506
  defaultData: {
491
- label: "Video Trim",
507
+ inputText: null,
508
+ jobId: null,
509
+ label: "Text to Speech",
510
+ outputAudio: null,
511
+ provider: "elevenlabs",
512
+ similarityBoost: 0.75,
513
+ speed: 1,
514
+ stability: 0.5,
492
515
  status: "idle",
493
- inputVideo: null,
494
- outputVideo: null,
495
- startTime: 0,
496
- endTime: 60,
497
- duration: null,
498
- jobId: null
499
- }
516
+ voice: "rachel"
517
+ },
518
+ description: "Convert text to natural-sounding speech using ElevenLabs",
519
+ icon: "AudioLines",
520
+ inputs: [{ id: "text", label: "Text", required: true, type: "text" }],
521
+ label: "Text to Speech",
522
+ outputs: [{ id: "audio", label: "Audio", type: "audio" }],
523
+ type: "textToSpeech"
500
524
  },
501
- videoFrameExtract: {
502
- type: "videoFrameExtract",
503
- label: "Frame Extract",
504
- description: "Extract a specific frame from video as image",
505
- category: "processing",
506
- icon: "Film",
507
- inputs: [{ id: "video", type: "video", label: "Video", required: true }],
508
- outputs: [{ id: "image", type: "image", label: "Extracted Frame" }],
525
+ transcribe: {
526
+ category: "ai",
509
527
  defaultData: {
510
- label: "Frame Extract",
511
- status: "idle",
528
+ inputAudio: null,
512
529
  inputVideo: null,
513
- outputImage: null,
514
- selectionMode: "last",
515
- timestampSeconds: 0,
516
- percentagePosition: 100,
517
- videoDuration: null,
518
- jobId: null
519
- }
520
- },
521
- reframe: {
522
- type: "reframe",
523
- label: "Reframe",
524
- description: "Reframe images or videos to different aspect ratios with AI outpainting",
525
- category: "processing",
526
- icon: "Crop",
530
+ jobId: null,
531
+ label: "Transcribe",
532
+ language: "auto",
533
+ outputText: null,
534
+ status: "idle",
535
+ timestamps: false
536
+ },
537
+ description: "Convert video or audio to text transcript",
538
+ icon: "FileText",
527
539
  inputs: [
528
- { id: "image", type: "image", label: "Image" },
529
- { id: "video", type: "video", label: "Video" }
530
- ],
531
- outputs: [
532
- { id: "image", type: "image", label: "Reframed Image" },
533
- { id: "video", type: "video", label: "Reframed Video" }
540
+ { id: "video", label: "Video", type: "video" },
541
+ { id: "audio", label: "Audio", type: "audio" }
534
542
  ],
543
+ label: "Transcribe",
544
+ outputs: [{ id: "text", label: "Transcript", type: "text" }],
545
+ type: "transcribe"
546
+ },
547
+ upscale: {
548
+ category: "processing",
535
549
  defaultData: {
536
- label: "Reframe",
537
- status: "idle",
550
+ comparisonPosition: 50,
551
+ faceEnhancement: false,
552
+ faceEnhancementCreativity: 0,
553
+ faceEnhancementStrength: 80,
538
554
  inputImage: null,
539
- inputVideo: null,
540
555
  inputType: null,
556
+ inputVideo: null,
557
+ jobId: null,
558
+ label: "Upscale",
559
+ model: "topaz-standard-v2",
560
+ originalPreview: null,
561
+ outputFormat: "png",
541
562
  outputImage: null,
563
+ outputPreview: null,
542
564
  outputVideo: null,
543
- model: "photon-flash-1",
544
- aspectRatio: "16:9",
545
- prompt: "",
546
- gridPosition: { x: 0.5, y: 0.5 },
547
- jobId: null
548
- }
549
- },
550
- upscale: {
551
- type: "upscale",
552
- label: "Upscale",
565
+ showComparison: true,
566
+ status: "idle",
567
+ targetFps: 30,
568
+ targetResolution: "1080p",
569
+ upscaleFactor: "2x"
570
+ },
553
571
  description: "AI-powered upscaling for images and videos",
554
- category: "processing",
555
572
  icon: "Maximize",
556
573
  inputs: [
557
- { id: "image", type: "image", label: "Image" },
558
- { id: "video", type: "video", label: "Video" }
574
+ { id: "image", label: "Image", type: "image" },
575
+ { id: "video", label: "Video", type: "video" }
559
576
  ],
577
+ label: "Upscale",
560
578
  outputs: [
561
- { id: "image", type: "image", label: "Upscaled Image" },
562
- { id: "video", type: "video", label: "Upscaled Video" }
579
+ { id: "image", label: "Upscaled Image", type: "image" },
580
+ { id: "video", label: "Upscaled Video", type: "video" }
563
581
  ],
564
- defaultData: {
565
- label: "Upscale",
566
- status: "idle",
567
- inputImage: null,
568
- inputVideo: null,
569
- inputType: null,
570
- outputImage: null,
571
- outputVideo: null,
572
- originalPreview: null,
573
- outputPreview: null,
574
- model: "topaz-standard-v2",
575
- upscaleFactor: "2x",
576
- outputFormat: "png",
577
- faceEnhancement: false,
578
- faceEnhancementStrength: 80,
579
- faceEnhancementCreativity: 0,
580
- targetResolution: "1080p",
581
- targetFps: 30,
582
- showComparison: true,
583
- comparisonPosition: 50,
584
- jobId: null
585
- }
582
+ type: "upscale"
586
583
  },
587
- imageGridSplit: {
588
- type: "imageGridSplit",
589
- label: "Grid Split",
590
- description: "Split image into grid cells",
584
+ videoFrameExtract: {
591
585
  category: "processing",
592
- icon: "Grid3X3",
593
- inputs: [{ id: "image", type: "image", label: "Image", required: true }],
594
- outputs: [{ id: "images", type: "image", label: "Split Images", multiple: true }],
595
586
  defaultData: {
596
- label: "Grid Split",
587
+ inputVideo: null,
588
+ jobId: null,
589
+ label: "Frame Extract",
590
+ outputImage: null,
591
+ percentagePosition: 100,
592
+ selectionMode: "last",
597
593
  status: "idle",
598
- inputImage: null,
599
- outputImages: [],
600
- gridRows: 2,
601
- gridCols: 3,
602
- borderInset: 10,
603
- outputFormat: "jpg",
604
- quality: 95
605
- }
594
+ timestampSeconds: 0,
595
+ videoDuration: null
596
+ },
597
+ description: "Extract a specific frame from video as image",
598
+ icon: "Film",
599
+ inputs: [{ id: "video", label: "Video", required: true, type: "video" }],
600
+ label: "Frame Extract",
601
+ outputs: [{ id: "image", label: "Extracted Frame", type: "image" }],
602
+ type: "videoFrameExtract"
606
603
  },
607
- annotation: {
608
- type: "annotation",
609
- label: "Annotation",
610
- description: "Add shapes, arrows, and text to images",
611
- category: "processing",
612
- icon: "Pencil",
613
- inputs: [{ id: "image", type: "image", label: "Image", required: true }],
614
- outputs: [{ id: "image", type: "image", label: "Annotated Image" }],
604
+ videoGen: {
605
+ category: "ai",
615
606
  defaultData: {
616
- label: "Annotation",
617
- status: "idle",
607
+ aspectRatio: "16:9",
608
+ duration: 8,
609
+ generateAudio: true,
618
610
  inputImage: null,
619
- outputImage: null,
620
- annotations: [],
621
- hasAnnotations: false
622
- }
623
- },
624
- subtitle: {
625
- type: "subtitle",
626
- label: "Subtitle",
627
- description: "Burn subtitles into video using FFmpeg",
628
- category: "processing",
629
- icon: "Subtitles",
611
+ inputPrompt: null,
612
+ jobId: null,
613
+ label: "Video Generator",
614
+ lastFrame: null,
615
+ model: "veo-3.1-fast",
616
+ negativePrompt: "",
617
+ outputVideo: null,
618
+ referenceImages: [],
619
+ resolution: "1080p",
620
+ status: "idle"
621
+ },
622
+ description: "Generate videos with veo-3.1 models",
623
+ icon: "Video",
630
624
  inputs: [
631
- { id: "video", type: "video", label: "Video", required: true },
632
- { id: "text", type: "text", label: "Subtitle Text", required: true }
625
+ { id: "prompt", label: "Prompt", required: true, type: "text" },
626
+ { id: "image", label: "Starting Frame", type: "image" },
627
+ { id: "lastFrame", label: "Last Frame (interpolation)", type: "image" }
633
628
  ],
634
- outputs: [{ id: "video", type: "video", label: "Video with Subtitles" }],
629
+ label: "Video Generator",
630
+ outputs: [{ id: "video", label: "Generated Video", type: "video" }],
631
+ type: "videoGen"
632
+ },
633
+ videoInput: {
634
+ category: "input",
635
635
  defaultData: {
636
- label: "Subtitle",
636
+ dimensions: null,
637
+ duration: null,
638
+ filename: null,
639
+ label: "Video",
640
+ source: "upload",
637
641
  status: "idle",
638
- inputVideo: null,
639
- inputText: null,
640
- outputVideo: null,
641
- style: "modern",
642
- position: "bottom",
643
- fontSize: 24,
644
- fontColor: "#FFFFFF",
645
- backgroundColor: "rgba(0,0,0,0.7)",
646
- fontFamily: "Arial",
647
- jobId: null
648
- }
642
+ video: null
643
+ },
644
+ description: "Upload or reference a video file",
645
+ icon: "FileVideo",
646
+ inputs: [],
647
+ label: "Video",
648
+ outputs: [{ id: "video", label: "Video", type: "video" }],
649
+ type: "videoInput"
649
650
  },
650
- outputGallery: {
651
- type: "outputGallery",
652
- label: "Output Gallery",
653
- description: "Thumbnail grid with lightbox for multi-image outputs",
654
- category: "output",
655
- icon: "LayoutGrid",
656
- inputs: [{ id: "image", type: "image", label: "Images", multiple: true }],
657
- outputs: [],
651
+ videoStitch: {
652
+ category: "processing",
658
653
  defaultData: {
659
- label: "Output Gallery",
654
+ inputVideos: [],
655
+ label: "Video Stitch",
656
+ outputVideo: null,
657
+ seamlessLoop: false,
660
658
  status: "idle",
661
- images: []
662
- }
663
- },
664
- imageCompare: {
665
- type: "imageCompare",
666
- label: "Image Compare",
667
- description: "Side-by-side A/B comparison with draggable slider",
668
- category: "output",
669
- icon: "Columns2",
659
+ transitionDuration: 0.5,
660
+ transitionType: "crossfade"
661
+ },
662
+ description: "Concatenate multiple videos",
663
+ icon: "Layers",
670
664
  inputs: [
671
- { id: "image", type: "image", label: "Image A" },
672
- { id: "image-1", type: "image", label: "Image B" }
665
+ {
666
+ id: "videos",
667
+ label: "Videos",
668
+ multiple: true,
669
+ required: true,
670
+ type: "video"
671
+ }
673
672
  ],
674
- outputs: [],
673
+ label: "Video Stitch",
674
+ outputs: [{ id: "video", label: "Stitched Video", type: "video" }],
675
+ type: "videoStitch"
676
+ },
677
+ videoTrim: {
678
+ category: "processing",
675
679
  defaultData: {
676
- label: "Image Compare",
677
- status: "idle",
678
- imageA: null,
679
- imageB: null
680
- }
680
+ duration: null,
681
+ endTime: 60,
682
+ inputVideo: null,
683
+ jobId: null,
684
+ label: "Video Trim",
685
+ outputVideo: null,
686
+ startTime: 0,
687
+ status: "idle"
688
+ },
689
+ description: "Trim video to a specific time range",
690
+ icon: "Scissors",
691
+ inputs: [{ id: "video", label: "Video", required: true, type: "video" }],
692
+ label: "Video Trim",
693
+ outputs: [{ id: "video", label: "Trimmed Video", type: "video" }],
694
+ type: "videoTrim"
681
695
  },
682
- // Output nodes
683
- download: {
684
- type: "download",
685
- label: "Download",
686
- description: "Download workflow output with custom filename",
687
- category: "output",
688
- icon: "Download",
689
- inputs: [
690
- { id: "image", type: "image", label: "Image" },
691
- { id: "video", type: "video", label: "Video" }
692
- ],
693
- outputs: [],
696
+ voiceChange: {
697
+ category: "ai",
694
698
  defaultData: {
695
- label: "Download",
696
- status: "idle",
697
- inputImage: null,
699
+ audioMixLevel: 0.5,
700
+ inputAudio: null,
698
701
  inputVideo: null,
699
- inputType: null,
700
- outputName: "output"
701
- }
702
+ jobId: null,
703
+ label: "Voice Change",
704
+ outputVideo: null,
705
+ preserveOriginalAudio: false,
706
+ status: "idle"
707
+ },
708
+ description: "Replace or mix audio track in a video",
709
+ icon: "AudioLines",
710
+ inputs: [
711
+ { id: "video", label: "Video", required: true, type: "video" },
712
+ { id: "audio", label: "New Audio", required: true, type: "audio" }
713
+ ],
714
+ label: "Voice Change",
715
+ outputs: [{ id: "video", label: "Output Video", type: "video" }],
716
+ type: "voiceChange"
702
717
  },
703
718
  // Composition nodes (workflow-as-node)
704
719
  workflowInput: {
705
- type: "workflowInput",
706
- label: "Workflow Input",
707
- description: "Define an input port for when this workflow is used as a subworkflow",
708
720
  category: "composition",
709
- icon: "ArrowRightToLine",
710
- inputs: [],
711
- outputs: [{ id: "value", type: "image", label: "Value" }],
712
- // Type is dynamic based on inputType
713
721
  defaultData: {
714
- label: "Workflow Input",
715
- status: "idle",
722
+ description: "",
716
723
  inputName: "input",
717
724
  inputType: "image",
725
+ label: "Workflow Input",
718
726
  required: true,
719
- description: ""
720
- }
727
+ status: "idle"
728
+ },
729
+ description: "Define an input port for when this workflow is used as a subworkflow",
730
+ icon: "ArrowRightToLine",
731
+ inputs: [],
732
+ label: "Workflow Input",
733
+ outputs: [{ id: "value", label: "Value", type: "image" }],
734
+ // Type is dynamic based on inputType
735
+ type: "workflowInput"
721
736
  },
722
737
  workflowOutput: {
723
- type: "workflowOutput",
724
- label: "Workflow Output",
725
- description: "Define an output port for when this workflow is used as a subworkflow",
726
738
  category: "composition",
727
- icon: "ArrowLeftFromLine",
728
- inputs: [{ id: "value", type: "image", label: "Value", required: true }],
729
- // Type is dynamic based on outputType
730
- outputs: [],
731
739
  defaultData: {
740
+ description: "",
741
+ inputValue: null,
732
742
  label: "Workflow Output",
733
- status: "idle",
734
743
  outputName: "output",
735
744
  outputType: "image",
736
- description: "",
737
- inputValue: null
738
- }
745
+ status: "idle"
746
+ },
747
+ description: "Define an output port for when this workflow is used as a subworkflow",
748
+ icon: "ArrowLeftFromLine",
749
+ inputs: [{ id: "value", label: "Value", required: true, type: "image" }],
750
+ // Type is dynamic based on outputType
751
+ label: "Workflow Output",
752
+ outputs: [],
753
+ type: "workflowOutput"
739
754
  },
740
755
  workflowRef: {
741
- type: "workflowRef",
742
- label: "Subworkflow",
743
- description: "Reference another workflow as a subworkflow",
744
756
  category: "composition",
757
+ defaultData: {
758
+ cachedInterface: null,
759
+ childExecutionId: null,
760
+ inputMappings: {},
761
+ label: "Subworkflow",
762
+ outputMappings: {},
763
+ referencedWorkflowId: null,
764
+ referencedWorkflowName: null,
765
+ status: "idle"
766
+ },
767
+ description: "Reference another workflow as a subworkflow",
745
768
  icon: "GitBranch",
746
769
  inputs: [],
747
770
  // Dynamic based on referenced workflow interface
771
+ label: "Subworkflow",
748
772
  outputs: [],
749
773
  // Dynamic based on referenced workflow interface
750
- defaultData: {
751
- label: "Subworkflow",
752
- status: "idle",
753
- referencedWorkflowId: null,
754
- referencedWorkflowName: null,
755
- cachedInterface: null,
756
- inputMappings: {},
757
- outputMappings: {},
758
- childExecutionId: null
759
- }
774
+ type: "workflowRef"
760
775
  }
761
776
  // Multi-format nodes removed - format conversion now handled by schema-driven engine
762
777
  };
763
778
  var NODE_ORDER = {
764
- input: ["imageInput", "videoInput", "audioInput", "prompt", "promptConstructor"],
765
779
  ai: [
766
780
  "imageGen",
767
781
  "videoGen",
@@ -772,6 +786,15 @@ var NODE_ORDER = {
772
786
  "voiceChange",
773
787
  "motionControl"
774
788
  ],
789
+ composition: ["workflowRef", "workflowInput", "workflowOutput"],
790
+ input: [
791
+ "imageInput",
792
+ "videoInput",
793
+ "audioInput",
794
+ "prompt",
795
+ "promptConstructor"
796
+ ],
797
+ output: ["download", "outputGallery", "imageCompare"],
775
798
  processing: [
776
799
  "reframe",
777
800
  "upscale",
@@ -783,17 +806,15 @@ var NODE_ORDER = {
783
806
  "annotation",
784
807
  "subtitle",
785
808
  "animation"
786
- ],
787
- output: ["download", "outputGallery", "imageCompare"],
788
- composition: ["workflowRef", "workflowInput", "workflowOutput"]
809
+ ]
789
810
  };
790
811
  function getNodesByCategory() {
791
812
  const categories = {
792
- input: [],
793
813
  ai: [],
794
- processing: [],
814
+ composition: [],
815
+ input: [],
795
816
  output: [],
796
- composition: []
817
+ processing: []
797
818
  };
798
819
  for (const category of Object.keys(NODE_ORDER)) {
799
820
  for (const nodeType of NODE_ORDER[category]) {
@@ -807,3 +828,5 @@ function getNodesByCategory() {
807
828
  }
808
829
 
809
830
  export { CONNECTION_RULES, HandleTypeEnum, KlingQuality, ModelCapabilityEnum, ModelUseCaseEnum, NODE_DEFINITIONS, NODE_ORDER, NodeCategoryEnum, NodeStatusEnum, NodeTypeEnum, ProcessingNodeType, ProviderTypeEnum, ReframeNodeType, UpscaleNodeType, WorkflowTemplateCategory, getNodesByCategory };
831
+ //# sourceMappingURL=chunk-ZMENGANG.mjs.map
832
+ //# sourceMappingURL=chunk-ZMENGANG.mjs.map