@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,98 @@
|
|
|
1
|
+
import { GraphExecutionError } from "./../errors/GraphExecutionError.js";
|
|
2
|
+
import { ConditionExpressionEvaluator } from "./../loops/ConditionExpressionEvaluator.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reads the Switch metadata from the node definition's graph metadata.
|
|
5
|
+
*/
|
|
6
|
+
function readSwitchMetadata(context) {
|
|
7
|
+
const meta = context.node.graph?.metadata;
|
|
8
|
+
if (!meta)
|
|
9
|
+
return { cases: [], defaultPort: "default" };
|
|
10
|
+
const switchMeta = meta["switch"];
|
|
11
|
+
if (!switchMeta || !Array.isArray(switchMeta.cases)) {
|
|
12
|
+
return { cases: [], defaultPort: "default" };
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
cases: switchMeta.cases,
|
|
16
|
+
defaultPort: switchMeta.defaultPort ?? "default",
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Detects whether a condition is a `CodeCondition` (has `type: "code"`).
|
|
21
|
+
*/
|
|
22
|
+
function isCodeCondition(cond) {
|
|
23
|
+
return (typeof cond === "object" &&
|
|
24
|
+
cond !== null &&
|
|
25
|
+
"type" in cond &&
|
|
26
|
+
cond.type === "code");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Detects whether a condition is a `ConditionExpression` (has `op` field).
|
|
30
|
+
*/
|
|
31
|
+
function isConditionExpression(cond) {
|
|
32
|
+
return (typeof cond === "object" &&
|
|
33
|
+
cond !== null &&
|
|
34
|
+
"op" in cond &&
|
|
35
|
+
typeof cond.op === "string");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Executor for `core.flow.switch` nodes.
|
|
39
|
+
*
|
|
40
|
+
* Evaluates each case's condition in order and routes the input to the
|
|
41
|
+
* first matching case's output port. When no case matches, routes to the
|
|
42
|
+
* `default` output port.
|
|
43
|
+
*
|
|
44
|
+
* Condition evaluation:
|
|
45
|
+
* - `ConditionExpression` — evaluated via {@link ConditionExpressionEvaluator}.
|
|
46
|
+
* - `CodeCondition` — evaluated via the pluggable {@link CodeSandboxEvaluator}
|
|
47
|
+
* from the engine's config. Throws `GRAPH_CODE_SANDBOX_NOT_CONFIGURED`
|
|
48
|
+
* when no evaluator is registered.
|
|
49
|
+
*/
|
|
50
|
+
export class SwitchGraphNodeExecutor {
|
|
51
|
+
constructor(engine) {
|
|
52
|
+
this.engine = engine;
|
|
53
|
+
this.expressionEvaluator = new ConditionExpressionEvaluator();
|
|
54
|
+
}
|
|
55
|
+
async execute(input, context) {
|
|
56
|
+
const meta = readSwitchMetadata(context);
|
|
57
|
+
const inputValue = input["value"] ?? input;
|
|
58
|
+
for (const switchCase of meta.cases) {
|
|
59
|
+
const matches = await this.evaluateCondition(switchCase.condition, inputValue, input, context);
|
|
60
|
+
if (matches) {
|
|
61
|
+
return { [switchCase.outputPort]: inputValue };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const defaultPort = meta.defaultPort ?? "default";
|
|
65
|
+
return { [defaultPort]: inputValue };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Evaluates a single switch case condition.
|
|
69
|
+
*/
|
|
70
|
+
async evaluateCondition(condition, inputValue, fullInput, context) {
|
|
71
|
+
if (isCodeCondition(condition)) {
|
|
72
|
+
return this.evaluateCodeCondition(condition, fullInput, context);
|
|
73
|
+
}
|
|
74
|
+
if (isConditionExpression(condition)) {
|
|
75
|
+
return this.expressionEvaluator.evaluate(condition, inputValue);
|
|
76
|
+
}
|
|
77
|
+
throw new GraphExecutionError("Unknown switch case condition type — must be ConditionExpression (op) or CodeCondition (type: 'code')", "GRAPH_UNKNOWN_SWITCH_CONDITION", { condition });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Evaluates a code condition via the pluggable sandbox evaluator.
|
|
81
|
+
*/
|
|
82
|
+
async evaluateCodeCondition(condition, input, context) {
|
|
83
|
+
const evaluator = this.engine?.codeSandboxEvaluator;
|
|
84
|
+
if (!evaluator) {
|
|
85
|
+
throw new GraphExecutionError("Code conditions require a CodeSandboxEvaluator to be registered in GraphExecutionEngineConfig.codeSandboxEvaluator", "GRAPH_CODE_SANDBOX_NOT_CONFIGURED", { code: condition.code });
|
|
86
|
+
}
|
|
87
|
+
await context.log(`Evaluating code condition`, {
|
|
88
|
+
language: condition.language ?? "javascript",
|
|
89
|
+
});
|
|
90
|
+
const result = await evaluator.evaluate({
|
|
91
|
+
code: condition.code,
|
|
92
|
+
language: condition.language,
|
|
93
|
+
input,
|
|
94
|
+
});
|
|
95
|
+
return !!result;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3dpdGNoR3JhcGhOb2RlRXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL2V4ZWN1dGlvbi9Td2l0Y2hHcmFwaE5vZGVFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDJDQUFzQztBQUNwRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsbURBQThDO0FBR3JGOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsT0FBOEI7SUFFOUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFFcEIsQ0FBQztJQUNkLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQW1DLENBQUM7SUFDcEUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVyxJQUFJLFNBQVM7S0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLElBQXlCO0lBQ2hELE9BQU8sQ0FDTCxPQUFPLElBQUksS0FBSyxRQUFRO1FBQ3hCLElBQUksS0FBSyxJQUFJO1FBQ2IsTUFBTSxJQUFJLElBQUk7UUFDZCxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FDckIsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FF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XG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9leGVjdXRpb24vU3dpdGNoR3JhcGhOb2RlRXhlY3V0b3JcbiAqIEBzdW1tYXJ5IEV4ZWN1dG9yIGZvciB0aGUgU3dpdGNoIGZsb3ctY29udHJvbCBub2RlIChERUNBRi0zMiDCpzIyLjIuMikuXG4gKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGVhY2ggY2FzZSdzIGNvbmRpdGlvbiBhZ2FpbnN0IHRoZSBub2RlJ3MgaW5wdXQgYW5kXG4gKiByb3V0ZXMgdGhlIGlucHV0IHRvIHRoZSBmaXJzdCBtYXRjaGluZyBjYXNlJ3Mgb3V0cHV0IHBvcnQuIEZhbGxzIGJhY2sgdG9cbiAqIHRoZSBgZGVmYXVsdGAgb3V0cHV0IHdoZW4gbm8gY2FzZSBtYXRjaGVzLiBTdXBwb3J0cyBib3RoXG4gKiB7QGxpbmsgQ29uZGl0aW9uRXhwcmVzc2lvbn0gKGdyYXBoaWNhbCBtb2RlKSBhbmQge0BsaW5rIENvZGVDb25kaXRpb259XG4gKiAoY29kZSBtb2RlIHZpYSB0aGUgcGx1Z2dhYmxlIHtAbGluayBDb2RlU2FuZGJveEV2YWx1YXRvcn0pLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoTm9kZUV4ZWN1dG9yIH0gZnJvbSBcIi4vR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uVmFsdWVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN3aXRjaENhc2VDb25kaXRpb24sXG4gIFN3aXRjaE5vZGVNZXRhZGF0YSxcbiAgQ29uZGl0aW9uRXhwcmVzc2lvbixcbiAgQ29kZUNvbmRpdGlvbixcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhFeGVjdXRpb25FcnJvclwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvciB9IGZyb20gXCIuLi9sb29wcy9Db25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yXCI7XG5pbXBvcnQgdHlwZSB7IENvZGVTYW5kYm94RXZhbHVhdG9yIH0gZnJvbSBcIi4vQ29kZVNhbmRib3hFdmFsdWF0b3JcIjtcblxuLyoqXG4gKiBSZWFkcyB0aGUgU3dpdGNoIG1ldGFkYXRhIGZyb20gdGhlIG5vZGUgZGVmaW5pdGlvbidzIGdyYXBoIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiByZWFkU3dpdGNoTWV0YWRhdGEoXG4gIGNvbnRleHQ6IEdyYXBoRXhlY3V0aW9uQ29udGV4dFxuKTogU3dpdGNoTm9kZU1ldGFkYXRhIHtcbiAgY29uc3QgbWV0YSA9IGNvbnRleHQubm9kZS5ncmFwaD8ubWV0YWRhdGEgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmICghbWV0YSkgcmV0dXJuIHsgY2FzZXM6IFtdLCBkZWZhdWx0UG9ydDogXCJkZWZhdWx0XCIgfTtcbiAgY29uc3Qgc3dpdGNoTWV0YSA9IG1ldGFbXCJzd2l0Y2hcIl0gYXMgU3dpdGNoTm9kZU1ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICBpZiAoIXN3aXRjaE1ldGEgfHwgIUFycmF5LmlzQXJyYXkoc3dpdGNoTWV0YS5jYXNlcykpIHtcbiAgICByZXR1cm4geyBjYXNlczogW10sIGRlZmF1bHRQb3J0OiBcImRlZmF1bHRcIiB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgY2FzZXM6IHN3aXRjaE1ldGEuY2FzZXMsXG4gICAgZGVmYXVsdFBvcnQ6IHN3aXRjaE1ldGEuZGVmYXVsdFBvcnQgPz8gXCJkZWZhdWx0XCIsXG4gIH07XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGEgY29uZGl0aW9uIGlzIGEgYENvZGVDb25kaXRpb25gIChoYXMgYHR5cGU6IFwiY29kZVwiYCkuXG4gKi9cbmZ1bmN0aW9uIGlzQ29kZUNvbmRpdGlvbihjb25kOiBTd2l0Y2hDYXNlQ29uZGl0aW9uKTogY29uZCBpcyBDb2RlQ29uZGl0aW9uIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY29uZCA9PT0gXCJvYmplY3RcIiAmJlxuICAgIGNvbmQgIT09IG51bGwgJiZcbiAgICBcInR5cGVcIiBpbiBjb25kICYmXG4gICAgY29uZC50eXBlID09PSBcImNvZGVcIlxuICApO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBhIGNvbmRpdGlvbiBpcyBhIGBDb25kaXRpb25FeHByZXNzaW9uYCAoaGFzIGBvcGAgZmllbGQpLlxuICovXG5mdW5jdGlvbiBpc0NvbmRpdGlvbkV4cHJlc3Npb24oXG4gIGNvbmQ6IFN3aXRjaENhc2VDb25kaXRpb25cbik6IGNvbmQgaXMgQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGNvbmQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBjb25kICE9PSBudWxsICYmXG4gICAgXCJvcFwiIGluIGNvbmQgJiZcbiAgICB0eXBlb2YgY29uZC5vcCA9PT0gXCJzdHJpbmdcIlxuICApO1xufVxuXG4vKipcbiAqIEV4ZWN1dG9yIGZvciBgY29yZS5mbG93LnN3aXRjaGAgbm9kZXMuXG4gKlxuICogRXZhbHVhdGVzIGVhY2ggY2FzZSdzIGNvbmRpdGlvbiBpbiBvcmRlciBhbmQgcm91dGVzIHRoZSBpbnB1dCB0byB0aGVcbiAqIGZpcnN0IG1hdGNoaW5nIGNhc2UncyBvdXRwdXQgcG9ydC4gV2hlbiBubyBjYXNlIG1hdGNoZXMsIHJvdXRlcyB0byB0aGVcbiAqIGBkZWZhdWx0YCBvdXRwdXQgcG9ydC5cbiAqXG4gKiBDb25kaXRpb24gZXZhbHVhdGlvbjpcbiAqIC0gYENvbmRpdGlvbkV4cHJlc3Npb25gIOKAlCBldmFsdWF0ZWQgdmlhIHtAbGluayBDb25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yfS5cbiAqIC0gYENvZGVDb25kaXRpb25gIOKAlCBldmFsdWF0ZWQgdmlhIHRoZSBwbHVnZ2FibGUge0BsaW5rIENvZGVTYW5kYm94RXZhbHVhdG9yfVxuICogICBmcm9tIHRoZSBlbmdpbmUncyBjb25maWcuIFRocm93cyBgR1JBUEhfQ09ERV9TQU5EQk9YX05PVF9DT05GSUdVUkVEYFxuICogICB3aGVuIG5vIGV2YWx1YXRvciBpcyByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgY2xhc3MgU3dpdGNoR3JhcGhOb2RlRXhlY3V0b3IgaW1wbGVtZW50cyBHcmFwaE5vZGVFeGVjdXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwcmVzc2lvbkV2YWx1YXRvciA9IG5ldyBDb25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbmdpbmU/OiB7IGNvZGVTYW5kYm94RXZhbHVhdG9yPzogQ29kZVNhbmRib3hFdmFsdWF0b3IgfVxuICApIHt9XG5cbiAgYXN5bmMgZXhlY3V0ZShcbiAgICBpbnB1dDogR3JhcGhFeGVjdXRpb25WYWx1ZXMsXG4gICAgY29udGV4dDogR3JhcGhFeGVjdXRpb25Db250ZXh0XG4gICk6IFByb21pc2U8R3JhcGhFeGVjdXRpb25WYWx1ZXM+IHtcbiAgICBjb25zdCBtZXRhID0gcmVhZFN3aXRjaE1ldGFkYXRhKGNvbnRleHQpO1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSBpbnB1dFtcInZhbHVlXCJdID8/IGlucHV0O1xuXG4gICAgZm9yIChjb25zdCBzd2l0Y2hDYXNlIG9mIG1ldGEuY2FzZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKFxuICAgICAgICBzd2l0Y2hDYXNlLmNvbmRpdGlvbixcbiAgICAgICAgaW5wdXRWYWx1ZSxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICByZXR1cm4geyBbc3dpdGNoQ2FzZS5vdXRwdXRQb3J0XTogaW5wdXRWYWx1ZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gbWV0YS5kZWZhdWx0UG9ydCA/PyBcImRlZmF1bHRcIjtcbiAgICByZXR1cm4geyBbZGVmYXVsdFBvcnRdOiBpbnB1dFZhbHVlIH07XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc2luZ2xlIHN3aXRjaCBjYXNlIGNvbmRpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbHVhdGVDb25kaXRpb24oXG4gICAgY29uZGl0aW9uOiBTd2l0Y2hDYXNlQ29uZGl0aW9uLFxuICAgIGlucHV0VmFsdWU6IHVua25vd24sXG4gICAgZnVsbElucHV0OiBHcmFwaEV4ZWN1dGlvblZhbHVlcyxcbiAgICBjb250ZXh0OiBHcmFwaEV4ZWN1dGlvbkNvbnRleHRcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGlzQ29kZUNvbmRpdGlvbihjb25kaXRpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZUNvZGVDb25kaXRpb24oY29uZGl0aW9uLCBmdWxsSW5wdXQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbmRpdGlvbkV4cHJlc3Npb24oY29uZGl0aW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbkV2YWx1YXRvci5ldmFsdWF0ZShjb25kaXRpb24sIGlucHV0VmFsdWUpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgXCJVbmtub3duIHN3aXRjaCBjYXNlIGNvbmRpdGlvbiB0eXBlIOKAlCBtdXN0IGJlIENvbmRpdGlvbkV4cHJlc3Npb24gKG9wKSBvciBDb2RlQ29uZGl0aW9uICh0eXBlOiAnY29kZScpXCIsXG4gICAgICBcIkdSQVBIX1VOS05PV05fU1dJVENIX0NPTkRJVElPTlwiLFxuICAgICAgeyBjb25kaXRpb24gfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgY29kZSBjb25kaXRpb24gdmlhIHRoZSBwbHVnZ2FibGUgc2FuZGJveCBldmFsdWF0b3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV2YWx1YXRlQ29kZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvZGVDb25kaXRpb24sXG4gICAgaW5wdXQ6IEdyYXBoRXhlY3V0aW9uVmFsdWVzLFxuICAgIGNvbnRleHQ6IEdyYXBoRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBldmFsdWF0b3IgPSB0aGlzLmVuZ2luZT8uY29kZVNhbmRib3hFdmFsdWF0b3I7XG4gICAgaWYgKCFldmFsdWF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcIkNvZGUgY29uZGl0aW9ucyByZXF1aXJlIGEgQ29kZVNhbmRib3hFdmFsdWF0b3IgdG8gYmUgcmVnaXN0ZXJlZCBpbiBHcmFwaEV4ZWN1dGlvbkVuZ2luZUNvbmZpZy5jb2RlU2FuZGJveEV2YWx1YXRvclwiLFxuICAgICAgICBcIkdSQVBIX0NPREVfU0FOREJPWF9OT1RfQ09ORklHVVJFRFwiLFxuICAgICAgICB7IGNvZGU6IGNvbmRpdGlvbi5jb2RlIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgY29udGV4dC5sb2coYEV2YWx1YXRpbmcgY29kZSBjb25kaXRpb25gLCB7XG4gICAgICBsYW5ndWFnZTogY29uZGl0aW9uLmxhbmd1YWdlID8/IFwiamF2YXNjcmlwdFwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXZhbHVhdG9yLmV2YWx1YXRlKHtcbiAgICAgIGNvZGU6IGNvbmRpdGlvbi5jb2RlLFxuICAgICAgbGFuZ3VhZ2U6IGNvbmRpdGlvbi5sYW5ndWFnZSxcbiAgICAgIGlucHV0LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICEhcmVzdWx0O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/graph/execution
|
|
3
|
+
* @summary Graph execution context and executor interface.
|
|
4
|
+
* @description Re-exports the graph execution context and node executor interface.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./GraphExecutionContext.js";
|
|
7
|
+
export * from "./GraphNodeExecutor.js";
|
|
8
|
+
export * from "./GraphExecutionResult.js";
|
|
9
|
+
export * from "./GraphExecutionFrame.js";
|
|
10
|
+
export * from "./GraphExecutionEngine.js";
|
|
11
|
+
export * from "./CodeSandboxEvaluator.js";
|
|
12
|
+
export * from "./SwitchGraphNodeExecutor.js";
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL2V4ZWN1dGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsMkNBQXdDO0FBQ3hDLHVDQUFvQztBQUNwQywwQ0FBdUM7QUFDdkMseUNBQXNDO0FBQ3RDLDBDQUF1QztBQUN2QywwQ0FBdUM7QUFDdkMsNkNBQTBDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9leGVjdXRpb25cbiAqIEBzdW1tYXJ5IEdyYXBoIGV4ZWN1dGlvbiBjb250ZXh0IGFuZCBleGVjdXRvciBpbnRlcmZhY2UuXG4gKiBAZGVzY3JpcHRpb24gUmUtZXhwb3J0cyB0aGUgZ3JhcGggZXhlY3V0aW9uIGNvbnRleHQgYW5kIG5vZGUgZXhlY3V0b3IgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkNvbnRleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoTm9kZUV4ZWN1dG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblJlc3VsdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25GcmFtZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25FbmdpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0NvZGVTYW5kYm94RXZhbHVhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Td2l0Y2hHcmFwaE5vZGVFeGVjdXRvclwiO1xuIl19
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/graph/engine
|
|
3
|
+
* @summary Graph execution engine (backend-only).
|
|
4
|
+
* @description Reference interpreter for Decaf graph workflows. Executes
|
|
5
|
+
* workflows declared with `@decaf-ts/ui-decorators/graph`, emits events
|
|
6
|
+
* through Decaf's Observable pipeline, supports structured loops, configurable
|
|
7
|
+
* value stores, and pinnable/cacheable nodes.
|
|
8
|
+
*
|
|
9
|
+
* Re-exports `../shared` so backend consumers have a single import surface.
|
|
10
|
+
*/
|
|
11
|
+
// Re-export frontend-safe declarations so backend consumers have one surface.
|
|
12
|
+
export * from "./../shared/index.js";
|
|
13
|
+
export * from "./constants.js";
|
|
14
|
+
export * from "./types.js";
|
|
15
|
+
export * from "./decorators.js";
|
|
16
|
+
export * from "./errors/GraphExecutionError.js";
|
|
17
|
+
export * from "./errors/GraphCycleError.js";
|
|
18
|
+
export * from "./errors/GraphInputError.js";
|
|
19
|
+
export * from "./errors/GraphLoopLimitError.js";
|
|
20
|
+
export * from "./errors/GraphPinningError.js";
|
|
21
|
+
export * from "./errors/GraphPortError.js";
|
|
22
|
+
export * from "./errors/GraphStoreError.js";
|
|
23
|
+
export * from "./errors/GraphTopologyError.js";
|
|
24
|
+
export * from "./events/GraphExecutionEvent.js";
|
|
25
|
+
export * from "./events/GraphExecutionObserver.js";
|
|
26
|
+
export * from "./events/GraphExecutionEventEmitter.js";
|
|
27
|
+
export * from "./events/GraphExecutionEventFactory.js";
|
|
28
|
+
export * from "./execution/GraphExecutionContext.js";
|
|
29
|
+
export * from "./execution/GraphNodeExecutor.js";
|
|
30
|
+
export * from "./execution/GraphExecutionFrame.js";
|
|
31
|
+
export * from "./execution/GraphExecutionResult.js";
|
|
32
|
+
export * from "./execution/GraphExecutionEngine.js";
|
|
33
|
+
export * from "./execution/CodeSandboxEvaluator.js";
|
|
34
|
+
export * from "./execution/SwitchGraphNodeExecutor.js";
|
|
35
|
+
export * from "./registry/GraphNodeExecutorRegistry.js";
|
|
36
|
+
export * from "./registry/GraphNodeExecutorResolver.js";
|
|
37
|
+
export * from "./store/GraphValueKey.js";
|
|
38
|
+
export * from "./store/GraphCachedValue.js";
|
|
39
|
+
export * from "./store/GraphValueStoreAdapter.js";
|
|
40
|
+
export * from "./store/InMemoryGraphValueStoreAdapter.js";
|
|
41
|
+
export * from "./store/GraphValueStore.js";
|
|
42
|
+
export * from "./planning/GraphExecutionPlanNode.js";
|
|
43
|
+
export * from "./planning/GraphExecutionPlanEdge.js";
|
|
44
|
+
export * from "./planning/GraphExecutionPlanLayer.js";
|
|
45
|
+
export * from "./planning/GraphExecutionPlan.js";
|
|
46
|
+
export * from "./planning/GraphRelationResolver.js";
|
|
47
|
+
export * from "./planning/GraphExecutionPlanner.js";
|
|
48
|
+
export * from "./planning/GraphTopology.js";
|
|
49
|
+
// Validation (TASK-215)
|
|
50
|
+
export * from "./validation/GraphDefinitionValidator.js";
|
|
51
|
+
export * from "./validation/GraphPortSchemaResolver.js";
|
|
52
|
+
export * from "./validation/GraphValueValidator.js";
|
|
53
|
+
// Loops (TASK-216)
|
|
54
|
+
export * from "./loops/GraphConditionEvaluator.js";
|
|
55
|
+
export * from "./loops/ConditionExpressionEvaluator.js";
|
|
56
|
+
export * from "./loops/GraphLoopExecutionContext.js";
|
|
57
|
+
export * from "./loops/ForeachGraphNodeExecutor.js";
|
|
58
|
+
export * from "./loops/WhileGraphNodeExecutor.js";
|
|
59
|
+
export * from "./loops/UntilGraphNodeExecutor.js";
|
|
60
|
+
// Pinning (TASK-217/218)
|
|
61
|
+
export * from "./pinning/GraphPinningMetadata.js";
|
|
62
|
+
export * from "./pinning/GraphPinningPolicy.js";
|
|
63
|
+
export * from "./pinning/GraphPinningDependencyResolver.js";
|
|
64
|
+
export * from "./pinning/GraphPinningService.js";
|
|
65
|
+
// Snapshots (TASK-219)
|
|
66
|
+
export * from "./snapshots/GraphExecutionSnapshotMapper.js";
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILDhFQUE4RTtBQUM5RSxxQ0FBMEI7QUFFMUIsK0JBQTRCO0FBQzVCLDJCQUF3QjtBQUN4QixnQ0FBNkI7QUFFN0IsZ0RBQTZDO0FBQzdDLDRDQUF5QztBQUN6Qyw0Q0FBeUM7QUFDekMsZ0RBQTZDO0FBQzdDLDhDQUEyQztBQUMzQywyQ0FBd0M7QUFDeEMsNENBQXlDO0FBQ3pDLCtDQUE0QztBQUU1QyxnREFBNkM7QUFDN0MsbURBQWdEO0FBQ2hELHVEQUFvRDtBQUNwRCx1REFBb0Q7QUFFcEQscURBQWtEO0FBQ2xELGlEQUE4QztBQUM5QyxtREFBZ0Q7QUFDaEQsb0RBQWlEO0FBQ2pELG9EQUFpRDtBQUNqRCxvREFBaUQ7QUFDakQsdURBQW9EO0FBRXBELHdEQUFxRDtBQUNyRCx3REFBcUQ7QUFFckQseUNBQXNDO0FBQ3RDLDRDQUF5QztBQUN6QyxrREFBK0M7QUFDL0MsMERBQXVEO0FBQ3ZELDJDQUF3QztBQUV4QyxxREFBa0Q7QUFDbEQscURBQWtEO0FBQ2xELHNEQUFtRDtBQUNuRCxpREFBOEM7QUFDOUMsb0RBQWlEO0FBQ2pELG9EQUFpRDtBQUNqRCw0Q0FBeUM7QUFFekMsd0JBQXdCO0FBQ3hCLHlEQUFzRDtBQUN0RCx3REFBcUQ7QUFDckQsb0RBQWlEO0FBRWpELG1CQUFtQjtBQUNuQixtREFBZ0Q7QUFDaEQsd0RBQXFEO0FBQ3JELHFEQUFrRDtBQUNsRCxvREFBaUQ7QUFDakQsa0RBQStDO0FBQy9DLGtEQUErQztBQUUvQyx5QkFBeUI7QUFDekIsa0RBQStDO0FBQy9DLGdEQUE2QztBQUM3Qyw0REFBeUQ7QUFDekQsaURBQThDO0FBRTlDLHVCQUF1QjtBQUN2Qiw0REFBeUQiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL2VuZ2luZVxuICogQHN1bW1hcnkgR3JhcGggZXhlY3V0aW9uIGVuZ2luZSAoYmFja2VuZC1vbmx5KS5cbiAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgaW50ZXJwcmV0ZXIgZm9yIERlY2FmIGdyYXBoIHdvcmtmbG93cy4gRXhlY3V0ZXNcbiAqIHdvcmtmbG93cyBkZWNsYXJlZCB3aXRoIGBAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaGAsIGVtaXRzIGV2ZW50c1xuICogdGhyb3VnaCBEZWNhZidzIE9ic2VydmFibGUgcGlwZWxpbmUsIHN1cHBvcnRzIHN0cnVjdHVyZWQgbG9vcHMsIGNvbmZpZ3VyYWJsZVxuICogdmFsdWUgc3RvcmVzLCBhbmQgcGlubmFibGUvY2FjaGVhYmxlIG5vZGVzLlxuICpcbiAqIFJlLWV4cG9ydHMgYC4uL3NoYXJlZGAgc28gYmFja2VuZCBjb25zdW1lcnMgaGF2ZSBhIHNpbmdsZSBpbXBvcnQgc3VyZmFjZS5cbiAqL1xuXG4vLyBSZS1leHBvcnQgZnJvbnRlbmQtc2FmZSBkZWNsYXJhdGlvbnMgc28gYmFja2VuZCBjb25zdW1lcnMgaGF2ZSBvbmUgc3VyZmFjZS5cbmV4cG9ydCAqIGZyb20gXCIuLi9zaGFyZWRcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMvR3JhcGhFeGVjdXRpb25FcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoQ3ljbGVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoSW5wdXRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoTG9vcExpbWl0RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9ycy9HcmFwaFBpbm5pbmdFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoUG9ydEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMvR3JhcGhTdG9yZUVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbkV2ZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMvR3JhcGhFeGVjdXRpb25PYnNlcnZlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzL0dyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMvR3JhcGhFeGVjdXRpb25FdmVudEZhY3RvcnlcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL0dyYXBoRXhlY3V0aW9uQ29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL0dyYXBoTm9kZUV4ZWN1dG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjdXRpb24vR3JhcGhFeGVjdXRpb25GcmFtZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL0dyYXBoRXhlY3V0aW9uUmVzdWx0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjdXRpb24vR3JhcGhFeGVjdXRpb25FbmdpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4ZWN1dGlvbi9Db2RlU2FuZGJveEV2YWx1YXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL1N3aXRjaEdyYXBoTm9kZUV4ZWN1dG9yXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5L0dyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5L0dyYXBoTm9kZUV4ZWN1dG9yUmVzb2x2ZXJcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvR3JhcGhWYWx1ZUtleVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvR3JhcGhDYWNoZWRWYWx1ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvR3JhcGhWYWx1ZVN0b3JlQWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdG9yZS9HcmFwaFZhbHVlU3RvcmVcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFuTm9kZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFuRWRnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhSZWxhdGlvblJlc29sdmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsYW5uaW5nL0dyYXBoVG9wb2xvZ3lcIjtcblxuLy8gVmFsaWRhdGlvbiAoVEFTSy0yMTUpXG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uL0dyYXBoRGVmaW5pdGlvblZhbGlkYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvbi9HcmFwaFBvcnRTY2hlbWFSZXNvbHZlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvbi9HcmFwaFZhbHVlVmFsaWRhdG9yXCI7XG5cbi8vIExvb3BzIChUQVNLLTIxNilcbmV4cG9ydCAqIGZyb20gXCIuL2xvb3BzL0dyYXBoQ29uZGl0aW9uRXZhbHVhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb29wcy9Db25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb29wcy9HcmFwaExvb3BFeGVjdXRpb25Db250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb29wcy9Gb3JlYWNoR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvb3BzL1doaWxlR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvb3BzL1VudGlsR3JhcGhOb2RlRXhlY3V0b3JcIjtcblxuLy8gUGlubmluZyAoVEFTSy0yMTcvMjE4KVxuZXhwb3J0ICogZnJvbSBcIi4vcGlubmluZy9HcmFwaFBpbm5pbmdNZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGlubmluZy9HcmFwaFBpbm5pbmdQb2xpY3lcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Bpbm5pbmcvR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9waW5uaW5nL0dyYXBoUGlubmluZ1NlcnZpY2VcIjtcblxuLy8gU25hcHNob3RzIChUQVNLLTIxOSlcbmV4cG9ydCAqIGZyb20gXCIuL3NuYXBzaG90cy9HcmFwaEV4ZWN1dGlvblNuYXBzaG90TWFwcGVyXCI7XG4iXX0=
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { GraphExecutionError } from "./../errors/GraphExecutionError.js";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluates a {@link ConditionExpression} against the given state.
|
|
4
|
+
*
|
|
5
|
+
* `ExprValue` resolution:
|
|
6
|
+
* - `{ const: x }` → the literal value `x`.
|
|
7
|
+
* - `{ path: "a.b" }` → dotted-path lookup into `state`.
|
|
8
|
+
* - `{ step: "nodeId", path: "out" }` → cross-node reference; in v1 the state
|
|
9
|
+
* is expected to contain a `nodes` map keyed by node id (reserved for future
|
|
10
|
+
* multi-step evaluation; falls back to `state` lookup when absent).
|
|
11
|
+
*/
|
|
12
|
+
export class ConditionExpressionEvaluator {
|
|
13
|
+
/**
|
|
14
|
+
* Evaluates a condition expression to a boolean.
|
|
15
|
+
*
|
|
16
|
+
* @param expr - The condition expression.
|
|
17
|
+
* @param state - The current evaluation state (loop state or execution values).
|
|
18
|
+
* @returns `true` when the expression evaluates to a truthy/positive result.
|
|
19
|
+
*/
|
|
20
|
+
evaluate(expr, state) {
|
|
21
|
+
switch (expr.op) {
|
|
22
|
+
case "eq":
|
|
23
|
+
return this.resolveValue(expr.left, state) === this.resolveValue(expr.right, state);
|
|
24
|
+
case "neq":
|
|
25
|
+
return this.resolveValue(expr.left, state) !== this.resolveValue(expr.right, state);
|
|
26
|
+
case "gt":
|
|
27
|
+
return Number(this.resolveValue(expr.left, state)) > Number(this.resolveValue(expr.right, state));
|
|
28
|
+
case "gte":
|
|
29
|
+
return Number(this.resolveValue(expr.left, state)) >= Number(this.resolveValue(expr.right, state));
|
|
30
|
+
case "lt":
|
|
31
|
+
return Number(this.resolveValue(expr.left, state)) < Number(this.resolveValue(expr.right, state));
|
|
32
|
+
case "lte":
|
|
33
|
+
return Number(this.resolveValue(expr.left, state)) <= Number(this.resolveValue(expr.right, state));
|
|
34
|
+
case "and":
|
|
35
|
+
return expr.conditions.every((c) => this.evaluate(c, state));
|
|
36
|
+
case "or":
|
|
37
|
+
return expr.conditions.some((c) => this.evaluate(c, state));
|
|
38
|
+
case "not":
|
|
39
|
+
return !this.evaluate(expr.condition, state);
|
|
40
|
+
case "exists":
|
|
41
|
+
return this.resolveValue(expr.value, state) !== undefined && this.resolveValue(expr.value, state) !== null;
|
|
42
|
+
default:
|
|
43
|
+
throw new GraphExecutionError(`Unknown ConditionExpression op '${expr.op}'`, "GRAPH_UNKNOWN_CONDITION_OP", { expr });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolves an {@link ExprValue} against the current state.
|
|
48
|
+
*/
|
|
49
|
+
resolveValue(ref, state) {
|
|
50
|
+
if ("const" in ref) {
|
|
51
|
+
return ref.const;
|
|
52
|
+
}
|
|
53
|
+
if ("path" in ref && !("step" in ref)) {
|
|
54
|
+
return this.resolvePath(ref.path, state);
|
|
55
|
+
}
|
|
56
|
+
if ("step" in ref && "path" in ref) {
|
|
57
|
+
const nodes = state?.["nodes"];
|
|
58
|
+
if (nodes && typeof nodes === "object") {
|
|
59
|
+
const nodeState = nodes[ref.step];
|
|
60
|
+
return this.resolvePath(ref.path, nodeState);
|
|
61
|
+
}
|
|
62
|
+
return this.resolvePath(ref.path, state);
|
|
63
|
+
}
|
|
64
|
+
throw new GraphExecutionError("Invalid ExprValue: must have `const`, `path`, or `step`+`path`", "GRAPH_INVALID_EXPR_VALUE", { ref });
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resolves a dotted path into a target object.
|
|
68
|
+
*/
|
|
69
|
+
resolvePath(path, target) {
|
|
70
|
+
if (!path)
|
|
71
|
+
return target;
|
|
72
|
+
const parts = path.split(".");
|
|
73
|
+
let current = target;
|
|
74
|
+
for (const part of parts) {
|
|
75
|
+
if (current == null)
|
|
76
|
+
return undefined;
|
|
77
|
+
current = current[part];
|
|
78
|
+
}
|
|
79
|
+
return current;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvbG9vcHMvQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsMkNBQXNDO0FBRXBFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyw0QkFBNEI7SUFDdkM7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLElBQXlCLEVBQUUsS0FBYztRQUNoRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoQixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RGLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEYsS0FBSyxJQUFJO2dCQUNQLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNwRyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENB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QUFFLE9BQU8sTUFBTSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxPQUFPLEdBQVksTUFBTSxDQUFDO1FBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxPQUFPLElBQUksSUFBSTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUN0QyxPQUFPLEdBQUksT0FBbUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9sb29wcy9Db25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yXG4gKiBAc3VtbWFyeSBFdmFsdWF0b3IgZm9yIHRoZSBBTEZSRUQtNSBgQ29uZGl0aW9uRXhwcmVzc2lvbmAgRFNMIChERUNBRi0zMiDCpzIyLjMpLlxuICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBkZWNsYXJhdGl2ZSwgc2VyaWFsaXphYmxlIGNvbmRpdGlvbiBleHByZXNzaW9ucyB3aXRoXG4gKiBgZXFgL2BuZXFgL2BndGAvYGd0ZWAvYGx0YC9gbHRlYC9gYW5kYC9gb3JgL2Bub3RgL2BleGlzdHNgIG9wZXJhdG9ycyBhbmRcbiAqIGBFeHByVmFsdWVgIHJlZmVyZW5jZXMgKGB7Y29uc3R9YCwgYHtwYXRofWAsIGB7c3RlcCwgcGF0aH1gKS5cbiAqL1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25FeHByZXNzaW9uLCBFeHByVmFsdWUgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaEV4ZWN1dGlvbkVycm9yXCI7XG5cbi8qKlxuICogRXZhbHVhdGVzIGEge0BsaW5rIENvbmRpdGlvbkV4cHJlc3Npb259IGFnYWluc3QgdGhlIGdpdmVuIHN0YXRlLlxuICpcbiAqIGBFeHByVmFsdWVgIHJlc29sdXRpb246XG4gKiAtIGB7IGNvbnN0OiB4IH1gIOKGkiB0aGUgbGl0ZXJhbCB2YWx1ZSBgeGAuXG4gKiAtIGB7IHBhdGg6IFwiYS5iXCIgfWAg4oaSIGRvdHRlZC1wYXRoIGxvb2t1cCBpbnRvIGBzdGF0ZWAuXG4gKiAtIGB7IHN0ZXA6IFwibm9kZUlkXCIsIHBhdGg6IFwib3V0XCIgfWAg4oaSIGNyb3NzLW5vZGUgcmVmZXJlbmNlOyBpbiB2MSB0aGUgc3RhdGVcbiAqICAgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBhIGBub2Rlc2AgbWFwIGtleWVkIGJ5IG5vZGUgaWQgKHJlc2VydmVkIGZvciBmdXR1cmVcbiAqICAgbXVsdGktc3RlcCBldmFsdWF0aW9uOyBmYWxscyBiYWNrIHRvIGBzdGF0ZWAgbG9va3VwIHdoZW4gYWJzZW50KS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbkV4cHJlc3Npb25FdmFsdWF0b3Ige1xuICAvKipcbiAgICogRXZhbHVhdGVzIGEgY29uZGl0aW9uIGV4cHJlc3Npb24gdG8gYSBib29sZWFuLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwciAtIFRoZSBjb25kaXRpb24gZXhwcmVzc2lvbi5cbiAgICogQHBhcmFtIHN0YXRlIC0gVGhlIGN1cnJlbnQgZXZhbHVhdGlvbiBzdGF0ZSAobG9vcCBzdGF0ZSBvciBleGVjdXRpb24gdmFsdWVzKS5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgdHJ1dGh5L3Bvc2l0aXZlIHJlc3VsdC5cbiAgICovXG4gIGV2YWx1YXRlKGV4cHI6IENvbmRpdGlvbkV4cHJlc3Npb24sIHN0YXRlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChleHByLm9wKSB7XG4gICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIubGVmdCwgc3RhdGUpID09PSB0aGlzLnJlc29sdmVWYWx1ZShleHByLnJpZ2h0LCBzdGF0ZSk7XG4gICAgICBjYXNlIFwibmVxXCI6XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVWYWx1ZShleHByLmxlZnQsIHN0YXRlKSAhPT0gdGhpcy5yZXNvbHZlVmFsdWUoZXhwci5yaWdodCwgc3RhdGUpO1xuICAgICAgY2FzZSBcImd0XCI6XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5yZXNvbHZlVmFsdWUoZXhwci5sZWZ0LCBzdGF0ZSkpID4gTnVtYmVyKHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIucmlnaHQsIHN0YXRlKSk7XG4gICAgICBjYXNlIFwiZ3RlXCI6XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5yZXNvbHZlVmFsdWUoZXhwci5sZWZ0LCBzdGF0ZSkpID49IE51bWJlcih0aGlzLnJlc29sdmVWYWx1ZShleHByLnJpZ2h0LCBzdGF0ZSkpO1xuICAgICAgY2FzZSBcImx0XCI6XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5yZXNvbHZlVmFsdWUoZXhwci5sZWZ0LCBzdGF0ZSkpIDwgTnVtYmVyKHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIucmlnaHQsIHN0YXRlKSk7XG4gICAgICBjYXNlIFwibHRlXCI6XG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5yZXNvbHZlVmFsdWUoZXhwci5sZWZ0LCBzdGF0ZSkpIDw9IE51bWJlcih0aGlzLnJlc29sdmVWYWx1ZShleHByLnJpZ2h0LCBzdGF0ZSkpO1xuICAgICAgY2FzZSBcImFuZFwiOlxuICAgICAgICByZXR1cm4gZXhwci5jb25kaXRpb25zLmV2ZXJ5KChjKSA9PiB0aGlzLmV2YWx1YXRlKGMsIHN0YXRlKSk7XG4gICAgICBjYXNlIFwib3JcIjpcbiAgICAgICAgcmV0dXJuIGV4cHIuY29uZGl0aW9ucy5zb21lKChjKSA9PiB0aGlzLmV2YWx1YXRlKGMsIHN0YXRlKSk7XG4gICAgICBjYXNlIFwibm90XCI6XG4gICAgICAgIHJldHVybiAhdGhpcy5ldmFsdWF0ZShleHByLmNvbmRpdGlvbiwgc3RhdGUpO1xuICAgICAgY2FzZSBcImV4aXN0c1wiOlxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlVmFsdWUoZXhwci52YWx1ZSwgc3RhdGUpICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yZXNvbHZlVmFsdWUoZXhwci52YWx1ZSwgc3RhdGUpICE9PSBudWxsO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEdyYXBoRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgYFVua25vd24gQ29uZGl0aW9uRXhwcmVzc2lvbiBvcCAnJHsoZXhwciBhcyB7IG9wOiBzdHJpbmcgfSkub3B9J2AsXG4gICAgICAgICAgXCJHUkFQSF9VTktOT1dOX0NPTkRJVElPTl9PUFwiLFxuICAgICAgICAgIHsgZXhwciB9XG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIHtAbGluayBFeHByVmFsdWV9IGFnYWluc3QgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWYWx1ZShyZWY6IEV4cHJWYWx1ZSwgc3RhdGU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAoXCJjb25zdFwiIGluIHJlZikge1xuICAgICAgcmV0dXJuIHJlZi5jb25zdDtcbiAgICB9XG4gICAgaWYgKFwicGF0aFwiIGluIHJlZiAmJiAhKFwic3RlcFwiIGluIHJlZikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVQYXRoKHJlZi5wYXRoLCBzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChcInN0ZXBcIiBpbiByZWYgJiYgXCJwYXRoXCIgaW4gcmVmKSB7XG4gICAgICBjb25zdCBub2RlcyA9IChzdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwpPy5bXCJub2Rlc1wiXTtcbiAgICAgIGlmIChub2RlcyAmJiB0eXBlb2Ygbm9kZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qgbm9kZVN0YXRlID0gKG5vZGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtyZWYuc3RlcF07XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVQYXRoKHJlZi5wYXRoLCBub2RlU3RhdGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVBhdGgocmVmLnBhdGgsIHN0YXRlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEdyYXBoRXhlY3V0aW9uRXJyb3IoXG4gICAgICBcIkludmFsaWQgRXhwclZhbHVlOiBtdXN0IGhhdmUgYGNvbnN0YCwgYHBhdGhgLCBvciBgc3RlcGArYHBhdGhgXCIsXG4gICAgICBcIkdSQVBIX0lOVkFMSURfRVhQUl9WQUxVRVwiLFxuICAgICAgeyByZWYgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBkb3R0ZWQgcGF0aCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVBhdGgocGF0aDogc3RyaW5nLCB0YXJnZXQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiB0YXJnZXQ7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgICBsZXQgY3VycmVudDogdW5rbm93biA9IHRhcmdldDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { GRAPH_DEFAULT_MAX_FOREACH_ITERATIONS } from "./../constants.js";
|
|
2
|
+
import { GraphExecutionEventType } from "./../../shared/constants.js";
|
|
3
|
+
import { GraphInputError } from "./../errors/GraphInputError.js";
|
|
4
|
+
import { GraphLoopLimitError } from "./../errors/GraphLoopLimitError.js";
|
|
5
|
+
/**
|
|
6
|
+
* Executor for `core.loop.foreach` nodes.
|
|
7
|
+
*
|
|
8
|
+
* Expects input:
|
|
9
|
+
* - `items`: array of values to iterate over
|
|
10
|
+
* - `state?`: optional initial state
|
|
11
|
+
*
|
|
12
|
+
* Produces output:
|
|
13
|
+
* - `results`: array of body outputs (in item order)
|
|
14
|
+
* - `state?`: final state
|
|
15
|
+
* - `iterations`: number of iterations executed
|
|
16
|
+
*/
|
|
17
|
+
export class ForeachGraphNodeExecutor {
|
|
18
|
+
constructor(engine) {
|
|
19
|
+
this.engine = engine;
|
|
20
|
+
}
|
|
21
|
+
async execute(input, context) {
|
|
22
|
+
const metadata = this.extractMetadata(context);
|
|
23
|
+
const items = input.items;
|
|
24
|
+
const maxIterations = metadata.maxIterations ?? GRAPH_DEFAULT_MAX_FOREACH_ITERATIONS;
|
|
25
|
+
if (!Array.isArray(items)) {
|
|
26
|
+
throw new GraphInputError("foreach input 'items' must be an array");
|
|
27
|
+
}
|
|
28
|
+
if (items.length > maxIterations) {
|
|
29
|
+
throw new GraphLoopLimitError(`foreach exceeded max iterations (${items.length} > ${maxIterations})`);
|
|
30
|
+
}
|
|
31
|
+
const itemPort = metadata.itemPort ?? "item";
|
|
32
|
+
const resultPort = metadata.resultPort ?? "result";
|
|
33
|
+
const statePort = metadata.statePort ?? "state";
|
|
34
|
+
const bodyWorkflow = metadata.body;
|
|
35
|
+
const results = [];
|
|
36
|
+
let state = input.state;
|
|
37
|
+
await context.emit({ type: GraphExecutionEventType.LOOP_STARTED });
|
|
38
|
+
for (let i = 0; i < items.length; i++) {
|
|
39
|
+
await context.emit({
|
|
40
|
+
type: GraphExecutionEventType.LOOP_ITERATION_STARTED,
|
|
41
|
+
iteration: i,
|
|
42
|
+
});
|
|
43
|
+
const childInputs = {
|
|
44
|
+
[itemPort]: items[i],
|
|
45
|
+
index: i,
|
|
46
|
+
};
|
|
47
|
+
if (state !== undefined)
|
|
48
|
+
childInputs[statePort] = state;
|
|
49
|
+
const childResult = await this.engine.execute(bodyWorkflow, childInputs, {
|
|
50
|
+
parentRunId: context.runId,
|
|
51
|
+
path: [...context.path, `iteration:${i}`],
|
|
52
|
+
});
|
|
53
|
+
results.push(childResult.outputs[resultPort]);
|
|
54
|
+
if (childResult.outputs[statePort] !== undefined) {
|
|
55
|
+
state = childResult.outputs[statePort];
|
|
56
|
+
}
|
|
57
|
+
await context.emit({
|
|
58
|
+
type: GraphExecutionEventType.LOOP_ITERATION_COMPLETED,
|
|
59
|
+
iteration: i,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
await context.emit({ type: GraphExecutionEventType.LOOP_COMPLETED });
|
|
63
|
+
const output = {
|
|
64
|
+
results,
|
|
65
|
+
iterations: items.length,
|
|
66
|
+
};
|
|
67
|
+
if (state !== undefined)
|
|
68
|
+
output[statePort] = state;
|
|
69
|
+
return output;
|
|
70
|
+
}
|
|
71
|
+
extractMetadata(context) {
|
|
72
|
+
const raw = context.node.graph?.metadata?.loop ??
|
|
73
|
+
context.metadata?.loop;
|
|
74
|
+
if (!raw) {
|
|
75
|
+
throw new GraphInputError("foreach node is missing loop metadata");
|
|
76
|
+
}
|
|
77
|
+
return raw;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRm9yZWFjaEdyYXBoTm9kZUV4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2dyYXBoL2VuZ2luZS9sb29wcy9Gb3JlYWNoR3JhcGhOb2RlRXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLDBCQUFxQjtBQUNwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsb0NBQStCO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsdUNBQWtDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSwyQ0FBc0M7QUFFcEU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DLFlBQTZCLE1BQTRCO1FBQTVCLFdBQU0sR0FBTixNQUFNLENBQXNCO0lBQUcsQ0FBQztJQUU3RCxLQUFLLENBQUMsT0FBTyxDQUNYLEtBQTJCLEVBQzNCLE9BQThCO1FBRTlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMxQixNQUFNLGFBQWEsR0FDakIsUUFBUSxDQUFDLGFBQWEsSUFBSSxvQ0FBb0MsQ0FBQztRQUVqRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxlQUFlLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0Isb0NBQW9DLEtBQUssQ0FBQyxNQUFNLE1BQU0sYUFBYSxHQUFHLENBQ3ZFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFDN0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUM7UUFDaEQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQStCLENBQUM7UUFFOUQsTUFBTSxPQUFPLEdBQWMsRUFBRSxDQUFDO1FBQzlCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFeEIsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFbkUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxzQkFBc0I7Z0JBQ3BELFNBQVMsRUFBRSxDQUFDO2FBQ2IsQ0FBQyxDQUFDO1lBRUgsTUFBTSxXQUFXLEdBQXlCO2dCQUN4QyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQztZQUNGLElBQUksS0FBSyxLQUFLLFNBQVM7Z0JBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUV4RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUMzQyxZQUFZLEVBQ1osV0FBVyxFQUNYO2dCQUNFLFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSztnQkFDMUIsSUFBSSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7YUFDMUMsQ0FDRixDQUFDO1lBRUYsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqRCxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBRUQsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNqQixJQUFJLEVBQUUsdUJBQXVCLENBQUMsd0JBQXdCO2dCQUN0RCxTQUFTLEVBQUUsQ0FBQzthQUNiLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVyRSxNQUFNLE1BQU0sR0FBeUI7WUFDbkMsT0FBTztZQUNQLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTTtTQUN6QixDQUFDO1FBQ0YsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbkQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUE4QjtRQUNwRCxNQUFNLEdBQUcsR0FBSSxPQUFPLENBQUMsSUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSTtZQUNwRCxPQUFPLENBQUMsUUFBZ0IsRUFBRSxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLGVBQWUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPLEdBQXdCLENBQUM7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9sb29wcy9Gb3JlYWNoR3JhcGhOb2RlRXhlY3V0b3JcbiAqIEBzdW1tYXJ5IEZvcmVhY2ggbG9vcCBub2RlIGV4ZWN1dG9yLlxuICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgYm9keSB3b3JrZmxvdyBvbmNlIHBlciBpdGVtIGluIHRoZSBpbnB1dCBhcnJheSwgY29sbGVjdGluZyByZXN1bHRzIGluIG9yZGVyLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoTm9kZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL2V4ZWN1dGlvbi9HcmFwaE5vZGVFeGVjdXRvclwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi4vZXhlY3V0aW9uL0dyYXBoRXhlY3V0aW9uQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvbkVuZ2luZSB9IGZyb20gXCIuLi9leGVjdXRpb24vR3JhcGhFeGVjdXRpb25FbmdpbmVcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25WYWx1ZXMsIEdyYXBoTG9vcE1ldGFkYXRhIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5cbmltcG9ydCB7IEdSQVBIX0RFRkFVTFRfTUFYX0ZPUkVBQ0hfSVRFUkFUSU9OUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IEdyYXBoSW5wdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhJbnB1dEVycm9yXCI7XG5pbXBvcnQgeyBHcmFwaExvb3BMaW1pdEVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaExvb3BMaW1pdEVycm9yXCI7XG5cbi8qKlxuICogRXhlY3V0b3IgZm9yIGBjb3JlLmxvb3AuZm9yZWFjaGAgbm9kZXMuXG4gKlxuICogRXhwZWN0cyBpbnB1dDpcbiAqIC0gYGl0ZW1zYDogYXJyYXkgb2YgdmFsdWVzIHRvIGl0ZXJhdGUgb3ZlclxuICogLSBgc3RhdGU/YDogb3B0aW9uYWwgaW5pdGlhbCBzdGF0ZVxuICpcbiAqIFByb2R1Y2VzIG91dHB1dDpcbiAqIC0gYHJlc3VsdHNgOiBhcnJheSBvZiBib2R5IG91dHB1dHMgKGluIGl0ZW0gb3JkZXIpXG4gKiAtIGBzdGF0ZT9gOiBmaW5hbCBzdGF0ZVxuICogLSBgaXRlcmF0aW9uc2A6IG51bWJlciBvZiBpdGVyYXRpb25zIGV4ZWN1dGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3JlYWNoR3JhcGhOb2RlRXhlY3V0b3IgaW1wbGVtZW50cyBHcmFwaE5vZGVFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZW5naW5lOiBHcmFwaEV4ZWN1dGlvbkVuZ2luZSkge31cblxuICBhc3luYyBleGVjdXRlKFxuICAgIGlucHV0OiBHcmFwaEV4ZWN1dGlvblZhbHVlcyxcbiAgICBjb250ZXh0OiBHcmFwaEV4ZWN1dGlvbkNvbnRleHRcbiAgKTogUHJvbWlzZTxHcmFwaEV4ZWN1dGlvblZhbHVlcz4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5leHRyYWN0TWV0YWRhdGEoY29udGV4dCk7XG4gICAgY29uc3QgaXRlbXMgPSBpbnB1dC5pdGVtcztcbiAgICBjb25zdCBtYXhJdGVyYXRpb25zID1cbiAgICAgIG1ldGFkYXRhLm1heEl0ZXJhdGlvbnMgPz8gR1JBUEhfREVGQVVMVF9NQVhfRk9SRUFDSF9JVEVSQVRJT05TO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoSW5wdXRFcnJvcihcImZvcmVhY2ggaW5wdXQgJ2l0ZW1zJyBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgIH1cbiAgICBpZiAoaXRlbXMubGVuZ3RoID4gbWF4SXRlcmF0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoTG9vcExpbWl0RXJyb3IoXG4gICAgICAgIGBmb3JlYWNoIGV4Y2VlZGVkIG1heCBpdGVyYXRpb25zICgke2l0ZW1zLmxlbmd0aH0gPiAke21heEl0ZXJhdGlvbnN9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbVBvcnQgPSBtZXRhZGF0YS5pdGVtUG9ydCA/PyBcIml0ZW1cIjtcbiAgICBjb25zdCByZXN1bHRQb3J0ID0gbWV0YWRhdGEucmVzdWx0UG9ydCA/PyBcInJlc3VsdFwiO1xuICAgIGNvbnN0IHN0YXRlUG9ydCA9IG1ldGFkYXRhLnN0YXRlUG9ydCA/PyBcInN0YXRlXCI7XG4gICAgY29uc3QgYm9keVdvcmtmbG93ID0gbWV0YWRhdGEuYm9keSBhcyBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbjtcblxuICAgIGNvbnN0IHJlc3VsdHM6IHVua25vd25bXSA9IFtdO1xuICAgIGxldCBzdGF0ZSA9IGlucHV0LnN0YXRlO1xuXG4gICAgYXdhaXQgY29udGV4dC5lbWl0KHsgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTE9PUF9TVEFSVEVEIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgYXdhaXQgY29udGV4dC5lbWl0KHtcbiAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTE9PUF9JVEVSQVRJT05fU1RBUlRFRCxcbiAgICAgICAgaXRlcmF0aW9uOiBpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkSW5wdXRzOiBHcmFwaEV4ZWN1dGlvblZhbHVlcyA9IHtcbiAgICAgICAgW2l0ZW1Qb3J0XTogaXRlbXNbaV0sXG4gICAgICAgIGluZGV4OiBpLFxuICAgICAgfTtcbiAgICAgIGlmIChzdGF0ZSAhPT0gdW5kZWZpbmVkKSBjaGlsZElucHV0c1tzdGF0ZVBvcnRdID0gc3RhdGU7XG5cbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gYXdhaXQgdGhpcy5lbmdpbmUuZXhlY3V0ZShcbiAgICAgICAgYm9keVdvcmtmbG93LFxuICAgICAgICBjaGlsZElucHV0cyxcbiAgICAgICAge1xuICAgICAgICAgIHBhcmVudFJ1bklkOiBjb250ZXh0LnJ1bklkLFxuICAgICAgICAgIHBhdGg6IFsuLi5jb250ZXh0LnBhdGgsIGBpdGVyYXRpb246JHtpfWBdLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXN1bHRzLnB1c2goY2hpbGRSZXN1bHQub3V0cHV0c1tyZXN1bHRQb3J0XSk7XG4gICAgICBpZiAoY2hpbGRSZXN1bHQub3V0cHV0c1tzdGF0ZVBvcnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhdGUgPSBjaGlsZFJlc3VsdC5vdXRwdXRzW3N0YXRlUG9ydF07XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNvbnRleHQuZW1pdCh7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkxPT1BfSVRFUkFUSU9OX0NPTVBMRVRFRCxcbiAgICAgICAgaXRlcmF0aW9uOiBpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgY29udGV4dC5lbWl0KHsgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTE9PUF9DT01QTEVURUQgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQ6IEdyYXBoRXhlY3V0aW9uVmFsdWVzID0ge1xuICAgICAgcmVzdWx0cyxcbiAgICAgIGl0ZXJhdGlvbnM6IGl0ZW1zLmxlbmd0aCxcbiAgICB9O1xuICAgIGlmIChzdGF0ZSAhPT0gdW5kZWZpbmVkKSBvdXRwdXRbc3RhdGVQb3J0XSA9IHN0YXRlO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNZXRhZGF0YShjb250ZXh0OiBHcmFwaEV4ZWN1dGlvbkNvbnRleHQpOiBHcmFwaExvb3BNZXRhZGF0YSB7XG4gICAgY29uc3QgcmF3ID0gKGNvbnRleHQubm9kZSBhcyBhbnkpLmdyYXBoPy5tZXRhZGF0YT8ubG9vcCA/P1xuICAgICAgKGNvbnRleHQubWV0YWRhdGEgYXMgYW55KT8ubG9vcDtcbiAgICBpZiAoIXJhdykge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoSW5wdXRFcnJvcihcImZvcmVhY2ggbm9kZSBpcyBtaXNzaW5nIGxvb3AgbWV0YWRhdGFcIik7XG4gICAgfVxuICAgIHJldHVybiByYXcgYXMgR3JhcGhMb29wTWV0YWRhdGE7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { GraphConditionType } from "./../constants.js";
|
|
2
|
+
import { GraphExecutionError } from "./../errors/GraphExecutionError.js";
|
|
3
|
+
import { ConditionExpressionEvaluator } from "./ConditionExpressionEvaluator.js";
|
|
4
|
+
/**
|
|
5
|
+
* Evaluates loop conditions using built-in comparison types or the
|
|
6
|
+
* `ConditionExpression` DSL.
|
|
7
|
+
*/
|
|
8
|
+
export class GraphConditionEvaluator {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.expressionEvaluator = new ConditionExpressionEvaluator();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Evaluates a condition against the given state.
|
|
14
|
+
*
|
|
15
|
+
* When the condition object carries an `op` field, it is treated as a
|
|
16
|
+
* `ConditionExpression` (§22.3) and dispatched to the
|
|
17
|
+
* {@link ConditionExpressionEvaluator}. Otherwise the built-in `type`-based
|
|
18
|
+
* switch is used.
|
|
19
|
+
*
|
|
20
|
+
* @param condition - The condition definition.
|
|
21
|
+
* @param state - The current loop state.
|
|
22
|
+
* @returns `true` when the condition passes.
|
|
23
|
+
*/
|
|
24
|
+
evaluate(condition, state) {
|
|
25
|
+
if (this.isConditionExpression(condition)) {
|
|
26
|
+
return this.expressionEvaluator.evaluate(condition, state);
|
|
27
|
+
}
|
|
28
|
+
const left = this.resolveValue(condition.left, state);
|
|
29
|
+
const right = condition.right;
|
|
30
|
+
switch (condition.type) {
|
|
31
|
+
case GraphConditionType.TRUTHY:
|
|
32
|
+
return !!left;
|
|
33
|
+
case GraphConditionType.FALSY:
|
|
34
|
+
return !left;
|
|
35
|
+
case GraphConditionType.EQUALS:
|
|
36
|
+
return left === right;
|
|
37
|
+
case GraphConditionType.NOT_EQUALS:
|
|
38
|
+
return left !== right;
|
|
39
|
+
case GraphConditionType.GREATER_THAN:
|
|
40
|
+
return Number(left) > Number(right);
|
|
41
|
+
case GraphConditionType.GREATER_THAN_OR_EQUAL:
|
|
42
|
+
return Number(left) >= Number(right);
|
|
43
|
+
case GraphConditionType.LESS_THAN:
|
|
44
|
+
return Number(left) < Number(right);
|
|
45
|
+
case GraphConditionType.LESS_THAN_OR_EQUAL:
|
|
46
|
+
return Number(left) <= Number(right);
|
|
47
|
+
case GraphConditionType.EXISTS:
|
|
48
|
+
return left !== undefined && left !== null;
|
|
49
|
+
case GraphConditionType.CUSTOM:
|
|
50
|
+
throw new GraphExecutionError("Custom condition evaluators are not supported in v1", "GRAPH_CUSTOM_CONDITION_UNSUPPORTED");
|
|
51
|
+
default:
|
|
52
|
+
throw new GraphExecutionError(`Unknown condition type '${condition.type}'`, "GRAPH_UNKNOWN_CONDITION_TYPE", { condition });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolves a value that may be a dotted path into the state object.
|
|
57
|
+
*/
|
|
58
|
+
resolveValue(path, state) {
|
|
59
|
+
if (!path)
|
|
60
|
+
return state;
|
|
61
|
+
const parts = path.split(".");
|
|
62
|
+
let current = state;
|
|
63
|
+
for (const part of parts) {
|
|
64
|
+
if (current == null)
|
|
65
|
+
return undefined;
|
|
66
|
+
current = current[part];
|
|
67
|
+
}
|
|
68
|
+
return current;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detects whether a condition object is a `ConditionExpression` (§22.3) by
|
|
72
|
+
* checking for the presence of an `op` field. When true, the object is
|
|
73
|
+
* treated as a `ConditionExpression` and dispatched to the
|
|
74
|
+
* {@link ConditionExpressionEvaluator}.
|
|
75
|
+
*/
|
|
76
|
+
isConditionExpression(condition) {
|
|
77
|
+
return typeof condition.op === "string";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhDb25kaXRpb25FdmFsdWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL2xvb3BzL0dyYXBoQ29uZGl0aW9uRXZhbHVhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQkFBcUI7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDJDQUFzQztBQUNwRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsMENBQXVDO0FBRTlFOzs7R0FHRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFBcEM7UUFDbUIsd0JBQW1CLEdBQUcsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO0lBOEU1RSxDQUFDO0lBNUVDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsUUFBUSxDQUFDLFNBQXlELEVBQUUsS0FBYztRQUNoRixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBRTlCLFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssa0JBQWtCLENBQUMsTUFBTTtnQkFDNUIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2hCLEtBQUssa0JBQWtCLENBQUMsS0FBSztnQkFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNmLEtBQUssa0JBQWtCLENBQUMsTUFBTTtnQkFDNUIsT0FBTyxJQUFJLEtBQUssS0FBSyxDQUFDO1lBQ3hCLEtBQUssa0JBQWtCLENBQUMsVUFBVTtnQkFDaEMsT0FBTyxJQUFJLEtBQUssS0FBSyxDQUFDO1lBQ3hCLEtBQUssa0JBQWtCLENBQUMsWUFBWTtnQkFDbEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLEtBQUssa0JBQWtCLENBQUMscUJBQXFCO2dCQUMzQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO2dCQUMvQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsS0FBSyxrQkFBa0IsQ0FBQyxrQkFBa0I7Z0JBQ3hDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLGtCQUFrQixDQUFDLE1BQU07Z0JBQzVCLE9BQU8sSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQzdDLEtBQUssa0JBQWtCLENBQUMsTUFBTTtnQkFDNUIsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixxREFBcUQsRUFDckQsb0NBQW9DLENBQ3JDLENBQUM7WUFDSjtnQkFDRSxNQUFNLElBQUksbUJBQW1CLENBQzNCLDJCQUEyQixTQUFTLENBQUMsSUFBSSxHQUFHLEVBQzVDLDhCQUE4QixFQUM5QixFQUFFLFNBQVMsRUFBRSxDQUNkLENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLElBQXdCLEVBQUUsS0FBYztRQUMzRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDO1FBQzdCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxPQUFPLElBQUksSUFBSTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUN0QyxPQUFPLEdBQUksT0FBbUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sscUJBQXFCLENBQUMsU0FBeUQ7UUFDckYsT0FBTyxPQUFRLFNBQXdDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQztJQUMxRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL2xvb3BzL0dyYXBoQ29uZGl0aW9uRXZhbHVhdG9yXG4gKiBAc3VtbWFyeSBFdmFsdWF0b3IgZm9yIGJ1aWx0LWluIGxvb3AgY29uZGl0aW9uIHR5cGVzIGFuZCB0aGUgYENvbmRpdGlvbkV4cHJlc3Npb25gIERTTC5cbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0cyBzYWZlLCBidWlsdC1pbiBjb25kaXRpb24gdHlwZXMgb25seS4gRG9lcyBOT1QgZXZhbHVhdGUgYXJiaXRyYXJ5IEphdmFTY3JpcHQgZXhwcmVzc2lvbnMuXG4gKiBXaGVuIHRoZSBjb25kaXRpb24gb2JqZWN0IGNhcnJpZXMgYW4gYG9wYCBmaWVsZCAoQUxGUkVELTUgwqc4IC8gREVDQUYtMzIgwqcyMi4zKSwgZGlzcGF0Y2hlcyB0byB0aGVcbiAqIHtAbGluayBDb25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yfSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBgdHlwZWAtYmFzZWQgc3dpdGNoLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoQ29uZGl0aW9uRGVmaW5pdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgR3JhcGhDb25kaXRpb25UeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhFeGVjdXRpb25FcnJvclwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvciB9IGZyb20gXCIuL0NvbmRpdGlvbkV4cHJlc3Npb25FdmFsdWF0b3JcIjtcblxuLyoqXG4gKiBFdmFsdWF0ZXMgbG9vcCBjb25kaXRpb25zIHVzaW5nIGJ1aWx0LWluIGNvbXBhcmlzb24gdHlwZXMgb3IgdGhlXG4gKiBgQ29uZGl0aW9uRXhwcmVzc2lvbmAgRFNMLlxuICovXG5leHBvcnQgY2xhc3MgR3JhcGhDb25kaXRpb25FdmFsdWF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cHJlc3Npb25FdmFsdWF0b3IgPSBuZXcgQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvcigpO1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBjb25kaXRpb24gYWdhaW5zdCB0aGUgZ2l2ZW4gc3RhdGUuXG4gICAqXG4gICAqIFdoZW4gdGhlIGNvbmRpdGlvbiBvYmplY3QgY2FycmllcyBhbiBgb3BgIGZpZWxkLCBpdCBpcyB0cmVhdGVkIGFzIGFcbiAgICogYENvbmRpdGlvbkV4cHJlc3Npb25gICjCpzIyLjMpIGFuZCBkaXNwYXRjaGVkIHRvIHRoZVxuICAgKiB7QGxpbmsgQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvcn0uIE90aGVyd2lzZSB0aGUgYnVpbHQtaW4gYHR5cGVgLWJhc2VkXG4gICAqIHN3aXRjaCBpcyB1c2VkLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgY3VycmVudCBsb29wIHN0YXRlLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgY29uZGl0aW9uIHBhc3Nlcy5cbiAgICovXG4gIGV2YWx1YXRlKGNvbmRpdGlvbjogR3JhcGhDb25kaXRpb25EZWZpbml0aW9uIHwgQ29uZGl0aW9uRXhwcmVzc2lvbiwgc3RhdGU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0NvbmRpdGlvbkV4cHJlc3Npb24oY29uZGl0aW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbkV2YWx1YXRvci5ldmFsdWF0ZShjb25kaXRpb24sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5yZXNvbHZlVmFsdWUoY29uZGl0aW9uLmxlZnQsIHN0YXRlKTtcbiAgICBjb25zdCByaWdodCA9IGNvbmRpdGlvbi5yaWdodDtcblxuICAgIHN3aXRjaCAoY29uZGl0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLlRSVVRIWTpcbiAgICAgICAgcmV0dXJuICEhbGVmdDtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLkZBTFNZOlxuICAgICAgICByZXR1cm4gIWxlZnQ7XG4gICAgICBjYXNlIEdyYXBoQ29uZGl0aW9uVHlwZS5FUVVBTFM6XG4gICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLk5PVF9FUVVBTFM6XG4gICAgICAgIHJldHVybiBsZWZ0ICE9PSByaWdodDtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLkdSRUFURVJfVEhBTjpcbiAgICAgICAgcmV0dXJuIE51bWJlcihsZWZ0KSA+IE51bWJlcihyaWdodCk7XG4gICAgICBjYXNlIEdyYXBoQ29uZGl0aW9uVHlwZS5HUkVBVEVSX1RIQU5fT1JfRVFVQUw6XG4gICAgICAgIHJldHVybiBOdW1iZXIobGVmdCkgPj0gTnVtYmVyKHJpZ2h0KTtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLkxFU1NfVEhBTjpcbiAgICAgICAgcmV0dXJuIE51bWJlcihsZWZ0KSA8IE51bWJlcihyaWdodCk7XG4gICAgICBjYXNlIEdyYXBoQ29uZGl0aW9uVHlwZS5MRVNTX1RIQU5fT1JfRVFVQUw6XG4gICAgICAgIHJldHVybiBOdW1iZXIobGVmdCkgPD0gTnVtYmVyKHJpZ2h0KTtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLkVYSVNUUzpcbiAgICAgICAgcmV0dXJuIGxlZnQgIT09IHVuZGVmaW5lZCAmJiBsZWZ0ICE9PSBudWxsO1xuICAgICAgY2FzZSBHcmFwaENvbmRpdGlvblR5cGUuQ1VTVE9NOlxuICAgICAgICB0aHJvdyBuZXcgR3JhcGhFeGVjdXRpb25FcnJvcihcbiAgICAgICAgICBcIkN1c3RvbSBjb25kaXRpb24gZXZhbHVhdG9ycyBhcmUgbm90IHN1cHBvcnRlZCBpbiB2MVwiLFxuICAgICAgICAgIFwiR1JBUEhfQ1VTVE9NX0NPTkRJVElPTl9VTlNVUFBPUlRFRFwiXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgR3JhcGhFeGVjdXRpb25FcnJvcihcbiAgICAgICAgICBgVW5rbm93biBjb25kaXRpb24gdHlwZSAnJHtjb25kaXRpb24udHlwZX0nYCxcbiAgICAgICAgICBcIkdSQVBIX1VOS05PV05fQ09ORElUSU9OX1RZUEVcIixcbiAgICAgICAgICB7IGNvbmRpdGlvbiB9XG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgdmFsdWUgdGhhdCBtYXkgYmUgYSBkb3R0ZWQgcGF0aCBpbnRvIHRoZSBzdGF0ZSBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWYWx1ZShwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gc3RhdGU7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgICBsZXQgY3VycmVudDogdW5rbm93biA9IHN0YXRlO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgd2hldGhlciBhIGNvbmRpdGlvbiBvYmplY3QgaXMgYSBgQ29uZGl0aW9uRXhwcmVzc2lvbmAgKMKnMjIuMykgYnlcbiAgICogY2hlY2tpbmcgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbiBgb3BgIGZpZWxkLiBXaGVuIHRydWUsIHRoZSBvYmplY3QgaXNcbiAgICogdHJlYXRlZCBhcyBhIGBDb25kaXRpb25FeHByZXNzaW9uYCBhbmQgZGlzcGF0Y2hlZCB0byB0aGVcbiAgICoge0BsaW5rIENvbmRpdGlvbkV4cHJlc3Npb25FdmFsdWF0b3J9LlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbmRpdGlvbkV4cHJlc3Npb24oY29uZGl0aW9uOiBHcmFwaENvbmRpdGlvbkRlZmluaXRpb24gfCBDb25kaXRpb25FeHByZXNzaW9uKTogY29uZGl0aW9uIGlzIENvbmRpdGlvbkV4cHJlc3Npb24ge1xuICAgIHJldHVybiB0eXBlb2YgKGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHsgb3A/OiBzdHJpbmcgfSkub3AgPT09IFwic3RyaW5nXCI7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context for a single loop execution, carrying the loop metadata and
|
|
3
|
+
* current iteration index.
|
|
4
|
+
*/
|
|
5
|
+
export class GraphLoopExecutionContext {
|
|
6
|
+
constructor(iteration, metadata) {
|
|
7
|
+
this.iteration = iteration;
|
|
8
|
+
this.metadata = metadata;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhMb29wRXhlY3V0aW9uQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvbG9vcHMvR3JhcGhMb29wRXhlY3V0aW9uQ29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8seUJBQXlCO0lBSXBDLFlBQVksU0FBaUIsRUFBRSxRQUEyQjtRQUN4RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL2xvb3BzL0dyYXBoTG9vcEV4ZWN1dGlvbkNvbnRleHRcbiAqIEBzdW1tYXJ5IENvbnRleHQgZm9yIGxvb3Agbm9kZSBleGVjdXRpb24uXG4gKiBAZGVzY3JpcHRpb24gQ2FycmllcyBsb29wLXNwZWNpZmljIG1ldGFkYXRhIGFuZCBpdGVyYXRpb24gc3RhdGUgZHVyaW5nIGxvb3AgZXhlY3V0aW9uLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoTG9vcE1ldGFkYXRhIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQ29udGV4dCBmb3IgYSBzaW5nbGUgbG9vcCBleGVjdXRpb24sIGNhcnJ5aW5nIHRoZSBsb29wIG1ldGFkYXRhIGFuZFxuICogY3VycmVudCBpdGVyYXRpb24gaW5kZXguXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaExvb3BFeGVjdXRpb25Db250ZXh0IHtcbiAgcmVhZG9ubHkgaXRlcmF0aW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBHcmFwaExvb3BNZXRhZGF0YTtcblxuICBjb25zdHJ1Y3RvcihpdGVyYXRpb246IG51bWJlciwgbWV0YWRhdGE6IEdyYXBoTG9vcE1ldGFkYXRhKSB7XG4gICAgdGhpcy5pdGVyYXRpb24gPSBpdGVyYXRpb247XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { GRAPH_DEFAULT_MAX_LOOP_ITERATIONS } from "./../constants.js";
|
|
2
|
+
import { GraphExecutionEventType } from "./../../shared/constants.js";
|
|
3
|
+
import { GraphInputError } from "./../errors/GraphInputError.js";
|
|
4
|
+
import { GraphLoopLimitError } from "./../errors/GraphLoopLimitError.js";
|
|
5
|
+
import { GraphConditionEvaluator } from "./GraphConditionEvaluator.js";
|
|
6
|
+
/**
|
|
7
|
+
* Executor for `core.loop.until` nodes.
|
|
8
|
+
*
|
|
9
|
+
* Executes the body at least once, then checks the condition. Repeats until
|
|
10
|
+
* the condition evaluates to true.
|
|
11
|
+
*/
|
|
12
|
+
export class UntilGraphNodeExecutor {
|
|
13
|
+
constructor(engine) {
|
|
14
|
+
this.engine = engine;
|
|
15
|
+
this.evaluator = new GraphConditionEvaluator();
|
|
16
|
+
}
|
|
17
|
+
async execute(input, context) {
|
|
18
|
+
const metadata = this.extractMetadata(context);
|
|
19
|
+
const maxIterations = metadata.maxIterations ?? GRAPH_DEFAULT_MAX_LOOP_ITERATIONS;
|
|
20
|
+
const condition = metadata.condition;
|
|
21
|
+
if (!condition) {
|
|
22
|
+
throw new GraphInputError("until node is missing a condition");
|
|
23
|
+
}
|
|
24
|
+
const statePort = metadata.statePort ?? "state";
|
|
25
|
+
const bodyWorkflow = metadata.body;
|
|
26
|
+
let state = input.state;
|
|
27
|
+
let iteration = 0;
|
|
28
|
+
await context.emit({ type: GraphExecutionEventType.LOOP_STARTED });
|
|
29
|
+
let shouldStop = false;
|
|
30
|
+
do {
|
|
31
|
+
if (iteration >= maxIterations) {
|
|
32
|
+
await context.emit({
|
|
33
|
+
type: GraphExecutionEventType.LOOP_LIMIT_REACHED,
|
|
34
|
+
iteration,
|
|
35
|
+
});
|
|
36
|
+
throw new GraphLoopLimitError(`until loop exceeded max iterations (${maxIterations})`);
|
|
37
|
+
}
|
|
38
|
+
await context.emit({
|
|
39
|
+
type: GraphExecutionEventType.LOOP_ITERATION_STARTED,
|
|
40
|
+
iteration,
|
|
41
|
+
});
|
|
42
|
+
const childResult = await this.engine.execute(bodyWorkflow, { [statePort]: state, iteration }, {
|
|
43
|
+
parentRunId: context.runId,
|
|
44
|
+
path: [...context.path, `iteration:${iteration}`],
|
|
45
|
+
});
|
|
46
|
+
state = childResult.outputs[statePort];
|
|
47
|
+
await context.emit({
|
|
48
|
+
type: GraphExecutionEventType.LOOP_ITERATION_COMPLETED,
|
|
49
|
+
iteration,
|
|
50
|
+
});
|
|
51
|
+
const conditionResult = this.evaluator.evaluate(condition, state);
|
|
52
|
+
await context.emit({
|
|
53
|
+
type: GraphExecutionEventType.LOOP_CONDITION_EVALUATED,
|
|
54
|
+
iteration,
|
|
55
|
+
payload: { result: conditionResult },
|
|
56
|
+
});
|
|
57
|
+
iteration++;
|
|
58
|
+
shouldStop = conditionResult;
|
|
59
|
+
} while (!shouldStop);
|
|
60
|
+
await context.emit({ type: GraphExecutionEventType.LOOP_COMPLETED });
|
|
61
|
+
return { [statePort]: state, iterations: iteration };
|
|
62
|
+
}
|
|
63
|
+
extractMetadata(context) {
|
|
64
|
+
const raw = context.node.graph?.metadata?.loop ??
|
|
65
|
+
context.metadata?.loop;
|
|
66
|
+
if (!raw) {
|
|
67
|
+
throw new GraphInputError("until node is missing loop metadata");
|
|
68
|
+
}
|
|
69
|
+
return raw;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW50aWxHcmFwaE5vZGVFeGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvbG9vcHMvVW50aWxHcmFwaE5vZGVFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsMEJBQXFCO0FBQ2pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxvQ0FBK0I7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSx1Q0FBa0M7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDJDQUFzQztBQUNwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUscUNBQWtDO0FBRXBFOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQUdqQyxZQUE2QixNQUE0QjtRQUE1QixXQUFNLEdBQU4sTUFBTSxDQUFzQjtRQUZ4QyxjQUFTLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO0lBRUMsQ0FBQztJQUU3RCxLQUFLLENBQUMsT0FBTyxDQUNYLEtBQTJCLEVBQzNCLE9BQThCO1FBRTlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQ2pCLFFBQVEsQ0FBQyxhQUFhLElBQUksaUNBQWlDLENBQUM7UUFDOUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZUFBZSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUErQixDQUFDO1FBRTlELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDeEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRW5FLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV2QixHQUFHLENBQUM7WUFDRixJQUFJLFNBQVMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNqQixJQUFJLEVBQUUsdUJBQXVCLENBQUMsa0JBQWtCO29CQUNoRCxTQUFTO2lCQUNWLENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksbUJBQW1CLENBQzNCLHVDQUF1QyxhQUFhLEdBQUcsQ0FDeEQsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxzQkFBc0I7Z0JBQ3BELFNBQVM7YUFDVixDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUMzQyxZQUFZLEVBQ1osRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFDakM7Z0JBQ0UsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUMxQixJQUFJLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsYUFBYSxTQUFTLEVBQUUsQ0FBQzthQUNsRCxDQUNGLENBQUM7WUFFRixLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV2QyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksRUFBRSx1QkFBdUIsQ0FBQyx3QkFBd0I7Z0JBQ3RELFNBQVM7YUFDVixDQUFDLENBQUM7WUFFSCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbEUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNqQixJQUFJLEVBQUUsdUJBQXVCLENBQUMsd0JBQXdCO2dCQUN0RCxTQUFTO2dCQUNULE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUU7YUFDckMsQ0FBQyxDQUFDO1lBRUgsU0FBUyxFQUFFLENBQUM7WUFDWixVQUFVLEdBQUcsZUFBZSxDQUFDO1FBQy9CLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUV0QixNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVyRSxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTyxlQUFlLENBQUMsT0FBOEI7UUFDcEQsTUFBTSxHQUFHLEdBQUksT0FBTyxDQUFDLElBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUk7WUFDcEQsT0FBTyxDQUFDLFFBQWdCLEVBQUUsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxlQUFlLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsT0FBTyxHQUF3QixDQUFDO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvbG9vcHMvVW50aWxHcmFwaE5vZGVFeGVjdXRvclxuICogQHN1bW1hcnkgVW50aWwgbG9vcCBub2RlIGV4ZWN1dG9yLlxuICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgYm9keSB3b3JrZmxvdyBhdCBsZWFzdCBvbmNlIGFuZCByZXBlYXRzIHVudGlsIGEgY29uZGl0aW9uIGlzIHRydWUuXG4gKi9cbmltcG9ydCB0eXBlIHsgR3JhcGhOb2RlRXhlY3V0b3IgfSBmcm9tIFwiLi4vZXhlY3V0aW9uL0dyYXBoTm9kZUV4ZWN1dG9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuLi9leGVjdXRpb24vR3JhcGhFeGVjdXRpb25Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uRW5naW5lIH0gZnJvbSBcIi4uL2V4ZWN1dGlvbi9HcmFwaEV4ZWN1dGlvbkVuZ2luZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblZhbHVlcywgR3JhcGhMb29wTWV0YWRhdGEgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcblxuaW1wb3J0IHsgR1JBUEhfREVGQVVMVF9NQVhfTE9PUF9JVEVSQVRJT05TIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgR3JhcGhJbnB1dEVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaElucHV0RXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoTG9vcExpbWl0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL0dyYXBoTG9vcExpbWl0RXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoQ29uZGl0aW9uRXZhbHVhdG9yIH0gZnJvbSBcIi4vR3JhcGhDb25kaXRpb25FdmFsdWF0b3JcIjtcblxuLyoqXG4gKiBFeGVjdXRvciBmb3IgYGNvcmUubG9vcC51bnRpbGAgbm9kZXMuXG4gKlxuICogRXhlY3V0ZXMgdGhlIGJvZHkgYXQgbGVhc3Qgb25jZSwgdGhlbiBjaGVja3MgdGhlIGNvbmRpdGlvbi4gUmVwZWF0cyB1bnRpbFxuICogdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVudGlsR3JhcGhOb2RlRXhlY3V0b3IgaW1wbGVtZW50cyBHcmFwaE5vZGVFeGVjdXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZhbHVhdG9yID0gbmV3IEdyYXBoQ29uZGl0aW9uRXZhbHVhdG9yKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbmdpbmU6IEdyYXBoRXhlY3V0aW9uRW5naW5lKSB7fVxuXG4gIGFzeW5jIGV4ZWN1dGUoXG4gICAgaW5wdXQ6IEdyYXBoRXhlY3V0aW9uVmFsdWVzLFxuICAgIGNvbnRleHQ6IEdyYXBoRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPEdyYXBoRXhlY3V0aW9uVmFsdWVzPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4dHJhY3RNZXRhZGF0YShjb250ZXh0KTtcbiAgICBjb25zdCBtYXhJdGVyYXRpb25zID1cbiAgICAgIG1ldGFkYXRhLm1heEl0ZXJhdGlvbnMgPz8gR1JBUEhfREVGQVVMVF9NQVhfTE9PUF9JVEVSQVRJT05TO1xuICAgIGNvbnN0IGNvbmRpdGlvbiA9IG1ldGFkYXRhLmNvbmRpdGlvbjtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoSW5wdXRFcnJvcihcInVudGlsIG5vZGUgaXMgbWlzc2luZyBhIGNvbmRpdGlvblwiKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVQb3J0ID0gbWV0YWRhdGEuc3RhdGVQb3J0ID8/IFwic3RhdGVcIjtcbiAgICBjb25zdCBib2R5V29ya2Zsb3cgPSBtZXRhZGF0YS5ib2R5IGFzIEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uO1xuXG4gICAgbGV0IHN0YXRlID0gaW5wdXQuc3RhdGU7XG4gICAgbGV0IGl0ZXJhdGlvbiA9IDA7XG5cbiAgICBhd2FpdCBjb250ZXh0LmVtaXQoeyB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5MT09QX1NUQVJURUQgfSk7XG5cbiAgICBsZXQgc2hvdWxkU3RvcCA9IGZhbHNlO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKGl0ZXJhdGlvbiA+PSBtYXhJdGVyYXRpb25zKSB7XG4gICAgICAgIGF3YWl0IGNvbnRleHQuZW1pdCh7XG4gICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTE9PUF9MSU1JVF9SRUFDSEVELFxuICAgICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaExvb3BMaW1pdEVycm9yKFxuICAgICAgICAgIGB1bnRpbCBsb29wIGV4Y2VlZGVkIG1heCBpdGVyYXRpb25zICgke21heEl0ZXJhdGlvbnN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgY29udGV4dC5lbWl0KHtcbiAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTE9PUF9JVEVSQVRJT05fU1RBUlRFRCxcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gYXdhaXQgdGhpcy5lbmdpbmUuZXhlY3V0ZShcbiAgICAgICAgYm9keVdvcmtmbG93LFxuICAgICAgICB7IFtzdGF0ZVBvcnRdOiBzdGF0ZSwgaXRlcmF0aW9uIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJlbnRSdW5JZDogY29udGV4dC5ydW5JZCxcbiAgICAgICAgICBwYXRoOiBbLi4uY29udGV4dC5wYXRoLCBgaXRlcmF0aW9uOiR7aXRlcmF0aW9ufWBdLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBzdGF0ZSA9IGNoaWxkUmVzdWx0Lm91dHB1dHNbc3RhdGVQb3J0XTtcblxuICAgICAgYXdhaXQgY29udGV4dC5lbWl0KHtcbiAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTE9PUF9JVEVSQVRJT05fQ09NUExFVEVELFxuICAgICAgICBpdGVyYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0ID0gdGhpcy5ldmFsdWF0b3IuZXZhbHVhdGUoY29uZGl0aW9uLCBzdGF0ZSk7XG5cbiAgICAgIGF3YWl0IGNvbnRleHQuZW1pdCh7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkxPT1BfQ09ORElUSU9OX0VWQUxVQVRFRCxcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBwYXlsb2FkOiB7IHJlc3VsdDogY29uZGl0aW9uUmVzdWx0IH0sXG4gICAgICB9KTtcblxuICAgICAgaXRlcmF0aW9uKys7XG4gICAgICBzaG91bGRTdG9wID0gY29uZGl0aW9uUmVzdWx0O1xuICAgIH0gd2hpbGUgKCFzaG91bGRTdG9wKTtcblxuICAgIGF3YWl0IGNvbnRleHQuZW1pdCh7IHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkxPT1BfQ09NUExFVEVEIH0pO1xuXG4gICAgcmV0dXJuIHsgW3N0YXRlUG9ydF06IHN0YXRlLCBpdGVyYXRpb25zOiBpdGVyYXRpb24gfTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1ldGFkYXRhKGNvbnRleHQ6IEdyYXBoRXhlY3V0aW9uQ29udGV4dCk6IEdyYXBoTG9vcE1ldGFkYXRhIHtcbiAgICBjb25zdCByYXcgPSAoY29udGV4dC5ub2RlIGFzIGFueSkuZ3JhcGg/Lm1ldGFkYXRhPy5sb29wID8/XG4gICAgICAoY29udGV4dC5tZXRhZGF0YSBhcyBhbnkpPy5sb29wO1xuICAgIGlmICghcmF3KSB7XG4gICAgICB0aHJvdyBuZXcgR3JhcGhJbnB1dEVycm9yKFwidW50aWwgbm9kZSBpcyBtaXNzaW5nIGxvb3AgbWV0YWRhdGFcIik7XG4gICAgfVxuICAgIHJldHVybiByYXcgYXMgR3JhcGhMb29wTWV0YWRhdGE7XG4gIH1cbn1cbiJdfQ==
|