@grunnverk/tree-execution 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 (80) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +1576 -0
  3. package/dist/TreeExecutor.d.ts +113 -0
  4. package/dist/TreeExecutor.d.ts.map +1 -0
  5. package/dist/TreeExecutor.js +113 -0
  6. package/dist/TreeExecutor.js.map +1 -0
  7. package/dist/checkpoint/CheckpointManager.d.ts +18 -0
  8. package/dist/checkpoint/CheckpointManager.d.ts.map +1 -0
  9. package/dist/checkpoint/CheckpointManager.js +156 -0
  10. package/dist/checkpoint/CheckpointManager.js.map +1 -0
  11. package/dist/checkpoint/index.d.ts +5 -0
  12. package/dist/checkpoint/index.d.ts.map +1 -0
  13. package/dist/checkpoint/index.js +5 -0
  14. package/dist/checkpoint/index.js.map +1 -0
  15. package/dist/execution/CommandValidator.d.ts +25 -0
  16. package/dist/execution/CommandValidator.d.ts.map +1 -0
  17. package/dist/execution/CommandValidator.js +129 -0
  18. package/dist/execution/CommandValidator.js.map +1 -0
  19. package/dist/execution/DependencyChecker.d.ts +47 -0
  20. package/dist/execution/DependencyChecker.d.ts.map +1 -0
  21. package/dist/execution/DependencyChecker.js +95 -0
  22. package/dist/execution/DependencyChecker.js.map +1 -0
  23. package/dist/execution/DynamicTaskPool.d.ts +118 -0
  24. package/dist/execution/DynamicTaskPool.d.ts.map +1 -0
  25. package/dist/execution/DynamicTaskPool.js +658 -0
  26. package/dist/execution/DynamicTaskPool.js.map +1 -0
  27. package/dist/execution/RecoveryManager.d.ts +89 -0
  28. package/dist/execution/RecoveryManager.d.ts.map +1 -0
  29. package/dist/execution/RecoveryManager.js +592 -0
  30. package/dist/execution/RecoveryManager.js.map +1 -0
  31. package/dist/execution/ResourceMonitor.d.ts +73 -0
  32. package/dist/execution/ResourceMonitor.d.ts.map +1 -0
  33. package/dist/execution/ResourceMonitor.js +148 -0
  34. package/dist/execution/ResourceMonitor.js.map +1 -0
  35. package/dist/execution/Scheduler.d.ts +36 -0
  36. package/dist/execution/Scheduler.d.ts.map +1 -0
  37. package/dist/execution/Scheduler.js +83 -0
  38. package/dist/execution/Scheduler.js.map +1 -0
  39. package/dist/execution/TreeExecutionAdapter.d.ts +45 -0
  40. package/dist/execution/TreeExecutionAdapter.d.ts.map +1 -0
  41. package/dist/execution/TreeExecutionAdapter.js +260 -0
  42. package/dist/execution/TreeExecutionAdapter.js.map +1 -0
  43. package/dist/index.d.ts +29 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +25 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/tree.d.ts +13 -0
  48. package/dist/tree.d.ts.map +1 -0
  49. package/dist/tree.js +2510 -0
  50. package/dist/tree.js.map +1 -0
  51. package/dist/types/config.d.ts +174 -0
  52. package/dist/types/config.d.ts.map +1 -0
  53. package/dist/types/config.js +2 -0
  54. package/dist/types/config.js.map +1 -0
  55. package/dist/types/index.d.ts +6 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. package/dist/types/index.js +6 -0
  58. package/dist/types/index.js.map +1 -0
  59. package/dist/types/parallelExecution.d.ts +108 -0
  60. package/dist/types/parallelExecution.d.ts.map +1 -0
  61. package/dist/types/parallelExecution.js +2 -0
  62. package/dist/types/parallelExecution.js.map +1 -0
  63. package/dist/util/commandStubs.d.ts +22 -0
  64. package/dist/util/commandStubs.d.ts.map +1 -0
  65. package/dist/util/commandStubs.js +49 -0
  66. package/dist/util/commandStubs.js.map +1 -0
  67. package/dist/util/logger.d.ts +14 -0
  68. package/dist/util/logger.d.ts.map +1 -0
  69. package/dist/util/logger.js +30 -0
  70. package/dist/util/logger.js.map +1 -0
  71. package/dist/util/mutex.d.ts +38 -0
  72. package/dist/util/mutex.d.ts.map +1 -0
  73. package/dist/util/mutex.js +101 -0
  74. package/dist/util/mutex.js.map +1 -0
  75. package/dist/util/treeUtils.d.ts +46 -0
  76. package/dist/util/treeUtils.d.ts.map +1 -0
  77. package/dist/util/treeUtils.js +74 -0
  78. package/dist/util/treeUtils.js.map +1 -0
  79. package/guide/index.md +84 -0
  80. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyChecker.d.ts","sourceRoot":"","sources":["../../src/execution/DependencyChecker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;GAGG;AACH,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,KAAK,CAAkB;gBAEnB,KAAK,EAAE,eAAe;IAIlC;;;OAGG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO;IAkB5D;;;OAGG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI9C;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAgBrC;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIjD;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAI/C;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAK7C;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAK3C;;OAEG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;CAehF"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * DependencyChecker validates package readiness and provides dependency information
3
+ * for the task pool scheduler.
4
+ */
5
+ export class DependencyChecker {
6
+ graph;
7
+ constructor(graph) {
8
+ this.graph = graph;
9
+ }
10
+ /**
11
+ * Check if a package is ready to execute
12
+ * A package is ready when all its dependencies are completed and none have failed
13
+ */
14
+ isReady(packageName, state) {
15
+ const dependencies = this.graph.edges.get(packageName) || new Set();
16
+ for (const dep of dependencies) {
17
+ // If any dependency is not completed, not ready
18
+ if (!state.completed.includes(dep)) {
19
+ return false;
20
+ }
21
+ // If any dependency failed, should be skipped (not ready)
22
+ if (state.failed.some(f => f.name === dep)) {
23
+ return false;
24
+ }
25
+ }
26
+ return true;
27
+ }
28
+ /**
29
+ * Get count of packages that depend on this one
30
+ * Higher count = higher priority (unlocks more packages)
31
+ */
32
+ getDependentCount(packageName) {
33
+ return (this.graph.reverseEdges.get(packageName) || new Set()).size;
34
+ }
35
+ /**
36
+ * Get depth of package in dependency tree
37
+ * Depth = longest path from a root package (package with no dependencies)
38
+ * Lower depth = higher priority (can unlock dependent packages sooner)
39
+ */
40
+ getDepth(packageName) {
41
+ const visited = new Set();
42
+ const calculateDepth = (pkg) => {
43
+ if (visited.has(pkg))
44
+ return 0;
45
+ visited.add(pkg);
46
+ const deps = this.graph.edges.get(pkg) || new Set();
47
+ if (deps.size === 0)
48
+ return 0;
49
+ return 1 + Math.max(...Array.from(deps).map(dep => calculateDepth(dep)));
50
+ };
51
+ return calculateDepth(packageName);
52
+ }
53
+ /**
54
+ * Get all dependencies for a package
55
+ */
56
+ getDependencies(packageName) {
57
+ return this.graph.edges.get(packageName) || new Set();
58
+ }
59
+ /**
60
+ * Get all dependents (packages that depend on this one)
61
+ */
62
+ getDependents(packageName) {
63
+ return this.graph.reverseEdges.get(packageName) || new Set();
64
+ }
65
+ /**
66
+ * Check if package has any dependencies
67
+ */
68
+ hasDependencies(packageName) {
69
+ const deps = this.graph.edges.get(packageName);
70
+ return deps !== undefined && deps.size > 0;
71
+ }
72
+ /**
73
+ * Check if package has any dependents
74
+ */
75
+ hasDependents(packageName) {
76
+ const dependents = this.graph.reverseEdges.get(packageName);
77
+ return dependents !== undefined && dependents.size > 0;
78
+ }
79
+ /**
80
+ * Get packages that are blocked by a failed package
81
+ */
82
+ getBlockedPackages(failedPackage, state) {
83
+ const blocked = new Set();
84
+ // Add all pending and ready packages that depend on the failed package
85
+ const allPending = [...state.pending, ...state.ready];
86
+ for (const pkg of allPending) {
87
+ const deps = this.graph.edges.get(pkg) || new Set();
88
+ if (deps.has(failedPackage)) {
89
+ blocked.add(pkg);
90
+ }
91
+ }
92
+ return blocked;
93
+ }
94
+ }
95
+ //# sourceMappingURL=DependencyChecker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyChecker.js","sourceRoot":"","sources":["../../src/execution/DependencyChecker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { TreeExecutionConfig } from '../types/config.js';
3
+ import type { DependencyGraph } from '@grunnverk/tree-core';
4
+ import type { ExecutionResult } from '../types/index.js';
5
+ export interface PoolConfig {
6
+ graph: DependencyGraph;
7
+ maxConcurrency: number;
8
+ command: string;
9
+ config: TreeExecutionConfig;
10
+ checkpointPath?: string;
11
+ continue?: boolean;
12
+ maxRetries?: number;
13
+ initialRetryDelay?: number;
14
+ maxRetryDelay?: number;
15
+ backoffMultiplier?: number;
16
+ }
17
+ /**
18
+ * DynamicTaskPool manages parallel execution of packages with dependency awareness
19
+ */
20
+ export declare class DynamicTaskPool extends EventEmitter {
21
+ private config;
22
+ private graph;
23
+ private state;
24
+ private dependencyChecker;
25
+ private resourceMonitor;
26
+ private scheduler;
27
+ private checkpointManager;
28
+ private logger;
29
+ private executionId;
30
+ private startTime;
31
+ private runningTasks;
32
+ private packageStartTimes;
33
+ private packageEndTimes;
34
+ private packageDurations;
35
+ private retryAttempts;
36
+ private publishedVersions;
37
+ constructor(config: PoolConfig);
38
+ /**
39
+ * Main execution entry point
40
+ */
41
+ execute(): Promise<ExecutionResult>;
42
+ /**
43
+ * Initialize execution state
44
+ */
45
+ private initializeState;
46
+ /**
47
+ * Schedule a package for execution
48
+ */
49
+ private schedulePackage;
50
+ /**
51
+ * Execute a single package (placeholder - will be overridden or use callback)
52
+ */
53
+ private executePackage;
54
+ /**
55
+ * Wait for next task to complete
56
+ */
57
+ private waitForNext;
58
+ /**
59
+ * Handle task completion
60
+ */
61
+ private handleTaskCompletion;
62
+ /**
63
+ * Handle successful package completion
64
+ */
65
+ private handleSuccess;
66
+ /**
67
+ * Handle package failure
68
+ */
69
+ private handleFailure;
70
+ /**
71
+ * Cascade failure to dependent packages
72
+ */
73
+ private cascadeFailure;
74
+ /**
75
+ * Update ready queue
76
+ */
77
+ private updateReadyQueue;
78
+ /**
79
+ * Check if execution is complete
80
+ */
81
+ private isComplete;
82
+ /**
83
+ * Determine if should save checkpoint
84
+ */
85
+ private shouldCheckpoint;
86
+ /**
87
+ * Save checkpoint
88
+ */
89
+ private saveCheckpoint;
90
+ /**
91
+ * Load checkpoint
92
+ */
93
+ private loadCheckpoint;
94
+ /**
95
+ * Build execution result
96
+ */
97
+ private buildExecutionResult;
98
+ /**
99
+ * Check if error is retriable
100
+ */
101
+ private isRetriableError;
102
+ /**
103
+ * Calculate retry delay with exponential backoff
104
+ */
105
+ private calculateRetryDelay;
106
+ /**
107
+ * Format duration in human-readable format
108
+ */
109
+ private formatDuration;
110
+ /**
111
+ * Extract detailed error information from error message and stack
112
+ */
113
+ private extractErrorDetails;
114
+ private extractFirstErrorLine;
115
+ private getPackagePath;
116
+ private getLogFilePath;
117
+ }
118
+ //# sourceMappingURL=DynamicTaskPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamicTaskPool.d.ts","sourceRoot":"","sources":["../../src/execution/DynamicTaskPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,KAAK,EAGR,eAAe,EAIlB,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,eAAe,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAeD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,MAAM,CAAe;IAG7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,iBAAiB,CAA0D;gBAEvE,MAAM,EAAE,UAAU;IAmB9B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAoEzC;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;YACW,eAAe;IA2C7B;;OAEG;YACW,cAAc;IAS5B;;OAEG;YACW,WAAW;IAYzB;;OAEG;YACW,oBAAoB;IAuBlC;;OAEG;YACW,aAAa;IAwB3B;;OAEG;YACW,aAAa;IAkD3B;;OAEG;YACW,cAAc;IAoB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;YACW,cAAc;IAsD5B;;OAEG;YACW,cAAc;IAwE5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmExB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwH3B,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;CAOzB"}