comfyui-node 1.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 (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +601 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/call-wrapper.d.ts +115 -0
  5. package/dist/call-wrapper.d.ts.map +1 -0
  6. package/dist/call-wrapper.js +432 -0
  7. package/dist/call-wrapper.js.map +1 -0
  8. package/dist/client.d.ts +233 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +719 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/constants.d.ts +4 -0
  13. package/dist/constants.d.ts.map +1 -0
  14. package/dist/constants.js +4 -0
  15. package/dist/constants.js.map +1 -0
  16. package/dist/features/abstract.d.ts +15 -0
  17. package/dist/features/abstract.d.ts.map +1 -0
  18. package/dist/features/abstract.js +19 -0
  19. package/dist/features/abstract.js.map +1 -0
  20. package/dist/features/base.d.ts +9 -0
  21. package/dist/features/base.d.ts.map +1 -0
  22. package/dist/features/base.js +15 -0
  23. package/dist/features/base.js.map +1 -0
  24. package/dist/features/feature-flags.d.ts +14 -0
  25. package/dist/features/feature-flags.d.ts.map +1 -0
  26. package/dist/features/feature-flags.js +27 -0
  27. package/dist/features/feature-flags.js.map +1 -0
  28. package/dist/features/file.d.ts +86 -0
  29. package/dist/features/file.d.ts.map +1 -0
  30. package/dist/features/file.js +160 -0
  31. package/dist/features/file.js.map +1 -0
  32. package/dist/features/history.d.ts +16 -0
  33. package/dist/features/history.d.ts.map +1 -0
  34. package/dist/features/history.js +23 -0
  35. package/dist/features/history.js.map +1 -0
  36. package/dist/features/index.d.ts +14 -0
  37. package/dist/features/index.d.ts.map +1 -0
  38. package/dist/features/index.js +14 -0
  39. package/dist/features/index.js.map +1 -0
  40. package/dist/features/manager.d.ts +154 -0
  41. package/dist/features/manager.d.ts.map +1 -0
  42. package/dist/features/manager.js +309 -0
  43. package/dist/features/manager.js.map +1 -0
  44. package/dist/features/misc.d.ts +17 -0
  45. package/dist/features/misc.d.ts.map +1 -0
  46. package/dist/features/misc.js +52 -0
  47. package/dist/features/misc.js.map +1 -0
  48. package/dist/features/model.d.ts +39 -0
  49. package/dist/features/model.d.ts.map +1 -0
  50. package/dist/features/model.js +79 -0
  51. package/dist/features/model.js.map +1 -0
  52. package/dist/features/monitoring.d.ts +90 -0
  53. package/dist/features/monitoring.d.ts.map +1 -0
  54. package/dist/features/monitoring.js +129 -0
  55. package/dist/features/monitoring.js.map +1 -0
  56. package/dist/features/node.d.ts +42 -0
  57. package/dist/features/node.d.ts.map +1 -0
  58. package/dist/features/node.js +68 -0
  59. package/dist/features/node.js.map +1 -0
  60. package/dist/features/queue.d.ts +23 -0
  61. package/dist/features/queue.d.ts.map +1 -0
  62. package/dist/features/queue.js +68 -0
  63. package/dist/features/queue.js.map +1 -0
  64. package/dist/features/system.d.ts +21 -0
  65. package/dist/features/system.d.ts.map +1 -0
  66. package/dist/features/system.js +45 -0
  67. package/dist/features/system.js.map +1 -0
  68. package/dist/features/terminal.d.ts +25 -0
  69. package/dist/features/terminal.d.ts.map +1 -0
  70. package/dist/features/terminal.js +32 -0
  71. package/dist/features/terminal.js.map +1 -0
  72. package/dist/features/user.d.ts +42 -0
  73. package/dist/features/user.d.ts.map +1 -0
  74. package/dist/features/user.js +76 -0
  75. package/dist/features/user.js.map +1 -0
  76. package/dist/index.d.ts +8 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +6 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/pool.d.ts +171 -0
  81. package/dist/pool.d.ts.map +1 -0
  82. package/dist/pool.js +467 -0
  83. package/dist/pool.js.map +1 -0
  84. package/dist/prompt-builder.d.ts +131 -0
  85. package/dist/prompt-builder.d.ts.map +1 -0
  86. package/dist/prompt-builder.js +266 -0
  87. package/dist/prompt-builder.js.map +1 -0
  88. package/dist/tools.d.ts +10 -0
  89. package/dist/tools.d.ts.map +1 -0
  90. package/dist/tools.js +16 -0
  91. package/dist/tools.js.map +1 -0
  92. package/dist/typed-event-target.d.ts +7 -0
  93. package/dist/typed-event-target.d.ts.map +1 -0
  94. package/dist/typed-event-target.js +19 -0
  95. package/dist/typed-event-target.js.map +1 -0
  96. package/dist/types/api.d.ts +212 -0
  97. package/dist/types/api.d.ts.map +1 -0
  98. package/dist/types/api.js +16 -0
  99. package/dist/types/api.js.map +1 -0
  100. package/dist/types/error.d.ts +72 -0
  101. package/dist/types/error.d.ts.map +1 -0
  102. package/dist/types/error.js +75 -0
  103. package/dist/types/error.js.map +1 -0
  104. package/dist/types/event.d.ts +164 -0
  105. package/dist/types/event.d.ts.map +1 -0
  106. package/dist/types/event.js +2 -0
  107. package/dist/types/event.js.map +1 -0
  108. package/dist/types/manager.d.ts +157 -0
  109. package/dist/types/manager.d.ts.map +1 -0
  110. package/dist/types/manager.js +41 -0
  111. package/dist/types/manager.js.map +1 -0
  112. package/dist/types/sampler.d.ts +3 -0
  113. package/dist/types/sampler.d.ts.map +1 -0
  114. package/dist/types/sampler.js +2 -0
  115. package/dist/types/sampler.js.map +1 -0
  116. package/dist/types/tool.d.ts +10 -0
  117. package/dist/types/tool.d.ts.map +1 -0
  118. package/dist/types/tool.js +2 -0
  119. package/dist/types/tool.js.map +1 -0
  120. package/dist/utils/response-error.d.ts +4 -0
  121. package/dist/utils/response-error.d.ts.map +1 -0
  122. package/dist/utils/response-error.js +62 -0
  123. package/dist/utils/response-error.js.map +1 -0
  124. package/dist/utils/ws-reconnect.d.ts +29 -0
  125. package/dist/utils/ws-reconnect.d.ts.map +1 -0
  126. package/dist/utils/ws-reconnect.js +91 -0
  127. package/dist/utils/ws-reconnect.js.map +1 -0
  128. package/package.json +71 -0
package/dist/pool.js ADDED
@@ -0,0 +1,467 @@
1
+ import { delay } from "./tools.js";
2
+ import { TypedEventTarget } from "./typed-event-target.js";
3
+ /**
4
+ * Represents the mode for picking clients from a queue.
5
+ *
6
+ * - "PICK_ZERO": Picks the client which has zero queue remaining. This is the default mode. (For who using along with ComfyUI web interface)
7
+ * - "PICK_LOWEST": Picks the client which has the lowest queue remaining.
8
+ * - "PICK_ROUTINE": Picks the client in a round-robin manner.
9
+ */
10
+ export var EQueueMode;
11
+ (function (EQueueMode) {
12
+ /**
13
+ * Picks the client which has zero queue remaining. This is the default mode. (For who using along with ComfyUI web interface)
14
+ */
15
+ EQueueMode[EQueueMode["PICK_ZERO"] = 0] = "PICK_ZERO";
16
+ /**
17
+ * Picks the client which has the lowest queue remaining.
18
+ */
19
+ EQueueMode[EQueueMode["PICK_LOWEST"] = 1] = "PICK_LOWEST";
20
+ /**
21
+ * Picks the client in a round-robin manner.
22
+ */
23
+ EQueueMode[EQueueMode["PICK_ROUTINE"] = 2] = "PICK_ROUTINE";
24
+ })(EQueueMode || (EQueueMode = {}));
25
+ export class ComfyPool extends TypedEventTarget {
26
+ clients = [];
27
+ clientStates = [];
28
+ mode = EQueueMode.PICK_ZERO;
29
+ jobQueue = [];
30
+ routineIdx = 0;
31
+ maxQueueSize = 1000;
32
+ poolMonitoringInterval;
33
+ claimTimeoutMs = -1;
34
+ constructor(clients,
35
+ /**
36
+ * The mode for picking clients from the queue. Defaults to "PICK_ZERO".
37
+ */
38
+ mode = EQueueMode.PICK_ZERO, opts) {
39
+ super();
40
+ this.mode = mode;
41
+ if (opts && typeof opts.maxQueueSize === "number") {
42
+ if (opts.maxQueueSize < 0) {
43
+ throw new Error("maxQueueSize cannot be negative");
44
+ }
45
+ this.maxQueueSize = opts.maxQueueSize;
46
+ }
47
+ if (typeof opts?.claimTimeoutMs === "number") {
48
+ this.claimTimeoutMs = opts.claimTimeoutMs;
49
+ }
50
+ this.poolMonitoringInterval = setInterval(() => {
51
+ this.processJobQueue().catch((err) => {
52
+ console.error("[ComfyPool] Error processing job queue:", err);
53
+ });
54
+ }, 5000);
55
+ this.initPool(clients).then(() => {
56
+ this.dispatchEvent(new CustomEvent("init"));
57
+ }).catch(reason => {
58
+ console.error("[ComfyPool] Error initializing pool:", reason);
59
+ this.dispatchEvent(new CustomEvent("error", { detail: reason }));
60
+ });
61
+ }
62
+ async initPool(clients) {
63
+ for (const client of clients) {
64
+ await this.addClient(client);
65
+ }
66
+ await this.processJobQueue();
67
+ }
68
+ // Use inherited on/off which return unsubscriber; provide chain helpers if desired.
69
+ chainOn(type, callback, options) {
70
+ super.on(type, callback, options);
71
+ return this;
72
+ }
73
+ chainOff(type, callback, options) {
74
+ super.off(type, callback, options);
75
+ return this;
76
+ }
77
+ /**
78
+ * Removes all event listeners from the pool.
79
+ */
80
+ removeAllListeners() {
81
+ // No internal registry now; rely on GC for one-off handlers or keep a manual registry later if needed.
82
+ }
83
+ /**
84
+ * Adds a client to the pool.
85
+ *
86
+ * @param client - The client to be added.
87
+ * @returns Promise<void>
88
+ */
89
+ async addClient(client) {
90
+ const index = this.clients.push(client) - 1;
91
+ this.clientStates.push({
92
+ id: client.id,
93
+ queueRemaining: 0,
94
+ locked: false,
95
+ online: false
96
+ });
97
+ await this.initializeClient(client, index);
98
+ this.dispatchEvent(new CustomEvent("added", { detail: { client, clientIdx: index } }));
99
+ }
100
+ /**
101
+ * Destroys the pool and all its clients.
102
+ * Ensures all connections, timers and event listeners are properly closed.
103
+ */
104
+ destroy() {
105
+ // Cancel any pending jobs
106
+ this.jobQueue = [];
107
+ // Destroy all clients properly and ensure they're cleaned up
108
+ this.clients.forEach((client, index) => {
109
+ try {
110
+ client.destroy();
111
+ }
112
+ catch (e) {
113
+ console.error(`[ComfyPool] Error destroying client ${client.id}:`, e);
114
+ }
115
+ });
116
+ // Clear arrays
117
+ this.clients = [];
118
+ this.clientStates = [];
119
+ // Remove all event listeners
120
+ this.removeAllListeners();
121
+ if (this.poolMonitoringInterval) {
122
+ clearInterval(this.poolMonitoringInterval);
123
+ this.poolMonitoringInterval = undefined;
124
+ }
125
+ }
126
+ /**
127
+ * Removes a client from the pool.
128
+ *
129
+ * @param client - The client to be removed.
130
+ * @returns void
131
+ */
132
+ removeClient(client) {
133
+ const index = this.clients.indexOf(client);
134
+ this.removeClientByIndex(index);
135
+ }
136
+ /**
137
+ * Removes a client from the pool by its index.
138
+ *
139
+ * @param index - The index of the client to remove.
140
+ * @returns void
141
+ * @fires removed - Fires a "removed" event with the removed client and its index as detail.
142
+ */
143
+ removeClientByIndex(index) {
144
+ if (index >= 0 && index < this.clients.length) {
145
+ const client = this.clients.splice(index, 1)[0];
146
+ client.destroy();
147
+ this.clientStates.splice(index, 1);
148
+ this.dispatchEvent(new CustomEvent("removed", { detail: { client, clientIdx: index } }));
149
+ }
150
+ }
151
+ /**
152
+ * Changes the mode of the queue.
153
+ *
154
+ * @param mode - The new mode to set for the queue.
155
+ * @returns void
156
+ */
157
+ changeMode(mode) {
158
+ this.mode = mode;
159
+ this.dispatchEvent(new CustomEvent("change_mode", { detail: { mode } }));
160
+ }
161
+ /**
162
+ * Picks a ComfyApi client from the pool based on the given index.
163
+ *
164
+ * @param idx - The index of the client to pick. Defaults to 0 if not provided.
165
+ * @returns The picked ComfyApi client.
166
+ */
167
+ pick(idx = 0) {
168
+ return this.clients[idx];
169
+ }
170
+ /**
171
+ * Retrieves a `ComfyApi` object from the pool based on the provided ID.
172
+ * @param id - The ID of the `ComfyApi` object to retrieve.
173
+ * @returns The `ComfyApi` object with the matching ID, or `undefined` if not found.
174
+ */
175
+ pickById(id) {
176
+ return this.clients.find((c) => c.id === id);
177
+ }
178
+ /**
179
+ * Executes a job using the provided client and optional client index.
180
+ *
181
+ * @template T The type of the result returned by the job.
182
+ * @param {Function} job The job to be executed.
183
+ * @param {number} [weight] The weight of the job.
184
+ * @param {Object} [clientFilter] An object containing client filtering options.
185
+ * @param {Object} [options] Additional options for job execution.
186
+ * @returns {Promise<T>} A promise that resolves with the result of the job.
187
+ */
188
+ run(job, weight, clientFilter, options) {
189
+ const enableFailover = options?.enableFailover !== false; // Default to true
190
+ const retryDelay = options?.retryDelay || 1000;
191
+ return new Promise(async (resolve, reject) => {
192
+ let excludedIds = clientFilter?.excludeIds ? [...clientFilter.excludeIds] : [];
193
+ let attempt = 0;
194
+ const onlineClients = this.clientStates.filter((c) => c.online);
195
+ const maxRetries = options?.maxRetries || onlineClients.length;
196
+ let lastError = null;
197
+ const tryExecute = async () => {
198
+ attempt++;
199
+ const fn = async (client, idx) => {
200
+ this.dispatchEvent(new CustomEvent("executing", { detail: { client, clientIdx: idx } }));
201
+ try {
202
+ const result = await job(client, idx);
203
+ this.dispatchEvent(new CustomEvent("executed", { detail: { client, clientIdx: idx } }));
204
+ resolve(result);
205
+ }
206
+ catch (e) {
207
+ lastError = e;
208
+ console.error(`[ComfyPool] Job failed on client ${client.id} (attempt ${attempt}/${maxRetries}):`, e);
209
+ // If failover is enabled and we have more attempts, exclude this client and retry
210
+ if (enableFailover && attempt < maxRetries && onlineClients.length > excludedIds.length) {
211
+ excludedIds.push(client.id);
212
+ this.dispatchEvent(new CustomEvent("execution_error", {
213
+ detail: { client, clientIdx: idx, error: e, willRetry: true, attempt, maxRetries }
214
+ }));
215
+ // Wait before retrying
216
+ setTimeout(() => {
217
+ tryExecute().catch(reject);
218
+ }, retryDelay);
219
+ }
220
+ else {
221
+ // No more retries or failover disabled, reject with the error
222
+ this.dispatchEvent(new CustomEvent("execution_error", {
223
+ detail: { client, clientIdx: idx, error: e, willRetry: false, attempt, maxRetries }
224
+ }));
225
+ reject(e);
226
+ }
227
+ }
228
+ };
229
+ try {
230
+ await this.claim(fn, weight, {
231
+ includeIds: clientFilter?.includeIds,
232
+ excludeIds: excludedIds
233
+ }, (err) => {
234
+ // onError from claim (e.g. timeout acquiring client)
235
+ lastError = err;
236
+ reject(err);
237
+ });
238
+ }
239
+ catch (claimError) {
240
+ reject(lastError || claimError);
241
+ }
242
+ };
243
+ // Start the first attempt
244
+ tryExecute().catch(reject);
245
+ });
246
+ }
247
+ /**
248
+ * Executes a batch of asynchronous jobs concurrently and returns an array of results.
249
+ *
250
+ * @template T - The type of the result returned by each job.
251
+ * @param jobs - An array of functions that represent the asynchronous jobs to be executed.
252
+ * @param weight - An optional weight value to assign to each job.
253
+ * @param clientFilter - An optional object containing client filtering options.
254
+ * @returns A promise that resolves to an array of results, in the same order as the jobs array.
255
+ */
256
+ batch(jobs, weight, clientFilter) {
257
+ return Promise.all(jobs.map((task) => this.run(task, weight, clientFilter)));
258
+ }
259
+ async initializeClient(client, index) {
260
+ this.dispatchEvent(new CustomEvent("loading_client", {
261
+ detail: { client, clientIdx: index }
262
+ }));
263
+ const states = this.clientStates[index];
264
+ client.on("status", (ev) => {
265
+ if (states.online === false) {
266
+ this.dispatchEvent(new CustomEvent("connected", { detail: { client, clientIdx: index } }));
267
+ }
268
+ states.online = true;
269
+ if (ev.detail.status.exec_info && ev.detail.status.exec_info.queue_remaining !== states.queueRemaining) {
270
+ if (ev.detail.status.exec_info.queue_remaining > 0) {
271
+ this.dispatchEvent(new CustomEvent("have_job", {
272
+ detail: { client, remain: states.queueRemaining }
273
+ }));
274
+ }
275
+ if (ev.detail.status.exec_info.queue_remaining === 0) {
276
+ this.dispatchEvent(new CustomEvent("idle", { detail: { client } }));
277
+ }
278
+ }
279
+ states.queueRemaining = ev.detail.status.exec_info.queue_remaining;
280
+ if (this.mode !== EQueueMode.PICK_ZERO) {
281
+ states.locked = false;
282
+ }
283
+ });
284
+ client.on("terminal", (ev) => {
285
+ this.dispatchEvent(new CustomEvent("terminal", {
286
+ detail: {
287
+ clientIdx: index,
288
+ ...ev.detail
289
+ }
290
+ }));
291
+ });
292
+ client.on("disconnected", () => {
293
+ states.online = false;
294
+ states.locked = false;
295
+ this.dispatchEvent(new CustomEvent("disconnected", {
296
+ detail: { client, clientIdx: index }
297
+ }));
298
+ });
299
+ client.on("reconnected", () => {
300
+ states.online = true;
301
+ states.locked = false;
302
+ this.dispatchEvent(new CustomEvent("reconnected", {
303
+ detail: { client, clientIdx: index }
304
+ }));
305
+ });
306
+ client.on("execution_success", (ev) => {
307
+ states.locked = false;
308
+ });
309
+ client.on("execution_interrupted", (ev) => {
310
+ states.locked = false;
311
+ this.dispatchEvent(new CustomEvent("execution_interrupted", {
312
+ detail: {
313
+ client,
314
+ clientIdx: index
315
+ }
316
+ }));
317
+ });
318
+ client.on("execution_error", (ev) => {
319
+ states.locked = false;
320
+ this.dispatchEvent(new CustomEvent("execution_error", {
321
+ detail: {
322
+ client,
323
+ clientIdx: index,
324
+ error: new Error(ev.detail.exception_type, { cause: ev.detail })
325
+ }
326
+ }));
327
+ });
328
+ client.on("queue_error", (ev) => {
329
+ states.locked = false;
330
+ });
331
+ client.on("auth_error", (ev) => {
332
+ this.dispatchEvent(new CustomEvent("auth_error", {
333
+ detail: { client, clientIdx: index, res: ev.detail }
334
+ }));
335
+ });
336
+ client.on("auth_success", (ev) => {
337
+ this.dispatchEvent(new CustomEvent("auth_success", {
338
+ detail: { client, clientIdx: index }
339
+ }));
340
+ });
341
+ client.on("connection_error", (ev) => {
342
+ this.dispatchEvent(new CustomEvent("connection_error", {
343
+ detail: { client, clientIdx: index, res: ev.detail }
344
+ }));
345
+ });
346
+ /**
347
+ * Wait for the client to be ready before start using it
348
+ * Note: init() now returns the client instance and sets isReady=true internally
349
+ */
350
+ await client.init();
351
+ // No need to call waitForReady() as init() already does that
352
+ this.bindClientSystemMonitor(client, index);
353
+ this.dispatchEvent(new CustomEvent("ready", { detail: { client, clientIdx: index } }));
354
+ }
355
+ async bindClientSystemMonitor(client, index) {
356
+ if (client.ext.monitor.isSupported) {
357
+ client.ext.monitor.on("system_monitor", (ev) => {
358
+ this.dispatchEvent(new CustomEvent("system_monitor", {
359
+ detail: {
360
+ client,
361
+ data: ev.detail,
362
+ clientIdx: index
363
+ }
364
+ }));
365
+ });
366
+ }
367
+ }
368
+ pushJobByWeight(item) {
369
+ const idx = this.jobQueue.findIndex((job) => job.weight > item.weight);
370
+ if (idx === -1) {
371
+ return this.jobQueue.push(item);
372
+ }
373
+ else {
374
+ this.jobQueue.splice(idx, 0, item);
375
+ return idx;
376
+ }
377
+ }
378
+ async claim(fn, weight, clientFilter, onError) {
379
+ if (this.jobQueue.length >= this.maxQueueSize) {
380
+ throw new Error("Job queue limit reached");
381
+ }
382
+ const inputWeight = weight === undefined ? this.jobQueue.length : weight;
383
+ const idx = this.pushJobByWeight({
384
+ weight: inputWeight,
385
+ fn,
386
+ excludeClientIds: clientFilter?.excludeIds,
387
+ includeClientIds: clientFilter?.includeIds,
388
+ onError
389
+ });
390
+ this.dispatchEvent(new CustomEvent("add_job", {
391
+ detail: { jobIdx: idx, weight: inputWeight }
392
+ }));
393
+ await this.processJobQueue();
394
+ }
395
+ async getAvailableClient(includeIds, excludeIds, timeout = -1) {
396
+ let tries = 1;
397
+ const start = Date.now();
398
+ while (true) {
399
+ if (timeout > 0 && Date.now() - start > timeout) {
400
+ throw new Error("Timeout waiting for an available client");
401
+ }
402
+ if (tries < 100)
403
+ tries++;
404
+ let index = -1;
405
+ const acceptedClients = this.clientStates.filter((c) => {
406
+ if (!c.online)
407
+ return false;
408
+ if (includeIds && includeIds.length > 0) {
409
+ return includeIds.includes(c.id);
410
+ }
411
+ if (excludeIds && excludeIds.length > 0) {
412
+ return !excludeIds.includes(c.id);
413
+ }
414
+ return true;
415
+ });
416
+ switch (this.mode) {
417
+ case EQueueMode.PICK_ZERO:
418
+ index = acceptedClients.findIndex((c) => c.queueRemaining === 0 && !c.locked && c.id);
419
+ break;
420
+ case EQueueMode.PICK_LOWEST:
421
+ const queueSizes = acceptedClients.map((state) => state.online ? state.queueRemaining : Number.MAX_SAFE_INTEGER);
422
+ index = queueSizes.indexOf(Math.min(...queueSizes));
423
+ break;
424
+ case EQueueMode.PICK_ROUTINE:
425
+ index = this.routineIdx++ % acceptedClients.length;
426
+ this.routineIdx = this.routineIdx % acceptedClients.length;
427
+ break;
428
+ }
429
+ if (index !== -1 && acceptedClients[index]) {
430
+ const trueIdx = this.clientStates.findIndex((c) => c.id === acceptedClients[index].id);
431
+ this.clientStates[trueIdx].locked = true;
432
+ return this.clients[trueIdx];
433
+ }
434
+ await delay(Math.min(tries * 10));
435
+ }
436
+ }
437
+ async processJobQueue() {
438
+ if (this.jobQueue.length === 0) {
439
+ return;
440
+ }
441
+ while (this.jobQueue.length > 0) {
442
+ const job = this.jobQueue.shift();
443
+ if (!job)
444
+ continue;
445
+ try {
446
+ const client = await this.getAvailableClient(job.includeClientIds, job.excludeClientIds, this.claimTimeoutMs);
447
+ const clientIdx = this.clients.indexOf(client);
448
+ await job.fn(client, clientIdx);
449
+ }
450
+ catch (error) {
451
+ console.error("[ComfyPool] Error processing job:", error);
452
+ try {
453
+ job?.onError?.(error);
454
+ }
455
+ catch { }
456
+ }
457
+ }
458
+ }
459
+ }
460
+ // Test-only helpers (non-breaking; ignored at runtime usage)
461
+ export const __TEST_ONLY__ = {
462
+ snapshotQueue(pool) {
463
+ const queue = pool.jobQueue;
464
+ return queue.map((j) => ({ weight: j.weight, include: j.includeClientIds, exclude: j.excludeClientIds }));
465
+ }
466
+ };
467
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAmB3D;;;;;;GAMG;AACH,MAAM,CAAN,IAAY,UAaX;AAbD,WAAY,UAAU;IACpB;;OAEG;IACH,qDAAW,CAAA;IACX;;OAEG;IACH,yDAAa,CAAA;IACb;;OAEG;IACH,2DAAc,CAAA;AAChB,CAAC,EAbW,UAAU,KAAV,UAAU,QAarB;AAED,MAAM,OAAO,SAAU,SAAQ,gBAAoC;IAC1D,OAAO,GAAe,EAAE,CAAC;IACxB,YAAY,GAKf,EAAE,CAAC;IAEA,IAAI,GAAe,UAAU,CAAC,SAAS,CAAC;IACxC,QAAQ,GAAmB,EAAE,CAAC;IAC9B,UAAU,GAAW,CAAC,CAAC;IACd,YAAY,GAAW,IAAI,CAAC;IACrC,sBAAsB,CAA6C;IACnE,cAAc,GAAW,CAAC,CAAC,CAAC;IAEpC,YACE,OAAmB;IACnB;;OAEG;IACH,OAAmB,UAAU,CAAC,SAAS,EACvC,IASC;QAED,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,IAAI,EAAE,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACnC,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAChB,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAmB;QAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,oFAAoF;IAC7E,OAAO,CAAqC,IAAO,EAAE,QAAgD,EAAE,OAA2C;QACvJ,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IACM,QAAQ,CAAqC,IAAO,EAAE,QAAgD,EAAE,OAAwC;QACrJ,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,QAAe,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,kBAAkB;QACvB,uGAAuG;IACzG,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,MAAgB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACrB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC;IAED;;;OAGG;IACH,OAAO;QAEL,0BAA0B;QAC1B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QAEnB,6DAA6D;QAC7D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,uCAAuC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,6BAA6B;QAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC3C,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,MAAgB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAa;QAC/B,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,IAAgB;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,MAAc,CAAC;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;OASG;IACH,GAAG,CACD,GAAyD,EACzD,MAAe,EACf,YASC,EACD,OAgBC;QAED,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC,kBAAkB;QAC5E,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;QAE/C,OAAO,IAAI,OAAO,CAAI,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,IAAI,WAAW,GAAG,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAChE,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,aAAa,CAAC,MAAM,CAAC;YACnE,IAAI,SAAS,GAAY,IAAI,CAAC;YAE1B,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;gBAC3C,OAAO,EAAE,CAAC;gBAEV,MAAM,EAAE,GAAG,KAAK,EAAE,MAAgB,EAAE,GAAY,EAAE,EAAE;oBAClD,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;oBACzF,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;wBACtC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;wBACxF,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,SAAS,GAAG,CAAC,CAAC;wBACd,OAAO,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,EAAE,aAAa,OAAO,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;wBAEtG,kFAAkF;wBAClF,IAAI,cAAc,IAAI,OAAO,GAAG,UAAU,IAAI,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;4BACxF,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;4BAC5B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE;gCACjC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE;6BACnF,CAAC,CACH,CAAC;4BAEF,uBAAuB;4BACvB,UAAU,CAAC,GAAG,EAAE;gCACd,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;4BAC7B,CAAC,EAAE,UAAU,CAAC,CAAC;wBACjB,CAAC;6BAAM,CAAC;4BACN,8DAA8D;4BAC9D,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE;gCACjC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE;6BACpF,CAAC,CACH,CAAC;4BACF,MAAM,CAAC,CAAC,CAAC,CAAC;wBACZ,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE;wBAC3B,UAAU,EAAE,YAAY,EAAE,UAAU;wBACpC,UAAU,EAAE,WAAW;qBACxB,EAAE,CAAC,GAAG,EAAE,EAAE;wBACT,qDAAqD;wBACrD,SAAS,GAAG,GAAG,CAAC;wBAChB,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,MAAM,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC,CAAC;YAEF,0BAA0B;YAC1B,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CACH,IAAiE,EACjE,MAAe,EACf,YASC;QAED,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,MAAgB,EAAE,KAAa;QAC5D,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,gBAAgB,EAAE;YAChC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;SACrC,CAAC,CACH,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;YACzB,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7F,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,KAAK,MAAM,CAAC,cAAc,EAAE,CAAC;gBACvG,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;oBACnD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,UAAU,EAAE;wBAC1B,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE;qBAClD,CAAC,CACH,CAAC;gBACJ,CAAC;gBACD,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,KAAK,CAAC,EAAE,CAAC;oBACrD,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YACD,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;YACnE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE;YAC3B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,UAAU,EAAE;gBAC1B,MAAM,EAAE;oBACN,SAAS,EAAE,KAAK;oBAChB,GAAG,EAAE,CAAC,MAAM;iBACb;aACF,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YACtB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;aACrC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,aAAa,EAAE;gBAC7B,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;aACrC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE;YACpC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,EAAE,EAAE,EAAE;YACxC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,uBAAuB,EAAE;gBACvC,MAAM,EAAE;oBACN,MAAM;oBACN,SAAS,EAAE,KAAK;iBACjB;aACF,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE;YAClC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,iBAAiB,EAAE;gBACjC,MAAM,EAAE;oBACN,MAAM;oBACN,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;iBACjE;aACF,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE;YAC9B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,YAAY,EAAE;gBAC5B,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE;aACrD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE;YAC/B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;aACrC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE;YACnC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,kBAAkB,EAAE;gBAClC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE;aACrD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH;;;WAGG;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAEpB,6DAA6D;QAC7D,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,MAAgB,EAAE,KAAa;QACnE,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE;gBAC7C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,gBAAgB,EAAE;oBAChC,MAAM,EAAE;wBACN,MAAM;wBACN,IAAI,EAAE,EAAE,CAAC,MAAM;wBACf,SAAS,EAAE,KAAK;qBACjB;iBACF,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAAa;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACvE,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACnC,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CACjB,EAA2D,EAC3D,MAAe,EACf,YAGC,EACD,OAAgC;QAEhC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;YAC/B,MAAM,EAAE,WAAW;YACnB,EAAE;YACF,gBAAgB,EAAE,YAAY,EAAE,UAAU;YAC1C,gBAAgB,EAAE,YAAY,EAAE,UAAU;YAC1C,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,SAAS,EAAE;YACzB,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE;SAC7C,CAAC,CACH,CAAC;QACF,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,UAAqB,EAAE,UAAqB,EAAE,OAAO,GAAG,CAAC,CAAC;QACzF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YACD,IAAI,KAAK,GAAG,GAAG;gBAAE,KAAK,EAAE,CAAC;YACzB,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACf,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrD,IAAI,CAAC,CAAC,CAAC,MAAM;oBAAE,OAAO,KAAK,CAAC;gBAC5B,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnC,CAAC;gBACD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,UAAU,CAAC,SAAS;oBACvB,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtF,MAAM;gBACR,KAAK,UAAU,CAAC,WAAW;oBACzB,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAC9D,CAAC;oBACF,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;oBACpD,MAAM;gBACR,KAAK,UAAU,CAAC,YAAY;oBAC1B,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC;oBACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC;oBAC3D,MAAM;YACV,CAAC;YACD,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;gBACzC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAE3B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC9G,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;gBAC1D,IAAI,CAAC;oBACH,GAAG,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC,CAAC,CAAC;YACb,CAAC;QACH,CAAC;IAEH,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,aAAa,CAAC,IAAe;QAC3B,MAAM,KAAK,GAAe,IAA2C,CAAC,QAAQ,CAAC;QAC/E,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC5G,CAAC;CACF,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { NodeData, OSType } from "./types/api.js";
2
+ import { DeepKeys, Simplify } from "./types/tool.js";
3
+ export declare class PromptBuilder<I extends string, O extends string, T extends NodeData> {
4
+ prompt: T;
5
+ mapInputKeys: Partial<Record<I, string | string[]>>;
6
+ mapOutputKeys: Partial<Record<O, string>>;
7
+ bypassNodes: (keyof T)[];
8
+ constructor(prompt: T, inputKeys: I[], outputKeys: O[]);
9
+ /**
10
+ * Creates a new instance of the PromptBuilder with the same prompt, input keys, and output keys.
11
+ *
12
+ * @returns A new instance of the PromptBuilder.
13
+ */
14
+ clone(): PromptBuilder<I, O, T>;
15
+ /**
16
+ * Marks a node to be bypassed at generation.
17
+ *
18
+ * @param node Node which will be bypassed.
19
+ */
20
+ bypass(node: keyof T): PromptBuilder<I, O, T>;
21
+ /**
22
+ * Marks multiple nodes to be bypassed at generation.
23
+ *
24
+ * @param nodes Array of nodes which will be bypassed.
25
+ */
26
+ bypass(nodes: (keyof T)[]): PromptBuilder<I, O, T>;
27
+ /**
28
+ * Unmarks a node from bypass at generation.
29
+ *
30
+ * @param node Node to reverse bypass on.
31
+ */
32
+ reinstate(node: keyof T): PromptBuilder<I, O, T>;
33
+ /**
34
+ * Unmarks a collection of nodes from bypass at generation.
35
+ *
36
+ * @param nodes Array of nodes to reverse bypass on.
37
+ */
38
+ reinstate(nodes: (keyof T)[]): PromptBuilder<I, O, T>;
39
+ /**
40
+ * Sets the input node for a given key. Can be map multiple keys to the same input.
41
+ *
42
+ * @param input - The input node to set.
43
+ * @param key - The key(s) to associate with the input node. Can be array of keys.
44
+ * @returns This builder instance.
45
+ */
46
+ setInputNode(input: I, key: DeepKeys<T> | Array<DeepKeys<T>>): PromptBuilder<I, O, T>;
47
+ /**
48
+ * Sets the raw input node for the given input and key. This will bypass the typing check. Use for dynamic nodes.
49
+ *
50
+ * @param input - The input node to be set.
51
+ * @param key - The key associated with the input node.
52
+ * @returns The current instance for method chaining.
53
+ */
54
+ setRawInputNode(input: I, key: string | string[]): PromptBuilder<I, O, T>;
55
+ /**
56
+ * Appends raw input node keys to the map of input keys. This will bypass the typing check. Use for dynamic nodes.
57
+ *
58
+ * @param input - The input node to which the keys will be appended.
59
+ * @param key - The key or array of keys to append to the input node.
60
+ * @returns A clone of the current instance with the updated input keys.
61
+ */
62
+ appendRawInputNode(input: I, key: string | string[]): PromptBuilder<I, O, T>;
63
+ /**
64
+ * Appends mapped key into the input node.
65
+ *
66
+ * @param input - The input node to append.
67
+ * @param key - The key(s) to associate with the input node. Can be array of keys.
68
+ * @returns The updated prompt builder.
69
+ */
70
+ appendInputNode(input: I, key: DeepKeys<T> | Array<DeepKeys<T>>): PromptBuilder<I, O, T>;
71
+ /**
72
+ * Sets the output node for a given key. This will bypass the typing check. Use for dynamic nodes.
73
+ *
74
+ * @param output - The output node to set.
75
+ * @param key - The key to associate with the output node.
76
+ * @returns This builder instance.
77
+ */
78
+ setRawOutputNode(output: O, key: string): PromptBuilder<I, O, T>;
79
+ /**
80
+ * Sets the output node for a given key.
81
+ *
82
+ * @param output - The output node to set.
83
+ * @param key - The key to associate with the output node.
84
+ * @returns This builder instance.
85
+ */
86
+ setOutputNode(output: O, key: DeepKeys<T>): PromptBuilder<I, O, T>;
87
+ /**
88
+ * Sets the value for a specific input key in the prompt builder.
89
+ *
90
+ * @template V - The type of the value being set.
91
+ * @param {I} key - The input key.
92
+ * @param {V} value - The value to set.
93
+ * @param {OSType} [encodeOs] - The OS type to encode the path.
94
+ * @returns A new prompt builder with the updated value.
95
+ * @throws {Error} - If the key is not found.
96
+ */
97
+ input<V = string | number | undefined>(key: I, value: V, encodeOs?: OSType): Simplify<PromptBuilder<I, O, T>>;
98
+ /**
99
+ * Sets the value for a any input key in the prompt builder.
100
+ *
101
+ * @template V - The type of the value being set.
102
+ * @param {string} key - The input key.
103
+ * @param {V} value - The value to set.
104
+ * @param {OSType} [encodeOs] - The OS type to encode the path.
105
+ * @returns A new prompt builder with the updated value.
106
+ * @throws {Error} - If the key is not found.
107
+ */
108
+ inputRaw<V = string | number | undefined>(key: string, value: V, encodeOs?: OSType): Simplify<PromptBuilder<I, O, T>>;
109
+ /**
110
+ * @deprecated Please call `input` directly instead
111
+ */
112
+ get caller(): this;
113
+ /**
114
+ * Gets the workflow object of the prompt builder.
115
+ */
116
+ get workflow(): Simplify<T>;
117
+ /**
118
+ * Validates that all declared output keys are mapped to existing nodes in the workflow.
119
+ * Throws an Error listing missing mappings.
120
+ */
121
+ validateOutputMappings(): this;
122
+ /**
123
+ * Detect simple circular references in node inputs (node referencing itself directly or via immediate tuple link).
124
+ * More advanced graph cycles can be added later.
125
+ */
126
+ validateNoImmediateCycles(): this;
127
+ /** Serialize builder state (excluding functions) */
128
+ toJSON(): any;
129
+ static fromJSON<I extends string, O extends string, T extends NodeData>(data: any): PromptBuilder<I, O, T>;
130
+ }
131
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"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"}