@touchvue/chat 1.0.0-beta.56 → 1.0.0-beta.57

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 (121) hide show
  1. package/es/index.mjs.map +1 -1
  2. package/es/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.mjs +939 -226
  3. package/es/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
  4. package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.mjs +109 -105
  5. package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.mjs.map +1 -0
  6. package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.mjs +34 -30
  7. package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.mjs.map +1 -0
  8. package/es/node_modules/.pnpm/{markdown-it-deflist@3.0.0 → markdown-it-deflist@3.0.1}/node_modules/markdown-it-deflist/index.mjs +2 -1
  9. package/es/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.mjs.map +1 -0
  10. package/es/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.mjs +1 -1
  11. package/es/package.json.mjs +1 -1
  12. package/es/packages/components/touchchat/component/AiRobot/face.vue2.mjs.map +1 -1
  13. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +1 -1
  14. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
  15. package/es/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.mjs.map +1 -1
  16. package/es/packages/components/touchchat/component/AiRobot/start.vue2.mjs.map +1 -1
  17. package/es/packages/components/touchchat/component/CardView.vue2.mjs.map +1 -1
  18. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
  19. package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
  20. package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
  21. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
  22. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
  23. package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
  24. package/es/packages/components/touchchat/component/ThoughtChain.vue2.mjs.map +1 -1
  25. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  26. package/es/packages/components/touchchat/component/UploadView_api.vue2.mjs.map +1 -1
  27. package/es/packages/components/touchchat/index.mjs.map +1 -1
  28. package/es/packages/components/touchchat/src/AiChat/Chat/TouchChat.mjs.map +1 -1
  29. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +7 -2
  30. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  31. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
  32. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +10 -7
  33. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
  34. package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -1
  35. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +6 -2
  36. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  37. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  38. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  39. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  40. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +136 -120
  41. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  42. package/es/packages/components/touchchat/src/index.vue2.mjs +6 -1
  43. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  44. package/es/packages/components/touchchat/src/types/a2a.mjs.map +1 -1
  45. package/es/packages/components/touchchat/utils/a2aService.mjs +189 -132
  46. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  47. package/es/packages/components/touchchat/utils/chatRobot.mjs.map +1 -1
  48. package/es/packages/components/touchchat/utils/deepCloneDom.mjs.map +1 -1
  49. package/es/packages/components/touchchat/utils/hight-it.mjs.map +1 -1
  50. package/es/packages/components/touchchat/utils/markdown.mjs +2 -2
  51. package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
  52. package/es/packages/components/touchchat/utils/socket.mjs.map +1 -1
  53. package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
  54. package/es/packages/components/touchchat/utils/uuid.mjs.map +1 -1
  55. package/es/packages/utils/config.mjs.map +1 -1
  56. package/es/packages/utils/types.mjs.map +1 -1
  57. package/lib/index.js.map +1 -1
  58. package/lib/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.js +939 -226
  59. package/lib/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.js.map +1 -0
  60. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.js +109 -105
  61. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.js.map +1 -0
  62. package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.js +34 -30
  63. package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.js.map +1 -0
  64. package/lib/node_modules/.pnpm/{markdown-it-deflist@3.0.0 → markdown-it-deflist@3.0.1}/node_modules/markdown-it-deflist/index.js +2 -1
  65. package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.js.map +1 -0
  66. package/lib/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.js +1 -1
  67. package/lib/package.json.js +1 -1
  68. package/lib/packages/components/touchchat/component/AiRobot/face.vue2.js.map +1 -1
  69. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +1 -1
  70. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  71. package/lib/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.js.map +1 -1
  72. package/lib/packages/components/touchchat/component/AiRobot/start.vue2.js.map +1 -1
  73. package/lib/packages/components/touchchat/component/CardView.vue2.js.map +1 -1
  74. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  75. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  76. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  77. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  78. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  79. package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
  80. package/lib/packages/components/touchchat/component/ThoughtChain.vue2.js.map +1 -1
  81. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  82. package/lib/packages/components/touchchat/component/UploadView_api.vue2.js.map +1 -1
  83. package/lib/packages/components/touchchat/index.js.map +1 -1
  84. package/lib/packages/components/touchchat/src/AiChat/Chat/TouchChat.js.map +1 -1
  85. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +6 -1
  86. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  87. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
  88. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +10 -7
  89. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
  90. package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -1
  91. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +5 -1
  92. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  93. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  94. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  95. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  96. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +136 -120
  97. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  98. package/lib/packages/components/touchchat/src/index.vue2.js +6 -1
  99. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  100. package/lib/packages/components/touchchat/src/types/a2a.js.map +1 -1
  101. package/lib/packages/components/touchchat/utils/a2aService.js +189 -132
  102. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  103. package/lib/packages/components/touchchat/utils/chatRobot.js.map +1 -1
  104. package/lib/packages/components/touchchat/utils/deepCloneDom.js.map +1 -1
  105. package/lib/packages/components/touchchat/utils/hight-it.js.map +1 -1
  106. package/lib/packages/components/touchchat/utils/markdown.js +2 -2
  107. package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
  108. package/lib/packages/components/touchchat/utils/socket.js.map +1 -1
  109. package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
  110. package/lib/packages/components/touchchat/utils/uuid.js.map +1 -1
  111. package/lib/packages/utils/config.js.map +1 -1
  112. package/lib/packages/utils/types.js.map +1 -1
  113. package/package.json +83 -83
  114. package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
  115. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.mjs.map +0 -1
  116. package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.mjs.map +0 -1
  117. package/es/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.mjs.map +0 -1
  118. package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +0 -1
  119. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.js.map +0 -1
  120. package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.js.map +0 -1
  121. package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.js.map +0 -1
@@ -1,5 +1,33 @@
1
1
  'use strict';
2
2
 
3
+ const extractSSEData = (line) => {
4
+ const trimmed = line.trim();
5
+ if (!trimmed)
6
+ return null;
7
+ if (trimmed.startsWith("data:")) {
8
+ return trimmed.substring(5).trim();
9
+ }
10
+ if (!trimmed.startsWith(":") && !trimmed.startsWith("event:") && !trimmed.startsWith("id:") && trimmed.startsWith("{")) {
11
+ return trimmed;
12
+ }
13
+ return null;
14
+ };
15
+ const parseErrorFromResponseBody = (errorBody) => {
16
+ var _a;
17
+ const trimmed = errorBody.trim();
18
+ if (!trimmed)
19
+ return null;
20
+ const sseData = extractSSEData(trimmed);
21
+ const jsonText = sseData || trimmed;
22
+ try {
23
+ const errorData = JSON.parse(jsonText);
24
+ if ((_a = errorData.error) == null ? void 0 : _a.message) {
25
+ return errorData.error.message;
26
+ }
27
+ } catch (e) {
28
+ }
29
+ return null;
30
+ };
3
31
  class A2AService {
4
32
  constructor() {
5
33
  this.agents = /* @__PURE__ */ new Map();
@@ -39,14 +67,10 @@ class A2AService {
39
67
  if (!agent) {
40
68
  throw new Error(`Agent ${agentId} not found`);
41
69
  }
70
+ const streamRequest = this.buildA2AStreamRequest(message, sessionId);
42
71
  const request = {
43
- jsonrpc: "2.0",
44
- id: this.generateId(),
45
- method: "message/send",
46
- params: {
47
- message,
48
- sessionId
49
- }
72
+ ...streamRequest,
73
+ method: "message/send"
50
74
  };
51
75
  const response = await fetch(agent.endpoint, {
52
76
  method: "POST",
@@ -71,41 +95,22 @@ class A2AService {
71
95
  if (!agent) {
72
96
  throw new Error(`Agent ${agentId} not found`);
73
97
  }
74
- const request = {
75
- jsonrpc: "2.0",
76
- id: this.generateId(),
77
- method: "message/stream",
78
- params: {
79
- message,
80
- sessionId
81
- }
82
- };
83
98
  let headers = {
84
99
  "Content-Type": "application/json",
85
100
  Accept: "text/event-stream",
86
101
  ...agent.authToken ? { Authorization: `Bearer ${agent.authToken}` } : {}
87
102
  };
88
- let body = JSON.stringify(request);
103
+ const requestBody = this.buildA2AStreamRequest(message, sessionId);
89
104
  if (modules && modules.length > 0 && typeof modules[0] === "object" && modules[0] !== null && modules[0].config) {
90
105
  const customConfig = modules[0].config;
91
106
  if (typeof customConfig.headers === "function") {
92
- const customHeaders = customConfig.headers();
93
107
  headers = {
94
108
  ...headers,
95
- ...customHeaders
109
+ ...customConfig.headers()
96
110
  };
97
111
  }
98
- if (typeof customConfig.body === "function") {
99
- const body_ = customConfig.body();
100
- if (body_.messages) {
101
- delete body_.messages;
102
- }
103
- if (body_.model) {
104
- delete body_.model;
105
- }
106
- body = JSON.stringify(body_);
107
- }
108
112
  }
113
+ const body = JSON.stringify(requestBody);
109
114
  const response = await fetch(agent.endpoint, {
110
115
  method: "POST",
111
116
  headers,
@@ -113,88 +118,14 @@ class A2AService {
113
118
  signal
114
119
  });
115
120
  if (!response.ok) {
116
- try {
117
- const errorBody = await response.text();
118
- try {
119
- const errorData = JSON.parse(errorBody);
120
- if (errorData.error) {
121
- throw new Error(errorData.error.message || `HTTP error: ${response.status}`);
122
- }
123
- } catch (e) {
124
- throw new Error(errorBody || `HTTP error: ${response.status}`);
125
- }
126
- } catch (e) {
127
- throw new Error(e.message || `HTTP error: ${response.status}`);
128
- }
121
+ const errorBody = await response.text();
122
+ const errorMessage = parseErrorFromResponseBody(errorBody);
123
+ throw new Error(errorMessage || errorBody || `HTTP error: ${response.status}`);
129
124
  }
130
125
  if (!response.body) {
131
126
  throw new Error("No response body");
132
127
  }
133
- return new ReadableStream({
134
- async start(controller) {
135
- const reader = response.body.getReader();
136
- const decoder = new TextDecoder();
137
- let buffer = "";
138
- if (signal) {
139
- signal.addEventListener("abort", () => {
140
- controller.close();
141
- reader.cancel();
142
- });
143
- }
144
- try {
145
- let isDone = false;
146
- while (!isDone) {
147
- if (signal == null ? void 0 : signal.aborted) {
148
- console.log("streamMessage: signal aborted");
149
- controller.close();
150
- return;
151
- }
152
- const { done, value } = await reader.read();
153
- if (done) {
154
- console.log("streamMessage: stream done");
155
- isDone = true;
156
- controller.close();
157
- break;
158
- }
159
- const chunkText = decoder.decode(value, { stream: true });
160
- buffer += chunkText;
161
- const lines = buffer.split("\n");
162
- buffer = lines.pop() || "";
163
- const fn = async (data) => {
164
- if (data === "[DONE]") {
165
- console.log("streamMessage: [DONE] received");
166
- controller.close();
167
- return;
168
- }
169
- const trimmedData = data.trim();
170
- if (!trimmedData)
171
- return;
172
- try {
173
- const chunk = JSON.parse(trimmedData);
174
- console.log("streamMessage: parsed chunk:", chunk);
175
- await new Promise((resolve) => setTimeout(resolve, 50));
176
- controller.enqueue(chunk);
177
- } catch (e) {
178
- console.warn("Failed to parse SSE data:", trimmedData);
179
- }
180
- };
181
- for (const line of lines) {
182
- const trimmed = line.trim();
183
- if (trimmed.startsWith("data:")) {
184
- const data = trimmed.substring(5).trim();
185
- await fn(data);
186
- } else if (trimmed && !trimmed.startsWith(":") && !trimmed.startsWith("event:") && !trimmed.startsWith("id:")) {
187
- if (trimmed.startsWith("{")) {
188
- await fn(trimmed);
189
- }
190
- }
191
- }
192
- }
193
- } finally {
194
- reader.releaseLock();
195
- }
196
- }
197
- });
128
+ return this.createSSEReadableStream(response.body, signal);
198
129
  }
199
130
  // Multi-agent message routing
200
131
  async routeMessage(agentIds, message, mode = "sequential") {
@@ -289,19 +220,120 @@ class A2AService {
289
220
  generateId() {
290
221
  return `req-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
291
222
  }
292
- // Multi-agent streaming message
293
- async *streamMultiAgentMessage(hostEndpoint, subAgents, message, headers, sessionId, signal) {
294
- const subAgentsJson = JSON.stringify(subAgents);
295
- const xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)));
296
- const request = {
223
+ getMessageText(message) {
224
+ return message.parts.filter((part) => part.type === "text").map((part) => part.text).join("");
225
+ }
226
+ buildA2AStreamRequest(message, sessionId) {
227
+ const text = this.getMessageText(message);
228
+ const params = {
229
+ message: {
230
+ role: message.role,
231
+ parts: [
232
+ {
233
+ kind: "data",
234
+ data: {
235
+ role: message.role,
236
+ content_type: "text",
237
+ content: text
238
+ }
239
+ }
240
+ ],
241
+ messageId: message.messageId,
242
+ kind: "message"
243
+ }
244
+ };
245
+ if (sessionId) {
246
+ params.sessionId = sessionId;
247
+ }
248
+ return {
297
249
  jsonrpc: "2.0",
298
250
  id: this.generateId(),
299
251
  method: "message/stream",
300
- params: {
301
- message,
302
- sessionId
303
- }
252
+ params
304
253
  };
254
+ }
255
+ createSSEReadableStream(responseBody, signal) {
256
+ return new ReadableStream({
257
+ async start(controller) {
258
+ const reader = responseBody.getReader();
259
+ const decoder = new TextDecoder();
260
+ let buffer = "";
261
+ let streamClosed = false;
262
+ const closeStream = () => {
263
+ if (!streamClosed) {
264
+ streamClosed = true;
265
+ controller.close();
266
+ }
267
+ };
268
+ const handleSSEData = async (data) => {
269
+ if (data === "[DONE]") {
270
+ closeStream();
271
+ return;
272
+ }
273
+ const trimmedData = data.trim();
274
+ if (!trimmedData)
275
+ return;
276
+ try {
277
+ const chunk = JSON.parse(trimmedData);
278
+ controller.enqueue(chunk);
279
+ if (chunk.error) {
280
+ closeStream();
281
+ }
282
+ } catch (e) {
283
+ console.warn("Failed to parse SSE data:", trimmedData);
284
+ }
285
+ };
286
+ const processBuffer = async (flushRemaining = false) => {
287
+ if (flushRemaining && buffer.trim()) {
288
+ const data = extractSSEData(buffer);
289
+ if (data) {
290
+ await handleSSEData(data);
291
+ }
292
+ buffer = "";
293
+ return;
294
+ }
295
+ const lines = buffer.split("\n");
296
+ buffer = lines.pop() || "";
297
+ for (const line of lines) {
298
+ const data = extractSSEData(line);
299
+ if (data) {
300
+ await handleSSEData(data);
301
+ }
302
+ }
303
+ };
304
+ if (signal) {
305
+ signal.addEventListener("abort", () => {
306
+ closeStream();
307
+ reader.cancel();
308
+ });
309
+ }
310
+ try {
311
+ while (!streamClosed) {
312
+ if (signal == null ? void 0 : signal.aborted) {
313
+ closeStream();
314
+ return;
315
+ }
316
+ const { done, value } = await reader.read();
317
+ if (done) {
318
+ buffer += decoder.decode();
319
+ await processBuffer(true);
320
+ closeStream();
321
+ break;
322
+ }
323
+ buffer += decoder.decode(value, { stream: true });
324
+ await processBuffer();
325
+ }
326
+ } finally {
327
+ reader.releaseLock();
328
+ }
329
+ }
330
+ });
331
+ }
332
+ // Multi-agent streaming message
333
+ async *streamMultiAgentMessage(hostEndpoint, subAgents, message, headers, sessionId, signal) {
334
+ const subAgentsJson = JSON.stringify(subAgents);
335
+ const xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)));
336
+ const request = this.buildA2AStreamRequest(message, sessionId);
305
337
  const response = await fetch(hostEndpoint, {
306
338
  method: "POST",
307
339
  headers: {
@@ -324,30 +356,55 @@ class A2AService {
324
356
  const reader = response.body.getReader();
325
357
  const decoder = new TextDecoder();
326
358
  let buffer = "";
359
+ const processBuffer = function* (flushRemaining = false) {
360
+ if (flushRemaining && buffer.trim()) {
361
+ const data = extractSSEData(buffer);
362
+ buffer = "";
363
+ if (data && data !== "[DONE]") {
364
+ try {
365
+ yield JSON.parse(data);
366
+ } catch (e) {
367
+ console.warn("Failed to parse SSE data:", data);
368
+ }
369
+ }
370
+ return data === "[DONE]";
371
+ }
372
+ const lines = buffer.split("\n");
373
+ buffer = lines.pop() || "";
374
+ for (const line of lines) {
375
+ const data = extractSSEData(line);
376
+ if (!data)
377
+ continue;
378
+ if (data === "[DONE]")
379
+ return true;
380
+ try {
381
+ yield JSON.parse(data);
382
+ } catch (e) {
383
+ console.warn("Failed to parse SSE data:", data);
384
+ }
385
+ }
386
+ return false;
387
+ };
327
388
  try {
328
389
  while (true) {
329
390
  if (signal == null ? void 0 : signal.aborted) {
330
391
  return;
331
392
  }
332
393
  const { done, value } = await reader.read();
333
- if (done)
334
- break;
335
- buffer += decoder.decode(value, { stream: true });
336
- const lines = buffer.split("\n");
337
- buffer = lines.pop() || "";
338
- for (const line of lines) {
339
- const trimmed = line.trim();
340
- if (trimmed.startsWith("data: ")) {
341
- const data = trimmed.slice(6);
342
- if (data === "[DONE]")
394
+ if (done) {
395
+ buffer += decoder.decode();
396
+ for (const chunk of processBuffer(true)) {
397
+ yield chunk;
398
+ if (chunk.error)
343
399
  return;
344
- try {
345
- const chunk = JSON.parse(data);
346
- yield chunk;
347
- } catch (e) {
348
- console.warn("Failed to parse SSE data:", data);
349
- }
350
400
  }
401
+ break;
402
+ }
403
+ buffer += decoder.decode(value, { stream: true });
404
+ for (const chunk of processBuffer()) {
405
+ yield chunk;
406
+ if (chunk.error)
407
+ return;
351
408
  }
352
409
  }
353
410
  } finally {
@@ -1 +1 @@
1
- {"version":3,"file":"a2aService.js","sources":["../../../../../../packages/components/touchchat/utils/a2aService.ts"],"sourcesContent":["import type { AgentConfig, Message, JSONRPCRequest, StreamChunk, Task, AgentCard, SubAgent } from '../src/types/a2a'\nimport type { ModuleItem } from '../../../../packages/components/touchchat/src/AiChat/Chat/types'\n// @/types/a2a\n\n// A2A Service - Handles communication with A2A agents\nexport class A2AService {\n\tprivate agents: Map<string, AgentConfig> = new Map()\n\n\t// Register an agent\n\tregisterAgent(config: AgentConfig): void {\n\t\tthis.agents.set(config.id, config)\n\t}\n\n\t// Unregister an agent\n\tunregisterAgent(agentId: string): void {\n\t\tthis.agents.delete(agentId)\n\t}\n\n\t// Get registered agent\n\tgetAgent(agentId: string): AgentConfig | undefined {\n\t\treturn this.agents.get(agentId)\n\t}\n\n\t// Get all registered agents\n\tgetAllAgents(): AgentConfig[] {\n\t\treturn Array.from(this.agents.values())\n\t}\n\n\t// Fetch agent card (agent discovery)\n\tasync fetchAgentCard(url: string): Promise<AgentCard> {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\tAccept: 'application/json'\n\t\t\t}\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to fetch agent card: ${response.statusText}`)\n\t\t}\n\n\t\treturn response.json()\n\t}\n\n\t// Send message to agent (non-streaming)\n\tasync sendMessage(agentId: string, message: Message, sessionId?: string): Promise<Task> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/send',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\n\t\treturn data.result as Task\n\t}\n\n\t// Stream message to agent (for streaming responses)\n\tasync streamMessage(agentId: string, message: Message, sessionId?: string, signal?: AbortSignal, modules?: ModuleItem[]): Promise<ReadableStream<StreamChunk>> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/stream',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tlet headers: Record<string, string> = {\n\t\t\t'Content-Type': 'application/json',\n\t\t\tAccept: 'text/event-stream',\n\t\t\t...(agent.authToken ? { Authorization: `Bearer ${agent.authToken}` } : {})\n\t\t}\n\n\t\tlet body = JSON.stringify(request)\n\n\t\t// 只有当 modules 数组有数据且第一个元素是对象且有 config 属性时,才使用自定义配置\n\t\tif (modules && modules.length > 0 && typeof modules[0] === 'object' && modules[0] !== null && modules[0].config) {\n\t\t\tconst customConfig = modules[0].config\n\t\t\tif (typeof customConfig.headers === 'function') {\n\t\t\t\tconst customHeaders = customConfig.headers()\n\t\t\t\theaders = {\n\t\t\t\t\t...headers,\n\t\t\t\t\t...customHeaders\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof customConfig.body === 'function') {\n\t\t\t\tconst body_ = customConfig.body()\n\t\t\t\tif (body_.messages) {\n\t\t\t\t\tdelete body_.messages\n\t\t\t\t}\n\t\t\t\tif (body_.model) {\n\t\t\t\t\tdelete body_.model\n\t\t\t\t}\n\t\t\t\tbody = JSON.stringify(body_)\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders,\n\t\t\tbody,\n\t\t\tsignal\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\ttry {\n\t\t\t\tconst errorBody = await response.text()\n\t\t\t\ttry {\n\t\t\t\t\tconst errorData = JSON.parse(errorBody)\n\t\t\t\t\tif (errorData.error) {\n\t\t\t\t\t\tthrow new Error(errorData.error.message || `HTTP error: ${response.status}`)\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(errorBody || `HTTP error: ${response.status}`)\n\t\t\t\t}\n\t\t\t} catch (e: any) {\n\t\t\t\tthrow new Error(e.message || `HTTP error: ${response.status}`)\n\t\t\t}\n\t\t}\n\n\t\tif (!response.body) {\n\t\t\tthrow new Error('No response body')\n\t\t}\n\n\t\treturn new ReadableStream<StreamChunk>({\n\t\t\tasync start(controller) {\n\t\t\t\tconst reader = response.body!.getReader()\n\t\t\t\tconst decoder = new TextDecoder()\n\t\t\t\tlet buffer = ''\n\n\t\t\t\t// Handle abort signal\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\treader.cancel()\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tlet isDone = false\n\t\t\t\t\twhile (!isDone) {\n\t\t\t\t\t\t// Check if the signal has been aborted\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\tconsole.log('streamMessage: signal aborted')\n\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tconsole.log('streamMessage: stream done')\n\t\t\t\t\t\t\tisDone = true\n\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst chunkText = decoder.decode(value, { stream: true })\n\n\t\t\t\t\t\tbuffer += chunkText\n\t\t\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\t\t\tbuffer = lines.pop() || ''\n\n\t\t\t\t\t\tconst fn = async (data: string) => {\n\t\t\t\t\t\t\tif (data === '[DONE]') {\n\t\t\t\t\t\t\t\tconsole.log('streamMessage: [DONE] received')\n\t\t\t\t\t\t\t\tcontroller.close()\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Trim whitespace from data\n\t\t\t\t\t\t\tconst trimmedData = data.trim()\n\t\t\t\t\t\t\tif (!trimmedData) return\n\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(trimmedData)\n\t\t\t\t\t\t\t\tconsole.log('streamMessage: parsed chunk:', chunk)\n\t\t\t\t\t\t\t\t// Add a small delay to simulate streaming effect\n\t\t\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 50))\n\t\t\t\t\t\t\t\tcontroller.enqueue(chunk)\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', trimmedData)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tconst trimmed = line.trim()\n\n\t\t\t\t\t\t\t// Handle different SSE formats\n\t\t\t\t\t\t\tif (trimmed.startsWith('data:')) {\n\t\t\t\t\t\t\t\t// Remove 'data:' prefix and any leading whitespace\n\t\t\t\t\t\t\t\tconst data = trimmed.substring(5).trim()\n\t\t\t\t\t\t\t\tawait fn(data)\n\t\t\t\t\t\t\t} else if (trimmed && !trimmed.startsWith(':') && !trimmed.startsWith('event:') && !trimmed.startsWith('id:')) {\n\t\t\t\t\t\t\t\t// Some servers send raw JSON without 'data:' prefix\n\t\t\t\t\t\t\t\t// Try to parse it directly if it looks like JSON\n\t\t\t\t\t\t\t\tif (trimmed.startsWith('{')) {\n\t\t\t\t\t\t\t\t\tawait fn(trimmed)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Ignore comments (lines starting with :), event types, and IDs\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\treader.releaseLock()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// Multi-agent message routing\n\tasync routeMessage(agentIds: string[], message: Message, mode: 'sequential' | 'parallel' = 'sequential'): Promise<Map<string, Task>> {\n\t\tconst results = new Map<string, Task>()\n\n\t\tif (mode === 'parallel') {\n\t\t\tconst promises = agentIds.map(async agentId => {\n\t\t\t\ttry {\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\n\t\t\t\t\treturn { agentId, task, error: null }\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { agentId, task: null, error }\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst settled = await Promise.all(promises)\n\t\t\tfor (const { agentId, task, error } of settled) {\n\t\t\t\tif (task) {\n\t\t\t\t\tresults.set(agentId, task)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Sequential\n\t\t\tfor (const agentId of agentIds) {\n\t\t\t\ttry {\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\n\t\t\t\t\tresults.set(agentId, task)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\t// Get task status\n\tasync getTask(agentId: string, taskId: string): Promise<Task> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'task/get',\n\t\t\tparams: { taskId }\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\n\t\treturn data.result as Task\n\t}\n\n\t// Cancel task\n\tasync cancelTask(agentId: string, taskId: string): Promise<void> {\n\t\tconst agent = this.agents.get(agentId)\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\n\t\t}\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'task/cancel',\n\t\t\tparams: { taskId }\n\t\t}\n\n\t\tconst response = await fetch(agent.endpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\n\t\t\t},\n\t\t\tbody: JSON.stringify(request)\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tconst data = await response.json()\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\n\t\t}\n\t}\n\n\t// Generate unique ID\n\tprivate generateId(): string {\n\t\treturn `req-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n\t}\n\n\t// Multi-agent streaming message\n\tasync *streamMultiAgentMessage(hostEndpoint: string, subAgents: SubAgent[], message: Message, headers: object, sessionId?: string, signal?: AbortSignal): AsyncGenerator<StreamChunk, void, unknown> {\n\t\t// Build X-Sub-Agents headers: JSON array -> Base64\n\t\tconst subAgentsJson = JSON.stringify(subAgents)\n\t\t// Use Unicode-safe Base64 encoding\n\t\tconst xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)))\n\n\t\tconst request: JSONRPCRequest = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: this.generateId(),\n\t\t\tmethod: 'message/stream',\n\t\t\tparams: {\n\t\t\t\tmessage,\n\t\t\t\tsessionId\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(hostEndpoint, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAccept: 'text/event-stream',\n\t\t\t\t'X-Sub-Agents': xSubAgents,\n\t\t\t\t// 'ai-jwt-token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhc2lhaW5mby5jb20iLCJzdWIiOiJkZW5nd2FuIiwiYXVkIjoiY29tLmFpZi5wYWFzLndlYlRva2VuIiwidXNlckluZm8iOiJ7XCJhbGlhc1wiOlwiZGVuZ3dhblwiLFwiYXV0b2luXCI6ZmFsc2UsXCJlbnZDb2RlXCI6XCJQUk9EXCIsXCJlbnZOYW1lXCI6XCLnlJ_kuqfnjq_looNcIixcImxhbmd1YWdlXCI6XCJ6aFwiLFwicGVybWlzc2lvbnNcIjpbXCJcIixcInBvcnRhbDpzeXN0ZW06cm9sZTpiaW5kXCIsXCJwb3J0YWw6ZGljdGlvbmFyeTpkYXRhOmFkZFwiLG51bGwsXCJhZ2VudFwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTp1cGRhdGVcIixcImF1ZGl0TG9nL2xpc3RBdWRpdExvZ1wiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW06dXNlcjp1cGRhdGVcIixcInBvcnRhbDptY3A6YXVkaXRcIixcInBvcnRhbDptY3A6c2FmZWF1ZGl0XCIsXCJwb3J0YWw6bWNwOnRvb2xjb25maXJtXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDphZGRcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnJlbGF0aW9uXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpwZXJtaXNzaW9uXCIsXCJwb3J0YWw6c3lzdGVtUGFyYW1ldGVyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6dXBkYXRlXCIsXCJwb3J0YWw6c3lzdGVtOnJvbGU6YWRkXCIsXCJ0ZW5hbnQvZ2V0VGVuYW50RHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOnVwZGF0ZVwiLFwicG9ydGFsOmFnZW50OmF1ZGl0XCIsXCJwb3J0YWw6bm90aWNlOnVwZGF0ZVwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOmRlbGV0ZVwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmFkZFwiLFwibWVudS9nZXRNZW51QnlQYXJhbVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGVsZXRlXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpkZWxldGVcIixcInVzZXIvcXVlcnlVc2VyRHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTptZW51OmFkZFwiLFwicG9ydGFsOnN5c3RlbVBhcmFtZXRlcjp1cGRhdGVcIixcInBvcnRhbDphZ2VudDptb2RlbGNoZWNrXCIsXCJwb3J0YWw6c3lzdGVtOm1lbnU6dXBkYXRlXCIsXCJyb2xlL3F1ZXJ5Um9sZUxpc3RcIixcInBvcnRhbDpzeXN0ZW06bWVudTpkZWxldGVcIixcInBvcnRhbDpub3RpY2U6YWRkXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW1QYXJhbWV0ZXI6YWRkXCIsXCJyb2xlUGVybWlzc2lvbnMvcXVlcnlNZW51UGVybWlzc2lvbkxpc3RcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnVwZGF0ZVwiLFwibm90aWNlL2xpc3ROb3RpY2VcIl0sXCJwbGF0Zm9ybU1hbmFnZXJcIjp0cnVlLFwicm9sZUxpc3RcIjpbe1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwiY2FwX3Byb3ZpZGVyXCIsXCJyb2xlSWRcIjoxMixcInJvbGVOYW1lXCI6XCLog73lipvmj5DkvpvogIVcIixcInJvbGVUeXBlXCI6MX0se1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwidGVuYW50X2FkbWluXCIsXCJyb2xlSWRcIjo4LFwicm9sZU5hbWVcIjpcIuenn-aIt-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfSx7XCJjcmVhdGVUaW1lXCI6XCIyMDIyLTA2LTI4IDAwOjAwOjAwXCIsXCJoYXNFZGl0XCI6MSxcInJvbGVDb2RlXCI6XCJyb2xlX2FkbWluXCIsXCJyb2xlSWRcIjoxLFwicm9sZU5hbWVcIjpcIui2hee6p-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfV0sXCJ0ZW5hbnRDb2RlXCI6XCJ0ZW5hbnQtb25lXCIsXCJ0ZW5hbnRJZFwiOjUsXCJ0ZW5hbnROYW1lXCI6XCLkuIDnuqfov5DokKXnqbrpl7RcIixcInVzZXJJZFwiOjYsXCJ1c2VyTmFtZVwiOlwiZGVuZ3dhblwifSIsImV4cCI6MTc3Mzk5ODEzN30.7P8WVl3ji1G2unk0wOISJbF43ilcuzksOdSOQJNHGXM'\n\t\t\t\t// 'ai-jwt-token': authToken\n\t\t\t\t...headers\n\t\t\t},\n\t\t\tbody: JSON.stringify(request),\n\t\t\tsignal\n\t\t})\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\n\t\t}\n\n\t\tif (!response.body) {\n\t\t\tthrow new Error('No response body')\n\t\t}\n\n\t\tconst reader = response.body.getReader()\n\t\tconst decoder = new TextDecoder()\n\t\tlet buffer = ''\n\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\t// Check if the signal has been aborted\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst { done, value } = await reader.read()\n\t\t\t\tif (done) break\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true })\n\t\t\t\tconst lines = buffer.split('\\n')\n\t\t\t\tbuffer = lines.pop() || ''\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tconst trimmed = line.trim()\n\t\t\t\t\tif (trimmed.startsWith('data: ')) {\n\t\t\t\t\t\tconst data = trimmed.slice(6)\n\t\t\t\t\t\tif (data === '[DONE]') return\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(data)\n\t\t\t\t\t\t\tyield chunk\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock()\n\t\t}\n\t}\n}\n\n// Singleton instance\nexport const a2aService = new A2AService()\n"],"names":[],"mappings":";;AAKO,MAAM,UAAW,CAAA;AAAA,EAAjB,WAAA,GAAA;AACN,IAAQ,IAAA,CAAA,MAAA,uBAAuC,GAAI,EAAA,CAAA;AAAA,GAAA;AAAA;AAAA,EAGnD,cAAc,MAA2B,EAAA;AACxC,IAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,MAAO,CAAA,EAAA,EAAI,MAAM,CAAA,CAAA;AAAA,GAClC;AAAA;AAAA,EAGA,gBAAgB,OAAuB,EAAA;AACtC,IAAK,IAAA,CAAA,MAAA,CAAO,OAAO,OAAO,CAAA,CAAA;AAAA,GAC3B;AAAA;AAAA,EAGA,SAAS,OAA0C,EAAA;AAClD,IAAO,OAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,GAC/B;AAAA;AAAA,EAGA,YAA8B,GAAA;AAC7B,IAAA,OAAO,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,GACvC;AAAA;AAAA,EAGA,MAAM,eAAe,GAAiC,EAAA;AACrD,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MACjC,MAAQ,EAAA,KAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACR,MAAQ,EAAA,kBAAA;AAAA,OACT;AAAA,KACA,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAA+B,4BAAA,EAAA,QAAA,CAAS,UAAY,CAAA,CAAA,CAAA,CAAA;AAAA,KACrE;AAEA,IAAA,OAAO,SAAS,IAAK,EAAA,CAAA;AAAA,GACtB;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,OAAiB,EAAA,OAAA,EAAkB,SAAmC,EAAA;AACvF,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AACrC,IAAA,IAAI,CAAC,KAAO,EAAA;AACX,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,MAAA,EAAS,OAAmB,CAAA,UAAA,CAAA,CAAA,CAAA;AAAA,KAC7C;AAEA,IAAA,MAAM,OAA0B,GAAA;AAAA,MAC/B,OAAS,EAAA,KAAA;AAAA,MACT,EAAA,EAAI,KAAK,UAAW,EAAA;AAAA,MACpB,MAAQ,EAAA,cAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACP,OAAA;AAAA,QACA,SAAA;AAAA,OACD;AAAA,KACD,CAAA;AAEA,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,KAAA,CAAM,QAAU,EAAA;AAAA,MAC5C,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACR,cAAgB,EAAA,kBAAA;AAAA,QAChB,GAAI,KAAM,CAAA,SAAA,IAAa,EAAE,aAAe,EAAA,CAAA,OAAA,EAAU,MAAM,SAAY,CAAA,CAAA,EAAA;AAAA,OACrE;AAAA,MACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA,KAC5B,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAe,YAAA,EAAA,QAAA,CAAS,MAAQ,CAAA,CAAA,CAAA,CAAA;AAAA,KACjD;AAEA,IAAM,MAAA,IAAA,GAAO,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AAEjC,IAAA,IAAI,KAAK,KAAO,EAAA;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAc,WAAA,EAAA,IAAA,CAAK,MAAM,OAAS,CAAA,CAAA,CAAA,CAAA;AAAA,KACnD;AAEA,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACb;AAAA;AAAA,EAGA,MAAM,aAAc,CAAA,OAAA,EAAiB,OAAkB,EAAA,SAAA,EAAoB,QAAsB,OAA8D,EAAA;AAC9J,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AACrC,IAAA,IAAI,CAAC,KAAO,EAAA;AACX,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,MAAA,EAAS,OAAmB,CAAA,UAAA,CAAA,CAAA,CAAA;AAAA,KAC7C;AAEA,IAAA,MAAM,OAA0B,GAAA;AAAA,MAC/B,OAAS,EAAA,KAAA;AAAA,MACT,EAAA,EAAI,KAAK,UAAW,EAAA;AAAA,MACpB,MAAQ,EAAA,gBAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACP,OAAA;AAAA,QACA,SAAA;AAAA,OACD;AAAA,KACD,CAAA;AAEA,IAAA,IAAI,OAAkC,GAAA;AAAA,MACrC,cAAgB,EAAA,kBAAA;AAAA,MAChB,MAAQ,EAAA,mBAAA;AAAA,MACR,GAAI,MAAM,SAAY,GAAA,EAAE,eAAe,CAAU,OAAA,EAAA,KAAA,CAAM,SAAY,CAAA,CAAA,EAAA,GAAI,EAAC;AAAA,KACzE,CAAA;AAEA,IAAI,IAAA,IAAA,GAAO,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAGjC,IAAA,IAAI,WAAW,OAAQ,CAAA,MAAA,GAAS,CAAK,IAAA,OAAO,QAAQ,CAAC,CAAA,KAAM,QAAY,IAAA,OAAA,CAAQ,CAAC,CAAM,KAAA,IAAA,IAAQ,OAAQ,CAAA,CAAC,EAAE,MAAQ,EAAA;AAChH,MAAM,MAAA,YAAA,GAAe,OAAQ,CAAA,CAAC,CAAE,CAAA,MAAA,CAAA;AAChC,MAAI,IAAA,OAAO,YAAa,CAAA,OAAA,KAAY,UAAY,EAAA;AAC/C,QAAM,MAAA,aAAA,GAAgB,aAAa,OAAQ,EAAA,CAAA;AAC3C,QAAU,OAAA,GAAA;AAAA,UACT,GAAG,OAAA;AAAA,UACH,GAAG,aAAA;AAAA,SACJ,CAAA;AAAA,OACD;AACA,MAAI,IAAA,OAAO,YAAa,CAAA,IAAA,KAAS,UAAY,EAAA;AAC5C,QAAM,MAAA,KAAA,GAAQ,aAAa,IAAK,EAAA,CAAA;AAChC,QAAA,IAAI,MAAM,QAAU,EAAA;AACnB,UAAA,OAAO,KAAM,CAAA,QAAA,CAAA;AAAA,SACd;AACA,QAAA,IAAI,MAAM,KAAO,EAAA;AAChB,UAAA,OAAO,KAAM,CAAA,KAAA,CAAA;AAAA,SACd;AACA,QAAO,IAAA,GAAA,IAAA,CAAK,UAAU,KAAK,CAAA,CAAA;AAAA,OAC5B;AAAA,KACD;AAEA,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,KAAA,CAAM,QAAU,EAAA;AAAA,MAC5C,MAAQ,EAAA,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,KACA,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACjB,MAAI,IAAA;AACH,QAAM,MAAA,SAAA,GAAY,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AACtC,QAAI,IAAA;AACH,UAAM,MAAA,SAAA,GAAY,IAAK,CAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AACtC,UAAA,IAAI,UAAU,KAAO,EAAA;AACpB,YAAA,MAAM,IAAI,KAAM,CAAA,SAAA,CAAU,MAAM,OAAW,IAAA,CAAA,YAAA,EAAe,SAAS,MAAQ,CAAA,CAAA,CAAA,CAAA;AAAA,WAC5E;AAAA,iBACO,CAAN,EAAA;AACD,UAAA,MAAM,IAAI,KAAA,CAAM,SAAa,IAAA,CAAA,YAAA,EAAe,SAAS,MAAQ,CAAA,CAAA,CAAA,CAAA;AAAA,SAC9D;AAAA,eACQ,CAAP,EAAA;AACD,QAAA,MAAM,IAAI,KAAM,CAAA,CAAA,CAAE,OAAW,IAAA,CAAA,YAAA,EAAe,SAAS,MAAQ,CAAA,CAAA,CAAA,CAAA;AAAA,OAC9D;AAAA,KACD;AAEA,IAAI,IAAA,CAAC,SAAS,IAAM,EAAA;AACnB,MAAM,MAAA,IAAI,MAAM,kBAAkB,CAAA,CAAA;AAAA,KACnC;AAEA,IAAA,OAAO,IAAI,cAA4B,CAAA;AAAA,MACtC,MAAM,MAAM,UAAY,EAAA;AACvB,QAAM,MAAA,MAAA,GAAS,QAAS,CAAA,IAAA,CAAM,SAAU,EAAA,CAAA;AACxC,QAAM,MAAA,OAAA,GAAU,IAAI,WAAY,EAAA,CAAA;AAChC,QAAA,IAAI,MAAS,GAAA,EAAA,CAAA;AAGb,QAAA,IAAI,MAAQ,EAAA;AACX,UAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,MAAM;AACtC,YAAA,UAAA,CAAW,KAAM,EAAA,CAAA;AACjB,YAAA,MAAA,CAAO,MAAO,EAAA,CAAA;AAAA,WACd,CAAA,CAAA;AAAA,SACF;AAEA,QAAI,IAAA;AACH,UAAA,IAAI,MAAS,GAAA,KAAA,CAAA;AACb,UAAA,OAAO,CAAC,MAAQ,EAAA;AAEf,YAAA,IAAI,iCAAQ,OAAS,EAAA;AACpB,cAAA,OAAA,CAAQ,IAAI,+BAA+B,CAAA,CAAA;AAC3C,cAAA,UAAA,CAAW,KAAM,EAAA,CAAA;AACjB,cAAA,OAAA;AAAA,aACD;AAEA,YAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,MAAM,OAAO,IAAK,EAAA,CAAA;AAC1C,YAAA,IAAI,IAAM,EAAA;AACT,cAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA,CAAA;AACxC,cAAS,MAAA,GAAA,IAAA,CAAA;AACT,cAAA,UAAA,CAAW,KAAM,EAAA,CAAA;AACjB,cAAA,MAAA;AAAA,aACD;AAEA,YAAA,MAAM,YAAY,OAAQ,CAAA,MAAA,CAAO,OAAO,EAAE,MAAA,EAAQ,MAAM,CAAA,CAAA;AAExD,YAAU,MAAA,IAAA,SAAA,CAAA;AACV,YAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAC/B,YAAS,MAAA,GAAA,KAAA,CAAM,KAAS,IAAA,EAAA,CAAA;AAExB,YAAM,MAAA,EAAA,GAAK,OAAO,IAAiB,KAAA;AAClC,cAAA,IAAI,SAAS,QAAU,EAAA;AACtB,gBAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA,CAAA;AAC5C,gBAAA,UAAA,CAAW,KAAM,EAAA,CAAA;AACjB,gBAAA,OAAA;AAAA,eACD;AAGA,cAAM,MAAA,WAAA,GAAc,KAAK,IAAK,EAAA,CAAA;AAC9B,cAAA,IAAI,CAAC,WAAA;AAAa,gBAAA,OAAA;AAElB,cAAI,IAAA;AACH,gBAAM,MAAA,KAAA,GAAqB,IAAK,CAAA,KAAA,CAAM,WAAW,CAAA,CAAA;AACjD,gBAAQ,OAAA,CAAA,GAAA,CAAI,gCAAgC,KAAK,CAAA,CAAA;AAEjD,gBAAA,MAAM,IAAI,OAAQ,CAAA,CAAA,OAAA,KAAW,UAAW,CAAA,OAAA,EAAS,EAAE,CAAC,CAAA,CAAA;AACpD,gBAAA,UAAA,CAAW,QAAQ,KAAK,CAAA,CAAA;AAAA,uBAChB,CAAP,EAAA;AACD,gBAAQ,OAAA,CAAA,IAAA,CAAK,6BAA6B,WAAW,CAAA,CAAA;AAAA,eACtD;AAAA,aACD,CAAA;AAEA,YAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACzB,cAAM,MAAA,OAAA,GAAU,KAAK,IAAK,EAAA,CAAA;AAG1B,cAAI,IAAA,OAAA,CAAQ,UAAW,CAAA,OAAO,CAAG,EAAA;AAEhC,gBAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,SAAU,CAAA,CAAC,EAAE,IAAK,EAAA,CAAA;AACvC,gBAAA,MAAM,GAAG,IAAI,CAAA,CAAA;AAAA,yBACH,OAAW,IAAA,CAAC,OAAQ,CAAA,UAAA,CAAW,GAAG,CAAK,IAAA,CAAC,OAAQ,CAAA,UAAA,CAAW,QAAQ,CAAK,IAAA,CAAC,OAAQ,CAAA,UAAA,CAAW,KAAK,CAAG,EAAA;AAG9G,gBAAI,IAAA,OAAA,CAAQ,UAAW,CAAA,GAAG,CAAG,EAAA;AAC5B,kBAAA,MAAM,GAAG,OAAO,CAAA,CAAA;AAAA,iBACjB;AAAA,eACD;AAAA,aAED;AAAA,WACD;AAAA,SACC,SAAA;AACD,UAAA,MAAA,CAAO,WAAY,EAAA,CAAA;AAAA,SACpB;AAAA,OACD;AAAA,KACA,CAAA,CAAA;AAAA,GACF;AAAA;AAAA,EAGA,MAAM,YAAA,CAAa,QAAoB,EAAA,OAAA,EAAkB,OAAkC,YAA0C,EAAA;AACpI,IAAM,MAAA,OAAA,uBAAc,GAAkB,EAAA,CAAA;AAEtC,IAAA,IAAI,SAAS,UAAY,EAAA;AACxB,MAAA,MAAM,QAAW,GAAA,QAAA,CAAS,GAAI,CAAA,OAAM,OAAW,KAAA;AAC9C,QAAI,IAAA;AACH,UAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,SAAS,OAAO,CAAA,CAAA;AACpD,UAAA,OAAO,EAAE,OAAA,EAAS,IAAM,EAAA,KAAA,EAAO,IAAK,EAAA,CAAA;AAAA,iBAC5B,KAAP,EAAA;AACD,UAAA,OAAO,EAAE,OAAA,EAAS,IAAM,EAAA,IAAA,EAAM,KAAM,EAAA,CAAA;AAAA,SACrC;AAAA,OACA,CAAA,CAAA;AAED,MAAA,MAAM,OAAU,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAC1C,MAAA,KAAA,MAAW,EAAE,OAAA,EAAS,IAAM,EAAA,KAAA,MAAW,OAAS,EAAA;AAC/C,QAAA,IAAI,IAAM,EAAA;AACT,UAAQ,OAAA,CAAA,GAAA,CAAI,SAAS,IAAI,CAAA,CAAA;AAAA,SACnB,MAAA;AACN,UAAQ,OAAA,CAAA,KAAA,CAAM,CAA0B,uBAAA,EAAA,OAAA,CAAA,CAAA,CAAA,EAAY,KAAK,CAAA,CAAA;AAAA,SAC1D;AAAA,OACD;AAAA,KACM,MAAA;AAEN,MAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC/B,QAAI,IAAA;AACH,UAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,SAAS,OAAO,CAAA,CAAA;AACpD,UAAQ,OAAA,CAAA,GAAA,CAAI,SAAS,IAAI,CAAA,CAAA;AAAA,iBACjB,KAAP,EAAA;AACD,UAAQ,OAAA,CAAA,KAAA,CAAM,CAA0B,uBAAA,EAAA,OAAA,CAAA,CAAA,CAAA,EAAY,KAAK,CAAA,CAAA;AAAA,SAC1D;AAAA,OACD;AAAA,KACD;AAEA,IAAO,OAAA,OAAA,CAAA;AAAA,GACR;AAAA;AAAA,EAGA,MAAM,OAAQ,CAAA,OAAA,EAAiB,MAA+B,EAAA;AAC7D,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AACrC,IAAA,IAAI,CAAC,KAAO,EAAA;AACX,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,MAAA,EAAS,OAAmB,CAAA,UAAA,CAAA,CAAA,CAAA;AAAA,KAC7C;AAEA,IAAA,MAAM,OAA0B,GAAA;AAAA,MAC/B,OAAS,EAAA,KAAA;AAAA,MACT,EAAA,EAAI,KAAK,UAAW,EAAA;AAAA,MACpB,MAAQ,EAAA,UAAA;AAAA,MACR,MAAA,EAAQ,EAAE,MAAO,EAAA;AAAA,KAClB,CAAA;AAEA,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,KAAA,CAAM,QAAU,EAAA;AAAA,MAC5C,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACR,cAAgB,EAAA,kBAAA;AAAA,QAChB,GAAI,KAAM,CAAA,SAAA,IAAa,EAAE,aAAe,EAAA,CAAA,OAAA,EAAU,MAAM,SAAY,CAAA,CAAA,EAAA;AAAA,OACrE;AAAA,MACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA,KAC5B,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAe,YAAA,EAAA,QAAA,CAAS,MAAQ,CAAA,CAAA,CAAA,CAAA;AAAA,KACjD;AAEA,IAAM,MAAA,IAAA,GAAO,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AAEjC,IAAA,IAAI,KAAK,KAAO,EAAA;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAc,WAAA,EAAA,IAAA,CAAK,MAAM,OAAS,CAAA,CAAA,CAAA,CAAA;AAAA,KACnD;AAEA,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACb;AAAA;AAAA,EAGA,MAAM,UAAW,CAAA,OAAA,EAAiB,MAA+B,EAAA;AAChE,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AACrC,IAAA,IAAI,CAAC,KAAO,EAAA;AACX,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,MAAA,EAAS,OAAmB,CAAA,UAAA,CAAA,CAAA,CAAA;AAAA,KAC7C;AAEA,IAAA,MAAM,OAA0B,GAAA;AAAA,MAC/B,OAAS,EAAA,KAAA;AAAA,MACT,EAAA,EAAI,KAAK,UAAW,EAAA;AAAA,MACpB,MAAQ,EAAA,aAAA;AAAA,MACR,MAAA,EAAQ,EAAE,MAAO,EAAA;AAAA,KAClB,CAAA;AAEA,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,KAAA,CAAM,QAAU,EAAA;AAAA,MAC5C,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACR,cAAgB,EAAA,kBAAA;AAAA,QAChB,GAAI,KAAM,CAAA,SAAA,IAAa,EAAE,aAAe,EAAA,CAAA,OAAA,EAAU,MAAM,SAAY,CAAA,CAAA,EAAA;AAAA,OACrE;AAAA,MACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA,KAC5B,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAe,YAAA,EAAA,QAAA,CAAS,MAAQ,CAAA,CAAA,CAAA,CAAA;AAAA,KACjD;AAEA,IAAM,MAAA,IAAA,GAAO,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AAEjC,IAAA,IAAI,KAAK,KAAO,EAAA;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAc,WAAA,EAAA,IAAA,CAAK,MAAM,OAAS,CAAA,CAAA,CAAA,CAAA;AAAA,KACnD;AAAA,GACD;AAAA;AAAA,EAGQ,UAAqB,GAAA;AAC5B,IAAA,OAAO,CAAO,IAAA,EAAA,IAAA,CAAK,GAAI,EAAA,CAAA,CAAA,EAAK,IAAK,CAAA,MAAA,EAAS,CAAA,QAAA,CAAS,EAAE,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAA,CAAA,CAAA,CAAA;AAAA,GACnE;AAAA;AAAA,EAGA,OAAO,uBAAwB,CAAA,YAAA,EAAsB,WAAuB,OAAkB,EAAA,OAAA,EAAiB,WAAoB,MAAkE,EAAA;AAEpM,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAE9C,IAAA,MAAM,aAAa,IAAK,CAAA,QAAA,CAAS,kBAAmB,CAAA,aAAa,CAAC,CAAC,CAAA,CAAA;AAEnE,IAAA,MAAM,OAA0B,GAAA;AAAA,MAC/B,OAAS,EAAA,KAAA;AAAA,MACT,EAAA,EAAI,KAAK,UAAW,EAAA;AAAA,MACpB,MAAQ,EAAA,gBAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACP,OAAA;AAAA,QACA,SAAA;AAAA,OACD;AAAA,KACD,CAAA;AAEA,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,YAAc,EAAA;AAAA,MAC1C,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACR,cAAgB,EAAA,kBAAA;AAAA,QAChB,MAAQ,EAAA,mBAAA;AAAA,QACR,cAAgB,EAAA,UAAA;AAAA;AAAA;AAAA,QAGhB,GAAG,OAAA;AAAA,OACJ;AAAA,MACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MAC5B,MAAA;AAAA,KACA,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAe,YAAA,EAAA,QAAA,CAAS,MAAQ,CAAA,CAAA,CAAA,CAAA;AAAA,KACjD;AAEA,IAAI,IAAA,CAAC,SAAS,IAAM,EAAA;AACnB,MAAM,MAAA,IAAI,MAAM,kBAAkB,CAAA,CAAA;AAAA,KACnC;AAEA,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,IAAA,CAAK,SAAU,EAAA,CAAA;AACvC,IAAM,MAAA,OAAA,GAAU,IAAI,WAAY,EAAA,CAAA;AAChC,IAAA,IAAI,MAAS,GAAA,EAAA,CAAA;AAEb,IAAI,IAAA;AACH,MAAA,OAAO,IAAM,EAAA;AAEZ,QAAA,IAAI,iCAAQ,OAAS,EAAA;AACpB,UAAA,OAAA;AAAA,SACD;AAEA,QAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,MAAM,OAAO,IAAK,EAAA,CAAA;AAC1C,QAAI,IAAA,IAAA;AAAM,UAAA,MAAA;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAO,CAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA,CAAA;AAChD,QAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAC/B,QAAS,MAAA,GAAA,KAAA,CAAM,KAAS,IAAA,EAAA,CAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACzB,UAAM,MAAA,OAAA,GAAU,KAAK,IAAK,EAAA,CAAA;AAC1B,UAAI,IAAA,OAAA,CAAQ,UAAW,CAAA,QAAQ,CAAG,EAAA;AACjC,YAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAC5B,YAAA,IAAI,IAAS,KAAA,QAAA;AAAU,cAAA,OAAA;AAEvB,YAAI,IAAA;AACH,cAAM,MAAA,KAAA,GAAqB,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAC1C,cAAM,MAAA,KAAA,CAAA;AAAA,qBACE,CAAP,EAAA;AACD,cAAQ,OAAA,CAAA,IAAA,CAAK,6BAA6B,IAAI,CAAA,CAAA;AAAA,aAC/C;AAAA,WACD;AAAA,SACD;AAAA,OACD;AAAA,KACC,SAAA;AACD,MAAA,MAAA,CAAO,WAAY,EAAA,CAAA;AAAA,KACpB;AAAA,GACD;AACD,CAAA;AAGa,MAAA,UAAA,GAAa,IAAI,UAAW;;;;;"}
1
+ {"version":3,"file":"a2aService.js","sources":["../../../../../../packages/components/touchchat/utils/a2aService.ts"],"sourcesContent":["import type { AgentConfig, Message, JSONRPCRequest, StreamChunk, Task, AgentCard, SubAgent, TextPart } from '../src/types/a2a'\r\nimport type { ModuleItem } from '../../../../packages/components/touchchat/src/AiChat/Chat/types'\r\n// @/types/a2a\r\n\r\nconst extractSSEData = (line: string): string | null => {\r\n\tconst trimmed = line.trim()\r\n\tif (!trimmed) return null\r\n\tif (trimmed.startsWith('data:')) {\r\n\t\treturn trimmed.substring(5).trim()\r\n\t}\r\n\tif (!trimmed.startsWith(':') && !trimmed.startsWith('event:') && !trimmed.startsWith('id:') && trimmed.startsWith('{')) {\r\n\t\treturn trimmed\r\n\t}\r\n\treturn null\r\n}\r\n\r\nconst parseErrorFromResponseBody = (errorBody: string): string | null => {\r\n\tconst trimmed = errorBody.trim()\r\n\tif (!trimmed) return null\r\n\r\n\tconst sseData = extractSSEData(trimmed)\r\n\tconst jsonText = sseData || trimmed\r\n\r\n\ttry {\r\n\t\tconst errorData = JSON.parse(jsonText)\r\n\t\tif (errorData.error?.message) {\r\n\t\t\treturn errorData.error.message\r\n\t\t}\r\n\t} catch {\r\n\t\t// ignore parse errors\r\n\t}\r\n\r\n\treturn null\r\n}\r\n\r\n// A2A Service - Handles communication with A2A agents\r\nexport class A2AService {\r\n\tprivate agents: Map<string, AgentConfig> = new Map()\r\n\r\n\t// Register an agent\r\n\tregisterAgent(config: AgentConfig): void {\r\n\t\tthis.agents.set(config.id, config)\r\n\t}\r\n\r\n\t// Unregister an agent\r\n\tunregisterAgent(agentId: string): void {\r\n\t\tthis.agents.delete(agentId)\r\n\t}\r\n\r\n\t// Get registered agent\r\n\tgetAgent(agentId: string): AgentConfig | undefined {\r\n\t\treturn this.agents.get(agentId)\r\n\t}\r\n\r\n\t// Get all registered agents\r\n\tgetAllAgents(): AgentConfig[] {\r\n\t\treturn Array.from(this.agents.values())\r\n\t}\r\n\r\n\t// Fetch agent card (agent discovery)\r\n\tasync fetchAgentCard(url: string): Promise<AgentCard> {\r\n\t\tconst response = await fetch(url, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\theaders: {\r\n\t\t\t\tAccept: 'application/json'\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`Failed to fetch agent card: ${response.statusText}`)\r\n\t\t}\r\n\r\n\t\treturn response.json()\r\n\t}\r\n\r\n\t// Send message to agent (non-streaming)\r\n\tasync sendMessage(agentId: string, message: Message, sessionId?: string): Promise<Task> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tconst streamRequest = this.buildA2AStreamRequest(message, sessionId)\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\t...streamRequest,\r\n\t\t\tmethod: 'message/send'\r\n\t\t} as JSONRPCRequest\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tconst data = await response.json()\r\n\r\n\t\tif (data.error) {\r\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\r\n\t\t}\r\n\r\n\t\treturn data.result as Task\r\n\t}\r\n\r\n\t// Stream message to agent (for streaming responses)\r\n\tasync streamMessage(agentId: string, message: Message, sessionId?: string, signal?: AbortSignal, modules?: ModuleItem[]): Promise<ReadableStream<StreamChunk>> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tlet headers: Record<string, string> = {\r\n\t\t\t'Content-Type': 'application/json',\r\n\t\t\tAccept: 'text/event-stream',\r\n\t\t\t...(agent.authToken ? { Authorization: `Bearer ${agent.authToken}` } : {})\r\n\t\t}\r\n\r\n\t\tconst requestBody: Record<string, unknown> = this.buildA2AStreamRequest(message, sessionId)\r\n\r\n\t\t// modules 仅用于补充请求头(如 Authorization),不再覆盖 A2A 请求体\r\n\t\tif (modules && modules.length > 0 && typeof modules[0] === 'object' && modules[0] !== null && modules[0].config) {\r\n\t\t\tconst customConfig = modules[0].config\r\n\t\t\tif (typeof customConfig.headers === 'function') {\r\n\t\t\t\theaders = {\r\n\t\t\t\t\t...headers,\r\n\t\t\t\t\t...customConfig.headers()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst body = JSON.stringify(requestBody)\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders,\r\n\t\t\tbody,\r\n\t\t\tsignal\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tconst errorBody = await response.text()\r\n\t\t\tconst errorMessage = parseErrorFromResponseBody(errorBody)\r\n\t\t\tthrow new Error(errorMessage || errorBody || `HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tif (!response.body) {\r\n\t\t\tthrow new Error('No response body')\r\n\t\t}\r\n\r\n\t\treturn this.createSSEReadableStream(response.body, signal)\r\n\t}\r\n\r\n\t// Multi-agent message routing\r\n\tasync routeMessage(agentIds: string[], message: Message, mode: 'sequential' | 'parallel' = 'sequential'): Promise<Map<string, Task>> {\r\n\t\tconst results = new Map<string, Task>()\r\n\r\n\t\tif (mode === 'parallel') {\r\n\t\t\tconst promises = agentIds.map(async agentId => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\r\n\t\t\t\t\treturn { agentId, task, error: null }\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\treturn { agentId, task: null, error }\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tconst settled = await Promise.all(promises)\r\n\t\t\tfor (const { agentId, task, error } of settled) {\r\n\t\t\t\tif (task) {\r\n\t\t\t\t\tresults.set(agentId, task)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Sequential\r\n\t\t\tfor (const agentId of agentIds) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst task = await this.sendMessage(agentId, message)\r\n\t\t\t\t\tresults.set(agentId, task)\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.error(`Error sending to agent ${agentId}:`, error)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn results\r\n\t}\r\n\r\n\t// Get task status\r\n\tasync getTask(agentId: string, taskId: string): Promise<Task> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'task/get',\r\n\t\t\tparams: { taskId }\r\n\t\t}\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tconst data = await response.json()\r\n\r\n\t\tif (data.error) {\r\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\r\n\t\t}\r\n\r\n\t\treturn data.result as Task\r\n\t}\r\n\r\n\t// Cancel task\r\n\tasync cancelTask(agentId: string, taskId: string): Promise<void> {\r\n\t\tconst agent = this.agents.get(agentId)\r\n\t\tif (!agent) {\r\n\t\t\tthrow new Error(`Agent ${agentId} not found`)\r\n\t\t}\r\n\r\n\t\tconst request: JSONRPCRequest = {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'task/cancel',\r\n\t\t\tparams: { taskId }\r\n\t\t}\r\n\r\n\t\tconst response = await fetch(agent.endpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t...(agent.authToken && { Authorization: `Bearer ${agent.authToken}` })\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tconst data = await response.json()\r\n\r\n\t\tif (data.error) {\r\n\t\t\tthrow new Error(`A2A error: ${data.error.message}`)\r\n\t\t}\r\n\t}\r\n\r\n\t// Generate unique ID\r\n\tprivate generateId(): string {\r\n\t\treturn `req-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\r\n\t}\r\n\r\n\tprivate getMessageText(message: Message): string {\r\n\t\treturn message.parts\r\n\t\t\t.filter((part): part is TextPart => part.type === 'text')\r\n\t\t\t.map(part => part.text)\r\n\t\t\t.join('')\r\n\t}\r\n\r\n\tprivate buildA2AStreamRequest(message: Message, sessionId?: string): Record<string, unknown> {\r\n\t\tconst text = this.getMessageText(message)\r\n\t\tconst params: Record<string, unknown> = {\r\n\t\t\tmessage: {\r\n\t\t\t\trole: message.role,\r\n\t\t\t\tparts: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tkind: 'data',\r\n\t\t\t\t\t\tdata: {\r\n\t\t\t\t\t\t\trole: message.role,\r\n\t\t\t\t\t\t\tcontent_type: 'text',\r\n\t\t\t\t\t\t\tcontent: text\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t],\r\n\t\t\t\tmessageId: message.messageId,\r\n\t\t\t\tkind: 'message'\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (sessionId) {\r\n\t\t\tparams.sessionId = sessionId\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tjsonrpc: '2.0',\r\n\t\t\tid: this.generateId(),\r\n\t\t\tmethod: 'message/stream',\r\n\t\t\tparams\r\n\t\t}\r\n\t}\r\n\r\n\tprivate createSSEReadableStream(responseBody: ReadableStream<Uint8Array>, signal?: AbortSignal): ReadableStream<StreamChunk> {\r\n\t\treturn new ReadableStream<StreamChunk>({\r\n\t\t\tasync start(controller) {\r\n\t\t\t\tconst reader = responseBody.getReader()\r\n\t\t\t\tconst decoder = new TextDecoder()\r\n\t\t\t\tlet buffer = ''\r\n\t\t\t\tlet streamClosed = false\r\n\r\n\t\t\t\tconst closeStream = () => {\r\n\t\t\t\t\tif (!streamClosed) {\r\n\t\t\t\t\t\tstreamClosed = true\r\n\t\t\t\t\t\tcontroller.close()\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst handleSSEData = async (data: string) => {\r\n\t\t\t\t\tif (data === '[DONE]') {\r\n\t\t\t\t\t\tcloseStream()\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst trimmedData = data.trim()\r\n\t\t\t\t\tif (!trimmedData) return\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tconst chunk: StreamChunk = JSON.parse(trimmedData)\r\n\t\t\t\t\t\tcontroller.enqueue(chunk)\r\n\t\t\t\t\t\tif (chunk.error) {\r\n\t\t\t\t\t\t\tcloseStream()\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', trimmedData)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst processBuffer = async (flushRemaining = false) => {\r\n\t\t\t\t\tif (flushRemaining && buffer.trim()) {\r\n\t\t\t\t\t\tconst data = extractSSEData(buffer)\r\n\t\t\t\t\t\tif (data) {\r\n\t\t\t\t\t\t\tawait handleSSEData(data)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbuffer = ''\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst lines = buffer.split('\\n')\r\n\t\t\t\t\tbuffer = lines.pop() || ''\r\n\r\n\t\t\t\t\tfor (const line of lines) {\r\n\t\t\t\t\t\tconst data = extractSSEData(line)\r\n\t\t\t\t\t\tif (data) {\r\n\t\t\t\t\t\t\tawait handleSSEData(data)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (signal) {\r\n\t\t\t\t\tsignal.addEventListener('abort', () => {\r\n\t\t\t\t\t\tcloseStream()\r\n\t\t\t\t\t\treader.cancel()\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\twhile (!streamClosed) {\r\n\t\t\t\t\t\tif (signal?.aborted) {\r\n\t\t\t\t\t\t\tcloseStream()\r\n\t\t\t\t\t\t\treturn\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst { done, value } = await reader.read()\r\n\t\t\t\t\t\tif (done) {\r\n\t\t\t\t\t\t\tbuffer += decoder.decode()\r\n\t\t\t\t\t\t\tawait processBuffer(true)\r\n\t\t\t\t\t\t\tcloseStream()\r\n\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbuffer += decoder.decode(value, { stream: true })\r\n\t\t\t\t\t\tawait processBuffer()\r\n\t\t\t\t\t}\r\n\t\t\t\t} finally {\r\n\t\t\t\t\treader.releaseLock()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t// Multi-agent streaming message\r\n\tasync *streamMultiAgentMessage(hostEndpoint: string, subAgents: SubAgent[], message: Message, headers: object, sessionId?: string, signal?: AbortSignal): AsyncGenerator<StreamChunk, void, unknown> {\r\n\t\t// Build X-Sub-Agents headers: JSON array -> Base64\r\n\t\tconst subAgentsJson = JSON.stringify(subAgents)\r\n\t\t// Use Unicode-safe Base64 encoding\r\n\t\tconst xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)))\r\n\r\n\t\tconst request = this.buildA2AStreamRequest(message, sessionId)\r\n\r\n\t\tconst response = await fetch(hostEndpoint, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\tAccept: 'text/event-stream',\r\n\t\t\t\t'X-Sub-Agents': xSubAgents,\r\n\t\t\t\t// 'ai-jwt-token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhc2lhaW5mby5jb20iLCJzdWIiOiJkZW5nd2FuIiwiYXVkIjoiY29tLmFpZi5wYWFzLndlYlRva2VuIiwidXNlckluZm8iOiJ7XCJhbGlhc1wiOlwiZGVuZ3dhblwiLFwiYXV0b2luXCI6ZmFsc2UsXCJlbnZDb2RlXCI6XCJQUk9EXCIsXCJlbnZOYW1lXCI6XCLnlJ_kuqfnjq_looNcIixcImxhbmd1YWdlXCI6XCJ6aFwiLFwicGVybWlzc2lvbnNcIjpbXCJcIixcInBvcnRhbDpzeXN0ZW06cm9sZTpiaW5kXCIsXCJwb3J0YWw6ZGljdGlvbmFyeTpkYXRhOmFkZFwiLG51bGwsXCJhZ2VudFwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTp1cGRhdGVcIixcImF1ZGl0TG9nL2xpc3RBdWRpdExvZ1wiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGF0YTpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW06dXNlcjp1cGRhdGVcIixcInBvcnRhbDptY3A6YXVkaXRcIixcInBvcnRhbDptY3A6c2FmZWF1ZGl0XCIsXCJwb3J0YWw6bWNwOnRvb2xjb25maXJtXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDphZGRcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnJlbGF0aW9uXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpwZXJtaXNzaW9uXCIsXCJwb3J0YWw6c3lzdGVtUGFyYW1ldGVyOmRlbGV0ZVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6dXBkYXRlXCIsXCJwb3J0YWw6c3lzdGVtOnJvbGU6YWRkXCIsXCJ0ZW5hbnQvZ2V0VGVuYW50RHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOnVwZGF0ZVwiLFwicG9ydGFsOmFnZW50OmF1ZGl0XCIsXCJwb3J0YWw6bm90aWNlOnVwZGF0ZVwiLFwicG9ydGFsOnN5c3RlbTpyb2xlOmRlbGV0ZVwiLFwicG9ydGFsOnN5c3RlbTp1c2VyOmFkZFwiLFwibWVudS9nZXRNZW51QnlQYXJhbVwiLFwicG9ydGFsOmRpY3Rpb25hcnk6ZGVsZXRlXCIsXCJwb3J0YWw6c3lzdGVtOm9wZXJhdGlvbjpkZWxldGVcIixcInVzZXIvcXVlcnlVc2VyRHRvTGlzdFwiLFwicG9ydGFsOnN5c3RlbTptZW51OmFkZFwiLFwicG9ydGFsOnN5c3RlbVBhcmFtZXRlcjp1cGRhdGVcIixcInBvcnRhbDphZ2VudDptb2RlbGNoZWNrXCIsXCJwb3J0YWw6c3lzdGVtOm1lbnU6dXBkYXRlXCIsXCJyb2xlL3F1ZXJ5Um9sZUxpc3RcIixcInBvcnRhbDpzeXN0ZW06bWVudTpkZWxldGVcIixcInBvcnRhbDpub3RpY2U6YWRkXCIsXCJwb3J0YWw6c3lzdGVtOnRlbmFudDpkZWxldGVcIixcInBvcnRhbDpzeXN0ZW1QYXJhbWV0ZXI6YWRkXCIsXCJyb2xlUGVybWlzc2lvbnMvcXVlcnlNZW51UGVybWlzc2lvbkxpc3RcIixcInBvcnRhbDpzeXN0ZW06dGVuYW50OnVwZGF0ZVwiLFwibm90aWNlL2xpc3ROb3RpY2VcIl0sXCJwbGF0Zm9ybU1hbmFnZXJcIjp0cnVlLFwicm9sZUxpc3RcIjpbe1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwiY2FwX3Byb3ZpZGVyXCIsXCJyb2xlSWRcIjoxMixcInJvbGVOYW1lXCI6XCLog73lipvmj5DkvpvogIVcIixcInJvbGVUeXBlXCI6MX0se1wiY3JlYXRlVGltZVwiOlwiMjAyNi0wMy0wMSAwMDowMDowMFwiLFwiaGFzRWRpdFwiOjEsXCJyb2xlQ29kZVwiOlwidGVuYW50X2FkbWluXCIsXCJyb2xlSWRcIjo4LFwicm9sZU5hbWVcIjpcIuenn-aIt-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfSx7XCJjcmVhdGVUaW1lXCI6XCIyMDIyLTA2LTI4IDAwOjAwOjAwXCIsXCJoYXNFZGl0XCI6MSxcInJvbGVDb2RlXCI6XCJyb2xlX2FkbWluXCIsXCJyb2xlSWRcIjoxLFwicm9sZU5hbWVcIjpcIui2hee6p-euoeeQhuWRmFwiLFwicm9sZVR5cGVcIjoxfV0sXCJ0ZW5hbnRDb2RlXCI6XCJ0ZW5hbnQtb25lXCIsXCJ0ZW5hbnRJZFwiOjUsXCJ0ZW5hbnROYW1lXCI6XCLkuIDnuqfov5DokKXnqbrpl7RcIixcInVzZXJJZFwiOjYsXCJ1c2VyTmFtZVwiOlwiZGVuZ3dhblwifSIsImV4cCI6MTc3Mzk5ODEzN30.7P8WVl3ji1G2unk0wOISJbF43ilcuzksOdSOQJNHGXM'\r\n\t\t\t\t// 'ai-jwt-token': authToken\r\n\t\t\t\t...headers\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(request),\r\n\t\t\tsignal\r\n\t\t})\r\n\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP error: ${response.status}`)\r\n\t\t}\r\n\r\n\t\tif (!response.body) {\r\n\t\t\tthrow new Error('No response body')\r\n\t\t}\r\n\r\n\t\tconst reader = response.body.getReader()\r\n\t\tconst decoder = new TextDecoder()\r\n\t\tlet buffer = ''\r\n\r\n\t\tconst processBuffer = function* (flushRemaining = false): Generator<StreamChunk, boolean, unknown> {\r\n\t\t\tif (flushRemaining && buffer.trim()) {\r\n\t\t\t\tconst data = extractSSEData(buffer)\r\n\t\t\t\tbuffer = ''\r\n\t\t\t\tif (data && data !== '[DONE]') {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tyield JSON.parse(data) as StreamChunk\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn data === '[DONE]'\r\n\t\t\t}\r\n\r\n\t\t\tconst lines = buffer.split('\\n')\r\n\t\t\tbuffer = lines.pop() || ''\r\n\r\n\t\t\tfor (const line of lines) {\r\n\t\t\t\tconst data = extractSSEData(line)\r\n\t\t\t\tif (!data) continue\r\n\t\t\t\tif (data === '[DONE]') return true\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tyield JSON.parse(data) as StreamChunk\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tconsole.warn('Failed to parse SSE data:', data)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\twhile (true) {\r\n\t\t\t\tif (signal?.aborted) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst { done, value } = await reader.read()\r\n\t\t\t\tif (done) {\r\n\t\t\t\t\tbuffer += decoder.decode()\r\n\t\t\t\t\tfor (const chunk of processBuffer(true)) {\r\n\t\t\t\t\t\tyield chunk\r\n\t\t\t\t\t\tif (chunk.error) return\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbuffer += decoder.decode(value, { stream: true })\r\n\t\t\t\tfor (const chunk of processBuffer()) {\r\n\t\t\t\t\tyield chunk\r\n\t\t\t\t\tif (chunk.error) return\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\treader.releaseLock()\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// Singleton instance\r\nexport const a2aService = new A2AService()\r\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chatRobot.js","sources":["../../../../../../packages/components/touchchat/utils/chatRobot.ts"],"sourcesContent":["// // 假设 Socket 和 SOCKET_STATUS 的类型定义如下,实际可能需要根据 socket.ts 文件调整\nimport { Socket, SOCKET_STATUS } from './socket';\n// 修改iSocket接口定义\ninterface iSocket {\n status: string;\n connect: (arg: boolean) => Promise<boolean>; // 修改为返回Promise<boolean>\n close: () => void;\n send: (data: string | object | Blob | ArrayBuffer, sendType?: 'text' | 'binary') => Promise<void>; // 更新参数和返回类型\n}\n\n// type SOCKET_STATUS = {\n// CONNECTED: string;\n// };\n\ntype Listener = {\n msgCallback: (data: any) => void;\n statusCallback?: (status: string) => void;\n};\n\ntype ChatConfig = {\n token: string;\n wsUrl: string;\n otherChatData?: Record<string, any>;\n};\n\n// 由于 Vue 未在项目结构中找到,这里简化处理\ninterface VuePrototype {\n $uuid: () => string;\n}\n\ndeclare global {\n interface Location {\n readonly origin: string; // 添加readonly修饰符\n }\n}\n\nclass ChatRobot {\n chatSocket: iSocket | null = null;\n chatId: string;\n chatOrder: number = 0;\n status: string | null = null;\n token: string;\n listeners: Map<string, Listener[]> = new Map();\n config: ChatConfig;\n\n constructor(config: ChatConfig) {\n // 假设 Vue 存在且有 $uuid 方法\n const mockVue: { prototype: VuePrototype } = {\n prototype: {\n $uuid: () => 'mock-uuid-123',\n },\n };\n this.chatId = mockVue.prototype.$uuid().replace(/-/gi, '');\n this.config = { ...config };\n this.token = config.token;\n }\n\n connect() {\n let origin = (window.location as any).origin || 'http://localhost';\n\n if (origin.indexOf('http') > -1) {\n origin = origin.replace('http', 'ws');\n } else if (origin.indexOf('https') > -1) {\n origin = origin.replace('https', 'wss');\n }\n\n // 假设 Socket 构造函数签名如下\n this.chatSocket = new Socket(\n `${origin}/websocket`,\n // `${this.config.wsUrl}`,\n this.chatMsgCallback.bind(this),\n this.chatStatusCallback.bind(this),\n this\n );\n this.chatSocket.connect(true);\n }\n\n close() {\n if (this.chatSocket) {\n this.chatSocket.close();\n }\n }\n\n chatMsgCallback(msg: any) {\n if (typeof msg !== 'object' || !msg.type) return;\n\n const callbacks = this.listeners.get(msg.type);\n if (callbacks) {\n callbacks.forEach(callback => {\n try {\n callback.msgCallback(msg.data ? msg.data : msg);\n } catch (e) {\n console.error(e);\n }\n });\n }\n }\n\n chatStatusCallback(status: string) {\n this.status = status;\n // 连接成功后,发送此指令\n if (status === SOCKET_STATUS.CONNECTED) {\n let baseInfo = { chatId: this.chatId, accessToken: this.token, chatType: 'switchHistory' };\n\n if (this.config && this.config.otherChatData) {\n baseInfo = { ...baseInfo, ...this.config.otherChatData };\n }\n if (this.chatSocket) {\n this.chatSocket.send(baseInfo, 'text');\n }\n }\n this.listeners.forEach(callbacks => {\n callbacks.forEach(callback => {\n if (callback.statusCallback) {\n try {\n callback.statusCallback(status);\n } catch (e) {\n console.error('statusCallback回调异常', e);\n }\n }\n });\n });\n }\n\n addListener(msgType: string, listener: Listener) {\n if (!this.listeners.has(msgType)) {\n this.listeners.set(msgType, []);\n }\n this.listeners.get(msgType)?.push(listener);\n }\n\n removeListener() {\n // listener: Listener\n console.log(this.listeners);\n // this.listeners.forEach((value) => {\n // const index = value.indexOf(listener);\n // if (index !== -1) {\n // value.splice(index, 1);\n // }\n // });\n }\n\n send(chatInfo: any, chatType: string = 'request') {\n if (!this.chatSocket || this.chatSocket.status !== 'connected') {\n throw new Error('网络连接失败,请检查网络');\n }\n try {\n let chatData = {\n chatId: this.chatId,\n accessToken: this.token,\n chatType: 'request',\n chatOrder: chatType === 'request' ? ++this.chatOrder : undefined,\n chatInfo,\n };\n if (this.config && this.config.otherChatData) {\n chatData = { ...chatData, ...this.config.otherChatData };\n }\n this.chatSocket.send(chatData, 'text');\n } catch (e) {\n if (e instanceof Error) {\n throw new Error('消息组织失败,请刷新');\n }\n }\n }\n}\n\nexport { ChatRobot };\n"],"names":["Socket","SOCKET_STATUS"],"mappings":"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"}
1
+ {"version":3,"file":"chatRobot.js","sources":["../../../../../../packages/components/touchchat/utils/chatRobot.ts"],"sourcesContent":["// // 假设 Socket 和 SOCKET_STATUS 的类型定义如下,实际可能需要根据 socket.ts 文件调整\r\nimport { Socket, SOCKET_STATUS } from './socket';\r\n// 修改iSocket接口定义\r\ninterface iSocket {\r\n status: string;\r\n connect: (arg: boolean) => Promise<boolean>; // 修改为返回Promise<boolean>\r\n close: () => void;\r\n send: (data: string | object | Blob | ArrayBuffer, sendType?: 'text' | 'binary') => Promise<void>; // 更新参数和返回类型\r\n}\r\n\r\n// type SOCKET_STATUS = {\r\n// CONNECTED: string;\r\n// };\r\n\r\ntype Listener = {\r\n msgCallback: (data: any) => void;\r\n statusCallback?: (status: string) => void;\r\n};\r\n\r\ntype ChatConfig = {\r\n token: string;\r\n wsUrl: string;\r\n otherChatData?: Record<string, any>;\r\n};\r\n\r\n// 由于 Vue 未在项目结构中找到,这里简化处理\r\ninterface VuePrototype {\r\n $uuid: () => string;\r\n}\r\n\r\ndeclare global {\r\n interface Location {\r\n readonly origin: string; // 添加readonly修饰符\r\n }\r\n}\r\n\r\nclass ChatRobot {\r\n chatSocket: iSocket | null = null;\r\n chatId: string;\r\n chatOrder: number = 0;\r\n status: string | null = null;\r\n token: string;\r\n listeners: Map<string, Listener[]> = new Map();\r\n config: ChatConfig;\r\n\r\n constructor(config: ChatConfig) {\r\n // 假设 Vue 存在且有 $uuid 方法\r\n const mockVue: { prototype: VuePrototype } = {\r\n prototype: {\r\n $uuid: () => 'mock-uuid-123',\r\n },\r\n };\r\n this.chatId = mockVue.prototype.$uuid().replace(/-/gi, '');\r\n this.config = { ...config };\r\n this.token = config.token;\r\n }\r\n\r\n connect() {\r\n let origin = (window.location as any).origin || 'http://localhost';\r\n\r\n if (origin.indexOf('http') > -1) {\r\n origin = origin.replace('http', 'ws');\r\n } else if (origin.indexOf('https') > -1) {\r\n origin = origin.replace('https', 'wss');\r\n }\r\n\r\n // 假设 Socket 构造函数签名如下\r\n this.chatSocket = new Socket(\r\n `${origin}/websocket`,\r\n // `${this.config.wsUrl}`,\r\n this.chatMsgCallback.bind(this),\r\n this.chatStatusCallback.bind(this),\r\n this\r\n );\r\n this.chatSocket.connect(true);\r\n }\r\n\r\n close() {\r\n if (this.chatSocket) {\r\n this.chatSocket.close();\r\n }\r\n }\r\n\r\n chatMsgCallback(msg: any) {\r\n if (typeof msg !== 'object' || !msg.type) return;\r\n\r\n const callbacks = this.listeners.get(msg.type);\r\n if (callbacks) {\r\n callbacks.forEach(callback => {\r\n try {\r\n callback.msgCallback(msg.data ? msg.data : msg);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n });\r\n }\r\n }\r\n\r\n chatStatusCallback(status: string) {\r\n this.status = status;\r\n // 连接成功后,发送此指令\r\n if (status === SOCKET_STATUS.CONNECTED) {\r\n let baseInfo = { chatId: this.chatId, accessToken: this.token, chatType: 'switchHistory' };\r\n\r\n if (this.config && this.config.otherChatData) {\r\n baseInfo = { ...baseInfo, ...this.config.otherChatData };\r\n }\r\n if (this.chatSocket) {\r\n this.chatSocket.send(baseInfo, 'text');\r\n }\r\n }\r\n this.listeners.forEach(callbacks => {\r\n callbacks.forEach(callback => {\r\n if (callback.statusCallback) {\r\n try {\r\n callback.statusCallback(status);\r\n } catch (e) {\r\n console.error('statusCallback回调异常', e);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n addListener(msgType: string, listener: Listener) {\r\n if (!this.listeners.has(msgType)) {\r\n this.listeners.set(msgType, []);\r\n }\r\n this.listeners.get(msgType)?.push(listener);\r\n }\r\n\r\n removeListener() {\r\n // listener: Listener\r\n console.log(this.listeners);\r\n // this.listeners.forEach((value) => {\r\n // const index = value.indexOf(listener);\r\n // if (index !== -1) {\r\n // value.splice(index, 1);\r\n // }\r\n // });\r\n }\r\n\r\n send(chatInfo: any, chatType: string = 'request') {\r\n if (!this.chatSocket || this.chatSocket.status !== 'connected') {\r\n throw new Error('网络连接失败,请检查网络');\r\n }\r\n try {\r\n let chatData = {\r\n chatId: this.chatId,\r\n accessToken: this.token,\r\n chatType: 'request',\r\n chatOrder: chatType === 'request' ? ++this.chatOrder : undefined,\r\n chatInfo,\r\n };\r\n if (this.config && this.config.otherChatData) {\r\n chatData = { ...chatData, ...this.config.otherChatData };\r\n }\r\n this.chatSocket.send(chatData, 'text');\r\n } catch (e) {\r\n if (e instanceof Error) {\r\n throw new Error('消息组织失败,请刷新');\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { ChatRobot };\r\n"],"names":["Socket","SOCKET_STATUS"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deepCloneDom.js","sources":["../../../../../../packages/components/touchchat/utils/deepCloneDom.ts"],"sourcesContent":["/** 核心函数, 对比节点的内容 实现动态更新 markdown 的 div 而不是用 innerHTML 的属性全部刷新 */\n\nexport function deepCloneDom(div1: Node | null, div2: Node | null): void {\n if (!div1 || !div2) {\n return;\n }\n\n // 递归比较和更新 div1 和 div2 的子节点\n function compareAndUpdate(node1: Node | null, node2: Node): void {\n // 情况 1:node1 是文本节点,更新文本内容\n if (node1 && node1.nodeType === Node.TEXT_NODE && node2.nodeType === Node.TEXT_NODE) {\n if (node1.nodeValue !== node2.nodeValue) {\n // 更新文本内容\n node1.nodeValue = node2.nodeValue;\n }\n return;\n }\n\n // 情况 2:node1 和 node2 的标签名不同,替换整个节点\n if (\n !node1 ||\n (node1.nodeType === Node.ELEMENT_NODE &&\n node2.nodeType === Node.ELEMENT_NODE &&\n (node1 as Element).tagName !== (node2 as Element).tagName)\n ) {\n // 克隆 node2 节点\n const newNode = node2.cloneNode(true);\n if (node1 && node1.parentNode) {\n // 替换旧节点\n node1.parentNode.replaceChild(newNode, node1);\n } else if (node2.parentNode) {\n // 如果 node1 不存在,直接新增\n node2.parentNode.appendChild(newNode);\n }\n return;\n }\n\n // 确保 node1 是元素节点再进行属性操作\n if (node1 && node1.nodeType === Node.ELEMENT_NODE && node2.nodeType === Node.ELEMENT_NODE) {\n const element1 = node1 as Element;\n const element2 = node2 as Element;\n\n // 情况 3:节点的 class 或其他属性更新, 注意对root节点的保护\n if (element1.className !== 'article-content' && element1.className !== element2.className) {\n // 3.1 更新 className\n element1.className = element2.className;\n }\n\n // 3.2 对 id 的更新 注意对root节点的保护\n if (element1.id !== 'article-content' && element1.id !== element2.id) {\n element1.id = element2.id;\n }\n\n // 3.3 对 style 的更新\n if ((element1 as HTMLElement).style.cssText !== (element2 as HTMLElement).style.cssText) {\n (element1 as HTMLElement).style.cssText = (element2 as HTMLElement).style.cssText;\n }\n }\n\n // 情况 4:递归对比和更新子节点\n const children1 = node1 ? Array.from(node1.childNodes) : []; // node1 的所有子节点\n const children2 = Array.from(node2.childNodes); // node2 的所有子节点\n\n // 遍历 node2 的子节点,逐个与 node1 的对应子节点比较\n children2.forEach((child2, index) => {\n const child1 = children1[index];\n if (!child1) {\n // 如果 child1 不存在,直接克隆 child2 并添加到 node1\n const newChild = child2.cloneNode(true);\n if (node1 && node1.nodeType === Node.ELEMENT_NODE) {\n node1.appendChild(newChild);\n }\n } else {\n // 如果 child1 存在,递归比较和更新\n compareAndUpdate(child1, child2);\n }\n });\n\n // 删除 node1 中多余的子节点\n if (children1.length > children2.length) {\n for (let i = children2.length; i < children1.length; i++) {\n if (node1) {\n node1.removeChild(children1[i]);\n }\n }\n }\n }\n\n // 从 div2 根节点开始与 div1 比较\n compareAndUpdate(div1, div2);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deepCloneDom.js","sources":["../../../../../../packages/components/touchchat/utils/deepCloneDom.ts"],"sourcesContent":["/** 核心函数, 对比节点的内容 实现动态更新 markdown 的 div 而不是用 innerHTML 的属性全部刷新 */\r\n\r\nexport function deepCloneDom(div1: Node | null, div2: Node | null): void {\r\n if (!div1 || !div2) {\r\n return;\r\n }\r\n\r\n // 递归比较和更新 div1 和 div2 的子节点\r\n function compareAndUpdate(node1: Node | null, node2: Node): void {\r\n // 情况 1:node1 是文本节点,更新文本内容\r\n if (node1 && node1.nodeType === Node.TEXT_NODE && node2.nodeType === Node.TEXT_NODE) {\r\n if (node1.nodeValue !== node2.nodeValue) {\r\n // 更新文本内容\r\n node1.nodeValue = node2.nodeValue;\r\n }\r\n return;\r\n }\r\n\r\n // 情况 2:node1 和 node2 的标签名不同,替换整个节点\r\n if (\r\n !node1 ||\r\n (node1.nodeType === Node.ELEMENT_NODE &&\r\n node2.nodeType === Node.ELEMENT_NODE &&\r\n (node1 as Element).tagName !== (node2 as Element).tagName)\r\n ) {\r\n // 克隆 node2 节点\r\n const newNode = node2.cloneNode(true);\r\n if (node1 && node1.parentNode) {\r\n // 替换旧节点\r\n node1.parentNode.replaceChild(newNode, node1);\r\n } else if (node2.parentNode) {\r\n // 如果 node1 不存在,直接新增\r\n node2.parentNode.appendChild(newNode);\r\n }\r\n return;\r\n }\r\n\r\n // 确保 node1 是元素节点再进行属性操作\r\n if (node1 && node1.nodeType === Node.ELEMENT_NODE && node2.nodeType === Node.ELEMENT_NODE) {\r\n const element1 = node1 as Element;\r\n const element2 = node2 as Element;\r\n\r\n // 情况 3:节点的 class 或其他属性更新, 注意对root节点的保护\r\n if (element1.className !== 'article-content' && element1.className !== element2.className) {\r\n // 3.1 更新 className\r\n element1.className = element2.className;\r\n }\r\n\r\n // 3.2 对 id 的更新 注意对root节点的保护\r\n if (element1.id !== 'article-content' && element1.id !== element2.id) {\r\n element1.id = element2.id;\r\n }\r\n\r\n // 3.3 对 style 的更新\r\n if ((element1 as HTMLElement).style.cssText !== (element2 as HTMLElement).style.cssText) {\r\n (element1 as HTMLElement).style.cssText = (element2 as HTMLElement).style.cssText;\r\n }\r\n }\r\n\r\n // 情况 4:递归对比和更新子节点\r\n const children1 = node1 ? Array.from(node1.childNodes) : []; // node1 的所有子节点\r\n const children2 = Array.from(node2.childNodes); // node2 的所有子节点\r\n\r\n // 遍历 node2 的子节点,逐个与 node1 的对应子节点比较\r\n children2.forEach((child2, index) => {\r\n const child1 = children1[index];\r\n if (!child1) {\r\n // 如果 child1 不存在,直接克隆 child2 并添加到 node1\r\n const newChild = child2.cloneNode(true);\r\n if (node1 && node1.nodeType === Node.ELEMENT_NODE) {\r\n node1.appendChild(newChild);\r\n }\r\n } else {\r\n // 如果 child1 存在,递归比较和更新\r\n compareAndUpdate(child1, child2);\r\n }\r\n });\r\n\r\n // 删除 node1 中多余的子节点\r\n if (children1.length > children2.length) {\r\n for (let i = children2.length; i < children1.length; i++) {\r\n if (node1) {\r\n node1.removeChild(children1[i]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 从 div2 根节点开始与 div1 比较\r\n compareAndUpdate(div1, div2);\r\n}\r\n"],"names":[],"mappings":";;AAEgB,SAAA,YAAA,CAAa,MAAmB,IAAyB,EAAA;AACvE,EAAI,IAAA,CAAC,IAAQ,IAAA,CAAC,IAAM,EAAA;AAClB,IAAA,OAAA;AAAA,GACF;AAGA,EAAS,SAAA,gBAAA,CAAiB,OAAoB,KAAmB,EAAA;AAE/D,IAAI,IAAA,KAAA,IAAS,MAAM,QAAa,KAAA,IAAA,CAAK,aAAa,KAAM,CAAA,QAAA,KAAa,KAAK,SAAW,EAAA;AACnF,MAAI,IAAA,KAAA,CAAM,SAAc,KAAA,KAAA,CAAM,SAAW,EAAA;AAEvC,QAAA,KAAA,CAAM,YAAY,KAAM,CAAA,SAAA,CAAA;AAAA,OAC1B;AACA,MAAA,OAAA;AAAA,KACF;AAGA,IAAA,IACE,CAAC,KAAA,IACA,KAAM,CAAA,QAAA,KAAa,IAAK,CAAA,YAAA,IACvB,KAAM,CAAA,QAAA,KAAa,IAAK,CAAA,YAAA,IACvB,KAAkB,CAAA,OAAA,KAAa,MAAkB,OACpD,EAAA;AAEA,MAAM,MAAA,OAAA,GAAU,KAAM,CAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AACpC,MAAI,IAAA,KAAA,IAAS,MAAM,UAAY,EAAA;AAE7B,QAAM,KAAA,CAAA,UAAA,CAAW,YAAa,CAAA,OAAA,EAAS,KAAK,CAAA,CAAA;AAAA,OAC9C,MAAA,IAAW,MAAM,UAAY,EAAA;AAE3B,QAAM,KAAA,CAAA,UAAA,CAAW,YAAY,OAAO,CAAA,CAAA;AAAA,OACtC;AACA,MAAA,OAAA;AAAA,KACF;AAGA,IAAI,IAAA,KAAA,IAAS,MAAM,QAAa,KAAA,IAAA,CAAK,gBAAgB,KAAM,CAAA,QAAA,KAAa,KAAK,YAAc,EAAA;AACzF,MAAA,MAAM,QAAW,GAAA,KAAA,CAAA;AACjB,MAAA,MAAM,QAAW,GAAA,KAAA,CAAA;AAGjB,MAAA,IAAI,SAAS,SAAc,KAAA,iBAAA,IAAqB,QAAS,CAAA,SAAA,KAAc,SAAS,SAAW,EAAA;AAEzF,QAAA,QAAA,CAAS,YAAY,QAAS,CAAA,SAAA,CAAA;AAAA,OAChC;AAGA,MAAA,IAAI,SAAS,EAAO,KAAA,iBAAA,IAAqB,QAAS,CAAA,EAAA,KAAO,SAAS,EAAI,EAAA;AACpE,QAAA,QAAA,CAAS,KAAK,QAAS,CAAA,EAAA,CAAA;AAAA,OACzB;AAGA,MAAA,IAAK,QAAyB,CAAA,KAAA,CAAM,OAAa,KAAA,QAAA,CAAyB,MAAM,OAAS,EAAA;AACvF,QAAC,QAAyB,CAAA,KAAA,CAAM,OAAW,GAAA,QAAA,CAAyB,KAAM,CAAA,OAAA,CAAA;AAAA,OAC5E;AAAA,KACF;AAGA,IAAA,MAAM,YAAY,KAAQ,GAAA,KAAA,CAAM,KAAK,KAAM,CAAA,UAAU,IAAI,EAAC,CAAA;AAC1D,IAAA,MAAM,SAAY,GAAA,KAAA,CAAM,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AAG7C,IAAU,SAAA,CAAA,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAU,KAAA;AACnC,MAAM,MAAA,MAAA,GAAS,UAAU,KAAK,CAAA,CAAA;AAC9B,MAAA,IAAI,CAAC,MAAQ,EAAA;AAEX,QAAM,MAAA,QAAA,GAAW,MAAO,CAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AACtC,QAAA,IAAI,KAAS,IAAA,KAAA,CAAM,QAAa,KAAA,IAAA,CAAK,YAAc,EAAA;AACjD,UAAA,KAAA,CAAM,YAAY,QAAQ,CAAA,CAAA;AAAA,SAC5B;AAAA,OACK,MAAA;AAEL,QAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA,CAAA;AAAA,OACjC;AAAA,KACD,CAAA,CAAA;AAGD,IAAI,IAAA,SAAA,CAAU,MAAS,GAAA,SAAA,CAAU,MAAQ,EAAA;AACvC,MAAA,KAAA,IAAS,IAAI,SAAU,CAAA,MAAA,EAAQ,CAAI,GAAA,SAAA,CAAU,QAAQ,CAAK,EAAA,EAAA;AACxD,QAAA,IAAI,KAAO,EAAA;AACT,UAAM,KAAA,CAAA,WAAA,CAAY,SAAU,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,SAChC;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAGA,EAAA,gBAAA,CAAiB,MAAM,IAAI,CAAA,CAAA;AAC7B;;;;"}