comfyui-node 1.4.2 → 1.4.4

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/README.md +16 -3
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/call-wrapper.js +567 -567
  4. package/dist/call-wrapper.js.map +1 -1
  5. package/dist/client.d.ts +290 -290
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +2 -0
  8. package/dist/client.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/pool/WorkflowPool.d.ts +80 -0
  13. package/dist/pool/WorkflowPool.d.ts.map +1 -1
  14. package/dist/pool/WorkflowPool.js +608 -455
  15. package/dist/pool/WorkflowPool.js.map +1 -1
  16. package/dist/pool/client/ClientManager.d.ts +15 -1
  17. package/dist/pool/client/ClientManager.d.ts.map +1 -1
  18. package/dist/pool/client/ClientManager.js +35 -6
  19. package/dist/pool/client/ClientManager.js.map +1 -1
  20. package/dist/pool/failover/SmartFailoverStrategy.js +1 -1
  21. package/dist/pool/failover/SmartFailoverStrategy.js.map +1 -1
  22. package/dist/pool/index.d.ts +1 -0
  23. package/dist/pool/index.d.ts.map +1 -1
  24. package/dist/pool/profiling/JobProfiler.d.ts +130 -0
  25. package/dist/pool/profiling/JobProfiler.d.ts.map +1 -0
  26. package/dist/pool/profiling/JobProfiler.js +225 -0
  27. package/dist/pool/profiling/JobProfiler.js.map +1 -0
  28. package/dist/pool/queue/QueueAdapter.d.ts +30 -30
  29. package/dist/pool/queue/adapters/memory.d.ts +20 -20
  30. package/dist/pool/types/job.d.ts +3 -0
  31. package/dist/pool/types/job.d.ts.map +1 -1
  32. package/dist/pool/utils/hash.d.ts +13 -1
  33. package/dist/pool/utils/hash.d.ts.map +1 -1
  34. package/dist/pool/utils/hash.js +14 -1
  35. package/dist/pool/utils/hash.js.map +1 -1
  36. package/dist/pool.d.ts +180 -180
  37. package/dist/workflow.d.ts +27 -4
  38. package/dist/workflow.d.ts.map +1 -1
  39. package/dist/workflow.js +30 -7
  40. package/dist/workflow.js.map +1 -1
  41. package/package.json +2 -2
  42. package/README.OLD.md +0 -1395
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Job Profiler - Automatic per-node execution profiling for WorkflowPool
3
+ * =======================================================================
4
+ *
5
+ * Captures detailed execution metrics for workflow jobs automatically:
6
+ * - Per-node execution timing
7
+ * - Progress tracking for nodes that emit progress events
8
+ * - Execution order and dependencies
9
+ * - Node types and metadata
10
+ *
11
+ * Usage:
12
+ * ```ts
13
+ * const pool = new WorkflowPool(clients, { enableProfiling: true });
14
+ * const jobId = await pool.enqueue(workflow);
15
+ *
16
+ * pool.on('job:completed', (event) => {
17
+ * console.log(event.detail.job.profileStats);
18
+ * });
19
+ * ```
20
+ */
21
+ /**
22
+ * JobProfiler tracks execution metrics for a single workflow job.
23
+ */
24
+ export class JobProfiler {
25
+ queuedAt;
26
+ startedAt;
27
+ completedAt;
28
+ promptId;
29
+ nodeProfiles = new Map();
30
+ lastExecutingNode = null;
31
+ constructor(queuedAt, workflowJson) {
32
+ this.queuedAt = queuedAt;
33
+ // Initialize node profiles from workflow structure
34
+ if (workflowJson) {
35
+ for (const [nodeId, nodeData] of Object.entries(workflowJson)) {
36
+ const node = nodeData;
37
+ if (node && typeof node === 'object' && node.class_type) {
38
+ this.nodeProfiles.set(nodeId, {
39
+ nodeId,
40
+ type: node.class_type,
41
+ title: node._meta?.title,
42
+ cached: false,
43
+ status: 'pending'
44
+ });
45
+ }
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * Record execution start event
51
+ */
52
+ onExecutionStart(promptId) {
53
+ this.promptId = promptId;
54
+ if (!this.startedAt) {
55
+ this.startedAt = Date.now();
56
+ }
57
+ }
58
+ /**
59
+ * Record cached nodes
60
+ */
61
+ onCachedNodes(nodeIds) {
62
+ const now = Date.now();
63
+ for (const nodeId of nodeIds) {
64
+ let profile = this.nodeProfiles.get(nodeId);
65
+ if (!profile) {
66
+ profile = {
67
+ nodeId,
68
+ cached: true,
69
+ status: 'cached'
70
+ };
71
+ this.nodeProfiles.set(nodeId, profile);
72
+ }
73
+ profile.cached = true;
74
+ profile.status = 'cached';
75
+ profile.startedAt = now;
76
+ profile.completedAt = now;
77
+ profile.duration = 0;
78
+ }
79
+ }
80
+ /**
81
+ * Record node execution start
82
+ */
83
+ onNodeExecuting(nodeId) {
84
+ // Complete previous node if any
85
+ if (this.lastExecutingNode && this.lastExecutingNode !== nodeId) {
86
+ this.completeNode(this.lastExecutingNode);
87
+ }
88
+ // Start tracking new node
89
+ let profile = this.nodeProfiles.get(nodeId);
90
+ if (!profile) {
91
+ profile = {
92
+ nodeId,
93
+ cached: false,
94
+ status: 'executing'
95
+ };
96
+ this.nodeProfiles.set(nodeId, profile);
97
+ }
98
+ if (!profile.startedAt) {
99
+ profile.startedAt = Date.now();
100
+ profile.status = 'executing';
101
+ }
102
+ this.lastExecutingNode = nodeId;
103
+ }
104
+ /**
105
+ * Record node completion (when next node starts or execution ends)
106
+ */
107
+ completeNode(nodeId) {
108
+ const profile = this.nodeProfiles.get(nodeId);
109
+ if (profile && !profile.completedAt && profile.startedAt) {
110
+ profile.completedAt = Date.now();
111
+ profile.duration = profile.completedAt - profile.startedAt;
112
+ profile.status = 'completed';
113
+ }
114
+ }
115
+ /**
116
+ * Record execution end (node: null event)
117
+ */
118
+ onExecutionComplete() {
119
+ // Complete last executing node
120
+ if (this.lastExecutingNode) {
121
+ this.completeNode(this.lastExecutingNode);
122
+ this.lastExecutingNode = null;
123
+ }
124
+ // Mark any nodes still in "executing" state as completed
125
+ for (const profile of Array.from(this.nodeProfiles.values())) {
126
+ if (profile.status === 'executing' && !profile.completedAt && profile.startedAt) {
127
+ profile.completedAt = Date.now();
128
+ profile.duration = profile.completedAt - profile.startedAt;
129
+ profile.status = 'completed';
130
+ }
131
+ }
132
+ this.completedAt = Date.now();
133
+ }
134
+ /**
135
+ * Record progress event for a node
136
+ */
137
+ onProgress(progress) {
138
+ if (!progress.node)
139
+ return;
140
+ const nodeId = String(progress.node);
141
+ let profile = this.nodeProfiles.get(nodeId);
142
+ if (!profile) {
143
+ profile = {
144
+ nodeId,
145
+ cached: false,
146
+ status: 'executing',
147
+ progressEvents: []
148
+ };
149
+ this.nodeProfiles.set(nodeId, profile);
150
+ }
151
+ if (!profile.progressEvents) {
152
+ profile.progressEvents = [];
153
+ }
154
+ profile.progressEvents.push({
155
+ timestamp: Date.now(),
156
+ value: progress.value,
157
+ max: progress.max
158
+ });
159
+ }
160
+ /**
161
+ * Record node execution error
162
+ */
163
+ onNodeError(nodeId, error) {
164
+ let profile = this.nodeProfiles.get(nodeId);
165
+ if (!profile) {
166
+ profile = {
167
+ nodeId,
168
+ cached: false,
169
+ status: 'failed'
170
+ };
171
+ this.nodeProfiles.set(nodeId, profile);
172
+ }
173
+ profile.status = 'failed';
174
+ profile.error = error;
175
+ profile.completedAt = Date.now();
176
+ if (profile.startedAt) {
177
+ profile.duration = profile.completedAt - profile.startedAt;
178
+ }
179
+ }
180
+ /**
181
+ * Generate final profile statistics
182
+ */
183
+ getStats() {
184
+ const now = Date.now();
185
+ const completedAt = this.completedAt || now;
186
+ const startedAt = this.startedAt || this.queuedAt;
187
+ const nodes = Array.from(this.nodeProfiles.values());
188
+ // Calculate summary statistics
189
+ const executedNodes = nodes.filter(n => n.status === 'completed').length;
190
+ const cachedNodes = nodes.filter(n => n.cached).length;
191
+ const failedNodes = nodes.filter(n => n.status === 'failed').length;
192
+ const slowestNodes = nodes
193
+ .filter(n => n.duration && n.duration > 0)
194
+ .sort((a, b) => (b.duration || 0) - (a.duration || 0))
195
+ .slice(0, 5)
196
+ .map(n => ({
197
+ nodeId: n.nodeId,
198
+ type: n.type,
199
+ title: n.title,
200
+ duration: n.duration
201
+ }));
202
+ const progressNodes = nodes
203
+ .filter(n => n.progressEvents && n.progressEvents.length > 0)
204
+ .map(n => n.nodeId);
205
+ return {
206
+ promptId: this.promptId,
207
+ totalDuration: completedAt - this.queuedAt,
208
+ queueTime: startedAt - this.queuedAt,
209
+ executionTime: completedAt - startedAt,
210
+ queuedAt: this.queuedAt,
211
+ startedAt: this.startedAt,
212
+ completedAt,
213
+ nodes,
214
+ summary: {
215
+ totalNodes: nodes.length,
216
+ executedNodes,
217
+ cachedNodes,
218
+ failedNodes,
219
+ slowestNodes,
220
+ progressNodes
221
+ }
222
+ };
223
+ }
224
+ }
225
+ //# sourceMappingURL=JobProfiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobProfiler.js","sourceRoot":"","sources":["../../../src/pool/profiling/JobProfiler.ts"],"names":[],"mappings":"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"}
@@ -1,31 +1,31 @@
1
- import type { WorkflowJobPayload } from "../types/job.js";
2
- export interface QueueStats {
3
- waiting: number;
4
- inFlight: number;
5
- delayed: number;
6
- failed: number;
7
- }
8
- export interface QueueReservation {
9
- /** Unique reservation identifier (often equals the jobId for in-memory implementation). */
10
- reservationId: string;
11
- payload: WorkflowJobPayload;
12
- attempt: number;
13
- /** Optional timestamp when the item becomes visible again (for delayed retries). */
14
- availableAt?: number;
15
- }
16
- export interface QueueAdapter {
17
- enqueue(payload: WorkflowJobPayload, opts?: {
18
- priority?: number;
19
- delayMs?: number;
20
- }): Promise<void>;
21
- reserve(): Promise<QueueReservation | null>;
22
- commit(reservationId: string): Promise<void>;
23
- retry(reservationId: string, opts?: {
24
- delayMs?: number;
25
- }): Promise<void>;
26
- discard(reservationId: string, reason?: unknown): Promise<void>;
27
- remove(jobId: string): Promise<boolean>;
28
- stats(): Promise<QueueStats>;
29
- shutdown(): Promise<void>;
30
- }
1
+ import type { WorkflowJobPayload } from "../types/job.js";
2
+ export interface QueueStats {
3
+ waiting: number;
4
+ inFlight: number;
5
+ delayed: number;
6
+ failed: number;
7
+ }
8
+ export interface QueueReservation {
9
+ /** Unique reservation identifier (often equals the jobId for in-memory implementation). */
10
+ reservationId: string;
11
+ payload: WorkflowJobPayload;
12
+ attempt: number;
13
+ /** Optional timestamp when the item becomes visible again (for delayed retries). */
14
+ availableAt?: number;
15
+ }
16
+ export interface QueueAdapter {
17
+ enqueue(payload: WorkflowJobPayload, opts?: {
18
+ priority?: number;
19
+ delayMs?: number;
20
+ }): Promise<void>;
21
+ reserve(): Promise<QueueReservation | null>;
22
+ commit(reservationId: string): Promise<void>;
23
+ retry(reservationId: string, opts?: {
24
+ delayMs?: number;
25
+ }): Promise<void>;
26
+ discard(reservationId: string, reason?: unknown): Promise<void>;
27
+ remove(jobId: string): Promise<boolean>;
28
+ stats(): Promise<QueueStats>;
29
+ shutdown(): Promise<void>;
30
+ }
31
31
  //# sourceMappingURL=QueueAdapter.d.ts.map
@@ -1,21 +1,21 @@
1
- import { QueueAdapter, QueueReservation, QueueStats } from "../QueueAdapter.js";
2
- import type { WorkflowJobPayload } from "../../types/job.js";
3
- export declare class MemoryQueueAdapter implements QueueAdapter {
4
- private waiting;
5
- private inFlight;
6
- private failed;
7
- enqueue(payload: WorkflowJobPayload, opts?: {
8
- priority?: number;
9
- delayMs?: number;
10
- }): Promise<void>;
11
- reserve(): Promise<QueueReservation | null>;
12
- commit(reservationId: string): Promise<void>;
13
- retry(reservationId: string, opts?: {
14
- delayMs?: number;
15
- }): Promise<void>;
16
- discard(reservationId: string, reason?: unknown): Promise<void>;
17
- remove(jobId: string): Promise<boolean>;
18
- stats(): Promise<QueueStats>;
19
- shutdown(): Promise<void>;
20
- }
1
+ import { QueueAdapter, QueueReservation, QueueStats } from "../QueueAdapter.js";
2
+ import type { WorkflowJobPayload } from "../../types/job.js";
3
+ export declare class MemoryQueueAdapter implements QueueAdapter {
4
+ private waiting;
5
+ private inFlight;
6
+ private failed;
7
+ enqueue(payload: WorkflowJobPayload, opts?: {
8
+ priority?: number;
9
+ delayMs?: number;
10
+ }): Promise<void>;
11
+ reserve(): Promise<QueueReservation | null>;
12
+ commit(reservationId: string): Promise<void>;
13
+ retry(reservationId: string, opts?: {
14
+ delayMs?: number;
15
+ }): Promise<void>;
16
+ discard(reservationId: string, reason?: unknown): Promise<void>;
17
+ remove(jobId: string): Promise<boolean>;
18
+ stats(): Promise<QueueStats>;
19
+ shutdown(): Promise<void>;
20
+ }
21
21
  //# sourceMappingURL=memory.d.ts.map
@@ -1,4 +1,5 @@
1
1
  import type { Workflow, WorkflowResult } from "../../workflow.js";
2
+ import type { JobProfileStats } from "../profiling/JobProfiler.js";
2
3
  export type JobId = string;
3
4
  export type WorkflowInput = Workflow | object | string | {
4
5
  toJSON(): object;
@@ -52,5 +53,7 @@ export interface JobRecord extends WorkflowJobPayload {
52
53
  result?: WorkflowResult | Record<string, unknown>;
53
54
  startedAt?: number;
54
55
  completedAt?: number;
56
+ /** Execution profiling stats (only present when profiling enabled) */
57
+ profileStats?: JobProfileStats;
55
58
  }
56
59
  //# sourceMappingURL=job.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/pool/types/job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,MAAM,IAAI,MAAM,CAAA;CAAE,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,yCAAyC;IACzC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,cAAc,CAAC,CAAC,GACzE,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,YAAY,CAAC,EAAE;QACb,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,SAAU,SAAQ,kBAAkB;IACnD,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/pool/types/job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,MAAM,IAAI,MAAM,CAAA;CAAE,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,yCAAyC;IACzC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,cAAc,CAAC,CAAC,GACzE,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,YAAY,CAAC,EAAE;QACb,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,SAAU,SAAQ,kBAAkB;IACnD,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC"}
@@ -1,5 +1,17 @@
1
1
  /**
2
- * Deterministically hash a workflow payload so failover heuristics can group related jobs.
2
+ * Deterministically hash a workflow JSON structure (node graph, connections, node types).
3
+ * This hash is computed on workflow initialization and can be used by failover strategies
4
+ * to group related jobs and track client compatibility.
5
+ *
6
+ * The hash is based on the STRUCTURE of the workflow (nodes, connections, class types),
7
+ * NOT on parameter values. This ensures that running the same workflow with different
8
+ * prompts, seeds, or dimensions produces the same hash.
9
+ *
10
+ * If you modify the workflow structure AFTER initialization (e.g., changing a checkpoint),
11
+ * call workflow.updateHash() to recalculate the hash.
12
+ *
13
+ * @param workflow - The workflow JSON object
14
+ * @returns SHA256 hash of the normalized workflow structure
3
15
  */
4
16
  export declare function hashWorkflow(workflow: object): string;
5
17
  //# sourceMappingURL=hash.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/pool/utils/hash.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAarD"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/pool/utils/hash.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAcrD"}
@@ -1,9 +1,22 @@
1
1
  import { createHash } from "node:crypto";
2
2
  /**
3
- * Deterministically hash a workflow payload so failover heuristics can group related jobs.
3
+ * Deterministically hash a workflow JSON structure (node graph, connections, node types).
4
+ * This hash is computed on workflow initialization and can be used by failover strategies
5
+ * to group related jobs and track client compatibility.
6
+ *
7
+ * The hash is based on the STRUCTURE of the workflow (nodes, connections, class types),
8
+ * NOT on parameter values. This ensures that running the same workflow with different
9
+ * prompts, seeds, or dimensions produces the same hash.
10
+ *
11
+ * If you modify the workflow structure AFTER initialization (e.g., changing a checkpoint),
12
+ * call workflow.updateHash() to recalculate the hash.
13
+ *
14
+ * @param workflow - The workflow JSON object
15
+ * @returns SHA256 hash of the normalized workflow structure
4
16
  */
5
17
  export function hashWorkflow(workflow) {
6
18
  const json = JSON.stringify(workflow, (_key, value) => {
19
+ // Sort object keys for deterministic ordering
7
20
  if (value && typeof value === "object" && !Array.isArray(value)) {
8
21
  return Object.keys(value)
9
22
  .sort()
@@ -1 +1 @@
1
- {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/pool/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;iBACtB,IAAI,EAAE;iBACN,MAAM,CAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC5C,GAAG,CAAC,GAAG,CAAC,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;gBACnD,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/pool/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpD,8CAA8C;QAC9C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;iBACtB,IAAI,EAAE;iBACN,MAAM,CAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC5C,GAAG,CAAC,GAAG,CAAC,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;gBACnD,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC"}