@cicctencent/agent-core 0.1.15 → 0.1.17
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/README.md +1 -0
- package/dist/cjs/a2a/client.d.ts +32 -2
- package/dist/cjs/a2a/client.d.ts.map +1 -1
- package/dist/cjs/a2a/client.js +59 -10
- package/dist/cjs/a2a/client.js.map +1 -1
- package/dist/cjs/a2a/index.d.ts +4 -1
- package/dist/cjs/a2a/index.d.ts.map +1 -1
- package/dist/cjs/a2a/index.js +8 -1
- package/dist/cjs/a2a/index.js.map +1 -1
- package/dist/cjs/a2a/runner.d.ts +11 -0
- package/dist/cjs/a2a/runner.d.ts.map +1 -1
- package/dist/cjs/a2a/runner.js +157 -68
- package/dist/cjs/a2a/runner.js.map +1 -1
- package/dist/cjs/a2a/server.d.ts +50 -0
- package/dist/cjs/a2a/server.d.ts.map +1 -0
- package/dist/cjs/a2a/server.js +173 -0
- package/dist/cjs/a2a/server.js.map +1 -0
- package/dist/cjs/agent/history-manager.d.ts +8 -2
- package/dist/cjs/agent/history-manager.d.ts.map +1 -1
- package/dist/cjs/agent/history-manager.js +6 -6
- package/dist/cjs/agent/history-manager.js.map +1 -1
- package/dist/cjs/agent/runtime-builder.d.ts +83 -0
- package/dist/cjs/agent/runtime-builder.d.ts.map +1 -0
- package/dist/cjs/agent/runtime-builder.js +127 -0
- package/dist/cjs/agent/runtime-builder.js.map +1 -0
- package/dist/cjs/agent/types.d.ts +17 -0
- package/dist/cjs/agent/types.d.ts.map +1 -1
- package/dist/cjs/agent/types.js +43 -0
- package/dist/cjs/agent/types.js.map +1 -1
- package/dist/cjs/index.d.ts +13 -5
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +30 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/memory/types.d.ts +48 -0
- package/dist/cjs/memory/types.d.ts.map +1 -1
- package/dist/cjs/memory/types.js +52 -0
- package/dist/cjs/memory/types.js.map +1 -1
- package/dist/cjs/runtime/run-controller.d.ts +40 -0
- package/dist/cjs/runtime/run-controller.d.ts.map +1 -0
- package/dist/cjs/runtime/run-controller.js +93 -0
- package/dist/cjs/runtime/run-controller.js.map +1 -0
- package/dist/cjs/sandbox/local-sandbox.d.ts +59 -0
- package/dist/cjs/sandbox/local-sandbox.d.ts.map +1 -0
- package/dist/cjs/sandbox/local-sandbox.js +228 -0
- package/dist/cjs/sandbox/local-sandbox.js.map +1 -0
- package/dist/cjs/security/guard.d.ts +11 -0
- package/dist/cjs/security/guard.d.ts.map +1 -1
- package/dist/cjs/security/guard.js +46 -0
- package/dist/cjs/security/guard.js.map +1 -1
- package/dist/cjs/tool/builtin-tools.d.ts +22 -0
- package/dist/cjs/tool/builtin-tools.d.ts.map +1 -0
- package/dist/cjs/tool/builtin-tools.js +221 -0
- package/dist/cjs/tool/builtin-tools.js.map +1 -0
- package/dist/cjs/tool/registry.d.ts +76 -1
- package/dist/cjs/tool/registry.d.ts.map +1 -1
- package/dist/cjs/tool/registry.js +81 -0
- package/dist/cjs/tool/registry.js.map +1 -1
- package/dist/cjs/utils/event-adapter.d.ts +25 -0
- package/dist/cjs/utils/event-adapter.d.ts.map +1 -0
- package/dist/cjs/utils/event-adapter.js +93 -0
- package/dist/cjs/utils/event-adapter.js.map +1 -0
- package/dist/esm/a2a/client.d.ts +32 -2
- package/dist/esm/a2a/client.d.ts.map +1 -1
- package/dist/esm/a2a/client.js +58 -10
- package/dist/esm/a2a/client.js.map +1 -1
- package/dist/esm/a2a/index.d.ts +4 -1
- package/dist/esm/a2a/index.d.ts.map +1 -1
- package/dist/esm/a2a/index.js +2 -1
- package/dist/esm/a2a/index.js.map +1 -1
- package/dist/esm/a2a/runner.d.ts +11 -0
- package/dist/esm/a2a/runner.d.ts.map +1 -1
- package/dist/esm/a2a/runner.js +157 -68
- package/dist/esm/a2a/runner.js.map +1 -1
- package/dist/esm/a2a/server.d.ts +50 -0
- package/dist/esm/a2a/server.d.ts.map +1 -0
- package/dist/esm/a2a/server.js +165 -0
- package/dist/esm/a2a/server.js.map +1 -0
- package/dist/esm/agent/history-manager.d.ts +8 -2
- package/dist/esm/agent/history-manager.d.ts.map +1 -1
- package/dist/esm/agent/history-manager.js +6 -6
- package/dist/esm/agent/history-manager.js.map +1 -1
- package/dist/esm/agent/runtime-builder.d.ts +83 -0
- package/dist/esm/agent/runtime-builder.d.ts.map +1 -0
- package/dist/esm/agent/runtime-builder.js +120 -0
- package/dist/esm/agent/runtime-builder.js.map +1 -0
- package/dist/esm/agent/types.d.ts +17 -0
- package/dist/esm/agent/types.d.ts.map +1 -1
- package/dist/esm/agent/types.js +42 -1
- package/dist/esm/agent/types.js.map +1 -1
- package/dist/esm/index.d.ts +13 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/memory/types.d.ts +48 -0
- package/dist/esm/memory/types.d.ts.map +1 -1
- package/dist/esm/memory/types.js +50 -1
- package/dist/esm/memory/types.js.map +1 -1
- package/dist/esm/runtime/run-controller.d.ts +40 -0
- package/dist/esm/runtime/run-controller.d.ts.map +1 -0
- package/dist/esm/runtime/run-controller.js +89 -0
- package/dist/esm/runtime/run-controller.js.map +1 -0
- package/dist/esm/sandbox/local-sandbox.d.ts +59 -0
- package/dist/esm/sandbox/local-sandbox.d.ts.map +1 -0
- package/dist/esm/sandbox/local-sandbox.js +188 -0
- package/dist/esm/sandbox/local-sandbox.js.map +1 -0
- package/dist/esm/security/guard.d.ts +11 -0
- package/dist/esm/security/guard.d.ts.map +1 -1
- package/dist/esm/security/guard.js +46 -0
- package/dist/esm/security/guard.js.map +1 -1
- package/dist/esm/tool/builtin-tools.d.ts +22 -0
- package/dist/esm/tool/builtin-tools.d.ts.map +1 -0
- package/dist/esm/tool/builtin-tools.js +214 -0
- package/dist/esm/tool/builtin-tools.js.map +1 -0
- package/dist/esm/tool/registry.d.ts +76 -1
- package/dist/esm/tool/registry.d.ts.map +1 -1
- package/dist/esm/tool/registry.js +81 -0
- package/dist/esm/tool/registry.js.map +1 -1
- package/dist/esm/utils/event-adapter.d.ts +25 -0
- package/dist/esm/utils/event-adapter.d.ts.map +1 -0
- package/dist/esm/utils/event-adapter.js +87 -0
- package/dist/esm/utils/event-adapter.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ AI Agent 核心引擎,提供 ReAct 循环编排、多 LLM 供应商抽象、
|
|
|
8
8
|
|
|
9
9
|
- [完整 API 文档](./docs/API.md) — 所有模块的接口说明和使用示例
|
|
10
10
|
- [v0.2 升级指南](./docs/UPGRADE_v0.2.md) — 新增 12 个下沉模块的集成指南
|
|
11
|
+
- [Runtime 下沉与迁移指南](./docs/RUNTIME_AND_MIGRATION.md) — Runtime Builder、RunController、默认沙箱、A2A Server Helper 与使用方迁移边界
|
|
11
12
|
|
|
12
13
|
## 快速开始
|
|
13
14
|
|
package/dist/cjs/a2a/client.d.ts
CHANGED
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
import type { A2AAgentCard, A2ASendTaskParams, A2ATask, A2ATaskEvent } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 认证配置(统一 bearer / basic / apiKey / custom 四种方式)
|
|
4
|
+
*
|
|
5
|
+
* value 支持 `${env.VAR_NAME}` 模板,运行时从环境变量读取敏感凭证。
|
|
6
|
+
*/
|
|
7
|
+
export interface AuthConfig {
|
|
8
|
+
/** 认证方式 */
|
|
9
|
+
type: 'bearer' | 'basic' | 'apiKey' | 'custom';
|
|
10
|
+
/** 认证凭证值(支持 `${env.VAR_NAME}` 模板语法) */
|
|
11
|
+
value: string;
|
|
12
|
+
/** apiKey/custom 模式下的 header 名称(如 X-API-Key) */
|
|
13
|
+
name?: string;
|
|
14
|
+
}
|
|
15
|
+
/** 将 AuthConfig 转为 HTTP 请求头 */
|
|
16
|
+
export declare function buildAuthHeaders(auth?: AuthConfig | null): Record<string, string>;
|
|
2
17
|
/** A2A 客户端配置 */
|
|
3
18
|
export interface A2AClientOptions {
|
|
4
19
|
/** 请求超时(毫秒),默认 300000(5分钟) */
|
|
5
20
|
timeout?: number;
|
|
21
|
+
/** SSE 连接超时(毫秒),默认 30000(30秒) */
|
|
22
|
+
connectTimeout?: number;
|
|
23
|
+
/** SSE 逐 chunk 读取超时(毫秒),默认 60000(60秒无数据视为流中断) */
|
|
24
|
+
chunkTimeout?: number;
|
|
6
25
|
/** 自定义 fetch 实现(默认使用 globalThis.fetch) */
|
|
7
26
|
fetch?: typeof fetch;
|
|
8
27
|
/** 自定义请求头(如认证 token) */
|
|
9
28
|
headers?: Record<string, string>;
|
|
29
|
+
/** 认证配置(自动转为 headers,与 headers 合并) */
|
|
30
|
+
auth?: AuthConfig;
|
|
10
31
|
}
|
|
11
32
|
/**
|
|
12
33
|
* 轻量 A2A 协议客户端
|
|
@@ -18,6 +39,8 @@ export interface A2AClientOptions {
|
|
|
18
39
|
*/
|
|
19
40
|
export declare class A2AClient {
|
|
20
41
|
private timeout;
|
|
42
|
+
private connectTimeout;
|
|
43
|
+
private chunkTimeout;
|
|
21
44
|
private fetchFn;
|
|
22
45
|
private headers;
|
|
23
46
|
constructor(options?: A2AClientOptions);
|
|
@@ -31,6 +54,13 @@ export declare class A2AClient {
|
|
|
31
54
|
/**
|
|
32
55
|
* 流式发送任务(tasks/sendSubscribe),通过回调逐步接收事件
|
|
33
56
|
* 返回最后一个 status-update 事件(通常为 final 事件),用于提取最终结果
|
|
57
|
+
*
|
|
58
|
+
* 增强特性:
|
|
59
|
+
* - connectTimeout: SSE 连接超时(默认 30s)
|
|
60
|
+
* - chunkTimeout: 逐 chunk 读取超时(默认 60s 无数据视为流中断)
|
|
61
|
+
* - 外部 AbortSignal 联动(前端断开时中止连接和读取)
|
|
62
|
+
* - 流异常时保留已接收事件(优雅降级)
|
|
63
|
+
*
|
|
34
64
|
* @param abortSignal 外部中止信号(前端断开时中止 SSE 读取)
|
|
35
65
|
*/
|
|
36
66
|
sendTaskStreaming(agentUrl: string, params: A2ASendTaskParams, onEvent?: (event: A2ATaskEvent) => void, abortSignal?: AbortSignal): Promise<A2ATaskEvent | null>;
|
|
@@ -42,8 +72,8 @@ export declare class A2AClient {
|
|
|
42
72
|
private resolveAgentCardUrl;
|
|
43
73
|
/** 发送 JSON-RPC 请求 */
|
|
44
74
|
private jsonRpcCall;
|
|
45
|
-
/**
|
|
46
|
-
private
|
|
75
|
+
/** 带 chunkTimeout 的 reader.read()(每次读取单独计时,收到数据即重置) */
|
|
76
|
+
private readChunkWithTimeout;
|
|
47
77
|
/** 带超时的 fetch */
|
|
48
78
|
private fetchWithTimeout;
|
|
49
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/a2a/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EAGZ,iBAAiB,EACjB,OAAO,EACP,YAAY,EAGb,MAAM,YAAY,CAAC;AASpB,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/a2a/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EAGZ,iBAAiB,EACjB,OAAO,EACP,YAAY,EAGb,MAAM,YAAY,CAAC;AASpB;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUjF;AAED,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sCAAsC;IACtC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAyB;gBAE5B,OAAO,GAAE,gBAAqB;IAU1C;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAe3D,wCAAwC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ7E;;;;;;;;;;;OAWG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,EACvC,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA2F/B,wBAAwB;IAClB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzF,yBAAyB;IACnB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWpE,wBAAwB;IACxB,OAAO,CAAC,mBAAmB;IAM3B,qBAAqB;YACP,WAAW;IAyBzB,uDAAuD;YACzC,oBAAoB;IAgBlC,iBAAiB;YACH,gBAAgB;CAS/B"}
|
package/dist/cjs/a2a/client.js
CHANGED
|
@@ -5,11 +5,25 @@
|
|
|
5
5
|
// ============================================================
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.A2AClient = void 0;
|
|
8
|
+
exports.buildAuthHeaders = buildAuthHeaders;
|
|
8
9
|
/** JSON-RPC 请求 ID 自增计数器 */
|
|
9
10
|
let rpcIdCounter = 0;
|
|
10
11
|
function nextRpcId() {
|
|
11
12
|
return `a2a_${++rpcIdCounter}_${Date.now()}`;
|
|
12
13
|
}
|
|
14
|
+
/** 将 AuthConfig 转为 HTTP 请求头 */
|
|
15
|
+
function buildAuthHeaders(auth) {
|
|
16
|
+
if (!auth?.value)
|
|
17
|
+
return {};
|
|
18
|
+
const val = auth.value.replace(/\$\{env\.(\w+)\}/g, (_, name) => process.env[name] || '');
|
|
19
|
+
switch (auth.type) {
|
|
20
|
+
case 'bearer': return { 'Authorization': `Bearer ${val}` };
|
|
21
|
+
case 'basic': return { 'Authorization': `Basic ${val}` };
|
|
22
|
+
case 'apiKey': return { [auth.name || 'X-API-Key']: val };
|
|
23
|
+
case 'custom': return { [auth.name || 'X-Custom-Auth']: val };
|
|
24
|
+
default: return {};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
13
27
|
/**
|
|
14
28
|
* 轻量 A2A 协议客户端
|
|
15
29
|
*
|
|
@@ -20,12 +34,16 @@ function nextRpcId() {
|
|
|
20
34
|
*/
|
|
21
35
|
class A2AClient {
|
|
22
36
|
timeout;
|
|
37
|
+
connectTimeout;
|
|
38
|
+
chunkTimeout;
|
|
23
39
|
fetchFn;
|
|
24
40
|
headers;
|
|
25
41
|
constructor(options = {}) {
|
|
26
42
|
this.timeout = options.timeout ?? 300_000;
|
|
43
|
+
this.connectTimeout = options.connectTimeout ?? 30_000;
|
|
44
|
+
this.chunkTimeout = options.chunkTimeout ?? 60_000;
|
|
27
45
|
this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
28
|
-
this.headers = options.headers ?? {};
|
|
46
|
+
this.headers = { ...buildAuthHeaders(options.auth), ...(options.headers ?? {}) };
|
|
29
47
|
}
|
|
30
48
|
// ---- Agent 发现 ----
|
|
31
49
|
/**
|
|
@@ -56,6 +74,13 @@ class A2AClient {
|
|
|
56
74
|
/**
|
|
57
75
|
* 流式发送任务(tasks/sendSubscribe),通过回调逐步接收事件
|
|
58
76
|
* 返回最后一个 status-update 事件(通常为 final 事件),用于提取最终结果
|
|
77
|
+
*
|
|
78
|
+
* 增强特性:
|
|
79
|
+
* - connectTimeout: SSE 连接超时(默认 30s)
|
|
80
|
+
* - chunkTimeout: 逐 chunk 读取超时(默认 60s 无数据视为流中断)
|
|
81
|
+
* - 外部 AbortSignal 联动(前端断开时中止连接和读取)
|
|
82
|
+
* - 流异常时保留已接收事件(优雅降级)
|
|
83
|
+
*
|
|
59
84
|
* @param abortSignal 外部中止信号(前端断开时中止 SSE 读取)
|
|
60
85
|
*/
|
|
61
86
|
async sendTaskStreaming(agentUrl, params, onEvent, abortSignal) {
|
|
@@ -65,20 +90,36 @@ class A2AClient {
|
|
|
65
90
|
method: 'tasks/sendSubscribe',
|
|
66
91
|
params: params,
|
|
67
92
|
};
|
|
68
|
-
//
|
|
93
|
+
// 连接阶段:使用独立 AbortController + connectTimeout + 外部 signal 联动
|
|
94
|
+
const connectAbort = new AbortController();
|
|
95
|
+
const connectTimer = setTimeout(() => connectAbort.abort(), this.connectTimeout);
|
|
96
|
+
if (abortSignal) {
|
|
97
|
+
if (abortSignal.aborted) {
|
|
98
|
+
connectAbort.abort();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
abortSignal.addEventListener('abort', () => connectAbort.abort(), { once: true });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
69
104
|
let res;
|
|
70
105
|
try {
|
|
71
106
|
res = await this.fetchFn(agentUrl, {
|
|
72
107
|
method: 'POST',
|
|
73
108
|
headers: { 'Content-Type': 'application/json', ...this.headers },
|
|
74
109
|
body: JSON.stringify(request),
|
|
75
|
-
signal:
|
|
110
|
+
signal: connectAbort.signal,
|
|
76
111
|
});
|
|
77
112
|
}
|
|
78
113
|
catch (fetchErr) {
|
|
79
114
|
if (abortSignal?.aborted)
|
|
80
115
|
return null;
|
|
81
|
-
|
|
116
|
+
if (fetchErr?.name === 'AbortError') {
|
|
117
|
+
throw new Error(`A2A streaming connect timeout (${this.connectTimeout}ms) → ${agentUrl}`);
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`A2A streaming connect error → ${agentUrl}: ${fetchErr?.message || fetchErr}`);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
clearTimeout(connectTimer);
|
|
82
123
|
}
|
|
83
124
|
if (!res.ok) {
|
|
84
125
|
let bodyText = '';
|
|
@@ -101,7 +142,7 @@ class A2AClient {
|
|
|
101
142
|
while (true) {
|
|
102
143
|
if (abortSignal?.aborted)
|
|
103
144
|
break;
|
|
104
|
-
const { done, value } = await this.
|
|
145
|
+
const { done, value } = await this.readChunkWithTimeout(reader);
|
|
105
146
|
if (done)
|
|
106
147
|
break;
|
|
107
148
|
buffer += decoder.decode(value, { stream: true });
|
|
@@ -127,12 +168,20 @@ class A2AClient {
|
|
|
127
168
|
}
|
|
128
169
|
}
|
|
129
170
|
catch (streamErr) {
|
|
171
|
+
// 流异常时保留已接收事件(优雅降级)
|
|
130
172
|
if (abortSignal?.aborted)
|
|
131
173
|
return lastStatusUpdate;
|
|
174
|
+
if (lastStatusUpdate) {
|
|
175
|
+
console.warn(`[A2A-Client] SSE stream error but have events, returning partial: ${streamErr?.message}`);
|
|
176
|
+
return lastStatusUpdate;
|
|
177
|
+
}
|
|
132
178
|
throw streamErr;
|
|
133
179
|
}
|
|
134
180
|
finally {
|
|
135
|
-
|
|
181
|
+
try {
|
|
182
|
+
reader.releaseLock();
|
|
183
|
+
}
|
|
184
|
+
catch { /* ignore */ }
|
|
136
185
|
}
|
|
137
186
|
return lastStatusUpdate;
|
|
138
187
|
}
|
|
@@ -182,13 +231,13 @@ class A2AClient {
|
|
|
182
231
|
}
|
|
183
232
|
return (await res.json());
|
|
184
233
|
}
|
|
185
|
-
/**
|
|
186
|
-
async
|
|
234
|
+
/** 带 chunkTimeout 的 reader.read()(每次读取单独计时,收到数据即重置) */
|
|
235
|
+
async readChunkWithTimeout(reader) {
|
|
187
236
|
let timer;
|
|
188
237
|
const timeout = new Promise((_, reject) => {
|
|
189
238
|
timer = setTimeout(() => {
|
|
190
|
-
reject(new Error(`A2A streaming
|
|
191
|
-
}, this.
|
|
239
|
+
reject(new Error(`A2A streaming chunk timeout: no data for ${this.chunkTimeout}ms`));
|
|
240
|
+
}, this.chunkTimeout);
|
|
192
241
|
});
|
|
193
242
|
try {
|
|
194
243
|
return await Promise.race([reader.read(), timeout]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/a2a/client.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,2BAA2B;AAC3B,8BAA8B;AAC9B,+DAA+D;;;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/a2a/client.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/a2a/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export type { A2AAgentCard, A2AAgentSkill, A2AAgentCapabilities, A2ATextPart, A2AFilePart, A2ADataPart, A2APart, A2AMessage, A2ATaskState, A2ATaskStatus, A2AArtifact, A2ATask, A2ATaskStatusUpdateEvent, A2ATaskArtifactUpdateEvent, A2ATaskEvent, A2AJsonRpcRequest, A2AJsonRpcResponse, A2AJsonRpcError, A2ASendTaskParams, A2ASendSubscribeParams, A2AGetTaskParams, A2ACancelTaskParams, A2ARemoteAgentConfig, } from './types.js';
|
|
2
|
-
export { A2AClient } from './client.js';
|
|
2
|
+
export { A2AClient, buildAuthHeaders } from './client.js';
|
|
3
|
+
export type { AuthConfig, A2AClientOptions } from './client.js';
|
|
3
4
|
export { createA2ARemoteRunner, extractTextFromMessage } from './runner.js';
|
|
4
5
|
export type { A2ARemoteRunnerConfig } from './runner.js';
|
|
6
|
+
export { A2AServerHandler, InMemoryA2ATaskStore, createA2AAgentCard, createA2AMessage, mapAgentEventToA2AEvent, } from './server.js';
|
|
7
|
+
export type { A2AHandlerResponse, A2AServerAgentConfig, A2AServerHandlerOptions, A2AStreamingJsonRpcResponse, A2ATaskStore, } from './server.js';
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,OAAO,EACP,wBAAwB,EACxB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,OAAO,EACP,wBAAwB,EACxB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,YAAY,GACb,MAAM,aAAa,CAAC"}
|
package/dist/cjs/a2a/index.js
CHANGED
|
@@ -3,10 +3,17 @@
|
|
|
3
3
|
// A2A 模块统一导出
|
|
4
4
|
// ============================================================
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.extractTextFromMessage = exports.createA2ARemoteRunner = exports.A2AClient = void 0;
|
|
6
|
+
exports.mapAgentEventToA2AEvent = exports.createA2AMessage = exports.createA2AAgentCard = exports.InMemoryA2ATaskStore = exports.A2AServerHandler = exports.extractTextFromMessage = exports.createA2ARemoteRunner = exports.buildAuthHeaders = exports.A2AClient = void 0;
|
|
7
7
|
var client_ts_1 = require("./client.js");
|
|
8
8
|
Object.defineProperty(exports, "A2AClient", { enumerable: true, get: function () { return client_ts_1.A2AClient; } });
|
|
9
|
+
Object.defineProperty(exports, "buildAuthHeaders", { enumerable: true, get: function () { return client_ts_1.buildAuthHeaders; } });
|
|
9
10
|
var runner_ts_1 = require("./runner.js");
|
|
10
11
|
Object.defineProperty(exports, "createA2ARemoteRunner", { enumerable: true, get: function () { return runner_ts_1.createA2ARemoteRunner; } });
|
|
11
12
|
Object.defineProperty(exports, "extractTextFromMessage", { enumerable: true, get: function () { return runner_ts_1.extractTextFromMessage; } });
|
|
13
|
+
var server_ts_1 = require("./server.js");
|
|
14
|
+
Object.defineProperty(exports, "A2AServerHandler", { enumerable: true, get: function () { return server_ts_1.A2AServerHandler; } });
|
|
15
|
+
Object.defineProperty(exports, "InMemoryA2ATaskStore", { enumerable: true, get: function () { return server_ts_1.InMemoryA2ATaskStore; } });
|
|
16
|
+
Object.defineProperty(exports, "createA2AAgentCard", { enumerable: true, get: function () { return server_ts_1.createA2AAgentCard; } });
|
|
17
|
+
Object.defineProperty(exports, "createA2AMessage", { enumerable: true, get: function () { return server_ts_1.createA2AMessage; } });
|
|
18
|
+
Object.defineProperty(exports, "mapAgentEventToA2AEvent", { enumerable: true, get: function () { return server_ts_1.mapAgentEventToA2AEvent; } });
|
|
12
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;;;AA4B/D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;;;AA4B/D,yCAA0D;AAAjD,sGAAA,SAAS,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAGpC,yCAA4E;AAAnE,kHAAA,qBAAqB,OAAA;AAAE,mHAAA,sBAAsB,OAAA;AAGtD,yCAMqB;AALnB,6GAAA,gBAAgB,OAAA;AAChB,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA;AAClB,6GAAA,gBAAgB,OAAA;AAChB,oHAAA,uBAAuB,OAAA"}
|
package/dist/cjs/a2a/runner.d.ts
CHANGED
|
@@ -17,6 +17,17 @@ export interface A2ARemoteRunnerConfig {
|
|
|
17
17
|
client: A2AClient;
|
|
18
18
|
/** 可选的 skillId,供服务端路由到对应的 specialist profile */
|
|
19
19
|
skillId?: string;
|
|
20
|
+
/** 流式失败时是否自动回退到同步模式,默认 true */
|
|
21
|
+
fallbackToSync?: boolean;
|
|
22
|
+
/** 智能事件过滤配置(控制 SSE 事件转发粒度) */
|
|
23
|
+
eventFilter?: {
|
|
24
|
+
/** thinking 累积多少字符后批量转发,默认 100 */
|
|
25
|
+
thinkingFlushThreshold?: number;
|
|
26
|
+
/** thinking 批量转发间隔(毫秒),默认 3000 */
|
|
27
|
+
thinkingFlushInterval?: number;
|
|
28
|
+
/** content 增量过滤:文本增长多少字符后才转发,默认 30 */
|
|
29
|
+
contentMinDelta?: number;
|
|
30
|
+
};
|
|
20
31
|
}
|
|
21
32
|
/**
|
|
22
33
|
* 创建远程 A2A Agent 的 SubAgentRunner
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/a2a/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,4BAA4B;AAC5B,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAMnE;AAED,gCAAgC;AAChC,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/a2a/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,4BAA4B;AAC5B,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAMnE;AAED,gCAAgC;AAChC,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8BAA8B;IAC9B,WAAW,CAAC,EAAE;QACZ,kCAAkC;QAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,kCAAkC;QAClC,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,sCAAsC;QACtC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,cAAc,CAuGnF"}
|
package/dist/cjs/a2a/runner.js
CHANGED
|
@@ -30,14 +30,47 @@ function extractTextFromMessage(message) {
|
|
|
30
30
|
* - error: 任务失败或网络异常
|
|
31
31
|
*/
|
|
32
32
|
function createA2ARemoteRunner(config) {
|
|
33
|
-
const { agentUrl, name: runnerName, description: runnerDesc, streaming, client, skillId } = config;
|
|
33
|
+
const { agentUrl, name: runnerName, description: runnerDesc, streaming, client, skillId, fallbackToSync = true } = config;
|
|
34
34
|
// 构建请求元数据,包含 skillId 供服务端路由到正确的 specialist
|
|
35
35
|
const metadata = skillId ? { skillId } : undefined;
|
|
36
|
-
//
|
|
36
|
+
// 事件过滤配置
|
|
37
|
+
const filterCfg = {
|
|
38
|
+
thinkingFlushThreshold: config.eventFilter?.thinkingFlushThreshold ?? 100,
|
|
39
|
+
thinkingFlushInterval: config.eventFilter?.thinkingFlushInterval ?? 3000,
|
|
40
|
+
contentMinDelta: config.eventFilter?.contentMinDelta ?? 30,
|
|
41
|
+
};
|
|
42
|
+
// ---- 同步执行(tasks/send,无事件转发)----
|
|
43
|
+
const runSync = async (task) => {
|
|
44
|
+
try {
|
|
45
|
+
const result = await client.sendTask(agentUrl, {
|
|
46
|
+
id: crypto.randomUUID(),
|
|
47
|
+
message: {
|
|
48
|
+
kind: 'message',
|
|
49
|
+
role: 'user',
|
|
50
|
+
messageId: crypto.randomUUID(),
|
|
51
|
+
parts: [{ kind: 'text', text: task }],
|
|
52
|
+
},
|
|
53
|
+
metadata,
|
|
54
|
+
});
|
|
55
|
+
const textParts = result.status?.message?.parts
|
|
56
|
+
?.filter((p) => p.kind === 'text')
|
|
57
|
+
.map(p => p.text) ?? [];
|
|
58
|
+
return textParts.length > 0
|
|
59
|
+
? textParts.join('\n')
|
|
60
|
+
: `[A2A Remote Agent '${runnerName}'] Task ${result.id} completed with state: ${result.status?.state || 'unknown'}`;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.error(`[A2A] '${runnerName}' 同步执行异常: ${err?.message || err}`);
|
|
64
|
+
return `[A2A Remote Agent '${runnerName}'] Error: ${err.message || err}`;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
// ---- 流式执行(tasks/sendSubscribe + 智能事件过滤)----
|
|
37
68
|
const runStreaming = async (task, ctx) => {
|
|
38
69
|
const emit = ctx.emitSubEvent;
|
|
39
70
|
const parentCallId = ctx.currentToolCallId || `a2a_${Date.now()}`;
|
|
40
71
|
const taskId = crypto.randomUUID();
|
|
72
|
+
// 智能事件过滤器状态
|
|
73
|
+
const filterState = createEventFilterState();
|
|
41
74
|
emitStart(emit, parentCallId, runnerName, task);
|
|
42
75
|
try {
|
|
43
76
|
const finalEvent = await client.sendTaskStreaming(agentUrl, {
|
|
@@ -49,7 +82,9 @@ function createA2ARemoteRunner(config) {
|
|
|
49
82
|
parts: [{ kind: 'text', text: task }],
|
|
50
83
|
},
|
|
51
84
|
metadata,
|
|
52
|
-
}, (event) =>
|
|
85
|
+
}, (event) => forwardSSEEventFiltered(emit, parentCallId, runnerName, event, filterState, filterCfg), ctx.abortSignal);
|
|
86
|
+
// 刷出 thinking 缓冲
|
|
87
|
+
flushThinking(emit, parentCallId, runnerName, filterState);
|
|
53
88
|
if (finalEvent?.kind === 'status-update' && finalEvent.status?.state === 'failed') {
|
|
54
89
|
const msg = extractTextFromMessage(finalEvent.status?.message) || 'Remote agent returned error';
|
|
55
90
|
console.error(`[A2A] '${runnerName}' 远程Agent失败: ${msg}`);
|
|
@@ -63,35 +98,15 @@ function createA2ARemoteRunner(config) {
|
|
|
63
98
|
catch (err) {
|
|
64
99
|
const errMsg = err?.message || String(err);
|
|
65
100
|
console.error(`[A2A] '${runnerName}' 流式执行异常: ${errMsg}`);
|
|
101
|
+
// 流式失败,自动回退到同步模式
|
|
102
|
+
if (fallbackToSync) {
|
|
103
|
+
console.log(`[A2A] '${runnerName}' 回退到同步模式`);
|
|
104
|
+
return runSync(task);
|
|
105
|
+
}
|
|
66
106
|
emitError(emit, parentCallId, runnerName, errMsg);
|
|
67
107
|
return `[A2A Remote Agent '${runnerName}'] Error: ${errMsg}`;
|
|
68
108
|
}
|
|
69
109
|
};
|
|
70
|
-
// ---- 同步执行(tasks/send,无事件转发)----
|
|
71
|
-
const runSync = async (task) => {
|
|
72
|
-
try {
|
|
73
|
-
const result = await client.sendTask(agentUrl, {
|
|
74
|
-
id: crypto.randomUUID(),
|
|
75
|
-
message: {
|
|
76
|
-
kind: 'message',
|
|
77
|
-
role: 'user',
|
|
78
|
-
messageId: crypto.randomUUID(),
|
|
79
|
-
parts: [{ kind: 'text', text: task }],
|
|
80
|
-
},
|
|
81
|
-
metadata,
|
|
82
|
-
});
|
|
83
|
-
const textParts = result.status?.message?.parts
|
|
84
|
-
?.filter((p) => p.kind === 'text')
|
|
85
|
-
.map(p => p.text) ?? [];
|
|
86
|
-
return textParts.length > 0
|
|
87
|
-
? textParts.join('\n')
|
|
88
|
-
: `[A2A Remote Agent '${runnerName}'] Task ${result.id} completed with state: ${result.status?.state || 'unknown'}`;
|
|
89
|
-
}
|
|
90
|
-
catch (err) {
|
|
91
|
-
console.error(`[A2A] '${runnerName}' 同步执行异常: ${err?.message || err}`);
|
|
92
|
-
return `[A2A Remote Agent '${runnerName}'] Error: ${err.message || err}`;
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
110
|
return {
|
|
96
111
|
name: runnerName,
|
|
97
112
|
description: runnerDesc,
|
|
@@ -111,46 +126,6 @@ function emitStart(emit, parentCallId, agentName, task) {
|
|
|
111
126
|
data: { agentName, task, source: 'a2a-streaming' },
|
|
112
127
|
});
|
|
113
128
|
}
|
|
114
|
-
/**
|
|
115
|
-
* 透传 A2A 事件为 SubAgent 事件
|
|
116
|
-
*
|
|
117
|
-
* A2A 服务端将 SubAgentEvent 平铺到 metadata(metadata.type 直接为事件类型),
|
|
118
|
-
* 接收端直接还原为与本地 Agent 一致的平铺结构。
|
|
119
|
-
*/
|
|
120
|
-
function forwardSSEEvent(emit, parentCallId, agentName, event) {
|
|
121
|
-
if (event.kind === 'status-update') {
|
|
122
|
-
const meta = event.metadata;
|
|
123
|
-
// 平铺 metadata:type 为实际事件类型,其余字段即为事件 data
|
|
124
|
-
if (meta?.type) {
|
|
125
|
-
const { type, ...rest } = meta;
|
|
126
|
-
emit?.({
|
|
127
|
-
parentToolCallId: parentCallId,
|
|
128
|
-
agentName,
|
|
129
|
-
eventType: type,
|
|
130
|
-
data: rest,
|
|
131
|
-
});
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
// 普通 A2A 事件(无 type metadata)
|
|
135
|
-
const hasMessage = !!event.status?.message;
|
|
136
|
-
emit?.({
|
|
137
|
-
parentToolCallId: parentCallId,
|
|
138
|
-
agentName,
|
|
139
|
-
eventType: hasMessage ? 'content' : 'progress',
|
|
140
|
-
data: {
|
|
141
|
-
...(hasMessage ? { content: extractTextFromMessage(event.status.message) } : {}),
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
else if (event.kind === 'artifact-update') {
|
|
146
|
-
emit?.({
|
|
147
|
-
parentToolCallId: parentCallId,
|
|
148
|
-
agentName,
|
|
149
|
-
eventType: 'artifact',
|
|
150
|
-
data: { artifactId: event.artifact?.artifactId, name: event.artifact?.name },
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
129
|
function emitDone(emit, parentCallId, agentName, contentLength) {
|
|
155
130
|
emit?.({
|
|
156
131
|
parentToolCallId: parentCallId,
|
|
@@ -167,4 +142,118 @@ function emitError(emit, parentCallId, agentName, error) {
|
|
|
167
142
|
data: { error },
|
|
168
143
|
});
|
|
169
144
|
}
|
|
145
|
+
function createEventFilterState() {
|
|
146
|
+
return { lastTextLen: -1, thinkingBuf: '', lastThinkingEmit: 0, forwarded: 0, skipped: 0 };
|
|
147
|
+
}
|
|
148
|
+
/** 刷出累积的 thinking 内容为一个事件 */
|
|
149
|
+
function flushThinking(emit, parentCallId, agentName, state) {
|
|
150
|
+
if (!state.thinkingBuf)
|
|
151
|
+
return;
|
|
152
|
+
emit?.({
|
|
153
|
+
parentToolCallId: parentCallId,
|
|
154
|
+
agentName,
|
|
155
|
+
eventType: 'thinking',
|
|
156
|
+
data: { content: state.thinkingBuf },
|
|
157
|
+
});
|
|
158
|
+
state.thinkingBuf = '';
|
|
159
|
+
state.lastThinkingEmit = Date.now();
|
|
160
|
+
state.forwarded++;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 智能事件过滤转发
|
|
164
|
+
*
|
|
165
|
+
* 将远程 Agent 的 SSE 事件精简为有意义的 UI 事件:
|
|
166
|
+
* - thinking:累积后批量转发(达到字符阈值或时间间隔)
|
|
167
|
+
* - content:仅在文本增长 ≥ contentMinDelta 字符时转发
|
|
168
|
+
* - tool_call / tool_result / start / done / error:始终转发
|
|
169
|
+
* - artifact:始终转发
|
|
170
|
+
* - heartbeat / 空事件:丢弃
|
|
171
|
+
*
|
|
172
|
+
* A2A 服务端将 SubAgentEvent 平铺到 metadata(metadata.type 直接为事件类型),
|
|
173
|
+
* 接收端直接还原为与本地 Agent 一致的平铺结构。
|
|
174
|
+
*/
|
|
175
|
+
function forwardSSEEventFiltered(emit, parentCallId, agentName, event, state, cfg) {
|
|
176
|
+
// artifact-update 始终转发
|
|
177
|
+
if (event.kind === 'artifact-update') {
|
|
178
|
+
emit?.({
|
|
179
|
+
parentToolCallId: parentCallId,
|
|
180
|
+
agentName,
|
|
181
|
+
eventType: 'artifact',
|
|
182
|
+
data: { artifactId: event.artifact?.artifactId, name: event.artifact?.name },
|
|
183
|
+
});
|
|
184
|
+
state.forwarded++;
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (event.kind !== 'status-update')
|
|
188
|
+
return;
|
|
189
|
+
const eventState = event.status?.state;
|
|
190
|
+
const messageText = extractTextFromMessage(event.status?.message);
|
|
191
|
+
const meta = event.metadata;
|
|
192
|
+
// 终态:completed / failed — 始终转发,并刷出 thinking 缓冲
|
|
193
|
+
if (eventState === 'completed' || eventState === 'failed') {
|
|
194
|
+
flushThinking(emit, parentCallId, agentName, state);
|
|
195
|
+
return; // done/error 由 runStreaming 的 finalEvent 处理
|
|
196
|
+
}
|
|
197
|
+
// 非 working 状态丢弃
|
|
198
|
+
if (eventState !== 'working') {
|
|
199
|
+
state.skipped++;
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// 解包 metadata:type 为实际事件类型
|
|
203
|
+
const metaType = meta?.type;
|
|
204
|
+
let eventData = {};
|
|
205
|
+
let effectiveText = messageText;
|
|
206
|
+
if (metaType) {
|
|
207
|
+
const { type: _t, ...rest } = meta;
|
|
208
|
+
eventData = rest;
|
|
209
|
+
if (metaType === 'content' && rest.content) {
|
|
210
|
+
effectiveText = rest.content;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// 1. 始终转发:start / done / error / tool_call / tool_result
|
|
214
|
+
if (metaType === 'start' || metaType === 'done' || metaType === 'error'
|
|
215
|
+
|| metaType === 'tool_call' || metaType === 'tool_result') {
|
|
216
|
+
if (metaType === 'tool_call')
|
|
217
|
+
flushThinking(emit, parentCallId, agentName, state);
|
|
218
|
+
emit?.({
|
|
219
|
+
parentToolCallId: parentCallId,
|
|
220
|
+
agentName,
|
|
221
|
+
eventType: metaType,
|
|
222
|
+
data: eventData,
|
|
223
|
+
});
|
|
224
|
+
state.forwarded++;
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
// 2. Thinking:累积后批量转发
|
|
228
|
+
if (metaType === 'thinking') {
|
|
229
|
+
state.thinkingBuf += (eventData.content || '');
|
|
230
|
+
const now = Date.now();
|
|
231
|
+
if (state.thinkingBuf.length >= cfg.thinkingFlushThreshold
|
|
232
|
+
|| (state.thinkingBuf.length > 0 && now - state.lastThinkingEmit >= cfg.thinkingFlushInterval)) {
|
|
233
|
+
flushThinking(emit, parentCallId, agentName, state);
|
|
234
|
+
}
|
|
235
|
+
state.skipped++;
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
// 3. Content:累积式文本更新,仅在显著增长时转发
|
|
239
|
+
if (metaType === 'content' || (!metaType && messageText)) {
|
|
240
|
+
const textLen = (effectiveText || '').length;
|
|
241
|
+
if (textLen > 0 && (state.lastTextLen < 0 || textLen - state.lastTextLen >= cfg.contentMinDelta)) {
|
|
242
|
+
emit?.({
|
|
243
|
+
parentToolCallId: parentCallId,
|
|
244
|
+
agentName,
|
|
245
|
+
eventType: 'content',
|
|
246
|
+
data: { content: effectiveText },
|
|
247
|
+
});
|
|
248
|
+
state.lastTextLen = textLen;
|
|
249
|
+
state.forwarded++;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
state.skipped++;
|
|
253
|
+
}
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// 4. 其余事件(heartbeat / 纯时间戳更新 / 未知类型)→ 丢弃
|
|
257
|
+
state.skipped++;
|
|
258
|
+
}
|
|
170
259
|
//# sourceMappingURL=runner.js.map
|