@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.
Files changed (122) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/a2a/client.d.ts +32 -2
  3. package/dist/cjs/a2a/client.d.ts.map +1 -1
  4. package/dist/cjs/a2a/client.js +59 -10
  5. package/dist/cjs/a2a/client.js.map +1 -1
  6. package/dist/cjs/a2a/index.d.ts +4 -1
  7. package/dist/cjs/a2a/index.d.ts.map +1 -1
  8. package/dist/cjs/a2a/index.js +8 -1
  9. package/dist/cjs/a2a/index.js.map +1 -1
  10. package/dist/cjs/a2a/runner.d.ts +11 -0
  11. package/dist/cjs/a2a/runner.d.ts.map +1 -1
  12. package/dist/cjs/a2a/runner.js +157 -68
  13. package/dist/cjs/a2a/runner.js.map +1 -1
  14. package/dist/cjs/a2a/server.d.ts +50 -0
  15. package/dist/cjs/a2a/server.d.ts.map +1 -0
  16. package/dist/cjs/a2a/server.js +173 -0
  17. package/dist/cjs/a2a/server.js.map +1 -0
  18. package/dist/cjs/agent/history-manager.d.ts +8 -2
  19. package/dist/cjs/agent/history-manager.d.ts.map +1 -1
  20. package/dist/cjs/agent/history-manager.js +6 -6
  21. package/dist/cjs/agent/history-manager.js.map +1 -1
  22. package/dist/cjs/agent/runtime-builder.d.ts +83 -0
  23. package/dist/cjs/agent/runtime-builder.d.ts.map +1 -0
  24. package/dist/cjs/agent/runtime-builder.js +127 -0
  25. package/dist/cjs/agent/runtime-builder.js.map +1 -0
  26. package/dist/cjs/agent/types.d.ts +17 -0
  27. package/dist/cjs/agent/types.d.ts.map +1 -1
  28. package/dist/cjs/agent/types.js +43 -0
  29. package/dist/cjs/agent/types.js.map +1 -1
  30. package/dist/cjs/index.d.ts +13 -5
  31. package/dist/cjs/index.d.ts.map +1 -1
  32. package/dist/cjs/index.js +30 -6
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/cjs/memory/types.d.ts +48 -0
  35. package/dist/cjs/memory/types.d.ts.map +1 -1
  36. package/dist/cjs/memory/types.js +52 -0
  37. package/dist/cjs/memory/types.js.map +1 -1
  38. package/dist/cjs/runtime/run-controller.d.ts +40 -0
  39. package/dist/cjs/runtime/run-controller.d.ts.map +1 -0
  40. package/dist/cjs/runtime/run-controller.js +93 -0
  41. package/dist/cjs/runtime/run-controller.js.map +1 -0
  42. package/dist/cjs/sandbox/local-sandbox.d.ts +59 -0
  43. package/dist/cjs/sandbox/local-sandbox.d.ts.map +1 -0
  44. package/dist/cjs/sandbox/local-sandbox.js +228 -0
  45. package/dist/cjs/sandbox/local-sandbox.js.map +1 -0
  46. package/dist/cjs/security/guard.d.ts +11 -0
  47. package/dist/cjs/security/guard.d.ts.map +1 -1
  48. package/dist/cjs/security/guard.js +46 -0
  49. package/dist/cjs/security/guard.js.map +1 -1
  50. package/dist/cjs/tool/builtin-tools.d.ts +22 -0
  51. package/dist/cjs/tool/builtin-tools.d.ts.map +1 -0
  52. package/dist/cjs/tool/builtin-tools.js +221 -0
  53. package/dist/cjs/tool/builtin-tools.js.map +1 -0
  54. package/dist/cjs/tool/registry.d.ts +76 -1
  55. package/dist/cjs/tool/registry.d.ts.map +1 -1
  56. package/dist/cjs/tool/registry.js +81 -0
  57. package/dist/cjs/tool/registry.js.map +1 -1
  58. package/dist/cjs/utils/event-adapter.d.ts +25 -0
  59. package/dist/cjs/utils/event-adapter.d.ts.map +1 -0
  60. package/dist/cjs/utils/event-adapter.js +93 -0
  61. package/dist/cjs/utils/event-adapter.js.map +1 -0
  62. package/dist/esm/a2a/client.d.ts +32 -2
  63. package/dist/esm/a2a/client.d.ts.map +1 -1
  64. package/dist/esm/a2a/client.js +58 -10
  65. package/dist/esm/a2a/client.js.map +1 -1
  66. package/dist/esm/a2a/index.d.ts +4 -1
  67. package/dist/esm/a2a/index.d.ts.map +1 -1
  68. package/dist/esm/a2a/index.js +2 -1
  69. package/dist/esm/a2a/index.js.map +1 -1
  70. package/dist/esm/a2a/runner.d.ts +11 -0
  71. package/dist/esm/a2a/runner.d.ts.map +1 -1
  72. package/dist/esm/a2a/runner.js +157 -68
  73. package/dist/esm/a2a/runner.js.map +1 -1
  74. package/dist/esm/a2a/server.d.ts +50 -0
  75. package/dist/esm/a2a/server.d.ts.map +1 -0
  76. package/dist/esm/a2a/server.js +165 -0
  77. package/dist/esm/a2a/server.js.map +1 -0
  78. package/dist/esm/agent/history-manager.d.ts +8 -2
  79. package/dist/esm/agent/history-manager.d.ts.map +1 -1
  80. package/dist/esm/agent/history-manager.js +6 -6
  81. package/dist/esm/agent/history-manager.js.map +1 -1
  82. package/dist/esm/agent/runtime-builder.d.ts +83 -0
  83. package/dist/esm/agent/runtime-builder.d.ts.map +1 -0
  84. package/dist/esm/agent/runtime-builder.js +120 -0
  85. package/dist/esm/agent/runtime-builder.js.map +1 -0
  86. package/dist/esm/agent/types.d.ts +17 -0
  87. package/dist/esm/agent/types.d.ts.map +1 -1
  88. package/dist/esm/agent/types.js +42 -1
  89. package/dist/esm/agent/types.js.map +1 -1
  90. package/dist/esm/index.d.ts +13 -5
  91. package/dist/esm/index.d.ts.map +1 -1
  92. package/dist/esm/index.js +6 -1
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/memory/types.d.ts +48 -0
  95. package/dist/esm/memory/types.d.ts.map +1 -1
  96. package/dist/esm/memory/types.js +50 -1
  97. package/dist/esm/memory/types.js.map +1 -1
  98. package/dist/esm/runtime/run-controller.d.ts +40 -0
  99. package/dist/esm/runtime/run-controller.d.ts.map +1 -0
  100. package/dist/esm/runtime/run-controller.js +89 -0
  101. package/dist/esm/runtime/run-controller.js.map +1 -0
  102. package/dist/esm/sandbox/local-sandbox.d.ts +59 -0
  103. package/dist/esm/sandbox/local-sandbox.d.ts.map +1 -0
  104. package/dist/esm/sandbox/local-sandbox.js +188 -0
  105. package/dist/esm/sandbox/local-sandbox.js.map +1 -0
  106. package/dist/esm/security/guard.d.ts +11 -0
  107. package/dist/esm/security/guard.d.ts.map +1 -1
  108. package/dist/esm/security/guard.js +46 -0
  109. package/dist/esm/security/guard.js.map +1 -1
  110. package/dist/esm/tool/builtin-tools.d.ts +22 -0
  111. package/dist/esm/tool/builtin-tools.d.ts.map +1 -0
  112. package/dist/esm/tool/builtin-tools.js +214 -0
  113. package/dist/esm/tool/builtin-tools.js.map +1 -0
  114. package/dist/esm/tool/registry.d.ts +76 -1
  115. package/dist/esm/tool/registry.d.ts.map +1 -1
  116. package/dist/esm/tool/registry.js +81 -0
  117. package/dist/esm/tool/registry.js.map +1 -1
  118. package/dist/esm/utils/event-adapter.d.ts +25 -0
  119. package/dist/esm/utils/event-adapter.d.ts.map +1 -0
  120. package/dist/esm/utils/event-adapter.js +87 -0
  121. package/dist/esm/utils/event-adapter.js.map +1 -0
  122. 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
 
@@ -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
- /** 带超时的 reader.read()(每次读取单独计时,收到数据即重置) */
46
- private readWithTimeout;
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;CAClC;AAED;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAyB;gBAE5B,OAAO,GAAE,gBAAqB;IAQ1C;;;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;;;;OAIG;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;IA0E/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,2CAA2C;YAC7B,eAAe;IAgB7B,iBAAiB;YACH,gBAAgB;CAS/B"}
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"}
@@ -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: abortSignal,
110
+ signal: connectAbort.signal,
76
111
  });
77
112
  }
78
113
  catch (fetchErr) {
79
114
  if (abortSignal?.aborted)
80
115
  return null;
81
- throw new Error(`A2A streaming network error: ${fetchErr?.message || fetchErr} (url=${agentUrl})`);
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.readWithTimeout(reader);
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
- reader.releaseLock();
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
- /** 带超时的 reader.read()(每次读取单独计时,收到数据即重置) */
186
- async readWithTimeout(reader) {
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 read timeout: no data for ${this.timeout}ms`));
191
- }, this.timeout);
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":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/a2a/client.ts"],"names":[],"mappings":"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"}
@@ -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;AAExC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,qBAAqB,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"}
@@ -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,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAElB,yCAA4E;AAAnE,kHAAA,qBAAqB,OAAA;AAAE,mHAAA,sBAAsB,OAAA"}
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"}
@@ -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;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,cAAc,CAoFnF"}
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"}
@@ -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
- // ---- 流式执行(tasks/sendSubscribe + 事件转发)----
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) => forwardSSEEvent(emit, parentCallId, runnerName, event), ctx.abortSignal);
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