@decaf-ts/integrations 0.3.8 → 0.3.9
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/dist/integrations.cjs +3 -3
- package/dist/integrations.js +3 -3
- package/lib/cjs/graph/engine/constants.cjs +58 -0
- package/lib/cjs/graph/engine/decorators.cjs +4 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +27 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +20 -0
- package/lib/cjs/graph/{errors → engine/errors}/index.cjs +2 -2
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +40 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +37 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +4 -0
- package/lib/cjs/graph/{events → engine/events}/index.cjs +2 -2
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +4 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +79 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +408 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +32 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +30 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +4 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +103 -0
- package/lib/cjs/graph/{execution → engine/execution}/index.cjs +2 -2
- package/lib/cjs/graph/engine/index.cjs +84 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +87 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +85 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +85 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +16 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +77 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +78 -0
- package/lib/cjs/graph/{loops → engine/loops}/index.cjs +2 -2
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +28 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +20 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +34 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +191 -0
- package/lib/cjs/graph/{pinning → engine/pinning}/index.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +197 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +172 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs +57 -0
- package/lib/cjs/graph/{planning → engine/planning}/index.cjs +2 -2
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +44 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +27 -0
- package/lib/cjs/graph/{registry → engine/registry}/index.cjs +2 -2
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +53 -0
- package/lib/cjs/graph/{snapshots → engine/snapshots}/index.cjs +2 -2
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs +76 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +4 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +69 -0
- package/lib/cjs/graph/{store → engine/store}/index.cjs +2 -2
- package/lib/cjs/graph/engine/types.cjs +4 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +33 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +58 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +52 -0
- package/lib/cjs/graph/{validation → engine/validation}/index.cjs +2 -2
- package/lib/cjs/graph/index.cjs +10 -60
- package/lib/cjs/graph/shared/constants.cjs +44 -0
- package/lib/cjs/graph/shared/index.cjs +38 -0
- package/lib/cjs/graph/{nodes → shared/nodes}/agent.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/base.cjs +35 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs +38 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs +464 -0
- package/lib/cjs/graph/{nodes → shared/nodes}/index.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/triggers.cjs +250 -0
- package/lib/cjs/graph/shared/types.cjs +4 -0
- package/lib/cjs/index.cjs +3 -3
- package/lib/esm/graph/engine/constants.js +62 -0
- package/lib/esm/graph/engine/decorators.js +2 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
- package/lib/esm/graph/engine/errors/index.js +14 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
- package/lib/esm/graph/engine/events/index.js +10 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +403 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
- package/lib/esm/graph/engine/execution/index.js +13 -0
- package/lib/esm/graph/engine/index.js +67 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
- package/lib/esm/graph/engine/loops/index.js +12 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
- package/lib/esm/graph/engine/pinning/index.js +10 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
- package/lib/esm/graph/engine/planning/index.js +13 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
- package/lib/esm/graph/engine/registry/index.js +8 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
- package/lib/esm/graph/engine/snapshots/index.js +7 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
- package/lib/esm/graph/engine/store/index.js +11 -0
- package/lib/esm/graph/engine/types.js +2 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
- package/lib/esm/graph/engine/validation/index.js +9 -0
- package/lib/esm/graph/index.js +9 -59
- package/lib/esm/graph/shared/constants.js +56 -0
- package/lib/esm/graph/shared/index.js +19 -0
- package/lib/esm/graph/shared/nodes/agent.js +101 -0
- package/lib/esm/graph/shared/nodes/base.js +30 -0
- package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
- package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
- package/lib/esm/graph/shared/nodes/index.js +18 -0
- package/lib/esm/graph/shared/nodes/triggers.js +241 -0
- package/lib/esm/graph/shared/types.js +2 -0
- package/lib/esm/index.js +3 -3
- package/lib/types/graph/engine/constants.d.cts +59 -0
- package/lib/types/graph/engine/constants.d.mts +59 -0
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.cts +1 -1
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.mts +1 -1
- package/lib/types/graph/engine/index.d.cts +61 -0
- package/lib/types/graph/engine/index.d.mts +61 -0
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.cts +1 -1
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.mts +1 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.cts +2 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.mts +2 -1
- package/lib/types/graph/{types.d.cts → engine/types.d.cts} +8 -116
- package/lib/types/graph/{types.d.mts → engine/types.d.mts} +8 -116
- package/lib/types/graph/index.d.cts +8 -53
- package/lib/types/graph/index.d.mts +8 -53
- package/lib/types/graph/shared/constants.d.cts +53 -0
- package/lib/types/graph/shared/constants.d.mts +53 -0
- package/lib/types/graph/shared/index.d.cts +18 -0
- package/lib/types/graph/shared/index.d.mts +18 -0
- package/lib/types/graph/shared/types.d.cts +121 -0
- package/lib/types/graph/shared/types.d.mts +121 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/package.json +14 -3
- package/lib/cjs/graph/constants.cjs +0 -94
- package/lib/cjs/graph/decorators.cjs +0 -4
- package/lib/cjs/graph/errors/GraphCycleError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphExecutionError.cjs +0 -27
- package/lib/cjs/graph/errors/GraphInputError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPinningError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPortError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphStoreError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphTopologyError.cjs +0 -20
- package/lib/cjs/graph/events/GraphExecutionEvent.cjs +0 -4
- package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +0 -40
- package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +0 -37
- package/lib/cjs/graph/events/GraphExecutionObserver.cjs +0 -4
- package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +0 -4
- package/lib/cjs/graph/execution/GraphExecutionContext.cjs +0 -79
- package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +0 -407
- package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +0 -32
- package/lib/cjs/graph/execution/GraphExecutionResult.cjs +0 -30
- package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +0 -4
- package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +0 -103
- package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +0 -87
- package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +0 -84
- package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +0 -85
- package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +0 -16
- package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +0 -76
- package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +0 -77
- package/lib/cjs/graph/nodes/base.cjs +0 -35
- package/lib/cjs/graph/nodes/category-styles.cjs +0 -38
- package/lib/cjs/graph/nodes/flow-control.cjs +0 -464
- package/lib/cjs/graph/nodes/triggers.cjs +0 -250
- package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +0 -28
- package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +0 -20
- package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +0 -34
- package/lib/cjs/graph/pinning/GraphPinningService.cjs +0 -191
- package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +0 -197
- package/lib/cjs/graph/planning/GraphRelationResolver.cjs +0 -172
- package/lib/cjs/graph/planning/GraphTopology.cjs +0 -57
- package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +0 -44
- package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
- package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
- package/lib/cjs/graph/store/GraphCachedValue.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueKey.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueStore.cjs +0 -76
- package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +0 -4
- package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +0 -69
- package/lib/cjs/graph/types.cjs +0 -4
- package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +0 -33
- package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +0 -58
- package/lib/cjs/graph/validation/GraphValueValidator.cjs +0 -52
- package/lib/esm/graph/constants.js +0 -106
- package/lib/esm/graph/decorators.js +0 -2
- package/lib/esm/graph/errors/GraphCycleError.js +0 -15
- package/lib/esm/graph/errors/GraphExecutionError.js +0 -22
- package/lib/esm/graph/errors/GraphInputError.js +0 -15
- package/lib/esm/graph/errors/GraphLoopLimitError.js +0 -15
- package/lib/esm/graph/errors/GraphPinningError.js +0 -15
- package/lib/esm/graph/errors/GraphPortError.js +0 -15
- package/lib/esm/graph/errors/GraphStoreError.js +0 -15
- package/lib/esm/graph/errors/GraphTopologyError.js +0 -15
- package/lib/esm/graph/errors/index.js +0 -14
- package/lib/esm/graph/events/GraphExecutionEvent.js +0 -2
- package/lib/esm/graph/events/GraphExecutionEventEmitter.js +0 -35
- package/lib/esm/graph/events/GraphExecutionEventFactory.js +0 -32
- package/lib/esm/graph/events/GraphExecutionObserver.js +0 -2
- package/lib/esm/graph/events/index.js +0 -10
- package/lib/esm/graph/execution/CodeSandboxEvaluator.js +0 -18
- package/lib/esm/graph/execution/GraphExecutionContext.js +0 -74
- package/lib/esm/graph/execution/GraphExecutionEngine.js +0 -402
- package/lib/esm/graph/execution/GraphExecutionFrame.js +0 -27
- package/lib/esm/graph/execution/GraphExecutionResult.js +0 -26
- package/lib/esm/graph/execution/GraphNodeExecutor.js +0 -2
- package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +0 -98
- package/lib/esm/graph/execution/index.js +0 -13
- package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +0 -82
- package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +0 -79
- package/lib/esm/graph/loops/GraphConditionEvaluator.js +0 -80
- package/lib/esm/graph/loops/GraphLoopExecutionContext.js +0 -11
- package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +0 -71
- package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +0 -72
- package/lib/esm/graph/loops/index.js +0 -12
- package/lib/esm/graph/nodes/agent.js +0 -101
- package/lib/esm/graph/nodes/base.js +0 -30
- package/lib/esm/graph/nodes/category-styles.js +0 -34
- package/lib/esm/graph/nodes/flow-control.js +0 -455
- package/lib/esm/graph/nodes/index.js +0 -18
- package/lib/esm/graph/nodes/triggers.js +0 -241
- package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +0 -23
- package/lib/esm/graph/pinning/GraphPinningMetadata.js +0 -15
- package/lib/esm/graph/pinning/GraphPinningPolicy.js +0 -29
- package/lib/esm/graph/pinning/GraphPinningService.js +0 -186
- package/lib/esm/graph/pinning/index.js +0 -10
- package/lib/esm/graph/planning/GraphExecutionPlan.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +0 -7
- package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanNode.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanner.js +0 -192
- package/lib/esm/graph/planning/GraphRelationResolver.js +0 -167
- package/lib/esm/graph/planning/GraphTopology.js +0 -52
- package/lib/esm/graph/planning/index.js +0 -13
- package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +0 -39
- package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +0 -22
- package/lib/esm/graph/registry/index.js +0 -8
- package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +0 -48
- package/lib/esm/graph/snapshots/index.js +0 -7
- package/lib/esm/graph/store/GraphCachedValue.js +0 -2
- package/lib/esm/graph/store/GraphValueKey.js +0 -7
- package/lib/esm/graph/store/GraphValueStore.js +0 -71
- package/lib/esm/graph/store/GraphValueStoreAdapter.js +0 -2
- package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +0 -64
- package/lib/esm/graph/store/index.js +0 -11
- package/lib/esm/graph/types.js +0 -2
- package/lib/esm/graph/validation/GraphDefinitionValidator.js +0 -28
- package/lib/esm/graph/validation/GraphPortSchemaResolver.js +0 -53
- package/lib/esm/graph/validation/GraphValueValidator.js +0 -47
- package/lib/esm/graph/validation/index.js +0 -9
- package/lib/types/graph/constants.d.cts +0 -101
- package/lib/types/graph/constants.d.mts +0 -101
- /package/lib/types/graph/{decorators.d.cts → engine/decorators.d.cts} +0 -0
- /package/lib/types/graph/{decorators.d.mts → engine/decorators.d.mts} +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.mts +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { graphDefinitionOf } from "@decaf-ts/ui-decorators/graph";
|
|
2
|
+
import { GRAPH_WORKFLOW_BOUNDARY } from "./../constants.js";
|
|
3
|
+
import { GraphCycleError } from "./../errors/GraphCycleError.js";
|
|
4
|
+
import { GraphTopologyError } from "./../errors/GraphTopologyError.js";
|
|
5
|
+
import { GraphRelationResolver } from "./GraphRelationResolver.js";
|
|
6
|
+
/**
|
|
7
|
+
* Planner that turns a {@link GraphWorkflowDefinition} into a
|
|
8
|
+
* {@link GraphExecutionPlan} with topological layers.
|
|
9
|
+
*/
|
|
10
|
+
export class GraphExecutionPlanner {
|
|
11
|
+
constructor(resolver) {
|
|
12
|
+
this.resolver = resolver ?? new GraphRelationResolver();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Plans a workflow for execution.
|
|
16
|
+
*
|
|
17
|
+
* @param workflow - The workflow definition to plan.
|
|
18
|
+
* @returns The execution plan with nodes, edges, layers, and maps.
|
|
19
|
+
* @throws {GraphTopologyError} when node IDs are not unique.
|
|
20
|
+
* @throws {GraphCycleError} when the workflow contains an unsupported cycle.
|
|
21
|
+
*/
|
|
22
|
+
plan(workflow) {
|
|
23
|
+
this.validateUniqueNodeIds(workflow);
|
|
24
|
+
const nodes = this.resolveNodes(workflow);
|
|
25
|
+
const edges = this.resolver.resolve(workflow);
|
|
26
|
+
const incomingByNode = this.buildIncomingMap(edges);
|
|
27
|
+
const outgoingByNode = this.buildOutgoingMap(edges);
|
|
28
|
+
const layers = this.topologicalLayers(nodes, edges);
|
|
29
|
+
return {
|
|
30
|
+
workflow,
|
|
31
|
+
workflowId: workflow.name,
|
|
32
|
+
nodes,
|
|
33
|
+
edges,
|
|
34
|
+
layers,
|
|
35
|
+
incomingByNode,
|
|
36
|
+
outgoingByNode,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Validates that all workflow node IDs are unique.
|
|
41
|
+
*/
|
|
42
|
+
validateUniqueNodeIds(workflow) {
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
for (const node of workflow.nodes ?? []) {
|
|
45
|
+
if (seen.has(node.id)) {
|
|
46
|
+
throw new GraphTopologyError(`Duplicate node id '${node.id}' in workflow '${workflow.name}'`, { nodeId: node.id, workflowId: workflow.name });
|
|
47
|
+
}
|
|
48
|
+
seen.add(node.id);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolves workflow node metadata into plan nodes with full definitions.
|
|
53
|
+
*/
|
|
54
|
+
resolveNodes(workflow) {
|
|
55
|
+
const result = [];
|
|
56
|
+
for (const nodeMeta of workflow.nodes ?? []) {
|
|
57
|
+
const definition = this.resolveDefinition(nodeMeta);
|
|
58
|
+
const inputPorts = (definition.ports ?? [])
|
|
59
|
+
.filter((p) => p.direction === "input")
|
|
60
|
+
.map((p) => p.name);
|
|
61
|
+
const outputPorts = (definition.ports ?? [])
|
|
62
|
+
.filter((p) => p.direction === "output")
|
|
63
|
+
.map((p) => p.name);
|
|
64
|
+
result.push({
|
|
65
|
+
id: nodeMeta.id,
|
|
66
|
+
kind: nodeMeta.kind ?? definition.kind ?? nodeMeta.id,
|
|
67
|
+
label: nodeMeta.label,
|
|
68
|
+
source: nodeMeta,
|
|
69
|
+
definition,
|
|
70
|
+
inputPorts,
|
|
71
|
+
outputPorts,
|
|
72
|
+
metadata: nodeMeta.metadata,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Attempts to resolve the full graph node definition from metadata.
|
|
79
|
+
*
|
|
80
|
+
* Accepts either a decorated Model class/instance (resolved via
|
|
81
|
+
* `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
|
|
82
|
+
* (useful for serialized workflows that inline node definitions).
|
|
83
|
+
*/
|
|
84
|
+
resolveDefinition(nodeMeta) {
|
|
85
|
+
if (nodeMeta.node) {
|
|
86
|
+
if (this.isRawDefinition(nodeMeta.node)) {
|
|
87
|
+
return nodeMeta.node;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
return graphDefinitionOf(nodeMeta.node);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// fall through to stub
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Return a minimal stub definition so planning can proceed
|
|
97
|
+
return {
|
|
98
|
+
name: nodeMeta.id,
|
|
99
|
+
tag: nodeMeta.id,
|
|
100
|
+
kind: nodeMeta.kind ?? nodeMeta.id,
|
|
101
|
+
labels: [],
|
|
102
|
+
ports: [],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
|
|
107
|
+
* (a plain object with a `ports` array and a `name` string).
|
|
108
|
+
*/
|
|
109
|
+
isRawDefinition(value) {
|
|
110
|
+
return (typeof value === "object" &&
|
|
111
|
+
value !== null &&
|
|
112
|
+
!Array.isArray(value) &&
|
|
113
|
+
typeof value.name === "string" &&
|
|
114
|
+
Array.isArray(value.ports));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Builds a map of node id -> incoming edges.
|
|
118
|
+
*/
|
|
119
|
+
buildIncomingMap(edges) {
|
|
120
|
+
const map = new Map();
|
|
121
|
+
for (const edge of edges) {
|
|
122
|
+
const list = map.get(edge.targetNodeId) ?? [];
|
|
123
|
+
list.push(edge);
|
|
124
|
+
map.set(edge.targetNodeId, list);
|
|
125
|
+
}
|
|
126
|
+
return map;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Builds a map of node id -> outgoing edges.
|
|
130
|
+
*/
|
|
131
|
+
buildOutgoingMap(edges) {
|
|
132
|
+
const map = new Map();
|
|
133
|
+
for (const edge of edges) {
|
|
134
|
+
const list = map.get(edge.sourceNodeId) ?? [];
|
|
135
|
+
list.push(edge);
|
|
136
|
+
map.set(edge.sourceNodeId, list);
|
|
137
|
+
}
|
|
138
|
+
return map;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Produces topological layers using Kahn's algorithm.
|
|
142
|
+
*
|
|
143
|
+
* Workflow boundary edges do not count as executable-node dependencies.
|
|
144
|
+
*/
|
|
145
|
+
topologicalLayers(nodes, edges) {
|
|
146
|
+
const executableNodes = nodes.filter((n) => n.id !== GRAPH_WORKFLOW_BOUNDARY);
|
|
147
|
+
const nodeIds = new Set(executableNodes.map((n) => n.id));
|
|
148
|
+
// Only edges between two executable nodes count as dependencies
|
|
149
|
+
const execEdges = edges.filter((e) => nodeIds.has(e.sourceNodeId) && nodeIds.has(e.targetNodeId));
|
|
150
|
+
// Compute in-degree
|
|
151
|
+
const indegree = new Map();
|
|
152
|
+
for (const node of executableNodes)
|
|
153
|
+
indegree.set(node.id, 0);
|
|
154
|
+
for (const edge of execEdges) {
|
|
155
|
+
indegree.set(edge.targetNodeId, (indegree.get(edge.targetNodeId) ?? 0) + 1);
|
|
156
|
+
}
|
|
157
|
+
const layers = [];
|
|
158
|
+
const planned = new Set();
|
|
159
|
+
let ready = executableNodes.filter((n) => (indegree.get(n.id) ?? 0) === 0);
|
|
160
|
+
let layerIndex = 0;
|
|
161
|
+
while (ready.length > 0) {
|
|
162
|
+
const layer = { index: layerIndex++, nodes: ready };
|
|
163
|
+
layers.push(layer);
|
|
164
|
+
const nextReady = [];
|
|
165
|
+
for (const node of ready) {
|
|
166
|
+
planned.add(node.id);
|
|
167
|
+
const outgoing = execEdges.filter((e) => e.sourceNodeId === node.id);
|
|
168
|
+
for (const edge of outgoing) {
|
|
169
|
+
const deg = (indegree.get(edge.targetNodeId) ?? 1) - 1;
|
|
170
|
+
indegree.set(edge.targetNodeId, deg);
|
|
171
|
+
if (deg === 0 && !planned.has(edge.targetNodeId)) {
|
|
172
|
+
const next = executableNodes.find((n) => n.id === edge.targetNodeId);
|
|
173
|
+
if (next)
|
|
174
|
+
nextReady.push(next);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
ready = nextReady;
|
|
179
|
+
}
|
|
180
|
+
if (planned.size !== executableNodes.length) {
|
|
181
|
+
const unplanned = executableNodes
|
|
182
|
+
.filter((n) => !planned.has(n.id))
|
|
183
|
+
.map((n) => n.id);
|
|
184
|
+
throw new GraphCycleError({
|
|
185
|
+
unplannedNodes: unplanned,
|
|
186
|
+
workflowId: nodes[0]?.definition?.name,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return layers;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2dyYXBoL2VuZ2luZS9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDBCQUFxQjtBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLHVDQUFrQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMENBQXFDO0FBS2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxtQ0FBZ0M7QUFFaEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUFZLFFBQWdDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBQyxRQUFpQztRQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEQsT0FBTztZQUNMLFFBQVE7WUFDUixVQUFVLEVBQUUsUUFBUSxDQUFD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d0JBQ2pELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUNyRSxJQUFJLElBQUk7NEJBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssR0FBRyxTQUFTLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsTUFBTSxTQUFTLEdBQUcsZUFBZTtpQkFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixNQUFNLElBQUksZUFBZSxDQUFDO2dCQUN4QixjQUFjLEVBQUUsU0FBUztnQkFDekIsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSTthQUN2QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcbiAqIEBzdW1tYXJ5IFRvcG9sb2dpY2FsIHBsYW5uZXIgZm9yIGdyYXBoIHdvcmtmbG93cy5cbiAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB3b3JrZmxvdyBub2RlcyBhbmQgcmVsYXRpb25zLCB2YWxpZGF0ZXMgdG9wb2xvZ3ksIGRldGVjdHMgY3ljbGVzLCBhbmQgcHJvZHVjZXMgdG9wb2xvZ2ljYWwgZXhlY3V0aW9uIGxheWVycyB1c2luZyBLYWhuJ3MgYWxnb3JpdGhtLlxuICovXG5pbXBvcnQgdHlwZSB7XG4gIEdyYXBoTm9kZURlZmluaXRpb24sXG4gIEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcbmltcG9ydCB7IGdyYXBoRGVmaW5pdGlvbk9mIH0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5cbmltcG9ydCB7IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgR3JhcGhDeWNsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaEN5Y2xlRXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoVG9wb2xvZ3lFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbiB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTm9kZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuRWRnZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5MYXllciB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhbkxheWVyXCI7XG5pbXBvcnQgeyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIgfSBmcm9tIFwiLi9HcmFwaFJlbGF0aW9uUmVzb2x2ZXJcIjtcblxuLyoqXG4gKiBQbGFubmVyIHRoYXQgdHVybnMgYSB7QGxpbmsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb259IGludG8gYVxuICoge0BsaW5rIEdyYXBoRXhlY3V0aW9uUGxhbn0gd2l0aCB0b3BvbG9naWNhbCBsYXllcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaEV4ZWN1dGlvblBsYW5uZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVyOiBHcmFwaFJlbGF0aW9uUmVzb2x2ZXI7XG5cbiAgY29uc3RydWN0b3IocmVzb2x2ZXI/OiBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIpIHtcbiAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXIgPz8gbmV3IEdyYXBoUmVsYXRpb25SZXNvbHZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYW5zIGEgd29ya2Zsb3cgZm9yIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIHdvcmtmbG93IGRlZmluaXRpb24gdG8gcGxhbi5cbiAgICogQHJldHVybnMgVGhlIGV4ZWN1dGlvbiBwbGFuIHdpdGggbm9kZXMsIGVkZ2VzLCBsYXllcnMsIGFuZCBtYXBzLlxuICAgKiBAdGhyb3dzIHtHcmFwaFRvcG9sb2d5RXJyb3J9IHdoZW4gbm9kZSBJRHMgYXJlIG5vdCB1bmlxdWUuXG4gICAqIEB0aHJvd3Mge0dyYXBoQ3ljbGVFcnJvcn0gd2hlbiB0aGUgd29ya2Zsb3cgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgY3ljbGUuXG4gICAqL1xuICBwbGFuKHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbik6IEdyYXBoRXhlY3V0aW9uUGxhbiB7XG4gICAgdGhpcy52YWxpZGF0ZVVuaXF1ZU5vZGVJZHMod29ya2Zsb3cpO1xuXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLnJlc29sdmVOb2Rlcyh3b3JrZmxvdyk7XG4gICAgY29uc3QgZWRnZXMgPSB0aGlzLnJlc29sdmVyLnJlc29sdmUod29ya2Zsb3cpO1xuXG4gICAgY29uc3QgaW5jb21pbmdCeU5vZGUgPSB0aGlzLmJ1aWxkSW5jb21pbmdNYXAoZWRnZXMpO1xuICAgIGNvbnN0IG91dGdvaW5nQnlOb2RlID0gdGhpcy5idWlsZE91dGdvaW5nTWFwKGVkZ2VzKTtcblxuICAgIGNvbnN0IGxheWVycyA9IHRoaXMudG9wb2xvZ2ljYWxMYXllcnMobm9kZXMsIGVkZ2VzKTtcblxuICAgIHJldHVybiB7XG4gICAgICB3b3JrZmxvdyxcbiAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICBub2RlcyxcbiAgICAgIGVkZ2VzLFxuICAgICAgbGF5ZXJzLFxuICAgICAgaW5jb21pbmdCeU5vZGUsXG4gICAgICBvdXRnb2luZ0J5Tm9kZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGFsbCB3b3JrZmxvdyBub2RlIElEcyBhcmUgdW5pcXVlLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVVuaXF1ZU5vZGVJZHMod29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgaWYgKHNlZW4uaGFzKG5vZGUuaWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBub2RlIGlkICcke25vZGUuaWR9JyBpbiB3b3JrZmxvdyAnJHt3b3JrZmxvdy5uYW1lfSdgLFxuICAgICAgICAgIHsgbm9kZUlkOiBub2RlLmlkLCB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKG5vZGUuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3b3JrZmxvdyBub2RlIG1ldGFkYXRhIGludG8gcGxhbiBub2RlcyB3aXRoIGZ1bGwgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVOb2RlcyhcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb25cbiAgKTogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVtdIHtcbiAgICBjb25zdCByZXN1bHQ6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgbm9kZU1ldGEgb2Ygd29ya2Zsb3cubm9kZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB0aGlzLnJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgIGNvbnN0IGlucHV0UG9ydHMgPSAoZGVmaW5pdGlvbi5wb3J0cyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5kaXJlY3Rpb24gPT09IFwiaW5wdXRcIilcbiAgICAgICAgLm1hcCgocCkgPT4gcC5uYW1lKTtcbiAgICAgIGNvbnN0IG91dHB1dFBvcnRzID0gKGRlZmluaXRpb24ucG9ydHMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAuZGlyZWN0aW9uID09PSBcIm91dHB1dFwiKVxuICAgICAgICAubWFwKChwKSA9PiBwLm5hbWUpO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBpZDogbm9kZU1ldGEuaWQsXG4gICAgICAgIGtpbmQ6IG5vZGVNZXRhLmtpbmQgPz8gZGVmaW5pdGlvbi5raW5kID8/IG5vZGVNZXRhLmlkLFxuICAgICAgICBsYWJlbDogbm9kZU1ldGEubGFiZWwsXG4gICAgICAgIHNvdXJjZTogbm9kZU1ldGEsXG4gICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgIGlucHV0UG9ydHMsXG4gICAgICAgIG91dHB1dFBvcnRzLFxuICAgICAgICBtZXRhZGF0YTogbm9kZU1ldGEubWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZXNvbHZlIHRoZSBmdWxsIGdyYXBoIG5vZGUgZGVmaW5pdGlvbiBmcm9tIG1ldGFkYXRhLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAqIGBncmFwaERlZmluaXRpb25PZmApIG9yIGEgcGxhaW4gYEdyYXBoTm9kZURlZmluaXRpb25gLXNoYXBlZCBvYmplY3RcbiAgICogKHVzZWZ1bCBmb3Igc2VyaWFsaXplZCB3b3JrZmxvd3MgdGhhdCBpbmxpbmUgbm9kZSBkZWZpbml0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhOiB7XG4gICAgbm9kZT86IHVua25vd247XG4gICAga2luZD86IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xuICB9KTogR3JhcGhOb2RlRGVmaW5pdGlvbiB7XG4gICAgaWYgKG5vZGVNZXRhLm5vZGUpIHtcbiAgICAgIGlmICh0aGlzLmlzUmF3RGVmaW5pdGlvbihub2RlTWV0YS5ub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZSBhcyBHcmFwaE5vZGVEZWZpbml0aW9uO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUgYXMgYW55KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gc3R1YlxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBtaW5pbWFsIHN0dWIgZGVmaW5pdGlvbiBzbyBwbGFubmluZyBjYW4gcHJvY2VlZFxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBub2RlTWV0YS5pZCxcbiAgICAgIHRhZzogbm9kZU1ldGEuaWQsXG4gICAgICBraW5kOiBub2RlTWV0YS5raW5kID8/IG5vZGVNZXRhLmlkLFxuICAgICAgbGFiZWxzOiBbXSxcbiAgICAgIHBvcnRzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIHdoZW4gYSB2YWx1ZSBsb29rcyBsaWtlIGEgcmF3IHtAbGluayBHcmFwaE5vZGVEZWZpbml0aW9ufVxuICAgKiAoYSBwbGFpbiBvYmplY3Qgd2l0aCBhIGBwb3J0c2AgYXJyYXkgYW5kIGEgYG5hbWVgIHN0cmluZykuXG4gICAqL1xuICBwcml2YXRlIGlzUmF3RGVmaW5pdGlvbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgeyBuYW1lPzogdW5rbm93biB9KS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICBBcnJheS5pc0FycmF5KCh2YWx1ZSBhcyB7IHBvcnRzPzogdW5rbm93biB9KS5wb3J0cylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IGluY29taW5nIGVkZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluY29taW5nTWFwKFxuICAgIGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW11cbiAgKTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBtYXAuZ2V0KGVkZ2UudGFyZ2V0Tm9kZUlkKSA/PyBbXTtcbiAgICAgIGxpc3QucHVzaChlZGdlKTtcbiAgICAgIG1hcC5zZXQoZWRnZS50YXJnZXROb2RlSWQsIGxpc3QpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IG91dGdvaW5nIGVkZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE91dGdvaW5nTWFwKFxuICAgIGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW11cbiAgKTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBtYXAuZ2V0KGVkZ2Uuc291cmNlTm9kZUlkKSA/PyBbXTtcbiAgICAgIGxpc3QucHVzaChlZGdlKTtcbiAgICAgIG1hcC5zZXQoZWRnZS5zb3VyY2VOb2RlSWQsIGxpc3QpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIHRvcG9sb2dpY2FsIGxheWVycyB1c2luZyBLYWhuJ3MgYWxnb3JpdGhtLlxuICAgKlxuICAgKiBXb3JrZmxvdyBib3VuZGFyeSBlZGdlcyBkbyBub3QgY291bnQgYXMgZXhlY3V0YWJsZS1ub2RlIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHByaXZhdGUgdG9wb2xvZ2ljYWxMYXllcnMoXG4gICAgbm9kZXM6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSxcbiAgICBlZGdlczogR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdXG4gICk6IEdyYXBoRXhlY3V0aW9uUGxhbkxheWVyW10ge1xuICAgIGNvbnN0IGV4ZWN1dGFibGVOb2RlcyA9IG5vZGVzLmZpbHRlcihcbiAgICAgIChuKSA9PiBuLmlkICE9PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWVxuICAgICk7XG4gICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQoZXhlY3V0YWJsZU5vZGVzLm1hcCgobikgPT4gbi5pZCkpO1xuXG4gICAgLy8gT25seSBlZGdlcyBiZXR3ZWVuIHR3byBleGVjdXRhYmxlIG5vZGVzIGNvdW50IGFzIGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGV4ZWNFZGdlcyA9IGVkZ2VzLmZpbHRlcihcbiAgICAgIChlKSA9PiBub2RlSWRzLmhhcyhlLnNvdXJjZU5vZGVJZCkgJiYgbm9kZUlkcy5oYXMoZS50YXJnZXROb2RlSWQpXG4gICAgKTtcblxuICAgIC8vIENvbXB1dGUgaW4tZGVncmVlXG4gICAgY29uc3QgaW5kZWdyZWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBleGVjdXRhYmxlTm9kZXMpIGluZGVncmVlLnNldChub2RlLmlkLCAwKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZXhlY0VkZ2VzKSB7XG4gICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDApICsgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5ZXJzOiBHcmFwaEV4ZWN1dGlvblBsYW5MYXllcltdID0gW107XG4gICAgY29uc3QgcGxhbm5lZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCByZWFkeSA9IGV4ZWN1dGFibGVOb2Rlcy5maWx0ZXIoKG4pID0+IChpbmRlZ3JlZS5nZXQobi5pZCkgPz8gMCkgPT09IDApO1xuICAgIGxldCBsYXllckluZGV4ID0gMDtcblxuICAgIHdoaWxlIChyZWFkeS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXllcjogR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXIgPSB7IGluZGV4OiBsYXllckluZGV4KyssIG5vZGVzOiByZWFkeSB9O1xuICAgICAgbGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgY29uc3QgbmV4dFJlYWR5OiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZWFkeSkge1xuICAgICAgICBwbGFubmVkLmFkZChub2RlLmlkKTtcbiAgICAgICAgY29uc3Qgb3V0Z29pbmcgPSBleGVjRWRnZXMuZmlsdGVyKChlKSA9PiBlLnNvdXJjZU5vZGVJZCA9PT0gbm9kZS5pZCk7XG4gICAgICAgIGZvciAoY29uc3QgZWRnZSBvZiBvdXRnb2luZykge1xuICAgICAgICAgIGNvbnN0IGRlZyA9IChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDEpIC0gMTtcbiAgICAgICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIGRlZyk7XG4gICAgICAgICAgaWYgKGRlZyA9PT0gMCAmJiAhcGxhbm5lZC5oYXMoZWRnZS50YXJnZXROb2RlSWQpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gZXhlY3V0YWJsZU5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChuZXh0KSBuZXh0UmVhZHkucHVzaChuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlYWR5ID0gbmV4dFJlYWR5O1xuICAgIH1cblxuICAgIGlmIChwbGFubmVkLnNpemUgIT09IGV4ZWN1dGFibGVOb2Rlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVucGxhbm5lZCA9IGV4ZWN1dGFibGVOb2Rlc1xuICAgICAgICAuZmlsdGVyKChuKSA9PiAhcGxhbm5lZC5oYXMobi5pZCkpXG4gICAgICAgIC5tYXAoKG4pID0+IG4uaWQpO1xuICAgICAgdGhyb3cgbmV3IEdyYXBoQ3ljbGVFcnJvcih7XG4gICAgICAgIHVucGxhbm5lZE5vZGVzOiB1bnBsYW5uZWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IG5vZGVzWzBdPy5kZWZpbml0aW9uPy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { graphDefinitionOf } from "@decaf-ts/ui-decorators/graph";
|
|
2
|
+
import { GRAPH_WORKFLOW_BOUNDARY } from "./../constants.js";
|
|
3
|
+
import { GraphPortError } from "./../errors/GraphPortError.js";
|
|
4
|
+
import { GraphTopologyError } from "./../errors/GraphTopologyError.js";
|
|
5
|
+
/**
|
|
6
|
+
* Resolves raw workflow relation metadata into normalized execution edges.
|
|
7
|
+
*/
|
|
8
|
+
export class GraphRelationResolver {
|
|
9
|
+
/**
|
|
10
|
+
* Resolves all relations of a workflow into execution edges.
|
|
11
|
+
*
|
|
12
|
+
* @param workflow - The workflow definition.
|
|
13
|
+
* @returns Array of normalized edges.
|
|
14
|
+
* @throws {GraphTopologyError} when an endpoint is unknown or ambiguous.
|
|
15
|
+
* @throws {GraphPortError} when a referenced port is missing or unknown.
|
|
16
|
+
*/
|
|
17
|
+
resolve(workflow) {
|
|
18
|
+
const nodeIds = new Set(workflow.nodes.map((n) => n.id));
|
|
19
|
+
const boundaryAliases = this.boundaryAliases(workflow);
|
|
20
|
+
const inputPorts = this.portNames(workflow.inputs);
|
|
21
|
+
const outputPorts = this.portNames(workflow.outputs);
|
|
22
|
+
const nodePortMap = this.buildNodePortMap(workflow);
|
|
23
|
+
const edges = [];
|
|
24
|
+
for (const relation of workflow.relations ?? []) {
|
|
25
|
+
const edge = this.resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
26
|
+
edges.push(edge);
|
|
27
|
+
}
|
|
28
|
+
return edges;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolves a single relation into an edge.
|
|
32
|
+
*/
|
|
33
|
+
resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
|
|
34
|
+
const sourceNodeId = this.resolveEndpoint(relation.source, nodeIds, boundaryAliases);
|
|
35
|
+
const targetNodeId = this.resolveEndpoint(relation.target, nodeIds, boundaryAliases);
|
|
36
|
+
const sourcePort = relation.sourcePort;
|
|
37
|
+
const targetPort = relation.targetPort;
|
|
38
|
+
if (!sourcePort) {
|
|
39
|
+
throw new GraphPortError(`Relation is missing sourcePort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
|
|
40
|
+
}
|
|
41
|
+
if (!targetPort) {
|
|
42
|
+
throw new GraphPortError(`Relation is missing targetPort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
|
|
43
|
+
}
|
|
44
|
+
this.validatePort(sourceNodeId, sourcePort, true, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
45
|
+
this.validatePort(targetNodeId, targetPort, false, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
46
|
+
return {
|
|
47
|
+
id: this.createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort),
|
|
48
|
+
sourceNodeId,
|
|
49
|
+
sourcePort,
|
|
50
|
+
targetNodeId,
|
|
51
|
+
targetPort,
|
|
52
|
+
label: relation.label,
|
|
53
|
+
metadata: relation.metadata,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolves an endpoint (source or target) to a node id or the workflow boundary.
|
|
58
|
+
*/
|
|
59
|
+
resolveEndpoint(endpoint, nodeIds, boundaryAliases) {
|
|
60
|
+
const name = String(endpoint);
|
|
61
|
+
if (boundaryAliases.has(name))
|
|
62
|
+
return GRAPH_WORKFLOW_BOUNDARY;
|
|
63
|
+
if (nodeIds.has(name))
|
|
64
|
+
return name;
|
|
65
|
+
throw new GraphTopologyError(`Unknown endpoint '${name}'`, { endpoint: name, knownNodes: Array.from(nodeIds) });
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validates that a port exists on the given node or boundary.
|
|
69
|
+
*/
|
|
70
|
+
validatePort(nodeId, port, isSource, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
|
|
71
|
+
if (nodeId === GRAPH_WORKFLOW_BOUNDARY) {
|
|
72
|
+
const ports = isSource ? inputPorts : outputPorts;
|
|
73
|
+
if (!ports.has(port)) {
|
|
74
|
+
throw new GraphPortError(`Unknown ${isSource ? "input" : "output"} port '${port}' on workflow boundary`, { nodeId, port, isSource, available: Array.from(ports) });
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const nodePorts = nodePortMap.get(nodeId);
|
|
79
|
+
if (!nodePorts) {
|
|
80
|
+
throw new GraphTopologyError(`No port map for node '${nodeId}'`, {
|
|
81
|
+
nodeId,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const ports = isSource ? nodePorts.output : nodePorts.input;
|
|
85
|
+
if (!ports.has(port)) {
|
|
86
|
+
throw new GraphPortError(`Unknown ${isSource ? "output" : "input"} port '${port}' on node '${nodeId}'`, { nodeId, port, isSource, available: Array.from(ports) });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Builds the set of boundary aliases for a workflow.
|
|
91
|
+
*/
|
|
92
|
+
boundaryAliases(workflow) {
|
|
93
|
+
return new Set([
|
|
94
|
+
GRAPH_WORKFLOW_BOUNDARY,
|
|
95
|
+
"workflow",
|
|
96
|
+
"graph",
|
|
97
|
+
workflow.name,
|
|
98
|
+
]);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Extracts port names from a list of port definitions.
|
|
102
|
+
*/
|
|
103
|
+
portNames(ports) {
|
|
104
|
+
return new Set((ports ?? []).map((p) => p.name));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Builds a map of node id -> { input ports, output ports }.
|
|
108
|
+
*/
|
|
109
|
+
buildNodePortMap(workflow) {
|
|
110
|
+
const map = new Map();
|
|
111
|
+
for (const nodeMeta of workflow.nodes ?? []) {
|
|
112
|
+
const input = new Set();
|
|
113
|
+
const output = new Set();
|
|
114
|
+
const def = this.resolveNodeDefinition(nodeMeta);
|
|
115
|
+
if (def) {
|
|
116
|
+
for (const port of def.ports ?? []) {
|
|
117
|
+
if (port.direction === "input")
|
|
118
|
+
input.add(port.name);
|
|
119
|
+
else
|
|
120
|
+
output.add(port.name);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
map.set(nodeMeta.id, { input, output });
|
|
124
|
+
}
|
|
125
|
+
return map;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Attempts to resolve a node's full definition from its metadata.
|
|
129
|
+
*
|
|
130
|
+
* Accepts either a decorated Model class/instance (resolved via
|
|
131
|
+
* `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
|
|
132
|
+
* (useful for serialized workflows that inline node definitions).
|
|
133
|
+
*/
|
|
134
|
+
resolveNodeDefinition(nodeMeta) {
|
|
135
|
+
if (nodeMeta.node) {
|
|
136
|
+
if (this.isRawDefinition(nodeMeta.node)) {
|
|
137
|
+
return nodeMeta.node;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const def = graphDefinitionOf(nodeMeta.node);
|
|
141
|
+
return def;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
|
|
151
|
+
* (a plain object with a `ports` array and a `name` string).
|
|
152
|
+
*/
|
|
153
|
+
isRawDefinition(value) {
|
|
154
|
+
return (typeof value === "object" &&
|
|
155
|
+
value !== null &&
|
|
156
|
+
!Array.isArray(value) &&
|
|
157
|
+
typeof value.name === "string" &&
|
|
158
|
+
Array.isArray(value.ports));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Creates a stable edge id from its endpoints and ports.
|
|
162
|
+
*/
|
|
163
|
+
createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort) {
|
|
164
|
+
return `${sourceNodeId}:${sourcePort}->${targetNodeId}:${targetPort}`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2dyYXBoL2VuZ2luZS9wbGFubmluZy9HcmFwaFJlbGF0aW9uUmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDBCQUFxQjtBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLHNDQUFpQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMENBQXFDO0FBR2xFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQzs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLFFBQWlDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwRCxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO1FBRTNDLEtBQUssTUFBTSxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUMvQixRQUFRLEVBQ1IsT0FB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SUFDSyxxQkFBcUIsQ0FDM0IsUUFBMkM7UUFFM0MsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLFFBQVEsQ0FBQyxJQUVmLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFXLENBQUMsQ0FBQztnQkFDcEQsT0FBTyxHQUFVLENBQUM7WUFDcEIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlLENBQUMsS0FBYztRQUNwQyxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixLQUFLLEtBQUssSUFBSTtZQUNkLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDckIsT0FBUSxLQUE0QixDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3RELEtBQUssQ0FBQyxPQUFPLENBQUUsS0FBNkIsQ0FBQyxLQUFLLENBQUMsQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FDbEIsWUFBb0IsRUFDcEIsVUFBa0IsRUFDbEIsWUFBb0IsRUFDcEIsVUFBa0I7UUFFbEIsT0FBTyxHQUFHLFlBQVksSUFBSSxVQUFVLEtBQUssWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvcGxhbm5pbmcvR3JhcGhSZWxhdGlvblJlc29sdmVyXG4gKiBAc3VtbWFyeSBOb3JtYWxpemVzIHdvcmtmbG93IHJlbGF0aW9ucyBpbnRvIGV4ZWN1dGlvbiBlZGdlcy5cbiAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB3b3JrZmxvdyBib3VuZGFyeSBhbGlhc2VzLCB2YWxpZGF0ZXMgZW5kcG9pbnRzIGFuZCBwb3J0cywgYW5kIHByb2R1Y2VzIHN0YWJsZSBlZGdlIElEcy5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBHcmFwaFBvcnREZWZpbml0aW9uLFxuICBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbixcbiAgR3JhcGhXb3JrZmxvd1JlbGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuaW1wb3J0IHsgZ3JhcGhEZWZpbml0aW9uT2YgfSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcblxuaW1wb3J0IHsgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBHcmFwaFBvcnRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhQb3J0RXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoVG9wb2xvZ3lFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2UgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5FZGdlXCI7XG5cbi8qKlxuICogUmVzb2x2ZXMgcmF3IHdvcmtmbG93IHJlbGF0aW9uIG1ldGFkYXRhIGludG8gbm9ybWFsaXplZCBleGVjdXRpb24gZWRnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIge1xuICAvKipcbiAgICogUmVzb2x2ZXMgYWxsIHJlbGF0aW9ucyBvZiBhIHdvcmtmbG93IGludG8gZXhlY3V0aW9uIGVkZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgd29ya2Zsb3cgZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9ybWFsaXplZCBlZGdlcy5cbiAgICogQHRocm93cyB7R3JhcGhUb3BvbG9neUVycm9yfSB3aGVuIGFuIGVuZHBvaW50IGlzIHVua25vd24gb3IgYW1iaWd1b3VzLlxuICAgKiBAdGhyb3dzIHtHcmFwaFBvcnRFcnJvcn0gd2hlbiBhIHJlZmVyZW5jZWQgcG9ydCBpcyBtaXNzaW5nIG9yIHVua25vd24uXG4gICAqL1xuICByZXNvbHZlKHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbik6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXSB7XG4gICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQod29ya2Zsb3cubm9kZXMubWFwKChuKSA9PiBuLmlkKSk7XG4gICAgY29uc3QgYm91bmRhcnlBbGlhc2VzID0gdGhpcy5ib3VuZGFyeUFsaWFzZXMod29ya2Zsb3cpO1xuICAgIGNvbnN0IGlucHV0UG9ydHMgPSB0aGlzLnBvcnROYW1lcyh3b3JrZmxvdy5pbnB1dHMpO1xuICAgIGNvbnN0IG91dHB1dFBvcnRzID0gdGhpcy5wb3J0TmFtZXMod29ya2Zsb3cub3V0cHV0cyk7XG4gICAgY29uc3Qgbm9kZVBvcnRNYXAgPSB0aGlzLmJ1aWxkTm9kZVBvcnRNYXAod29ya2Zsb3cpO1xuXG4gICAgY29uc3QgZWRnZXM6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiB3b3JrZmxvdy5yZWxhdGlvbnMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSB0aGlzLnJlc29sdmVSZWxhdGlvbihcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIG5vZGVJZHMsXG4gICAgICAgIGJvdW5kYXJ5QWxpYXNlcyxcbiAgICAgICAgaW5wdXRQb3J0cyxcbiAgICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICAgIG5vZGVQb3J0TWFwXG4gICAgICApO1xuICAgICAgZWRnZXMucHVzaChlZGdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWRnZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBzaW5nbGUgcmVsYXRpb24gaW50byBhbiBlZGdlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUmVsYXRpb24oXG4gICAgcmVsYXRpb246IEdyYXBoV29ya2Zsb3dSZWxhdGlvbk1ldGFkYXRhLFxuICAgIG5vZGVJZHM6IFNldDxzdHJpbmc+LFxuICAgIGJvdW5kYXJ5QWxpYXNlczogU2V0PHN0cmluZz4sXG4gICAgaW5wdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgb3V0cHV0UG9ydHM6IFNldDxzdHJpbmc+LFxuICAgIG5vZGVQb3J0TWFwOiBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PlxuICApOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlIHtcbiAgICBjb25zdCBzb3VyY2VOb2RlSWQgPSB0aGlzLnJlc29sdmVFbmRwb2ludChcbiAgICAgIHJlbGF0aW9uLnNvdXJjZSxcbiAgICAgIG5vZGVJZHMsXG4gICAgICBib3VuZGFyeUFsaWFzZXNcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldE5vZGVJZCA9IHRoaXMucmVzb2x2ZUVuZHBvaW50KFxuICAgICAgcmVsYXRpb24udGFyZ2V0LFxuICAgICAgbm9kZUlkcyxcbiAgICAgIGJvdW5kYXJ5QWxpYXNlc1xuICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2VQb3J0ID0gcmVsYXRpb24uc291cmNlUG9ydDtcbiAgICBjb25zdCB0YXJnZXRQb3J0ID0gcmVsYXRpb24udGFyZ2V0UG9ydDtcblxuICAgIGlmICghc291cmNlUG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKFxuICAgICAgICBgUmVsYXRpb24gaXMgbWlzc2luZyBzb3VyY2VQb3J0IChzb3VyY2U6ICR7U3RyaW5nKHJlbGF0aW9uLnNvdXJjZSl9LCB0YXJnZXQ6ICR7U3RyaW5nKHJlbGF0aW9uLnRhcmdldCl9KWAsXG4gICAgICAgIHsgcmVsYXRpb24gfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXRQb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoXG4gICAgICAgIGBSZWxhdGlvbiBpcyBtaXNzaW5nIHRhcmdldFBvcnQgKHNvdXJjZTogJHtTdHJpbmcocmVsYXRpb24uc291cmNlKX0sIHRhcmdldDogJHtTdHJpbmcocmVsYXRpb24udGFyZ2V0KX0pYCxcbiAgICAgICAgeyByZWxhdGlvbiB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVQb3J0KFxuICAgICAgc291cmNlTm9kZUlkLFxuICAgICAgc291cmNlUG9ydCxcbiAgICAgIHRydWUsXG4gICAgICBib3VuZGFyeUFsaWFzZXMsXG4gICAgICBpbnB1dFBvcnRzLFxuICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICBub2RlUG9ydE1hcFxuICAgICk7XG4gICAgdGhpcy52YWxpZGF0ZVBvcnQoXG4gICAgICB0YXJnZXROb2RlSWQsXG4gICAgICB0YXJnZXRQb3J0LFxuICAgICAgZmFsc2UsXG4gICAgICBib3VuZGFyeUFsaWFzZXMsXG4gICAgICBpbnB1dFBvcnRzLFxuICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICBub2RlUG9ydE1hcFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuY3JlYXRlRWRnZUlkKHNvdXJjZU5vZGVJZCwgc291cmNlUG9ydCwgdGFyZ2V0Tm9kZUlkLCB0YXJnZXRQb3J0KSxcbiAgICAgIHNvdXJjZU5vZGVJZCxcbiAgICAgIHNvdXJjZVBvcnQsXG4gICAgICB0YXJnZXROb2RlSWQsXG4gICAgICB0YXJnZXRQb3J0LFxuICAgICAgbGFiZWw6IHJlbGF0aW9uLmxhYmVsLFxuICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLm1ldGFkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gZW5kcG9pbnQgKHNvdXJjZSBvciB0YXJnZXQpIHRvIGEgbm9kZSBpZCBvciB0aGUgd29ya2Zsb3cgYm91bmRhcnkuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVFbmRwb2ludChcbiAgICBlbmRwb2ludDogc3RyaW5nIHwgdW5rbm93bixcbiAgICBub2RlSWRzOiBTZXQ8c3RyaW5nPixcbiAgICBib3VuZGFyeUFsaWFzZXM6IFNldDxzdHJpbmc+XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhlbmRwb2ludCk7XG4gICAgaWYgKGJvdW5kYXJ5QWxpYXNlcy5oYXMobmFtZSkpIHJldHVybiBHUkFQSF9XT1JLRkxPV19CT1VOREFSWTtcbiAgICBpZiAobm9kZUlkcy5oYXMobmFtZSkpIHJldHVybiBuYW1lO1xuICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoXG4gICAgICBgVW5rbm93biBlbmRwb2ludCAnJHtuYW1lfSdgLFxuICAgICAgeyBlbmRwb2ludDogbmFtZSwga25vd25Ob2RlczogQXJyYXkuZnJvbShub2RlSWRzKSB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBhIHBvcnQgZXhpc3RzIG9uIHRoZSBnaXZlbiBub2RlIG9yIGJvdW5kYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBvcnQoXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgcG9ydDogc3RyaW5nLFxuICAgIGlzU291cmNlOiBib29sZWFuLFxuICAgIGJvdW5kYXJ5QWxpYXNlczogU2V0PHN0cmluZz4sXG4gICAgaW5wdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgb3V0cHV0UG9ydHM6IFNldDxzdHJpbmc+LFxuICAgIG5vZGVQb3J0TWFwOiBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PlxuICApOiB2b2lkIHtcbiAgICBpZiAobm9kZUlkID09PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSkge1xuICAgICAgY29uc3QgcG9ydHMgPSBpc1NvdXJjZSA/IGlucHV0UG9ydHMgOiBvdXRwdXRQb3J0cztcbiAgICAgIGlmICghcG9ydHMuaGFzKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFBvcnRFcnJvcihcbiAgICAgICAgICBgVW5rbm93biAke2lzU291cmNlID8gXCJpbnB1dFwiIDogXCJvdXRwdXRcIn0gcG9ydCAnJHtwb3J0fScgb24gd29ya2Zsb3cgYm91bmRhcnlgLFxuICAgICAgICAgIHsgbm9kZUlkLCBwb3J0LCBpc1NvdXJjZSwgYXZhaWxhYmxlOiBBcnJheS5mcm9tKHBvcnRzKSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZVBvcnRzID0gbm9kZVBvcnRNYXAuZ2V0KG5vZGVJZCk7XG4gICAgaWYgKCFub2RlUG9ydHMpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoYE5vIHBvcnQgbWFwIGZvciBub2RlICcke25vZGVJZH0nYCwge1xuICAgICAgICBub2RlSWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0cyA9IGlzU291cmNlID8gbm9kZVBvcnRzLm91dHB1dCA6IG5vZGVQb3J0cy5pbnB1dDtcbiAgICBpZiAoIXBvcnRzLmhhcyhwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKFxuICAgICAgICBgVW5rbm93biAke2lzU291cmNlID8gXCJvdXRwdXRcIiA6IFwiaW5wdXRcIn0gcG9ydCAnJHtwb3J0fScgb24gbm9kZSAnJHtub2RlSWR9J2AsXG4gICAgICAgIHsgbm9kZUlkLCBwb3J0LCBpc1NvdXJjZSwgYXZhaWxhYmxlOiBBcnJheS5mcm9tKHBvcnRzKSB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHNldCBvZiBib3VuZGFyeSBhbGlhc2VzIGZvciBhIHdvcmtmbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBib3VuZGFyeUFsaWFzZXMod29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgIEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZLFxuICAgICAgXCJ3b3JrZmxvd1wiLFxuICAgICAgXCJncmFwaFwiLFxuICAgICAgd29ya2Zsb3cubmFtZSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBwb3J0IG5hbWVzIGZyb20gYSBsaXN0IG9mIHBvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHBvcnROYW1lcyhwb3J0czogR3JhcGhQb3J0RGVmaW5pdGlvbltdIHwgdW5kZWZpbmVkKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgU2V0KChwb3J0cyA/PyBbXSkubWFwKChwKSA9PiBwLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBtYXAgb2Ygbm9kZSBpZCAtPiB7IGlucHV0IHBvcnRzLCBvdXRwdXQgcG9ydHMgfS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb2RlUG9ydE1hcChcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb25cbiAgKTogTWFwPHN0cmluZywgeyBpbnB1dDogU2V0PHN0cmluZz47IG91dHB1dDogU2V0PHN0cmluZz4gfT4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PigpO1xuICAgIGZvciAoY29uc3Qgbm9kZU1ldGEgb2Ygd29ya2Zsb3cubm9kZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBjb25zdCBvdXRwdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IGRlZiA9IHRoaXMucmVzb2x2ZU5vZGVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb3J0IG9mIGRlZi5wb3J0cyA/PyBbXSkge1xuICAgICAgICAgIGlmIChwb3J0LmRpcmVjdGlvbiA9PT0gXCJpbnB1dFwiKSBpbnB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgICBlbHNlIG91dHB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWFwLnNldChub2RlTWV0YS5pZCwgeyBpbnB1dCwgb3V0cHV0IH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgYSBub2RlJ3MgZnVsbCBkZWZpbml0aW9uIGZyb20gaXRzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAqIGBncmFwaERlZmluaXRpb25PZmApIG9yIGEgcGxhaW4gYEdyYXBoTm9kZURlZmluaXRpb25gLXNoYXBlZCBvYmplY3RcbiAgICogKHVzZWZ1bCBmb3Igc2VyaWFsaXplZCB3b3JrZmxvd3MgdGhhdCBpbmxpbmUgbm9kZSBkZWZpbml0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVOb2RlRGVmaW5pdGlvbihcbiAgICBub2RlTWV0YTogeyBub2RlPzogdW5rbm93bjsga2luZD86IHN0cmluZyB9XG4gICk6IHsgcG9ydHM6IHsgZGlyZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGVNZXRhLm5vZGUpIHtcbiAgICAgIGlmICh0aGlzLmlzUmF3RGVmaW5pdGlvbihub2RlTWV0YS5ub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZSBhcyB7XG4gICAgICAgICAgcG9ydHM6IHsgZGlyZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWYgPSBncmFwaERlZmluaXRpb25PZihub2RlTWV0YS5ub2RlIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBkZWYgYXMgYW55O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBhIHZhbHVlIGxvb2tzIGxpa2UgYSByYXcge0BsaW5rIEdyYXBoTm9kZURlZmluaXRpb259XG4gICAqIChhIHBsYWluIG9iamVjdCB3aXRoIGEgYHBvcnRzYCBhcnJheSBhbmQgYSBgbmFtZWAgc3RyaW5nKS5cbiAgICovXG4gIHByaXZhdGUgaXNSYXdEZWZpbml0aW9uKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHZhbHVlIGFzIHsgcG9ydHM/OiB1bmtub3duIH0pLnBvcnRzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YWJsZSBlZGdlIGlkIGZyb20gaXRzIGVuZHBvaW50cyBhbmQgcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVkZ2VJZChcbiAgICBzb3VyY2VOb2RlSWQ6IHN0cmluZyxcbiAgICBzb3VyY2VQb3J0OiBzdHJpbmcsXG4gICAgdGFyZ2V0Tm9kZUlkOiBzdHJpbmcsXG4gICAgdGFyZ2V0UG9ydDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3NvdXJjZU5vZGVJZH06JHtzb3VyY2VQb3J0fS0+JHt0YXJnZXROb2RlSWR9OiR7dGFyZ2V0UG9ydH1gO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topology utility for traversing the execution plan's edges.
|
|
3
|
+
*/
|
|
4
|
+
export class GraphTopology {
|
|
5
|
+
/**
|
|
6
|
+
* Returns the set of upstream node ids reachable from `nodeId` by following
|
|
7
|
+
* incoming edges. The workflow boundary node is excluded.
|
|
8
|
+
*/
|
|
9
|
+
static upstreamNodes(nodeId, incomingByNode, includeBoundary = false) {
|
|
10
|
+
const visited = new Set();
|
|
11
|
+
const stack = [nodeId];
|
|
12
|
+
while (stack.length) {
|
|
13
|
+
const current = stack.pop();
|
|
14
|
+
const incoming = incomingByNode.get(current) ?? [];
|
|
15
|
+
for (const edge of incoming) {
|
|
16
|
+
if (!includeBoundary && this.isBoundary(edge.sourceNodeId))
|
|
17
|
+
continue;
|
|
18
|
+
if (!visited.has(edge.sourceNodeId)) {
|
|
19
|
+
visited.add(edge.sourceNodeId);
|
|
20
|
+
stack.push(edge.sourceNodeId);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return visited;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns the set of downstream node ids reachable from `nodeId` by following
|
|
28
|
+
* outgoing edges. The workflow boundary node is excluded.
|
|
29
|
+
*/
|
|
30
|
+
static downstreamNodes(nodeId, outgoingByNode, includeBoundary = false) {
|
|
31
|
+
const visited = new Set();
|
|
32
|
+
const stack = [nodeId];
|
|
33
|
+
while (stack.length) {
|
|
34
|
+
const current = stack.pop();
|
|
35
|
+
const outgoing = outgoingByNode.get(current) ?? [];
|
|
36
|
+
for (const edge of outgoing) {
|
|
37
|
+
if (!includeBoundary && this.isBoundary(edge.targetNodeId))
|
|
38
|
+
continue;
|
|
39
|
+
if (!visited.has(edge.targetNodeId)) {
|
|
40
|
+
visited.add(edge.targetNodeId);
|
|
41
|
+
stack.push(edge.targetNodeId);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return visited;
|
|
46
|
+
}
|
|
47
|
+
/** Returns whether a node id is the workflow boundary. */
|
|
48
|
+
static isBoundary(nodeId) {
|
|
49
|
+
return nodeId === "$workflow";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhUb3BvbG9neS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvcGxhbm5pbmcvR3JhcGhUb3BvbG9neS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQTs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3hCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxhQUFhLENBQ2xCLE1BQWMsRUFDZCxjQUFxRCxFQUNyRCxlQUFlLEdBQUcsS0FBSztRQUV2QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRyxDQUFDO1lBQzdCLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25ELEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUFFLFNBQVM7Z0JBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUNwQixNQUFjLEVBQ2QsY0FBcUQsRUFDckQsZUFBZSxHQUFHLEtBQUs7UUFFdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUcsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFBRSxTQUFTO2dCQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsMERBQTBEO0lBQzFELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYztRQUM5QixPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7SUFDaEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9wbGFubmluZy9HcmFwaFRvcG9sb2d5XG4gKiBAc3VtbWFyeSBVdGlsaXR5IGhlbHBlcnMgZm9yIGdyYXBoIHRvcG9sb2d5IGFuYWx5c2lzLlxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSB0aGUgcGxhbm5lciBhbmQgcGlubmluZyBkZXBlbmRlbmN5IHJlc29sdmVyLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2UgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5FZGdlXCI7XG5cbi8qKlxuICogVG9wb2xvZ3kgdXRpbGl0eSBmb3IgdHJhdmVyc2luZyB0aGUgZXhlY3V0aW9uIHBsYW4ncyBlZGdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoVG9wb2xvZ3kge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2V0IG9mIHVwc3RyZWFtIG5vZGUgaWRzIHJlYWNoYWJsZSBmcm9tIGBub2RlSWRgIGJ5IGZvbGxvd2luZ1xuICAgKiBpbmNvbWluZyBlZGdlcy4gVGhlIHdvcmtmbG93IGJvdW5kYXJ5IG5vZGUgaXMgZXhjbHVkZWQuXG4gICAqL1xuICBzdGF0aWMgdXBzdHJlYW1Ob2RlcyhcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBpbmNvbWluZ0J5Tm9kZTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPixcbiAgICBpbmNsdWRlQm91bmRhcnkgPSBmYWxzZVxuICApOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHN0YWNrID0gW25vZGVJZF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGNvbnN0IGluY29taW5nID0gaW5jb21pbmdCeU5vZGUuZ2V0KGN1cnJlbnQpID8/IFtdO1xuICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGluY29taW5nKSB7XG4gICAgICAgIGlmICghaW5jbHVkZUJvdW5kYXJ5ICYmIHRoaXMuaXNCb3VuZGFyeShlZGdlLnNvdXJjZU5vZGVJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2Uuc291cmNlTm9kZUlkKSkge1xuICAgICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2Uuc291cmNlTm9kZUlkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGVkZ2Uuc291cmNlTm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlzaXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZG93bnN0cmVhbSBub2RlIGlkcyByZWFjaGFibGUgZnJvbSBgbm9kZUlkYCBieSBmb2xsb3dpbmdcbiAgICogb3V0Z29pbmcgZWRnZXMuIFRoZSB3b3JrZmxvdyBib3VuZGFyeSBub2RlIGlzIGV4Y2x1ZGVkLlxuICAgKi9cbiAgc3RhdGljIGRvd25zdHJlYW1Ob2RlcyhcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBvdXRnb2luZ0J5Tm9kZTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPixcbiAgICBpbmNsdWRlQm91bmRhcnkgPSBmYWxzZVxuICApOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHN0YWNrID0gW25vZGVJZF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGNvbnN0IG91dGdvaW5nID0gb3V0Z29pbmdCeU5vZGUuZ2V0KGN1cnJlbnQpID8/IFtdO1xuICAgICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGdvaW5nKSB7XG4gICAgICAgIGlmICghaW5jbHVkZUJvdW5kYXJ5ICYmIHRoaXMuaXNCb3VuZGFyeShlZGdlLnRhcmdldE5vZGVJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2UudGFyZ2V0Tm9kZUlkKSkge1xuICAgICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlzaXRlZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgYSBub2RlIGlkIGlzIHRoZSB3b3JrZmxvdyBib3VuZGFyeS4gKi9cbiAgc3RhdGljIGlzQm91bmRhcnkobm9kZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm9kZUlkID09PSBcIiR3b3JrZmxvd1wiO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/graph/planning
|
|
3
|
+
* @summary Graph execution planning.
|
|
4
|
+
* @description Re-exports the execution plan types, relation resolver, and topological planner.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./GraphExecutionPlanNode.js";
|
|
7
|
+
export * from "./GraphExecutionPlanEdge.js";
|
|
8
|
+
export * from "./GraphExecutionPlanLayer.js";
|
|
9
|
+
export * from "./GraphExecutionPlan.js";
|
|
10
|
+
export * from "./GraphRelationResolver.js";
|
|
11
|
+
export * from "./GraphExecutionPlanner.js";
|
|
12
|
+
export * from "./GraphTopology.js";
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL3BsYW5uaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCw0Q0FBeUM7QUFDekMsNENBQXlDO0FBQ3pDLDZDQUEwQztBQUMxQyx3Q0FBcUM7QUFDckMsMkNBQXdDO0FBQ3hDLDJDQUF3QztBQUN4QyxtQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL3BsYW5uaW5nXG4gKiBAc3VtbWFyeSBHcmFwaCBleGVjdXRpb24gcGxhbm5pbmcuXG4gKiBAZGVzY3JpcHRpb24gUmUtZXhwb3J0cyB0aGUgZXhlY3V0aW9uIHBsYW4gdHlwZXMsIHJlbGF0aW9uIHJlc29sdmVyLCBhbmQgdG9wb2xvZ2ljYWwgcGxhbm5lci5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTm9kZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuRWRnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhSZWxhdGlvblJlc29sdmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoVG9wb2xvZ3lcIjtcbiJdfQ==
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { GraphExecutionError } from "./../errors/GraphExecutionError.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registry that maps node `kind` strings to {@link GraphNodeExecutor}
|
|
4
|
+
* instances.
|
|
5
|
+
*/
|
|
6
|
+
export class GraphNodeExecutorRegistry {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.executors = new Map();
|
|
9
|
+
}
|
|
10
|
+
/** Registers an executor for the given node kind. */
|
|
11
|
+
register(kind, executor) {
|
|
12
|
+
if (!kind)
|
|
13
|
+
throw new GraphExecutionError("Graph executor kind is required");
|
|
14
|
+
this.executors.set(kind, executor);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
/** Removes the executor for the given node kind. */
|
|
18
|
+
unregister(kind) {
|
|
19
|
+
this.executors.delete(kind);
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
/** Returns whether an executor is registered for the given kind. */
|
|
23
|
+
has(kind) {
|
|
24
|
+
return this.executors.has(kind);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolves the executor for the given node kind.
|
|
28
|
+
*
|
|
29
|
+
* @throws {GraphExecutionError} when no executor is registered for `kind`.
|
|
30
|
+
*/
|
|
31
|
+
resolve(kind) {
|
|
32
|
+
const executor = this.executors.get(kind);
|
|
33
|
+
if (!executor) {
|
|
34
|
+
throw new GraphExecutionError(`No graph executor registered for kind '${kind}'`, "GRAPH_EXECUTOR_NOT_FOUND", { kind });
|
|
35
|
+
}
|
|
36
|
+
return executor;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvcmVnaXN0cnkvR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsMkNBQXNDO0FBRXBFOzs7R0FHRztBQUNILE1BQU0sT0FBTyx5QkFBeUI7SUFBdEM7UUFDbUIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBb0NwRSxDQUFDO0lBbENDLHFEQUFxRDtJQUNyRCxRQUFRLENBQUMsSUFBWSxFQUFFLFFBQTJCO1FBQ2hELElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLG1CQUFtQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxVQUFVLENBQUMsSUFBWTtRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsR0FBRyxDQUFDLElBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLElBQVk7UUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLG1CQUFtQixDQUMzQiwwQ0FBMEMsSUFBSSxHQUFHLEVBQ2pELDBCQUEwQixFQUMxQixFQUFFLElBQUksRUFBRSxDQUNULENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9yZWdpc3RyeS9HcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBSZWdpc3RyeSBmb3IgZ3JhcGggbm9kZSBleGVjdXRvcnMuXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBub2RlIGtpbmRzIHRvIHRoZWlyIGV4ZWN1dG9yIGltcGxlbWVudGF0aW9ucy4gVGhlIGVuZ2luZSByZXNvbHZlcyBleGVjdXRvcnMgYnkgbm9kZSBraW5kIGF0IGV4ZWN1dGlvbiB0aW1lLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoTm9kZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL2V4ZWN1dGlvbi9HcmFwaE5vZGVFeGVjdXRvclwiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhFeGVjdXRpb25FcnJvclwiO1xuXG4vKipcbiAqIFJlZ2lzdHJ5IHRoYXQgbWFwcyBub2RlIGBraW5kYCBzdHJpbmdzIHRvIHtAbGluayBHcmFwaE5vZGVFeGVjdXRvcn1cbiAqIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dG9ycyA9IG5ldyBNYXA8c3RyaW5nLCBHcmFwaE5vZGVFeGVjdXRvcj4oKTtcblxuICAvKiogUmVnaXN0ZXJzIGFuIGV4ZWN1dG9yIGZvciB0aGUgZ2l2ZW4gbm9kZSBraW5kLiAqL1xuICByZWdpc3RlcihraW5kOiBzdHJpbmcsIGV4ZWN1dG9yOiBHcmFwaE5vZGVFeGVjdXRvcik6IHRoaXMge1xuICAgIGlmICgha2luZCkgdGhyb3cgbmV3IEdyYXBoRXhlY3V0aW9uRXJyb3IoXCJHcmFwaCBleGVjdXRvciBraW5kIGlzIHJlcXVpcmVkXCIpO1xuICAgIHRoaXMuZXhlY3V0b3JzLnNldChraW5kLCBleGVjdXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogUmVtb3ZlcyB0aGUgZXhlY3V0b3IgZm9yIHRoZSBnaXZlbiBub2RlIGtpbmQuICovXG4gIHVucmVnaXN0ZXIoa2luZDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5leGVjdXRvcnMuZGVsZXRlKGtpbmQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIFJldHVybnMgd2hldGhlciBhbiBleGVjdXRvciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4ga2luZC4gKi9cbiAgaGFzKGtpbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dG9ycy5oYXMoa2luZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGV4ZWN1dG9yIGZvciB0aGUgZ2l2ZW4gbm9kZSBraW5kLlxuICAgKlxuICAgKiBAdGhyb3dzIHtHcmFwaEV4ZWN1dGlvbkVycm9yfSB3aGVuIG5vIGV4ZWN1dG9yIGlzIHJlZ2lzdGVyZWQgZm9yIGBraW5kYC5cbiAgICovXG4gIHJlc29sdmUoa2luZDogc3RyaW5nKTogR3JhcGhOb2RlRXhlY3V0b3Ige1xuICAgIGNvbnN0IGV4ZWN1dG9yID0gdGhpcy5leGVjdXRvcnMuZ2V0KGtpbmQpO1xuICAgIGlmICghZXhlY3V0b3IpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBgTm8gZ3JhcGggZXhlY3V0b3IgcmVnaXN0ZXJlZCBmb3Iga2luZCAnJHtraW5kfSdgLFxuICAgICAgICBcIkdSQVBIX0VYRUNVVE9SX05PVF9GT1VORFwiLFxuICAgICAgICB7IGtpbmQgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4ZWN1dG9yO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolver that wraps a {@link GraphNodeExecutorRegistry} and optionally
|
|
3
|
+
* falls back to a default executor when a kind is not found.
|
|
4
|
+
*/
|
|
5
|
+
export class GraphNodeExecutorResolver {
|
|
6
|
+
constructor(registry, defaultExecutor) {
|
|
7
|
+
this.registry = registry;
|
|
8
|
+
this.defaultExecutor = defaultExecutor;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolves the executor for `kind`, falling back to the default executor
|
|
12
|
+
* when provided.
|
|
13
|
+
*/
|
|
14
|
+
resolve(kind) {
|
|
15
|
+
if (this.registry.has(kind))
|
|
16
|
+
return this.registry.resolve(kind);
|
|
17
|
+
if (this.defaultExecutor)
|
|
18
|
+
return this.defaultExecutor;
|
|
19
|
+
return this.registry.resolve(kind);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhOb2RlRXhlY3V0b3JSZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvcmVnaXN0cnkvR3JhcGhOb2RlRXhlY3V0b3JSZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8seUJBQXlCO0lBR3BDLFlBQ21CLFFBQW1DLEVBQ3BELGVBQW1DO1FBRGxCLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBR3BELElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvcmVnaXN0cnkvR3JhcGhOb2RlRXhlY3V0b3JSZXNvbHZlclxuICogQHN1bW1hcnkgVXRpbGl0eSBmb3IgcmVzb2x2aW5nIGV4ZWN1dG9ycyBmcm9tIGEgcmVnaXN0cnkgd2l0aCBmYWxsYmFjay5cbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhIGhlbHBlciB0aGF0IGF0dGVtcHRzIHRvIHJlc29sdmUgYW4gZXhlY3V0b3IgYnkga2luZCwgZmFsbGluZyBiYWNrIHRvIGEgZGVmYXVsdCBleGVjdXRvciB3aGVuIHRoZSBraW5kIGlzIG5vdCByZWdpc3RlcmVkLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoTm9kZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL2V4ZWN1dGlvbi9HcmFwaE5vZGVFeGVjdXRvclwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4vR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeVwiO1xuXG4vKipcbiAqIFJlc29sdmVyIHRoYXQgd3JhcHMgYSB7QGxpbmsgR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeX0gYW5kIG9wdGlvbmFsbHlcbiAqIGZhbGxzIGJhY2sgdG8gYSBkZWZhdWx0IGV4ZWN1dG9yIHdoZW4gYSBraW5kIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoTm9kZUV4ZWN1dG9yUmVzb2x2ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRFeGVjdXRvcj86IEdyYXBoTm9kZUV4ZWN1dG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IEdyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnksXG4gICAgZGVmYXVsdEV4ZWN1dG9yPzogR3JhcGhOb2RlRXhlY3V0b3JcbiAgKSB7XG4gICAgdGhpcy5kZWZhdWx0RXhlY3V0b3IgPSBkZWZhdWx0RXhlY3V0b3I7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGV4ZWN1dG9yIGZvciBga2luZGAsIGZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdCBleGVjdXRvclxuICAgKiB3aGVuIHByb3ZpZGVkLlxuICAgKi9cbiAgcmVzb2x2ZShraW5kOiBzdHJpbmcpOiBHcmFwaE5vZGVFeGVjdXRvciB7XG4gICAgaWYgKHRoaXMucmVnaXN0cnkuaGFzKGtpbmQpKSByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKGtpbmQpO1xuICAgIGlmICh0aGlzLmRlZmF1bHRFeGVjdXRvcikgcmV0dXJuIHRoaXMuZGVmYXVsdEV4ZWN1dG9yO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoa2luZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/graph/registry
|
|
3
|
+
* @summary Graph node executor registry and resolver.
|
|
4
|
+
* @description Re-exports the executor registry and resolver.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./GraphNodeExecutorRegistry.js";
|
|
7
|
+
export * from "./GraphNodeExecutorResolver.js";
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL3JlZ2lzdHJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCwrQ0FBNEM7QUFDNUMsK0NBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9yZWdpc3RyeVxuICogQHN1bW1hcnkgR3JhcGggbm9kZSBleGVjdXRvciByZWdpc3RyeSBhbmQgcmVzb2x2ZXIuXG4gKiBAZGVzY3JpcHRpb24gUmUtZXhwb3J0cyB0aGUgZXhlY3V0b3IgcmVnaXN0cnkgYW5kIHJlc29sdmVyLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaE5vZGVFeGVjdXRvclJlc29sdmVyXCI7XG4iXX0=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/graph/snapshots/GraphExecutionSnapshotMapper
|
|
3
|
+
* @summary Maps execution results to snapshot patches.
|
|
4
|
+
* @description Produces a GraphExecutionSnapshotPatch consumable by `@decaf-ts/ui-decorators/graph` snapshots, rather than replacing the snapshot system.
|
|
5
|
+
*/
|
|
6
|
+
import { GraphExecutionStatus } from "./../../shared/constants.js";
|
|
7
|
+
/**
|
|
8
|
+
* Maps a {@link GraphExecutionResult} to a {@link GraphExecutionSnapshotPatch}.
|
|
9
|
+
*/
|
|
10
|
+
export class GraphExecutionSnapshotMapper {
|
|
11
|
+
/**
|
|
12
|
+
* Creates a snapshot patch from an execution result.
|
|
13
|
+
*/
|
|
14
|
+
map(result) {
|
|
15
|
+
const nodes = {};
|
|
16
|
+
for (const [id, nodeResult] of Object.entries(result.nodeResults)) {
|
|
17
|
+
nodes[id] = {
|
|
18
|
+
status: nodeResult.status,
|
|
19
|
+
startedAt: nodeResult.startedAt?.toISOString(),
|
|
20
|
+
finishedAt: nodeResult.finishedAt?.toISOString(),
|
|
21
|
+
error: nodeResult.error,
|
|
22
|
+
outputs: nodeResult.outputs,
|
|
23
|
+
fromCache: nodeResult.fromCache,
|
|
24
|
+
pinned: nodeResult.pinned,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const edges = {};
|
|
28
|
+
for (const event of result.events) {
|
|
29
|
+
if (event.edgeId && event.type === "edge.valueRouted") {
|
|
30
|
+
edges[event.edgeId] = {
|
|
31
|
+
status: GraphExecutionStatus.SUCCEEDED,
|
|
32
|
+
lastValue: event.payload?.value,
|
|
33
|
+
updatedAt: event.timestamp.toISOString(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const events = [...result.events];
|
|
38
|
+
return {
|
|
39
|
+
runId: result.runId,
|
|
40
|
+
status: result.status,
|
|
41
|
+
nodes,
|
|
42
|
+
edges,
|
|
43
|
+
outputs: result.outputs,
|
|
44
|
+
events,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25TbmFwc2hvdE1hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvc25hcHNob3RzL0dyYXBoRXhlY3V0aW9uU25hcHNob3RNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQ0FBK0I7QUFPOUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDOztPQUVHO0lBQ0gsR0FBRyxDQUFDLE1BQTRCO1FBQzlCLE1BQU0sS0FBSyxHQUF5QyxFQUFFLENBQUM7UUFDdkQsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDbEUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHO2dCQUNWLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtnQkFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFO2dCQUM5QyxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUU7Z0JBQ2hELEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztnQkFDdkIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO2dCQUMzQixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7Z0JBQy9CLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTthQUMxQixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sS0FBSyxHQUF5QyxFQUFFLENBQUM7UUFDdkQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRztvQkFDcEIsTUFBTSxFQUFFLG9CQUFvQixDQUFDLFNBQVM7b0JBQ3RDLFNBQVMsRUFBRyxLQUFLLENBQUMsT0FBZSxFQUFFLEtBQUs7b0JBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtpQkFDekMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQTBCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekQsT0FBTztZQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsS0FBSztZQUNMLEtBQUs7WUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL3NuYXBzaG90cy9HcmFwaEV4ZWN1dGlvblNuYXBzaG90TWFwcGVyXG4gKiBAc3VtbWFyeSBNYXBzIGV4ZWN1dGlvbiByZXN1bHRzIHRvIHNuYXBzaG90IHBhdGNoZXMuXG4gKiBAZGVzY3JpcHRpb24gUHJvZHVjZXMgYSBHcmFwaEV4ZWN1dGlvblNuYXBzaG90UGF0Y2ggY29uc3VtYWJsZSBieSBgQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhgIHNuYXBzaG90cywgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIHRoZSBzbmFwc2hvdCBzeXN0ZW0uXG4gKi9cbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uU3RhdHVzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgR3JhcGhFeGVjdXRpb25FdmVudCxcbiAgR3JhcGhFeGVjdXRpb25SZXN1bHQsXG4gIEdyYXBoRXhlY3V0aW9uU25hcHNob3RQYXRjaCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogTWFwcyBhIHtAbGluayBHcmFwaEV4ZWN1dGlvblJlc3VsdH0gdG8gYSB7QGxpbmsgR3JhcGhFeGVjdXRpb25TbmFwc2hvdFBhdGNofS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uU25hcHNob3RNYXBwZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHNuYXBzaG90IHBhdGNoIGZyb20gYW4gZXhlY3V0aW9uIHJlc3VsdC5cbiAgICovXG4gIG1hcChyZXN1bHQ6IEdyYXBoRXhlY3V0aW9uUmVzdWx0KTogR3JhcGhFeGVjdXRpb25TbmFwc2hvdFBhdGNoIHtcbiAgICBjb25zdCBub2RlczogR3JhcGhFeGVjdXRpb25TbmFwc2hvdFBhdGNoW1wibm9kZXNcIl0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbm9kZVJlc3VsdF0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0Lm5vZGVSZXN1bHRzKSkge1xuICAgICAgbm9kZXNbaWRdID0ge1xuICAgICAgICBzdGF0dXM6IG5vZGVSZXN1bHQuc3RhdHVzLFxuICAgICAgICBzdGFydGVkQXQ6IG5vZGVSZXN1bHQuc3RhcnRlZEF0Py50b0lTT1N0cmluZygpLFxuICAgICAgICBmaW5pc2hlZEF0OiBub2RlUmVzdWx0LmZpbmlzaGVkQXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGVycm9yOiBub2RlUmVzdWx0LmVycm9yLFxuICAgICAgICBvdXRwdXRzOiBub2RlUmVzdWx0Lm91dHB1dHMsXG4gICAgICAgIGZyb21DYWNoZTogbm9kZVJlc3VsdC5mcm9tQ2FjaGUsXG4gICAgICAgIHBpbm5lZDogbm9kZVJlc3VsdC5waW5uZWQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblNuYXBzaG90UGF0Y2hbXCJlZGdlc1wiXSA9IHt9O1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgcmVzdWx0LmV2ZW50cykge1xuICAgICAgaWYgKGV2ZW50LmVkZ2VJZCAmJiBldmVudC50eXBlID09PSBcImVkZ2UudmFsdWVSb3V0ZWRcIikge1xuICAgICAgICBlZGdlc1tldmVudC5lZGdlSWRdID0ge1xuICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuU1VDQ0VFREVELFxuICAgICAgICAgIGxhc3RWYWx1ZTogKGV2ZW50LnBheWxvYWQgYXMgYW55KT8udmFsdWUsXG4gICAgICAgICAgdXBkYXRlZEF0OiBldmVudC50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBldmVudHM6IEdyYXBoRXhlY3V0aW9uRXZlbnRbXSA9IFsuLi5yZXN1bHQuZXZlbnRzXTtcblxuICAgIHJldHVybiB7XG4gICAgICBydW5JZDogcmVzdWx0LnJ1bklkLFxuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgbm9kZXMsXG4gICAgICBlZGdlcyxcbiAgICAgIG91dHB1dHM6IHJlc3VsdC5vdXRwdXRzLFxuICAgICAgZXZlbnRzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|