@ldsg/workflow 0.3.31 → 0.3.33
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/__tests__/unit/evaluate-variables.prefixItems.test.js +197 -191
- package/dist/__tests__/unit/resource.js +61 -61
- package/dist/__tests__/unit/resource.portId.test.js +144 -144
- package/dist/constants.d.ts +3 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -10
- package/dist/handler.d.ts +4 -4
- package/dist/index.d.ts +5 -5
- package/dist/instantiate-resource.d.ts +4 -4
- package/dist/instantiate-resource.js +1 -1
- package/dist/resource.d.ts +2 -2
- package/dist/resource.js +12 -12
- package/dist/types/index.d.ts +6 -6
- package/dist/types/json_schema_with_expression_extension.d.ts +6 -6
- package/dist/types/json_schema_with_expression_extension.d.ts.map +1 -1
- package/dist/types/node.d.ts +1 -1
- package/dist/types/specific-resource-settings.d.ts +1 -1
- package/dist/types/specific-resource-settings.d.ts.map +1 -1
- package/dist/types/specific-resource-settings.js +1 -1
- package/dist/types/workflow.d.ts +3 -3
- package/dist/utils/evaluate-variables/constants.js +17 -17
- package/dist/utils/evaluate-variables/index.d.ts +1 -1
- package/dist/utils/evaluate-variables/index.debug.js +79 -79
- package/dist/utils/evaluate-variables/index.js +2 -2
- package/dist/utils/evaluate-variables/utils/get-data-with-json-schema-and-input/index.d.ts +1 -1
- package/dist/utils/evaluate-variables/utils/get-data-with-json-schema-and-input/index.js +2 -2
- package/dist/utils/evaluate-variables/utils/get-data-with-json-schema-and-input/resolve-json-schema.d.ts +1 -1
- package/dist/utils/evaluate-variables/utils/get-data-with-json-schema-and-input/resolve-json-schema.js +11 -11
- package/dist/utils/evaluate-variables/utils/get-data-with-json-schema-and-input/resolve-json-schema.js.bak +96 -0
- package/dist/utils/evaluate-variables/utils/get-field-path-by-field-type-key.js +3 -3
- package/dist/utils/execute-workflow.d.ts +2 -2
- package/dist/utils/execute-workflow.d.ts.map +1 -1
- package/dist/utils/execute-workflow.js +75 -39
- package/package.json +16 -12
|
@@ -9,7 +9,7 @@ const lodash_1 = __importDefault(require("lodash"));
|
|
|
9
9
|
const resolveJsonSchema = async (params) => {
|
|
10
10
|
var _a;
|
|
11
11
|
const { input, jsonSchema, source } = params;
|
|
12
|
-
const { type: jsonSchemaType,
|
|
12
|
+
const { type: jsonSchemaType, "x-expression": jsonSchemaExpression, const: jsonSchemaConst, prefixItems: jsonSchemaPrefixItems, } = jsonSchema;
|
|
13
13
|
let data;
|
|
14
14
|
/**
|
|
15
15
|
* 若常量值存在,则直接返回
|
|
@@ -27,7 +27,7 @@ const resolveJsonSchema = async (params) => {
|
|
|
27
27
|
data = await expression.evaluate(input);
|
|
28
28
|
}
|
|
29
29
|
switch (jsonSchemaType) {
|
|
30
|
-
case
|
|
30
|
+
case "object": {
|
|
31
31
|
data = data !== null && data !== void 0 ? data : {};
|
|
32
32
|
const jsonSchemaProperties = (_a = jsonSchema.properties) !== null && _a !== void 0 ? _a : {};
|
|
33
33
|
const keys = lodash_1.default.keys(jsonSchemaProperties);
|
|
@@ -36,11 +36,11 @@ const resolveJsonSchema = async (params) => {
|
|
|
36
36
|
const resolveJsonSchemaRes = await (0, exports.resolveJsonSchema)({
|
|
37
37
|
jsonSchema: jsonSchemaProperties[key],
|
|
38
38
|
input,
|
|
39
|
-
source
|
|
39
|
+
source,
|
|
40
40
|
});
|
|
41
41
|
const res = {
|
|
42
42
|
key,
|
|
43
|
-
resolveJsonSchemaRes
|
|
43
|
+
resolveJsonSchemaRes,
|
|
44
44
|
};
|
|
45
45
|
return res;
|
|
46
46
|
});
|
|
@@ -50,7 +50,7 @@ const resolveJsonSchema = async (params) => {
|
|
|
50
50
|
});
|
|
51
51
|
break;
|
|
52
52
|
}
|
|
53
|
-
case
|
|
53
|
+
case "array": {
|
|
54
54
|
/**
|
|
55
55
|
* 如果 prefixItems 存在,则转为数组结果
|
|
56
56
|
*/
|
|
@@ -60,7 +60,7 @@ const resolveJsonSchema = async (params) => {
|
|
|
60
60
|
const resolveJsonSchemaRes = await (0, exports.resolveJsonSchema)({
|
|
61
61
|
jsonSchema: prefixItem,
|
|
62
62
|
input,
|
|
63
|
-
source
|
|
63
|
+
source,
|
|
64
64
|
});
|
|
65
65
|
return resolveJsonSchemaRes.data;
|
|
66
66
|
});
|
|
@@ -76,13 +76,13 @@ const resolveJsonSchema = async (params) => {
|
|
|
76
76
|
}
|
|
77
77
|
break;
|
|
78
78
|
}
|
|
79
|
-
case
|
|
80
|
-
case
|
|
81
|
-
case
|
|
82
|
-
case
|
|
79
|
+
case "boolean":
|
|
80
|
+
case "integer":
|
|
81
|
+
case "number":
|
|
82
|
+
case "string": {
|
|
83
83
|
break;
|
|
84
84
|
}
|
|
85
|
-
case
|
|
85
|
+
case "null": {
|
|
86
86
|
break;
|
|
87
87
|
}
|
|
88
88
|
default: {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveJsonSchema = void 0;
|
|
7
|
+
const jsonata_1 = __importDefault(require("jsonata"));
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
const resolveJsonSchema = async (params) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const { input, jsonSchema, source } = params;
|
|
12
|
+
const { type: jsonSchemaType, 'x-expression': jsonSchemaExpression, const: jsonSchemaConst, prefixItems: jsonSchemaPrefixItems } = jsonSchema;
|
|
13
|
+
let data;
|
|
14
|
+
/**
|
|
15
|
+
* 若常量值存在,则直接返回
|
|
16
|
+
*/
|
|
17
|
+
if (jsonSchemaConst) {
|
|
18
|
+
data = jsonSchemaConst;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
data = source;
|
|
22
|
+
/**
|
|
23
|
+
* 若表达式存在,则尝试获取表达式值
|
|
24
|
+
*/
|
|
25
|
+
if (jsonSchemaExpression) {
|
|
26
|
+
const expression = (0, jsonata_1.default)(jsonSchemaExpression);
|
|
27
|
+
data = await expression.evaluate(input);
|
|
28
|
+
}
|
|
29
|
+
switch (jsonSchemaType) {
|
|
30
|
+
case 'object': {
|
|
31
|
+
data = data !== null && data !== void 0 ? data : {};
|
|
32
|
+
const jsonSchemaProperties = (_a = jsonSchema.properties) !== null && _a !== void 0 ? _a : {};
|
|
33
|
+
const keys = lodash_1.default.keys(jsonSchemaProperties);
|
|
34
|
+
const keysMapResPromises = keys.map(async (key) => {
|
|
35
|
+
const source = lodash_1.default.get(data, key);
|
|
36
|
+
const resolveJsonSchemaRes = await (0, exports.resolveJsonSchema)({
|
|
37
|
+
jsonSchema: jsonSchemaProperties[key],
|
|
38
|
+
input,
|
|
39
|
+
source
|
|
40
|
+
});
|
|
41
|
+
const res = {
|
|
42
|
+
key,
|
|
43
|
+
resolveJsonSchemaRes
|
|
44
|
+
};
|
|
45
|
+
return res;
|
|
46
|
+
});
|
|
47
|
+
const keysMapRes = await Promise.all(keysMapResPromises);
|
|
48
|
+
lodash_1.default.each(keysMapRes, ({ key, resolveJsonSchemaRes }) => {
|
|
49
|
+
lodash_1.default.set(data, key, resolveJsonSchemaRes.data);
|
|
50
|
+
});
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case 'array': {
|
|
54
|
+
/**
|
|
55
|
+
* 如果 prefixItems 存在,则转为数组结果
|
|
56
|
+
*/
|
|
57
|
+
if (jsonSchemaPrefixItems) {
|
|
58
|
+
if (jsonSchemaPrefixItems.length > 0) {
|
|
59
|
+
const itemsDataPromises = jsonSchemaPrefixItems.map(async (prefixItem) => {
|
|
60
|
+
const resolveJsonSchemaRes = await (0, exports.resolveJsonSchema)({
|
|
61
|
+
jsonSchema: prefixItem,
|
|
62
|
+
input,
|
|
63
|
+
source
|
|
64
|
+
});
|
|
65
|
+
return resolveJsonSchemaRes.data;
|
|
66
|
+
});
|
|
67
|
+
const itemsData = await Promise.all(itemsDataPromises);
|
|
68
|
+
data = itemsData;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
/**
|
|
72
|
+
* 空数组时,初始化为空数组
|
|
73
|
+
*/
|
|
74
|
+
data = [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'boolean':
|
|
80
|
+
case 'integer':
|
|
81
|
+
case 'number':
|
|
82
|
+
case 'string': {
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'null': {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
default: {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const res = { data };
|
|
94
|
+
return res;
|
|
95
|
+
};
|
|
96
|
+
exports.resolveJsonSchema = resolveJsonSchema;
|
|
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getFieldPathByFieldTypeKey = void 0;
|
|
4
4
|
const getFieldPathByFieldTypeKey = (fieldTypeKey) => {
|
|
5
5
|
// 将字符串按点分割成数组
|
|
6
|
-
const splitRes = fieldTypeKey.split(
|
|
6
|
+
const splitRes = fieldTypeKey.split(".");
|
|
7
7
|
// 过滤数组:除了索引为复数且值为 properties ,其他所有元素均保留
|
|
8
8
|
const filterRes = splitRes.filter((value, index) => {
|
|
9
|
-
const res = !(value ===
|
|
9
|
+
const res = !(value === "properties" && index % 2 === 0);
|
|
10
10
|
return res;
|
|
11
11
|
});
|
|
12
12
|
// 将过滤后的数组重新用点连接成字符串
|
|
13
|
-
const res = filterRes.join(
|
|
13
|
+
const res = filterRes.join(".");
|
|
14
14
|
return res;
|
|
15
15
|
};
|
|
16
16
|
exports.getFieldPathByFieldTypeKey = getFieldPathByFieldTypeKey;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { WorkflowData, WorkflowExecuteRes, WorkflowNodeInfo, WorkflowVariables } from
|
|
1
|
+
import { WorkflowData, WorkflowExecuteRes, WorkflowNodeInfo, WorkflowVariables } from "../types";
|
|
2
2
|
export interface ExecuteWorkflowParams {
|
|
3
3
|
context: any;
|
|
4
4
|
endWorkflowNodeResourceId: string;
|
|
5
5
|
nodes: WorkflowNodeInfo[];
|
|
6
|
-
edges: WorkflowData[
|
|
6
|
+
edges: WorkflowData["edges"];
|
|
7
7
|
presetWorkflowVariables?: Record<string, WorkflowVariables>;
|
|
8
8
|
startWorkflowNodeResourceId: string;
|
|
9
9
|
variables: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-workflow.d.ts","sourceRoot":"","sources":["../../src/utils/execute-workflow.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,UAAU,CAAC;AAqBlB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,GAAG,CAAC;IACb,yBAAyB,EAAE,MAAM,CAAC;IAClC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5D,2BAA2B,EAAE,MAAM,CAAC;IACpC,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"execute-workflow.d.ts","sourceRoot":"","sources":["../../src/utils/execute-workflow.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,UAAU,CAAC;AAqBlB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,GAAG,CAAC;IACb,yBAAyB,EAAE,MAAM,CAAC;IAClC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5D,2BAA2B,EAAE,MAAM,CAAC;IACpC,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyND;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6HhG"}
|
|
@@ -7,16 +7,16 @@ exports.executeWorkflow = executeWorkflow;
|
|
|
7
7
|
const api_1 = __importDefault(require("@opentelemetry/api"));
|
|
8
8
|
const lodash_1 = __importDefault(require("lodash"));
|
|
9
9
|
const evaluate_variables_1 = require("./evaluate-variables");
|
|
10
|
-
const tracer = api_1.default.trace.getTracer(
|
|
10
|
+
const tracer = api_1.default.trace.getTracer("workspace");
|
|
11
11
|
/**
|
|
12
12
|
* 安全的 JSON 序列化,处理循环引用
|
|
13
13
|
*/
|
|
14
14
|
function safeStringify(obj) {
|
|
15
15
|
const seen = new WeakSet();
|
|
16
16
|
return JSON.stringify(obj, (key, value) => {
|
|
17
|
-
if (typeof value ===
|
|
17
|
+
if (typeof value === "object" && value !== null) {
|
|
18
18
|
if (seen.has(value)) {
|
|
19
|
-
return
|
|
19
|
+
return "[Circular Reference]";
|
|
20
20
|
}
|
|
21
21
|
seen.add(value);
|
|
22
22
|
}
|
|
@@ -29,51 +29,81 @@ function safeStringify(obj) {
|
|
|
29
29
|
async function executeNode(node, context, workflowVariablesMap, isFirstLevel, workflowInputVariables) {
|
|
30
30
|
const { id, propertiesSchema, execute: nodeExecute } = node;
|
|
31
31
|
const workflowVariables = Object.fromEntries(workflowVariablesMap);
|
|
32
|
+
if (process.env.DEBUG) {
|
|
33
|
+
console.debug("executeNode", node.id, {
|
|
34
|
+
isFirstLevel,
|
|
35
|
+
workflowVariablesKeys: Object.keys(workflowVariables),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
32
38
|
// 输入变量从工作流变量中使用表达式获取
|
|
33
|
-
const workflowNodePropertiesInputSchema = lodash_1.default.get(propertiesSchema,
|
|
34
|
-
const workflowNodePropertiesOutputSchema = lodash_1.default.get(propertiesSchema,
|
|
39
|
+
const workflowNodePropertiesInputSchema = lodash_1.default.get(propertiesSchema, "properties.input");
|
|
40
|
+
const workflowNodePropertiesOutputSchema = lodash_1.default.get(propertiesSchema, "properties.output");
|
|
35
41
|
/**
|
|
36
42
|
* 对于开始节点,不忽略 input 表达式,但替换工作流内部变量为工作流输入变量。
|
|
37
43
|
*/
|
|
38
|
-
const workflowNodeInputExpressionEvaluateInput = isFirstLevel
|
|
44
|
+
const workflowNodeInputExpressionEvaluateInput = isFirstLevel
|
|
45
|
+
? workflowInputVariables
|
|
46
|
+
: workflowVariables;
|
|
39
47
|
let workflowNodeInputVariables = {};
|
|
40
48
|
if (workflowNodePropertiesInputSchema) {
|
|
41
49
|
const { variables } = await (0, evaluate_variables_1.evaluateVariables)({
|
|
42
50
|
jsonSchema: workflowNodePropertiesInputSchema,
|
|
43
|
-
variables: workflowNodeInputExpressionEvaluateInput
|
|
51
|
+
variables: workflowNodeInputExpressionEvaluateInput,
|
|
44
52
|
});
|
|
45
53
|
workflowNodeInputVariables = variables;
|
|
46
54
|
}
|
|
47
|
-
const { variables: workflowNodeOutputExpressionEvaluateInput, portId } = await nodeExecute({
|
|
48
|
-
context,
|
|
49
|
-
variables: workflowNodeInputVariables
|
|
50
|
-
});
|
|
51
|
-
/**
|
|
52
|
-
* 输出变量从结果中使用表达式获取
|
|
53
|
-
* 对于结束节点,不忽略 output 表达式,但表达式固定为取返回变量。
|
|
54
|
-
*/
|
|
55
|
-
let workflowNodeOutputVariables = {};
|
|
56
|
-
if (workflowNodePropertiesOutputSchema) {
|
|
57
|
-
const { variables } = await (0, evaluate_variables_1.evaluateVariables)({
|
|
58
|
-
jsonSchema: workflowNodePropertiesOutputSchema,
|
|
59
|
-
variables: workflowNodeOutputExpressionEvaluateInput
|
|
60
|
-
});
|
|
61
|
-
workflowNodeOutputVariables = variables;
|
|
62
|
-
}
|
|
63
55
|
if (process.env.DEBUG) {
|
|
64
|
-
console.
|
|
65
|
-
|
|
66
|
-
portId,
|
|
67
|
-
inputVariables: workflowNodeInputVariables,
|
|
68
|
-
outputVariables: workflowNodeOutputVariables
|
|
69
|
-
});
|
|
56
|
+
console.log(`[EXEC] node ${id} inputExpressionEvaluateInput keys:`, Object.keys(workflowNodeInputExpressionEvaluateInput || {}));
|
|
57
|
+
console.log(`[EXEC] node ${id} inputVariables:`, safeStringify(workflowNodeInputVariables));
|
|
70
58
|
}
|
|
71
|
-
|
|
59
|
+
let consoleDirInfo = {
|
|
72
60
|
nodeId: id,
|
|
73
|
-
|
|
74
|
-
|
|
61
|
+
inputVariables: workflowNodeInputVariables,
|
|
62
|
+
status: "processing",
|
|
75
63
|
};
|
|
76
|
-
|
|
64
|
+
try {
|
|
65
|
+
const { variables: workflowNodeOutputExpressionEvaluateInput, portId } = await nodeExecute({
|
|
66
|
+
context,
|
|
67
|
+
variables: workflowNodeInputVariables,
|
|
68
|
+
});
|
|
69
|
+
/**
|
|
70
|
+
* 输出变量从结果中使用表达式获取
|
|
71
|
+
* 对于结束节点,不忽略 output 表达式,但表达式固定为取返回变量。
|
|
72
|
+
*/
|
|
73
|
+
let workflowNodeOutputVariables = {};
|
|
74
|
+
if (workflowNodePropertiesOutputSchema) {
|
|
75
|
+
const { variables } = await (0, evaluate_variables_1.evaluateVariables)({
|
|
76
|
+
jsonSchema: workflowNodePropertiesOutputSchema,
|
|
77
|
+
variables: workflowNodeOutputExpressionEvaluateInput,
|
|
78
|
+
});
|
|
79
|
+
workflowNodeOutputVariables = variables;
|
|
80
|
+
}
|
|
81
|
+
consoleDirInfo = {
|
|
82
|
+
...consoleDirInfo,
|
|
83
|
+
status: "success",
|
|
84
|
+
portId,
|
|
85
|
+
outputVariables: workflowNodeOutputVariables,
|
|
86
|
+
};
|
|
87
|
+
const res = {
|
|
88
|
+
nodeId: id,
|
|
89
|
+
variables: workflowNodeOutputVariables,
|
|
90
|
+
portId,
|
|
91
|
+
};
|
|
92
|
+
return res;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
consoleDirInfo = {
|
|
96
|
+
...consoleDirInfo,
|
|
97
|
+
status: "error",
|
|
98
|
+
error,
|
|
99
|
+
};
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
if (process.env.DEBUG) {
|
|
104
|
+
console.dir(consoleDirInfo);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
77
107
|
}
|
|
78
108
|
/**
|
|
79
109
|
* 查找下一个需要执行的节点集合
|
|
@@ -152,15 +182,15 @@ function findNextNodeIds(levelResults, edges, visitedNodes, completedNodePredece
|
|
|
152
182
|
* 执行工作流
|
|
153
183
|
*/
|
|
154
184
|
async function executeWorkflow(params) {
|
|
155
|
-
const { context, endWorkflowNodeResourceId, nodes, edges, presetWorkflowVariables = {}, startWorkflowNodeResourceId, variables: workflowInputVariables, traceContext } = params;
|
|
185
|
+
const { context, endWorkflowNodeResourceId, nodes, edges, presetWorkflowVariables = {}, startWorkflowNodeResourceId, variables: workflowInputVariables, traceContext, } = params;
|
|
156
186
|
// 使用传入的 traceContext 或当前活跃的 context 来创建 span
|
|
157
187
|
const parentContext = traceContext || api_1.default.context.active();
|
|
158
|
-
const executeWorkflowSpan = tracer.startSpan(
|
|
188
|
+
const executeWorkflowSpan = tracer.startSpan("execute-workflow", undefined, parentContext);
|
|
159
189
|
const workflowVariablesMap = new Map(Object.entries(presetWorkflowVariables));
|
|
160
190
|
const startNode = nodes.find((value) => value.id === startWorkflowNodeResourceId);
|
|
161
191
|
const endNode = nodes.find((value) => value.id === endWorkflowNodeResourceId);
|
|
162
192
|
if (!startNode || !endNode) {
|
|
163
|
-
throw new Error(
|
|
193
|
+
throw new Error("invalid workflow nodes");
|
|
164
194
|
}
|
|
165
195
|
let workflowOutputVariables;
|
|
166
196
|
// 使用动态执行,根据 portId 决定下一步执行哪些节点
|
|
@@ -185,12 +215,12 @@ async function executeWorkflow(params) {
|
|
|
185
215
|
if (!node) {
|
|
186
216
|
throw new Error(`node not found: ${nodeId}`);
|
|
187
217
|
}
|
|
188
|
-
span.addEvent(
|
|
218
|
+
span.addEvent("execution workflow node");
|
|
189
219
|
const res = await executeNode(node, context, workflowVariablesMap, isFirstLevel, workflowInputVariables);
|
|
190
220
|
const { portId: outputPortId } = res;
|
|
191
221
|
span.setAttributes({
|
|
192
222
|
currentNodeId: nodeId,
|
|
193
|
-
outputPortId
|
|
223
|
+
outputPortId,
|
|
194
224
|
});
|
|
195
225
|
span.end();
|
|
196
226
|
return res;
|
|
@@ -203,6 +233,12 @@ async function executeWorkflow(params) {
|
|
|
203
233
|
workflowVariablesMap.set(result.nodeId, result.variables);
|
|
204
234
|
}
|
|
205
235
|
});
|
|
236
|
+
if (process.env.DEBUG) {
|
|
237
|
+
console.debug("executeWorkflow level done", {
|
|
238
|
+
executedNodes: levelResults.filter(Boolean).map((r) => r.nodeId),
|
|
239
|
+
workflowVariablesKeys: [...workflowVariablesMap.keys()],
|
|
240
|
+
});
|
|
241
|
+
}
|
|
206
242
|
// 根据执行结果和 portId 查找下一个节点集合
|
|
207
243
|
const { nextNodeIds, workflowOutputVariables: tempOutputVariables } = findNextNodeIds(levelResults, edges, visitedNodes, completedNodePredecessors, activatedEdges, endNode.id);
|
|
208
244
|
if (tempOutputVariables !== undefined) {
|
|
@@ -214,7 +250,7 @@ async function executeWorkflow(params) {
|
|
|
214
250
|
isFirstLevel = false;
|
|
215
251
|
}
|
|
216
252
|
const res = {
|
|
217
|
-
variables: workflowOutputVariables
|
|
253
|
+
variables: workflowOutputVariables,
|
|
218
254
|
};
|
|
219
255
|
executeWorkflowSpan.end();
|
|
220
256
|
return res;
|
package/package.json
CHANGED
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ldsg/workflow",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.33",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "wanxger",
|
|
8
|
-
"main": "dist/index.js",
|
|
9
|
-
"types": "dist",
|
|
10
8
|
"files": [
|
|
11
9
|
"dist/"
|
|
12
10
|
],
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist",
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
13
16
|
"dependencies": {
|
|
14
17
|
"@opentelemetry/api": "~1.9.0",
|
|
15
18
|
"json-schema": "0.4.0",
|
|
16
19
|
"json-schema-default": "^1.0.2",
|
|
17
|
-
"jsonata": "
|
|
20
|
+
"jsonata": "2.2.2",
|
|
18
21
|
"lodash": "^4.17.21",
|
|
19
22
|
"zod": "^4.1.11",
|
|
20
|
-
"@ldsg/constants": "0.3.
|
|
21
|
-
"@ldsg/
|
|
22
|
-
"@ldsg/
|
|
23
|
-
"@ldsg/resource
|
|
23
|
+
"@ldsg/constants": "0.3.33",
|
|
24
|
+
"@ldsg/resource-definition": "0.3.33",
|
|
25
|
+
"@ldsg/handler": "0.3.33",
|
|
26
|
+
"@ldsg/resource": "0.3.33"
|
|
24
27
|
},
|
|
25
28
|
"devDependencies": {
|
|
26
29
|
"@types/fs-extra": "^11.0.4",
|
|
@@ -29,18 +32,19 @@
|
|
|
29
32
|
"@types/lodash": "^4.14.202",
|
|
30
33
|
"fs-extra": "^11.3.0",
|
|
31
34
|
"jest": "^29.5.0",
|
|
35
|
+
"oxfmt": "latest",
|
|
36
|
+
"oxlint": "latest",
|
|
32
37
|
"supertest": "^6.3.4",
|
|
33
38
|
"ts-jest": "^29.1.5",
|
|
34
39
|
"ts-node": "^10.9.2",
|
|
35
40
|
"typescript": "^5.8.3",
|
|
36
|
-
"@ldsg/types": "0.3.
|
|
37
|
-
},
|
|
38
|
-
"publishConfig": {
|
|
39
|
-
"access": "public"
|
|
41
|
+
"@ldsg/types": "0.3.33"
|
|
40
42
|
},
|
|
41
43
|
"scripts": {
|
|
42
44
|
"build": "tsc --project tsconfig.build.json",
|
|
43
45
|
"clean": "rm -rf dist",
|
|
46
|
+
"format": "oxfmt --write src/",
|
|
47
|
+
"lint": "oxlint src/",
|
|
44
48
|
"test": "jest"
|
|
45
49
|
}
|
|
46
50
|
}
|