@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,639 @@
1
+ // ============================================================
2
+ // Node Executor — 节点执行器
3
+ // ============================================================
4
+ // 根据节点类型执行不同逻辑:
5
+ // - start: 初始化输入变量
6
+ // - end: 收集输出
7
+ // - llm: 调用 LLM,支持 Function Calling
8
+ // - tool: 调用工具
9
+ // - condition: 条件分支
10
+ // - code: 执行 JavaScript
11
+ // - http: HTTP 请求
12
+ // - template: 模板渲染
13
+ // ============================================================
14
+ import { resolveVariable, resolveArgs, interpolateTemplate } from "./engine.js";
15
+ /**
16
+ * 执行单个节点
17
+ */
18
+ export async function* executeNode(node, ctx, emit) {
19
+ switch (node.type) {
20
+ case 'start':
21
+ return yield* executeStartNode(node, ctx, emit);
22
+ case 'end':
23
+ return yield* executeEndNode(node, ctx, emit);
24
+ case 'llm':
25
+ return yield* executeLLMNode(node, ctx, emit);
26
+ case 'tool':
27
+ return yield* executeToolNode(node, ctx, emit);
28
+ case 'condition':
29
+ return yield* executeConditionNode(node, ctx, emit);
30
+ case 'code':
31
+ return yield* executeCodeNode(node, ctx, emit);
32
+ case 'http':
33
+ return yield* executeHttpNode(node, ctx, emit);
34
+ case 'template':
35
+ return yield* executeTemplateNode(node, ctx, emit);
36
+ default:
37
+ return {
38
+ nodeId: node.id,
39
+ nodeName: node.name,
40
+ nodeType: node.type,
41
+ output: {},
42
+ status: 'error',
43
+ error: `Unknown node type: ${node.type}`,
44
+ durationMs: 0,
45
+ startedAt: Date.now(),
46
+ finishedAt: Date.now(),
47
+ };
48
+ }
49
+ }
50
+ // ---- Start Node ----
51
+ async function* executeStartNode(node, ctx, _emit) {
52
+ const config = node.config;
53
+ const output = {};
54
+ for (const input of config.inputs) {
55
+ if (ctx.inputs[input.name] !== undefined) {
56
+ output[input.name] = ctx.inputs[input.name];
57
+ }
58
+ else if (input.defaultValue !== undefined) {
59
+ output[input.name] = input.defaultValue;
60
+ }
61
+ else if (input.required) {
62
+ return {
63
+ nodeId: node.id,
64
+ nodeName: node.name,
65
+ nodeType: 'start',
66
+ output: {},
67
+ status: 'error',
68
+ error: `Required input "${input.name}" is missing`,
69
+ durationMs: 0,
70
+ startedAt: Date.now(),
71
+ finishedAt: Date.now(),
72
+ };
73
+ }
74
+ }
75
+ return {
76
+ nodeId: node.id,
77
+ nodeName: node.name,
78
+ nodeType: 'start',
79
+ output,
80
+ status: 'success',
81
+ durationMs: 0,
82
+ startedAt: Date.now(),
83
+ finishedAt: Date.now(),
84
+ };
85
+ }
86
+ // ---- End Node ----
87
+ async function* executeEndNode(node, ctx, _emit) {
88
+ const config = node.config;
89
+ const output = {};
90
+ for (const [key, value] of Object.entries(config.outputs)) {
91
+ output[key] = resolveVariable(value, ctx);
92
+ }
93
+ return {
94
+ nodeId: node.id,
95
+ nodeName: node.name,
96
+ nodeType: 'end',
97
+ output,
98
+ status: 'success',
99
+ durationMs: 0,
100
+ startedAt: Date.now(),
101
+ finishedAt: Date.now(),
102
+ };
103
+ }
104
+ // ---- LLM Node (P0: Function Calling) ----
105
+ async function* executeLLMNode(node, ctx, emit) {
106
+ const config = node.config;
107
+ const startedAt = Date.now();
108
+ if (!ctx.llmCaller) {
109
+ return {
110
+ nodeId: node.id,
111
+ nodeName: node.name,
112
+ nodeType: 'llm',
113
+ output: {},
114
+ status: 'error',
115
+ error: 'LLM caller not provided',
116
+ durationMs: 0,
117
+ startedAt,
118
+ finishedAt: Date.now(),
119
+ };
120
+ }
121
+ // 构建消息
122
+ const systemPrompt = interpolateTemplate(config.systemPrompt, ctx);
123
+ const userMessage = interpolateTemplate(config.userMessageTemplate, ctx);
124
+ const messages = [
125
+ { role: 'system', content: systemPrompt },
126
+ { role: 'user', content: userMessage },
127
+ ];
128
+ // 获取工具定义
129
+ const tools = config.tools || [];
130
+ const toolDefs = tools
131
+ .map(name => ctx.toolRegistry?.getDefinition(name))
132
+ .filter((d) => d !== undefined);
133
+ // Function Calling 循环
134
+ const maxToolRounds = config.maxToolRounds ?? 5;
135
+ let totalUsage;
136
+ const toolCallRecords = [];
137
+ let assistantContent = '';
138
+ for (let round = 0; round < maxToolRounds; round++) {
139
+ if (ctx.abortSignal.aborted) {
140
+ return {
141
+ nodeId: node.id,
142
+ nodeName: node.name,
143
+ nodeType: 'llm',
144
+ output: { content: assistantContent },
145
+ status: 'skipped',
146
+ error: 'Aborted',
147
+ durationMs: Date.now() - startedAt,
148
+ startedAt,
149
+ finishedAt: Date.now(),
150
+ };
151
+ }
152
+ // 调用 LLM
153
+ const llmGen = ctx.llmCaller.call(ctx.sessionId || ctx.executionId, messages, toolDefs, ctx.abortSignal);
154
+ let llmResult = { assistant: null };
155
+ // P3: 跟踪 tool_call 的 args(tool_result 事件不含 args)
156
+ const toolCallArgsMap = new Map();
157
+ while (true) {
158
+ const iter = await llmGen.next();
159
+ if (iter.done) {
160
+ llmResult = iter.value;
161
+ break;
162
+ }
163
+ const llmEvent = iter.value;
164
+ // 转发事件
165
+ switch (llmEvent.type) {
166
+ case 'thinking':
167
+ yield { type: 'node_thinking', nodeId: node.id, content: llmEvent.content, timestamp: Date.now() };
168
+ break;
169
+ case 'message':
170
+ yield { type: 'node_message', nodeId: node.id, content: llmEvent.content, delta: llmEvent.delta, timestamp: Date.now() };
171
+ if (!llmEvent.delta) {
172
+ assistantContent = llmEvent.content;
173
+ }
174
+ break;
175
+ case 'tool_call':
176
+ toolCallArgsMap.set(llmEvent.callId, llmEvent.args);
177
+ yield { type: 'node_tool_call', nodeId: node.id, tool: llmEvent.tool, args: llmEvent.args, callId: llmEvent.callId, timestamp: Date.now() };
178
+ break;
179
+ case 'tool_result':
180
+ yield { type: 'node_tool_result', nodeId: node.id, tool: llmEvent.tool, result: llmEvent.result, isError: llmEvent.isError, callId: llmEvent.callId, durationMs: llmEvent.durationMs, timestamp: Date.now() };
181
+ toolCallRecords.push({
182
+ tool: llmEvent.tool,
183
+ args: toolCallArgsMap.get(llmEvent.callId) || {},
184
+ result: llmEvent.result,
185
+ isError: llmEvent.isError,
186
+ durationMs: llmEvent.durationMs,
187
+ });
188
+ break;
189
+ }
190
+ }
191
+ // 累加 usage
192
+ if (llmResult.usage) {
193
+ totalUsage = totalUsage || { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
194
+ totalUsage.promptTokens += llmResult.usage.promptTokens || 0;
195
+ totalUsage.completionTokens += llmResult.usage.completionTokens || 0;
196
+ totalUsage.totalTokens += llmResult.usage.totalTokens || 0;
197
+ }
198
+ const assistant = llmResult.assistant;
199
+ if (!assistant)
200
+ break;
201
+ messages.push(assistant);
202
+ // 检查是否有 tool_calls
203
+ const toolCalls = assistant.tool_calls;
204
+ if (!toolCalls || toolCalls.length === 0) {
205
+ assistantContent = typeof assistant.content === 'string' ? assistant.content : JSON.stringify(assistant.content);
206
+ break;
207
+ }
208
+ // 执行工具调用
209
+ for (const tc of toolCalls) {
210
+ const toolName = tc.function?.name || tc.name || '';
211
+ const toolArgs = (() => {
212
+ try {
213
+ const argsStr = tc.function?.arguments || tc.arguments || '{}';
214
+ return typeof argsStr === 'string' ? JSON.parse(argsStr) : argsStr;
215
+ }
216
+ catch {
217
+ return {};
218
+ }
219
+ })();
220
+ const toolStart = Date.now();
221
+ let toolResult;
222
+ let isToolError = false;
223
+ try {
224
+ if (!ctx.toolRegistry) {
225
+ throw new Error('Tool registry not provided');
226
+ }
227
+ toolResult = await ctx.toolRegistry.execute(toolName, toolArgs, {
228
+ sessionId: ctx.sessionId || ctx.executionId,
229
+ abortSignal: ctx.abortSignal,
230
+ threadId: ctx.threadId,
231
+ tenant: ctx.tenant,
232
+ });
233
+ }
234
+ catch (err) {
235
+ toolResult = `Error: ${err?.message || 'Tool execution failed'}`;
236
+ isToolError = true;
237
+ }
238
+ const toolDuration = Date.now() - toolStart;
239
+ yield {
240
+ type: 'node_tool_result',
241
+ nodeId: node.id,
242
+ tool: toolName,
243
+ result: toolResult,
244
+ isError: isToolError,
245
+ callId: tc.id || '',
246
+ durationMs: toolDuration,
247
+ timestamp: Date.now(),
248
+ };
249
+ toolCallRecords.push({
250
+ tool: toolName,
251
+ args: toolArgs,
252
+ result: toolResult,
253
+ isError: isToolError,
254
+ durationMs: toolDuration,
255
+ });
256
+ messages.push({
257
+ role: 'tool',
258
+ tool_call_id: tc.id || '',
259
+ content: toolResult,
260
+ });
261
+ }
262
+ // 继续下一轮 LLM 调用
263
+ }
264
+ // P2: 从工具调用结果中提取产物
265
+ const allArtifacts = [];
266
+ for (const tc of toolCallRecords) {
267
+ const tcArtifacts = extractArtifacts(tc.tool, tc.result);
268
+ for (const a of tcArtifacts) {
269
+ allArtifacts.push(a);
270
+ yield {
271
+ type: 'node_artifact',
272
+ nodeId: node.id,
273
+ artifact: a,
274
+ timestamp: Date.now(),
275
+ };
276
+ }
277
+ }
278
+ return {
279
+ nodeId: node.id,
280
+ nodeName: node.name,
281
+ nodeType: 'llm',
282
+ output: { content: assistantContent, messages: messages.slice(2) },
283
+ status: 'success',
284
+ durationMs: Date.now() - startedAt,
285
+ usage: totalUsage,
286
+ toolCalls: toolCallRecords,
287
+ artifacts: allArtifacts.length > 0 ? allArtifacts : undefined,
288
+ startedAt,
289
+ finishedAt: Date.now(),
290
+ };
291
+ }
292
+ // ---- Tool Node ----
293
+ async function* executeToolNode(node, ctx, _emit) {
294
+ const config = node.config;
295
+ const startedAt = Date.now();
296
+ if (!ctx.toolRegistry) {
297
+ return {
298
+ nodeId: node.id,
299
+ nodeName: node.name,
300
+ nodeType: 'tool',
301
+ output: {},
302
+ status: 'error',
303
+ error: 'Tool registry not provided',
304
+ durationMs: 0,
305
+ startedAt,
306
+ finishedAt: Date.now(),
307
+ };
308
+ }
309
+ const args = resolveArgs(config.args, ctx);
310
+ yield {
311
+ type: 'node_tool_call',
312
+ nodeId: node.id,
313
+ tool: config.toolName,
314
+ args,
315
+ callId: '',
316
+ timestamp: Date.now(),
317
+ };
318
+ try {
319
+ const timeoutMs = config.timeoutMs ?? 30000;
320
+ const result = await withTimeout(ctx.toolRegistry.execute(config.toolName, args, {
321
+ sessionId: ctx.sessionId || ctx.executionId,
322
+ abortSignal: ctx.abortSignal,
323
+ threadId: ctx.threadId,
324
+ tenant: ctx.tenant,
325
+ }), timeoutMs);
326
+ yield {
327
+ type: 'node_tool_result',
328
+ nodeId: node.id,
329
+ tool: config.toolName,
330
+ result,
331
+ isError: false,
332
+ callId: '',
333
+ durationMs: Date.now() - startedAt,
334
+ timestamp: Date.now(),
335
+ };
336
+ // P2: 从工具结果中提取产物
337
+ const toolArtifacts = extractArtifacts(config.toolName, result);
338
+ for (const a of toolArtifacts) {
339
+ yield {
340
+ type: 'node_artifact',
341
+ nodeId: node.id,
342
+ artifact: a,
343
+ timestamp: Date.now(),
344
+ };
345
+ }
346
+ return {
347
+ nodeId: node.id,
348
+ nodeName: node.name,
349
+ nodeType: 'tool',
350
+ output: { result },
351
+ status: 'success',
352
+ durationMs: Date.now() - startedAt,
353
+ artifacts: toolArtifacts.length > 0 ? toolArtifacts : undefined,
354
+ startedAt,
355
+ finishedAt: Date.now(),
356
+ };
357
+ }
358
+ catch (err) {
359
+ const errMsg = err?.message || 'Tool execution failed';
360
+ yield {
361
+ type: 'node_tool_result',
362
+ nodeId: node.id,
363
+ tool: config.toolName,
364
+ result: `Error: ${errMsg}`,
365
+ isError: true,
366
+ callId: '',
367
+ durationMs: Date.now() - startedAt,
368
+ timestamp: Date.now(),
369
+ };
370
+ return {
371
+ nodeId: node.id,
372
+ nodeName: node.name,
373
+ nodeType: 'tool',
374
+ output: {},
375
+ status: 'error',
376
+ error: errMsg,
377
+ durationMs: Date.now() - startedAt,
378
+ startedAt,
379
+ finishedAt: Date.now(),
380
+ };
381
+ }
382
+ }
383
+ // ---- Condition Node ----
384
+ async function* executeConditionNode(node, ctx, _emit) {
385
+ const config = node.config;
386
+ const varContext = buildVarContext(ctx);
387
+ let matchedBranch;
388
+ for (const condition of config.conditions) {
389
+ try {
390
+ const fn = new Function('ctx', `with(ctx) { return ${condition.expression}; }`);
391
+ const result = fn(varContext);
392
+ if (result) {
393
+ matchedBranch = condition.name;
394
+ break;
395
+ }
396
+ }
397
+ catch {
398
+ // 表达式执行失败,跳过
399
+ }
400
+ }
401
+ if (!matchedBranch && config.defaultBranch) {
402
+ matchedBranch = config.defaultBranch;
403
+ }
404
+ return {
405
+ nodeId: node.id,
406
+ nodeName: node.name,
407
+ nodeType: 'condition',
408
+ output: { branch: matchedBranch || '' },
409
+ status: 'success',
410
+ durationMs: 0,
411
+ startedAt: Date.now(),
412
+ finishedAt: Date.now(),
413
+ };
414
+ }
415
+ // ---- Code Node ----
416
+ async function* executeCodeNode(node, ctx, _emit) {
417
+ const config = node.config;
418
+ const startedAt = Date.now();
419
+ const inputs = config.inputs ? resolveArgs(config.inputs, ctx) : {};
420
+ try {
421
+ const timeoutMs = config.timeoutMs ?? 10000;
422
+ const result = await withTimeout(new Promise((resolve, reject) => {
423
+ try {
424
+ const varContext = buildVarContext(ctx, inputs);
425
+ const fn = new Function('ctx', 'inputs', `
426
+ ${config.code}
427
+ return typeof result !== 'undefined' ? result : {};
428
+ `);
429
+ const output = fn(varContext, inputs);
430
+ resolve(output || {});
431
+ }
432
+ catch (err) {
433
+ reject(err);
434
+ }
435
+ }), timeoutMs);
436
+ return {
437
+ nodeId: node.id,
438
+ nodeName: node.name,
439
+ nodeType: 'code',
440
+ output: result,
441
+ status: 'success',
442
+ durationMs: Date.now() - startedAt,
443
+ startedAt,
444
+ finishedAt: Date.now(),
445
+ };
446
+ }
447
+ catch (err) {
448
+ return {
449
+ nodeId: node.id,
450
+ nodeName: node.name,
451
+ nodeType: 'code',
452
+ output: {},
453
+ status: 'error',
454
+ error: err?.message || 'Code execution failed',
455
+ durationMs: Date.now() - startedAt,
456
+ startedAt,
457
+ finishedAt: Date.now(),
458
+ };
459
+ }
460
+ }
461
+ // ---- HTTP Node ----
462
+ async function* executeHttpNode(node, ctx, _emit) {
463
+ const config = node.config;
464
+ const startedAt = Date.now();
465
+ try {
466
+ const fetchFn = ctx.httpFetch || fetch;
467
+ const url = interpolateTemplate(config.url, ctx);
468
+ const body = config.body !== undefined ? resolveVariable(config.body, ctx) : undefined;
469
+ const controller = new AbortController();
470
+ const timeoutMs = config.timeoutMs ?? 30000;
471
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
472
+ ctx.abortSignal.addEventListener('abort', () => controller.abort(), { once: true });
473
+ const response = await fetchFn(url, {
474
+ method: config.method,
475
+ headers: config.headers,
476
+ body: body !== undefined ? JSON.stringify(body) : undefined,
477
+ signal: controller.signal,
478
+ });
479
+ clearTimeout(timer);
480
+ const text = await response.text();
481
+ let parsedBody = text;
482
+ try {
483
+ parsedBody = JSON.parse(text);
484
+ }
485
+ catch {
486
+ // 保持文本
487
+ }
488
+ return {
489
+ nodeId: node.id,
490
+ nodeName: node.name,
491
+ nodeType: 'http',
492
+ output: {
493
+ status: response.status,
494
+ statusText: response.statusText,
495
+ headers: Object.fromEntries(response.headers.entries()),
496
+ body: parsedBody,
497
+ },
498
+ status: 'success',
499
+ durationMs: Date.now() - startedAt,
500
+ startedAt,
501
+ finishedAt: Date.now(),
502
+ };
503
+ }
504
+ catch (err) {
505
+ return {
506
+ nodeId: node.id,
507
+ nodeName: node.name,
508
+ nodeType: 'http',
509
+ output: {},
510
+ status: 'error',
511
+ error: err?.message || 'HTTP request failed',
512
+ durationMs: Date.now() - startedAt,
513
+ startedAt,
514
+ finishedAt: Date.now(),
515
+ };
516
+ }
517
+ }
518
+ // ---- Template Node ----
519
+ async function* executeTemplateNode(node, ctx, _emit) {
520
+ const config = node.config;
521
+ const startedAt = Date.now();
522
+ try {
523
+ const inputs = config.inputs ? resolveArgs(config.inputs, ctx) : {};
524
+ const varContext = buildVarContext(ctx, inputs);
525
+ // 模板插值
526
+ let output = config.template.replace(/\{\{(\w+)\.(\w+)\}\}/g, (_, source, field) => {
527
+ if (source === 'inputs') {
528
+ return String(inputs[field] ?? '');
529
+ }
530
+ const nodeOutput = ctx.nodeOutputs.get(source);
531
+ if (nodeOutput) {
532
+ return String(nodeOutput[field] ?? '');
533
+ }
534
+ return '';
535
+ });
536
+ // 支持简单表达式插值
537
+ output = output.replace(/\{\{([^}]+)\}\}/g, (_, expr) => {
538
+ try {
539
+ const fn = new Function('ctx', `with(ctx) { return ${expr.trim()}; }`);
540
+ return String(fn(varContext) ?? '');
541
+ }
542
+ catch {
543
+ return '';
544
+ }
545
+ });
546
+ return {
547
+ nodeId: node.id,
548
+ nodeName: node.name,
549
+ nodeType: 'template',
550
+ output: { content: output },
551
+ status: 'success',
552
+ durationMs: Date.now() - startedAt,
553
+ startedAt,
554
+ finishedAt: Date.now(),
555
+ };
556
+ }
557
+ catch (err) {
558
+ return {
559
+ nodeId: node.id,
560
+ nodeName: node.name,
561
+ nodeType: 'template',
562
+ output: {},
563
+ status: 'error',
564
+ error: err?.message || 'Template rendering failed',
565
+ durationMs: Date.now() - startedAt,
566
+ startedAt,
567
+ finishedAt: Date.now(),
568
+ };
569
+ }
570
+ }
571
+ // ---- 辅助函数 ----
572
+ /** 构建变量上下文(供条件/代码/模板节点使用) */
573
+ function buildVarContext(ctx, extraInputs) {
574
+ const varCtx = {
575
+ inputs: { ...ctx.inputs, ...extraInputs },
576
+ };
577
+ for (const [nodeId, output] of ctx.nodeOutputs) {
578
+ varCtx[nodeId] = output;
579
+ }
580
+ return varCtx;
581
+ }
582
+ /** 带超时的 Promise */
583
+ function withTimeout(promise, timeoutMs) {
584
+ return new Promise((resolve, reject) => {
585
+ const timer = setTimeout(() => reject(new Error(`Timeout after ${timeoutMs}ms`)), timeoutMs);
586
+ promise.then(val => { clearTimeout(timer); resolve(val); }, err => { clearTimeout(timer); reject(err); });
587
+ });
588
+ }
589
+ /**
590
+ * P2: 从工具执行结果中提取产物信息
591
+ * 工具结果中可能包含产物 URL(如 /api/artifact/xxx)或 JSON 格式的产物信息
592
+ */
593
+ export function extractArtifacts(toolName, result) {
594
+ const artifacts = [];
595
+ // 尝试解析 JSON 结果
596
+ try {
597
+ const parsed = JSON.parse(result);
598
+ // 如果结果包含 artifact URL
599
+ if (parsed?.url && typeof parsed.url === 'string') {
600
+ artifacts.push({
601
+ name: parsed.name || parsed.title || `artifact_${Date.now()}`,
602
+ type: parsed.type || parsed.mimeType || 'file',
603
+ url: parsed.url,
604
+ size: parsed.size,
605
+ tool: toolName,
606
+ });
607
+ }
608
+ // 如果结果包含 artifacts 数组
609
+ if (Array.isArray(parsed?.artifacts)) {
610
+ for (const a of parsed.artifacts) {
611
+ if (a?.url) {
612
+ artifacts.push({
613
+ name: a.name || `artifact_${Date.now()}`,
614
+ type: a.type || a.mimeType || 'file',
615
+ url: a.url,
616
+ size: a.size,
617
+ tool: toolName,
618
+ });
619
+ }
620
+ }
621
+ }
622
+ }
623
+ catch {
624
+ // 非 JSON 结果,检查是否包含 artifact URL
625
+ const urlMatch = result.match(/\/api\/artifact\/[^\s"']+/g);
626
+ if (urlMatch) {
627
+ for (const url of urlMatch) {
628
+ artifacts.push({
629
+ name: `artifact_${Date.now()}`,
630
+ type: 'file',
631
+ url,
632
+ tool: toolName,
633
+ });
634
+ }
635
+ }
636
+ }
637
+ return artifacts;
638
+ }
639
+ //# sourceMappingURL=node-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-executor.js","sourceRoot":"","sources":["../../../src/workflow/node-executor.ts"],"names":[],"mappings":"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"}