@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.
- package/es/index.mjs.map +1 -1
- package/es/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.mjs +939 -226
- package/es/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
- package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.mjs +109 -105
- package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.mjs.map +1 -0
- package/es/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.mjs +34 -30
- package/es/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.mjs.map +1 -0
- 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
- package/es/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.mjs.map +1 -0
- package/es/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.mjs +1 -1
- package/es/package.json.mjs +1 -1
- package/es/packages/components/touchchat/component/AiRobot/face.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/start.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/CardView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ThoughtChain.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/UploadView_api.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/index.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/TouchChat.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +7 -2
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +10 -7
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +6 -2
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +136 -120
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +6 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/types/a2a.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/a2aService.mjs +189 -132
- package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/chatRobot.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/deepCloneDom.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/hight-it.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/markdown.mjs +2 -2
- package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/socket.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/uuid.mjs.map +1 -1
- package/es/packages/utils/config.mjs.map +1 -1
- package/es/packages/utils/types.mjs.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/node_modules/.pnpm/{dompurify@3.4.3 → dompurify@3.4.11}/node_modules/dompurify/dist/purify.es.js +939 -226
- package/lib/node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/index.js +109 -105
- package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/index.js.map +1 -0
- package/lib/node_modules/.pnpm/{linkify-it@5.0.0 → linkify-it@5.0.2}/node_modules/linkify-it/lib/re.js +34 -30
- package/lib/node_modules/.pnpm/linkify-it@5.0.2/node_modules/linkify-it/lib/re.js.map +1 -0
- 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
- package/lib/node_modules/.pnpm/markdown-it-deflist@3.0.1/node_modules/markdown-it-deflist/index.js.map +1 -0
- package/lib/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/index.js +1 -1
- package/lib/package.json.js +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/face.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/meterialPrepare.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/start.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/CardView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ThoughtChain.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/UploadView_api.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/index.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/TouchChat.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +6 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +10 -7
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +5 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +136 -120
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +6 -1
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/types/a2a.js.map +1 -1
- package/lib/packages/components/touchchat/utils/a2aService.js +189 -132
- package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
- package/lib/packages/components/touchchat/utils/chatRobot.js.map +1 -1
- package/lib/packages/components/touchchat/utils/deepCloneDom.js.map +1 -1
- package/lib/packages/components/touchchat/utils/hight-it.js.map +1 -1
- package/lib/packages/components/touchchat/utils/markdown.js +2 -2
- package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
- package/lib/packages/components/touchchat/utils/socket.js.map +1 -1
- package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
- package/lib/packages/components/touchchat/utils/uuid.js.map +1 -1
- package/lib/packages/utils/config.js.map +1 -1
- package/lib/packages/utils/types.js.map +1 -1
- package/package.json +83 -83
- package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
- package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.mjs.map +0 -1
- package/es/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.mjs.map +0 -1
- package/es/node_modules/.pnpm/markdown-it-deflist@3.0.0/node_modules/markdown-it-deflist/index.mjs.map +0 -1
- package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +0 -1
- package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/index.js.map +0 -1
- package/lib/node_modules/.pnpm/linkify-it@5.0.0/node_modules/linkify-it/lib/re.js.map +0 -1
- 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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
...
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
|
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
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
const
|
|
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
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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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"}
|