ai-workflows 2.1.1 → 2.3.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 (211) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +17 -1
  3. package/README.md +305 -184
  4. package/dist/barrier.d.ts +159 -0
  5. package/dist/barrier.d.ts.map +1 -0
  6. package/dist/barrier.js +377 -0
  7. package/dist/barrier.js.map +1 -0
  8. package/dist/cascade-context.d.ts +149 -0
  9. package/dist/cascade-context.d.ts.map +1 -0
  10. package/dist/cascade-context.js +324 -0
  11. package/dist/cascade-context.js.map +1 -0
  12. package/dist/cascade-executor.d.ts +196 -0
  13. package/dist/cascade-executor.d.ts.map +1 -0
  14. package/dist/cascade-executor.js +384 -0
  15. package/dist/cascade-executor.js.map +1 -0
  16. package/dist/context.d.ts.map +1 -1
  17. package/dist/context.js +27 -8
  18. package/dist/context.js.map +1 -1
  19. package/dist/cron-parser.d.ts +65 -0
  20. package/dist/cron-parser.d.ts.map +1 -0
  21. package/dist/cron-parser.js +294 -0
  22. package/dist/cron-parser.js.map +1 -0
  23. package/dist/cron-scheduler.d.ts +117 -0
  24. package/dist/cron-scheduler.d.ts.map +1 -0
  25. package/dist/cron-scheduler.js +176 -0
  26. package/dist/cron-scheduler.js.map +1 -0
  27. package/dist/database-context.d.ts +184 -0
  28. package/dist/database-context.d.ts.map +1 -0
  29. package/dist/database-context.js +428 -0
  30. package/dist/database-context.js.map +1 -0
  31. package/dist/dependency-graph.d.ts +157 -0
  32. package/dist/dependency-graph.d.ts.map +1 -0
  33. package/dist/dependency-graph.js +382 -0
  34. package/dist/dependency-graph.js.map +1 -0
  35. package/dist/digital-objects-adapter.d.ts +159 -0
  36. package/dist/digital-objects-adapter.d.ts.map +1 -0
  37. package/dist/digital-objects-adapter.js +229 -0
  38. package/dist/digital-objects-adapter.js.map +1 -0
  39. package/dist/durable-execution-cloudflare.d.ts +427 -0
  40. package/dist/durable-execution-cloudflare.d.ts.map +1 -0
  41. package/dist/durable-execution-cloudflare.js +510 -0
  42. package/dist/durable-execution-cloudflare.js.map +1 -0
  43. package/dist/durable-execution.d.ts +482 -0
  44. package/dist/durable-execution.d.ts.map +1 -0
  45. package/dist/durable-execution.js +594 -0
  46. package/dist/durable-execution.js.map +1 -0
  47. package/dist/durable-workflow.d.ts +176 -0
  48. package/dist/durable-workflow.d.ts.map +1 -0
  49. package/dist/durable-workflow.js +552 -0
  50. package/dist/durable-workflow.js.map +1 -0
  51. package/dist/every.d.ts +31 -2
  52. package/dist/every.d.ts.map +1 -1
  53. package/dist/every.js +63 -32
  54. package/dist/every.js.map +1 -1
  55. package/dist/graph/index.d.ts +8 -0
  56. package/dist/graph/index.d.ts.map +1 -0
  57. package/dist/graph/index.js +8 -0
  58. package/dist/graph/index.js.map +1 -0
  59. package/dist/graph/topological-sort.d.ts +121 -0
  60. package/dist/graph/topological-sort.d.ts.map +1 -0
  61. package/dist/graph/topological-sort.js +292 -0
  62. package/dist/graph/topological-sort.js.map +1 -0
  63. package/dist/index.d.ts +10 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/logger.d.ts +101 -0
  68. package/dist/logger.d.ts.map +1 -0
  69. package/dist/logger.js +115 -0
  70. package/dist/logger.js.map +1 -0
  71. package/dist/on.d.ts +35 -10
  72. package/dist/on.d.ts.map +1 -1
  73. package/dist/on.js +53 -19
  74. package/dist/on.js.map +1 -1
  75. package/dist/runtime.d.ts +169 -0
  76. package/dist/runtime.d.ts.map +1 -0
  77. package/dist/runtime.js +275 -0
  78. package/dist/runtime.js.map +1 -0
  79. package/dist/send.d.ts.map +1 -1
  80. package/dist/send.js +4 -3
  81. package/dist/send.js.map +1 -1
  82. package/dist/telemetry.d.ts +150 -0
  83. package/dist/telemetry.d.ts.map +1 -0
  84. package/dist/telemetry.js +388 -0
  85. package/dist/telemetry.js.map +1 -0
  86. package/dist/timer-registry.d.ts +77 -0
  87. package/dist/timer-registry.d.ts.map +1 -0
  88. package/dist/timer-registry.js +154 -0
  89. package/dist/timer-registry.js.map +1 -0
  90. package/dist/types.d.ts +105 -6
  91. package/dist/types.d.ts.map +1 -1
  92. package/dist/types.js +17 -1
  93. package/dist/types.js.map +1 -1
  94. package/dist/worker/durable-step.d.ts +481 -0
  95. package/dist/worker/durable-step.d.ts.map +1 -0
  96. package/dist/worker/durable-step.js +606 -0
  97. package/dist/worker/durable-step.js.map +1 -0
  98. package/dist/worker/index.d.ts +106 -0
  99. package/dist/worker/index.d.ts.map +1 -0
  100. package/dist/worker/index.js +124 -0
  101. package/dist/worker/index.js.map +1 -0
  102. package/dist/worker/state-adapter.d.ts +230 -0
  103. package/dist/worker/state-adapter.d.ts.map +1 -0
  104. package/dist/worker/state-adapter.js +409 -0
  105. package/dist/worker/state-adapter.js.map +1 -0
  106. package/dist/worker/topological-executor.d.ts +282 -0
  107. package/dist/worker/topological-executor.d.ts.map +1 -0
  108. package/dist/worker/topological-executor.js +396 -0
  109. package/dist/worker/topological-executor.js.map +1 -0
  110. package/dist/worker/workflow-builder.d.ts +286 -0
  111. package/dist/worker/workflow-builder.d.ts.map +1 -0
  112. package/dist/worker/workflow-builder.js +565 -0
  113. package/dist/worker/workflow-builder.js.map +1 -0
  114. package/dist/worker.d.ts +800 -0
  115. package/dist/worker.d.ts.map +1 -0
  116. package/dist/worker.js +2428 -0
  117. package/dist/worker.js.map +1 -0
  118. package/dist/workflow-builder.d.ts +287 -0
  119. package/dist/workflow-builder.d.ts.map +1 -0
  120. package/dist/workflow-builder.js +762 -0
  121. package/dist/workflow-builder.js.map +1 -0
  122. package/dist/workflow.d.ts +14 -30
  123. package/dist/workflow.d.ts.map +1 -1
  124. package/dist/workflow.js +136 -292
  125. package/dist/workflow.js.map +1 -1
  126. package/examples/01-ecommerce-order-pipeline.ts +358 -0
  127. package/examples/02-content-moderation-cascade.ts +454 -0
  128. package/examples/03-scheduled-reporting-dependencies.ts +479 -0
  129. package/examples/04-database-persistence.ts +518 -0
  130. package/examples/README.md +173 -0
  131. package/package.json +21 -4
  132. package/src/__tests__/digital-objects-adapter.test.ts +274 -0
  133. package/src/__tests__/durable-workflow.test.ts +297 -0
  134. package/src/barrier.ts +507 -0
  135. package/src/cascade-context.ts +495 -0
  136. package/src/cascade-executor.ts +588 -0
  137. package/src/context.ts +51 -17
  138. package/src/cron-parser.ts +347 -0
  139. package/src/cron-scheduler.ts +239 -0
  140. package/src/database-context.ts +658 -0
  141. package/src/dependency-graph.ts +518 -0
  142. package/src/digital-objects-adapter.ts +351 -0
  143. package/src/durable-execution-cloudflare.ts +855 -0
  144. package/src/durable-execution.ts +1042 -0
  145. package/src/durable-workflow.ts +717 -0
  146. package/src/every.ts +104 -35
  147. package/src/graph/index.ts +19 -0
  148. package/src/graph/topological-sort.ts +412 -0
  149. package/src/index.ts +147 -0
  150. package/src/logger.ts +148 -0
  151. package/src/on.ts +81 -26
  152. package/src/runtime.ts +436 -0
  153. package/src/send.ts +4 -5
  154. package/src/telemetry.ts +577 -0
  155. package/src/timer-registry.ts +179 -0
  156. package/src/types.ts +146 -10
  157. package/src/worker/durable-step.ts +976 -0
  158. package/src/worker/index.ts +216 -0
  159. package/src/worker/state-adapter.ts +589 -0
  160. package/src/worker/topological-executor.ts +625 -0
  161. package/src/worker/workflow-builder.ts +871 -0
  162. package/src/worker.ts +2906 -0
  163. package/src/workflow-builder.ts +1068 -0
  164. package/src/workflow.ts +199 -355
  165. package/test/barrier-join.test.ts +442 -0
  166. package/test/barrier-unhandled-rejections.test.ts +359 -0
  167. package/test/cascade-context.test.ts +390 -0
  168. package/test/cascade-executor.test.ts +852 -0
  169. package/test/cron-parser.test.ts +314 -0
  170. package/test/cron-scheduler.test.ts +291 -0
  171. package/test/database-context.test.ts +770 -0
  172. package/test/db-provider-adapter.test.ts +862 -0
  173. package/test/dependency-graph.test.ts +512 -0
  174. package/test/durable-execution-cloudflare.test.ts +606 -0
  175. package/test/durable-execution-in-process.test.ts +286 -0
  176. package/test/durable-execution.test.ts +247 -0
  177. package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
  178. package/test/graph/topological-sort.test.ts +586 -0
  179. package/test/integration.test.ts +442 -0
  180. package/test/rpc-surface.test.ts +946 -0
  181. package/test/runtime.test.ts +262 -0
  182. package/test/schedule-timer-cleanup.test.ts +353 -0
  183. package/test/send-race-conditions.test.ts +400 -0
  184. package/test/type-safety-every.test.ts +303 -0
  185. package/test/worker/durable-cascade.test.ts +1117 -0
  186. package/test/worker/durable-step.test.ts +723 -0
  187. package/test/worker/topological-executor.test.ts +1240 -0
  188. package/test/worker/workflow-builder.test.ts +1067 -0
  189. package/test/worker.test.ts +608 -0
  190. package/test/workflow-builder.test.ts +1670 -0
  191. package/test/workflow-cron.test.ts +256 -0
  192. package/test/workflow-state-adapter.test.ts +923 -0
  193. package/test/workflow.test.ts +25 -22
  194. package/tsconfig.json +3 -1
  195. package/vitest.config.ts +38 -1
  196. package/vitest.workers.config.ts +44 -0
  197. package/wrangler.jsonc +22 -0
  198. package/.turbo/turbo-test.log +0 -7
  199. package/src/context.js +0 -83
  200. package/src/every.js +0 -267
  201. package/src/index.js +0 -71
  202. package/src/on.js +0 -79
  203. package/src/send.js +0 -111
  204. package/src/types.js +0 -4
  205. package/src/workflow.js +0 -455
  206. package/test/context.test.js +0 -116
  207. package/test/every.test.js +0 -282
  208. package/test/on.test.js +0 -80
  209. package/test/send.test.js +0 -89
  210. package/test/workflow.test.js +0 -224
  211. package/vitest.config.js +0 -7
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Dependency Graph Architecture for Workflow Steps
3
+ *
4
+ * Provides a directed acyclic graph (DAG) for managing workflow step dependencies.
5
+ * Supports:
6
+ * - Hard vs soft dependencies
7
+ * - Cycle detection with path reporting
8
+ * - Parallel group identification for concurrent execution
9
+ * - Graph visualization (DOT, JSON)
10
+ */
11
+ import type { EventRegistration } from './types.js';
12
+ /**
13
+ * Dependency type: hard (must succeed) or soft (can proceed on failure)
14
+ */
15
+ export type DependencyType = 'hard' | 'soft';
16
+ /**
17
+ * Configuration for step dependencies
18
+ */
19
+ export interface DependencyConfig {
20
+ /**
21
+ * Step(s) that must complete before this step runs
22
+ * Can be a single step ID or array of step IDs
23
+ */
24
+ dependsOn: string | string[];
25
+ /**
26
+ * Type of dependency (default: 'hard')
27
+ * - 'hard': Dependency must complete successfully
28
+ * - 'soft': Step can proceed even if dependency fails
29
+ */
30
+ type?: DependencyType;
31
+ }
32
+ /**
33
+ * A node in the dependency graph
34
+ */
35
+ export interface GraphNode {
36
+ /** Unique identifier (e.g., 'Step1.complete') */
37
+ id: string;
38
+ /** Direct dependencies (step IDs that must complete first) */
39
+ dependencies: string[];
40
+ /** Map of dependency ID to dependency type */
41
+ dependencyTypes?: Record<string, DependencyType>;
42
+ /** Optional metadata */
43
+ metadata?: Record<string, unknown>;
44
+ }
45
+ /**
46
+ * A group of nodes that can execute in parallel
47
+ */
48
+ export interface ParallelGroup {
49
+ /** Execution level (0 = no dependencies, 1 = depends on level 0, etc.) */
50
+ level: number;
51
+ /** Node IDs that can run concurrently at this level */
52
+ nodes: string[];
53
+ }
54
+ /**
55
+ * JSON representation of the graph
56
+ */
57
+ export interface GraphJSON {
58
+ nodes: GraphNode[];
59
+ edges: Array<{
60
+ from: string;
61
+ to: string;
62
+ type: DependencyType;
63
+ }>;
64
+ }
65
+ /**
66
+ * Error thrown when a circular dependency is detected
67
+ */
68
+ export declare class CircularDependencyError extends Error {
69
+ /** The path of nodes forming the cycle */
70
+ cyclePath: string[];
71
+ constructor(cyclePath: string[]);
72
+ }
73
+ /**
74
+ * Error thrown when a referenced dependency doesn't exist
75
+ */
76
+ export declare class MissingDependencyError extends Error {
77
+ /** The missing dependency ID */
78
+ dependency: string;
79
+ /** The node that references the missing dependency */
80
+ node: string;
81
+ constructor(dependency: string, node: string);
82
+ }
83
+ /**
84
+ * Extended event registration with optional dependencies
85
+ */
86
+ export interface EventRegistrationWithDeps extends EventRegistration {
87
+ dependencies?: DependencyConfig;
88
+ }
89
+ /**
90
+ * Directed Acyclic Graph for workflow step dependencies
91
+ */
92
+ export declare class DependencyGraph {
93
+ private nodes;
94
+ /**
95
+ * Create a DependencyGraph from event registrations
96
+ */
97
+ static fromEventRegistrations(registrations: EventRegistrationWithDeps[]): DependencyGraph;
98
+ /**
99
+ * Check if a node exists
100
+ */
101
+ hasNode(id: string): boolean;
102
+ /**
103
+ * Add a node to the graph
104
+ */
105
+ addNode(id: string, config?: DependencyConfig): void;
106
+ /**
107
+ * Add an edge (dependency) between existing nodes
108
+ */
109
+ addEdge(from: string, to: string, type?: DependencyType): void;
110
+ /**
111
+ * Get all nodes in the graph
112
+ */
113
+ getNodes(): GraphNode[];
114
+ /**
115
+ * Get a specific node
116
+ */
117
+ getNode(id: string): GraphNode | undefined;
118
+ /**
119
+ * Get direct dependencies of a node
120
+ */
121
+ getDependencies(id: string): string[];
122
+ /**
123
+ * Get all transitive dependencies of a node
124
+ */
125
+ getAllDependencies(id: string): string[];
126
+ /**
127
+ * Get nodes that depend on a given node
128
+ */
129
+ getDependents(id: string): string[];
130
+ /**
131
+ * Get only hard dependencies
132
+ */
133
+ getHardDependencies(id: string): string[];
134
+ /**
135
+ * Get only soft dependencies
136
+ */
137
+ getSoftDependencies(id: string): string[];
138
+ /**
139
+ * Detect cycles using DFS
140
+ * Returns the cycle path if found, null otherwise
141
+ */
142
+ detectCycles(): string[] | null;
143
+ /**
144
+ * Get parallel execution groups
145
+ * Returns nodes grouped by execution level (0 = no deps, 1 = depends on 0, etc.)
146
+ */
147
+ getParallelGroups(): ParallelGroup[];
148
+ /**
149
+ * Export graph to DOT format for visualization
150
+ */
151
+ toDot(): string;
152
+ /**
153
+ * Export graph to JSON format
154
+ */
155
+ toJSON(): GraphJSON;
156
+ }
157
+ //# sourceMappingURL=dependency-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../src/dependency-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Dependency Graph Architecture for Workflow Steps
3
+ *
4
+ * Provides a directed acyclic graph (DAG) for managing workflow step dependencies.
5
+ * Supports:
6
+ * - Hard vs soft dependencies
7
+ * - Cycle detection with path reporting
8
+ * - Parallel group identification for concurrent execution
9
+ * - Graph visualization (DOT, JSON)
10
+ */
11
+ /**
12
+ * Error thrown when a circular dependency is detected
13
+ */
14
+ export class CircularDependencyError extends Error {
15
+ /** The path of nodes forming the cycle */
16
+ cyclePath;
17
+ constructor(cyclePath) {
18
+ const pathStr = cyclePath.join(' -> ');
19
+ super(`Circular dependency detected: ${pathStr}`);
20
+ this.name = 'CircularDependencyError';
21
+ this.cyclePath = cyclePath;
22
+ }
23
+ }
24
+ /**
25
+ * Error thrown when a referenced dependency doesn't exist
26
+ */
27
+ export class MissingDependencyError extends Error {
28
+ /** The missing dependency ID */
29
+ dependency;
30
+ /** The node that references the missing dependency */
31
+ node;
32
+ constructor(dependency, node) {
33
+ super(`Missing dependency '${dependency}' referenced by '${node}'. ` +
34
+ `Ensure '${dependency}' is added to the graph before '${node}'.`);
35
+ this.name = 'MissingDependencyError';
36
+ this.dependency = dependency;
37
+ this.node = node;
38
+ }
39
+ }
40
+ /**
41
+ * Directed Acyclic Graph for workflow step dependencies
42
+ */
43
+ export class DependencyGraph {
44
+ nodes = new Map();
45
+ /**
46
+ * Create a DependencyGraph from event registrations
47
+ */
48
+ static fromEventRegistrations(registrations) {
49
+ const graph = new DependencyGraph();
50
+ // First pass: add all nodes without dependencies
51
+ for (const reg of registrations) {
52
+ const nodeId = `${reg.noun}.${reg.event}`;
53
+ if (!graph.hasNode(nodeId)) {
54
+ // Add as placeholder first (will be updated with deps in second pass)
55
+ graph.nodes.set(nodeId, {
56
+ id: nodeId,
57
+ dependencies: [],
58
+ dependencyTypes: {},
59
+ });
60
+ }
61
+ }
62
+ // Second pass: add dependencies
63
+ for (const reg of registrations) {
64
+ const nodeId = `${reg.noun}.${reg.event}`;
65
+ if (reg.dependencies) {
66
+ const deps = Array.isArray(reg.dependencies.dependsOn)
67
+ ? reg.dependencies.dependsOn
68
+ : [reg.dependencies.dependsOn];
69
+ const depType = reg.dependencies.type || 'hard';
70
+ for (const dep of deps) {
71
+ if (!graph.hasNode(dep)) {
72
+ throw new MissingDependencyError(dep, nodeId);
73
+ }
74
+ const node = graph.nodes.get(nodeId);
75
+ if (!node.dependencies.includes(dep)) {
76
+ node.dependencies.push(dep);
77
+ node.dependencyTypes = node.dependencyTypes || {};
78
+ node.dependencyTypes[dep] = depType;
79
+ }
80
+ }
81
+ // Check for cycles after adding edges
82
+ const cycle = graph.detectCycles();
83
+ if (cycle) {
84
+ throw new CircularDependencyError(cycle);
85
+ }
86
+ }
87
+ }
88
+ return graph;
89
+ }
90
+ /**
91
+ * Check if a node exists
92
+ */
93
+ hasNode(id) {
94
+ return this.nodes.has(id);
95
+ }
96
+ /**
97
+ * Add a node to the graph
98
+ */
99
+ addNode(id, config) {
100
+ // Check for self-reference
101
+ if (config?.dependsOn) {
102
+ const deps = Array.isArray(config.dependsOn)
103
+ ? config.dependsOn
104
+ : [config.dependsOn];
105
+ if (deps.includes(id)) {
106
+ throw new CircularDependencyError([id, id]);
107
+ }
108
+ // Verify all dependencies exist
109
+ for (const dep of deps) {
110
+ if (!this.nodes.has(dep)) {
111
+ throw new MissingDependencyError(dep, id);
112
+ }
113
+ }
114
+ }
115
+ const dependencies = config?.dependsOn
116
+ ? Array.isArray(config.dependsOn)
117
+ ? config.dependsOn
118
+ : [config.dependsOn]
119
+ : [];
120
+ const depType = config?.type || 'hard';
121
+ const dependencyTypes = {};
122
+ for (const dep of dependencies) {
123
+ dependencyTypes[dep] = depType;
124
+ }
125
+ this.nodes.set(id, {
126
+ id,
127
+ dependencies,
128
+ dependencyTypes,
129
+ });
130
+ // Check for cycles after adding node with dependencies
131
+ if (dependencies.length > 0) {
132
+ const cycle = this.detectCycles();
133
+ if (cycle) {
134
+ // Remove the node we just added
135
+ this.nodes.delete(id);
136
+ throw new CircularDependencyError(cycle);
137
+ }
138
+ }
139
+ }
140
+ /**
141
+ * Add an edge (dependency) between existing nodes
142
+ */
143
+ addEdge(from, to, type = 'hard') {
144
+ if (!this.nodes.has(from)) {
145
+ throw new MissingDependencyError(from, to);
146
+ }
147
+ if (!this.nodes.has(to)) {
148
+ throw new MissingDependencyError(to, from);
149
+ }
150
+ const toNode = this.nodes.get(to);
151
+ // Check for self-reference
152
+ if (from === to) {
153
+ throw new CircularDependencyError([from, to]);
154
+ }
155
+ // Add the dependency
156
+ if (!toNode.dependencies.includes(from)) {
157
+ toNode.dependencies.push(from);
158
+ toNode.dependencyTypes = toNode.dependencyTypes || {};
159
+ toNode.dependencyTypes[from] = type;
160
+ }
161
+ // Check for cycles
162
+ const cycle = this.detectCycles();
163
+ if (cycle) {
164
+ // Rollback the edge
165
+ toNode.dependencies = toNode.dependencies.filter((d) => d !== from);
166
+ if (toNode.dependencyTypes) {
167
+ delete toNode.dependencyTypes[from];
168
+ }
169
+ throw new CircularDependencyError(cycle);
170
+ }
171
+ }
172
+ /**
173
+ * Get all nodes in the graph
174
+ */
175
+ getNodes() {
176
+ return Array.from(this.nodes.values());
177
+ }
178
+ /**
179
+ * Get a specific node
180
+ */
181
+ getNode(id) {
182
+ return this.nodes.get(id);
183
+ }
184
+ /**
185
+ * Get direct dependencies of a node
186
+ */
187
+ getDependencies(id) {
188
+ const node = this.nodes.get(id);
189
+ if (!node) {
190
+ throw new MissingDependencyError(id, 'getDependencies()');
191
+ }
192
+ return [...node.dependencies];
193
+ }
194
+ /**
195
+ * Get all transitive dependencies of a node
196
+ */
197
+ getAllDependencies(id) {
198
+ const node = this.nodes.get(id);
199
+ if (!node) {
200
+ throw new MissingDependencyError(id, 'getAllDependencies()');
201
+ }
202
+ const visited = new Set();
203
+ const stack = [...node.dependencies];
204
+ while (stack.length > 0) {
205
+ const current = stack.pop();
206
+ if (visited.has(current))
207
+ continue;
208
+ visited.add(current);
209
+ const currentNode = this.nodes.get(current);
210
+ if (currentNode) {
211
+ for (const dep of currentNode.dependencies) {
212
+ if (!visited.has(dep)) {
213
+ stack.push(dep);
214
+ }
215
+ }
216
+ }
217
+ }
218
+ return Array.from(visited);
219
+ }
220
+ /**
221
+ * Get nodes that depend on a given node
222
+ */
223
+ getDependents(id) {
224
+ const dependents = [];
225
+ for (const node of this.nodes.values()) {
226
+ if (node.dependencies.includes(id)) {
227
+ dependents.push(node.id);
228
+ }
229
+ }
230
+ return dependents;
231
+ }
232
+ /**
233
+ * Get only hard dependencies
234
+ */
235
+ getHardDependencies(id) {
236
+ const node = this.nodes.get(id);
237
+ if (!node) {
238
+ throw new MissingDependencyError(id, 'getHardDependencies()');
239
+ }
240
+ return node.dependencies.filter((dep) => (node.dependencyTypes?.[dep] || 'hard') === 'hard');
241
+ }
242
+ /**
243
+ * Get only soft dependencies
244
+ */
245
+ getSoftDependencies(id) {
246
+ const node = this.nodes.get(id);
247
+ if (!node) {
248
+ throw new MissingDependencyError(id, 'getSoftDependencies()');
249
+ }
250
+ return node.dependencies.filter((dep) => node.dependencyTypes?.[dep] === 'soft');
251
+ }
252
+ /**
253
+ * Detect cycles using DFS
254
+ * Returns the cycle path if found, null otherwise
255
+ */
256
+ detectCycles() {
257
+ const visited = new Set();
258
+ const recursionStack = new Set();
259
+ const path = [];
260
+ const dfs = (nodeId) => {
261
+ visited.add(nodeId);
262
+ recursionStack.add(nodeId);
263
+ path.push(nodeId);
264
+ const node = this.nodes.get(nodeId);
265
+ if (node) {
266
+ for (const dep of node.dependencies) {
267
+ if (!visited.has(dep)) {
268
+ const cycle = dfs(dep);
269
+ if (cycle)
270
+ return cycle;
271
+ }
272
+ else if (recursionStack.has(dep)) {
273
+ // Found a cycle - construct the cycle path
274
+ const cycleStart = path.indexOf(dep);
275
+ const cyclePath = path.slice(cycleStart);
276
+ cyclePath.push(dep); // Complete the cycle
277
+ return cyclePath;
278
+ }
279
+ }
280
+ }
281
+ path.pop();
282
+ recursionStack.delete(nodeId);
283
+ return null;
284
+ };
285
+ for (const nodeId of this.nodes.keys()) {
286
+ if (!visited.has(nodeId)) {
287
+ const cycle = dfs(nodeId);
288
+ if (cycle)
289
+ return cycle;
290
+ }
291
+ }
292
+ return null;
293
+ }
294
+ /**
295
+ * Get parallel execution groups
296
+ * Returns nodes grouped by execution level (0 = no deps, 1 = depends on 0, etc.)
297
+ */
298
+ getParallelGroups() {
299
+ const levels = new Map();
300
+ // Calculate level for each node
301
+ const calculateLevel = (nodeId) => {
302
+ if (levels.has(nodeId)) {
303
+ return levels.get(nodeId);
304
+ }
305
+ const node = this.nodes.get(nodeId);
306
+ if (!node || node.dependencies.length === 0) {
307
+ levels.set(nodeId, 0);
308
+ return 0;
309
+ }
310
+ let maxDepLevel = -1;
311
+ for (const dep of node.dependencies) {
312
+ const depLevel = calculateLevel(dep);
313
+ maxDepLevel = Math.max(maxDepLevel, depLevel);
314
+ }
315
+ const level = maxDepLevel + 1;
316
+ levels.set(nodeId, level);
317
+ return level;
318
+ };
319
+ // Calculate levels for all nodes
320
+ for (const nodeId of this.nodes.keys()) {
321
+ calculateLevel(nodeId);
322
+ }
323
+ // Group nodes by level
324
+ const groups = new Map();
325
+ for (const [nodeId, level] of levels) {
326
+ if (!groups.has(level)) {
327
+ groups.set(level, []);
328
+ }
329
+ groups.get(level).push(nodeId);
330
+ }
331
+ // Convert to sorted array of ParallelGroups
332
+ const result = [];
333
+ const sortedLevels = Array.from(groups.keys()).sort((a, b) => a - b);
334
+ for (const level of sortedLevels) {
335
+ result.push({
336
+ level,
337
+ nodes: groups.get(level),
338
+ });
339
+ }
340
+ return result;
341
+ }
342
+ /**
343
+ * Export graph to DOT format for visualization
344
+ */
345
+ toDot() {
346
+ const lines = ['digraph DependencyGraph {'];
347
+ lines.push(' rankdir=TB;');
348
+ lines.push(' node [shape=box];');
349
+ // Add nodes
350
+ for (const node of this.nodes.values()) {
351
+ const label = node.id.replace(/\./g, '\\n');
352
+ lines.push(` "${node.id}" [label="${label}"];`);
353
+ }
354
+ // Add edges
355
+ for (const node of this.nodes.values()) {
356
+ for (const dep of node.dependencies) {
357
+ const style = node.dependencyTypes?.[dep] === 'soft' ? 'dashed' : 'solid';
358
+ lines.push(` "${dep}" -> "${node.id}" [style=${style}];`);
359
+ }
360
+ }
361
+ lines.push('}');
362
+ return lines.join('\n');
363
+ }
364
+ /**
365
+ * Export graph to JSON format
366
+ */
367
+ toJSON() {
368
+ const nodes = this.getNodes();
369
+ const edges = [];
370
+ for (const node of nodes) {
371
+ for (const dep of node.dependencies) {
372
+ edges.push({
373
+ from: dep,
374
+ to: node.id,
375
+ type: node.dependencyTypes?.[dep] || 'hard',
376
+ });
377
+ }
378
+ }
379
+ return { nodes, edges };
380
+ }
381
+ }
382
+ //# sourceMappingURL=dependency-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../src/dependency-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmEH;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,0CAA0C;IAC1C,SAAS,CAAU;IAEnB,YAAY,SAAmB;QAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtC,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,gCAAgC;IAChC,UAAU,CAAQ;IAElB,sDAAsD;IACtD,IAAI,CAAQ;IAEZ,YAAY,UAAkB,EAAE,IAAY;QAC1C,KAAK,CACH,uBAAuB,UAAU,oBAAoB,IAAI,KAAK;YAC5D,WAAW,UAAU,mCAAmC,IAAI,IAAI,CACnE,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;QACpC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AASD;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,KAAK,GAA2B,IAAI,GAAG,EAAE,CAAA;IAEjD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAC3B,aAA0C;QAE1C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QAEnC,iDAAiD;QACjD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAA;YACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,sEAAsE;gBACtE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;oBACtB,EAAE,EAAE,MAAM;oBACV,YAAY,EAAE,EAAE;oBAChB,eAAe,EAAE,EAAE;iBACpB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAA;YACzC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;oBACpD,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS;oBAC5B,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;gBAEhC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,MAAM,CAAA;gBAE/C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBACxB,MAAM,IAAI,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;oBAC/C,CAAC;oBACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAE,CAAA;oBACrC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;wBAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAA;wBACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;oBACrC,CAAC;gBACH,CAAC;gBAED,sCAAsC;gBACtC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAA;gBAClC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU,EAAE,MAAyB;QAC3C,2BAA2B;QAC3B,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC1C,CAAC,CAAC,MAAM,CAAC,SAAS;gBAClB,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAEtB,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAC7C,CAAC;YAED,gCAAgC;YAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,sBAAsB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,EAAE,SAAS;YACpC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC/B,CAAC,CAAC,MAAM,CAAC,SAAS;gBAClB,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACtB,CAAC,CAAC,EAAE,CAAA;QAEN,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,IAAI,MAAM,CAAA;QACtC,MAAM,eAAe,GAAmC,EAAE,CAAA;QAC1D,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;QAChC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE;YACjB,EAAE;YACF,YAAY;YACZ,eAAe;SAChB,CAAC,CAAA;QAEF,uDAAuD;QACvD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;YACjC,IAAI,KAAK,EAAE,CAAC;gBACV,gCAAgC;gBAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACrB,MAAM,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAY,EAAE,EAAU,EAAE,OAAuB,MAAM;QAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC5C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,sBAAsB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;QAElC,2BAA2B;QAC3B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,uBAAuB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;QAC/C,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9B,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAA;YACrD,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACrC,CAAC;QAED,mBAAmB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,oBAAoB;YACpB,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;YACnE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YACrC,CAAC;YACD,MAAM,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,EAAU;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,sBAAsB,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,EAAU;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,sBAAsB,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAA;QAC9D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAEpC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;YAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAQ;YAClC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAEpB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC3C,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;oBAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,EAAU;QACtB,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,EAAU;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,sBAAsB,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,MAAM,CAC5D,CAAA;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,EAAU;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,sBAAsB,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,CAChD,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;QACxC,MAAM,IAAI,GAAa,EAAE,CAAA;QAEzB,MAAM,GAAG,GAAG,CAAC,MAAc,EAAmB,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACnB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAEjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACnC,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACtB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;wBACtB,IAAI,KAAK;4BAAE,OAAO,KAAK,CAAA;oBACzB,CAAC;yBAAM,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACnC,2CAA2C;wBAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;wBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;wBACxC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,qBAAqB;wBACzC,OAAO,SAAS,CAAA;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,EAAE,CAAA;YACV,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC,CAAA;QAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;gBACzB,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAA;YACzB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;QAExC,gCAAgC;QAChC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAU,EAAE;YAChD,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAA;YAC5B,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;gBACrB,OAAO,CAAC,CAAA;YACV,CAAC;YAED,IAAI,WAAW,GAAG,CAAC,CAAC,CAAA;YACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;gBACpC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAC/C,CAAC;YAED,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,CAAA;YAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YACzB,OAAO,KAAK,CAAA;QACd,CAAC,CAAA;QAED,iCAAiC;QACjC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,cAAc,CAAC,MAAM,CAAC,CAAA;QACxB,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACvB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;QAED,4CAA4C;QAC5C,MAAM,MAAM,GAAoB,EAAE,CAAA;QAClC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACpE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK;gBACL,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE;aAC1B,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,KAAK,GAAa,CAAC,2BAA2B,CAAC,CAAA;QACrD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QAEjC,YAAY;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,aAAa,KAAK,KAAK,CAAC,CAAA;QAClD,CAAC;QAED,YAAY;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;gBACzE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,IAAI,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC7B,MAAM,KAAK,GAAuB,EAAE,CAAA;QAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,GAAG;oBACT,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM;iBAC5C,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;CACF"}