@orbytautomation/engine 0.1.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.
- package/README.md +0 -0
- package/dist/adapters/AdapterRegistry.d.ts +129 -0
- package/dist/adapters/AdapterRegistry.d.ts.map +1 -0
- package/dist/adapters/AdapterRegistry.js +236 -0
- package/dist/adapters/AdapterRegistry.js.map +1 -0
- package/dist/adapters/StepAdapter.d.ts +2 -0
- package/dist/adapters/StepAdapter.d.ts.map +1 -0
- package/dist/adapters/StepAdapter.js +2 -0
- package/dist/adapters/StepAdapter.js.map +1 -0
- package/dist/adapters/WorkflowAdapter.d.ts +2 -0
- package/dist/adapters/WorkflowAdapter.d.ts.map +1 -0
- package/dist/adapters/WorkflowAdapter.js +2 -0
- package/dist/adapters/WorkflowAdapter.js.map +1 -0
- package/dist/adapters/builtins/CLIAdapter.d.ts +38 -0
- package/dist/adapters/builtins/CLIAdapter.d.ts.map +1 -0
- package/dist/adapters/builtins/CLIAdapter.js +173 -0
- package/dist/adapters/builtins/CLIAdapter.js.map +1 -0
- package/dist/adapters/builtins/CLICommandResolver.d.ts +49 -0
- package/dist/adapters/builtins/CLICommandResolver.d.ts.map +1 -0
- package/dist/adapters/builtins/CLICommandResolver.js +63 -0
- package/dist/adapters/builtins/CLICommandResolver.js.map +1 -0
- package/dist/adapters/builtins/CLIResultParser.d.ts +61 -0
- package/dist/adapters/builtins/CLIResultParser.d.ts.map +1 -0
- package/dist/adapters/builtins/CLIResultParser.js +113 -0
- package/dist/adapters/builtins/CLIResultParser.js.map +1 -0
- package/dist/adapters/builtins/ConnectionManager.d.ts +106 -0
- package/dist/adapters/builtins/ConnectionManager.d.ts.map +1 -0
- package/dist/adapters/builtins/ConnectionManager.js +162 -0
- package/dist/adapters/builtins/ConnectionManager.js.map +1 -0
- package/dist/adapters/builtins/Consumer.d.ts +110 -0
- package/dist/adapters/builtins/Consumer.d.ts.map +1 -0
- package/dist/adapters/builtins/Consumer.js +113 -0
- package/dist/adapters/builtins/Consumer.js.map +1 -0
- package/dist/adapters/builtins/DBAdapter.d.ts +79 -0
- package/dist/adapters/builtins/DBAdapter.d.ts.map +1 -0
- package/dist/adapters/builtins/DBAdapter.js +259 -0
- package/dist/adapters/builtins/DBAdapter.js.map +1 -0
- package/dist/adapters/builtins/EnvResolver.d.ts +66 -0
- package/dist/adapters/builtins/EnvResolver.d.ts.map +1 -0
- package/dist/adapters/builtins/EnvResolver.js +121 -0
- package/dist/adapters/builtins/EnvResolver.js.map +1 -0
- package/dist/adapters/builtins/FSAdapter.d.ts +50 -0
- package/dist/adapters/builtins/FSAdapter.d.ts.map +1 -0
- package/dist/adapters/builtins/FSAdapter.js +282 -0
- package/dist/adapters/builtins/FSAdapter.js.map +1 -0
- package/dist/adapters/builtins/FileResolver.d.ts +50 -0
- package/dist/adapters/builtins/FileResolver.d.ts.map +1 -0
- package/dist/adapters/builtins/FileResolver.js +77 -0
- package/dist/adapters/builtins/FileResolver.js.map +1 -0
- package/dist/adapters/builtins/HTTPAdapter.d.ts +58 -0
- package/dist/adapters/builtins/HTTPAdapter.d.ts.map +1 -0
- package/dist/adapters/builtins/HTTPAdapter.js +213 -0
- package/dist/adapters/builtins/HTTPAdapter.js.map +1 -0
- package/dist/adapters/builtins/HTTPRequestBuilder.d.ts +95 -0
- package/dist/adapters/builtins/HTTPRequestBuilder.d.ts.map +1 -0
- package/dist/adapters/builtins/HTTPRequestBuilder.js +159 -0
- package/dist/adapters/builtins/HTTPRequestBuilder.js.map +1 -0
- package/dist/adapters/builtins/HTTPResponseParser.d.ts +74 -0
- package/dist/adapters/builtins/HTTPResponseParser.d.ts.map +1 -0
- package/dist/adapters/builtins/HTTPResponseParser.js +144 -0
- package/dist/adapters/builtins/HTTPResponseParser.js.map +1 -0
- package/dist/adapters/builtins/PathSecurityPolicy.d.ts +38 -0
- package/dist/adapters/builtins/PathSecurityPolicy.d.ts.map +1 -0
- package/dist/adapters/builtins/PathSecurityPolicy.js +125 -0
- package/dist/adapters/builtins/PathSecurityPolicy.js.map +1 -0
- package/dist/adapters/builtins/Producer.d.ts +99 -0
- package/dist/adapters/builtins/Producer.d.ts.map +1 -0
- package/dist/adapters/builtins/Producer.js +59 -0
- package/dist/adapters/builtins/Producer.js.map +1 -0
- package/dist/adapters/builtins/QueryExecutor.d.ts +102 -0
- package/dist/adapters/builtins/QueryExecutor.d.ts.map +1 -0
- package/dist/adapters/builtins/QueryExecutor.js +90 -0
- package/dist/adapters/builtins/QueryExecutor.js.map +1 -0
- package/dist/adapters/builtins/QueueAdapter.d.ts +72 -0
- package/dist/adapters/builtins/QueueAdapter.d.ts.map +1 -0
- package/dist/adapters/builtins/QueueAdapter.js +209 -0
- package/dist/adapters/builtins/QueueAdapter.js.map +1 -0
- package/dist/adapters/builtins/SecretProvider.d.ts +69 -0
- package/dist/adapters/builtins/SecretProvider.d.ts.map +1 -0
- package/dist/adapters/builtins/SecretProvider.js +71 -0
- package/dist/adapters/builtins/SecretProvider.js.map +1 -0
- package/dist/adapters/builtins/SecretsAdapter.d.ts +48 -0
- package/dist/adapters/builtins/SecretsAdapter.d.ts.map +1 -0
- package/dist/adapters/builtins/SecretsAdapter.js +154 -0
- package/dist/adapters/builtins/SecretsAdapter.js.map +1 -0
- package/dist/adapters/builtins/ShellAdapter.d.ts +46 -0
- package/dist/adapters/builtins/ShellAdapter.d.ts.map +1 -0
- package/dist/adapters/builtins/ShellAdapter.js +200 -0
- package/dist/adapters/builtins/ShellAdapter.js.map +1 -0
- package/dist/adapters/builtins/ShellExecutor.d.ts +72 -0
- package/dist/adapters/builtins/ShellExecutor.d.ts.map +1 -0
- package/dist/adapters/builtins/ShellExecutor.js +94 -0
- package/dist/adapters/builtins/ShellExecutor.js.map +1 -0
- package/dist/adapters/builtins/ShellSecurityPolicy.d.ts +58 -0
- package/dist/adapters/builtins/ShellSecurityPolicy.d.ts.map +1 -0
- package/dist/adapters/builtins/ShellSecurityPolicy.js +135 -0
- package/dist/adapters/builtins/ShellSecurityPolicy.js.map +1 -0
- package/dist/adapters/builtins/index.d.ts +27 -0
- package/dist/adapters/builtins/index.d.ts.map +1 -0
- package/dist/adapters/builtins/index.js +35 -0
- package/dist/adapters/builtins/index.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/automation/BackoffStrategy.d.ts +106 -0
- package/dist/automation/BackoffStrategy.d.ts.map +1 -0
- package/dist/automation/BackoffStrategy.js +168 -0
- package/dist/automation/BackoffStrategy.js.map +1 -0
- package/dist/automation/FailureStrategy.d.ts +141 -0
- package/dist/automation/FailureStrategy.d.ts.map +1 -0
- package/dist/automation/FailureStrategy.js +246 -0
- package/dist/automation/FailureStrategy.js.map +1 -0
- package/dist/automation/RetryPolicy.d.ts +132 -0
- package/dist/automation/RetryPolicy.d.ts.map +1 -0
- package/dist/automation/RetryPolicy.js +241 -0
- package/dist/automation/RetryPolicy.js.map +1 -0
- package/dist/automation/TimeoutManager.d.ts +145 -0
- package/dist/automation/TimeoutManager.d.ts.map +1 -0
- package/dist/automation/TimeoutManager.js +241 -0
- package/dist/automation/TimeoutManager.js.map +1 -0
- package/dist/automation/index.d.ts +16 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +16 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/runtime/BackoffTimer.d.ts +74 -0
- package/dist/automation/runtime/BackoffTimer.d.ts.map +1 -0
- package/dist/automation/runtime/BackoffTimer.js +139 -0
- package/dist/automation/runtime/BackoffTimer.js.map +1 -0
- package/dist/automation/runtime/FailureHandler.d.ts +138 -0
- package/dist/automation/runtime/FailureHandler.d.ts.map +1 -0
- package/dist/automation/runtime/FailureHandler.js +197 -0
- package/dist/automation/runtime/FailureHandler.js.map +1 -0
- package/dist/automation/runtime/RetryExecutor.d.ts +104 -0
- package/dist/automation/runtime/RetryExecutor.d.ts.map +1 -0
- package/dist/automation/runtime/RetryExecutor.js +173 -0
- package/dist/automation/runtime/RetryExecutor.js.map +1 -0
- package/dist/automation/runtime/index.d.ts +13 -0
- package/dist/automation/runtime/index.d.ts.map +1 -0
- package/dist/automation/runtime/index.js +13 -0
- package/dist/automation/runtime/index.js.map +1 -0
- package/dist/context/ContextStore.d.ts +185 -0
- package/dist/context/ContextStore.d.ts.map +1 -0
- package/dist/context/ContextStore.js +228 -0
- package/dist/context/ContextStore.js.map +1 -0
- package/dist/context/VariableResolver.d.ts +184 -0
- package/dist/context/VariableResolver.d.ts.map +1 -0
- package/dist/context/VariableResolver.js +368 -0
- package/dist/context/VariableResolver.js.map +1 -0
- package/dist/context/index.d.ts +17 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +17 -0
- package/dist/context/index.js.map +1 -0
- package/dist/core/EngineConfig.d.ts +156 -0
- package/dist/core/EngineConfig.d.ts.map +1 -0
- package/dist/core/EngineConfig.js +61 -0
- package/dist/core/EngineConfig.js.map +1 -0
- package/dist/core/EngineContext.d.ts +94 -0
- package/dist/core/EngineContext.d.ts.map +1 -0
- package/dist/core/EngineContext.js +29 -0
- package/dist/core/EngineContext.js.map +1 -0
- package/dist/core/OrbytEngine.d.ts +234 -0
- package/dist/core/OrbytEngine.d.ts.map +1 -0
- package/dist/core/OrbytEngine.js +421 -0
- package/dist/core/OrbytEngine.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/errors/ErrorCodes.d.ts +71 -0
- package/dist/errors/ErrorCodes.d.ts.map +1 -0
- package/dist/errors/ErrorCodes.js +95 -0
- package/dist/errors/ErrorCodes.js.map +1 -0
- package/dist/errors/ErrorFormatter.d.ts +34 -0
- package/dist/errors/ErrorFormatter.d.ts.map +1 -0
- package/dist/errors/ErrorFormatter.js +140 -0
- package/dist/errors/ErrorFormatter.js.map +1 -0
- package/dist/errors/FieldRegistry.d.ts +83 -0
- package/dist/errors/FieldRegistry.d.ts.map +1 -0
- package/dist/errors/FieldRegistry.js +217 -0
- package/dist/errors/FieldRegistry.js.map +1 -0
- package/dist/errors/OrbytError.d.ts +59 -0
- package/dist/errors/OrbytError.d.ts.map +1 -0
- package/dist/errors/OrbytError.js +78 -0
- package/dist/errors/OrbytError.js.map +1 -0
- package/dist/errors/SchedulerError.d.ts +2 -0
- package/dist/errors/SchedulerError.d.ts.map +1 -0
- package/dist/errors/SchedulerError.js +2 -0
- package/dist/errors/SchedulerError.js.map +1 -0
- package/dist/errors/StepError.d.ts +2 -0
- package/dist/errors/StepError.d.ts.map +1 -0
- package/dist/errors/StepError.js +2 -0
- package/dist/errors/StepError.js.map +1 -0
- package/dist/errors/TypoDetector.d.ts +36 -0
- package/dist/errors/TypoDetector.d.ts.map +1 -0
- package/dist/errors/TypoDetector.js +109 -0
- package/dist/errors/TypoDetector.js.map +1 -0
- package/dist/errors/WorkflowError.d.ts +54 -0
- package/dist/errors/WorkflowError.d.ts.map +1 -0
- package/dist/errors/WorkflowError.js +129 -0
- package/dist/errors/WorkflowError.js.map +1 -0
- package/dist/errors/index.d.ts +14 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +17 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/events/EngineEvents.d.ts +143 -0
- package/dist/events/EngineEvents.d.ts.map +1 -0
- package/dist/events/EngineEvents.js +60 -0
- package/dist/events/EngineEvents.js.map +1 -0
- package/dist/events/EventBus.d.ts +112 -0
- package/dist/events/EventBus.d.ts.map +1 -0
- package/dist/events/EventBus.js +177 -0
- package/dist/events/EventBus.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/execution/ExecutionEngine.d.ts +220 -0
- package/dist/execution/ExecutionEngine.d.ts.map +1 -0
- package/dist/execution/ExecutionEngine.js +442 -0
- package/dist/execution/ExecutionEngine.js.map +1 -0
- package/dist/execution/ExecutionNode.d.ts +114 -0
- package/dist/execution/ExecutionNode.d.ts.map +1 -0
- package/dist/execution/ExecutionNode.js +99 -0
- package/dist/execution/ExecutionNode.js.map +1 -0
- package/dist/execution/ExecutionPlan.d.ts +133 -0
- package/dist/execution/ExecutionPlan.d.ts.map +1 -0
- package/dist/execution/ExecutionPlan.js +207 -0
- package/dist/execution/ExecutionPlan.js.map +1 -0
- package/dist/execution/StepExecutor.d.ts +204 -0
- package/dist/execution/StepExecutor.d.ts.map +1 -0
- package/dist/execution/StepExecutor.js +604 -0
- package/dist/execution/StepExecutor.js.map +1 -0
- package/dist/execution/WorkflowExecutor.d.ts +129 -0
- package/dist/execution/WorkflowExecutor.d.ts.map +1 -0
- package/dist/execution/WorkflowExecutor.js +347 -0
- package/dist/execution/WorkflowExecutor.js.map +1 -0
- package/dist/execution/drivers/AdapterDriver.d.ts +34 -0
- package/dist/execution/drivers/AdapterDriver.d.ts.map +1 -0
- package/dist/execution/drivers/AdapterDriver.js +63 -0
- package/dist/execution/drivers/AdapterDriver.js.map +1 -0
- package/dist/execution/drivers/DriverResolver.d.ts +91 -0
- package/dist/execution/drivers/DriverResolver.d.ts.map +1 -0
- package/dist/execution/drivers/DriverResolver.js +172 -0
- package/dist/execution/drivers/DriverResolver.js.map +1 -0
- package/dist/execution/drivers/ExecutionDriver.d.ts +127 -0
- package/dist/execution/drivers/ExecutionDriver.d.ts.map +1 -0
- package/dist/execution/drivers/ExecutionDriver.js +50 -0
- package/dist/execution/drivers/ExecutionDriver.js.map +1 -0
- package/dist/execution/drivers/index.d.ts +11 -0
- package/dist/execution/drivers/index.d.ts.map +1 -0
- package/dist/execution/drivers/index.js +11 -0
- package/dist/execution/drivers/index.js.map +1 -0
- package/dist/execution/index.d.ts +18 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +19 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/graph/CycleDetector.d.ts +90 -0
- package/dist/graph/CycleDetector.d.ts.map +1 -0
- package/dist/graph/CycleDetector.js +210 -0
- package/dist/graph/CycleDetector.js.map +1 -0
- package/dist/graph/DependencyGraph.d.ts +16 -0
- package/dist/graph/DependencyGraph.d.ts.map +1 -0
- package/dist/graph/DependencyGraph.js +16 -0
- package/dist/graph/DependencyGraph.js.map +1 -0
- package/dist/graph/DependencyResolver.d.ts +90 -0
- package/dist/graph/DependencyResolver.d.ts.map +1 -0
- package/dist/graph/DependencyResolver.js +159 -0
- package/dist/graph/DependencyResolver.js.map +1 -0
- package/dist/graph/TopologicalSorter.d.ts +104 -0
- package/dist/graph/TopologicalSorter.d.ts.map +1 -0
- package/dist/graph/TopologicalSorter.js +213 -0
- package/dist/graph/TopologicalSorter.js.map +1 -0
- package/dist/graph/index.d.ts +15 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +15 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/guards/ResourceGuard.d.ts +90 -0
- package/dist/guards/ResourceGuard.d.ts.map +1 -0
- package/dist/guards/ResourceGuard.js +177 -0
- package/dist/guards/ResourceGuard.js.map +1 -0
- package/dist/guards/StepGuard.d.ts +96 -0
- package/dist/guards/StepGuard.d.ts.map +1 -0
- package/dist/guards/StepGuard.js +184 -0
- package/dist/guards/StepGuard.js.map +1 -0
- package/dist/guards/WorkflowGuard.d.ts +71 -0
- package/dist/guards/WorkflowGuard.d.ts.map +1 -0
- package/dist/guards/WorkflowGuard.js +187 -0
- package/dist/guards/WorkflowGuard.js.map +1 -0
- package/dist/guards/index.d.ts +9 -0
- package/dist/guards/index.d.ts.map +1 -0
- package/dist/guards/index.js +9 -0
- package/dist/guards/index.js.map +1 -0
- package/dist/hooks/HookManager.d.ts +114 -0
- package/dist/hooks/HookManager.d.ts.map +1 -0
- package/dist/hooks/HookManager.js +187 -0
- package/dist/hooks/HookManager.js.map +1 -0
- package/dist/hooks/LifecycleHooks.d.ts +126 -0
- package/dist/hooks/LifecycleHooks.d.ts.map +1 -0
- package/dist/hooks/LifecycleHooks.js +23 -0
- package/dist/hooks/LifecycleHooks.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/EngineLifecycle.d.ts +121 -0
- package/dist/lifecycle/EngineLifecycle.d.ts.map +1 -0
- package/dist/lifecycle/EngineLifecycle.js +209 -0
- package/dist/lifecycle/EngineLifecycle.js.map +1 -0
- package/dist/lifecycle/ShutdownManager.d.ts +44 -0
- package/dist/lifecycle/ShutdownManager.d.ts.map +1 -0
- package/dist/lifecycle/ShutdownManager.js +105 -0
- package/dist/lifecycle/ShutdownManager.js.map +1 -0
- package/dist/lifecycle/StartupManager.d.ts +45 -0
- package/dist/lifecycle/StartupManager.d.ts.map +1 -0
- package/dist/lifecycle/StartupManager.js +97 -0
- package/dist/lifecycle/StartupManager.js.map +1 -0
- package/dist/lifecycle/index.d.ts +9 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +9 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/logging/LogLevel.d.ts +2 -0
- package/dist/logging/LogLevel.d.ts.map +1 -0
- package/dist/logging/LogLevel.js +2 -0
- package/dist/logging/LogLevel.js.map +1 -0
- package/dist/logging/Logger.d.ts +2 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +2 -0
- package/dist/logging/Logger.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +4 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/marketplace/PluginInstaller.d.ts +81 -0
- package/dist/marketplace/PluginInstaller.d.ts.map +1 -0
- package/dist/marketplace/PluginInstaller.js +89 -0
- package/dist/marketplace/PluginInstaller.js.map +1 -0
- package/dist/marketplace/PluginManifest.d.ts +74 -0
- package/dist/marketplace/PluginManifest.d.ts.map +1 -0
- package/dist/marketplace/PluginManifest.js +67 -0
- package/dist/marketplace/PluginManifest.js.map +1 -0
- package/dist/marketplace/PluginVerifier.d.ts +58 -0
- package/dist/marketplace/PluginVerifier.d.ts.map +1 -0
- package/dist/marketplace/PluginVerifier.js +93 -0
- package/dist/marketplace/PluginVerifier.js.map +1 -0
- package/dist/marketplace/index.d.ts +11 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +11 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/metrics/MetricsCollector.d.ts +2 -0
- package/dist/metrics/MetricsCollector.d.ts.map +1 -0
- package/dist/metrics/MetricsCollector.js +2 -0
- package/dist/metrics/MetricsCollector.js.map +1 -0
- package/dist/metrics/PerformanceTracker.d.ts +2 -0
- package/dist/metrics/PerformanceTracker.d.ts.map +1 -0
- package/dist/metrics/PerformanceTracker.js +2 -0
- package/dist/metrics/PerformanceTracker.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +4 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/parser/SchemaValidator.d.ts +63 -0
- package/dist/parser/SchemaValidator.d.ts.map +1 -0
- package/dist/parser/SchemaValidator.js +212 -0
- package/dist/parser/SchemaValidator.js.map +1 -0
- package/dist/parser/StepParser.d.ts +124 -0
- package/dist/parser/StepParser.d.ts.map +1 -0
- package/dist/parser/StepParser.js +330 -0
- package/dist/parser/StepParser.js.map +1 -0
- package/dist/parser/WorkflowParser.d.ts +124 -0
- package/dist/parser/WorkflowParser.d.ts.map +1 -0
- package/dist/parser/WorkflowParser.js +141 -0
- package/dist/parser/WorkflowParser.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +4 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/queue/InMemoryQueue.d.ts +97 -0
- package/dist/queue/InMemoryQueue.d.ts.map +1 -0
- package/dist/queue/InMemoryQueue.js +268 -0
- package/dist/queue/InMemoryQueue.js.map +1 -0
- package/dist/queue/JobQueue.d.ts +214 -0
- package/dist/queue/JobQueue.d.ts.map +1 -0
- package/dist/queue/JobQueue.js +46 -0
- package/dist/queue/JobQueue.js.map +1 -0
- package/dist/queue/index.d.ts +10 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +10 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/resolution/ActionRegistry.d.ts +2 -0
- package/dist/resolution/ActionRegistry.d.ts.map +1 -0
- package/dist/resolution/ActionRegistry.js +2 -0
- package/dist/resolution/ActionRegistry.js.map +1 -0
- package/dist/resolution/AdapterResolver.d.ts +2 -0
- package/dist/resolution/AdapterResolver.d.ts.map +1 -0
- package/dist/resolution/AdapterResolver.js +2 -0
- package/dist/resolution/AdapterResolver.js.map +1 -0
- package/dist/resolution/StepResolver.d.ts +2 -0
- package/dist/resolution/StepResolver.d.ts.map +1 -0
- package/dist/resolution/StepResolver.js +2 -0
- package/dist/resolution/StepResolver.js.map +1 -0
- package/dist/resolution/index.d.ts +2 -0
- package/dist/resolution/index.d.ts.map +1 -0
- package/dist/resolution/index.js +2 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/scheduling/CronScheduler.d.ts +143 -0
- package/dist/scheduling/CronScheduler.d.ts.map +1 -0
- package/dist/scheduling/CronScheduler.js +370 -0
- package/dist/scheduling/CronScheduler.js.map +1 -0
- package/dist/scheduling/JobScheduler.d.ts +82 -0
- package/dist/scheduling/JobScheduler.d.ts.map +1 -0
- package/dist/scheduling/JobScheduler.js +231 -0
- package/dist/scheduling/JobScheduler.js.map +1 -0
- package/dist/scheduling/ScheduleParser.d.ts +117 -0
- package/dist/scheduling/ScheduleParser.d.ts.map +1 -0
- package/dist/scheduling/ScheduleParser.js +257 -0
- package/dist/scheduling/ScheduleParser.js.map +1 -0
- package/dist/scheduling/ScheduleTypes.d.ts +153 -0
- package/dist/scheduling/ScheduleTypes.d.ts.map +1 -0
- package/dist/scheduling/ScheduleTypes.js +81 -0
- package/dist/scheduling/ScheduleTypes.js.map +1 -0
- package/dist/scheduling/Scheduler.d.ts +154 -0
- package/dist/scheduling/Scheduler.d.ts.map +1 -0
- package/dist/scheduling/Scheduler.js +304 -0
- package/dist/scheduling/Scheduler.js.map +1 -0
- package/dist/scheduling/index.d.ts +6 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +6 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/security/PermissionPolicy.d.ts +72 -0
- package/dist/security/PermissionPolicy.d.ts.map +1 -0
- package/dist/security/PermissionPolicy.js +87 -0
- package/dist/security/PermissionPolicy.js.map +1 -0
- package/dist/security/SandboxManager.d.ts +72 -0
- package/dist/security/SandboxManager.d.ts.map +1 -0
- package/dist/security/SandboxManager.js +78 -0
- package/dist/security/SandboxManager.js.map +1 -0
- package/dist/security/index.d.ts +10 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +10 -0
- package/dist/security/index.js.map +1 -0
- package/dist/state/ExecutionState.d.ts +211 -0
- package/dist/state/ExecutionState.d.ts.map +1 -0
- package/dist/state/ExecutionState.js +256 -0
- package/dist/state/ExecutionState.js.map +1 -0
- package/dist/state/StateMachine.d.ts +120 -0
- package/dist/state/StateMachine.d.ts.map +1 -0
- package/dist/state/StateMachine.js +230 -0
- package/dist/state/StateMachine.js.map +1 -0
- package/dist/state/index.d.ts +16 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +16 -0
- package/dist/state/index.js.map +1 -0
- package/dist/storage/ExecutionStore.d.ts +2 -0
- package/dist/storage/ExecutionStore.d.ts.map +1 -0
- package/dist/storage/ExecutionStore.js +2 -0
- package/dist/storage/ExecutionStore.js.map +1 -0
- package/dist/storage/ScheduleStore.d.ts +2 -0
- package/dist/storage/ScheduleStore.d.ts.map +1 -0
- package/dist/storage/ScheduleStore.js +2 -0
- package/dist/storage/ScheduleStore.js.map +1 -0
- package/dist/storage/WorkflowStore.d.ts +2 -0
- package/dist/storage/WorkflowStore.d.ts.map +1 -0
- package/dist/storage/WorkflowStore.js +2 -0
- package/dist/storage/WorkflowStore.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/testing/EngineTestHarness.d.ts +117 -0
- package/dist/testing/EngineTestHarness.d.ts.map +1 -0
- package/dist/testing/EngineTestHarness.js +132 -0
- package/dist/testing/EngineTestHarness.js.map +1 -0
- package/dist/testing/MockAdapter.d.ts +93 -0
- package/dist/testing/MockAdapter.d.ts.map +1 -0
- package/dist/testing/MockAdapter.js +124 -0
- package/dist/testing/MockAdapter.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/triggers/CronTrigger.d.ts +2 -0
- package/dist/triggers/CronTrigger.d.ts.map +1 -0
- package/dist/triggers/CronTrigger.js +2 -0
- package/dist/triggers/CronTrigger.js.map +1 -0
- package/dist/triggers/EventTrigger.d.ts +2 -0
- package/dist/triggers/EventTrigger.d.ts.map +1 -0
- package/dist/triggers/EventTrigger.js +2 -0
- package/dist/triggers/EventTrigger.js.map +1 -0
- package/dist/triggers/ManualTrigger.d.ts +2 -0
- package/dist/triggers/ManualTrigger.d.ts.map +1 -0
- package/dist/triggers/ManualTrigger.js +2 -0
- package/dist/triggers/ManualTrigger.js.map +1 -0
- package/dist/triggers/Trigger.d.ts +2 -0
- package/dist/triggers/Trigger.d.ts.map +1 -0
- package/dist/triggers/Trigger.js +2 -0
- package/dist/triggers/Trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +2 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +6 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/sources/FileWatcherTrigger.d.ts +2 -0
- package/dist/triggers/sources/FileWatcherTrigger.d.ts.map +1 -0
- package/dist/triggers/sources/FileWatcherTrigger.js +2 -0
- package/dist/triggers/sources/FileWatcherTrigger.js.map +1 -0
- package/dist/triggers/sources/MessageTrigger.d.ts +2 -0
- package/dist/triggers/sources/MessageTrigger.d.ts.map +1 -0
- package/dist/triggers/sources/MessageTrigger.js +2 -0
- package/dist/triggers/sources/MessageTrigger.js.map +1 -0
- package/dist/triggers/sources/WebhookListener.d.ts +2 -0
- package/dist/triggers/sources/WebhookListener.d.ts.map +1 -0
- package/dist/triggers/sources/WebhookListener.js +2 -0
- package/dist/triggers/sources/WebhookListener.js.map +1 -0
- package/dist/triggers/sources/index.d.ts +2 -0
- package/dist/triggers/sources/index.d.ts.map +1 -0
- package/dist/triggers/sources/index.js +2 -0
- package/dist/triggers/sources/index.js.map +1 -0
- package/dist/utils/deepMerge.d.ts +2 -0
- package/dist/utils/deepMerge.d.ts.map +1 -0
- package/dist/utils/deepMerge.js +2 -0
- package/dist/utils/deepMerge.js.map +1 -0
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +2 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/safeExec.d.ts +2 -0
- package/dist/utils/safeExec.d.ts.map +1 -0
- package/dist/utils/safeExec.js +2 -0
- package/dist/utils/safeExec.js.map +1 -0
- package/dist/utils/time.d.ts +2 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +2 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/visualization/ExecutionGraphBuilder.d.ts +2 -0
- package/dist/visualization/ExecutionGraphBuilder.d.ts.map +1 -0
- package/dist/visualization/ExecutionGraphBuilder.js +2 -0
- package/dist/visualization/ExecutionGraphBuilder.js.map +1 -0
- package/dist/visualization/ExecutionTraceFormatter.d.ts +2 -0
- package/dist/visualization/ExecutionTraceFormatter.d.ts.map +1 -0
- package/dist/visualization/ExecutionTraceFormatter.js +2 -0
- package/dist/visualization/ExecutionTraceFormatter.js.map +1 -0
- package/dist/visualization/index.d.ts +2 -0
- package/dist/visualization/index.d.ts.map +1 -0
- package/dist/visualization/index.js +2 -0
- package/dist/visualization/index.js.map +1 -0
- package/dist/workflow/Step.d.ts +2 -0
- package/dist/workflow/Step.d.ts.map +1 -0
- package/dist/workflow/Step.js +2 -0
- package/dist/workflow/Step.js.map +1 -0
- package/dist/workflow/StepContext.d.ts +2 -0
- package/dist/workflow/StepContext.d.ts.map +1 -0
- package/dist/workflow/StepContext.js +2 -0
- package/dist/workflow/StepContext.js.map +1 -0
- package/dist/workflow/StepResult.d.ts +2 -0
- package/dist/workflow/StepResult.d.ts.map +1 -0
- package/dist/workflow/StepResult.js +2 -0
- package/dist/workflow/StepResult.js.map +1 -0
- package/dist/workflow/Workflow.d.ts +2 -0
- package/dist/workflow/Workflow.d.ts.map +1 -0
- package/dist/workflow/Workflow.js +2 -0
- package/dist/workflow/Workflow.js.map +1 -0
- package/dist/workflow/WorkflowRegistry.d.ts +2 -0
- package/dist/workflow/WorkflowRegistry.d.ts.map +1 -0
- package/dist/workflow/WorkflowRegistry.js +2 -0
- package/dist/workflow/WorkflowRegistry.js.map +1 -0
- package/dist/workflow/WorkflowState.d.ts +2 -0
- package/dist/workflow/WorkflowState.d.ts.map +1 -0
- package/dist/workflow/WorkflowState.js +2 -0
- package/dist/workflow/WorkflowState.js.map +1 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CycleDetector
|
|
3
|
+
*
|
|
4
|
+
* Detects cycles in the dependency graph using Depth-First Search (DFS).
|
|
5
|
+
* This is about VALIDATION - fail fast with clear error messages.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Detect circular dependencies before execution
|
|
9
|
+
* - Provide clear error messages showing the cycle path
|
|
10
|
+
* - Fail fast - prevent impossible execution plans
|
|
11
|
+
*
|
|
12
|
+
* Algorithm: DFS with three-color marking
|
|
13
|
+
* - WHITE (unvisited): Node not yet explored
|
|
14
|
+
* - GRAY (visiting): Node currently in DFS path (on stack)
|
|
15
|
+
* - BLACK (visited): Node fully explored, all descendants visited
|
|
16
|
+
*
|
|
17
|
+
* A cycle exists if we encounter a GRAY node during traversal.
|
|
18
|
+
*
|
|
19
|
+
* What it does NOT do:
|
|
20
|
+
* - Does NOT order the graph (that's TopologicalSort's job)
|
|
21
|
+
* - Does NOT execute anything (that's StepExecutor's job)
|
|
22
|
+
* - Does NOT schedule steps (that's WorkflowExecutor's job)
|
|
23
|
+
*/
|
|
24
|
+
import { WorkflowValidationError } from '@dev-ecosystem/core';
|
|
25
|
+
/**
|
|
26
|
+
* Node visit state for DFS traversal
|
|
27
|
+
*/
|
|
28
|
+
var VisitState;
|
|
29
|
+
(function (VisitState) {
|
|
30
|
+
/** Not yet visited */
|
|
31
|
+
VisitState["WHITE"] = "white";
|
|
32
|
+
/** Currently being visited (in DFS stack) */
|
|
33
|
+
VisitState["GRAY"] = "gray";
|
|
34
|
+
/** Fully visited, all descendants explored */
|
|
35
|
+
VisitState["BLACK"] = "black";
|
|
36
|
+
})(VisitState || (VisitState = {}));
|
|
37
|
+
/**
|
|
38
|
+
* Detects cycles in dependency graphs.
|
|
39
|
+
* Pure function - takes graph, returns cycle information.
|
|
40
|
+
*/
|
|
41
|
+
export class CycleDetector {
|
|
42
|
+
/**
|
|
43
|
+
* Check if the graph contains a cycle.
|
|
44
|
+
* Uses DFS with three-color marking.
|
|
45
|
+
*
|
|
46
|
+
* @param graph - The dependency graph to check
|
|
47
|
+
* @returns Cycle detection result
|
|
48
|
+
*/
|
|
49
|
+
static detect(graph) {
|
|
50
|
+
const visitState = new Map();
|
|
51
|
+
const parent = new Map();
|
|
52
|
+
// Initialize all nodes as unvisited
|
|
53
|
+
for (const stepId of graph.nodes.keys()) {
|
|
54
|
+
visitState.set(stepId, VisitState.WHITE);
|
|
55
|
+
}
|
|
56
|
+
// Try DFS from each unvisited node
|
|
57
|
+
for (const stepId of graph.nodes.keys()) {
|
|
58
|
+
if (visitState.get(stepId) === VisitState.WHITE) {
|
|
59
|
+
const result = this.dfs(stepId, graph, visitState, parent);
|
|
60
|
+
if (result.hasCycle) {
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { hasCycle: false };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Depth-first search to detect cycles.
|
|
69
|
+
*
|
|
70
|
+
* @param nodeId - Current node being visited
|
|
71
|
+
* @param graph - The dependency graph
|
|
72
|
+
* @param visitState - Visit state for each node
|
|
73
|
+
* @param parent - Parent pointers for cycle reconstruction
|
|
74
|
+
* @returns Cycle detection result
|
|
75
|
+
*/
|
|
76
|
+
static dfs(nodeId, graph, visitState, parent) {
|
|
77
|
+
// Mark current node as being visited (GRAY)
|
|
78
|
+
visitState.set(nodeId, VisitState.GRAY);
|
|
79
|
+
// Visit all dependencies (outgoing edges)
|
|
80
|
+
const dependencies = graph.adjacencyList.get(nodeId) || [];
|
|
81
|
+
for (const dependency of dependencies) {
|
|
82
|
+
const state = visitState.get(dependency);
|
|
83
|
+
if (state === VisitState.GRAY) {
|
|
84
|
+
// Found a cycle! Reconstruct the cycle path
|
|
85
|
+
const cyclePath = this.reconstructCycle(nodeId, dependency, parent);
|
|
86
|
+
return {
|
|
87
|
+
hasCycle: true,
|
|
88
|
+
cyclePath: Object.freeze([...cyclePath, dependency]), // Complete the cycle
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (state === VisitState.WHITE) {
|
|
92
|
+
// Unvisited node, explore it
|
|
93
|
+
parent.set(dependency, nodeId);
|
|
94
|
+
const result = this.dfs(dependency, graph, visitState, parent);
|
|
95
|
+
if (result.hasCycle) {
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// BLACK nodes are already fully explored, skip them
|
|
100
|
+
}
|
|
101
|
+
// All descendants explored, mark as fully visited (BLACK)
|
|
102
|
+
visitState.set(nodeId, VisitState.BLACK);
|
|
103
|
+
return { hasCycle: false };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Reconstruct the cycle path from parent pointers.
|
|
107
|
+
*
|
|
108
|
+
* @param start - Node where cycle was detected
|
|
109
|
+
* @param cycleNode - The GRAY node that created the cycle
|
|
110
|
+
* @param parent - Parent pointers
|
|
111
|
+
* @returns The cycle path
|
|
112
|
+
*/
|
|
113
|
+
static reconstructCycle(start, cycleNode, parent) {
|
|
114
|
+
const cycle = [start];
|
|
115
|
+
let current = start;
|
|
116
|
+
// Walk back through parents until we reach the cycle node
|
|
117
|
+
while (current !== cycleNode) {
|
|
118
|
+
const parentNode = parent.get(current);
|
|
119
|
+
if (!parentNode) {
|
|
120
|
+
// This shouldn't happen in valid DFS, but handle it gracefully
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
cycle.unshift(parentNode);
|
|
124
|
+
current = parentNode;
|
|
125
|
+
}
|
|
126
|
+
return cycle;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check for cycles and throw if found (convenience method).
|
|
130
|
+
* This is the "fail fast" version.
|
|
131
|
+
*
|
|
132
|
+
* @param graph - The dependency graph to check
|
|
133
|
+
* @throws WorkflowValidationError if a cycle is detected
|
|
134
|
+
*/
|
|
135
|
+
static detectAndThrow(graph) {
|
|
136
|
+
const result = this.detect(graph);
|
|
137
|
+
if (result.hasCycle && result.cyclePath) {
|
|
138
|
+
const cycleStr = result.cyclePath.join(' → ');
|
|
139
|
+
throw new WorkflowValidationError(`Circular dependency detected: ${cycleStr}`, {
|
|
140
|
+
cyclePath: result.cyclePath,
|
|
141
|
+
hint: 'Check the "needs" fields in your workflow. Steps cannot depend on each other in a cycle.',
|
|
142
|
+
affectedSteps: result.cyclePath,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Find all strongly connected components (SCCs) in the graph.
|
|
148
|
+
* This is more advanced than simple cycle detection - it finds
|
|
149
|
+
* all groups of nodes that form cycles with each other.
|
|
150
|
+
*
|
|
151
|
+
* Uses Tarjan's algorithm.
|
|
152
|
+
*
|
|
153
|
+
* @param graph - The dependency graph
|
|
154
|
+
* @returns Array of strongly connected components (each is an array of step IDs)
|
|
155
|
+
*/
|
|
156
|
+
static findStronglyConnectedComponents(graph) {
|
|
157
|
+
const index = new Map();
|
|
158
|
+
const lowLink = new Map();
|
|
159
|
+
const onStack = new Map();
|
|
160
|
+
const stack = [];
|
|
161
|
+
const sccs = [];
|
|
162
|
+
let currentIndex = 0;
|
|
163
|
+
for (const nodeId of graph.nodes.keys()) {
|
|
164
|
+
if (!index.has(nodeId)) {
|
|
165
|
+
this.strongConnect(nodeId, graph, index, lowLink, onStack, stack, sccs, currentIndex);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return sccs;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Tarjan's SCC algorithm helper
|
|
172
|
+
*/
|
|
173
|
+
static strongConnect(nodeId, graph, index, lowLink, onStack, stack, sccs, currentIndex) {
|
|
174
|
+
// Set depth index and low link
|
|
175
|
+
index.set(nodeId, currentIndex);
|
|
176
|
+
lowLink.set(nodeId, currentIndex);
|
|
177
|
+
currentIndex++;
|
|
178
|
+
stack.push(nodeId);
|
|
179
|
+
onStack.set(nodeId, true);
|
|
180
|
+
// Visit all dependencies
|
|
181
|
+
const dependencies = graph.adjacencyList.get(nodeId) || [];
|
|
182
|
+
for (const dependency of dependencies) {
|
|
183
|
+
if (!index.has(dependency)) {
|
|
184
|
+
// Successor has not been visited; recurse
|
|
185
|
+
currentIndex = this.strongConnect(dependency, graph, index, lowLink, onStack, stack, sccs, currentIndex);
|
|
186
|
+
lowLink.set(nodeId, Math.min(lowLink.get(nodeId), lowLink.get(dependency)));
|
|
187
|
+
}
|
|
188
|
+
else if (onStack.get(dependency)) {
|
|
189
|
+
// Successor is on the stack, hence in current SCC
|
|
190
|
+
lowLink.set(nodeId, Math.min(lowLink.get(nodeId), index.get(dependency)));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// If nodeId is a root node, pop the stack and output SCC
|
|
194
|
+
if (lowLink.get(nodeId) === index.get(nodeId)) {
|
|
195
|
+
const scc = [];
|
|
196
|
+
let w;
|
|
197
|
+
do {
|
|
198
|
+
w = stack.pop();
|
|
199
|
+
onStack.set(w, false);
|
|
200
|
+
scc.push(w);
|
|
201
|
+
} while (w !== nodeId);
|
|
202
|
+
// Only add SCCs with more than one node (actual cycles)
|
|
203
|
+
if (scc.length > 1) {
|
|
204
|
+
sccs.push(scc);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return currentIndex;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=CycleDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CycleDetector.js","sourceRoot":"","sources":["../../src/graph/CycleDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph
|
|
3
|
+
*
|
|
4
|
+
* Central exports for graph analysis utilities.
|
|
5
|
+
* These tools work together to validate and plan workflow execution.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. DependencyResolver - Build graph from workflow steps
|
|
9
|
+
* 2. CycleDetector - Validate no circular dependencies
|
|
10
|
+
* 3. TopologicalSorter - Generate execution phases
|
|
11
|
+
* 4. ExecutionPlan - Coordinate above to create execution plan
|
|
12
|
+
*/
|
|
13
|
+
export { DependencyResolver, type DependencyGraph, type DependencyEdge } from './DependencyResolver.js';
|
|
14
|
+
export { CycleDetector, type CycleDetectionResult } from './CycleDetector.js';
|
|
15
|
+
export { TopologicalSorter, type TopologicalSortResult, type CriticalPathResult, } from './TopologicalSorter.js';
|
|
16
|
+
//# sourceMappingURL=DependencyGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyGraph.d.ts","sourceRoot":"","sources":["../../src/graph/DependencyGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,GACxB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph
|
|
3
|
+
*
|
|
4
|
+
* Central exports for graph analysis utilities.
|
|
5
|
+
* These tools work together to validate and plan workflow execution.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. DependencyResolver - Build graph from workflow steps
|
|
9
|
+
* 2. CycleDetector - Validate no circular dependencies
|
|
10
|
+
* 3. TopologicalSorter - Generate execution phases
|
|
11
|
+
* 4. ExecutionPlan - Coordinate above to create execution plan
|
|
12
|
+
*/
|
|
13
|
+
export { DependencyResolver } from './DependencyResolver.js';
|
|
14
|
+
export { CycleDetector } from './CycleDetector.js';
|
|
15
|
+
export { TopologicalSorter, } from './TopologicalSorter.js';
|
|
16
|
+
//# sourceMappingURL=DependencyGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyGraph.js","sourceRoot":"","sources":["../../src/graph/DependencyGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,kBAAkB,EAA6C,MAAM,yBAAyB,CAAC;AACxG,OAAO,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EACL,iBAAiB,GAGlB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DependencyResolver
|
|
3
|
+
*
|
|
4
|
+
* Builds the dependency graph from workflow steps.
|
|
5
|
+
* This is pure analysis - NO execution, NO ordering, NO retries.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* 1. Read the `needs` field from each step
|
|
9
|
+
* 2. Build edges between steps (stepId → dependencies)
|
|
10
|
+
* 3. Detect missing step references (fail fast)
|
|
11
|
+
* 4. Validate that all dependencies exist
|
|
12
|
+
*
|
|
13
|
+
* What it does NOT do:
|
|
14
|
+
* - Does NOT check for cycles (that's CycleDetector's job)
|
|
15
|
+
* - Does NOT order steps (that's TopologicalSort's job)
|
|
16
|
+
* - Does NOT execute anything (that's StepExecutor's job)
|
|
17
|
+
* - Does NOT manage state (that's ExecutionState's job)
|
|
18
|
+
*
|
|
19
|
+
* This is about correctness, not scheduling.
|
|
20
|
+
*/
|
|
21
|
+
import { ExecutionNode } from '../execution/ExecutionNode.js';
|
|
22
|
+
/**
|
|
23
|
+
* Represents a directed edge in the dependency graph
|
|
24
|
+
*/
|
|
25
|
+
export interface DependencyEdge {
|
|
26
|
+
/** The step that depends on another */
|
|
27
|
+
readonly from: string;
|
|
28
|
+
/** The step that must complete first */
|
|
29
|
+
readonly to: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The complete dependency graph structure
|
|
33
|
+
*/
|
|
34
|
+
export interface DependencyGraph {
|
|
35
|
+
/** All execution nodes indexed by stepId */
|
|
36
|
+
readonly nodes: ReadonlyMap<string, ExecutionNode>;
|
|
37
|
+
/** All dependency edges */
|
|
38
|
+
readonly edges: readonly DependencyEdge[];
|
|
39
|
+
/** Adjacency list: stepId → list of dependencies */
|
|
40
|
+
readonly adjacencyList: ReadonlyMap<string, readonly string[]>;
|
|
41
|
+
/** Reverse adjacency list: stepId → list of dependents */
|
|
42
|
+
readonly reverseDependencies: ReadonlyMap<string, readonly string[]>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolves dependencies between workflow steps.
|
|
46
|
+
* Pure function - takes nodes, returns validated graph.
|
|
47
|
+
*/
|
|
48
|
+
export declare class DependencyResolver {
|
|
49
|
+
/**
|
|
50
|
+
* Build the dependency graph from execution nodes.
|
|
51
|
+
* Validates that all dependencies exist and builds edge list.
|
|
52
|
+
*
|
|
53
|
+
* @param nodes - Array of execution nodes from workflow
|
|
54
|
+
* @returns Validated dependency graph
|
|
55
|
+
* @throws WorkflowValidationError if dependencies are invalid
|
|
56
|
+
*/
|
|
57
|
+
static resolve(nodes: ExecutionNode[]): DependencyGraph;
|
|
58
|
+
/**
|
|
59
|
+
* Get all steps that have no dependencies (entry points).
|
|
60
|
+
* These can be executed immediately.
|
|
61
|
+
*
|
|
62
|
+
* @param graph - The dependency graph
|
|
63
|
+
* @returns Array of step IDs with no dependencies
|
|
64
|
+
*/
|
|
65
|
+
static getEntryPoints(graph: DependencyGraph): string[];
|
|
66
|
+
/**
|
|
67
|
+
* Get all steps that have no dependents (exit points).
|
|
68
|
+
* These are the final steps in the workflow.
|
|
69
|
+
*
|
|
70
|
+
* @param graph - The dependency graph
|
|
71
|
+
* @returns Array of step IDs with no dependents
|
|
72
|
+
*/
|
|
73
|
+
static getExitPoints(graph: DependencyGraph): string[];
|
|
74
|
+
/**
|
|
75
|
+
* Calculate the in-degree for each node (number of dependencies).
|
|
76
|
+
* Useful for topological sorting algorithms like Kahn's.
|
|
77
|
+
*
|
|
78
|
+
* @param graph - The dependency graph
|
|
79
|
+
* @returns Map of stepId → in-degree
|
|
80
|
+
*/
|
|
81
|
+
static calculateInDegrees(graph: DependencyGraph): Map<string, number>;
|
|
82
|
+
/**
|
|
83
|
+
* Calculate the out-degree for each node (number of dependents).
|
|
84
|
+
*
|
|
85
|
+
* @param graph - The dependency graph
|
|
86
|
+
* @returns Map of stepId → out-degree
|
|
87
|
+
*/
|
|
88
|
+
static calculateOutDegrees(graph: DependencyGraph): Map<string, number>;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=DependencyResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyResolver.d.ts","sourceRoot":"","sources":["../../src/graph/DependencyResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnD,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC/D,0DAA0D;IAC1D,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;CACtE;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,eAAe;IAoFvD;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE;IAYvD;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE;IAYtD;;;;;;OAMG;IACH,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAUtE;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CASxE"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DependencyResolver
|
|
3
|
+
*
|
|
4
|
+
* Builds the dependency graph from workflow steps.
|
|
5
|
+
* This is pure analysis - NO execution, NO ordering, NO retries.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* 1. Read the `needs` field from each step
|
|
9
|
+
* 2. Build edges between steps (stepId → dependencies)
|
|
10
|
+
* 3. Detect missing step references (fail fast)
|
|
11
|
+
* 4. Validate that all dependencies exist
|
|
12
|
+
*
|
|
13
|
+
* What it does NOT do:
|
|
14
|
+
* - Does NOT check for cycles (that's CycleDetector's job)
|
|
15
|
+
* - Does NOT order steps (that's TopologicalSort's job)
|
|
16
|
+
* - Does NOT execute anything (that's StepExecutor's job)
|
|
17
|
+
* - Does NOT manage state (that's ExecutionState's job)
|
|
18
|
+
*
|
|
19
|
+
* This is about correctness, not scheduling.
|
|
20
|
+
*/
|
|
21
|
+
import { WorkflowValidationError } from '@dev-ecosystem/core';
|
|
22
|
+
/**
|
|
23
|
+
* Resolves dependencies between workflow steps.
|
|
24
|
+
* Pure function - takes nodes, returns validated graph.
|
|
25
|
+
*/
|
|
26
|
+
export class DependencyResolver {
|
|
27
|
+
/**
|
|
28
|
+
* Build the dependency graph from execution nodes.
|
|
29
|
+
* Validates that all dependencies exist and builds edge list.
|
|
30
|
+
*
|
|
31
|
+
* @param nodes - Array of execution nodes from workflow
|
|
32
|
+
* @returns Validated dependency graph
|
|
33
|
+
* @throws WorkflowValidationError if dependencies are invalid
|
|
34
|
+
*/
|
|
35
|
+
static resolve(nodes) {
|
|
36
|
+
// Step 1: Build node map for quick lookup
|
|
37
|
+
const nodeMap = new Map();
|
|
38
|
+
for (const node of nodes) {
|
|
39
|
+
if (nodeMap.has(node.stepId)) {
|
|
40
|
+
throw new WorkflowValidationError(`Duplicate step ID found: ${node.stepId}`, { stepId: node.stepId, hint: 'Each step must have a unique ID' });
|
|
41
|
+
}
|
|
42
|
+
nodeMap.set(node.stepId, node);
|
|
43
|
+
}
|
|
44
|
+
// Step 2: Validate dependencies and build edges
|
|
45
|
+
const edges = [];
|
|
46
|
+
const adjacencyList = new Map();
|
|
47
|
+
const reverseDependencies = new Map();
|
|
48
|
+
// Initialize adjacency lists for all nodes
|
|
49
|
+
for (const node of nodes) {
|
|
50
|
+
adjacencyList.set(node.stepId, []);
|
|
51
|
+
reverseDependencies.set(node.stepId, []);
|
|
52
|
+
}
|
|
53
|
+
// Build edges and validate references
|
|
54
|
+
for (const node of nodes) {
|
|
55
|
+
for (const dependency of node.dependencies) {
|
|
56
|
+
// Validate that the dependency exists
|
|
57
|
+
if (!nodeMap.has(dependency)) {
|
|
58
|
+
throw new WorkflowValidationError(`Step "${node.stepId}" depends on non-existent step "${dependency}"`, {
|
|
59
|
+
stepId: node.stepId,
|
|
60
|
+
missingDependency: dependency,
|
|
61
|
+
availableSteps: Array.from(nodeMap.keys()),
|
|
62
|
+
hint: `Check that "${dependency}" is spelled correctly and exists in the workflow`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Self-dependency check
|
|
66
|
+
if (node.stepId === dependency) {
|
|
67
|
+
throw new WorkflowValidationError(`Step "${node.stepId}" cannot depend on itself`, {
|
|
68
|
+
stepId: node.stepId,
|
|
69
|
+
hint: 'Remove self-reference from needs field',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Create edge
|
|
73
|
+
edges.push({
|
|
74
|
+
from: node.stepId,
|
|
75
|
+
to: dependency,
|
|
76
|
+
});
|
|
77
|
+
// Update adjacency list (stepId → dependencies)
|
|
78
|
+
adjacencyList.get(node.stepId).push(dependency);
|
|
79
|
+
// Update reverse dependencies (dependency → dependents)
|
|
80
|
+
reverseDependencies.get(dependency).push(node.stepId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Step 3: Freeze collections for immutability
|
|
84
|
+
const frozenAdjacencyList = new Map();
|
|
85
|
+
for (const [stepId, deps] of adjacencyList) {
|
|
86
|
+
frozenAdjacencyList.set(stepId, Object.freeze([...deps]));
|
|
87
|
+
}
|
|
88
|
+
const frozenReverseDependencies = new Map();
|
|
89
|
+
for (const [stepId, deps] of reverseDependencies) {
|
|
90
|
+
frozenReverseDependencies.set(stepId, Object.freeze([...deps]));
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
nodes: nodeMap,
|
|
94
|
+
edges: Object.freeze(edges),
|
|
95
|
+
adjacencyList: frozenAdjacencyList,
|
|
96
|
+
reverseDependencies: frozenReverseDependencies,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get all steps that have no dependencies (entry points).
|
|
101
|
+
* These can be executed immediately.
|
|
102
|
+
*
|
|
103
|
+
* @param graph - The dependency graph
|
|
104
|
+
* @returns Array of step IDs with no dependencies
|
|
105
|
+
*/
|
|
106
|
+
static getEntryPoints(graph) {
|
|
107
|
+
const entryPoints = [];
|
|
108
|
+
for (const [stepId, dependencies] of graph.adjacencyList) {
|
|
109
|
+
if (dependencies.length === 0) {
|
|
110
|
+
entryPoints.push(stepId);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return entryPoints;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get all steps that have no dependents (exit points).
|
|
117
|
+
* These are the final steps in the workflow.
|
|
118
|
+
*
|
|
119
|
+
* @param graph - The dependency graph
|
|
120
|
+
* @returns Array of step IDs with no dependents
|
|
121
|
+
*/
|
|
122
|
+
static getExitPoints(graph) {
|
|
123
|
+
const exitPoints = [];
|
|
124
|
+
for (const [stepId, dependents] of graph.reverseDependencies) {
|
|
125
|
+
if (dependents.length === 0) {
|
|
126
|
+
exitPoints.push(stepId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return exitPoints;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Calculate the in-degree for each node (number of dependencies).
|
|
133
|
+
* Useful for topological sorting algorithms like Kahn's.
|
|
134
|
+
*
|
|
135
|
+
* @param graph - The dependency graph
|
|
136
|
+
* @returns Map of stepId → in-degree
|
|
137
|
+
*/
|
|
138
|
+
static calculateInDegrees(graph) {
|
|
139
|
+
const inDegrees = new Map();
|
|
140
|
+
for (const [stepId, dependencies] of graph.adjacencyList) {
|
|
141
|
+
inDegrees.set(stepId, dependencies.length);
|
|
142
|
+
}
|
|
143
|
+
return inDegrees;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Calculate the out-degree for each node (number of dependents).
|
|
147
|
+
*
|
|
148
|
+
* @param graph - The dependency graph
|
|
149
|
+
* @returns Map of stepId → out-degree
|
|
150
|
+
*/
|
|
151
|
+
static calculateOutDegrees(graph) {
|
|
152
|
+
const outDegrees = new Map();
|
|
153
|
+
for (const [stepId, dependents] of graph.reverseDependencies) {
|
|
154
|
+
outDegrees.set(stepId, dependents.length);
|
|
155
|
+
}
|
|
156
|
+
return outDegrees;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=DependencyResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyResolver.js","sourceRoot":"","sources":["../../src/graph/DependencyResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TopologicalSorter
|
|
3
|
+
*
|
|
4
|
+
* Performs topological sorting on a dependency graph using Kahn's algorithm.
|
|
5
|
+
* This is what makes parallel execution possible.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Convert DAG into execution phases
|
|
9
|
+
* - Group independent steps into phases (parallelization!)
|
|
10
|
+
* - Ensure dependencies are satisfied before execution
|
|
11
|
+
* - This is "the moment Orbyt becomes real" - we go from sequential to parallel
|
|
12
|
+
*
|
|
13
|
+
* Algorithm: Kahn's Algorithm (BFS-based)
|
|
14
|
+
* 1. Start with all nodes that have no dependencies (in-degree = 0)
|
|
15
|
+
* 2. Remove them and their edges, collect them as Phase 1
|
|
16
|
+
* 3. Find new nodes with in-degree = 0 (Phase 2)
|
|
17
|
+
* 4. Repeat until all nodes are processed
|
|
18
|
+
*
|
|
19
|
+
* Result: [['validate'], ['process', 'lint'], ['upload']]
|
|
20
|
+
* Phase 1: validate (runs alone)
|
|
21
|
+
* Phase 2: process and lint (run in parallel!)
|
|
22
|
+
* Phase 3: upload (runs after both complete)
|
|
23
|
+
*
|
|
24
|
+
* What it does NOT do:
|
|
25
|
+
* - Does NOT execute steps (that's StepExecutor's job)
|
|
26
|
+
* - Does NOT manage state (that's ExecutionState's job)
|
|
27
|
+
* - Does NOT add retries (that's StepExecutor's job)
|
|
28
|
+
*/
|
|
29
|
+
import { DependencyGraph } from './DependencyResolver.js';
|
|
30
|
+
/**
|
|
31
|
+
* Result of topological sorting
|
|
32
|
+
*/
|
|
33
|
+
export interface TopologicalSortResult {
|
|
34
|
+
/**
|
|
35
|
+
* Execution phases - each inner array is a phase,
|
|
36
|
+
* steps in the same phase can run in parallel
|
|
37
|
+
*/
|
|
38
|
+
readonly phases: readonly (readonly string[])[];
|
|
39
|
+
/**
|
|
40
|
+
* Total number of phases
|
|
41
|
+
*/
|
|
42
|
+
readonly phaseCount: number;
|
|
43
|
+
/**
|
|
44
|
+
* Map of stepId → phase number (0-indexed)
|
|
45
|
+
*/
|
|
46
|
+
readonly stepPhases: ReadonlyMap<string, number>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Performs topological sorting to determine execution order.
|
|
50
|
+
* Pure function - takes validated graph, returns execution phases.
|
|
51
|
+
*/
|
|
52
|
+
export declare class TopologicalSorter {
|
|
53
|
+
/**
|
|
54
|
+
* Sort the dependency graph into execution phases using Kahn's algorithm.
|
|
55
|
+
*
|
|
56
|
+
* This is BFS-based and naturally groups independent steps into phases.
|
|
57
|
+
*
|
|
58
|
+
* @param graph - The dependency graph (must be acyclic)
|
|
59
|
+
* @returns Topological sort result with execution phases
|
|
60
|
+
* @throws WorkflowValidationError if graph contains cycles
|
|
61
|
+
*/
|
|
62
|
+
static sort(graph: DependencyGraph): TopologicalSortResult;
|
|
63
|
+
/**
|
|
64
|
+
* Sort using DFS-based algorithm (alternative to Kahn's).
|
|
65
|
+
* This produces a valid topological order but doesn't naturally
|
|
66
|
+
* group into phases like Kahn's does.
|
|
67
|
+
*
|
|
68
|
+
* Use this if you need a single linear order rather than phases.
|
|
69
|
+
*
|
|
70
|
+
* @param graph - The dependency graph
|
|
71
|
+
* @returns Array of step IDs in topological order
|
|
72
|
+
*/
|
|
73
|
+
static sortLinear(graph: DependencyGraph): string[];
|
|
74
|
+
/**
|
|
75
|
+
* Calculate the critical path through the dependency graph.
|
|
76
|
+
* The critical path is the longest path from entry to exit points.
|
|
77
|
+
*
|
|
78
|
+
* This is useful for:
|
|
79
|
+
* - Estimating minimum workflow execution time
|
|
80
|
+
* - Identifying bottlenecks
|
|
81
|
+
* - Optimizing parallelization
|
|
82
|
+
*
|
|
83
|
+
* @param graph - The dependency graph
|
|
84
|
+
* @param stepDurations - Map of stepId → estimated duration (ms)
|
|
85
|
+
* @returns Critical path information
|
|
86
|
+
*/
|
|
87
|
+
static calculateCriticalPath(graph: DependencyGraph, stepDurations: Map<string, number>): CriticalPathResult;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Result of critical path analysis
|
|
91
|
+
*/
|
|
92
|
+
export interface CriticalPathResult {
|
|
93
|
+
/** Steps on the critical path (zero slack) */
|
|
94
|
+
readonly criticalPath: readonly string[];
|
|
95
|
+
/** Estimated total workflow duration */
|
|
96
|
+
readonly workflowDuration: number;
|
|
97
|
+
/** Earliest start time for each step */
|
|
98
|
+
readonly earliestStart: ReadonlyMap<string, number>;
|
|
99
|
+
/** Latest start time for each step without delaying workflow */
|
|
100
|
+
readonly latestStart: ReadonlyMap<string, number>;
|
|
101
|
+
/** Slack (float) for each step - how much it can be delayed */
|
|
102
|
+
readonly slack: ReadonlyMap<string, number>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=TopologicalSorter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopologicalSorter.d.ts","sourceRoot":"","sources":["../../src/graph/TopologicalSorter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAEhD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,qBAAqB;IAoE1D;;;;;;;;;OASG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE;IA6BnD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,qBAAqB,CAC1B,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,kBAAkB;CAkFtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,wCAAwC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,wCAAwC;IACxC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C"}
|