comfyui-node 1.6.0 → 1.6.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 (42) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/multipool/client-registry.d.ts +12 -0
  3. package/dist/multipool/client-registry.d.ts.map +1 -0
  4. package/dist/multipool/client-registry.js +26 -0
  5. package/dist/multipool/client-registry.js.map +1 -0
  6. package/dist/multipool/index.d.ts +2 -0
  7. package/dist/multipool/index.d.ts.map +1 -0
  8. package/dist/multipool/index.js +2 -0
  9. package/dist/multipool/index.js.map +1 -0
  10. package/dist/multipool/interfaces.d.ts +5 -0
  11. package/dist/multipool/interfaces.d.ts.map +1 -0
  12. package/dist/multipool/interfaces.js +2 -0
  13. package/dist/multipool/interfaces.js.map +1 -0
  14. package/dist/multipool/job-queue-processor.d.ts +12 -0
  15. package/dist/multipool/job-queue-processor.d.ts.map +1 -0
  16. package/dist/multipool/job-queue-processor.js +10 -0
  17. package/dist/multipool/job-queue-processor.js.map +1 -0
  18. package/dist/multipool/multi-workflow-pool.d.ts +24 -0
  19. package/dist/multipool/multi-workflow-pool.d.ts.map +1 -0
  20. package/dist/multipool/multi-workflow-pool.js +73 -0
  21. package/dist/multipool/multi-workflow-pool.js.map +1 -0
  22. package/dist/multipool/pool-event-manager.d.ts +11 -0
  23. package/dist/multipool/pool-event-manager.d.ts.map +1 -0
  24. package/dist/multipool/pool-event-manager.js +28 -0
  25. package/dist/multipool/pool-event-manager.js.map +1 -0
  26. package/dist/multipool/tests/job-state-registry.d.ts +17 -0
  27. package/dist/multipool/tests/job-state-registry.d.ts.map +1 -0
  28. package/dist/multipool/tests/job-state-registry.js +24 -0
  29. package/dist/multipool/tests/job-state-registry.js.map +1 -0
  30. package/dist/multipool/tests/multipool-basic.d.ts +2 -0
  31. package/dist/multipool/tests/multipool-basic.d.ts.map +1 -0
  32. package/dist/multipool/tests/multipool-basic.js +4 -0
  33. package/dist/multipool/tests/multipool-basic.js.map +1 -0
  34. package/dist/multipool/workflow.d.ts +174 -0
  35. package/dist/multipool/workflow.d.ts.map +1 -0
  36. package/dist/multipool/workflow.js +272 -0
  37. package/dist/multipool/workflow.js.map +1 -0
  38. package/dist/pool/SmartPool.d.ts +3 -3
  39. package/dist/pool/SmartPool.d.ts.map +1 -1
  40. package/dist/pool/SmartPool.js +4 -4
  41. package/dist/pool/SmartPool.js.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
2
+ import { ComfyApi } from "src/client.js";
3
+ export declare class ClientRegistry {
4
+ pool: MultiWorkflowPool;
5
+ clients: Set<string>;
6
+ comfyApiMap: Map<string, ComfyApi>;
7
+ constructor(pool: MultiWorkflowPool);
8
+ addClient(clientUrl: string): void;
9
+ removeClient(clientUrl: string): void;
10
+ getQueueStatus(clientUrl: string): Promise<import("../types/api.js").QueueResponse>;
11
+ }
12
+ //# sourceMappingURL=client-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-registry.d.ts","sourceRoot":"","sources":["../../src/multipool/client-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,qBAAa,cAAc;IAEzB,IAAI,EAAE,iBAAiB,CAAC;IAExB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAEjC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;gBAEnC,IAAI,EAAE,iBAAiB;IAInC,SAAS,CAAC,SAAS,EAAE,MAAM;IAM3B,YAAY,CAAC,SAAS,EAAE,MAAM;IAKxB,cAAc,CAAC,SAAS,EAAE,MAAM;CAOvC"}
@@ -0,0 +1,26 @@
1
+ import { ComfyApi } from "src/client.js";
2
+ export class ClientRegistry {
3
+ pool;
4
+ clients = new Set();
5
+ comfyApiMap = new Map();
6
+ constructor(pool) {
7
+ this.pool = pool;
8
+ }
9
+ addClient(clientUrl) {
10
+ this.clients.add(clientUrl);
11
+ const comfyApi = new ComfyApi(clientUrl);
12
+ this.comfyApiMap.set(clientUrl, comfyApi);
13
+ }
14
+ removeClient(clientUrl) {
15
+ this.clients.delete(clientUrl);
16
+ this.comfyApiMap.delete(clientUrl);
17
+ }
18
+ async getQueueStatus(clientUrl) {
19
+ const comfyApi = this.comfyApiMap.get(clientUrl);
20
+ if (!comfyApi) {
21
+ throw new Error(`Client ${clientUrl} not found`);
22
+ }
23
+ return comfyApi.getQueue();
24
+ }
25
+ }
26
+ //# sourceMappingURL=client-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-registry.js","sourceRoot":"","sources":["../../src/multipool/client-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,cAAc;IAEzB,IAAI,CAAoB;IAExB,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEjC,WAAW,GAA0B,IAAI,GAAG,EAAE,CAAC;IAE/C,YAAY,IAAuB;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,YAAY,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/multipool/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/multipool/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export interface PoolEvent {
2
+ type: string;
3
+ payload: any;
4
+ }
5
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/multipool/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/multipool/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
2
+ import { Workflow } from "src/multipool/workflow.js";
3
+ export declare class JobQueueProcessor {
4
+ pool: MultiWorkflowPool;
5
+ queue: Array<{
6
+ jobId: string;
7
+ workflow: Workflow;
8
+ }>;
9
+ constructor(pool: MultiWorkflowPool);
10
+ enqueueJob(newJobId: string, workflow: Workflow): void;
11
+ }
12
+ //# sourceMappingURL=job-queue-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue-processor.d.ts","sourceRoot":"","sources":["../../src/multipool/job-queue-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,qBAAa,iBAAiB;IAE5B,IAAI,EAAE,iBAAiB,CAAC;IAExB,KAAK,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAC,CAAC,CAAM;gBAE3C,IAAI,EAAE,iBAAiB;IAInC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;CAGhD"}
@@ -0,0 +1,10 @@
1
+ export class JobQueueProcessor {
2
+ pool;
3
+ queue = [];
4
+ constructor(pool) {
5
+ this.pool = pool;
6
+ }
7
+ enqueueJob(newJobId, workflow) {
8
+ }
9
+ }
10
+ //# sourceMappingURL=job-queue-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue-processor.js","sourceRoot":"","sources":["../../src/multipool/job-queue-processor.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,iBAAiB;IAE5B,IAAI,CAAoB;IAExB,KAAK,GAA+C,EAAE,CAAC;IAEvD,YAAY,IAAuB;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,QAAkB;IAE/C,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import { Workflow } from "src/multipool/workflow.js";
2
+ import { PoolEvent } from "src/multipool/interfaces.js";
3
+ /**
4
+ * MultiWorkflowPool class to manage heterogeneous clusters of ComfyUI workers with different workflow capabilities.
5
+ * Using a fully event driven architecture to handle client connections, job submissions, and failover strategies.
6
+ * Zero polling is used; all operations are event driven. Maximizes responsiveness and scalability.
7
+ */
8
+ export declare class MultiWorkflowPool {
9
+ private events;
10
+ private clientRegistry;
11
+ private jobRegistry;
12
+ private queues;
13
+ constructor();
14
+ init(): Promise<void>;
15
+ shutdown(): Promise<void>;
16
+ addClient(clientUrl: string): void;
17
+ removeClient(clientUrl: string): void;
18
+ submitJob(workflow: Workflow): Promise<`${string}-${string}-${string}-${string}-${string}`>;
19
+ getJobStatus(jobId: string): void;
20
+ cancelJob(jobId: string): Promise<void>;
21
+ attachEventHook(event: string, listener: (e: PoolEvent) => void): void;
22
+ private assertQueue;
23
+ }
24
+ //# sourceMappingURL=multi-workflow-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-workflow-pool.d.ts","sourceRoot":"","sources":["../../src/multipool/multi-workflow-pool.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD;;;;GAIG;AACH,qBAAa,iBAAiB;IAG5B,OAAO,CAAC,MAAM,CAAmB;IAGjC,OAAO,CAAC,cAAc,CAAiB;IAGvC,OAAO,CAAC,WAAW,CAAmB;IAGtC,OAAO,CAAC,MAAM,CAA6C;;IASrD,IAAI;IAGJ,QAAQ;IAGd,SAAS,CAAC,SAAS,EAAE,MAAM;IAI3B,YAAY,CAAC,SAAS,EAAE,MAAM;IAIxB,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAiBlC,YAAY,CAAC,KAAK,EAAE,MAAM;IAIpB,SAAS,CAAC,KAAK,EAAE,MAAM;IAI7B,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI;IAO/D,OAAO,CAAC,WAAW;CAWpB"}
@@ -0,0 +1,73 @@
1
+ import { ClientRegistry } from "src/multipool/client-registry.js";
2
+ import { PoolEventManager } from "src/multipool/pool-event-manager.js";
3
+ import { JobStateRegistry } from "src/multipool/tests/job-state-registry.js";
4
+ import { JobQueueProcessor } from "src/multipool/job-queue-processor.js";
5
+ /**
6
+ * MultiWorkflowPool class to manage heterogeneous clusters of ComfyUI workers with different workflow capabilities.
7
+ * Using a fully event driven architecture to handle client connections, job submissions, and failover strategies.
8
+ * Zero polling is used; all operations are event driven. Maximizes responsiveness and scalability.
9
+ */
10
+ export class MultiWorkflowPool {
11
+ // Event manager for handling pool events
12
+ events;
13
+ // Registry for managing clients in the pool
14
+ clientRegistry;
15
+ // Registry for managing job state
16
+ jobRegistry;
17
+ // Multi queue map, one per workflow based on the workflow hash
18
+ queues = new Map();
19
+ constructor() {
20
+ this.events = new PoolEventManager(this);
21
+ this.clientRegistry = new ClientRegistry(this);
22
+ this.jobRegistry = new JobStateRegistry(this);
23
+ }
24
+ // PUBLIC API
25
+ async init() {
26
+ }
27
+ async shutdown() {
28
+ }
29
+ addClient(clientUrl) {
30
+ this.clientRegistry.addClient(clientUrl);
31
+ }
32
+ removeClient(clientUrl) {
33
+ this.clientRegistry.removeClient(clientUrl);
34
+ }
35
+ async submitJob(workflow) {
36
+ let workflowHash = workflow.structureHash;
37
+ if (!workflowHash) {
38
+ workflow.updateHash();
39
+ workflowHash = workflow.structureHash;
40
+ }
41
+ const queue = this.assertQueue(workflowHash);
42
+ if (!queue) {
43
+ throw new Error("Failed to create or retrieve job queue for workflow.");
44
+ }
45
+ const newJobId = this.jobRegistry.addJob(workflow);
46
+ queue.enqueueJob(newJobId, workflow);
47
+ return newJobId;
48
+ }
49
+ getJobStatus(jobId) {
50
+ return this.jobRegistry.getJobStatus(jobId);
51
+ }
52
+ async cancelJob(jobId) {
53
+ this.jobRegistry.cancelJob(jobId);
54
+ }
55
+ attachEventHook(event, listener) {
56
+ if (event && listener) {
57
+ this.events.attachHook(event, listener);
58
+ }
59
+ }
60
+ // PRIVATE METHODS
61
+ assertQueue(workflowHash) {
62
+ if (!workflowHash) {
63
+ return null;
64
+ }
65
+ let queue = this.queues.get(workflowHash);
66
+ if (!queue) {
67
+ queue = new JobQueueProcessor(this);
68
+ this.queues.set(workflowHash, queue);
69
+ }
70
+ return queue;
71
+ }
72
+ }
73
+ //# sourceMappingURL=multi-workflow-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-workflow-pool.js","sourceRoot":"","sources":["../../src/multipool/multi-workflow-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAIzE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAE5B,yCAAyC;IACjC,MAAM,CAAmB;IAEjC,4CAA4C;IACpC,cAAc,CAAiB;IAEvC,kCAAkC;IAC1B,WAAW,CAAmB;IAEtC,+DAA+D;IACvD,MAAM,GAAmC,IAAI,GAAG,EAAE,CAAC;IAE3D;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,aAAa;IACb,KAAK,CAAC,IAAI;IACV,CAAC;IAED,KAAK,CAAC,QAAQ;IACd,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAkB;QAChC,IAAI,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;QACxC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,eAAe,CAAC,KAAa,EAAE,QAAgC;QAC7D,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,kBAAkB;IACV,WAAW,CAAC,YAAgC;QAClD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
2
+ import { PoolEvent } from "src/multipool/interfaces.js";
3
+ export declare class PoolEventManager {
4
+ pool: MultiWorkflowPool;
5
+ hooks: Map<string, Array<Function>>;
6
+ constructor(pool: MultiWorkflowPool);
7
+ attachHook(event: string, listener: (e: PoolEvent) => void): void;
8
+ emitEvent(event: PoolEvent): void;
9
+ detachHook(event: string, listener: (e: PoolEvent) => void): void;
10
+ }
11
+ //# sourceMappingURL=pool-event-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-event-manager.d.ts","sourceRoot":"","sources":["../../src/multipool/pool-event-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,qBAAa,gBAAgB;IAE3B,IAAI,EAAE,iBAAiB,CAAC;IAExB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAa;gBAEpC,IAAI,EAAE,iBAAiB;IAInC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI;IAO1D,SAAS,CAAC,KAAK,EAAE,SAAS;IAS1B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI;CAM3D"}
@@ -0,0 +1,28 @@
1
+ export class PoolEventManager {
2
+ pool;
3
+ hooks = new Map();
4
+ constructor(pool) {
5
+ this.pool = pool;
6
+ }
7
+ attachHook(event, listener) {
8
+ if (!this.hooks.has(event)) {
9
+ this.hooks.set(event, []);
10
+ }
11
+ this.hooks.get(event).push(listener);
12
+ }
13
+ emitEvent(event) {
14
+ const listeners = this.hooks.get(event.type);
15
+ if (listeners) {
16
+ for (const listener of listeners) {
17
+ listener(event);
18
+ }
19
+ }
20
+ }
21
+ detachHook(event, listener) {
22
+ const listeners = this.hooks.get(event);
23
+ if (listeners) {
24
+ this.hooks.set(event, listeners.filter(l => l !== listener));
25
+ }
26
+ }
27
+ }
28
+ //# sourceMappingURL=pool-event-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-event-manager.js","sourceRoot":"","sources":["../../src/multipool/pool-event-manager.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,gBAAgB;IAE3B,IAAI,CAAoB;IAExB,KAAK,GAAiC,IAAI,GAAG,EAAE,CAAC;IAEhD,YAAY,IAAuB;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,QAAgC;QACxD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,SAAS,CAAC,KAAgB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,QAAgC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
2
+ import { Workflow } from "src/multipool/workflow.js";
3
+ interface JobState {
4
+ jobId: string;
5
+ workflow: Workflow;
6
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'canceled';
7
+ }
8
+ export declare class JobStateRegistry {
9
+ pool: MultiWorkflowPool;
10
+ jobs: Map<string, JobState>;
11
+ constructor(pool: MultiWorkflowPool);
12
+ addJob(workflow: Workflow): `${string}-${string}-${string}-${string}-${string}`;
13
+ getJobStatus(jobId: string): void;
14
+ cancelJob(jobId: string): void;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=job-state-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-state-registry.d.ts","sourceRoot":"","sources":["../../../src/multipool/tests/job-state-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrD,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;CACrE;AAED,qBAAa,gBAAgB;IAE3B,IAAI,EAAE,iBAAiB,CAAC;IAExB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;gBAE5B,IAAI,EAAE,iBAAiB;IAInC,MAAM,CAAC,QAAQ,EAAE,QAAQ;IAYzB,YAAY,CAAC,KAAK,EAAE,MAAM;IAI1B,SAAS,CAAC,KAAK,EAAE,MAAM;CAGxB"}
@@ -0,0 +1,24 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export class JobStateRegistry {
3
+ pool;
4
+ jobs = new Map();
5
+ constructor(pool) {
6
+ this.pool = pool;
7
+ }
8
+ addJob(workflow) {
9
+ // Create new job id
10
+ const jobId = randomUUID();
11
+ const jobState = {
12
+ jobId,
13
+ workflow,
14
+ status: 'pending',
15
+ };
16
+ this.jobs.set(jobId, jobState);
17
+ return jobId;
18
+ }
19
+ getJobStatus(jobId) {
20
+ }
21
+ cancelJob(jobId) {
22
+ }
23
+ }
24
+ //# sourceMappingURL=job-state-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-state-registry.js","sourceRoot":"","sources":["../../../src/multipool/tests/job-state-registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC,MAAM,OAAO,gBAAgB;IAE3B,IAAI,CAAoB;IAExB,IAAI,GAA0B,IAAI,GAAG,EAAE,CAAC;IAExC,YAAY,IAAuB;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,oBAAoB;QACpB,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAa;YACzB,KAAK;YACL,QAAQ;YACR,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,CAAC,KAAa;IAE1B,CAAC;IAED,SAAS,CAAC,KAAa;IAEvB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=multipool-basic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipool-basic.d.ts","sourceRoot":"","sources":["../../../src/multipool/tests/multipool-basic.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
2
+ const pool = new MultiWorkflowPool();
3
+ console.log(pool);
4
+ //# sourceMappingURL=multipool-basic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipool-basic.js","sourceRoot":"","sources":["../../../src/multipool/tests/multipool-basic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAEzE,MAAM,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAErC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,174 @@
1
+ import type { AugmentNodes } from '../node-type-hints.js';
2
+ type WorkflowJSON = Record<string, any>;
3
+ export interface WorkflowResultMeta {
4
+ _promptId?: string;
5
+ _nodes?: string[];
6
+ _aliases?: Record<string, string>;
7
+ _autoSeeds?: Record<string, number>;
8
+ }
9
+ export type WorkflowResult = WorkflowResultMeta & Record<string, any>;
10
+ export interface WorkflowRunOptions {
11
+ includeOutputs?: string[];
12
+ }
13
+ export interface WorkflowJobEvents<R extends WorkflowResult = WorkflowResult> {
14
+ progress: (info: {
15
+ value: number;
16
+ max: number;
17
+ prompt_id: string;
18
+ node: string;
19
+ }) => void;
20
+ progress_pct: (pct: number, info: any) => void;
21
+ preview: (blob: Blob) => void;
22
+ preview_meta: (data: {
23
+ blob: Blob;
24
+ metadata: any;
25
+ }) => void;
26
+ pending: (promptId: string) => void;
27
+ start: (promptId: string) => void;
28
+ output: (key: string, data: any) => void;
29
+ finished: (data: R, promptId: string) => void;
30
+ failed: (err: Error, promptId?: string) => void;
31
+ }
32
+ type EventKey<R extends WorkflowResult> = keyof WorkflowJobEvents<R>;
33
+ export declare class WorkflowJob<R extends WorkflowResult = WorkflowResult> {
34
+ private emitter;
35
+ private donePromise;
36
+ private doneResolve;
37
+ private doneReject;
38
+ lastProgressPct: number;
39
+ constructor();
40
+ on<K extends EventKey<R>>(evt: K, fn: WorkflowJobEvents<R>[K]): this;
41
+ off<K extends EventKey<R>>(evt: K, fn: WorkflowJobEvents<R>[K]): this;
42
+ /** Await final mapped outputs */
43
+ done(): Promise<R>;
44
+ _emit<K extends EventKey<R>>(evt: K, ...args: Parameters<WorkflowJobEvents<R>[K]>): void;
45
+ _finish(data: R): void;
46
+ _fail(err: Error, promptId?: string): void;
47
+ }
48
+ type NodeInputs<T> = T extends {
49
+ inputs: infer I;
50
+ } ? I : never;
51
+ type OutputMap = Record<string, any>;
52
+ type OutputShapeFor<C extends string> = C extends 'SaveImage' | 'SaveImageAdvanced' ? {
53
+ images?: any[];
54
+ } : C extends 'KSampler' ? {
55
+ samples?: any;
56
+ } : any;
57
+ type NodeOutputFor<T extends WorkflowJSON, K extends keyof T & string> = T[K] extends {
58
+ class_type: infer C;
59
+ } ? C extends string ? OutputShapeFor<C> : any : any;
60
+ export declare class Workflow<T extends WorkflowJSON = WorkflowJSON, O extends OutputMap = {}> {
61
+ private json;
62
+ private outputNodeIds;
63
+ private outputAliases;
64
+ private bypassedNodes;
65
+ private _pendingImageInputs;
66
+ private _pendingFolderFiles;
67
+ /** Structural hash of the workflow JSON for compatibility tracking in failover scenarios */
68
+ structureHash?: string;
69
+ static from<TD extends WorkflowJSON>(data: TD, opts?: {
70
+ autoHash?: boolean;
71
+ }): Workflow<TD, {}>;
72
+ static from(data: string, opts?: {
73
+ autoHash?: boolean;
74
+ }): Workflow;
75
+ constructor(json: T, opts?: {
76
+ autoHash?: boolean;
77
+ });
78
+ /**
79
+ * Like from(), but augments known node types (e.g., KSampler) with soft union hints
80
+ * for inputs such as sampler_name & scheduler while still allowing arbitrary strings.
81
+ */
82
+ static fromAugmented<TD extends WorkflowJSON>(data: TD, opts?: {
83
+ autoHash?: boolean;
84
+ }): Workflow<AugmentNodes<TD>, {}>;
85
+ /** Set a nested input path on a node e.g. set('9.inputs.text','hello') */
86
+ set(path: string, value: any): this;
87
+ /** Attach a single image buffer to a node input (e.g., LoadImage.image). Will upload on run() then set the input to the filename. */
88
+ attachImage(nodeId: keyof T & string, inputName: string, data: Blob | Buffer | ArrayBuffer | Uint8Array, fileName: string, opts?: {
89
+ subfolder?: string;
90
+ override?: boolean;
91
+ }): this;
92
+ /** Attach multiple files into a server subfolder (useful for LoadImageSetFromFolderNode). */
93
+ attachFolderFiles(subfolder: string, files: Array<{
94
+ data: Blob | Buffer | ArrayBuffer | Uint8Array;
95
+ fileName: string;
96
+ }>, opts?: {
97
+ override?: boolean;
98
+ }): this;
99
+ /**
100
+ * Sugar for setting a node's input: wf.input('SAMPLER','steps',30)
101
+ * Equivalent to set('SAMPLER.inputs.steps', 30).
102
+ * Performs a light existence check to aid DX (doesn't throw if missing by design unless strict parameter is passed).
103
+ */
104
+ input<K extends keyof T, P extends keyof NodeInputs<T[K]> & string>(nodeId: K, inputName: P, value: NodeInputs<T[K]>[P], opts?: {
105
+ strict?: boolean;
106
+ }): this;
107
+ /**
108
+ * Batch variant:
109
+ * - wf.inputs('SAMPLER', { steps: 30, cfg: 7 })
110
+ * - wf.inputs({ SAMPLER: { steps: 30 }, CLIP: { text: 'hello' } })
111
+ * Honors strict mode (throws if node missing when strict:true).
112
+ */
113
+ batchInputs<K extends keyof T>(nodeId: K, values: Partial<NodeInputs<T[K]>>, opts?: {
114
+ strict?: boolean;
115
+ }): this;
116
+ batchInputs<M extends {
117
+ [N in keyof T]?: Partial<NodeInputs<T[N]>>;
118
+ }>(batch: M, opts?: {
119
+ strict?: boolean;
120
+ }): this;
121
+ /**
122
+ * Mark a node to be bypassed during execution.
123
+ * The node will be removed and its connections automatically rewired.
124
+ *
125
+ * @param node - Node ID to bypass
126
+ * @returns This workflow instance for chaining
127
+ */
128
+ bypass(node: keyof T & string): this;
129
+ /**
130
+ * Mark multiple nodes to be bypassed during execution.
131
+ *
132
+ * @param nodes - Array of node IDs to bypass
133
+ * @returns This workflow instance for chaining
134
+ */
135
+ bypass(nodes: (keyof T & string)[]): this;
136
+ /**
137
+ * Remove a node from the bypass list, re-enabling it.
138
+ *
139
+ * @param node - Node ID to reinstate
140
+ * @returns This workflow instance for chaining
141
+ */
142
+ reinstate(node: keyof T & string): this;
143
+ /**
144
+ * Remove multiple nodes from the bypass list.
145
+ *
146
+ * @param nodes - Array of node IDs to reinstate
147
+ * @returns This workflow instance for chaining
148
+ */
149
+ reinstate(nodes: (keyof T & string)[]): this;
150
+ /**
151
+ * Update the structural hash after making non-dynamic changes to the workflow.
152
+ * Call this if you modify the workflow structure after initialization and the autoHash was disabled,
153
+ * or if you want to recalculate the hash after making structural changes.
154
+ *
155
+ * Example:
156
+ * ```
157
+ * const wf = Workflow.from(data, { autoHash: false });
158
+ * wf.input('SAMPLER', 'ckpt_name', 'model_v1.safetensors');
159
+ * wf.updateHash(); // Recompute hash after structural change
160
+ * ```
161
+ */
162
+ updateHash(): this;
163
+ /** IDE helper returning empty object typed as final result (aliases + metadata). */
164
+ typedResult(): WorkflowResult & O;
165
+ }
166
+ export interface Workflow<T extends WorkflowJSON = WorkflowJSON, O extends OutputMap = {}> {
167
+ output<NodeId extends keyof T & string>(nodeId: NodeId): Workflow<T, O & Record<NodeId, NodeOutputFor<T, NodeId>>>;
168
+ output<Spec extends `${string}:${keyof T & string}`>(spec: Spec): Workflow<T, O & (Spec extends `${infer Alias}:${infer Node}` ? (Node extends keyof T & string ? Record<Alias, NodeOutputFor<T, Node>> : Record<Alias, any>) : {})>;
169
+ output<Alias extends string, NodeId extends keyof T & string>(alias: Alias, nodeId: NodeId): Workflow<T, O & Record<Alias, NodeOutputFor<T, NodeId>>>;
170
+ output<A extends string>(single: A): Workflow<T, O & Record<A, any>>;
171
+ output<Alias extends string, NodeId extends string>(alias: Alias, nodeId: NodeId): Workflow<T, O & Record<Alias, any>>;
172
+ }
173
+ export {};
174
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/multipool/workflow.ts"],"names":[],"mappings":"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"}