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