@decaf-ts/integrations 0.3.4 → 0.3.5
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/execution/CodeSandboxEvaluator.cjs +4 -0
- package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +3 -2
- package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +95 -0
- package/lib/cjs/graph/execution/index.cjs +4 -2
- package/lib/cjs/graph/index.cjs +7 -2
- package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +87 -0
- package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +25 -3
- package/lib/cjs/graph/loops/index.cjs +3 -2
- package/lib/cjs/graph/nodes/agent.cjs +110 -0
- package/lib/cjs/graph/nodes/category-styles.cjs +38 -0
- package/lib/cjs/graph/nodes/flow-control.cjs +436 -0
- package/lib/cjs/graph/nodes/index.cjs +34 -0
- package/lib/cjs/graph/nodes/triggers.cjs +250 -0
- package/lib/cjs/graph/types.cjs +2 -2
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +5 -4
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs +5 -4
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +5 -4
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +8 -7
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +5 -4
- package/lib/cjs/keycloak/services/KeycloakService.cjs +5 -3
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs +5 -4
- package/lib/cjs/keycloak/services/runtime.cjs +20 -0
- package/lib/cjs/kibana/services/KibanaAuthService.cjs +6 -5
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs +9 -8
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs +7 -6
- package/lib/cjs/kibana/services/KibanaRoleService.cjs +5 -4
- package/lib/cjs/kibana/services/KibanaService.cjs +4 -2
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs +5 -4
- package/lib/cjs/kibana/services/KibanaUserService.cjs +5 -4
- package/lib/cjs/kibana/services/runtime.cjs +20 -0
- package/lib/esm/graph/execution/CodeSandboxEvaluator.js +18 -0
- package/lib/esm/graph/execution/GraphExecutionEngine.js +2 -1
- package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +90 -0
- package/lib/esm/graph/execution/index.js +3 -1
- package/lib/esm/graph/index.js +6 -1
- package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +82 -0
- package/lib/esm/graph/loops/GraphConditionEvaluator.js +24 -2
- package/lib/esm/graph/loops/index.js +2 -1
- package/lib/esm/graph/nodes/agent.js +101 -0
- package/lib/esm/graph/nodes/category-styles.js +34 -0
- package/lib/esm/graph/nodes/flow-control.js +427 -0
- package/lib/esm/graph/nodes/index.js +17 -0
- package/lib/esm/graph/nodes/triggers.js +241 -0
- package/lib/esm/graph/types.js +1 -1
- package/lib/esm/index.js +3 -3
- package/lib/esm/keycloak/services/KeycloakAuthService.js +4 -3
- package/lib/esm/keycloak/services/KeycloakClientService.js +4 -3
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js +4 -3
- package/lib/esm/keycloak/services/KeycloakRealmService.js +4 -3
- package/lib/esm/keycloak/services/KeycloakRoleService.js +4 -3
- package/lib/esm/keycloak/services/KeycloakService.js +4 -2
- package/lib/esm/keycloak/services/KeycloakUserService.js +4 -3
- package/lib/esm/keycloak/services/runtime.js +15 -0
- package/lib/esm/kibana/services/KibanaAuthService.js +5 -4
- package/lib/esm/kibana/services/KibanaDashboardService.js +5 -4
- package/lib/esm/kibana/services/KibanaDataViewService.js +4 -3
- package/lib/esm/kibana/services/KibanaRoleService.js +4 -3
- package/lib/esm/kibana/services/KibanaService.js +3 -1
- package/lib/esm/kibana/services/KibanaSpaceService.js +4 -3
- package/lib/esm/kibana/services/KibanaUserService.js +4 -3
- package/lib/esm/kibana/services/runtime.js +15 -0
- package/lib/types/graph/execution/CodeSandboxEvaluator.d.cts +53 -0
- package/lib/types/graph/execution/CodeSandboxEvaluator.d.mts +53 -0
- package/lib/types/graph/execution/GraphExecutionEngine.d.cts +10 -0
- package/lib/types/graph/execution/GraphExecutionEngine.d.mts +10 -0
- package/lib/types/graph/execution/SwitchGraphNodeExecutor.d.cts +42 -0
- package/lib/types/graph/execution/SwitchGraphNodeExecutor.d.mts +42 -0
- package/lib/types/graph/execution/index.d.cts +2 -0
- package/lib/types/graph/execution/index.d.mts +2 -0
- package/lib/types/graph/index.d.cts +4 -0
- package/lib/types/graph/index.d.mts +4 -0
- package/lib/types/graph/loops/ConditionExpressionEvaluator.d.cts +36 -0
- package/lib/types/graph/loops/ConditionExpressionEvaluator.d.mts +36 -0
- package/lib/types/graph/loops/GraphConditionEvaluator.d.cts +20 -4
- package/lib/types/graph/loops/GraphConditionEvaluator.d.mts +20 -4
- package/lib/types/graph/loops/index.d.cts +1 -0
- package/lib/types/graph/loops/index.d.mts +1 -0
- package/lib/types/graph/nodes/agent.d.cts +44 -0
- package/lib/types/graph/nodes/agent.d.mts +44 -0
- package/lib/types/graph/nodes/category-styles.d.cts +8 -0
- package/lib/types/graph/nodes/category-styles.d.mts +8 -0
- package/lib/types/graph/nodes/flow-control.d.cts +104 -0
- package/lib/types/graph/nodes/flow-control.d.mts +104 -0
- package/lib/types/graph/nodes/index.d.cts +16 -0
- package/lib/types/graph/nodes/index.d.mts +16 -0
- package/lib/types/graph/nodes/triggers.d.cts +53 -0
- package/lib/types/graph/nodes/triggers.d.mts +53 -0
- package/lib/types/graph/types.d.cts +102 -0
- package/lib/types/graph/types.d.mts +102 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/keycloak/services/runtime.d.cts +6 -0
- package/lib/types/keycloak/services/runtime.d.mts +6 -0
- package/lib/types/kibana/services/runtime.d.cts +6 -0
- package/lib/types/kibana/services/runtime.d.mts +6 -0
- package/package.json +1 -1
|
@@ -0,0 +1,90 @@
|
|
|
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" && cond !== null && "type" in cond && cond.type === "code";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Detects whether a condition is a `ConditionExpression` (has `op` field).
|
|
27
|
+
*/
|
|
28
|
+
function isConditionExpression(cond) {
|
|
29
|
+
return typeof cond === "object" && cond !== null && "op" in cond && typeof cond.op === "string";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Executor for `core.flow.switch` nodes.
|
|
33
|
+
*
|
|
34
|
+
* Evaluates each case's condition in order and routes the input to the
|
|
35
|
+
* first matching case's output port. When no case matches, routes to the
|
|
36
|
+
* `default` output port.
|
|
37
|
+
*
|
|
38
|
+
* Condition evaluation:
|
|
39
|
+
* - `ConditionExpression` — evaluated via {@link ConditionExpressionEvaluator}.
|
|
40
|
+
* - `CodeCondition` — evaluated via the pluggable {@link CodeSandboxEvaluator}
|
|
41
|
+
* from the engine's config. Throws `GRAPH_CODE_SANDBOX_NOT_CONFIGURED`
|
|
42
|
+
* when no evaluator is registered.
|
|
43
|
+
*/
|
|
44
|
+
export class SwitchGraphNodeExecutor {
|
|
45
|
+
constructor(engine) {
|
|
46
|
+
this.engine = engine;
|
|
47
|
+
this.expressionEvaluator = new ConditionExpressionEvaluator();
|
|
48
|
+
}
|
|
49
|
+
async execute(input, context) {
|
|
50
|
+
const meta = readSwitchMetadata(context);
|
|
51
|
+
const inputValue = input["value"] ?? input;
|
|
52
|
+
for (const switchCase of meta.cases) {
|
|
53
|
+
const matches = await this.evaluateCondition(switchCase.condition, inputValue, input, context);
|
|
54
|
+
if (matches) {
|
|
55
|
+
return { [switchCase.outputPort]: inputValue };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const defaultPort = meta.defaultPort ?? "default";
|
|
59
|
+
return { [defaultPort]: inputValue };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Evaluates a single switch case condition.
|
|
63
|
+
*/
|
|
64
|
+
async evaluateCondition(condition, inputValue, fullInput, context) {
|
|
65
|
+
if (isCodeCondition(condition)) {
|
|
66
|
+
return this.evaluateCodeCondition(condition, fullInput, context);
|
|
67
|
+
}
|
|
68
|
+
if (isConditionExpression(condition)) {
|
|
69
|
+
return this.expressionEvaluator.evaluate(condition, inputValue);
|
|
70
|
+
}
|
|
71
|
+
throw new GraphExecutionError("Unknown switch case condition type — must be ConditionExpression (op) or CodeCondition (type: 'code')", "GRAPH_UNKNOWN_SWITCH_CONDITION", { condition });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Evaluates a code condition via the pluggable sandbox evaluator.
|
|
75
|
+
*/
|
|
76
|
+
async evaluateCodeCondition(condition, input, context) {
|
|
77
|
+
const evaluator = this.engine?.codeSandboxEvaluator;
|
|
78
|
+
if (!evaluator) {
|
|
79
|
+
throw new GraphExecutionError("Code conditions require a CodeSandboxEvaluator to be registered in GraphExecutionEngineConfig.codeSandboxEvaluator", "GRAPH_CODE_SANDBOX_NOT_CONFIGURED", { code: condition.code });
|
|
80
|
+
}
|
|
81
|
+
await context.log(`Evaluating code condition`, { language: condition.language ?? "javascript" });
|
|
82
|
+
const result = await evaluator.evaluate({
|
|
83
|
+
code: condition.code,
|
|
84
|
+
language: condition.language,
|
|
85
|
+
input,
|
|
86
|
+
});
|
|
87
|
+
return !!result;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3dpdGNoR3JhcGhOb2RlRXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZXhlY3V0aW9uL1N3aXRjaEdyYXBoTm9kZUV4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsMkNBQXNDO0FBQ3BFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxtREFBOEM7QUFHckY7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE9BQThCO0lBQ3hELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQStDLENBQUM7SUFDakYsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBbUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU87UUFDTCxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXLElBQUksU0FBUztLQUNqRCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsSUFBeUI7SUFDaEQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDO0FBQzdGLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMscUJBQXFCLENBQUMsSUFBeUI7SUFDdEQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUM7QUFDbEcsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFHbEMsWUFBNkIsTUFBd0Q7UUFBeEQsV0FBTSxHQUFOLE1BQU0sQ0FBa0Q7UUFGcEUsd0JBQW1CLEdBQUcsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO0lBRWMsQ0FBQztJQUV6RixLQUFLLENBQUMsT0FBTyxDQUNYLEtBQTJCLEVBQzNCLE9BQThCO1FBRTlCLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUM7UUFFM0MsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9GLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUM7UUFDbEQsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQixDQUM3QixTQUE4QixFQUM5QixVQUFtQixFQUNuQixTQUErQixFQUMvQixPQUE4QjtRQUU5QixJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELElBQUkscUJBQXFCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxNQUFNLElBQUksbUJBQW1CLENBQzNCLHVHQUF1RyxFQUN2RyxnQ0FBZ0MsRUFDaEMsRUFBRSxTQUFTLEVBQUUsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxTQUF3QixFQUN4QixLQUEyQixFQUMzQixPQUE4QjtRQUU5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0Isb0hBQW9ILEVBQ3BILG1DQUFtQyxFQUNuQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQ3pCLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQztRQUVqRyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDdEMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1lBQ3BCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvZXhlY3V0aW9uL1N3aXRjaEdyYXBoTm9kZUV4ZWN1dG9yXG4gKiBAc3VtbWFyeSBFeGVjdXRvciBmb3IgdGhlIFN3aXRjaCBmbG93LWNvbnRyb2wgbm9kZSAoREVDQUYtMzIgwqcyMi4yLjIpLlxuICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyBlYWNoIGNhc2UncyBjb25kaXRpb24gYWdhaW5zdCB0aGUgbm9kZSdzIGlucHV0IGFuZFxuICogcm91dGVzIHRoZSBpbnB1dCB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgY2FzZSdzIG91dHB1dCBwb3J0LiBGYWxscyBiYWNrIHRvXG4gKiB0aGUgYGRlZmF1bHRgIG91dHB1dCB3aGVuIG5vIGNhc2UgbWF0Y2hlcy4gU3VwcG9ydHMgYm90aFxuICoge0BsaW5rIENvbmRpdGlvbkV4cHJlc3Npb259IChncmFwaGljYWwgbW9kZSkgYW5kIHtAbGluayBDb2RlQ29uZGl0aW9ufVxuICogKGNvZGUgbW9kZSB2aWEgdGhlIHBsdWdnYWJsZSB7QGxpbmsgQ29kZVNhbmRib3hFdmFsdWF0b3J9KS5cbiAqL1xuaW1wb3J0IHR5cGUgeyBHcmFwaE5vZGVFeGVjdXRvciB9IGZyb20gXCIuL0dyYXBoTm9kZUV4ZWN1dG9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUge1xuICBHcmFwaEV4ZWN1dGlvblZhbHVlcyxcbiAgU3dpdGNoQ2FzZSxcbiAgU3dpdGNoQ2FzZUNvbmRpdGlvbixcbiAgU3dpdGNoTm9kZU1ldGFkYXRhLFxuICBDb25kaXRpb25FeHByZXNzaW9uLFxuICBDb2RlQ29uZGl0aW9uLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL0dyYXBoRXhlY3V0aW9uRXJyb3JcIjtcbmltcG9ydCB7IENvbmRpdGlvbkV4cHJlc3Npb25FdmFsdWF0b3IgfSBmcm9tIFwiLi4vbG9vcHMvQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvclwiO1xuaW1wb3J0IHR5cGUgeyBDb2RlU2FuZGJveEV2YWx1YXRvciB9IGZyb20gXCIuL0NvZGVTYW5kYm94RXZhbHVhdG9yXCI7XG5cbi8qKlxuICogUmVhZHMgdGhlIFN3aXRjaCBtZXRhZGF0YSBmcm9tIHRoZSBub2RlIGRlZmluaXRpb24ncyBncmFwaCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gcmVhZFN3aXRjaE1ldGFkYXRhKGNvbnRleHQ6IEdyYXBoRXhlY3V0aW9uQ29udGV4dCk6IFN3aXRjaE5vZGVNZXRhZGF0YSB7XG4gIGNvbnN0IG1ldGEgPSBjb250ZXh0Lm5vZGUuZ3JhcGg/Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBpZiAoIW1ldGEpIHJldHVybiB7IGNhc2VzOiBbXSwgZGVmYXVsdFBvcnQ6IFwiZGVmYXVsdFwiIH07XG4gIGNvbnN0IHN3aXRjaE1ldGEgPSBtZXRhW1wic3dpdGNoXCJdIGFzIFN3aXRjaE5vZGVNZXRhZGF0YSB8IHVuZGVmaW5lZDtcbiAgaWYgKCFzd2l0Y2hNZXRhIHx8ICFBcnJheS5pc0FycmF5KHN3aXRjaE1ldGEuY2FzZXMpKSB7XG4gICAgcmV0dXJuIHsgY2FzZXM6IFtdLCBkZWZhdWx0UG9ydDogXCJkZWZhdWx0XCIgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNhc2VzOiBzd2l0Y2hNZXRhLmNhc2VzLFxuICAgIGRlZmF1bHRQb3J0OiBzd2l0Y2hNZXRhLmRlZmF1bHRQb3J0ID8/IFwiZGVmYXVsdFwiLFxuICB9O1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBhIGNvbmRpdGlvbiBpcyBhIGBDb2RlQ29uZGl0aW9uYCAoaGFzIGB0eXBlOiBcImNvZGVcImApLlxuICovXG5mdW5jdGlvbiBpc0NvZGVDb25kaXRpb24oY29uZDogU3dpdGNoQ2FzZUNvbmRpdGlvbik6IGNvbmQgaXMgQ29kZUNvbmRpdGlvbiB7XG4gIHJldHVybiB0eXBlb2YgY29uZCA9PT0gXCJvYmplY3RcIiAmJiBjb25kICE9PSBudWxsICYmIFwidHlwZVwiIGluIGNvbmQgJiYgY29uZC50eXBlID09PSBcImNvZGVcIjtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgYSBjb25kaXRpb24gaXMgYSBgQ29uZGl0aW9uRXhwcmVzc2lvbmAgKGhhcyBgb3BgIGZpZWxkKS5cbiAqL1xuZnVuY3Rpb24gaXNDb25kaXRpb25FeHByZXNzaW9uKGNvbmQ6IFN3aXRjaENhc2VDb25kaXRpb24pOiBjb25kIGlzIENvbmRpdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gdHlwZW9mIGNvbmQgPT09IFwib2JqZWN0XCIgJiYgY29uZCAhPT0gbnVsbCAmJiBcIm9wXCIgaW4gY29uZCAmJiB0eXBlb2YgY29uZC5vcCA9PT0gXCJzdHJpbmdcIjtcbn1cblxuLyoqXG4gKiBFeGVjdXRvciBmb3IgYGNvcmUuZmxvdy5zd2l0Y2hgIG5vZGVzLlxuICpcbiAqIEV2YWx1YXRlcyBlYWNoIGNhc2UncyBjb25kaXRpb24gaW4gb3JkZXIgYW5kIHJvdXRlcyB0aGUgaW5wdXQgdG8gdGhlXG4gKiBmaXJzdCBtYXRjaGluZyBjYXNlJ3Mgb3V0cHV0IHBvcnQuIFdoZW4gbm8gY2FzZSBtYXRjaGVzLCByb3V0ZXMgdG8gdGhlXG4gKiBgZGVmYXVsdGAgb3V0cHV0IHBvcnQuXG4gKlxuICogQ29uZGl0aW9uIGV2YWx1YXRpb246XG4gKiAtIGBDb25kaXRpb25FeHByZXNzaW9uYCDigJQgZXZhbHVhdGVkIHZpYSB7QGxpbmsgQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvcn0uXG4gKiAtIGBDb2RlQ29uZGl0aW9uYCDigJQgZXZhbHVhdGVkIHZpYSB0aGUgcGx1Z2dhYmxlIHtAbGluayBDb2RlU2FuZGJveEV2YWx1YXRvcn1cbiAqICAgZnJvbSB0aGUgZW5naW5lJ3MgY29uZmlnLiBUaHJvd3MgYEdSQVBIX0NPREVfU0FOREJPWF9OT1RfQ09ORklHVVJFRGBcbiAqICAgd2hlbiBubyBldmFsdWF0b3IgaXMgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN3aXRjaEdyYXBoTm9kZUV4ZWN1dG9yIGltcGxlbWVudHMgR3JhcGhOb2RlRXhlY3V0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cHJlc3Npb25FdmFsdWF0b3IgPSBuZXcgQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZW5naW5lPzogeyBjb2RlU2FuZGJveEV2YWx1YXRvcj86IENvZGVTYW5kYm94RXZhbHVhdG9yIH0pIHt9XG5cbiAgYXN5bmMgZXhlY3V0ZShcbiAgICBpbnB1dDogR3JhcGhFeGVjdXRpb25WYWx1ZXMsXG4gICAgY29udGV4dDogR3JhcGhFeGVjdXRpb25Db250ZXh0XG4gICk6IFByb21pc2U8R3JhcGhFeGVjdXRpb25WYWx1ZXM+IHtcbiAgICBjb25zdCBtZXRhID0gcmVhZFN3aXRjaE1ldGFkYXRhKGNvbnRleHQpO1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSBpbnB1dFtcInZhbHVlXCJdID8/IGlucHV0O1xuXG4gICAgZm9yIChjb25zdCBzd2l0Y2hDYXNlIG9mIG1ldGEuY2FzZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKHN3aXRjaENhc2UuY29uZGl0aW9uLCBpbnB1dFZhbHVlLCBpbnB1dCwgY29udGV4dCk7XG4gICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICByZXR1cm4geyBbc3dpdGNoQ2FzZS5vdXRwdXRQb3J0XTogaW5wdXRWYWx1ZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gbWV0YS5kZWZhdWx0UG9ydCA/PyBcImRlZmF1bHRcIjtcbiAgICByZXR1cm4geyBbZGVmYXVsdFBvcnRdOiBpbnB1dFZhbHVlIH07XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc2luZ2xlIHN3aXRjaCBjYXNlIGNvbmRpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbHVhdGVDb25kaXRpb24oXG4gICAgY29uZGl0aW9uOiBTd2l0Y2hDYXNlQ29uZGl0aW9uLFxuICAgIGlucHV0VmFsdWU6IHVua25vd24sXG4gICAgZnVsbElucHV0OiBHcmFwaEV4ZWN1dGlvblZhbHVlcyxcbiAgICBjb250ZXh0OiBHcmFwaEV4ZWN1dGlvbkNvbnRleHRcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGlzQ29kZUNvbmRpdGlvbihjb25kaXRpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZUNvZGVDb25kaXRpb24oY29uZGl0aW9uLCBmdWxsSW5wdXQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbmRpdGlvbkV4cHJlc3Npb24oY29uZGl0aW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbkV2YWx1YXRvci5ldmFsdWF0ZShjb25kaXRpb24sIGlucHV0VmFsdWUpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgXCJVbmtub3duIHN3aXRjaCBjYXNlIGNvbmRpdGlvbiB0eXBlIOKAlCBtdXN0IGJlIENvbmRpdGlvbkV4cHJlc3Npb24gKG9wKSBvciBDb2RlQ29uZGl0aW9uICh0eXBlOiAnY29kZScpXCIsXG4gICAgICBcIkdSQVBIX1VOS05PV05fU1dJVENIX0NPTkRJVElPTlwiLFxuICAgICAgeyBjb25kaXRpb24gfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgY29kZSBjb25kaXRpb24gdmlhIHRoZSBwbHVnZ2FibGUgc2FuZGJveCBldmFsdWF0b3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV2YWx1YXRlQ29kZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvZGVDb25kaXRpb24sXG4gICAgaW5wdXQ6IEdyYXBoRXhlY3V0aW9uVmFsdWVzLFxuICAgIGNvbnRleHQ6IEdyYXBoRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBldmFsdWF0b3IgPSB0aGlzLmVuZ2luZT8uY29kZVNhbmRib3hFdmFsdWF0b3I7XG4gICAgaWYgKCFldmFsdWF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcIkNvZGUgY29uZGl0aW9ucyByZXF1aXJlIGEgQ29kZVNhbmRib3hFdmFsdWF0b3IgdG8gYmUgcmVnaXN0ZXJlZCBpbiBHcmFwaEV4ZWN1dGlvbkVuZ2luZUNvbmZpZy5jb2RlU2FuZGJveEV2YWx1YXRvclwiLFxuICAgICAgICBcIkdSQVBIX0NPREVfU0FOREJPWF9OT1RfQ09ORklHVVJFRFwiLFxuICAgICAgICB7IGNvZGU6IGNvbmRpdGlvbi5jb2RlIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgY29udGV4dC5sb2coYEV2YWx1YXRpbmcgY29kZSBjb25kaXRpb25gLCB7IGxhbmd1YWdlOiBjb25kaXRpb24ubGFuZ3VhZ2UgPz8gXCJqYXZhc2NyaXB0XCIgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBldmFsdWF0b3IuZXZhbHVhdGUoe1xuICAgICAgY29kZTogY29uZGl0aW9uLmNvZGUsXG4gICAgICBsYW5ndWFnZTogY29uZGl0aW9uLmxhbmd1YWdlLFxuICAgICAgaW5wdXQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gISFyZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -8,4 +8,6 @@ export * from "./GraphNodeExecutor.js";
|
|
|
8
8
|
export * from "./GraphExecutionResult.js";
|
|
9
9
|
export * from "./GraphExecutionFrame.js";
|
|
10
10
|
export * from "./GraphExecutionEngine.js";
|
|
11
|
-
|
|
11
|
+
export * from "./CodeSandboxEvaluator.js";
|
|
12
|
+
export * from "./SwitchGraphNodeExecutor.js";
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZXhlY3V0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCwyQ0FBd0M7QUFDeEMsdUNBQW9DO0FBQ3BDLDBDQUF1QztBQUN2Qyx5Q0FBc0M7QUFDdEMsMENBQXVDO0FBQ3ZDLDBDQUF1QztBQUN2Qyw2Q0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL2V4ZWN1dGlvblxuICogQHN1bW1hcnkgR3JhcGggZXhlY3V0aW9uIGNvbnRleHQgYW5kIGV4ZWN1dG9yIGludGVyZmFjZS5cbiAqIEBkZXNjcmlwdGlvbiBSZS1leHBvcnRzIHRoZSBncmFwaCBleGVjdXRpb24gY29udGV4dCBhbmQgbm9kZSBleGVjdXRvciBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uQ29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUmVzdWx0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkZyYW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkVuZ2luZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ29kZVNhbmRib3hFdmFsdWF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1N3aXRjaEdyYXBoTm9kZUV4ZWN1dG9yXCI7XG4iXX0=
|
package/lib/esm/graph/index.js
CHANGED
|
@@ -23,6 +23,8 @@ export * from "./execution/GraphNodeExecutor.js";
|
|
|
23
23
|
export * from "./execution/GraphExecutionFrame.js";
|
|
24
24
|
export * from "./execution/GraphExecutionResult.js";
|
|
25
25
|
export * from "./execution/GraphExecutionEngine.js";
|
|
26
|
+
export * from "./execution/CodeSandboxEvaluator.js";
|
|
27
|
+
export * from "./execution/SwitchGraphNodeExecutor.js";
|
|
26
28
|
export * from "./registry/GraphNodeExecutorRegistry.js";
|
|
27
29
|
export * from "./registry/GraphNodeExecutorResolver.js";
|
|
28
30
|
export * from "./store/GraphValueKey.js";
|
|
@@ -43,6 +45,7 @@ export * from "./validation/GraphPortSchemaResolver.js";
|
|
|
43
45
|
export * from "./validation/GraphValueValidator.js";
|
|
44
46
|
// Loops (TASK-216)
|
|
45
47
|
export * from "./loops/GraphConditionEvaluator.js";
|
|
48
|
+
export * from "./loops/ConditionExpressionEvaluator.js";
|
|
46
49
|
export * from "./loops/GraphLoopExecutionContext.js";
|
|
47
50
|
export * from "./loops/ForeachGraphNodeExecutor.js";
|
|
48
51
|
export * from "./loops/WhileGraphNodeExecutor.js";
|
|
@@ -54,4 +57,6 @@ export * from "./pinning/GraphPinningDependencyResolver.js";
|
|
|
54
57
|
export * from "./pinning/GraphPinningService.js";
|
|
55
58
|
// Snapshots (TASK-219)
|
|
56
59
|
export * from "./snapshots/GraphExecutionSnapshotMapper.js";
|
|
57
|
-
|
|
60
|
+
// Production node kind declarations (TASK-228 / §22.2)
|
|
61
|
+
export * from "./nodes/index.js";
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ3JhcGgvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILCtCQUE0QjtBQUM1QiwyQkFBd0I7QUFDeEIsZ0NBQTZCO0FBRTdCLGdEQUE2QztBQUM3Qyw0Q0FBeUM7QUFDekMsNENBQXlDO0FBQ3pDLGdEQUE2QztBQUM3Qyw4Q0FBMkM7QUFDM0MsMkNBQXdDO0FBQ3hDLDRDQUF5QztBQUN6QywrQ0FBNEM7QUFFNUMsZ0RBQTZDO0FBQzdDLG1EQUFnRDtBQUNoRCx1REFBb0Q7QUFDcEQsdURBQW9EO0FBRXBELHFEQUFrRDtBQUNsRCxpREFBOEM7QUFDOUMsbURBQWdEO0FBQ2hELG9EQUFpRDtBQUNqRCxvREFBaUQ7QUFDakQsb0RBQWlEO0FBQ2pELHVEQUFvRDtBQUVwRCx3REFBcUQ7QUFDckQsd0RBQXFEO0FBRXJELHlDQUFzQztBQUN0Qyw0Q0FBeUM7QUFDekMsa0RBQStDO0FBQy9DLDBEQUF1RDtBQUN2RCwyQ0FBd0M7QUFFeEMscURBQWtEO0FBQ2xELHFEQUFrRDtBQUNsRCxzREFBbUQ7QUFDbkQsaURBQThDO0FBQzlDLG9EQUFpRDtBQUNqRCxvREFBaUQ7QUFDakQsNENBQXlDO0FBRXpDLHdCQUF3QjtBQUN4Qix5REFBc0Q7QUFDdEQsd0RBQXFEO0FBQ3JELG9EQUFpRDtBQUVqRCxtQkFBbUI7QUFDbkIsbURBQWdEO0FBQ2hELHdEQUFxRDtBQUNyRCxxREFBa0Q7QUFDbEQsb0RBQWlEO0FBQ2pELGtEQUErQztBQUMvQyxrREFBK0M7QUFFL0MseUJBQXlCO0FBQ3pCLGtEQUErQztBQUMvQyxnREFBNkM7QUFDN0MsNERBQXlEO0FBQ3pELGlEQUE4QztBQUU5Qyx1QkFBdUI7QUFDdkIsNERBQXlEO0FBRXpELHVEQUF1RDtBQUN2RCxpQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoXG4gKiBAc3VtbWFyeSBEZWNhZiBHcmFwaCBFeGVjdXRpb24gRW5naW5lLlxuICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSBpbnRlcnByZXRlciBmb3IgRGVjYWYgZ3JhcGggd29ya2Zsb3dzLiBFeGVjdXRlcyB3b3JrZmxvd3MgZGVjbGFyZWQgd2l0aCBgQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhgLCBlbWl0cyBldmVudHMgdGhyb3VnaCBEZWNhZidzIE9ic2VydmFibGUgcGlwZWxpbmUsIHN1cHBvcnRzIHN0cnVjdHVyZWQgbG9vcHMsIGNvbmZpZ3VyYWJsZSB2YWx1ZSBzdG9yZXMsIGFuZCBwaW5uYWJsZS9jYWNoZWFibGUgbm9kZXMuXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMvR3JhcGhFeGVjdXRpb25FcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoQ3ljbGVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoSW5wdXRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoTG9vcExpbWl0RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9ycy9HcmFwaFBpbm5pbmdFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzL0dyYXBoUG9ydEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMvR3JhcGhTdG9yZUVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbkV2ZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMvR3JhcGhFeGVjdXRpb25PYnNlcnZlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzL0dyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMvR3JhcGhFeGVjdXRpb25FdmVudEZhY3RvcnlcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL0dyYXBoRXhlY3V0aW9uQ29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL0dyYXBoTm9kZUV4ZWN1dG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjdXRpb24vR3JhcGhFeGVjdXRpb25GcmFtZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL0dyYXBoRXhlY3V0aW9uUmVzdWx0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjdXRpb24vR3JhcGhFeGVjdXRpb25FbmdpbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4ZWN1dGlvbi9Db2RlU2FuZGJveEV2YWx1YXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY3V0aW9uL1N3aXRjaEdyYXBoTm9kZUV4ZWN1dG9yXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5L0dyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5L0dyYXBoTm9kZUV4ZWN1dG9yUmVzb2x2ZXJcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvR3JhcGhWYWx1ZUtleVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvR3JhcGhDYWNoZWRWYWx1ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvR3JhcGhWYWx1ZVN0b3JlQWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdG9yZS9HcmFwaFZhbHVlU3RvcmVcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFuTm9kZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFuRWRnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxhbm5pbmcvR3JhcGhSZWxhdGlvblJlc29sdmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsYW5uaW5nL0dyYXBoVG9wb2xvZ3lcIjtcblxuLy8gVmFsaWRhdGlvbiAoVEFTSy0yMTUpXG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uL0dyYXBoRGVmaW5pdGlvblZhbGlkYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvbi9HcmFwaFBvcnRTY2hlbWFSZXNvbHZlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvbi9HcmFwaFZhbHVlVmFsaWRhdG9yXCI7XG5cbi8vIExvb3BzIChUQVNLLTIxNilcbmV4cG9ydCAqIGZyb20gXCIuL2xvb3BzL0dyYXBoQ29uZGl0aW9uRXZhbHVhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb29wcy9Db25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb29wcy9HcmFwaExvb3BFeGVjdXRpb25Db250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb29wcy9Gb3JlYWNoR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvb3BzL1doaWxlR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvb3BzL1VudGlsR3JhcGhOb2RlRXhlY3V0b3JcIjtcblxuLy8gUGlubmluZyAoVEFTSy0yMTcvMjE4KVxuZXhwb3J0ICogZnJvbSBcIi4vcGlubmluZy9HcmFwaFBpbm5pbmdNZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGlubmluZy9HcmFwaFBpbm5pbmdQb2xpY3lcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Bpbm5pbmcvR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9waW5uaW5nL0dyYXBoUGlubmluZ1NlcnZpY2VcIjtcblxuLy8gU25hcHNob3RzIChUQVNLLTIxOSlcbmV4cG9ydCAqIGZyb20gXCIuL3NuYXBzaG90cy9HcmFwaEV4ZWN1dGlvblNuYXBzaG90TWFwcGVyXCI7XG5cbi8vIFByb2R1Y3Rpb24gbm9kZSBraW5kIGRlY2xhcmF0aW9ucyAoVEFTSy0yMjggLyDCpzIyLjIpXG5leHBvcnQgKiBmcm9tIFwiLi9ub2Rlc1wiO1xuIl19
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9ncmFwaC9sb29wcy9Db25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSwyQ0FBc0M7QUFFcEU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLDRCQUE0QjtJQUN2Qzs7Ozs7O09BTUc7SUFDSCxRQUFRLENBQUMsSUFBeUIsRUFBRSxLQUFjO1FBQ2hELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2hCLEtBQUssSUFBSTtnQkFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEYsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLEtBQUssS0FBSztnQkFDUixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENB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QUFNLENBQUM7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLE9BQU8sR0FBWSxNQUFNLENBQUM7UUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLE9BQU8sSUFBSSxJQUFJO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQ3RDLE9BQU8sR0FBSSxPQUFtQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL2xvb3BzL0NvbmRpdGlvbkV4cHJlc3Npb25FdmFsdWF0b3JcbiAqIEBzdW1tYXJ5IEV2YWx1YXRvciBmb3IgdGhlIEFMRlJFRC01IGBDb25kaXRpb25FeHByZXNzaW9uYCBEU0wgKERFQ0FGLTMyIMKnMjIuMykuXG4gKiBAZGVzY3JpcHRpb24gRXZhbHVhdGVzIGRlY2xhcmF0aXZlLCBzZXJpYWxpemFibGUgY29uZGl0aW9uIGV4cHJlc3Npb25zIHdpdGhcbiAqIGBlcWAvYG5lcWAvYGd0YC9gZ3RlYC9gbHRgL2BsdGVgL2BhbmRgL2BvcmAvYG5vdGAvYGV4aXN0c2Agb3BlcmF0b3JzIGFuZFxuICogYEV4cHJWYWx1ZWAgcmVmZXJlbmNlcyAoYHtjb25zdH1gLCBge3BhdGh9YCwgYHtzdGVwLCBwYXRofWApLlxuICovXG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbkV4cHJlc3Npb24sIEV4cHJWYWx1ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhFeGVjdXRpb25FcnJvclwiO1xuXG4vKipcbiAqIEV2YWx1YXRlcyBhIHtAbGluayBDb25kaXRpb25FeHByZXNzaW9ufSBhZ2FpbnN0IHRoZSBnaXZlbiBzdGF0ZS5cbiAqXG4gKiBgRXhwclZhbHVlYCByZXNvbHV0aW9uOlxuICogLSBgeyBjb25zdDogeCB9YCDihpIgdGhlIGxpdGVyYWwgdmFsdWUgYHhgLlxuICogLSBgeyBwYXRoOiBcImEuYlwiIH1gIOKGkiBkb3R0ZWQtcGF0aCBsb29rdXAgaW50byBgc3RhdGVgLlxuICogLSBgeyBzdGVwOiBcIm5vZGVJZFwiLCBwYXRoOiBcIm91dFwiIH1gIOKGkiBjcm9zcy1ub2RlIHJlZmVyZW5jZTsgaW4gdjEgdGhlIHN0YXRlXG4gKiAgIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gYSBgbm9kZXNgIG1hcCBrZXllZCBieSBub2RlIGlkIChyZXNlcnZlZCBmb3IgZnV0dXJlXG4gKiAgIG11bHRpLXN0ZXAgZXZhbHVhdGlvbjsgZmFsbHMgYmFjayB0byBgc3RhdGVgIGxvb2t1cCB3aGVuIGFic2VudCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yIHtcbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIGNvbmRpdGlvbiBleHByZXNzaW9uIHRvIGEgYm9vbGVhbi5cbiAgICpcbiAgICogQHBhcmFtIGV4cHIgLSBUaGUgY29uZGl0aW9uIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBjdXJyZW50IGV2YWx1YXRpb24gc3RhdGUgKGxvb3Agc3RhdGUgb3IgZXhlY3V0aW9uIHZhbHVlcykuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHRydXRoeS9wb3NpdGl2ZSByZXN1bHQuXG4gICAqL1xuICBldmFsdWF0ZShleHByOiBDb25kaXRpb25FeHByZXNzaW9uLCBzdGF0ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoZXhwci5vcCkge1xuICAgICAgY2FzZSBcImVxXCI6XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVWYWx1ZShleHByLmxlZnQsIHN0YXRlKSA9PT0gdGhpcy5yZXNvbHZlVmFsdWUoZXhwci5yaWdodCwgc3RhdGUpO1xuICAgICAgY2FzZSBcIm5lcVwiOlxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlVmFsdWUoZXhwci5sZWZ0LCBzdGF0ZSkgIT09IHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIucmlnaHQsIHN0YXRlKTtcbiAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIubGVmdCwgc3RhdGUpKSA+IE51bWJlcih0aGlzLnJlc29sdmVWYWx1ZShleHByLnJpZ2h0LCBzdGF0ZSkpO1xuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIubGVmdCwgc3RhdGUpKSA+PSBOdW1iZXIodGhpcy5yZXNvbHZlVmFsdWUoZXhwci5yaWdodCwgc3RhdGUpKTtcbiAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIubGVmdCwgc3RhdGUpKSA8IE51bWJlcih0aGlzLnJlc29sdmVWYWx1ZShleHByLnJpZ2h0LCBzdGF0ZSkpO1xuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIubGVmdCwgc3RhdGUpKSA8PSBOdW1iZXIodGhpcy5yZXNvbHZlVmFsdWUoZXhwci5yaWdodCwgc3RhdGUpKTtcbiAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgcmV0dXJuIGV4cHIuY29uZGl0aW9ucy5ldmVyeSgoYykgPT4gdGhpcy5ldmFsdWF0ZShjLCBzdGF0ZSkpO1xuICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgIHJldHVybiBleHByLmNvbmRpdGlvbnMuc29tZSgoYykgPT4gdGhpcy5ldmFsdWF0ZShjLCBzdGF0ZSkpO1xuICAgICAgY2FzZSBcIm5vdFwiOlxuICAgICAgICByZXR1cm4gIXRoaXMuZXZhbHVhdGUoZXhwci5jb25kaXRpb24sIHN0YXRlKTtcbiAgICAgIGNhc2UgXCJleGlzdHNcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIudmFsdWUsIHN0YXRlKSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmVzb2x2ZVZhbHVlKGV4cHIudmFsdWUsIHN0YXRlKSAhPT0gbnVsbDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIGBVbmtub3duIENvbmRpdGlvbkV4cHJlc3Npb24gb3AgJyR7KGV4cHIgYXMgeyBvcDogc3RyaW5nIH0pLm9wfSdgLFxuICAgICAgICAgIFwiR1JBUEhfVU5LTk9XTl9DT05ESVRJT05fT1BcIixcbiAgICAgICAgICB7IGV4cHIgfVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiB7QGxpbmsgRXhwclZhbHVlfSBhZ2FpbnN0IHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVmFsdWUocmVmOiBFeHByVmFsdWUsIHN0YXRlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKFwiY29uc3RcIiBpbiByZWYpIHtcbiAgICAgIHJldHVybiByZWYuY29uc3Q7XG4gICAgfVxuICAgIGlmIChcInBhdGhcIiBpbiByZWYgJiYgIShcInN0ZXBcIiBpbiByZWYpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUGF0aChyZWYucGF0aCwgc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoXCJzdGVwXCIgaW4gcmVmICYmIFwicGF0aFwiIGluIHJlZikge1xuICAgICAgY29uc3Qgbm9kZXMgPSAoc3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsKT8uW1wibm9kZXNcIl07XG4gICAgICBpZiAobm9kZXMgJiYgdHlwZW9mIG5vZGVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IG5vZGVTdGF0ZSA9IChub2RlcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcmVmLnN0ZXBdO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUGF0aChyZWYucGF0aCwgbm9kZVN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVQYXRoKHJlZi5wYXRoLCBzdGF0ZSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgXCJJbnZhbGlkIEV4cHJWYWx1ZTogbXVzdCBoYXZlIGBjb25zdGAsIGBwYXRoYCwgb3IgYHN0ZXBgK2BwYXRoYFwiLFxuICAgICAgXCJHUkFQSF9JTlZBTElEX0VYUFJfVkFMVUVcIixcbiAgICAgIHsgcmVmIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgZG90dGVkIHBhdGggaW50byBhIHRhcmdldCBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVQYXRoKHBhdGg6IHN0cmluZywgdGFyZ2V0OiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gdGFyZ2V0O1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSB0YXJnZXQ7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
import { GraphConditionType } from "./../constants.js";
|
|
2
2
|
import { GraphExecutionError } from "./../errors/GraphExecutionError.js";
|
|
3
|
+
import { ConditionExpressionEvaluator } from "./ConditionExpressionEvaluator.js";
|
|
3
4
|
/**
|
|
4
|
-
* Evaluates loop conditions using built-in comparison types
|
|
5
|
+
* Evaluates loop conditions using built-in comparison types or the
|
|
6
|
+
* `ConditionExpression` DSL.
|
|
5
7
|
*/
|
|
6
8
|
export class GraphConditionEvaluator {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.expressionEvaluator = new ConditionExpressionEvaluator();
|
|
11
|
+
}
|
|
7
12
|
/**
|
|
8
13
|
* Evaluates a condition against the given state.
|
|
9
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
|
+
*
|
|
10
20
|
* @param condition - The condition definition.
|
|
11
21
|
* @param state - The current loop state.
|
|
12
22
|
* @returns `true` when the condition passes.
|
|
13
23
|
*/
|
|
14
24
|
evaluate(condition, state) {
|
|
25
|
+
if (this.isConditionExpression(condition)) {
|
|
26
|
+
return this.expressionEvaluator.evaluate(condition, state);
|
|
27
|
+
}
|
|
15
28
|
const left = this.resolveValue(condition.left, state);
|
|
16
29
|
const right = condition.right;
|
|
17
30
|
switch (condition.type) {
|
|
@@ -54,5 +67,14 @@ export class GraphConditionEvaluator {
|
|
|
54
67
|
}
|
|
55
68
|
return current;
|
|
56
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
|
+
}
|
|
57
79
|
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhDb25kaXRpb25FdmFsdWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvbG9vcHMvR3JhcGhDb25kaXRpb25FdmFsdWF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLDBCQUFxQjtBQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsMkNBQXNDO0FBQ3BFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwwQ0FBdUM7QUFFOUU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHVCQUF1QjtJQUFwQztRQUNtQix3QkFBbUIsR0FBRyxJQUFJLDRCQUE0QixFQUFFLENBQUM7SUE4RTVFLENBQUM7SUE1RUM7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxRQUFRLENBQUMsU0FBeUQsRUFBRSxLQUFjO1FBQ2hGLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFFOUIsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUM1QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDaEIsS0FBSyxrQkFBa0IsQ0FBQyxLQUFLO2dCQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2YsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUM1QixPQUFPLElBQUksS0FBSyxLQUFLLENBQUM7WUFDeEIsS0FBSyxrQkFBa0IsQ0FBQyxVQUFVO2dCQUNoQyxPQUFPLElBQUksS0FBSyxLQUFLLENBQUM7WUFDeEIsS0FBSyxrQkFBa0IsQ0FBQyxZQUFZO2dCQUNsQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsS0FBSyxrQkFBa0IsQ0FBQyxxQkFBcUI7Z0JBQzNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLGtCQUFrQixDQUFDLFNBQVM7Z0JBQy9CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxLQUFLLGtCQUFrQixDQUFDLGtCQUFrQjtnQkFDeEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssa0JBQWtCLENBQUMsTUFBTTtnQkFDNUIsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUM7WUFDN0MsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUM1QixNQUFNLElBQUksbUJBQW1CLENBQzNCLHFEQUFxRCxFQUNyRCxvQ0FBb0MsQ0FDckMsQ0FBQztZQUNKO2dCQUNFLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsMkJBQTJCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFDNUMsOEJBQThCLEVBQzlCLEVBQUUsU0FBUyxFQUFFLENBQ2QsQ0FBQztRQUNOLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZLENBQUMsSUFBd0IsRUFBRSxLQUFjO1FBQzNELElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7UUFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLE9BQU8sSUFBSSxJQUFJO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQ3RDLE9BQU8sR0FBSSxPQUFtQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxxQkFBcUIsQ0FBQyxTQUF5RDtRQUNyRixPQUFPLE9BQVEsU0FBd0MsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDO0lBQzFFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvbG9vcHMvR3JhcGhDb25kaXRpb25FdmFsdWF0b3JcbiAqIEBzdW1tYXJ5IEV2YWx1YXRvciBmb3IgYnVpbHQtaW4gbG9vcCBjb25kaXRpb24gdHlwZXMgYW5kIHRoZSBgQ29uZGl0aW9uRXhwcmVzc2lvbmAgRFNMLlxuICogQGRlc2NyaXB0aW9uIFN1cHBvcnRzIHNhZmUsIGJ1aWx0LWluIGNvbmRpdGlvbiB0eXBlcyBvbmx5LiBEb2VzIE5PVCBldmFsdWF0ZSBhcmJpdHJhcnkgSmF2YVNjcmlwdCBleHByZXNzaW9ucy5cbiAqIFdoZW4gdGhlIGNvbmRpdGlvbiBvYmplY3QgY2FycmllcyBhbiBgb3BgIGZpZWxkIChBTEZSRUQtNSDCpzggLyBERUNBRi0zMiDCpzIyLjMpLCBkaXNwYXRjaGVzIHRvIHRoZVxuICoge0BsaW5rIENvbmRpdGlvbkV4cHJlc3Npb25FdmFsdWF0b3J9IGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluIGB0eXBlYC1iYXNlZCBzd2l0Y2guXG4gKi9cbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uRXhwcmVzc2lvbiwgR3JhcGhDb25kaXRpb25EZWZpbml0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBHcmFwaENvbmRpdGlvblR5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaEV4ZWN1dGlvbkVycm9yXCI7XG5pbXBvcnQgeyBDb25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yIH0gZnJvbSBcIi4vQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvclwiO1xuXG4vKipcbiAqIEV2YWx1YXRlcyBsb29wIGNvbmRpdGlvbnMgdXNpbmcgYnVpbHQtaW4gY29tcGFyaXNvbiB0eXBlcyBvciB0aGVcbiAqIGBDb25kaXRpb25FeHByZXNzaW9uYCBEU0wuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaENvbmRpdGlvbkV2YWx1YXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwcmVzc2lvbkV2YWx1YXRvciA9IG5ldyBDb25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yKCk7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIGNvbmRpdGlvbiBhZ2FpbnN0IHRoZSBnaXZlbiBzdGF0ZS5cbiAgICpcbiAgICogV2hlbiB0aGUgY29uZGl0aW9uIG9iamVjdCBjYXJyaWVzIGFuIGBvcGAgZmllbGQsIGl0IGlzIHRyZWF0ZWQgYXMgYVxuICAgKiBgQ29uZGl0aW9uRXhwcmVzc2lvbmAgKMKnMjIuMykgYW5kIGRpc3BhdGNoZWQgdG8gdGhlXG4gICAqIHtAbGluayBDb25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yfS4gT3RoZXJ3aXNlIHRoZSBidWlsdC1pbiBgdHlwZWAtYmFzZWRcbiAgICogc3dpdGNoIGlzIHVzZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBjdXJyZW50IGxvb3Agc3RhdGUuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBjb25kaXRpb24gcGFzc2VzLlxuICAgKi9cbiAgZXZhbHVhdGUoY29uZGl0aW9uOiBHcmFwaENvbmRpdGlvbkRlZmluaXRpb24gfCBDb25kaXRpb25FeHByZXNzaW9uLCBzdGF0ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzQ29uZGl0aW9uRXhwcmVzc2lvbihjb25kaXRpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uRXZhbHVhdG9yLmV2YWx1YXRlKGNvbmRpdGlvbiwgc3RhdGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLnJlc29sdmVWYWx1ZShjb25kaXRpb24ubGVmdCwgc3RhdGUpO1xuICAgIGNvbnN0IHJpZ2h0ID0gY29uZGl0aW9uLnJpZ2h0O1xuXG4gICAgc3dpdGNoIChjb25kaXRpb24udHlwZSkge1xuICAgICAgY2FzZSBHcmFwaENvbmRpdGlvblR5cGUuVFJVVEhZOlxuICAgICAgICByZXR1cm4gISFsZWZ0O1xuICAgICAgY2FzZSBHcmFwaENvbmRpdGlvblR5cGUuRkFMU1k6XG4gICAgICAgIHJldHVybiAhbGVmdDtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLkVRVUFMUzpcbiAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0O1xuICAgICAgY2FzZSBHcmFwaENvbmRpdGlvblR5cGUuTk9UX0VRVUFMUzpcbiAgICAgICAgcmV0dXJuIGxlZnQgIT09IHJpZ2h0O1xuICAgICAgY2FzZSBHcmFwaENvbmRpdGlvblR5cGUuR1JFQVRFUl9USEFOOlxuICAgICAgICByZXR1cm4gTnVtYmVyKGxlZnQpID4gTnVtYmVyKHJpZ2h0KTtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLkdSRUFURVJfVEhBTl9PUl9FUVVBTDpcbiAgICAgICAgcmV0dXJuIE51bWJlcihsZWZ0KSA+PSBOdW1iZXIocmlnaHQpO1xuICAgICAgY2FzZSBHcmFwaENvbmRpdGlvblR5cGUuTEVTU19USEFOOlxuICAgICAgICByZXR1cm4gTnVtYmVyKGxlZnQpIDwgTnVtYmVyKHJpZ2h0KTtcbiAgICAgIGNhc2UgR3JhcGhDb25kaXRpb25UeXBlLkxFU1NfVEhBTl9PUl9FUVVBTDpcbiAgICAgICAgcmV0dXJuIE51bWJlcihsZWZ0KSA8PSBOdW1iZXIocmlnaHQpO1xuICAgICAgY2FzZSBHcmFwaENvbmRpdGlvblR5cGUuRVhJU1RTOlxuICAgICAgICByZXR1cm4gbGVmdCAhPT0gdW5kZWZpbmVkICYmIGxlZnQgIT09IG51bGw7XG4gICAgICBjYXNlIEdyYXBoQ29uZGl0aW9uVHlwZS5DVVNUT006XG4gICAgICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIFwiQ3VzdG9tIGNvbmRpdGlvbiBldmFsdWF0b3JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHYxXCIsXG4gICAgICAgICAgXCJHUkFQSF9DVVNUT01fQ09ORElUSU9OX1VOU1VQUE9SVEVEXCJcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIGBVbmtub3duIGNvbmRpdGlvbiB0eXBlICcke2NvbmRpdGlvbi50eXBlfSdgLFxuICAgICAgICAgIFwiR1JBUEhfVU5LTk9XTl9DT05ESVRJT05fVFlQRVwiLFxuICAgICAgICAgIHsgY29uZGl0aW9uIH1cbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSB2YWx1ZSB0aGF0IG1heSBiZSBhIGRvdHRlZCBwYXRoIGludG8gdGhlIHN0YXRlIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVZhbHVlKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdGF0ZTtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgIGxldCBjdXJyZW50OiB1bmtub3duID0gc3RhdGU7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0cyB3aGV0aGVyIGEgY29uZGl0aW9uIG9iamVjdCBpcyBhIGBDb25kaXRpb25FeHByZXNzaW9uYCAowqcyMi4zKSBieVxuICAgKiBjaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIGFuIGBvcGAgZmllbGQuIFdoZW4gdHJ1ZSwgdGhlIG9iamVjdCBpc1xuICAgKiB0cmVhdGVkIGFzIGEgYENvbmRpdGlvbkV4cHJlc3Npb25gIGFuZCBkaXNwYXRjaGVkIHRvIHRoZVxuICAgKiB7QGxpbmsgQ29uZGl0aW9uRXhwcmVzc2lvbkV2YWx1YXRvcn0uXG4gICAqL1xuICBwcml2YXRlIGlzQ29uZGl0aW9uRXhwcmVzc2lvbihjb25kaXRpb246IEdyYXBoQ29uZGl0aW9uRGVmaW5pdGlvbiB8IENvbmRpdGlvbkV4cHJlc3Npb24pOiBjb25kaXRpb24gaXMgQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIHR5cGVvZiAoY29uZGl0aW9uIGFzIHVua25vd24gYXMgeyBvcD86IHN0cmluZyB9KS5vcCA9PT0gXCJzdHJpbmdcIjtcbiAgfVxufVxuIl19
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* @description Re-exports the condition evaluator, loop execution context, and foreach/while/until executors.
|
|
5
5
|
*/
|
|
6
6
|
export * from "./GraphConditionEvaluator.js";
|
|
7
|
+
export * from "./ConditionExpressionEvaluator.js";
|
|
7
8
|
export * from "./GraphLoopExecutionContext.js";
|
|
8
9
|
export * from "./ForeachGraphNodeExecutor.js";
|
|
9
10
|
export * from "./WhileGraphNodeExecutor.js";
|
|
10
11
|
export * from "./UntilGraphNodeExecutor.js";
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvbG9vcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILDZDQUEwQztBQUMxQyxrREFBK0M7QUFDL0MsK0NBQTRDO0FBQzVDLDhDQUEyQztBQUMzQyw0Q0FBeUM7QUFDekMsNENBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9sb29wc1xuICogQHN1bW1hcnkgU3RydWN0dXJlZCBsb29wIGV4ZWN1dG9ycy5cbiAqIEBkZXNjcmlwdGlvbiBSZS1leHBvcnRzIHRoZSBjb25kaXRpb24gZXZhbHVhdG9yLCBsb29wIGV4ZWN1dGlvbiBjb250ZXh0LCBhbmQgZm9yZWFjaC93aGlsZS91bnRpbCBleGVjdXRvcnMuXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoQ29uZGl0aW9uRXZhbHVhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Db25kaXRpb25FeHByZXNzaW9uRXZhbHVhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaExvb3BFeGVjdXRpb25Db250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Gb3JlYWNoR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1doaWxlR3JhcGhOb2RlRXhlY3V0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1VudGlsR3JhcGhOb2RlRXhlY3V0b3JcIjtcbiJdfQ==
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* @module integrations/graph/nodes/agent
|
|
12
|
+
* @summary Production Agent node declaration.
|
|
13
|
+
* @description The Agent node is the primary AI agent entrypoint. It is a
|
|
14
|
+
* rectangular node with `@connection()` ports for its structural dependencies:
|
|
15
|
+
* `model` (the LLM), `memory` (the memory store), and `workspace` (the
|
|
16
|
+
* workspace/context). Connections are rendered on the bottom side of the node
|
|
17
|
+
* (DECAF-32 §21.3). Each connection category has a distinct color defined in
|
|
18
|
+
* the category style registry.
|
|
19
|
+
*
|
|
20
|
+
* The single `prompt` input accepts placeholder expressions (§22.4) such as
|
|
21
|
+
* `{{ $input.brief }}` or `{{ $node["Research"].output.summary }}` that are
|
|
22
|
+
* resolved at execution time by the placeholder compiler.
|
|
23
|
+
*/
|
|
24
|
+
import { Model, model, required } from "@decaf-ts/decorator-validation";
|
|
25
|
+
import { uielement } from "@decaf-ts/ui-decorators";
|
|
26
|
+
import { connection, input, node, output } from "@decaf-ts/ui-decorators/graph";
|
|
27
|
+
// Ensure category styles are registered (idempotent).
|
|
28
|
+
import "./category-styles.js";
|
|
29
|
+
/**
|
|
30
|
+
* Agent node — an AI agent that orchestrates a model, memory, and workspace.
|
|
31
|
+
*
|
|
32
|
+
* The agent has:
|
|
33
|
+
* - `@input` port on the **left**: `prompt` (the task prompt; supports
|
|
34
|
+
* placeholder expressions like `{{ $input.something }}` per §22.4).
|
|
35
|
+
* - `@output` ports on the **right**: `response` (the agent's output), `actions`
|
|
36
|
+
* (any actions the agent decided to take).
|
|
37
|
+
* - `@connection` ports on the **bottom**: `model` (LLM), `memory` (memory
|
|
38
|
+
* store), `workspace` (workspace/context). Each connection has a distinct
|
|
39
|
+
* category color.
|
|
40
|
+
*
|
|
41
|
+
* The node is rectangular (not rounded) to visually distinguish it from
|
|
42
|
+
* regular processing nodes. The `color` and `icon` are omitted from `@node()`
|
|
43
|
+
* so they are resolved from the `"Agent"` category style.
|
|
44
|
+
*/
|
|
45
|
+
let AgentNode = class AgentNode extends Model {
|
|
46
|
+
};
|
|
47
|
+
__decorate([
|
|
48
|
+
required(),
|
|
49
|
+
uielement("textarea", {
|
|
50
|
+
label: "Prompt",
|
|
51
|
+
placeholder: "Enter task prompt. Supports placeholders like {{ $input.brief }} or {{ $node[\"Research\"].output.summary }}",
|
|
52
|
+
}),
|
|
53
|
+
input({ handle: "prompt" }),
|
|
54
|
+
__metadata("design:type", String)
|
|
55
|
+
], AgentNode.prototype, "prompt", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
required(),
|
|
58
|
+
uielement("textarea", { label: "Response", placeholder: "Agent response" }),
|
|
59
|
+
output({ handle: "response" }),
|
|
60
|
+
__metadata("design:type", String)
|
|
61
|
+
], AgentNode.prototype, "response", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
required(),
|
|
64
|
+
uielement("textarea", { label: "Actions", placeholder: "Actions taken by the agent" }),
|
|
65
|
+
output({ handle: "actions" }),
|
|
66
|
+
__metadata("design:type", Array)
|
|
67
|
+
], AgentNode.prototype, "actions", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
connection({ category: "model", handle: "model" }),
|
|
70
|
+
__metadata("design:type", Object)
|
|
71
|
+
], AgentNode.prototype, "model", void 0);
|
|
72
|
+
__decorate([
|
|
73
|
+
connection({ category: "memory", handle: "memory" }),
|
|
74
|
+
__metadata("design:type", Object)
|
|
75
|
+
], AgentNode.prototype, "memory", void 0);
|
|
76
|
+
__decorate([
|
|
77
|
+
connection({ category: "workspace", handle: "workspace" }),
|
|
78
|
+
__metadata("design:type", Object)
|
|
79
|
+
], AgentNode.prototype, "workspace", void 0);
|
|
80
|
+
AgentNode = __decorate([
|
|
81
|
+
node("core.agent", {
|
|
82
|
+
kind: "core.agent",
|
|
83
|
+
category: "Agent",
|
|
84
|
+
// color and icon omitted — resolved from the "Agent" category style
|
|
85
|
+
width: 120,
|
|
86
|
+
height: 140,
|
|
87
|
+
labels: ["agent", "ai", "orchestrator"],
|
|
88
|
+
metadata: {
|
|
89
|
+
title: "Agent",
|
|
90
|
+
description: "AI agent that orchestrates a model, memory, and workspace to complete a task.",
|
|
91
|
+
shape: "rectangle",
|
|
92
|
+
},
|
|
93
|
+
}),
|
|
94
|
+
model()
|
|
95
|
+
], AgentNode);
|
|
96
|
+
export { AgentNode };
|
|
97
|
+
/**
|
|
98
|
+
* All built-in agent node constructors.
|
|
99
|
+
*/
|
|
100
|
+
export const GRAPH_AGENT_NODES = [AgentNode];
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvbm9kZXMvYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEYsc0RBQXNEO0FBQ3RELDhCQUEyQjtBQUUzQjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFnQkksSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsS0FBSztDQWlDbkMsQ0FBQTtBQXhCQztJQU5DLFFBQVEsRUFBRTtJQUNWLFNBQVMsQ0FBQyxVQUFVLEVBQUU7UUFDckIsS0FBSyxFQUFFLFFBQVE7UUFDZixXQUFXLEVBQUUsOEdBQThHO0tBQzVILENBQUM7SUFDRCxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7O3lDQUNaO0FBT2hCO0lBSEMsUUFBUSxFQUFFO0lBQ1YsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDM0UsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDOzsyQ0FDYjtBQUtsQjtJQUhDLFFBQVEsRUFBRTtJQUNWLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRSxDQUFDO0lBQ3RGLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQzs7MENBQ1Y7QUFLcEI7SUFEQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQzs7d0NBQ25DO0FBR2hCO0lBREMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7O3lDQUNwQztBQUdqQjtJQURDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDOzs0Q0FDdkM7QUFoQ1QsU0FBUztJQWZyQixJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ2xCLElBQUksRUFBRSxZQUFZO1FBQ2xCLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLG9FQUFvRTtRQUNwRSxLQUFLLEVBQUUsR0FBRztRQUNWLE1BQU0sRUFBRSxHQUFHO1FBQ1gsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUM7UUFDdkMsUUFBUSxFQUFFO1lBQ1IsS0FBSyxFQUFFLE9BQU87WUFDZCxXQUFXLEVBQ1QsK0VBQStFO1lBQ2pGLEtBQUssRUFBRSxXQUFXO1NBQ25CO0tBQ0YsQ0FBQztJQUNELEtBQUssRUFBRTtHQUNLLFNBQVMsQ0FpQ3JCOztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLENBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvbm9kZXMvYWdlbnRcbiAqIEBzdW1tYXJ5IFByb2R1Y3Rpb24gQWdlbnQgbm9kZSBkZWNsYXJhdGlvbi5cbiAqIEBkZXNjcmlwdGlvbiBUaGUgQWdlbnQgbm9kZSBpcyB0aGUgcHJpbWFyeSBBSSBhZ2VudCBlbnRyeXBvaW50LiBJdCBpcyBhXG4gKiByZWN0YW5ndWxhciBub2RlIHdpdGggYEBjb25uZWN0aW9uKClgIHBvcnRzIGZvciBpdHMgc3RydWN0dXJhbCBkZXBlbmRlbmNpZXM6XG4gKiBgbW9kZWxgICh0aGUgTExNKSwgYG1lbW9yeWAgKHRoZSBtZW1vcnkgc3RvcmUpLCBhbmQgYHdvcmtzcGFjZWAgKHRoZVxuICogd29ya3NwYWNlL2NvbnRleHQpLiBDb25uZWN0aW9ucyBhcmUgcmVuZGVyZWQgb24gdGhlIGJvdHRvbSBzaWRlIG9mIHRoZSBub2RlXG4gKiAoREVDQUYtMzIgwqcyMS4zKS4gRWFjaCBjb25uZWN0aW9uIGNhdGVnb3J5IGhhcyBhIGRpc3RpbmN0IGNvbG9yIGRlZmluZWQgaW5cbiAqIHRoZSBjYXRlZ29yeSBzdHlsZSByZWdpc3RyeS5cbiAqXG4gKiBUaGUgc2luZ2xlIGBwcm9tcHRgIGlucHV0IGFjY2VwdHMgcGxhY2Vob2xkZXIgZXhwcmVzc2lvbnMgKMKnMjIuNCkgc3VjaCBhc1xuICogYHt7ICRpbnB1dC5icmllZiB9fWAgb3IgYHt7ICRub2RlW1wiUmVzZWFyY2hcIl0ub3V0cHV0LnN1bW1hcnkgfX1gIHRoYXQgYXJlXG4gKiByZXNvbHZlZCBhdCBleGVjdXRpb24gdGltZSBieSB0aGUgcGxhY2Vob2xkZXIgY29tcGlsZXIuXG4gKi9cbmltcG9ydCB7IE1vZGVsLCBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyB1aWVsZW1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGNvbm5lY3Rpb24sIGlucHV0LCBub2RlLCBvdXRwdXQgfSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcblxuLy8gRW5zdXJlIGNhdGVnb3J5IHN0eWxlcyBhcmUgcmVnaXN0ZXJlZCAoaWRlbXBvdGVudCkuXG5pbXBvcnQgXCIuL2NhdGVnb3J5LXN0eWxlc1wiO1xuXG4vKipcbiAqIEFnZW50IG5vZGUg4oCUIGFuIEFJIGFnZW50IHRoYXQgb3JjaGVzdHJhdGVzIGEgbW9kZWwsIG1lbW9yeSwgYW5kIHdvcmtzcGFjZS5cbiAqXG4gKiBUaGUgYWdlbnQgaGFzOlxuICogLSBgQGlucHV0YCBwb3J0IG9uIHRoZSAqKmxlZnQqKjogYHByb21wdGAgKHRoZSB0YXNrIHByb21wdDsgc3VwcG9ydHNcbiAqICAgcGxhY2Vob2xkZXIgZXhwcmVzc2lvbnMgbGlrZSBge3sgJGlucHV0LnNvbWV0aGluZyB9fWAgcGVyIMKnMjIuNCkuXG4gKiAtIGBAb3V0cHV0YCBwb3J0cyBvbiB0aGUgKipyaWdodCoqOiBgcmVzcG9uc2VgICh0aGUgYWdlbnQncyBvdXRwdXQpLCBgYWN0aW9uc2BcbiAqICAgKGFueSBhY3Rpb25zIHRoZSBhZ2VudCBkZWNpZGVkIHRvIHRha2UpLlxuICogLSBgQGNvbm5lY3Rpb25gIHBvcnRzIG9uIHRoZSAqKmJvdHRvbSoqOiBgbW9kZWxgIChMTE0pLCBgbWVtb3J5YCAobWVtb3J5XG4gKiAgIHN0b3JlKSwgYHdvcmtzcGFjZWAgKHdvcmtzcGFjZS9jb250ZXh0KS4gRWFjaCBjb25uZWN0aW9uIGhhcyBhIGRpc3RpbmN0XG4gKiAgIGNhdGVnb3J5IGNvbG9yLlxuICpcbiAqIFRoZSBub2RlIGlzIHJlY3Rhbmd1bGFyIChub3Qgcm91bmRlZCkgdG8gdmlzdWFsbHkgZGlzdGluZ3Vpc2ggaXQgZnJvbVxuICogcmVndWxhciBwcm9jZXNzaW5nIG5vZGVzLiBUaGUgYGNvbG9yYCBhbmQgYGljb25gIGFyZSBvbWl0dGVkIGZyb20gYEBub2RlKClgXG4gKiBzbyB0aGV5IGFyZSByZXNvbHZlZCBmcm9tIHRoZSBgXCJBZ2VudFwiYCBjYXRlZ29yeSBzdHlsZS5cbiAqL1xuQG5vZGUoXCJjb3JlLmFnZW50XCIsIHtcbiAga2luZDogXCJjb3JlLmFnZW50XCIsXG4gIGNhdGVnb3J5OiBcIkFnZW50XCIsXG4gIC8vIGNvbG9yIGFuZCBpY29uIG9taXR0ZWQg4oCUIHJlc29sdmVkIGZyb20gdGhlIFwiQWdlbnRcIiBjYXRlZ29yeSBzdHlsZVxuICB3aWR0aDogMTIwLFxuICBoZWlnaHQ6IDE0MCxcbiAgbGFiZWxzOiBbXCJhZ2VudFwiLCBcImFpXCIsIFwib3JjaGVzdHJhdG9yXCJdLFxuICBtZXRhZGF0YToge1xuICAgIHRpdGxlOiBcIkFnZW50XCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkFJIGFnZW50IHRoYXQgb3JjaGVzdHJhdGVzIGEgbW9kZWwsIG1lbW9yeSwgYW5kIHdvcmtzcGFjZSB0byBjb21wbGV0ZSBhIHRhc2suXCIsXG4gICAgc2hhcGU6IFwicmVjdGFuZ2xlXCIsXG4gIH0sXG59KVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBBZ2VudE5vZGUgZXh0ZW5kcyBNb2RlbCB7XG4gIC8vIC0tLSBJbnB1dHMgKGxlZnQgc2lkZSkgLS0tXG5cbiAgQHJlcXVpcmVkKClcbiAgQHVpZWxlbWVudChcInRleHRhcmVhXCIsIHtcbiAgICBsYWJlbDogXCJQcm9tcHRcIixcbiAgICBwbGFjZWhvbGRlcjogXCJFbnRlciB0YXNrIHByb21wdC4gU3VwcG9ydHMgcGxhY2Vob2xkZXJzIGxpa2Uge3sgJGlucHV0LmJyaWVmIH19IG9yIHt7ICRub2RlW1xcXCJSZXNlYXJjaFxcXCJdLm91dHB1dC5zdW1tYXJ5IH19XCIsXG4gIH0pXG4gIEBpbnB1dCh7IGhhbmRsZTogXCJwcm9tcHRcIiB9KVxuICBwcm9tcHQhOiBzdHJpbmc7XG5cbiAgLy8gLS0tIE91dHB1dHMgKHJpZ2h0IHNpZGUpIC0tLVxuXG4gIEByZXF1aXJlZCgpXG4gIEB1aWVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCB7IGxhYmVsOiBcIlJlc3BvbnNlXCIsIHBsYWNlaG9sZGVyOiBcIkFnZW50IHJlc3BvbnNlXCIgfSlcbiAgQG91dHB1dCh7IGhhbmRsZTogXCJyZXNwb25zZVwiIH0pXG4gIHJlc3BvbnNlITogc3RyaW5nO1xuXG4gIEByZXF1aXJlZCgpXG4gIEB1aWVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCB7IGxhYmVsOiBcIkFjdGlvbnNcIiwgcGxhY2Vob2xkZXI6IFwiQWN0aW9ucyB0YWtlbiBieSB0aGUgYWdlbnRcIiB9KVxuICBAb3V0cHV0KHsgaGFuZGxlOiBcImFjdGlvbnNcIiB9KVxuICBhY3Rpb25zITogdW5rbm93bltdO1xuXG4gIC8vIC0tLSBDb25uZWN0aW9ucyAoYm90dG9tIHNpZGUpIC0tLVxuXG4gIEBjb25uZWN0aW9uKHsgY2F0ZWdvcnk6IFwibW9kZWxcIiwgaGFuZGxlOiBcIm1vZGVsXCIgfSlcbiAgbW9kZWwhOiB1bmtub3duO1xuXG4gIEBjb25uZWN0aW9uKHsgY2F0ZWdvcnk6IFwibWVtb3J5XCIsIGhhbmRsZTogXCJtZW1vcnlcIiB9KVxuICBtZW1vcnkhOiB1bmtub3duO1xuXG4gIEBjb25uZWN0aW9uKHsgY2F0ZWdvcnk6IFwid29ya3NwYWNlXCIsIGhhbmRsZTogXCJ3b3Jrc3BhY2VcIiB9KVxuICB3b3Jrc3BhY2UhOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEFsbCBidWlsdC1pbiBhZ2VudCBub2RlIGNvbnN0cnVjdG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IEdSQVBIX0FHRU5UX05PREVTID0gW0FnZW50Tm9kZV0gYXMgY29uc3Q7XG4iXX0=
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/graph/nodes/category-styles
|
|
3
|
+
* @summary Built-in node/connection category style registrations.
|
|
4
|
+
* @description Registers default colors and icons for the built-in node and
|
|
5
|
+
* connection categories (DECAF-32 §21.2). The `color` / `icon` on a node's
|
|
6
|
+
* `@node()` metadata are optional overrides — when omitted, the effective
|
|
7
|
+
* style is resolved from the category registry.
|
|
8
|
+
*/
|
|
9
|
+
import { registerGraphCategoryStyle, } from "@decaf-ts/ui-decorators/graph";
|
|
10
|
+
/**
|
|
11
|
+
* Registers all built-in category styles. Called once at module init.
|
|
12
|
+
*
|
|
13
|
+
* Categories define the default visual style for nodes and connection ports.
|
|
14
|
+
* A node's explicit `color` / `icon` (on `@node()`) overrides the category
|
|
15
|
+
* style; when omitted, the category style is used.
|
|
16
|
+
*/
|
|
17
|
+
export function registerBuiltinCategoryStyles() {
|
|
18
|
+
// Node categories
|
|
19
|
+
registerGraphCategoryStyle("Trigger", { color: "#3b82f6", icon: "ti-bolt" });
|
|
20
|
+
registerGraphCategoryStyle("Flow Control", { color: "#f59e0b", icon: "ti-arrows-split-2" });
|
|
21
|
+
registerGraphCategoryStyle("Utility", { color: "#0d9488", icon: "ti-tool" });
|
|
22
|
+
registerGraphCategoryStyle("Loop", { color: "#eab308", icon: "ti-repeat" });
|
|
23
|
+
registerGraphCategoryStyle("Workflow", { color: "#f97316", icon: "ti-sitemap" });
|
|
24
|
+
registerGraphCategoryStyle("Pipeline", { color: "#0ea5e9", icon: "ti-git-merge" });
|
|
25
|
+
registerGraphCategoryStyle("Node", { color: "#8b5cf6", icon: "ti-point-filled" });
|
|
26
|
+
registerGraphCategoryStyle("Agent", { color: "#7c3aed", icon: "ti-robot" });
|
|
27
|
+
// Connection categories (for @connection() ports)
|
|
28
|
+
registerGraphCategoryStyle("model", { color: "#3b82f6", icon: "ti-cpu" });
|
|
29
|
+
registerGraphCategoryStyle("memory", { color: "#10b981", icon: "ti-database" });
|
|
30
|
+
registerGraphCategoryStyle("workspace", { color: "#f59e0b", icon: "ti-folder" });
|
|
31
|
+
}
|
|
32
|
+
// Register at module load so the styles are available immediately.
|
|
33
|
+
registerBuiltinCategoryStyles();
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktc3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2dyYXBoL25vZGVzL2NhdGVnb3J5LXN0eWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBQ0gsT0FBTyxFQUNMLDBCQUEwQixHQUMzQixNQUFNLCtCQUErQixDQUFDO0FBRXZDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSw2QkFBNkI7SUFDM0Msa0JBQWtCO0lBQ2xCLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDN0UsMEJBQTBCLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDN0UsMEJBQTBCLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM1RSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDbkYsMEJBQTBCLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFNUUsa0RBQWtEO0lBQ2xELDBCQUEwQixDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUUsMEJBQTBCLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNoRiwwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsNkJBQTZCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvbm9kZXMvY2F0ZWdvcnktc3R5bGVzXG4gKiBAc3VtbWFyeSBCdWlsdC1pbiBub2RlL2Nvbm5lY3Rpb24gY2F0ZWdvcnkgc3R5bGUgcmVnaXN0cmF0aW9ucy5cbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgZGVmYXVsdCBjb2xvcnMgYW5kIGljb25zIGZvciB0aGUgYnVpbHQtaW4gbm9kZSBhbmRcbiAqIGNvbm5lY3Rpb24gY2F0ZWdvcmllcyAoREVDQUYtMzIgwqcyMS4yKS4gVGhlIGBjb2xvcmAgLyBgaWNvbmAgb24gYSBub2RlJ3NcbiAqIGBAbm9kZSgpYCBtZXRhZGF0YSBhcmUgb3B0aW9uYWwgb3ZlcnJpZGVzIOKAlCB3aGVuIG9taXR0ZWQsIHRoZSBlZmZlY3RpdmVcbiAqIHN0eWxlIGlzIHJlc29sdmVkIGZyb20gdGhlIGNhdGVnb3J5IHJlZ2lzdHJ5LlxuICovXG5pbXBvcnQge1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZSxcbn0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFsbCBidWlsdC1pbiBjYXRlZ29yeSBzdHlsZXMuIENhbGxlZCBvbmNlIGF0IG1vZHVsZSBpbml0LlxuICpcbiAqIENhdGVnb3JpZXMgZGVmaW5lIHRoZSBkZWZhdWx0IHZpc3VhbCBzdHlsZSBmb3Igbm9kZXMgYW5kIGNvbm5lY3Rpb24gcG9ydHMuXG4gKiBBIG5vZGUncyBleHBsaWNpdCBgY29sb3JgIC8gYGljb25gIChvbiBgQG5vZGUoKWApIG92ZXJyaWRlcyB0aGUgY2F0ZWdvcnlcbiAqIHN0eWxlOyB3aGVuIG9taXR0ZWQsIHRoZSBjYXRlZ29yeSBzdHlsZSBpcyB1c2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsdGluQ2F0ZWdvcnlTdHlsZXMoKTogdm9pZCB7XG4gIC8vIE5vZGUgY2F0ZWdvcmllc1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIlRyaWdnZXJcIiwgeyBjb2xvcjogXCIjM2I4MmY2XCIsIGljb246IFwidGktYm9sdFwiIH0pO1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIkZsb3cgQ29udHJvbFwiLCB7IGNvbG9yOiBcIiNmNTllMGJcIiwgaWNvbjogXCJ0aS1hcnJvd3Mtc3BsaXQtMlwiIH0pO1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIlV0aWxpdHlcIiwgeyBjb2xvcjogXCIjMGQ5NDg4XCIsIGljb246IFwidGktdG9vbFwiIH0pO1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIkxvb3BcIiwgeyBjb2xvcjogXCIjZWFiMzA4XCIsIGljb246IFwidGktcmVwZWF0XCIgfSk7XG4gIHJlZ2lzdGVyR3JhcGhDYXRlZ29yeVN0eWxlKFwiV29ya2Zsb3dcIiwgeyBjb2xvcjogXCIjZjk3MzE2XCIsIGljb246IFwidGktc2l0ZW1hcFwiIH0pO1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIlBpcGVsaW5lXCIsIHsgY29sb3I6IFwiIzBlYTVlOVwiLCBpY29uOiBcInRpLWdpdC1tZXJnZVwiIH0pO1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIk5vZGVcIiwgeyBjb2xvcjogXCIjOGI1Y2Y2XCIsIGljb246IFwidGktcG9pbnQtZmlsbGVkXCIgfSk7XG4gIHJlZ2lzdGVyR3JhcGhDYXRlZ29yeVN0eWxlKFwiQWdlbnRcIiwgeyBjb2xvcjogXCIjN2MzYWVkXCIsIGljb246IFwidGktcm9ib3RcIiB9KTtcblxuICAvLyBDb25uZWN0aW9uIGNhdGVnb3JpZXMgKGZvciBAY29ubmVjdGlvbigpIHBvcnRzKVxuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIm1vZGVsXCIsIHsgY29sb3I6IFwiIzNiODJmNlwiLCBpY29uOiBcInRpLWNwdVwiIH0pO1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIm1lbW9yeVwiLCB7IGNvbG9yOiBcIiMxMGI5ODFcIiwgaWNvbjogXCJ0aS1kYXRhYmFzZVwiIH0pO1xuICByZWdpc3RlckdyYXBoQ2F0ZWdvcnlTdHlsZShcIndvcmtzcGFjZVwiLCB7IGNvbG9yOiBcIiNmNTllMGJcIiwgaWNvbjogXCJ0aS1mb2xkZXJcIiB9KTtcbn1cblxuLy8gUmVnaXN0ZXIgYXQgbW9kdWxlIGxvYWQgc28gdGhlIHN0eWxlcyBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LlxucmVnaXN0ZXJCdWlsdGluQ2F0ZWdvcnlTdHlsZXMoKTtcbiJdfQ==
|