@cicctencent/agent-core 1.0.6 → 1.0.8

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.
Files changed (45) hide show
  1. package/dist/cjs/automation/node-task-types.d.ts +69 -0
  2. package/dist/cjs/automation/node-task-types.d.ts.map +1 -1
  3. package/dist/cjs/index.d.ts +2 -1
  4. package/dist/cjs/index.d.ts.map +1 -1
  5. package/dist/cjs/index.js +16 -0
  6. package/dist/cjs/index.js.map +1 -1
  7. package/dist/cjs/workflow/engine.d.ts +36 -0
  8. package/dist/cjs/workflow/engine.d.ts.map +1 -0
  9. package/dist/cjs/workflow/engine.js +403 -0
  10. package/dist/cjs/workflow/engine.js.map +1 -0
  11. package/dist/cjs/workflow/index.d.ts +4 -0
  12. package/dist/cjs/workflow/index.d.ts.map +1 -0
  13. package/dist/cjs/workflow/index.js +21 -0
  14. package/dist/cjs/workflow/index.js.map +1 -0
  15. package/dist/cjs/workflow/node-executor.d.ts +17 -0
  16. package/dist/cjs/workflow/node-executor.d.ts.map +1 -0
  17. package/dist/cjs/workflow/node-executor.js +643 -0
  18. package/dist/cjs/workflow/node-executor.js.map +1 -0
  19. package/dist/cjs/workflow/types.d.ts +366 -0
  20. package/dist/cjs/workflow/types.d.ts.map +1 -0
  21. package/dist/cjs/workflow/types.js +9 -0
  22. package/dist/cjs/workflow/types.js.map +1 -0
  23. package/dist/esm/automation/node-task-types.d.ts +69 -0
  24. package/dist/esm/automation/node-task-types.d.ts.map +1 -1
  25. package/dist/esm/index.d.ts +2 -1
  26. package/dist/esm/index.d.ts.map +1 -1
  27. package/dist/esm/index.js +2 -0
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/workflow/engine.d.ts +36 -0
  30. package/dist/esm/workflow/engine.d.ts.map +1 -0
  31. package/dist/esm/workflow/engine.js +396 -0
  32. package/dist/esm/workflow/engine.js.map +1 -0
  33. package/dist/esm/workflow/index.d.ts +4 -0
  34. package/dist/esm/workflow/index.d.ts.map +1 -0
  35. package/dist/esm/workflow/index.js +5 -0
  36. package/dist/esm/workflow/index.js.map +1 -0
  37. package/dist/esm/workflow/node-executor.d.ts +17 -0
  38. package/dist/esm/workflow/node-executor.d.ts.map +1 -0
  39. package/dist/esm/workflow/node-executor.js +639 -0
  40. package/dist/esm/workflow/node-executor.js.map +1 -0
  41. package/dist/esm/workflow/types.d.ts +366 -0
  42. package/dist/esm/workflow/types.d.ts.map +1 -0
  43. package/dist/esm/workflow/types.js +8 -0
  44. package/dist/esm/workflow/types.js.map +1 -0
  45. package/package.json +1 -1
@@ -0,0 +1,396 @@
1
+ // ============================================================
2
+ // Workflow Engine — 工作流执行引擎
3
+ // ============================================================
4
+ // 职责:
5
+ // - 解析工作流 DAG,拓扑排序
6
+ // - 按序执行节点,传递变量
7
+ // - 发射事件供 SSE 流式输出
8
+ // - 错误处理与重试
9
+ // ============================================================
10
+ import { executeNode } from "./node-executor.js";
11
+ /** 工作流引擎 */
12
+ export class WorkflowEngine {
13
+ /**
14
+ * 执行工作流
15
+ * @returns 异步生成器,产出工作流事件,最终返回执行结果
16
+ */
17
+ async *run(params) {
18
+ const { workflow, inputs, abortSignal } = params;
19
+ const executionId = `wf_exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
20
+ const startTime = Date.now();
21
+ // 收集事件
22
+ const events = [];
23
+ const emit = (event) => {
24
+ events.push(event);
25
+ };
26
+ const ctx = {
27
+ executionId,
28
+ workflow,
29
+ inputs,
30
+ nodeOutputs: new Map(),
31
+ results: [],
32
+ abortSignal,
33
+ emit,
34
+ llmCaller: params.llmCaller,
35
+ toolRegistry: params.toolRegistry,
36
+ httpFetch: params.httpFetch,
37
+ sessionId: params.sessionId,
38
+ threadId: params.threadId,
39
+ tenant: params.tenant,
40
+ };
41
+ // 发射 workflow_start 事件
42
+ const startEvent = {
43
+ type: 'workflow_start',
44
+ executionId,
45
+ workflowId: workflow.id,
46
+ workflowName: workflow.name,
47
+ inputs,
48
+ timestamp: startTime,
49
+ };
50
+ yield startEvent;
51
+ emit(startEvent);
52
+ // 设置超时
53
+ const timeoutMs = workflow.timeoutMs ?? 5 * 60 * 1000;
54
+ const timeoutController = new AbortController();
55
+ const timeoutTimer = setTimeout(() => timeoutController.abort(), timeoutMs);
56
+ // 合并 abort 信号
57
+ const mergedSignal = mergeAbortSignals(abortSignal, timeoutController.signal);
58
+ ctx.abortSignal = mergedSignal;
59
+ try {
60
+ // 拓扑排序
61
+ const sortedNodeIds = topologicalSort(workflow.nodes, workflow.edges);
62
+ // 执行节点
63
+ let lastError;
64
+ for (const nodeId of sortedNodeIds) {
65
+ if (mergedSignal.aborted) {
66
+ break;
67
+ }
68
+ const node = workflow.nodes.find(n => n.id === nodeId);
69
+ if (!node)
70
+ continue;
71
+ // 检查条件边:只有满足条件的边才继续执行
72
+ // 简化处理:线性执行,条件节点决定后续分支
73
+ const result = yield* this.executeNodeWithEvents(node, ctx);
74
+ ctx.results.push(result);
75
+ if (result.status === 'error') {
76
+ lastError = result.error;
77
+ // 节点执行失败,终止工作流
78
+ const errorEvent = {
79
+ type: 'workflow_error',
80
+ executionId,
81
+ nodeId: node.id,
82
+ error: result.error || 'Node execution failed',
83
+ timestamp: Date.now(),
84
+ };
85
+ yield errorEvent;
86
+ emit(errorEvent);
87
+ break;
88
+ }
89
+ // 条件节点:决定下一个执行的节点
90
+ if (node.type === 'condition' && result.status === 'success') {
91
+ const matchedBranch = result.output['branch'];
92
+ if (matchedBranch) {
93
+ // 过滤后续节点:只执行匹配分支的节点
94
+ // 这里简化处理:标记分支结果,后续拓扑排序时已包含所有节点
95
+ // 实际分支逻辑在 getNodeSuccessors 中处理
96
+ }
97
+ }
98
+ }
99
+ // 收集输出
100
+ const endNode = workflow.nodes.find(n => n.type === 'end');
101
+ let outputs = {};
102
+ if (endNode && ctx.nodeOutputs.has(endNode.id)) {
103
+ outputs = ctx.nodeOutputs.get(endNode.id);
104
+ }
105
+ const endTime = Date.now();
106
+ const status = mergedSignal.aborted
107
+ ? 'aborted'
108
+ : lastError ? 'error' : 'completed';
109
+ const endEvent = {
110
+ type: 'workflow_end',
111
+ executionId,
112
+ status,
113
+ outputs,
114
+ durationMs: endTime - startTime,
115
+ timestamp: endTime,
116
+ };
117
+ yield endEvent;
118
+ emit(endEvent);
119
+ // 计算 token 总用量
120
+ let totalUsage;
121
+ for (const r of ctx.results) {
122
+ if (r.usage) {
123
+ totalUsage = totalUsage || { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
124
+ totalUsage.promptTokens += r.usage.promptTokens || 0;
125
+ totalUsage.completionTokens += r.usage.completionTokens || 0;
126
+ totalUsage.totalTokens += r.usage.totalTokens || 0;
127
+ }
128
+ }
129
+ // P2: 收集所有节点生成的产物
130
+ const allArtifacts = [];
131
+ for (const r of ctx.results) {
132
+ if (r.artifacts) {
133
+ for (const a of r.artifacts) {
134
+ allArtifacts.push({
135
+ nodeId: r.nodeId,
136
+ nodeName: r.nodeName,
137
+ ...a,
138
+ });
139
+ }
140
+ }
141
+ }
142
+ return {
143
+ executionId,
144
+ workflowId: workflow.id,
145
+ status,
146
+ outputs,
147
+ nodeResults: ctx.results,
148
+ artifacts: allArtifacts.length > 0 ? allArtifacts : undefined,
149
+ durationMs: endTime - startTime,
150
+ totalUsage,
151
+ error: lastError,
152
+ };
153
+ }
154
+ catch (err) {
155
+ const errorEvent = {
156
+ type: 'workflow_error',
157
+ executionId,
158
+ error: err?.message || 'Workflow execution failed',
159
+ timestamp: Date.now(),
160
+ };
161
+ yield errorEvent;
162
+ emit(errorEvent);
163
+ const endTime = Date.now();
164
+ const endEvent = {
165
+ type: 'workflow_end',
166
+ executionId,
167
+ status: 'error',
168
+ outputs: {},
169
+ durationMs: endTime - startTime,
170
+ timestamp: endTime,
171
+ };
172
+ yield endEvent;
173
+ emit(endEvent);
174
+ return {
175
+ executionId,
176
+ workflowId: workflow.id,
177
+ status: 'error',
178
+ outputs: {},
179
+ nodeResults: ctx.results,
180
+ durationMs: endTime - startTime,
181
+ error: err?.message || 'Workflow execution failed',
182
+ };
183
+ }
184
+ finally {
185
+ clearTimeout(timeoutTimer);
186
+ }
187
+ }
188
+ /** 执行单个节点并发射事件 */
189
+ async *executeNodeWithEvents(node, ctx) {
190
+ const startedAt = Date.now();
191
+ // 发射 node_start 事件
192
+ const startEvent = {
193
+ type: 'node_start',
194
+ nodeId: node.id,
195
+ nodeName: node.name,
196
+ nodeType: node.type,
197
+ timestamp: startedAt,
198
+ };
199
+ yield startEvent;
200
+ ctx.emit(startEvent);
201
+ // 执行节点(带重试)
202
+ const maxRetries = node.retry?.maxRetries ?? 0;
203
+ const delayMs = node.retry?.delayMs ?? 1000;
204
+ const backoffFactor = node.retry?.backoffFactor ?? 2;
205
+ let lastError;
206
+ let result;
207
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
208
+ if (ctx.abortSignal.aborted) {
209
+ result = {
210
+ nodeId: node.id,
211
+ nodeName: node.name,
212
+ nodeType: node.type,
213
+ output: {},
214
+ status: 'skipped',
215
+ error: 'Aborted',
216
+ durationMs: Date.now() - startedAt,
217
+ startedAt,
218
+ finishedAt: Date.now(),
219
+ };
220
+ break;
221
+ }
222
+ try {
223
+ // 执行节点(yield* 委托生成器,自动转发事件)
224
+ const nodeResult = yield* executeNode(node, ctx, ctx.emit);
225
+ result = {
226
+ ...nodeResult,
227
+ nodeId: node.id,
228
+ nodeName: node.name,
229
+ nodeType: node.type,
230
+ startedAt,
231
+ finishedAt: Date.now(),
232
+ durationMs: Date.now() - startedAt,
233
+ };
234
+ // 存储节点输出
235
+ if (result.status === 'success') {
236
+ ctx.nodeOutputs.set(node.id, result.output);
237
+ }
238
+ break;
239
+ }
240
+ catch (err) {
241
+ lastError = err?.message || 'Node execution failed';
242
+ if (attempt < maxRetries) {
243
+ // P3: 发射重试事件
244
+ const retryEvent = {
245
+ type: 'node_start',
246
+ nodeId: node.id,
247
+ nodeName: node.name,
248
+ nodeType: node.type,
249
+ timestamp: Date.now(),
250
+ };
251
+ yield retryEvent;
252
+ ctx.emit(retryEvent);
253
+ // 等待重试延迟(指数退避)
254
+ const waitMs = delayMs * Math.pow(backoffFactor, attempt);
255
+ await sleep(waitMs);
256
+ }
257
+ }
258
+ }
259
+ if (!result) {
260
+ result = {
261
+ nodeId: node.id,
262
+ nodeName: node.name,
263
+ nodeType: node.type,
264
+ output: {},
265
+ status: 'error',
266
+ error: lastError || 'Unknown error',
267
+ durationMs: Date.now() - startedAt,
268
+ startedAt,
269
+ finishedAt: Date.now(),
270
+ };
271
+ }
272
+ // 发射 node_end 事件
273
+ const endEvent = {
274
+ type: 'node_end',
275
+ nodeId: node.id,
276
+ nodeName: node.name,
277
+ status: result.status,
278
+ durationMs: result.durationMs,
279
+ usage: result.usage,
280
+ timestamp: result.finishedAt,
281
+ };
282
+ yield endEvent;
283
+ ctx.emit(endEvent);
284
+ return result;
285
+ }
286
+ }
287
+ // ---- 辅助函数 ----
288
+ /** 拓扑排序 */
289
+ function topologicalSort(nodes, edges) {
290
+ const inDegree = new Map();
291
+ const adjacency = new Map();
292
+ for (const node of nodes) {
293
+ inDegree.set(node.id, 0);
294
+ adjacency.set(node.id, []);
295
+ }
296
+ for (const edge of edges) {
297
+ if (!adjacency.has(edge.source))
298
+ adjacency.set(edge.source, []);
299
+ if (!inDegree.has(edge.target))
300
+ inDegree.set(edge.target, 0);
301
+ adjacency.get(edge.source).push(edge.target);
302
+ inDegree.set(edge.target, (inDegree.get(edge.target) || 0) + 1);
303
+ }
304
+ const queue = [];
305
+ for (const [id, deg] of inDegree) {
306
+ if (deg === 0)
307
+ queue.push(id);
308
+ }
309
+ const result = [];
310
+ while (queue.length > 0) {
311
+ const id = queue.shift();
312
+ result.push(id);
313
+ const neighbors = adjacency.get(id) || [];
314
+ for (const neighbor of neighbors) {
315
+ const newDeg = (inDegree.get(neighbor) || 0) - 1;
316
+ inDegree.set(neighbor, newDeg);
317
+ if (newDeg === 0)
318
+ queue.push(neighbor);
319
+ }
320
+ }
321
+ // 检查环
322
+ if (result.length !== nodes.length) {
323
+ throw new Error('Workflow contains a cycle');
324
+ }
325
+ return result;
326
+ }
327
+ /** 合并多个 AbortSignal */
328
+ function mergeAbortSignals(...signals) {
329
+ const controller = new AbortController();
330
+ for (const signal of signals) {
331
+ if (signal.aborted) {
332
+ controller.abort();
333
+ return controller.signal;
334
+ }
335
+ signal.addEventListener('abort', () => controller.abort(), { once: true });
336
+ }
337
+ return controller.signal;
338
+ }
339
+ /** 睡眠 */
340
+ function sleep(ms) {
341
+ return new Promise(resolve => setTimeout(resolve, ms));
342
+ }
343
+ /**
344
+ * 解析变量引用:将 VariableValue 解析为实际值
345
+ * 支持 {{变量名}} 插值和 VariableRef 引用
346
+ */
347
+ export function resolveVariable(value, ctx) {
348
+ // 变量引用
349
+ if (typeof value === 'object' && value !== null && !Array.isArray(value) && 'nodeId' in value && 'field' in value) {
350
+ const ref = value;
351
+ const nodeOutput = ctx.nodeOutputs.get(ref.nodeId);
352
+ if (!nodeOutput)
353
+ return undefined;
354
+ return nodeOutput[ref.field];
355
+ }
356
+ // 数组递归解析
357
+ if (Array.isArray(value)) {
358
+ return value.map(v => resolveVariable(v, ctx));
359
+ }
360
+ // 对象递归解析
361
+ if (typeof value === 'object' && value !== null) {
362
+ const result = {};
363
+ for (const [key, val] of Object.entries(value)) {
364
+ result[key] = resolveVariable(val, ctx);
365
+ }
366
+ return result;
367
+ }
368
+ return value;
369
+ }
370
+ /**
371
+ * 模板插值:将 {{变量名}} 替换为实际值
372
+ * 变量名格式:nodeId.field 或 inputs.field
373
+ */
374
+ export function interpolateTemplate(template, ctx) {
375
+ return template.replace(/\{\{(\w+)\.(\w+)\}\}/g, (_, source, field) => {
376
+ if (source === 'inputs') {
377
+ return String(ctx.inputs[field] ?? '');
378
+ }
379
+ const nodeOutput = ctx.nodeOutputs.get(source);
380
+ if (nodeOutput) {
381
+ return String(nodeOutput[field] ?? '');
382
+ }
383
+ return '';
384
+ });
385
+ }
386
+ /**
387
+ * 解析对象中的所有变量引用和模板插值
388
+ */
389
+ export function resolveArgs(args, ctx) {
390
+ const result = {};
391
+ for (const [key, value] of Object.entries(args)) {
392
+ result[key] = resolveVariable(value, ctx);
393
+ }
394
+ return result;
395
+ }
396
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/workflow/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './engine.js';
3
+ export * from './node-executor.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workflow/index.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // Workflow 模块导出
2
+ export * from "./types.js";
3
+ export * from "./engine.js";
4
+ export * from "./node-executor.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workflow/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAEhB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { WorkflowNode, WorkflowExecutionContext, NodeExecutionResult, WorkflowEvent } from './types.js';
2
+ /**
3
+ * 执行单个节点
4
+ */
5
+ export declare function executeNode(node: WorkflowNode, ctx: WorkflowExecutionContext, emit: (event: WorkflowEvent) => void): AsyncGenerator<WorkflowEvent, NodeExecutionResult>;
6
+ /**
7
+ * P2: 从工具执行结果中提取产物信息
8
+ * 工具结果中可能包含产物 URL(如 /api/artifact/xxx)或 JSON 格式的产物信息
9
+ */
10
+ export declare function extractArtifacts(toolName: string, result: string): Array<{
11
+ name: string;
12
+ type: string;
13
+ url: string;
14
+ size?: number;
15
+ tool?: string;
16
+ }>;
17
+ //# sourceMappingURL=node-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-executor.d.ts","sourceRoot":"","sources":["../../../src/workflow/node-executor.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EAYd,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,wBAAuB,WAAW,CAChC,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GACnC,cAAc,CAAC,aAAa,EAAE,mBAAmB,CAAC,CA+BpD;AA0oBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8ClF"}