@vibesdotdev/integrations-comfyui 0.0.0-stage → 1.0.0-rc.1

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 (75) hide show
  1. package/LICENSE +126 -0
  2. package/README.md +39 -2
  3. package/dist/ai/index.d.ts +4 -0
  4. package/dist/ai/index.d.ts.map +1 -0
  5. package/dist/ai/index.js +4 -0
  6. package/dist/ai/index.js.map +1 -0
  7. package/dist/ai/provider.consumer.plugin.d.ts +6 -0
  8. package/dist/ai/provider.consumer.plugin.d.ts.map +1 -0
  9. package/dist/ai/provider.consumer.plugin.js +122 -0
  10. package/dist/ai/provider.consumer.plugin.js.map +1 -0
  11. package/dist/ai/provider.plugin.d.ts +3 -0
  12. package/dist/ai/provider.plugin.d.ts.map +1 -0
  13. package/dist/ai/provider.plugin.js +3 -0
  14. package/dist/ai/provider.plugin.js.map +1 -0
  15. package/dist/ai/providers/comfyui/comfyui.provider.impl.d.ts +20 -0
  16. package/dist/ai/providers/comfyui/comfyui.provider.impl.d.ts.map +1 -0
  17. package/dist/ai/providers/comfyui/comfyui.provider.impl.js +104 -0
  18. package/dist/ai/providers/comfyui/comfyui.provider.impl.js.map +1 -0
  19. package/dist/ai/providers/comfyui/detection/index.d.ts +2 -0
  20. package/dist/ai/providers/comfyui/detection/index.d.ts.map +1 -0
  21. package/dist/ai/providers/comfyui/detection/index.js +2 -0
  22. package/dist/ai/providers/comfyui/detection/index.js.map +1 -0
  23. package/dist/ai/providers/comfyui/detection/system.d.ts +6 -0
  24. package/dist/ai/providers/comfyui/detection/system.d.ts.map +1 -0
  25. package/dist/ai/providers/comfyui/detection/system.js +44 -0
  26. package/dist/ai/providers/comfyui/detection/system.js.map +1 -0
  27. package/dist/ai/providers/comfyui/http.d.ts +4 -0
  28. package/dist/ai/providers/comfyui/http.d.ts.map +1 -0
  29. package/dist/ai/providers/comfyui/http.js +36 -0
  30. package/dist/ai/providers/comfyui/http.js.map +1 -0
  31. package/dist/ai/providers/comfyui/index.d.ts +4 -0
  32. package/dist/ai/providers/comfyui/index.d.ts.map +1 -0
  33. package/dist/ai/providers/comfyui/index.js +4 -0
  34. package/dist/ai/providers/comfyui/index.js.map +1 -0
  35. package/dist/ai/providers/comfyui/recommendations.d.ts +24 -0
  36. package/dist/ai/providers/comfyui/recommendations.d.ts.map +1 -0
  37. package/dist/ai/providers/comfyui/recommendations.js +101 -0
  38. package/dist/ai/providers/comfyui/recommendations.js.map +1 -0
  39. package/dist/ai/providers/local/image/comfyui/config/config.comfyui.descriptor.d.ts +4194 -0
  40. package/dist/ai/providers/local/image/comfyui/config/config.comfyui.descriptor.d.ts.map +1 -0
  41. package/dist/ai/providers/local/image/comfyui/config/config.comfyui.descriptor.js +43 -0
  42. package/dist/ai/providers/local/image/comfyui/config/config.comfyui.descriptor.js.map +1 -0
  43. package/dist/ai/providers/local/image/comfyui/config/schemas/index.d.ts +2 -0
  44. package/dist/ai/providers/local/image/comfyui/config/schemas/index.d.ts.map +1 -0
  45. package/dist/ai/providers/local/image/comfyui/config/schemas/index.js +2 -0
  46. package/dist/ai/providers/local/image/comfyui/config/schemas/index.js.map +1 -0
  47. package/dist/ai/providers/local/image/comfyui/index.d.ts +5 -0
  48. package/dist/ai/providers/local/image/comfyui/index.d.ts.map +1 -0
  49. package/dist/ai/providers/local/image/comfyui/index.js +4 -0
  50. package/dist/ai/providers/local/image/comfyui/index.js.map +1 -0
  51. package/dist/ai/providers/local/image/comfyui/provider.comfyui.descriptor.d.ts +183 -0
  52. package/dist/ai/providers/local/image/comfyui/provider.comfyui.descriptor.d.ts.map +1 -0
  53. package/dist/ai/providers/local/image/comfyui/provider.comfyui.descriptor.js +53 -0
  54. package/dist/ai/providers/local/image/comfyui/provider.comfyui.descriptor.js.map +1 -0
  55. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.descriptor.d.ts +37 -0
  56. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.descriptor.d.ts.map +1 -0
  57. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.descriptor.js +34 -0
  58. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.descriptor.js.map +1 -0
  59. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.impl.d.ts +75 -0
  60. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.impl.d.ts.map +1 -0
  61. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.impl.js +239 -0
  62. package/dist/ai/specs/comfyui-prompt/comfyui-prompt.spec.impl.js.map +1 -0
  63. package/dist/config/comfyui.config.descriptor.d.ts +79 -0
  64. package/dist/config/comfyui.config.descriptor.d.ts.map +1 -0
  65. package/dist/config/comfyui.config.descriptor.js +50 -0
  66. package/dist/config/comfyui.config.descriptor.js.map +1 -0
  67. package/dist/index.d.ts +2 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +2 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/schemas/comfyui.d.ts +98 -0
  72. package/dist/schemas/comfyui.d.ts.map +1 -0
  73. package/dist/schemas/comfyui.js +69 -0
  74. package/dist/schemas/comfyui.js.map +1 -0
  75. package/package.json +74 -4
@@ -0,0 +1,239 @@
1
+ /**
2
+ * `comfyui-prompt` impl.
3
+ *
4
+ * Encodes `ImageGenerationRequest` into ComfyUI's graph-execution
5
+ * dialect: builds the canonical text-to-image workflow graph
6
+ * (CheckpointLoaderSimple → CLIPTextEncode positive/negative →
7
+ * EmptyLatentImage → KSampler → VAEDecode → SaveImage) and submits it
8
+ * as `POST {baseUrl}/prompt`. Execution is asynchronous: the decoder
9
+ * reads `{prompt_id}` from the submission response, polls
10
+ * `GET {baseUrl}/history/{prompt_id}` a bounded number of times, and
11
+ * decodes the history entry's node outputs into
12
+ * `{baseUrl}/view?filename=…&subfolder=…&type=…` image URLs. The
13
+ * bytes are never fetched here — results are URL references (the
14
+ * fal-run reference convention; a1111 differs only because its wire
15
+ * response carries inline base64 rather than file references).
16
+ */
17
+ import { CapabilityError } from '@vibesdotdev/kernel';
18
+ import { fetchAIProvider } from '@vibesdotdev/ai/providers-runtime/client';
19
+ import { concatAll } from '@vibesdotdev/ai/specs/interfaces';
20
+ import { ComfyUIGraphSchema, ComfyUIHistorySchema, ComfyUISubmissionSchema, ComfyUIPromptSpecOptionsSchema, ComfyuiSettingsSchema, ComfyUIConnectionSchema } from "../../../schemas/comfyui.js";
21
+ import { loadComfyuiSettings } from "../../../config/comfyui.config.descriptor.js";
22
+ import { readComfyUIResponse } from "../../providers/comfyui/http.js";
23
+ import descriptor from "./comfyui-prompt.spec.descriptor.js";
24
+ export {} from "../../../schemas/comfyui.js";
25
+ /** Legacy explicit-subpath constants. The lifecycle deadline bounds network time. */
26
+ export const HISTORY_POLL_MAX_ATTEMPTS = 60;
27
+ export const HISTORY_POLL_DELAY_MS = ComfyuiSettingsSchema.parse({}).pollDelayMs;
28
+ /** Stable node ids of the canonical text-to-image graph. */
29
+ export const GRAPH_NODE_IDS = {
30
+ checkpoint: '1',
31
+ positive: '2',
32
+ negative: '3',
33
+ latent: '4',
34
+ sampler: '5',
35
+ decode: '6',
36
+ save: '7'
37
+ };
38
+ const DEFAULT_STEPS = 20;
39
+ const DEFAULT_CFG = 7;
40
+ const DEFAULT_WIDTH = 512;
41
+ const DEFAULT_HEIGHT = 512;
42
+ const DEFAULT_SAMPLER = 'euler';
43
+ const DEFAULT_SCHEDULER = 'normal';
44
+ /**
45
+ * Build the canonical ComfyUI text-to-image graph in `/prompt` API
46
+ * format: nodes keyed by id, each `{class_type, inputs}`, connections
47
+ * as `[nodeId, outputIndex]`. CheckpointLoaderSimple outputs are
48
+ * MODEL(0) / CLIP(1) / VAE(2); the wire model id is the checkpoint
49
+ * file name.
50
+ */
51
+ export function buildTextToImageGraph(request, checkpointName) {
52
+ const ids = GRAPH_NODE_IDS;
53
+ // KSampler has no server-side "random seed" sentinel; absent seeds
54
+ // are drawn here so the submitted graph is always concrete.
55
+ const seed = request.seed ?? Math.floor(Math.random() * 1_000_000_000);
56
+ return ComfyUIGraphSchema.parse({
57
+ [ids.checkpoint]: {
58
+ class_type: 'CheckpointLoaderSimple',
59
+ inputs: { ckpt_name: checkpointName }
60
+ },
61
+ [ids.positive]: {
62
+ class_type: 'CLIPTextEncode',
63
+ inputs: { text: request.prompt, clip: [ids.checkpoint, 1] }
64
+ },
65
+ [ids.negative]: {
66
+ class_type: 'CLIPTextEncode',
67
+ inputs: { text: request.negativePrompt ?? '', clip: [ids.checkpoint, 1] }
68
+ },
69
+ [ids.latent]: {
70
+ class_type: 'EmptyLatentImage',
71
+ inputs: {
72
+ width: request.width ?? DEFAULT_WIDTH,
73
+ height: request.height ?? DEFAULT_HEIGHT,
74
+ batch_size: request.numImages ?? 1
75
+ }
76
+ },
77
+ [ids.sampler]: {
78
+ class_type: 'KSampler',
79
+ inputs: {
80
+ seed,
81
+ steps: request.steps ?? DEFAULT_STEPS,
82
+ cfg: request.guidanceScale ?? DEFAULT_CFG,
83
+ sampler_name: DEFAULT_SAMPLER,
84
+ scheduler: DEFAULT_SCHEDULER,
85
+ denoise: 1,
86
+ model: [ids.checkpoint, 0],
87
+ positive: [ids.positive, 0],
88
+ negative: [ids.negative, 0],
89
+ latent_image: [ids.latent, 0]
90
+ }
91
+ },
92
+ [ids.decode]: {
93
+ class_type: 'VAEDecode',
94
+ inputs: { samples: [ids.sampler, 0], vae: [ids.checkpoint, 2] }
95
+ },
96
+ [ids.save]: {
97
+ class_type: 'SaveImage',
98
+ inputs: { filename_prefix: 'vibes', images: [ids.decode, 0] }
99
+ }
100
+ });
101
+ }
102
+ export class ComfyUIPromptSpec {
103
+ runtime;
104
+ settings;
105
+ descriptor = descriptor;
106
+ options;
107
+ constructor(runtime, options = {}, settings = ComfyuiSettingsSchema.parse({})) {
108
+ this.runtime = runtime;
109
+ this.settings = settings;
110
+ this.options = ComfyUIPromptSpecOptionsSchema.parse(options);
111
+ }
112
+ encodeRequest(request, context) {
113
+ if (!isImageRequest(request)) {
114
+ throw new CapabilityError('ComfyUI only encodes image requests', 'INVALID_INPUT', {
115
+ reason: 'comfyui-modality-unsupported', retryable: false
116
+ });
117
+ }
118
+ const connection = this.runtime.query('ai/provider/connection')
119
+ .withId(context.providerId).descriptors()[0];
120
+ const { clientId } = ComfyUIConnectionSchema.parse({
121
+ clientId: this.settings.clientId, ...connection?.configuration
122
+ });
123
+ const body = { prompt: buildTextToImageGraph(request, context.wireModelId), client_id: clientId };
124
+ return {
125
+ method: 'POST', path: '/prompt',
126
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
127
+ body,
128
+ streaming: false
129
+ };
130
+ }
131
+ async *decodeResponse(chunks, request, context) {
132
+ try {
133
+ if (!isImageRequest(request)) {
134
+ throw new CapabilityError('ComfyUI only decodes image requests', 'INVALID_INPUT', {
135
+ reason: 'comfyui-modality-unsupported', retryable: false
136
+ });
137
+ }
138
+ const settings = await loadComfyuiSettings(this.runtime);
139
+ const delayMs = this.options.pollDelayMs ?? settings.pollDelayMs;
140
+ const legacyDeadline = this.options.pollMaxAttempts === undefined
141
+ ? settings.timeoutMs
142
+ : Math.min(settings.timeoutMs, this.options.pollMaxAttempts * Math.max(delayMs, 1));
143
+ const result = await this.runtime.lifecycle.wait(async (signal) => {
144
+ const parts = [];
145
+ for await (const chunk of chunks) {
146
+ signal.throwIfAborted();
147
+ if (chunk.kind === 'error')
148
+ throw chunk.error;
149
+ if (chunk.kind === 'headers' && (chunk.status < 200 || chunk.status >= 300)) {
150
+ throw new CapabilityError('ComfyUI prompt submission failed', 'UNAVAILABLE', {
151
+ reason: 'comfyui-http-failed', retryable: false,
152
+ details: { status: chunk.status }
153
+ });
154
+ }
155
+ if (chunk.kind === 'bytes')
156
+ parts.push(chunk.data);
157
+ if (chunk.kind === 'end')
158
+ break;
159
+ }
160
+ if (parts.length === 0) {
161
+ throw new CapabilityError('ComfyUI returned an empty prompt response', 'INVALID_INPUT', {
162
+ reason: 'comfyui-response-empty', retryable: false
163
+ });
164
+ }
165
+ let submission;
166
+ try {
167
+ submission = ComfyUISubmissionSchema.parse(JSON.parse(new TextDecoder().decode(concatAll(parts))));
168
+ }
169
+ catch (cause) {
170
+ throw new CapabilityError('ComfyUI returned an invalid prompt response', 'INVALID_INPUT', {
171
+ reason: 'comfyui-response-invalid', retryable: false, cause
172
+ });
173
+ }
174
+ if (submission.error !== undefined || Object.keys(submission.node_errors ?? {}).length > 0) {
175
+ throw new CapabilityError('ComfyUI rejected the submitted graph', 'INVALID_INPUT', {
176
+ reason: 'comfyui-prompt-rejected', retryable: false
177
+ });
178
+ }
179
+ const promptId = submission.prompt_id;
180
+ if (!promptId) {
181
+ throw new CapabilityError('ComfyUI response is missing prompt_id', 'INVALID_INPUT', {
182
+ reason: 'comfyui-prompt-id-missing', retryable: false
183
+ });
184
+ }
185
+ const base = context.endpointBase.replace(/\/+$/, '');
186
+ // Observe asynchronous completion under one lifecycle-owned deadline.
187
+ // HTTP, parsing and execution failures are never retried.
188
+ while (!signal.aborted) {
189
+ const history = await readComfyUIResponse(await fetchAIProvider({ runtime: this.runtime }, `${base}/history/${encodeURIComponent(promptId)}`, {
190
+ headers: { Accept: 'application/json' }, signal
191
+ }), ComfyUIHistorySchema);
192
+ const entry = history[promptId];
193
+ if (entry?.status?.status_str === 'error') {
194
+ throw new CapabilityError('ComfyUI execution failed', 'UNAVAILABLE', {
195
+ reason: 'comfyui-execution-failed', retryable: false
196
+ });
197
+ }
198
+ if (entry && entry.status?.completed !== false) {
199
+ const images = Object.values(entry.outputs ?? {}).flatMap((output) => (output.images ?? []).map((image) => `${base}/view?${new URLSearchParams(image).toString()}`));
200
+ if (images.length === 0) {
201
+ throw new CapabilityError('ComfyUI completed without output images', 'NOT_FOUND', {
202
+ reason: 'comfyui-images-missing', retryable: false
203
+ });
204
+ }
205
+ const result = {
206
+ id: `${context.providerId}.${context.variantId}.${Date.now()}`,
207
+ timestamp: new Date(), images,
208
+ seeds: request.seed === undefined ? undefined : [request.seed],
209
+ metadata: { modelVersion: context.wireModelId, promptId }
210
+ };
211
+ return result;
212
+ }
213
+ await this.runtime.lifecycle.delay(delayMs, signal);
214
+ }
215
+ signal.throwIfAborted();
216
+ throw new CapabilityError('ComfyUI completion was cancelled', 'CANCELLED', {
217
+ reason: 'comfyui-cancelled', retryable: false
218
+ });
219
+ }, {
220
+ timeoutMs: this.options.timeoutMs ?? legacyDeadline,
221
+ reason: 'comfyui prompt submission and history completion',
222
+ signal: request.signal
223
+ });
224
+ const event = { kind: 'result', result };
225
+ // SAFETY: isImageRequest established this decode serves an image request for M.
226
+ yield event;
227
+ }
228
+ catch (cause) {
229
+ const error = cause instanceof CapabilityError ? cause : new CapabilityError('ComfyUI request failed', 'UNAVAILABLE', {
230
+ reason: 'comfyui-request-failed', retryable: false, cause
231
+ });
232
+ yield { kind: 'error', error };
233
+ }
234
+ }
235
+ }
236
+ function isImageRequest(request) {
237
+ return request.modality === 'image';
238
+ }
239
+ //# sourceMappingURL=comfyui-prompt.spec.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfyui-prompt.spec.impl.js","sourceRoot":"","sources":["../../../../src/ai/specs/comfyui-prompt/comfyui-prompt.spec.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ComfyUI settings — the `integrations.comfyui` config manifest.
3
+ */
4
+ import { type ComfyuiSettings } from '../schemas/comfyui.ts';
5
+ export { ComfyuiSettingsSchema, type ComfyuiSettings } from '../schemas/comfyui.ts';
6
+ import { type RuntimeRef } from '@vibesdotdev/kernel';
7
+ export declare const COMFYUI_DEFAULT_BASE_URL: string;
8
+ export declare const COMFYUI_SETTINGS_MANIFEST_ID = "integrations.comfyui";
9
+ export declare const comfyuiSettingsManifest: {
10
+ id: string;
11
+ schema: import("zod/v4").ZodObject<{
12
+ baseUrl: import("zod/v4").ZodDefault<import("zod/v4").ZodURL>;
13
+ clientId: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
14
+ timeoutMs: import("zod/v4").ZodDefault<import("zod/v4").ZodNumber>;
15
+ pollDelayMs: import("zod/v4").ZodDefault<import("zod/v4").ZodNumber>;
16
+ }, import("zod/v4/core").$strip>;
17
+ };
18
+ export declare function loadComfyuiSettings(runtime: RuntimeRef): Promise<ComfyuiSettings>;
19
+ export declare const comfyuiSettingsDescriptor: {
20
+ kind: "config/manifest";
21
+ id: string;
22
+ name: string;
23
+ namespace: string;
24
+ description: string;
25
+ tier: string;
26
+ category: string;
27
+ schema: import("zod/v4").ZodObject<{
28
+ baseUrl: import("zod/v4").ZodDefault<import("zod/v4").ZodURL>;
29
+ clientId: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
30
+ timeoutMs: import("zod/v4").ZodDefault<import("zod/v4").ZodNumber>;
31
+ pollDelayMs: import("zod/v4").ZodDefault<import("zod/v4").ZodNumber>;
32
+ }, import("zod/v4/core").$strip>;
33
+ fields: {
34
+ clientId: {
35
+ ui: {
36
+ label: string;
37
+ component: string;
38
+ group: string;
39
+ };
40
+ };
41
+ pollDelayMs: {
42
+ ui: {
43
+ label: string;
44
+ component: string;
45
+ group: string;
46
+ };
47
+ };
48
+ baseUrl: {
49
+ ui: {
50
+ label: string;
51
+ component: string;
52
+ group: string;
53
+ };
54
+ };
55
+ timeoutMs: {
56
+ ui: {
57
+ label: string;
58
+ component: string;
59
+ group: string;
60
+ };
61
+ };
62
+ };
63
+ groups: {
64
+ id: string;
65
+ label: string;
66
+ }[];
67
+ allowedAdapters: string[];
68
+ defaultAdapter: string;
69
+ scope: string;
70
+ customTables: boolean;
71
+ version: number;
72
+ internal: boolean;
73
+ context: {
74
+ surfaces: string[];
75
+ };
76
+ enabled: true;
77
+ };
78
+ export default comfyuiSettingsDescriptor;
79
+ //# sourceMappingURL=comfyui.config.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfyui.config.descriptor.d.ts","sourceRoot":"","sources":["../../src/config/comfyui.config.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpF,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE3F,eAAO,MAAM,wBAAwB,QAA0C,CAAC;AAEhF,eAAO,MAAM,4BAA4B,yBAAyB,CAAC;AAEnE,eAAO,MAAM,uBAAuB;;;;;;;;CAAsE,CAAC;AAE3G,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,UAAU,GACjB,OAAO,CAAC,eAAe,CAAC,CAU1B;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwBpC,CAAC;AAEH,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * ComfyUI settings — the `integrations.comfyui` config manifest.
3
+ */
4
+ import { ComfyuiSettingsSchema } from "../schemas/comfyui.js";
5
+ export { ComfyuiSettingsSchema } from "../schemas/comfyui.js";
6
+ import { ConfigManifest } from '@vibesdotdev/config';
7
+ import { CapabilityError, createRuntimeAsset } from '@vibesdotdev/kernel';
8
+ export const COMFYUI_DEFAULT_BASE_URL = ComfyuiSettingsSchema.parse({}).baseUrl;
9
+ export const COMFYUI_SETTINGS_MANIFEST_ID = 'integrations.comfyui';
10
+ export const comfyuiSettingsManifest = { id: COMFYUI_SETTINGS_MANIFEST_ID, schema: ComfyuiSettingsSchema };
11
+ export async function loadComfyuiSettings(runtime) {
12
+ if (!runtime.hasKind('config/manifest'))
13
+ return ComfyuiSettingsSchema.parse({});
14
+ try {
15
+ return await ConfigManifest.forRuntime(runtime, COMFYUI_SETTINGS_MANIFEST_ID).load();
16
+ }
17
+ catch (error) {
18
+ if (error instanceof CapabilityError && error.reason === 'config-manifest-unregistered') {
19
+ return ComfyuiSettingsSchema.parse({});
20
+ }
21
+ throw error;
22
+ }
23
+ }
24
+ export const comfyuiSettingsDescriptor = createRuntimeAsset({
25
+ kind: 'config/manifest',
26
+ id: COMFYUI_SETTINGS_MANIFEST_ID,
27
+ name: 'ComfyUI',
28
+ namespace: 'integrations',
29
+ description: 'ComfyUI local image-generation connection settings',
30
+ tier: 'user',
31
+ category: 'integrations',
32
+ schema: ComfyuiSettingsSchema,
33
+ fields: {
34
+ clientId: { ui: { label: 'Client ID', component: 'text', group: 'comfyui' } },
35
+ pollDelayMs: { ui: { label: 'History interval (ms)', component: 'number', group: 'comfyui' } },
36
+ baseUrl: { ui: { label: 'Server URL', component: 'text', group: 'comfyui' } },
37
+ timeoutMs: { ui: { label: 'Timeout (ms)', component: 'number', group: 'comfyui' } }
38
+ },
39
+ groups: [{ id: 'comfyui', label: 'ComfyUI' }],
40
+ allowedAdapters: ['storage.localdb', 'storage.json'],
41
+ defaultAdapter: 'storage.localdb',
42
+ scope: 'auto',
43
+ customTables: false,
44
+ version: 1,
45
+ internal: false,
46
+ context: { surfaces: ['cli', 'tui'] },
47
+ enabled: true
48
+ });
49
+ export default comfyuiSettingsDescriptor;
50
+ //# sourceMappingURL=comfyui.config.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfyui.config.descriptor.js","sourceRoot":"","sources":["../../src/config/comfyui.config.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAmB,MAAM,qBAAqB,CAAC;AAE3F,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;AAEhF,MAAM,CAAC,MAAM,4BAA4B,GAAG,sBAAsB,CAAC;AAEnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,EAAE,EAAE,4BAA4B,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;AAE3G,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,OAAmB;IAEnB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAAE,OAAO,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC;QACJ,OAAO,MAAM,cAAc,CAAC,UAAU,CAAkB,OAAO,EAAE,4BAA4B,CAAC,CAAC,IAAI,EAAE,CAAC;IACvG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,CAAC,MAAM,KAAK,8BAA8B,EAAE,CAAC;YACzF,OAAO,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,kBAAkB,CAAC;IAC3D,IAAI,EAAE,iBAAiB;IACvB,EAAE,EAAE,4BAA4B;IAChC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,cAAc;IACzB,WAAW,EAAE,oDAAoD;IACjE,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE;QACP,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7E,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC9F,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7E,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;KACnF;IACD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC7C,eAAe,EAAE,CAAC,iBAAiB,EAAE,cAAc,CAAC;IACpD,cAAc,EAAE,iBAAiB;IACjC,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;IACrC,OAAO,EAAE,IAAI;CACb,CAAC,CAAC;AAEH,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './ai/index.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./ai/index.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,98 @@
1
+ import * as z from 'zod/v4';
2
+ export declare const ComfyUIConnectionSchema: z.ZodObject<{
3
+ baseUrl: z.ZodDefault<z.ZodURL>;
4
+ clientId: z.ZodOptional<z.ZodString>;
5
+ timeout: z.ZodDefault<z.ZodNumber>;
6
+ }, z.core.$strip>;
7
+ export type ComfyUIConnection = z.infer<typeof ComfyUIConnectionSchema>;
8
+ export declare const ComfyuiSettingsSchema: z.ZodObject<{
9
+ baseUrl: z.ZodDefault<z.ZodURL>;
10
+ clientId: z.ZodOptional<z.ZodString>;
11
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
12
+ pollDelayMs: z.ZodDefault<z.ZodNumber>;
13
+ }, z.core.$strip>;
14
+ export type ComfyuiSettings = z.infer<typeof ComfyuiSettingsSchema>;
15
+ export declare const ComfyUIPromptSpecOptionsSchema: z.ZodObject<{
16
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
17
+ pollDelayMs: z.ZodOptional<z.ZodNumber>;
18
+ pollMaxAttempts: z.ZodOptional<z.ZodNumber>;
19
+ }, z.core.$strict>;
20
+ export type ComfyUIPromptSpecOptions = z.infer<typeof ComfyUIPromptSpecOptionsSchema>;
21
+ export declare const ComfyUIHealthOptionsSchema: z.ZodObject<{
22
+ timeout: z.ZodOptional<z.ZodNumber>;
23
+ signal: z.ZodOptional<z.ZodInstanceOf<AbortSignal>>;
24
+ }, z.core.$strip>;
25
+ export declare const ComfyUISystemStatsSchema: z.ZodObject<{
26
+ system: z.ZodObject<{}, z.core.$loose>;
27
+ devices: z.ZodArray<z.ZodObject<{}, z.core.$loose>>;
28
+ }, z.core.$strip>;
29
+ export declare const ComfyUICheckpointsSchema: z.ZodObject<{
30
+ CheckpointLoaderSimple: z.ZodObject<{
31
+ input: z.ZodObject<{
32
+ required: z.ZodObject<{
33
+ ckpt_name: z.ZodTuple<[z.ZodArray<z.ZodString>], z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>;
34
+ }, z.core.$strip>;
35
+ }, z.core.$strip>;
36
+ }, z.core.$strip>;
37
+ }, z.core.$strip>;
38
+ export declare const ComfyUISubmissionSchema: z.ZodObject<{
39
+ prompt_id: z.ZodOptional<z.ZodString>;
40
+ error: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
41
+ message: z.ZodString;
42
+ }, z.core.$strip>]>>;
43
+ node_errors: z.ZodOptional<z.ZodType<import("@vibesdotdev/kernel/schemas/json").JsonObject, import("@vibesdotdev/kernel/schemas/json").JsonObject, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/schemas/json").JsonObject, import("@vibesdotdev/kernel/schemas/json").JsonObject>>>;
44
+ }, z.core.$strip>;
45
+ export declare const ComfyUIImageSchema: z.ZodObject<{
46
+ filename: z.ZodString;
47
+ subfolder: z.ZodDefault<z.ZodString>;
48
+ type: z.ZodDefault<z.ZodString>;
49
+ }, z.core.$strip>;
50
+ export declare const ComfyUIHistoryEntrySchema: z.ZodObject<{
51
+ status: z.ZodOptional<z.ZodObject<{
52
+ status_str: z.ZodEnum<{
53
+ error: "error";
54
+ success: "success";
55
+ }>;
56
+ completed: z.ZodOptional<z.ZodBoolean>;
57
+ messages: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodString, z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>], null>>>;
58
+ }, z.core.$strip>>;
59
+ outputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
60
+ images: z.ZodOptional<z.ZodArray<z.ZodObject<{
61
+ filename: z.ZodString;
62
+ subfolder: z.ZodDefault<z.ZodString>;
63
+ type: z.ZodDefault<z.ZodString>;
64
+ }, z.core.$strip>>>;
65
+ }, z.core.$strip>>>;
66
+ }, z.core.$strip>;
67
+ export declare const ComfyUIHistorySchema: z.ZodRecord<z.ZodString, z.ZodObject<{
68
+ status: z.ZodOptional<z.ZodObject<{
69
+ status_str: z.ZodEnum<{
70
+ error: "error";
71
+ success: "success";
72
+ }>;
73
+ completed: z.ZodOptional<z.ZodBoolean>;
74
+ messages: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodString, z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>], null>>>;
75
+ }, z.core.$strip>>;
76
+ outputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
77
+ images: z.ZodOptional<z.ZodArray<z.ZodObject<{
78
+ filename: z.ZodString;
79
+ subfolder: z.ZodDefault<z.ZodString>;
80
+ type: z.ZodDefault<z.ZodString>;
81
+ }, z.core.$strip>>>;
82
+ }, z.core.$strip>>>;
83
+ }, z.core.$strip>>;
84
+ export type ComfyUIHistoryEntry = z.infer<typeof ComfyUIHistoryEntrySchema>;
85
+ export declare const ComfyUIGraphSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
86
+ class_type: z.ZodString;
87
+ inputs: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodTuple<[z.ZodString, z.ZodNumber], null>]>>;
88
+ }, z.core.$strip>>;
89
+ export type ComfyUIGraph = z.infer<typeof ComfyUIGraphSchema>;
90
+ /** Only a refused TCP connection confirms that this optional local service is absent. */
91
+ export declare const ComfyUIAbsentServiceSchema: z.ZodUnion<readonly [z.ZodObject<{
92
+ code: z.ZodLiteral<"ECONNREFUSED">;
93
+ }, z.core.$strip>, z.ZodObject<{
94
+ cause: z.ZodObject<{
95
+ code: z.ZodLiteral<"ECONNREFUSED">;
96
+ }, z.core.$strip>;
97
+ }, z.core.$strip>]>;
98
+ //# sourceMappingURL=comfyui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfyui.d.ts","sourceRoot":"","sources":["../../src/schemas/comfyui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,uBAAuB;;;;iBAIlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;iBAKhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,8BAA8B;;;;kBAKhC,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,eAAO,MAAM,0BAA0B;;;iBAGrC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;iBAGnC,CAAC;AACH,eAAO,MAAM,wBAAwB;;;;;;;;iBAQnC,CAAC;AACH,eAAO,MAAM,uBAAuB;;;;;;iBAIlC,CAAC;AACH,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;iBASyC,CAAC;AAChF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;kBAAkD,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,eAAO,MAAM,kBAAkB;;;kBAK5B,CAAC;AACJ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,yFAAyF;AACzF,eAAO,MAAM,0BAA0B;;;;;;mBAGrC,CAAC"}
@@ -0,0 +1,69 @@
1
+ import * as z from 'zod/v4';
2
+ import { JsonObjectSchema, JsonValueSchema } from '@vibesdotdev/kernel/schemas/json';
3
+ export const ComfyUIConnectionSchema = z.object({
4
+ baseUrl: z.url({ protocol: /^https?$/ }).default('http://localhost:8188'),
5
+ clientId: z.string().min(1).optional(),
6
+ timeout: z.number().int().positive().default(60_000)
7
+ });
8
+ export const ComfyuiSettingsSchema = z.object({
9
+ baseUrl: ComfyUIConnectionSchema.shape.baseUrl,
10
+ clientId: ComfyUIConnectionSchema.shape.clientId,
11
+ timeoutMs: ComfyUIConnectionSchema.shape.timeout,
12
+ pollDelayMs: z.number().int().nonnegative().default(1000)
13
+ });
14
+ export const ComfyUIPromptSpecOptionsSchema = z.object({
15
+ timeoutMs: z.number().int().positive().optional(),
16
+ pollDelayMs: z.number().int().nonnegative().optional(),
17
+ /** Compatibility input: converted to a real total deadline, never a request count. */
18
+ pollMaxAttempts: z.number().int().positive().optional()
19
+ }).strict();
20
+ export const ComfyUIHealthOptionsSchema = z.object({
21
+ timeout: z.number().int().positive().optional(),
22
+ signal: z.instanceof(AbortSignal).optional()
23
+ });
24
+ export const ComfyUISystemStatsSchema = z.object({
25
+ system: z.object({}).passthrough(),
26
+ devices: z.array(z.object({}).passthrough())
27
+ });
28
+ export const ComfyUICheckpointsSchema = z.object({
29
+ CheckpointLoaderSimple: z.object({
30
+ input: z.object({
31
+ required: z.object({
32
+ ckpt_name: z.tuple([z.array(z.string().min(1))]).rest(JsonValueSchema)
33
+ })
34
+ })
35
+ })
36
+ });
37
+ export const ComfyUISubmissionSchema = z.object({
38
+ prompt_id: z.string().min(1).optional(),
39
+ error: z.union([z.string().min(1), z.object({ message: z.string() })]).optional(),
40
+ node_errors: JsonObjectSchema.optional()
41
+ });
42
+ export const ComfyUIImageSchema = z.object({
43
+ filename: z.string().min(1),
44
+ subfolder: z.string().default(''),
45
+ type: z.string().min(1).default('output')
46
+ });
47
+ export const ComfyUIHistoryEntrySchema = z.object({
48
+ status: z.object({
49
+ status_str: z.enum(['success', 'error']),
50
+ completed: z.boolean().optional(),
51
+ messages: z.array(z.tuple([z.string(), JsonValueSchema])).optional()
52
+ }).optional(),
53
+ outputs: z.record(z.string(), z.object({
54
+ images: z.array(ComfyUIImageSchema).optional()
55
+ })).optional()
56
+ }).refine((entry) => entry.status !== undefined || entry.outputs !== undefined);
57
+ export const ComfyUIHistorySchema = z.record(z.string(), ComfyUIHistoryEntrySchema);
58
+ export const ComfyUIGraphSchema = z.record(z.string(), z.object({
59
+ class_type: z.string(),
60
+ inputs: z.record(z.string(), z.union([
61
+ z.string(), z.number(), z.boolean(), z.tuple([z.string(), z.number()])
62
+ ]))
63
+ }));
64
+ /** Only a refused TCP connection confirms that this optional local service is absent. */
65
+ export const ComfyUIAbsentServiceSchema = z.union([
66
+ z.object({ code: z.literal('ECONNREFUSED') }),
67
+ z.object({ cause: z.object({ code: z.literal('ECONNREFUSED') }) })
68
+ ]);
69
+ //# sourceMappingURL=comfyui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfyui.js","sourceRoot":"","sources":["../../src/schemas/comfyui.ts"],"names":[],"mappings":"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"}