@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,3 +1,31 @@
1
+ const extractSSEData = (line) => {
2
+ const trimmed = line.trim();
3
+ if (!trimmed)
4
+ return null;
5
+ if (trimmed.startsWith("data:")) {
6
+ return trimmed.substring(5).trim();
7
+ }
8
+ if (!trimmed.startsWith(":") && !trimmed.startsWith("event:") && !trimmed.startsWith("id:") && trimmed.startsWith("{")) {
9
+ return trimmed;
10
+ }
11
+ return null;
12
+ };
13
+ const parseErrorFromResponseBody = (errorBody) => {
14
+ var _a;
15
+ const trimmed = errorBody.trim();
16
+ if (!trimmed)
17
+ return null;
18
+ const sseData = extractSSEData(trimmed);
19
+ const jsonText = sseData || trimmed;
20
+ try {
21
+ const errorData = JSON.parse(jsonText);
22
+ if ((_a = errorData.error) == null ? void 0 : _a.message) {
23
+ return errorData.error.message;
24
+ }
25
+ } catch (e) {
26
+ }
27
+ return null;
28
+ };
1
29
  class A2AService {
2
30
  constructor() {
3
31
  this.agents = /* @__PURE__ */ new Map();
@@ -37,14 +65,10 @@ class A2AService {
37
65
  if (!agent) {
38
66
  throw new Error(`Agent ${agentId} not found`);
39
67
  }
68
+ const streamRequest = this.buildA2AStreamRequest(message, sessionId);
40
69
  const request = {
41
- jsonrpc: "2.0",
42
- id: this.generateId(),
43
- method: "message/send",
44
- params: {
45
- message,
46
- sessionId
47
- }
70
+ ...streamRequest,
71
+ method: "message/send"
48
72
  };
49
73
  const response = await fetch(agent.endpoint, {
50
74
  method: "POST",
@@ -69,41 +93,22 @@ class A2AService {
69
93
  if (!agent) {
70
94
  throw new Error(`Agent ${agentId} not found`);
71
95
  }
72
- const request = {
73
- jsonrpc: "2.0",
74
- id: this.generateId(),
75
- method: "message/stream",
76
- params: {
77
- message,
78
- sessionId
79
- }
80
- };
81
96
  let headers = {
82
97
  "Content-Type": "application/json",
83
98
  Accept: "text/event-stream",
84
99
  ...agent.authToken ? { Authorization: `Bearer ${agent.authToken}` } : {}
85
100
  };
86
- let body = JSON.stringify(request);
101
+ const requestBody = this.buildA2AStreamRequest(message, sessionId);
87
102
  if (modules && modules.length > 0 && typeof modules[0] === "object" && modules[0] !== null && modules[0].config) {
88
103
  const customConfig = modules[0].config;
89
104
  if (typeof customConfig.headers === "function") {
90
- const customHeaders = customConfig.headers();
91
105
  headers = {
92
106
  ...headers,
93
- ...customHeaders
107
+ ...customConfig.headers()
94
108
  };
95
109
  }
96
- if (typeof customConfig.body === "function") {
97
- const body_ = customConfig.body();
98
- if (body_.messages) {
99
- delete body_.messages;
100
- }
101
- if (body_.model) {
102
- delete body_.model;
103
- }
104
- body = JSON.stringify(body_);
105
- }
106
110
  }
111
+ const body = JSON.stringify(requestBody);
107
112
  const response = await fetch(agent.endpoint, {
108
113
  method: "POST",
109
114
  headers,
@@ -111,88 +116,14 @@ class A2AService {
111
116
  signal
112
117
  });
113
118
  if (!response.ok) {
114
- try {
115
- const errorBody = await response.text();
116
- try {
117
- const errorData = JSON.parse(errorBody);
118
- if (errorData.error) {
119
- throw new Error(errorData.error.message || `HTTP error: ${response.status}`);
120
- }
121
- } catch (e) {
122
- throw new Error(errorBody || `HTTP error: ${response.status}`);
123
- }
124
- } catch (e) {
125
- throw new Error(e.message || `HTTP error: ${response.status}`);
126
- }
119
+ const errorBody = await response.text();
120
+ const errorMessage = parseErrorFromResponseBody(errorBody);
121
+ throw new Error(errorMessage || errorBody || `HTTP error: ${response.status}`);
127
122
  }
128
123
  if (!response.body) {
129
124
  throw new Error("No response body");
130
125
  }
131
- return new ReadableStream({
132
- async start(controller) {
133
- const reader = response.body.getReader();
134
- const decoder = new TextDecoder();
135
- let buffer = "";
136
- if (signal) {
137
- signal.addEventListener("abort", () => {
138
- controller.close();
139
- reader.cancel();
140
- });
141
- }
142
- try {
143
- let isDone = false;
144
- while (!isDone) {
145
- if (signal == null ? void 0 : signal.aborted) {
146
- console.log("streamMessage: signal aborted");
147
- controller.close();
148
- return;
149
- }
150
- const { done, value } = await reader.read();
151
- if (done) {
152
- console.log("streamMessage: stream done");
153
- isDone = true;
154
- controller.close();
155
- break;
156
- }
157
- const chunkText = decoder.decode(value, { stream: true });
158
- buffer += chunkText;
159
- const lines = buffer.split("\n");
160
- buffer = lines.pop() || "";
161
- const fn = async (data) => {
162
- if (data === "[DONE]") {
163
- console.log("streamMessage: [DONE] received");
164
- controller.close();
165
- return;
166
- }
167
- const trimmedData = data.trim();
168
- if (!trimmedData)
169
- return;
170
- try {
171
- const chunk = JSON.parse(trimmedData);
172
- console.log("streamMessage: parsed chunk:", chunk);
173
- await new Promise((resolve) => setTimeout(resolve, 50));
174
- controller.enqueue(chunk);
175
- } catch (e) {
176
- console.warn("Failed to parse SSE data:", trimmedData);
177
- }
178
- };
179
- for (const line of lines) {
180
- const trimmed = line.trim();
181
- if (trimmed.startsWith("data:")) {
182
- const data = trimmed.substring(5).trim();
183
- await fn(data);
184
- } else if (trimmed && !trimmed.startsWith(":") && !trimmed.startsWith("event:") && !trimmed.startsWith("id:")) {
185
- if (trimmed.startsWith("{")) {
186
- await fn(trimmed);
187
- }
188
- }
189
- }
190
- }
191
- } finally {
192
- reader.releaseLock();
193
- }
194
- }
195
- });
126
+ return this.createSSEReadableStream(response.body, signal);
196
127
  }
197
128
  // Multi-agent message routing
198
129
  async routeMessage(agentIds, message, mode = "sequential") {
@@ -287,19 +218,120 @@ class A2AService {
287
218
  generateId() {
288
219
  return `req-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
289
220
  }
290
- // Multi-agent streaming message
291
- async *streamMultiAgentMessage(hostEndpoint, subAgents, message, headers, sessionId, signal) {
292
- const subAgentsJson = JSON.stringify(subAgents);
293
- const xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)));
294
- const request = {
221
+ getMessageText(message) {
222
+ return message.parts.filter((part) => part.type === "text").map((part) => part.text).join("");
223
+ }
224
+ buildA2AStreamRequest(message, sessionId) {
225
+ const text = this.getMessageText(message);
226
+ const params = {
227
+ message: {
228
+ role: message.role,
229
+ parts: [
230
+ {
231
+ kind: "data",
232
+ data: {
233
+ role: message.role,
234
+ content_type: "text",
235
+ content: text
236
+ }
237
+ }
238
+ ],
239
+ messageId: message.messageId,
240
+ kind: "message"
241
+ }
242
+ };
243
+ if (sessionId) {
244
+ params.sessionId = sessionId;
245
+ }
246
+ return {
295
247
  jsonrpc: "2.0",
296
248
  id: this.generateId(),
297
249
  method: "message/stream",
298
- params: {
299
- message,
300
- sessionId
301
- }
250
+ params
302
251
  };
252
+ }
253
+ createSSEReadableStream(responseBody, signal) {
254
+ return new ReadableStream({
255
+ async start(controller) {
256
+ const reader = responseBody.getReader();
257
+ const decoder = new TextDecoder();
258
+ let buffer = "";
259
+ let streamClosed = false;
260
+ const closeStream = () => {
261
+ if (!streamClosed) {
262
+ streamClosed = true;
263
+ controller.close();
264
+ }
265
+ };
266
+ const handleSSEData = async (data) => {
267
+ if (data === "[DONE]") {
268
+ closeStream();
269
+ return;
270
+ }
271
+ const trimmedData = data.trim();
272
+ if (!trimmedData)
273
+ return;
274
+ try {
275
+ const chunk = JSON.parse(trimmedData);
276
+ controller.enqueue(chunk);
277
+ if (chunk.error) {
278
+ closeStream();
279
+ }
280
+ } catch (e) {
281
+ console.warn("Failed to parse SSE data:", trimmedData);
282
+ }
283
+ };
284
+ const processBuffer = async (flushRemaining = false) => {
285
+ if (flushRemaining && buffer.trim()) {
286
+ const data = extractSSEData(buffer);
287
+ if (data) {
288
+ await handleSSEData(data);
289
+ }
290
+ buffer = "";
291
+ return;
292
+ }
293
+ const lines = buffer.split("\n");
294
+ buffer = lines.pop() || "";
295
+ for (const line of lines) {
296
+ const data = extractSSEData(line);
297
+ if (data) {
298
+ await handleSSEData(data);
299
+ }
300
+ }
301
+ };
302
+ if (signal) {
303
+ signal.addEventListener("abort", () => {
304
+ closeStream();
305
+ reader.cancel();
306
+ });
307
+ }
308
+ try {
309
+ while (!streamClosed) {
310
+ if (signal == null ? void 0 : signal.aborted) {
311
+ closeStream();
312
+ return;
313
+ }
314
+ const { done, value } = await reader.read();
315
+ if (done) {
316
+ buffer += decoder.decode();
317
+ await processBuffer(true);
318
+ closeStream();
319
+ break;
320
+ }
321
+ buffer += decoder.decode(value, { stream: true });
322
+ await processBuffer();
323
+ }
324
+ } finally {
325
+ reader.releaseLock();
326
+ }
327
+ }
328
+ });
329
+ }
330
+ // Multi-agent streaming message
331
+ async *streamMultiAgentMessage(hostEndpoint, subAgents, message, headers, sessionId, signal) {
332
+ const subAgentsJson = JSON.stringify(subAgents);
333
+ const xSubAgents = btoa(unescape(encodeURIComponent(subAgentsJson)));
334
+ const request = this.buildA2AStreamRequest(message, sessionId);
303
335
  const response = await fetch(hostEndpoint, {
304
336
  method: "POST",
305
337
  headers: {
@@ -322,30 +354,55 @@ class A2AService {
322
354
  const reader = response.body.getReader();
323
355
  const decoder = new TextDecoder();
324
356
  let buffer = "";
357
+ const processBuffer = function* (flushRemaining = false) {
358
+ if (flushRemaining && buffer.trim()) {
359
+ const data = extractSSEData(buffer);
360
+ buffer = "";
361
+ if (data && data !== "[DONE]") {
362
+ try {
363
+ yield JSON.parse(data);
364
+ } catch (e) {
365
+ console.warn("Failed to parse SSE data:", data);
366
+ }
367
+ }
368
+ return data === "[DONE]";
369
+ }
370
+ const lines = buffer.split("\n");
371
+ buffer = lines.pop() || "";
372
+ for (const line of lines) {
373
+ const data = extractSSEData(line);
374
+ if (!data)
375
+ continue;
376
+ if (data === "[DONE]")
377
+ return true;
378
+ try {
379
+ yield JSON.parse(data);
380
+ } catch (e) {
381
+ console.warn("Failed to parse SSE data:", data);
382
+ }
383
+ }
384
+ return false;
385
+ };
325
386
  try {
326
387
  while (true) {
327
388
  if (signal == null ? void 0 : signal.aborted) {
328
389
  return;
329
390
  }
330
391
  const { done, value } = await reader.read();
331
- if (done)
332
- break;
333
- buffer += decoder.decode(value, { stream: true });
334
- const lines = buffer.split("\n");
335
- buffer = lines.pop() || "";
336
- for (const line of lines) {
337
- const trimmed = line.trim();
338
- if (trimmed.startsWith("data: ")) {
339
- const data = trimmed.slice(6);
340
- if (data === "[DONE]")
392
+ if (done) {
393
+ buffer += decoder.decode();
394
+ for (const chunk of processBuffer(true)) {
395
+ yield chunk;
396
+ if (chunk.error)
341
397
  return;
342
- try {
343
- const chunk = JSON.parse(data);
344
- yield chunk;
345
- } catch (e) {
346
- console.warn("Failed to parse SSE data:", data);
347
- }
348
398
  }
399
+ break;
400
+ }
401
+ buffer += decoder.decode(value, { stream: true });
402
+ for (const chunk of processBuffer()) {
403
+ yield chunk;
404
+ if (chunk.error)
405
+ return;
349
406
  }
350
407
  }
351
408
  } finally {
@@ -1 +1 @@
1
- {"version":3,"file":"a2aService.mjs","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":"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"}
1
+ {"version":3,"file":"a2aService.mjs","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.mjs","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":[],"mappings":"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"}
1
+ {"version":3,"file":"chatRobot.mjs","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":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deepCloneDom.mjs","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.mjs","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":"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"}