@cicctencent/agent-core 0.1.20 → 0.1.21

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 (153) hide show
  1. package/dist/cjs/a2a/index.d.ts +4 -0
  2. package/dist/cjs/a2a/index.d.ts.map +1 -1
  3. package/dist/cjs/a2a/index.js +6 -1
  4. package/dist/cjs/a2a/index.js.map +1 -1
  5. package/dist/cjs/a2a/rest-client.d.ts +111 -0
  6. package/dist/cjs/a2a/rest-client.d.ts.map +1 -0
  7. package/dist/cjs/a2a/rest-client.js +254 -0
  8. package/dist/cjs/a2a/rest-client.js.map +1 -0
  9. package/dist/cjs/a2a/rest-runner.d.ts +41 -0
  10. package/dist/cjs/a2a/rest-runner.d.ts.map +1 -0
  11. package/dist/cjs/a2a/rest-runner.js +188 -0
  12. package/dist/cjs/a2a/rest-runner.js.map +1 -0
  13. package/dist/cjs/agent/engine.d.ts +17 -0
  14. package/dist/cjs/agent/engine.d.ts.map +1 -1
  15. package/dist/cjs/agent/engine.js +208 -13
  16. package/dist/cjs/agent/engine.js.map +1 -1
  17. package/dist/cjs/agent/llm-caller.d.ts +12 -1
  18. package/dist/cjs/agent/llm-caller.d.ts.map +1 -1
  19. package/dist/cjs/agent/llm-caller.js +101 -32
  20. package/dist/cjs/agent/llm-caller.js.map +1 -1
  21. package/dist/cjs/agent/types.d.ts +1 -1
  22. package/dist/cjs/agent/types.d.ts.map +1 -1
  23. package/dist/cjs/index.d.ts +3 -0
  24. package/dist/cjs/index.d.ts.map +1 -1
  25. package/dist/cjs/index.js +8 -1
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/kb/in-memory-kb.d.ts.map +1 -1
  28. package/dist/cjs/kb/in-memory-kb.js +2 -1
  29. package/dist/cjs/kb/in-memory-kb.js.map +1 -1
  30. package/dist/cjs/llm/anthropic-provider.d.ts.map +1 -1
  31. package/dist/cjs/llm/anthropic-provider.js +1 -0
  32. package/dist/cjs/llm/anthropic-provider.js.map +1 -1
  33. package/dist/cjs/llm/ollama-provider.d.ts.map +1 -1
  34. package/dist/cjs/llm/ollama-provider.js +1 -0
  35. package/dist/cjs/llm/ollama-provider.js.map +1 -1
  36. package/dist/cjs/llm/openai-provider.d.ts.map +1 -1
  37. package/dist/cjs/llm/openai-provider.js +17 -12
  38. package/dist/cjs/llm/openai-provider.js.map +1 -1
  39. package/dist/cjs/llm/types.d.ts +4 -0
  40. package/dist/cjs/llm/types.d.ts.map +1 -1
  41. package/dist/cjs/llm/types.js.map +1 -1
  42. package/dist/cjs/memory/checkpoint.d.ts.map +1 -1
  43. package/dist/cjs/memory/checkpoint.js +3 -2
  44. package/dist/cjs/memory/checkpoint.js.map +1 -1
  45. package/dist/cjs/memory/extractor.d.ts +7 -0
  46. package/dist/cjs/memory/extractor.d.ts.map +1 -1
  47. package/dist/cjs/memory/extractor.js +18 -1
  48. package/dist/cjs/memory/extractor.js.map +1 -1
  49. package/dist/cjs/memory/persona.d.ts +4 -0
  50. package/dist/cjs/memory/persona.d.ts.map +1 -1
  51. package/dist/cjs/memory/persona.js +15 -1
  52. package/dist/cjs/memory/persona.js.map +1 -1
  53. package/dist/cjs/memory/pipeline.d.ts +3 -0
  54. package/dist/cjs/memory/pipeline.d.ts.map +1 -1
  55. package/dist/cjs/memory/pipeline.js +7 -4
  56. package/dist/cjs/memory/pipeline.js.map +1 -1
  57. package/dist/cjs/memory/scene.d.ts +4 -0
  58. package/dist/cjs/memory/scene.d.ts.map +1 -1
  59. package/dist/cjs/memory/scene.js +15 -1
  60. package/dist/cjs/memory/scene.js.map +1 -1
  61. package/dist/cjs/middleware/audit-log.d.ts.map +1 -1
  62. package/dist/cjs/middleware/audit-log.js +3 -2
  63. package/dist/cjs/middleware/audit-log.js.map +1 -1
  64. package/dist/cjs/store/file-tool-result-store.d.ts.map +1 -1
  65. package/dist/cjs/store/file-tool-result-store.js +2 -1
  66. package/dist/cjs/store/file-tool-result-store.js.map +1 -1
  67. package/dist/cjs/store/json-store.d.ts +5 -1
  68. package/dist/cjs/store/json-store.d.ts.map +1 -1
  69. package/dist/cjs/store/json-store.js +5 -1
  70. package/dist/cjs/store/json-store.js.map +1 -1
  71. package/dist/cjs/tool/delegate.js +1 -1
  72. package/dist/cjs/tool/delegate.js.map +1 -1
  73. package/dist/cjs/utils/date.d.ts +36 -0
  74. package/dist/cjs/utils/date.d.ts.map +1 -0
  75. package/dist/cjs/utils/date.js +52 -0
  76. package/dist/cjs/utils/date.js.map +1 -0
  77. package/dist/esm/a2a/index.d.ts +4 -0
  78. package/dist/esm/a2a/index.d.ts.map +1 -1
  79. package/dist/esm/a2a/index.js +3 -0
  80. package/dist/esm/a2a/index.js.map +1 -1
  81. package/dist/esm/a2a/rest-client.d.ts +111 -0
  82. package/dist/esm/a2a/rest-client.d.ts.map +1 -0
  83. package/dist/esm/a2a/rest-client.js +250 -0
  84. package/dist/esm/a2a/rest-client.js.map +1 -0
  85. package/dist/esm/a2a/rest-runner.d.ts +41 -0
  86. package/dist/esm/a2a/rest-runner.d.ts.map +1 -0
  87. package/dist/esm/a2a/rest-runner.js +185 -0
  88. package/dist/esm/a2a/rest-runner.js.map +1 -0
  89. package/dist/esm/agent/engine.d.ts +17 -0
  90. package/dist/esm/agent/engine.d.ts.map +1 -1
  91. package/dist/esm/agent/engine.js +208 -13
  92. package/dist/esm/agent/engine.js.map +1 -1
  93. package/dist/esm/agent/llm-caller.d.ts +12 -1
  94. package/dist/esm/agent/llm-caller.d.ts.map +1 -1
  95. package/dist/esm/agent/llm-caller.js +101 -32
  96. package/dist/esm/agent/llm-caller.js.map +1 -1
  97. package/dist/esm/agent/types.d.ts +1 -1
  98. package/dist/esm/agent/types.d.ts.map +1 -1
  99. package/dist/esm/index.d.ts +3 -0
  100. package/dist/esm/index.d.ts.map +1 -1
  101. package/dist/esm/index.js +3 -0
  102. package/dist/esm/index.js.map +1 -1
  103. package/dist/esm/kb/in-memory-kb.d.ts.map +1 -1
  104. package/dist/esm/kb/in-memory-kb.js +2 -1
  105. package/dist/esm/kb/in-memory-kb.js.map +1 -1
  106. package/dist/esm/llm/anthropic-provider.d.ts.map +1 -1
  107. package/dist/esm/llm/anthropic-provider.js +1 -0
  108. package/dist/esm/llm/anthropic-provider.js.map +1 -1
  109. package/dist/esm/llm/ollama-provider.d.ts.map +1 -1
  110. package/dist/esm/llm/ollama-provider.js +1 -0
  111. package/dist/esm/llm/ollama-provider.js.map +1 -1
  112. package/dist/esm/llm/openai-provider.d.ts.map +1 -1
  113. package/dist/esm/llm/openai-provider.js +17 -12
  114. package/dist/esm/llm/openai-provider.js.map +1 -1
  115. package/dist/esm/llm/types.d.ts +4 -0
  116. package/dist/esm/llm/types.d.ts.map +1 -1
  117. package/dist/esm/llm/types.js.map +1 -1
  118. package/dist/esm/memory/checkpoint.d.ts.map +1 -1
  119. package/dist/esm/memory/checkpoint.js +3 -2
  120. package/dist/esm/memory/checkpoint.js.map +1 -1
  121. package/dist/esm/memory/extractor.d.ts +7 -0
  122. package/dist/esm/memory/extractor.d.ts.map +1 -1
  123. package/dist/esm/memory/extractor.js +18 -1
  124. package/dist/esm/memory/extractor.js.map +1 -1
  125. package/dist/esm/memory/persona.d.ts +4 -0
  126. package/dist/esm/memory/persona.d.ts.map +1 -1
  127. package/dist/esm/memory/persona.js +15 -1
  128. package/dist/esm/memory/persona.js.map +1 -1
  129. package/dist/esm/memory/pipeline.d.ts +3 -0
  130. package/dist/esm/memory/pipeline.d.ts.map +1 -1
  131. package/dist/esm/memory/pipeline.js +7 -4
  132. package/dist/esm/memory/pipeline.js.map +1 -1
  133. package/dist/esm/memory/scene.d.ts +4 -0
  134. package/dist/esm/memory/scene.d.ts.map +1 -1
  135. package/dist/esm/memory/scene.js +15 -1
  136. package/dist/esm/memory/scene.js.map +1 -1
  137. package/dist/esm/middleware/audit-log.d.ts.map +1 -1
  138. package/dist/esm/middleware/audit-log.js +3 -2
  139. package/dist/esm/middleware/audit-log.js.map +1 -1
  140. package/dist/esm/store/file-tool-result-store.d.ts.map +1 -1
  141. package/dist/esm/store/file-tool-result-store.js +2 -1
  142. package/dist/esm/store/file-tool-result-store.js.map +1 -1
  143. package/dist/esm/store/json-store.d.ts +5 -1
  144. package/dist/esm/store/json-store.d.ts.map +1 -1
  145. package/dist/esm/store/json-store.js +5 -1
  146. package/dist/esm/store/json-store.js.map +1 -1
  147. package/dist/esm/tool/delegate.js +1 -1
  148. package/dist/esm/tool/delegate.js.map +1 -1
  149. package/dist/esm/utils/date.d.ts +36 -0
  150. package/dist/esm/utils/date.d.ts.map +1 -0
  151. package/dist/esm/utils/date.js +48 -0
  152. package/dist/esm/utils/date.js.map +1 -0
  153. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ import { type AuthConfig } from './client.js';
2
+ /** REST 风格 A2A Capability Card */
3
+ export interface RestCapabilityCard {
4
+ capability_id: string;
5
+ capability_name?: string;
6
+ description?: string;
7
+ input_schema?: Record<string, unknown>;
8
+ output_schema?: Record<string, unknown>;
9
+ [key: string]: unknown;
10
+ }
11
+ /** REST 风格 A2A 能力执行结果 */
12
+ export interface RestCapabilityResult {
13
+ capability_id: string;
14
+ capability_name?: string;
15
+ status: string;
16
+ result?: {
17
+ summary?: string;
18
+ strengths?: string[];
19
+ weaknesses?: string[];
20
+ risks?: string[];
21
+ analysis_findings?: string[];
22
+ final_text?: string;
23
+ [key: string]: unknown;
24
+ };
25
+ task_id?: string;
26
+ error?: string;
27
+ [key: string]: unknown;
28
+ }
29
+ /** REST 风格 A2A SSE 事件 */
30
+ export interface RestSSEEvent {
31
+ /** 事件类型:status / stage / tool_call / tool_result / message_chunk / result / error */
32
+ event: string;
33
+ /** 事件数据(已解析的 JSON 对象) */
34
+ data: Record<string, unknown>;
35
+ }
36
+ /** REST 风格 A2A 异步任务状态 */
37
+ export interface RestTaskStatus {
38
+ task_id: string;
39
+ capability_id?: string;
40
+ capability_name?: string;
41
+ status: string;
42
+ caller_agent_id?: string;
43
+ created_at?: string;
44
+ updated_at?: string;
45
+ error_code?: string | null;
46
+ result?: RestCapabilityResult['result'];
47
+ [key: string]: unknown;
48
+ }
49
+ export interface RestA2AClientOptions {
50
+ /** 请求超时(毫秒),默认 300000(5分钟) */
51
+ timeout?: number;
52
+ /** SSE 连接超时(毫秒),默认 30000(30秒) */
53
+ connectTimeout?: number;
54
+ /** SSE 逐 chunk 读取超时(毫秒),默认 60000 */
55
+ chunkTimeout?: number;
56
+ /** 自定义 fetch 实现(默认使用 globalThis.fetch) */
57
+ fetch?: typeof fetch;
58
+ /** 自定义请求头 */
59
+ headers?: Record<string, string>;
60
+ /** 认证配置 */
61
+ auth?: AuthConfig;
62
+ }
63
+ /**
64
+ * REST 风格 A2A 协议客户端
65
+ *
66
+ * 用法:
67
+ * const client = new RestA2AClient({ auth: { type: 'custom', name: 'X-Service-Token', value: 'xxx' } });
68
+ * const card = await client.discoverCapability('http://localhost:8000', 'competitive_review');
69
+ * const result = await client.invoke('http://localhost:8000', 'competitive_review', { ... });
70
+ */
71
+ export declare class RestA2AClient {
72
+ private timeout;
73
+ private connectTimeout;
74
+ private chunkTimeout;
75
+ private fetchFn;
76
+ private headers;
77
+ constructor(options?: RestA2AClientOptions);
78
+ /** 获取 Capability Card:GET /api/v1/a2a/capabilities/{capabilityId} */
79
+ discoverCapability(baseUrl: string, capabilityId: string): Promise<RestCapabilityCard>;
80
+ /** 同步调用:POST /api/v1/a2a/capabilities/{capabilityId}:invoke */
81
+ invoke(baseUrl: string, capabilityId: string, input: Record<string, unknown>): Promise<RestCapabilityResult>;
82
+ /**
83
+ * 流式调用:POST /api/v1/a2a/capabilities/{capabilityId}:stream (SSE)
84
+ *
85
+ * SSE 事件格式(标准 text/event-stream):
86
+ * event: status data: {"status":"running","trace_id":"..."}
87
+ * event: stage data: {"stage":"loading_skill",...}
88
+ * event: tool_call data: {"tool_name":"...","args":{...}}
89
+ * event: tool_result data: {"tool_name":"..."}
90
+ * event: message_chunk data: {"content":"..."}
91
+ * event: result data: {"capability_id":"...","status":"completed","result":{...}}
92
+ * event: error data: {"error":"..."}
93
+ *
94
+ * @returns 最后一个 result 事件的数据,或 null(流中断且无 result)
95
+ */
96
+ invokeStreaming(baseUrl: string, capabilityId: string, input: Record<string, unknown>, onEvent?: (event: RestSSEEvent) => void, abortSignal?: AbortSignal): Promise<RestCapabilityResult | null>;
97
+ /** 异步提交:POST /api/v1/a2a/capabilities/{capabilityId}:submit */
98
+ submit(baseUrl: string, capabilityId: string, input: Record<string, unknown>): Promise<{
99
+ task_id: string;
100
+ [key: string]: unknown;
101
+ }>;
102
+ /** 查询任务状态:GET /api/v1/a2a/tasks/{taskId} */
103
+ getTask(baseUrl: string, taskId: string): Promise<RestTaskStatus>;
104
+ /** 构建 Capability URL */
105
+ private buildCapabilityUrl;
106
+ /** 带 chunkTimeout 的 reader.read() */
107
+ private readChunkWithTimeout;
108
+ /** 带超时的 fetch */
109
+ private fetchWithTimeout;
110
+ }
111
+ //# sourceMappingURL=rest-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-client.d.ts","sourceRoot":"","sources":["../../../src/a2a/rest-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,250 @@
1
+ // ============================================================
2
+ // RestA2AClient — REST 风格 A2A 协议客户端
3
+ // 适用于非标准 JSON-RPC 的 A2A 实现(如 capability invoke/stream 风格)
4
+ // 协议特征:
5
+ // 发现:GET /api/v1/a2a/capabilities/{capabilityId}
6
+ // 同步:POST /api/v1/a2a/capabilities/{capabilityId}:invoke
7
+ // 流式:POST /api/v1/a2a/capabilities/{capabilityId}:stream (SSE)
8
+ // 异步:POST /api/v1/a2a/capabilities/{capabilityId}:submit
9
+ // 查询:GET /api/v1/a2a/tasks/{taskId}
10
+ // 认证:X-Service-Token 请求头
11
+ // ============================================================
12
+ import { buildAuthHeaders } from "./client.js";
13
+ // ---- RestA2AClient ----
14
+ /**
15
+ * REST 风格 A2A 协议客户端
16
+ *
17
+ * 用法:
18
+ * const client = new RestA2AClient({ auth: { type: 'custom', name: 'X-Service-Token', value: 'xxx' } });
19
+ * const card = await client.discoverCapability('http://localhost:8000', 'competitive_review');
20
+ * const result = await client.invoke('http://localhost:8000', 'competitive_review', { ... });
21
+ */
22
+ export class RestA2AClient {
23
+ timeout;
24
+ connectTimeout;
25
+ chunkTimeout;
26
+ fetchFn;
27
+ headers;
28
+ constructor(options = {}) {
29
+ this.timeout = options.timeout ?? 300_000;
30
+ this.connectTimeout = options.connectTimeout ?? 30_000;
31
+ this.chunkTimeout = options.chunkTimeout ?? 60_000;
32
+ this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);
33
+ this.headers = { ...buildAuthHeaders(options.auth), ...(options.headers ?? {}) };
34
+ }
35
+ // ---- Capability 发现 ----
36
+ /** 获取 Capability Card:GET /api/v1/a2a/capabilities/{capabilityId} */
37
+ async discoverCapability(baseUrl, capabilityId) {
38
+ const url = this.buildCapabilityUrl(baseUrl, capabilityId);
39
+ const res = await this.fetchWithTimeout(url, { method: 'GET' });
40
+ if (!res.ok) {
41
+ throw new Error(`REST A2A discover failed: HTTP ${res.status} from ${url}`);
42
+ }
43
+ return (await res.json());
44
+ }
45
+ // ---- 同步调用 ----
46
+ /** 同步调用:POST /api/v1/a2a/capabilities/{capabilityId}:invoke */
47
+ async invoke(baseUrl, capabilityId, input) {
48
+ const url = this.buildCapabilityUrl(baseUrl, capabilityId, 'invoke');
49
+ const res = await this.fetchWithTimeout(url, {
50
+ method: 'POST',
51
+ headers: { 'Content-Type': 'application/json', ...this.headers },
52
+ body: JSON.stringify(input),
53
+ });
54
+ if (!res.ok) {
55
+ let bodyText = '';
56
+ try {
57
+ bodyText = await res.text();
58
+ }
59
+ catch { /* ignore */ }
60
+ throw new Error(`REST A2A invoke failed: HTTP ${res.status} from ${url}: ${bodyText.slice(0, 200)}`);
61
+ }
62
+ return (await res.json());
63
+ }
64
+ // ---- 流式调用 ----
65
+ /**
66
+ * 流式调用:POST /api/v1/a2a/capabilities/{capabilityId}:stream (SSE)
67
+ *
68
+ * SSE 事件格式(标准 text/event-stream):
69
+ * event: status data: {"status":"running","trace_id":"..."}
70
+ * event: stage data: {"stage":"loading_skill",...}
71
+ * event: tool_call data: {"tool_name":"...","args":{...}}
72
+ * event: tool_result data: {"tool_name":"..."}
73
+ * event: message_chunk data: {"content":"..."}
74
+ * event: result data: {"capability_id":"...","status":"completed","result":{...}}
75
+ * event: error data: {"error":"..."}
76
+ *
77
+ * @returns 最后一个 result 事件的数据,或 null(流中断且无 result)
78
+ */
79
+ async invokeStreaming(baseUrl, capabilityId, input, onEvent, abortSignal) {
80
+ const url = this.buildCapabilityUrl(baseUrl, capabilityId, 'stream');
81
+ // 连接阶段:独立 AbortController + connectTimeout + 外部 signal 联动
82
+ const connectAbort = new AbortController();
83
+ const connectTimer = setTimeout(() => connectAbort.abort(), this.connectTimeout);
84
+ if (abortSignal) {
85
+ if (abortSignal.aborted) {
86
+ connectAbort.abort();
87
+ }
88
+ else {
89
+ abortSignal.addEventListener('abort', () => connectAbort.abort(), { once: true });
90
+ }
91
+ }
92
+ let res;
93
+ try {
94
+ res = await this.fetchFn(url, {
95
+ method: 'POST',
96
+ headers: { 'Content-Type': 'application/json', ...this.headers },
97
+ body: JSON.stringify(input),
98
+ signal: connectAbort.signal,
99
+ });
100
+ }
101
+ catch (fetchErr) {
102
+ if (abortSignal?.aborted)
103
+ return null;
104
+ if (fetchErr?.name === 'AbortError') {
105
+ throw new Error(`REST A2A streaming connect timeout (${this.connectTimeout}ms) → ${url}`);
106
+ }
107
+ throw new Error(`REST A2A streaming connect error → ${url}: ${fetchErr?.message || fetchErr}`);
108
+ }
109
+ finally {
110
+ clearTimeout(connectTimer);
111
+ }
112
+ if (!res.ok) {
113
+ let bodyText = '';
114
+ try {
115
+ bodyText = await res.text();
116
+ }
117
+ catch { /* ignore */ }
118
+ console.error(`[REST-A2A-Client] HTTP ${res.status} from ${url}: ${bodyText.slice(0, 200)}`);
119
+ throw new Error(`REST A2A streaming failed: HTTP ${res.status} from ${url}`);
120
+ }
121
+ const body = res.body;
122
+ if (!body)
123
+ throw new Error('REST A2A streaming: empty response body');
124
+ let lastResult = null;
125
+ const reader = body.getReader();
126
+ const decoder = new TextDecoder();
127
+ let buffer = '';
128
+ let currentEvent = '';
129
+ try {
130
+ while (true) {
131
+ if (abortSignal?.aborted)
132
+ break;
133
+ const { done, value } = await this.readChunkWithTimeout(reader);
134
+ if (done)
135
+ break;
136
+ buffer += decoder.decode(value, { stream: true });
137
+ const lines = buffer.split('\n');
138
+ buffer = lines.pop() || '';
139
+ for (const line of lines) {
140
+ const trimmed = line.trim();
141
+ if (!trimmed || trimmed.startsWith(':'))
142
+ continue;
143
+ if (trimmed.startsWith('event:')) {
144
+ currentEvent = trimmed.slice(6).trim();
145
+ }
146
+ else if (trimmed.startsWith('data:')) {
147
+ const jsonStr = trimmed.slice(5).trim();
148
+ if (!jsonStr || jsonStr === '[DONE]') {
149
+ currentEvent = '';
150
+ continue;
151
+ }
152
+ try {
153
+ const data = JSON.parse(jsonStr);
154
+ const sseEvent = { event: currentEvent || 'message', data };
155
+ onEvent?.(sseEvent);
156
+ // 捕获最终结果
157
+ if (sseEvent.event === 'result') {
158
+ lastResult = data;
159
+ }
160
+ else if (sseEvent.event === 'error') {
161
+ lastResult = {
162
+ capability_id: capabilityId,
163
+ status: 'failed',
164
+ error: data.error || JSON.stringify(data),
165
+ };
166
+ }
167
+ }
168
+ catch { /* skip non-JSON */ }
169
+ currentEvent = '';
170
+ }
171
+ }
172
+ }
173
+ }
174
+ catch (streamErr) {
175
+ // 流异常时保留已接收结果(优雅降级)
176
+ if (abortSignal?.aborted)
177
+ return lastResult;
178
+ if (lastResult) {
179
+ console.warn(`[REST-A2A-Client] SSE stream error but have result, returning partial: ${streamErr?.message}`);
180
+ return lastResult;
181
+ }
182
+ throw streamErr;
183
+ }
184
+ finally {
185
+ try {
186
+ reader.releaseLock();
187
+ }
188
+ catch { /* ignore */ }
189
+ }
190
+ return lastResult;
191
+ }
192
+ // ---- 异步任务 ----
193
+ /** 异步提交:POST /api/v1/a2a/capabilities/{capabilityId}:submit */
194
+ async submit(baseUrl, capabilityId, input) {
195
+ const url = this.buildCapabilityUrl(baseUrl, capabilityId, 'submit');
196
+ const res = await this.fetchWithTimeout(url, {
197
+ method: 'POST',
198
+ headers: { 'Content-Type': 'application/json', ...this.headers },
199
+ body: JSON.stringify(input),
200
+ });
201
+ if (!res.ok) {
202
+ throw new Error(`REST A2A submit failed: HTTP ${res.status} from ${url}`);
203
+ }
204
+ return (await res.json());
205
+ }
206
+ /** 查询任务状态:GET /api/v1/a2a/tasks/{taskId} */
207
+ async getTask(baseUrl, taskId) {
208
+ const trimmed = baseUrl.replace(/\/+$/, '');
209
+ const url = `${trimmed}/api/v1/a2a/tasks/${taskId}`;
210
+ const res = await this.fetchWithTimeout(url, { method: 'GET' });
211
+ if (!res.ok) {
212
+ throw new Error(`REST A2A getTask failed: HTTP ${res.status} from ${url}`);
213
+ }
214
+ return (await res.json());
215
+ }
216
+ // ---- 内部方法 ----
217
+ /** 构建 Capability URL */
218
+ buildCapabilityUrl(baseUrl, capabilityId, action) {
219
+ const trimmed = baseUrl.replace(/\/+$/, '');
220
+ const base = `${trimmed}/api/v1/a2a/capabilities/${capabilityId}`;
221
+ return action ? `${base}:${action}` : base;
222
+ }
223
+ /** 带 chunkTimeout 的 reader.read() */
224
+ async readChunkWithTimeout(reader) {
225
+ let timer;
226
+ const timeout = new Promise((_, reject) => {
227
+ timer = setTimeout(() => {
228
+ reject(new Error(`REST A2A streaming chunk timeout: no data for ${this.chunkTimeout}ms`));
229
+ }, this.chunkTimeout);
230
+ });
231
+ try {
232
+ return await Promise.race([reader.read(), timeout]);
233
+ }
234
+ finally {
235
+ clearTimeout(timer);
236
+ }
237
+ }
238
+ /** 带超时的 fetch */
239
+ async fetchWithTimeout(url, init) {
240
+ const controller = new AbortController();
241
+ const timer = setTimeout(() => controller.abort(), this.timeout);
242
+ try {
243
+ return await this.fetchFn(url, { ...init, signal: controller.signal });
244
+ }
245
+ finally {
246
+ clearTimeout(timer);
247
+ }
248
+ }
249
+ }
250
+ //# sourceMappingURL=rest-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-client.js","sourceRoot":"","sources":["../../../src/a2a/rest-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { SubAgentRunner } from '../tool/delegate.js';
2
+ import type { RestA2AClient } from './rest-client.js';
3
+ /** createRestA2ARemoteRunner 配置项 */
4
+ export interface RestA2ARemoteRunnerConfig {
5
+ /** 远程 Agent 的 base URL(如 http://localhost:8000) */
6
+ baseUrl: string;
7
+ /** Capability ID(如 'competitive_review') */
8
+ capabilityId: string;
9
+ /** Runner 标识名(展示用) */
10
+ name: string;
11
+ /** Runner 能力描述(供 LLM 理解) */
12
+ description: string;
13
+ /** REST A2A 客户端实例 */
14
+ client: RestA2AClient;
15
+ /** 静态输入字段(如 { caller_agent_id: 'agent-alpha', business_line: '固定收益' }) */
16
+ staticFields?: Record<string, string>;
17
+ /** 任务字符串映射到的字段名(默认 'analysis_focus') */
18
+ taskField?: string;
19
+ /** 是否启用流式(默认 true) */
20
+ streaming?: boolean;
21
+ /** 流式失败时是否自动回退到同步模式,默认 true */
22
+ fallbackToSync?: boolean;
23
+ }
24
+ /**
25
+ * 创建 REST 风格远程 A2A Agent 的 SubAgentRunner
26
+ *
27
+ * 核心逻辑:
28
+ * - streaming=true && ctx.emitSubEvent 存在 → invokeStreaming + 事件转发
29
+ * - 否则 → invoke 同步阻塞
30
+ *
31
+ * 事件映射:
32
+ * - status(running) → start
33
+ * - stage → progress
34
+ * - tool_call → tool_call
35
+ * - tool_result → tool_result
36
+ * - message_chunk → content
37
+ * - result → done(由 runStreaming 提取最终文本)
38
+ * - error → error
39
+ */
40
+ export declare function createRestA2ARemoteRunner(config: RestA2ARemoteRunnerConfig): SubAgentRunner;
41
+ //# sourceMappingURL=rest-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-runner.d.ts","sourceRoot":"","sources":["../../../src/a2a/rest-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAsC,MAAM,kBAAkB,CAAC;AAE1F,oCAAoC;AACpC,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,yBAAyB,GAAG,cAAc,CA4F3F"}
@@ -0,0 +1,185 @@
1
+ // ============================================================
2
+ // REST 风格 A2A Remote Runner — 将 REST 风格远程 Agent 包装为 SubAgentRunner
3
+ // 供 delegate_task 使用,与标准 JSON-RPC A2A Runner 并行存在
4
+ // ============================================================
5
+ /**
6
+ * 创建 REST 风格远程 A2A Agent 的 SubAgentRunner
7
+ *
8
+ * 核心逻辑:
9
+ * - streaming=true && ctx.emitSubEvent 存在 → invokeStreaming + 事件转发
10
+ * - 否则 → invoke 同步阻塞
11
+ *
12
+ * 事件映射:
13
+ * - status(running) → start
14
+ * - stage → progress
15
+ * - tool_call → tool_call
16
+ * - tool_result → tool_result
17
+ * - message_chunk → content
18
+ * - result → done(由 runStreaming 提取最终文本)
19
+ * - error → error
20
+ */
21
+ export function createRestA2ARemoteRunner(config) {
22
+ const { baseUrl, capabilityId, name: runnerName, description: runnerDesc, client, staticFields = {}, taskField = 'analysis_focus', streaming = true, fallbackToSync = true, } = config;
23
+ /** 将 task 字符串构建为请求输入 */
24
+ function buildInput(task) {
25
+ return { ...staticFields, [taskField]: task };
26
+ }
27
+ /** 从 RestCapabilityResult 中提取最终文本 */
28
+ function extractResultText(result) {
29
+ if (result.result?.final_text)
30
+ return result.result.final_text;
31
+ if (result.result?.summary)
32
+ return result.result.summary;
33
+ // 降级:JSON 序列化整个 result
34
+ return JSON.stringify(result.result || result, null, 2);
35
+ }
36
+ // ---- 同步执行 ----
37
+ const runSync = async (task) => {
38
+ try {
39
+ const result = await client.invoke(baseUrl, capabilityId, buildInput(task));
40
+ if (result.status === 'failed' || result.error) {
41
+ const errMsg = result.error || 'Unknown error';
42
+ console.error(`[REST-A2A] '${runnerName}' sync failed: ${errMsg}`);
43
+ return `[REST A2A '${runnerName}'] Error: ${errMsg}`;
44
+ }
45
+ return extractResultText(result);
46
+ }
47
+ catch (err) {
48
+ console.error(`[REST-A2A] '${runnerName}' sync error: ${err?.message || err}`);
49
+ return `[REST A2A '${runnerName}'] Error: ${err.message || err}`;
50
+ }
51
+ };
52
+ // ---- 流式执行 ----
53
+ const runStreaming = async (task, ctx) => {
54
+ const emit = ctx.emitSubEvent;
55
+ const parentCallId = ctx.currentToolCallId || `rest_a2a_${Date.now()}`;
56
+ emitStart(emit, parentCallId, runnerName, task);
57
+ try {
58
+ const finalResult = await client.invokeStreaming(baseUrl, capabilityId, buildInput(task), (event) => forwardRestSSEEvent(emit, parentCallId, runnerName, event), ctx.abortSignal);
59
+ if (finalResult?.status === 'failed' || finalResult?.error) {
60
+ const errMsg = finalResult.error || 'Remote agent returned error';
61
+ console.error(`[REST-A2A] '${runnerName}' failed: ${errMsg}`);
62
+ emitError(emit, parentCallId, runnerName, errMsg);
63
+ return `[REST A2A '${runnerName}'] Error: ${errMsg}`;
64
+ }
65
+ const resultText = finalResult
66
+ ? extractResultText(finalResult)
67
+ : 'Task completed with no output.';
68
+ emitDone(emit, parentCallId, runnerName, resultText.length);
69
+ return resultText;
70
+ }
71
+ catch (err) {
72
+ const errMsg = err?.message || String(err);
73
+ console.error(`[REST-A2A] '${runnerName}' streaming error: ${errMsg}`);
74
+ // 流式失败,自动回退到同步模式
75
+ if (fallbackToSync) {
76
+ console.log(`[REST-A2A] '${runnerName}' falling back to sync`);
77
+ return runSync(task);
78
+ }
79
+ emitError(emit, parentCallId, runnerName, errMsg);
80
+ return `[REST A2A '${runnerName}'] Error: ${errMsg}`;
81
+ }
82
+ };
83
+ return {
84
+ name: runnerName,
85
+ description: runnerDesc,
86
+ run: async (task, ctx, _options) => {
87
+ return streaming && ctx?.emitSubEvent
88
+ ? runStreaming(task, ctx)
89
+ : runSync(task);
90
+ },
91
+ };
92
+ }
93
+ // ---- 事件转发辅助函数 ----
94
+ function emitStart(emit, parentCallId, agentName, task) {
95
+ emit?.({
96
+ parentToolCallId: parentCallId,
97
+ agentName,
98
+ eventType: 'start',
99
+ data: { agentName, task, source: 'rest-a2a-streaming' },
100
+ });
101
+ }
102
+ function emitDone(emit, parentCallId, agentName, contentLength) {
103
+ emit?.({
104
+ parentToolCallId: parentCallId,
105
+ agentName,
106
+ eventType: 'done',
107
+ data: { contentLength },
108
+ });
109
+ }
110
+ function emitError(emit, parentCallId, agentName, error) {
111
+ emit?.({
112
+ parentToolCallId: parentCallId,
113
+ agentName,
114
+ eventType: 'error',
115
+ data: { error },
116
+ });
117
+ }
118
+ /**
119
+ * 将 REST 风格 SSE 事件转发为 SubAgentEvent
120
+ *
121
+ * 事件映射:
122
+ * status(running) → progress
123
+ * stage → progress
124
+ * tool_call → tool_call
125
+ * tool_result → tool_result
126
+ * message_chunk → content
127
+ * result → (由 runStreaming 处理,不转发)
128
+ * error → error
129
+ */
130
+ function forwardRestSSEEvent(emit, parentCallId, agentName, event) {
131
+ const { event: eventType, data } = event;
132
+ switch (eventType) {
133
+ case 'status':
134
+ // running → progress;completed → 由 result 事件处理
135
+ if (data.status === 'running') {
136
+ emit?.({
137
+ parentToolCallId: parentCallId,
138
+ agentName,
139
+ eventType: 'progress',
140
+ data: { status: 'running', trace_id: data.trace_id },
141
+ });
142
+ }
143
+ break;
144
+ case 'stage':
145
+ emit?.({
146
+ parentToolCallId: parentCallId,
147
+ agentName,
148
+ eventType: 'progress',
149
+ data: { stage: data.stage, trace_id: data.trace_id },
150
+ });
151
+ break;
152
+ case 'tool_call':
153
+ emit?.({
154
+ parentToolCallId: parentCallId,
155
+ agentName,
156
+ eventType: 'tool_call',
157
+ data,
158
+ });
159
+ break;
160
+ case 'tool_result':
161
+ emit?.({
162
+ parentToolCallId: parentCallId,
163
+ agentName,
164
+ eventType: 'tool_result',
165
+ data,
166
+ });
167
+ break;
168
+ case 'message_chunk':
169
+ emit?.({
170
+ parentToolCallId: parentCallId,
171
+ agentName,
172
+ eventType: 'content',
173
+ data: { content: data.content },
174
+ });
175
+ break;
176
+ // result 和 error 由 runStreaming 的 finalResult 处理,不在此转发
177
+ case 'result':
178
+ case 'error':
179
+ break;
180
+ default:
181
+ // 未知事件类型 → 丢弃
182
+ break;
183
+ }
184
+ }
185
+ //# sourceMappingURL=rest-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-runner.js","sourceRoot":"","sources":["../../../src/a2a/rest-runner.ts"],"names":[],"mappings":"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"}
@@ -68,6 +68,23 @@ export declare class AgentEngine {
68
68
  private resolveSkill;
69
69
  /** 构建初始消息列表(system + history + user) */
70
70
  private buildInitialMessages;
71
+ /**
72
+ * 将对话历史压缩为摘要,用 <conversation_history> XML 标签包裹,
73
+ * 注入为 user 消息 + assistant 确认对。
74
+ *
75
+ * 摘要是陈述句,当前消息是指令句,语义上天然区分。
76
+ * ≤2 条消息时直接拼接,省去 LLM 调用;LLM 失败时回退到简单拼接。
77
+ *
78
+ * @param history 历史消息列表
79
+ * @param currentText 当前用户消息文本(用于排除最后一条匹配的 user 消息,null 表示全部纳入摘要)
80
+ * @returns 摘要消息对 [user: <conversation_history>..., assistant: 确认]
81
+ */
82
+ private buildHistoryMessages;
83
+ /**
84
+ * 通过轻量 LLM 调用将多轮对话历史压缩为 ≤800 字的陈述句摘要。
85
+ * LLM 失败时回退到简单拼接。
86
+ */
87
+ private summarizeHistory;
71
88
  /** 获取工具定义列表(含预过滤 + 渐进式发现) */
72
89
  private resolveToolDefs;
73
90
  /** 构建 ToolContext */