@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,403 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // Workflow Engine — 工作流执行引擎
4
+ // ============================================================
5
+ // 职责:
6
+ // - 解析工作流 DAG,拓扑排序
7
+ // - 按序执行节点,传递变量
8
+ // - 发射事件供 SSE 流式输出
9
+ // - 错误处理与重试
10
+ // ============================================================
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.WorkflowEngine = void 0;
13
+ exports.resolveVariable = resolveVariable;
14
+ exports.interpolateTemplate = interpolateTemplate;
15
+ exports.resolveArgs = resolveArgs;
16
+ const node_executor_ts_1 = require("./node-executor.js");
17
+ /** 工作流引擎 */
18
+ class WorkflowEngine {
19
+ /**
20
+ * 执行工作流
21
+ * @returns 异步生成器,产出工作流事件,最终返回执行结果
22
+ */
23
+ async *run(params) {
24
+ const { workflow, inputs, abortSignal } = params;
25
+ const executionId = `wf_exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
26
+ const startTime = Date.now();
27
+ // 收集事件
28
+ const events = [];
29
+ const emit = (event) => {
30
+ events.push(event);
31
+ };
32
+ const ctx = {
33
+ executionId,
34
+ workflow,
35
+ inputs,
36
+ nodeOutputs: new Map(),
37
+ results: [],
38
+ abortSignal,
39
+ emit,
40
+ llmCaller: params.llmCaller,
41
+ toolRegistry: params.toolRegistry,
42
+ httpFetch: params.httpFetch,
43
+ sessionId: params.sessionId,
44
+ threadId: params.threadId,
45
+ tenant: params.tenant,
46
+ };
47
+ // 发射 workflow_start 事件
48
+ const startEvent = {
49
+ type: 'workflow_start',
50
+ executionId,
51
+ workflowId: workflow.id,
52
+ workflowName: workflow.name,
53
+ inputs,
54
+ timestamp: startTime,
55
+ };
56
+ yield startEvent;
57
+ emit(startEvent);
58
+ // 设置超时
59
+ const timeoutMs = workflow.timeoutMs ?? 5 * 60 * 1000;
60
+ const timeoutController = new AbortController();
61
+ const timeoutTimer = setTimeout(() => timeoutController.abort(), timeoutMs);
62
+ // 合并 abort 信号
63
+ const mergedSignal = mergeAbortSignals(abortSignal, timeoutController.signal);
64
+ ctx.abortSignal = mergedSignal;
65
+ try {
66
+ // 拓扑排序
67
+ const sortedNodeIds = topologicalSort(workflow.nodes, workflow.edges);
68
+ // 执行节点
69
+ let lastError;
70
+ for (const nodeId of sortedNodeIds) {
71
+ if (mergedSignal.aborted) {
72
+ break;
73
+ }
74
+ const node = workflow.nodes.find(n => n.id === nodeId);
75
+ if (!node)
76
+ continue;
77
+ // 检查条件边:只有满足条件的边才继续执行
78
+ // 简化处理:线性执行,条件节点决定后续分支
79
+ const result = yield* this.executeNodeWithEvents(node, ctx);
80
+ ctx.results.push(result);
81
+ if (result.status === 'error') {
82
+ lastError = result.error;
83
+ // 节点执行失败,终止工作流
84
+ const errorEvent = {
85
+ type: 'workflow_error',
86
+ executionId,
87
+ nodeId: node.id,
88
+ error: result.error || 'Node execution failed',
89
+ timestamp: Date.now(),
90
+ };
91
+ yield errorEvent;
92
+ emit(errorEvent);
93
+ break;
94
+ }
95
+ // 条件节点:决定下一个执行的节点
96
+ if (node.type === 'condition' && result.status === 'success') {
97
+ const matchedBranch = result.output['branch'];
98
+ if (matchedBranch) {
99
+ // 过滤后续节点:只执行匹配分支的节点
100
+ // 这里简化处理:标记分支结果,后续拓扑排序时已包含所有节点
101
+ // 实际分支逻辑在 getNodeSuccessors 中处理
102
+ }
103
+ }
104
+ }
105
+ // 收集输出
106
+ const endNode = workflow.nodes.find(n => n.type === 'end');
107
+ let outputs = {};
108
+ if (endNode && ctx.nodeOutputs.has(endNode.id)) {
109
+ outputs = ctx.nodeOutputs.get(endNode.id);
110
+ }
111
+ const endTime = Date.now();
112
+ const status = mergedSignal.aborted
113
+ ? 'aborted'
114
+ : lastError ? 'error' : 'completed';
115
+ const endEvent = {
116
+ type: 'workflow_end',
117
+ executionId,
118
+ status,
119
+ outputs,
120
+ durationMs: endTime - startTime,
121
+ timestamp: endTime,
122
+ };
123
+ yield endEvent;
124
+ emit(endEvent);
125
+ // 计算 token 总用量
126
+ let totalUsage;
127
+ for (const r of ctx.results) {
128
+ if (r.usage) {
129
+ totalUsage = totalUsage || { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
130
+ totalUsage.promptTokens += r.usage.promptTokens || 0;
131
+ totalUsage.completionTokens += r.usage.completionTokens || 0;
132
+ totalUsage.totalTokens += r.usage.totalTokens || 0;
133
+ }
134
+ }
135
+ // P2: 收集所有节点生成的产物
136
+ const allArtifacts = [];
137
+ for (const r of ctx.results) {
138
+ if (r.artifacts) {
139
+ for (const a of r.artifacts) {
140
+ allArtifacts.push({
141
+ nodeId: r.nodeId,
142
+ nodeName: r.nodeName,
143
+ ...a,
144
+ });
145
+ }
146
+ }
147
+ }
148
+ return {
149
+ executionId,
150
+ workflowId: workflow.id,
151
+ status,
152
+ outputs,
153
+ nodeResults: ctx.results,
154
+ artifacts: allArtifacts.length > 0 ? allArtifacts : undefined,
155
+ durationMs: endTime - startTime,
156
+ totalUsage,
157
+ error: lastError,
158
+ };
159
+ }
160
+ catch (err) {
161
+ const errorEvent = {
162
+ type: 'workflow_error',
163
+ executionId,
164
+ error: err?.message || 'Workflow execution failed',
165
+ timestamp: Date.now(),
166
+ };
167
+ yield errorEvent;
168
+ emit(errorEvent);
169
+ const endTime = Date.now();
170
+ const endEvent = {
171
+ type: 'workflow_end',
172
+ executionId,
173
+ status: 'error',
174
+ outputs: {},
175
+ durationMs: endTime - startTime,
176
+ timestamp: endTime,
177
+ };
178
+ yield endEvent;
179
+ emit(endEvent);
180
+ return {
181
+ executionId,
182
+ workflowId: workflow.id,
183
+ status: 'error',
184
+ outputs: {},
185
+ nodeResults: ctx.results,
186
+ durationMs: endTime - startTime,
187
+ error: err?.message || 'Workflow execution failed',
188
+ };
189
+ }
190
+ finally {
191
+ clearTimeout(timeoutTimer);
192
+ }
193
+ }
194
+ /** 执行单个节点并发射事件 */
195
+ async *executeNodeWithEvents(node, ctx) {
196
+ const startedAt = Date.now();
197
+ // 发射 node_start 事件
198
+ const startEvent = {
199
+ type: 'node_start',
200
+ nodeId: node.id,
201
+ nodeName: node.name,
202
+ nodeType: node.type,
203
+ timestamp: startedAt,
204
+ };
205
+ yield startEvent;
206
+ ctx.emit(startEvent);
207
+ // 执行节点(带重试)
208
+ const maxRetries = node.retry?.maxRetries ?? 0;
209
+ const delayMs = node.retry?.delayMs ?? 1000;
210
+ const backoffFactor = node.retry?.backoffFactor ?? 2;
211
+ let lastError;
212
+ let result;
213
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
214
+ if (ctx.abortSignal.aborted) {
215
+ result = {
216
+ nodeId: node.id,
217
+ nodeName: node.name,
218
+ nodeType: node.type,
219
+ output: {},
220
+ status: 'skipped',
221
+ error: 'Aborted',
222
+ durationMs: Date.now() - startedAt,
223
+ startedAt,
224
+ finishedAt: Date.now(),
225
+ };
226
+ break;
227
+ }
228
+ try {
229
+ // 执行节点(yield* 委托生成器,自动转发事件)
230
+ const nodeResult = yield* (0, node_executor_ts_1.executeNode)(node, ctx, ctx.emit);
231
+ result = {
232
+ ...nodeResult,
233
+ nodeId: node.id,
234
+ nodeName: node.name,
235
+ nodeType: node.type,
236
+ startedAt,
237
+ finishedAt: Date.now(),
238
+ durationMs: Date.now() - startedAt,
239
+ };
240
+ // 存储节点输出
241
+ if (result.status === 'success') {
242
+ ctx.nodeOutputs.set(node.id, result.output);
243
+ }
244
+ break;
245
+ }
246
+ catch (err) {
247
+ lastError = err?.message || 'Node execution failed';
248
+ if (attempt < maxRetries) {
249
+ // P3: 发射重试事件
250
+ const retryEvent = {
251
+ type: 'node_start',
252
+ nodeId: node.id,
253
+ nodeName: node.name,
254
+ nodeType: node.type,
255
+ timestamp: Date.now(),
256
+ };
257
+ yield retryEvent;
258
+ ctx.emit(retryEvent);
259
+ // 等待重试延迟(指数退避)
260
+ const waitMs = delayMs * Math.pow(backoffFactor, attempt);
261
+ await sleep(waitMs);
262
+ }
263
+ }
264
+ }
265
+ if (!result) {
266
+ result = {
267
+ nodeId: node.id,
268
+ nodeName: node.name,
269
+ nodeType: node.type,
270
+ output: {},
271
+ status: 'error',
272
+ error: lastError || 'Unknown error',
273
+ durationMs: Date.now() - startedAt,
274
+ startedAt,
275
+ finishedAt: Date.now(),
276
+ };
277
+ }
278
+ // 发射 node_end 事件
279
+ const endEvent = {
280
+ type: 'node_end',
281
+ nodeId: node.id,
282
+ nodeName: node.name,
283
+ status: result.status,
284
+ durationMs: result.durationMs,
285
+ usage: result.usage,
286
+ timestamp: result.finishedAt,
287
+ };
288
+ yield endEvent;
289
+ ctx.emit(endEvent);
290
+ return result;
291
+ }
292
+ }
293
+ exports.WorkflowEngine = WorkflowEngine;
294
+ // ---- 辅助函数 ----
295
+ /** 拓扑排序 */
296
+ function topologicalSort(nodes, edges) {
297
+ const inDegree = new Map();
298
+ const adjacency = new Map();
299
+ for (const node of nodes) {
300
+ inDegree.set(node.id, 0);
301
+ adjacency.set(node.id, []);
302
+ }
303
+ for (const edge of edges) {
304
+ if (!adjacency.has(edge.source))
305
+ adjacency.set(edge.source, []);
306
+ if (!inDegree.has(edge.target))
307
+ inDegree.set(edge.target, 0);
308
+ adjacency.get(edge.source).push(edge.target);
309
+ inDegree.set(edge.target, (inDegree.get(edge.target) || 0) + 1);
310
+ }
311
+ const queue = [];
312
+ for (const [id, deg] of inDegree) {
313
+ if (deg === 0)
314
+ queue.push(id);
315
+ }
316
+ const result = [];
317
+ while (queue.length > 0) {
318
+ const id = queue.shift();
319
+ result.push(id);
320
+ const neighbors = adjacency.get(id) || [];
321
+ for (const neighbor of neighbors) {
322
+ const newDeg = (inDegree.get(neighbor) || 0) - 1;
323
+ inDegree.set(neighbor, newDeg);
324
+ if (newDeg === 0)
325
+ queue.push(neighbor);
326
+ }
327
+ }
328
+ // 检查环
329
+ if (result.length !== nodes.length) {
330
+ throw new Error('Workflow contains a cycle');
331
+ }
332
+ return result;
333
+ }
334
+ /** 合并多个 AbortSignal */
335
+ function mergeAbortSignals(...signals) {
336
+ const controller = new AbortController();
337
+ for (const signal of signals) {
338
+ if (signal.aborted) {
339
+ controller.abort();
340
+ return controller.signal;
341
+ }
342
+ signal.addEventListener('abort', () => controller.abort(), { once: true });
343
+ }
344
+ return controller.signal;
345
+ }
346
+ /** 睡眠 */
347
+ function sleep(ms) {
348
+ return new Promise(resolve => setTimeout(resolve, ms));
349
+ }
350
+ /**
351
+ * 解析变量引用:将 VariableValue 解析为实际值
352
+ * 支持 {{变量名}} 插值和 VariableRef 引用
353
+ */
354
+ function resolveVariable(value, ctx) {
355
+ // 变量引用
356
+ if (typeof value === 'object' && value !== null && !Array.isArray(value) && 'nodeId' in value && 'field' in value) {
357
+ const ref = value;
358
+ const nodeOutput = ctx.nodeOutputs.get(ref.nodeId);
359
+ if (!nodeOutput)
360
+ return undefined;
361
+ return nodeOutput[ref.field];
362
+ }
363
+ // 数组递归解析
364
+ if (Array.isArray(value)) {
365
+ return value.map(v => resolveVariable(v, ctx));
366
+ }
367
+ // 对象递归解析
368
+ if (typeof value === 'object' && value !== null) {
369
+ const result = {};
370
+ for (const [key, val] of Object.entries(value)) {
371
+ result[key] = resolveVariable(val, ctx);
372
+ }
373
+ return result;
374
+ }
375
+ return value;
376
+ }
377
+ /**
378
+ * 模板插值:将 {{变量名}} 替换为实际值
379
+ * 变量名格式:nodeId.field 或 inputs.field
380
+ */
381
+ function interpolateTemplate(template, ctx) {
382
+ return template.replace(/\{\{(\w+)\.(\w+)\}\}/g, (_, source, field) => {
383
+ if (source === 'inputs') {
384
+ return String(ctx.inputs[field] ?? '');
385
+ }
386
+ const nodeOutput = ctx.nodeOutputs.get(source);
387
+ if (nodeOutput) {
388
+ return String(nodeOutput[field] ?? '');
389
+ }
390
+ return '';
391
+ });
392
+ }
393
+ /**
394
+ * 解析对象中的所有变量引用和模板插值
395
+ */
396
+ function resolveArgs(args, ctx) {
397
+ const result = {};
398
+ for (const [key, value] of Object.entries(args)) {
399
+ result[key] = resolveVariable(value, ctx);
400
+ }
401
+ return result;
402
+ }
403
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/workflow/engine.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,4BAA4B;AAC5B,+DAA+D;AAC/D,MAAM;AACN,mBAAmB;AACnB,gBAAgB;AAChB,mBAAmB;AACnB,YAAY;AACZ,+DAA+D;;;AAiZ/D,0CA2BC;AAMD,kDAcC;AAKD,kCASC;AAjcD,yDAAiD;AAEjD,YAAY;AACZ,MAAa,cAAc;IACzB;;;OAGG;IACH,KAAK,CAAC,CAAC,GAAG,CAAC,MAUV;QACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QACjD,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO;QACP,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,KAAoB,EAAE,EAAE;YACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,MAAM,GAAG,GAA6B;YACpC,WAAW;YACX,QAAQ;YACR,MAAM;YACN,WAAW,EAAE,IAAI,GAAG,EAAE;YACtB,OAAO,EAAE,EAAE;YACX,WAAW;YACX,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QAEF,uBAAuB;QACvB,MAAM,UAAU,GAAkB;YAChC,IAAI,EAAE,gBAAgB;YACtB,WAAW;YACX,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,YAAY,EAAE,QAAQ,CAAC,IAAI;YAC3B,MAAM;YACN,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,MAAM,UAAU,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,CAAC;QAEjB,OAAO;QACP,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACtD,MAAM,iBAAiB,GAAG,IAAI,eAAe,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAE5E,cAAc;QACd,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE9E,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC;QAE/B,IAAI,CAAC;YACH,OAAO;YACP,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEtE,OAAO;YACP,IAAI,SAA6B,CAAC;YAClC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM;gBACR,CAAC;gBAED,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;gBACvD,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,sBAAsB;gBACtB,uBAAuB;gBAEvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC5D,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEzB,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC9B,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;oBACzB,eAAe;oBACf,MAAM,UAAU,GAAkB;wBAChC,IAAI,EAAE,gBAAgB;wBACtB,WAAW;wBACX,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,uBAAuB;wBAC9C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC;oBACF,MAAM,UAAU,CAAC;oBACjB,IAAI,CAAC,UAAU,CAAC,CAAC;oBACjB,MAAM;gBACR,CAAC;gBAED,kBAAkB;gBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC7D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAuB,CAAC;oBACpE,IAAI,aAAa,EAAE,CAAC;wBAClB,oBAAoB;wBACpB,+BAA+B;wBAC/B,gCAAgC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;YACP,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YAC3D,IAAI,OAAO,GAA4B,EAAE,CAAC;YAC1C,IAAI,OAAO,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/C,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAE,CAAC;YAC7C,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAsC,YAAY,CAAC,OAAO;gBACpE,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;YAEtC,MAAM,QAAQ,GAAkB;gBAC9B,IAAI,EAAE,cAAc;gBACpB,WAAW;gBACX,MAAM;gBACN,OAAO;gBACP,UAAU,EAAE,OAAO,GAAG,SAAS;gBAC/B,SAAS,EAAE,OAAO;aACnB,CAAC;YACF,MAAM,QAAQ,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEf,eAAe;YACf,IAAI,UAAwD,CAAC;YAC7D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBACZ,UAAU,GAAG,UAAU,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBACpF,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;oBACrD,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;oBAC7D,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,MAAM,YAAY,GAAsD,EAAE,CAAC;YAC3E,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;oBAChB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;wBAC5B,YAAY,CAAC,IAAI,CAAC;4BAChB,MAAM,EAAE,CAAC,CAAC,MAAM;4BAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;4BACpB,GAAG,CAAC;yBACL,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,WAAW;gBACX,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,MAAM;gBACN,OAAO;gBACP,WAAW,EAAE,GAAG,CAAC,OAAO;gBACxB,SAAS,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;gBAC7D,UAAU,EAAE,OAAO,GAAG,SAAS;gBAC/B,UAAU;gBACV,KAAK,EAAE,SAAS;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,UAAU,GAAkB;gBAChC,IAAI,EAAE,gBAAgB;gBACtB,WAAW;gBACX,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,2BAA2B;gBAClD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,MAAM,UAAU,CAAC;YACjB,IAAI,CAAC,UAAU,CAAC,CAAC;YAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAkB;gBAC9B,IAAI,EAAE,cAAc;gBACpB,WAAW;gBACX,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,OAAO,GAAG,SAAS;gBAC/B,SAAS,EAAE,OAAO;aACnB,CAAC;YACF,MAAM,QAAQ,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEf,OAAO;gBACL,WAAW;gBACX,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,GAAG,CAAC,OAAO;gBACxB,UAAU,EAAE,OAAO,GAAG,SAAS;gBAC/B,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,2BAA2B;aACnD,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,kBAAkB;IACV,KAAK,CAAC,CAAC,qBAAqB,CAClC,IAAkB,EAClB,GAA6B;QAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,mBAAmB;QACnB,MAAM,UAAU,GAAkB;YAChC,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,SAAS,EAAE,SAAS;SACrB,CAAC;QACF,MAAM,UAAU,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAErB,YAAY;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;QAErD,IAAI,SAA6B,CAAC;QAClC,IAAI,MAAuC,CAAC;QAE5C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,GAAG;oBACP,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,MAAM,EAAE,EAAE;oBACV,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,SAAS;oBAChB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,SAAS;oBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;iBACvB,CAAC;gBACF,MAAM;YACR,CAAC;YAED,IAAI,CAAC;gBACH,4BAA4B;gBAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,IAAA,8BAAW,EAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAE3D,MAAM,GAAG;oBACP,GAAG,UAAU;oBACb,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,SAAS;oBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;oBACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC;gBAEF,SAAS;gBACT,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9C,CAAC;gBAED,MAAM;YACR,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,SAAS,GAAG,GAAG,EAAE,OAAO,IAAI,uBAAuB,CAAC;gBACpD,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,aAAa;oBACb,MAAM,UAAU,GAAkB;wBAChC,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC;oBACF,MAAM,UAAU,CAAC;oBACjB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAErB,eAAe;oBACf,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAC1D,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG;gBACP,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,SAAS,IAAI,eAAe;gBACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAClC,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;aACvB,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAkB;YAC9B,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,UAAU;SAC7B,CAAC;QACF,MAAM,QAAQ,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA7TD,wCA6TC;AAED,iBAAiB;AAEjB,WAAW;AACX,SAAS,eAAe,CAAC,KAAqB,EAAE,KAAqB;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACzB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7D,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,IAAI,GAAG,KAAK,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC/B,IAAI,MAAM,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,MAAM;IACN,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uBAAuB;AACvB,SAAS,iBAAiB,CAAC,GAAG,OAAsB;IAClD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,UAAU,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,SAAS;AACT,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAC7B,KAAoB,EACpB,GAA6B;IAE7B,OAAO;IACP,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QAClH,MAAM,GAAG,GAAG,KAAoB,CAAC;QACjC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAClC,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;IACT,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,SAAS;IACT,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,QAAgB,EAChB,GAA6B;IAE7B,OAAO,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,MAAc,EAAE,KAAa,EAAE,EAAE;QACpF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CACzB,IAAmC,EACnC,GAA6B;IAE7B,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -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,21 @@
1
+ "use strict";
2
+ // Workflow 模块导出
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ __exportStar(require("./types.js"), exports);
19
+ __exportStar(require("./engine.js"), exports);
20
+ __exportStar(require("./node-executor.js"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workflow/index.ts"],"names":[],"mappings":";AAAA,gBAAgB;;;;;;;;;;;;;;;;AAEhB,6CAA2B;AAC3B,8CAA4B;AAC5B,qDAAmC"}
@@ -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"}