n8n-nodes-comfyui-all 2.0.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 (38) hide show
  1. package/README.md +882 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/nodes/ComfyUi/ComfyUi.node.d.ts +248 -0
  7. package/dist/nodes/ComfyUi/ComfyUi.node.d.ts.map +1 -0
  8. package/dist/nodes/ComfyUi/ComfyUi.node.js +484 -0
  9. package/dist/nodes/ComfyUi/ComfyUi.node.js.map +1 -0
  10. package/dist/nodes/ComfyUiClient.d.ts +63 -0
  11. package/dist/nodes/ComfyUiClient.d.ts.map +1 -0
  12. package/dist/nodes/ComfyUiClient.js +281 -0
  13. package/dist/nodes/ComfyUiClient.js.map +1 -0
  14. package/dist/nodes/constants.d.ts +49 -0
  15. package/dist/nodes/constants.d.ts.map +1 -0
  16. package/dist/nodes/constants.js +86 -0
  17. package/dist/nodes/constants.js.map +1 -0
  18. package/dist/nodes/logger.d.ts +29 -0
  19. package/dist/nodes/logger.d.ts.map +1 -0
  20. package/dist/nodes/logger.js +59 -0
  21. package/dist/nodes/logger.js.map +1 -0
  22. package/dist/nodes/types.d.ts +71 -0
  23. package/dist/nodes/types.d.ts.map +1 -0
  24. package/dist/nodes/types.js +6 -0
  25. package/dist/nodes/types.js.map +1 -0
  26. package/dist/nodes/validation.d.ts +23 -0
  27. package/dist/nodes/validation.d.ts.map +1 -0
  28. package/dist/nodes/validation.js +175 -0
  29. package/dist/nodes/validation.js.map +1 -0
  30. package/dist/nodes/workflow-builder.d.ts +22 -0
  31. package/dist/nodes/workflow-builder.d.ts.map +1 -0
  32. package/dist/nodes/workflow-builder.js +240 -0
  33. package/dist/nodes/workflow-builder.js.map +1 -0
  34. package/dist/nodes/workflow-parser.d.ts +51 -0
  35. package/dist/nodes/workflow-parser.d.ts.map +1 -0
  36. package/dist/nodes/workflow-parser.js +258 -0
  37. package/dist/nodes/workflow-parser.js.map +1 -0
  38. package/package.json +56 -0
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateUrl = validateUrl;
4
+ exports.isPrivateNetworkAddress = isPrivateNetworkAddress;
5
+ exports.getNetworkAddressInfo = getNetworkAddressInfo;
6
+ exports.validateImageInput = validateImageInput;
7
+ exports.validateComfyUIWorkflow = validateComfyUIWorkflow;
8
+ const url_1 = require("url");
9
+ const constants_1 = require("./constants");
10
+ /**
11
+ * Validate if a string is a valid HTTP/HTTPS URL
12
+ */
13
+ function validateUrl(url) {
14
+ try {
15
+ const parsed = new url_1.URL(url);
16
+ return parsed.protocol === 'http:' || parsed.protocol === 'https:';
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /**
23
+ * Check if a URL points to a private network address (SSRF protection)
24
+ * Note: localhost/127.0.0.1 is allowed for local development
25
+ */
26
+ function isPrivateNetworkAddress(url) {
27
+ try {
28
+ const parsed = new url_1.URL(url);
29
+ const hostname = parsed.hostname;
30
+ // Skip localhost/127.0.0.1 for local development
31
+ if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1') {
32
+ return false;
33
+ }
34
+ // Check against private IP patterns
35
+ return constants_1.PRIVATE_IP_PATTERNS.some(pattern => pattern.test(hostname));
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Get network address information for a URL
43
+ */
44
+ function getNetworkAddressInfo(url) {
45
+ try {
46
+ const parsed = new url_1.URL(url);
47
+ const hostname = parsed.hostname;
48
+ return {
49
+ isLocalhost: hostname === 'localhost' ||
50
+ hostname === '127.0.0.1' ||
51
+ hostname === '::1',
52
+ isPrivate: constants_1.PRIVATE_IP_PATTERNS.some(pattern => pattern.test(hostname)),
53
+ };
54
+ }
55
+ catch {
56
+ return {
57
+ isLocalhost: false,
58
+ isPrivate: false,
59
+ };
60
+ }
61
+ }
62
+ /**
63
+ * Validate and sanitize image input (check size if base64)
64
+ */
65
+ function validateImageInput(image) {
66
+ if (!image || image.trim() === '') {
67
+ return {
68
+ valid: false,
69
+ error: 'Image input is empty',
70
+ };
71
+ }
72
+ // If it's a base64 data URL, check size
73
+ if (image.startsWith('data:image/')) {
74
+ try {
75
+ // Extract base64 part
76
+ const base64Data = image.split(',')[1];
77
+ if (!base64Data) {
78
+ return {
79
+ valid: false,
80
+ error: 'Invalid base64 image data',
81
+ };
82
+ }
83
+ // Calculate size in bytes (rough estimation)
84
+ const sizeInBytes = Math.ceil(base64Data.length * 0.75);
85
+ const sizeInMB = sizeInBytes / (1024 * 1024);
86
+ if (sizeInMB > constants_1.VALIDATION.MAX_IMAGE_SIZE_MB) {
87
+ return {
88
+ valid: false,
89
+ error: `Image is too large. Maximum size is ${constants_1.VALIDATION.MAX_IMAGE_SIZE_MB}MB.`,
90
+ };
91
+ }
92
+ }
93
+ catch (error) {
94
+ return {
95
+ valid: false,
96
+ error: 'Failed to process base64 image data',
97
+ };
98
+ }
99
+ }
100
+ return { valid: true };
101
+ }
102
+ /**
103
+ * Validate if a JSON string is a valid ComfyUI API format workflow
104
+ */
105
+ function validateComfyUIWorkflow(workflowJson) {
106
+ if (!workflowJson || workflowJson.trim() === '') {
107
+ return {
108
+ valid: false,
109
+ error: 'Workflow JSON is empty',
110
+ };
111
+ }
112
+ let workflow;
113
+ try {
114
+ workflow = JSON.parse(workflowJson);
115
+ }
116
+ catch (error) {
117
+ return {
118
+ valid: false,
119
+ error: `Invalid JSON: ${error.message}`,
120
+ };
121
+ }
122
+ // Check if it's an object with node IDs as keys
123
+ if (typeof workflow !== 'object' || workflow === null || Array.isArray(workflow)) {
124
+ return {
125
+ valid: false,
126
+ error: 'Workflow must be an object with node IDs as keys',
127
+ };
128
+ }
129
+ // Check if there's at least one node
130
+ const nodeIds = Object.keys(workflow);
131
+ if (nodeIds.length === 0) {
132
+ return {
133
+ valid: false,
134
+ error: 'Workflow must contain at least one node',
135
+ };
136
+ }
137
+ // Validate each node has the required structure
138
+ for (const nodeId of nodeIds) {
139
+ const node = workflow[nodeId];
140
+ // Each node should be an object
141
+ if (typeof node !== 'object' || node === null) {
142
+ return {
143
+ valid: false,
144
+ error: `Node ${nodeId} must be an object`,
145
+ };
146
+ }
147
+ // Each node should have a class_type
148
+ if (!node.class_type || typeof node.class_type !== 'string') {
149
+ return {
150
+ valid: false,
151
+ error: `Node ${nodeId} must have a class_type property`,
152
+ };
153
+ }
154
+ // Node can have inputs (optional)
155
+ if (node.inputs !== undefined) {
156
+ if (typeof node.inputs !== 'object' || node.inputs === null || Array.isArray(node.inputs)) {
157
+ return {
158
+ valid: false,
159
+ error: `Node ${nodeId} inputs must be an object`,
160
+ };
161
+ }
162
+ }
163
+ // Node can have widgets_values (optional)
164
+ if (node.widgets_values !== undefined) {
165
+ if (!Array.isArray(node.widgets_values)) {
166
+ return {
167
+ valid: false,
168
+ error: `Node ${nodeId} widgets_values must be an array`,
169
+ };
170
+ }
171
+ }
172
+ }
173
+ return { valid: true };
174
+ }
175
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../nodes/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { ComfyUIWorkflow, WorkflowOptions } from './types';
2
+ /**
3
+ * Build a text-to-image workflow
4
+ */
5
+ export declare function buildTextToImageWorkflow(prompt: string, negativePrompt: string | undefined, options?: WorkflowOptions): ComfyUIWorkflow;
6
+ /**
7
+ * Build an image-to-image workflow
8
+ */
9
+ export declare function buildImageToImageWorkflow(prompt: string, negativePrompt: string | undefined, image: string, options?: WorkflowOptions): ComfyUIWorkflow;
10
+ /**
11
+ * Build an image edit workflow
12
+ */
13
+ export declare function buildImageEditWorkflow(prompt: string, negativePrompt: string | undefined, image: string, options?: WorkflowOptions): ComfyUIWorkflow;
14
+ /**
15
+ * Build a text-to-video workflow
16
+ */
17
+ export declare function buildTextToVideoWorkflow(prompt: string, negativePrompt: string | undefined, options?: WorkflowOptions): ComfyUIWorkflow;
18
+ /**
19
+ * Build an image-to-video workflow
20
+ */
21
+ export declare function buildImageToVideoWorkflow(prompt: string, negativePrompt: string | undefined, image: string, options?: WorkflowOptions): ComfyUIWorkflow;
22
+ //# sourceMappingURL=workflow-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-builder.d.ts","sourceRoot":"","sources":["../../nodes/workflow-builder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,eAAe,EAEhB,MAAM,SAAS,CAAC;AAuKjB;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAejB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAgBjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAiBjB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAgBjB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAgBjB"}
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildTextToImageWorkflow = buildTextToImageWorkflow;
4
+ exports.buildImageToImageWorkflow = buildImageToImageWorkflow;
5
+ exports.buildImageEditWorkflow = buildImageEditWorkflow;
6
+ exports.buildTextToVideoWorkflow = buildTextToVideoWorkflow;
7
+ exports.buildImageToVideoWorkflow = buildImageToVideoWorkflow;
8
+ const crypto_1 = require("crypto");
9
+ const constants_1 = require("./constants");
10
+ /**
11
+ * Generate a random seed for ComfyUI generation
12
+ */
13
+ function generateSeed() {
14
+ return (0, crypto_1.randomInt)(0, constants_1.VALIDATION.MAX_SEED);
15
+ }
16
+ /**
17
+ * Create a checkpoint loader node
18
+ */
19
+ function createCheckpointLoader(modelName) {
20
+ return {
21
+ inputs: {
22
+ ckpt_name: modelName || constants_1.DEFAULT_MODEL,
23
+ },
24
+ class_type: 'CheckpointLoaderSimple',
25
+ };
26
+ }
27
+ /**
28
+ * Create a KSampler node
29
+ */
30
+ function createKSampler(seed, denoise, options) {
31
+ return {
32
+ inputs: {
33
+ seed,
34
+ steps: options?.steps || constants_1.DEFAULT_STEPS,
35
+ cfg: options?.cfg || constants_1.DEFAULT_CFG,
36
+ sampler_name: options?.samplerName || constants_1.DEFAULT_SAMPLER_NAME,
37
+ scheduler: options?.scheduler || constants_1.DEFAULT_SCHEDULER,
38
+ denoise,
39
+ model: [constants_1.NodeIds.CHECKPOINT_LOADER, 0],
40
+ positive: [constants_1.NodeIds.POSITIVE_CLIP, 0],
41
+ negative: [constants_1.NodeIds.NEGATIVE_CLIP, 0],
42
+ latent_image: [constants_1.NodeIds.LATENT_IMAGE, 0],
43
+ },
44
+ class_type: 'KSampler',
45
+ };
46
+ }
47
+ /**
48
+ * Create an empty latent image node
49
+ */
50
+ function createEmptyLatentImage(options) {
51
+ return {
52
+ inputs: {
53
+ width: options?.width || constants_1.DEFAULT_IMAGE_WIDTH,
54
+ height: options?.height || constants_1.DEFAULT_IMAGE_HEIGHT,
55
+ batch_size: constants_1.DEFAULT_BATCH_SIZE,
56
+ },
57
+ class_type: 'EmptyLatentImage',
58
+ };
59
+ }
60
+ /**
61
+ * Create a latent image node for video with custom batch size
62
+ */
63
+ function createVideoLatentImage(frames, options) {
64
+ return {
65
+ inputs: {
66
+ width: options?.width || constants_1.DEFAULT_IMAGE_WIDTH,
67
+ height: options?.height || constants_1.DEFAULT_IMAGE_HEIGHT,
68
+ batch_size: frames,
69
+ },
70
+ class_type: 'EmptyLatentImage',
71
+ };
72
+ }
73
+ /**
74
+ * Create a VAE encode node
75
+ */
76
+ function createVAEEncode() {
77
+ return {
78
+ inputs: {
79
+ pixels: [constants_1.NodeIds.LOAD_IMAGE, 0],
80
+ vae: [constants_1.NodeIds.CHECKPOINT_LOADER, 2],
81
+ },
82
+ class_type: 'VAEEncode',
83
+ };
84
+ }
85
+ /**
86
+ * Create a CLIP text encode node for positive prompt
87
+ */
88
+ function createPositiveClipEncode(prompt) {
89
+ return {
90
+ inputs: {
91
+ text: prompt,
92
+ clip: [constants_1.NodeIds.CHECKPOINT_LOADER, 1],
93
+ },
94
+ class_type: 'CLIPTextEncode',
95
+ };
96
+ }
97
+ /**
98
+ * Create a CLIP text encode node for negative prompt
99
+ */
100
+ function createNegativeClipEncode(negativePrompt) {
101
+ return {
102
+ inputs: {
103
+ text: negativePrompt || '',
104
+ clip: [constants_1.NodeIds.CHECKPOINT_LOADER, 1],
105
+ },
106
+ class_type: 'CLIPTextEncode',
107
+ };
108
+ }
109
+ /**
110
+ * Create a VAE decode node
111
+ */
112
+ function createVAEDecode() {
113
+ return {
114
+ inputs: {
115
+ samples: [constants_1.NodeIds.K_SAMPLER, 0],
116
+ vae: [constants_1.NodeIds.CHECKPOINT_LOADER, 2],
117
+ },
118
+ class_type: 'VAEDecode',
119
+ };
120
+ }
121
+ /**
122
+ * Create a save image node
123
+ */
124
+ function createSaveImage() {
125
+ return {
126
+ inputs: {
127
+ filename_prefix: 'ComfyUI',
128
+ images: [constants_1.NodeIds.VAE_DECODE, 0],
129
+ },
130
+ class_type: 'SaveImage',
131
+ };
132
+ }
133
+ /**
134
+ * Create a load image node
135
+ */
136
+ function createLoadImage(image) {
137
+ return {
138
+ inputs: {
139
+ image: image,
140
+ 'choose file to upload': 'image',
141
+ },
142
+ class_type: 'LoadImage',
143
+ };
144
+ }
145
+ /**
146
+ * Build a text-to-image workflow
147
+ */
148
+ function buildTextToImageWorkflow(prompt, negativePrompt, options) {
149
+ const seed = generateSeed();
150
+ return {
151
+ prompt: {
152
+ [constants_1.NodeIds.K_SAMPLER]: createKSampler(seed, 1, options),
153
+ [constants_1.NodeIds.CHECKPOINT_LOADER]: createCheckpointLoader(options?.modelName),
154
+ [constants_1.NodeIds.LATENT_IMAGE]: createEmptyLatentImage(options),
155
+ [constants_1.NodeIds.POSITIVE_CLIP]: createPositiveClipEncode(prompt),
156
+ [constants_1.NodeIds.NEGATIVE_CLIP]: createNegativeClipEncode(negativePrompt),
157
+ [constants_1.NodeIds.VAE_DECODE]: createVAEDecode(),
158
+ [constants_1.NodeIds.SAVE_IMAGE]: createSaveImage(),
159
+ },
160
+ extra_data: {},
161
+ };
162
+ }
163
+ /**
164
+ * Build an image-to-image workflow
165
+ */
166
+ function buildImageToImageWorkflow(prompt, negativePrompt, image, options) {
167
+ const seed = generateSeed();
168
+ return {
169
+ prompt: {
170
+ [constants_1.NodeIds.K_SAMPLER]: createKSampler(seed, constants_1.DEFAULT_DENOISE, options),
171
+ [constants_1.NodeIds.CHECKPOINT_LOADER]: createCheckpointLoader(options?.modelName),
172
+ [constants_1.NodeIds.LATENT_IMAGE]: createVAEEncode(),
173
+ [constants_1.NodeIds.POSITIVE_CLIP]: createPositiveClipEncode(prompt),
174
+ [constants_1.NodeIds.NEGATIVE_CLIP]: createNegativeClipEncode(negativePrompt),
175
+ [constants_1.NodeIds.VAE_DECODE]: createVAEDecode(),
176
+ [constants_1.NodeIds.SAVE_IMAGE]: createSaveImage(),
177
+ [constants_1.NodeIds.LOAD_IMAGE]: createLoadImage(image),
178
+ },
179
+ extra_data: {},
180
+ };
181
+ }
182
+ /**
183
+ * Build an image edit workflow
184
+ */
185
+ function buildImageEditWorkflow(prompt, negativePrompt, image, options) {
186
+ const seed = generateSeed();
187
+ const denoise = options?.denoise !== undefined ? options.denoise : constants_1.DEFAULT_IMAGE_EDIT_DENOISE;
188
+ return {
189
+ prompt: {
190
+ [constants_1.NodeIds.K_SAMPLER]: createKSampler(seed, denoise, options),
191
+ [constants_1.NodeIds.CHECKPOINT_LOADER]: createCheckpointLoader(options?.modelName),
192
+ [constants_1.NodeIds.LATENT_IMAGE]: createVAEEncode(),
193
+ [constants_1.NodeIds.POSITIVE_CLIP]: createPositiveClipEncode(prompt),
194
+ [constants_1.NodeIds.NEGATIVE_CLIP]: createNegativeClipEncode(negativePrompt),
195
+ [constants_1.NodeIds.VAE_DECODE]: createVAEDecode(),
196
+ [constants_1.NodeIds.SAVE_IMAGE]: createSaveImage(),
197
+ [constants_1.NodeIds.LOAD_IMAGE]: createLoadImage(image),
198
+ },
199
+ extra_data: {},
200
+ };
201
+ }
202
+ /**
203
+ * Build a text-to-video workflow
204
+ */
205
+ function buildTextToVideoWorkflow(prompt, negativePrompt, options) {
206
+ const seed = generateSeed();
207
+ const frames = options?.frames || constants_1.DEFAULT_FRAMES;
208
+ return {
209
+ prompt: {
210
+ [constants_1.NodeIds.K_SAMPLER]: createKSampler(seed, 1, options),
211
+ [constants_1.NodeIds.CHECKPOINT_LOADER]: createCheckpointLoader(options?.modelName),
212
+ [constants_1.NodeIds.LATENT_IMAGE]: createVideoLatentImage(frames, options),
213
+ [constants_1.NodeIds.POSITIVE_CLIP]: createPositiveClipEncode(prompt),
214
+ [constants_1.NodeIds.NEGATIVE_CLIP]: createNegativeClipEncode(negativePrompt),
215
+ [constants_1.NodeIds.VAE_DECODE]: createVAEDecode(),
216
+ [constants_1.NodeIds.SAVE_IMAGE]: createSaveImage(),
217
+ },
218
+ extra_data: {},
219
+ };
220
+ }
221
+ /**
222
+ * Build an image-to-video workflow
223
+ */
224
+ function buildImageToVideoWorkflow(prompt, negativePrompt, image, options) {
225
+ const seed = generateSeed();
226
+ return {
227
+ prompt: {
228
+ [constants_1.NodeIds.K_SAMPLER]: createKSampler(seed, constants_1.DEFAULT_DENOISE, options),
229
+ [constants_1.NodeIds.CHECKPOINT_LOADER]: createCheckpointLoader(options?.modelName),
230
+ [constants_1.NodeIds.LATENT_IMAGE]: createVAEEncode(),
231
+ [constants_1.NodeIds.POSITIVE_CLIP]: createPositiveClipEncode(prompt),
232
+ [constants_1.NodeIds.NEGATIVE_CLIP]: createNegativeClipEncode(negativePrompt),
233
+ [constants_1.NodeIds.VAE_DECODE]: createVAEDecode(),
234
+ [constants_1.NodeIds.SAVE_IMAGE]: createSaveImage(),
235
+ [constants_1.NodeIds.LOAD_IMAGE]: createLoadImage(image),
236
+ },
237
+ extra_data: {},
238
+ };
239
+ }
240
+ //# sourceMappingURL=workflow-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-builder.js","sourceRoot":"","sources":["../../nodes/workflow-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ComfyUI Workflow Parser
3
+ * Parses API-format ComfyUI workflows and extracts configurable input parameters
4
+ */
5
+ type NodePropertyType = 'string' | 'number' | 'boolean' | 'options' | 'any';
6
+ export interface WorkflowNode {
7
+ inputs?: Record<string, any>;
8
+ class_type: string;
9
+ _meta?: Record<string, any>;
10
+ }
11
+ export interface ComfyUIWorkflow {
12
+ [nodeId: string]: WorkflowNode;
13
+ }
14
+ export interface ParsedWorkflowInput {
15
+ nodeId: string;
16
+ nodeTitle: string;
17
+ classType: string;
18
+ parameterName: string;
19
+ parameterType: NodePropertyType;
20
+ defaultValue?: any;
21
+ required: boolean;
22
+ description?: string;
23
+ options?: Array<{
24
+ name: string;
25
+ value: any;
26
+ }>;
27
+ isImage?: boolean;
28
+ isText?: boolean;
29
+ isNumber?: boolean;
30
+ isSeed?: boolean;
31
+ }
32
+ export interface ParsedWorkflowResult {
33
+ valid: boolean;
34
+ error?: string;
35
+ inputs: ParsedWorkflowInput[];
36
+ workflow: ComfyUIWorkflow;
37
+ }
38
+ /**
39
+ * Parse ComfyUI workflow and extract all configurable input parameters
40
+ */
41
+ export declare function parseWorkflowInputs(workflowJson: string): ParsedWorkflowResult;
42
+ /**
43
+ * Update workflow with user input values
44
+ */
45
+ export declare function updateWorkflowWithInputs(workflow: ComfyUIWorkflow, inputValues: Record<string, unknown>): ComfyUIWorkflow;
46
+ /**
47
+ * Generate node-friendly parameter name
48
+ */
49
+ export declare function generateParameterKey(nodeId: string, paramName: string): string;
50
+ export {};
51
+ //# sourceMappingURL=workflow-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-parser.d.ts","sourceRoot":"","sources":["../../nodes/workflow-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,KAAK,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,gBAAgB,CAAC;IAChC,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,QAAQ,EAAE,eAAe,CAAC;CAC3B;AA0KD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,oBAAoB,CAmE9E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,eAAe,CAiBjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E"}