@ynhcj/xiaoyi-channel 0.0.75-beta → 0.0.75-next
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/dist/index.d.ts +6 -9
- package/dist/index.js +29 -23
- package/dist/src/bot.js +27 -3
- package/dist/src/channel.js +11 -23
- package/dist/src/cspl/call-api.js +14 -11
- package/dist/src/cspl/config.js +3 -3
- package/dist/src/cspl/constants.d.ts +2 -0
- package/dist/src/cspl/constants.js +12 -0
- package/dist/src/cspl/utils.js +4 -2
- package/dist/src/file-download.js +3 -6
- package/dist/src/file-upload.js +52 -5
- package/dist/src/login-token-handler.d.ts +8 -0
- package/dist/src/login-token-handler.js +60 -0
- package/dist/src/message-queue.d.ts +17 -0
- package/dist/src/message-queue.js +51 -0
- package/dist/src/monitor.js +54 -3
- package/dist/src/outbound.js +2 -7
- package/dist/src/provider.d.ts +2 -1
- package/dist/src/provider.js +486 -33
- package/dist/src/reply-dispatcher.js +6 -0
- package/dist/src/runtime.d.ts +3 -11
- package/dist/src/runtime.js +6 -18
- package/dist/src/self-evolution-handler.d.ts +7 -0
- package/dist/src/self-evolution-handler.js +140 -0
- package/dist/src/self-evolution-keyword.d.ts +9 -0
- package/dist/src/self-evolution-keyword.js +147 -0
- package/dist/src/self-evolution-tool-result-nudge.d.ts +3 -0
- package/dist/src/self-evolution-tool-result-nudge.js +96 -0
- package/dist/src/skill-retriever/config.d.ts +4 -0
- package/dist/src/skill-retriever/config.js +23 -0
- package/dist/src/skill-retriever/hooks.d.ts +22 -0
- package/dist/src/skill-retriever/hooks.js +82 -0
- package/dist/src/skill-retriever/tool-search.d.ts +16 -0
- package/dist/src/skill-retriever/tool-search.js +172 -0
- package/dist/src/skill-retriever/types.d.ts +36 -0
- package/dist/src/skill-retriever/types.js +1 -0
- package/dist/src/task-manager.d.ts +4 -0
- package/dist/src/task-manager.js +6 -0
- package/dist/src/tools/call-device-tool.d.ts +5 -0
- package/dist/src/tools/call-device-tool.js +130 -0
- package/dist/src/tools/create-alarm-tool.js +5 -16
- package/dist/src/tools/delete-alarm-tool.js +1 -4
- package/dist/src/tools/device-tool-map.js +5 -4
- package/dist/src/tools/find-pc-devices-tool.d.ts +5 -0
- package/dist/src/tools/find-pc-devices-tool.js +98 -0
- package/dist/src/tools/get-alarm-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-alarm-tool-schema.js +11 -0
- package/dist/src/tools/get-calendar-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-calendar-tool-schema.js +9 -0
- package/dist/src/tools/get-collection-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-collection-tool-schema.js +10 -0
- package/dist/src/tools/get-contact-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-contact-tool-schema.js +11 -0
- package/dist/src/tools/get-device-file-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-device-file-tool-schema.js +10 -0
- package/dist/src/tools/get-email-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-email-tool-schema.js +9 -0
- package/dist/src/tools/get-note-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-note-tool-schema.js +10 -0
- package/dist/src/tools/get-photo-tool-schema.d.ts +16 -0
- package/dist/src/tools/get-photo-tool-schema.js +10 -0
- package/dist/src/tools/image-reading-tool.js +4 -7
- package/dist/src/tools/login-token-tool.d.ts +5 -0
- package/dist/src/tools/login-token-tool.js +136 -0
- package/dist/src/tools/modify-alarm-tool.js +10 -23
- package/dist/src/tools/query-app-message-tool.d.ts +4 -0
- package/dist/src/tools/query-app-message-tool.js +138 -0
- package/dist/src/tools/query-memory-data-tool.d.ts +4 -0
- package/dist/src/tools/query-memory-data-tool.js +154 -0
- package/dist/src/tools/query-todo-task-tool.d.ts +4 -0
- package/dist/src/tools/query-todo-task-tool.js +133 -0
- package/dist/src/tools/save-file-to-phone-tool.d.ts +5 -0
- package/dist/src/tools/save-file-to-phone-tool.js +166 -0
- package/dist/src/tools/save-media-to-gallery-tool.js +3 -7
- package/dist/src/tools/save-self-evolution-skill-tool.d.ts +1 -0
- package/dist/src/tools/save-self-evolution-skill-tool.js +412 -0
- package/dist/src/tools/schema-tool-factory.d.ts +27 -0
- package/dist/src/tools/schema-tool-factory.js +32 -0
- package/dist/src/tools/search-alarm-tool.js +6 -13
- package/dist/src/tools/search-calendar-tool.js +2 -0
- package/dist/src/tools/search-email-tool.d.ts +5 -0
- package/dist/src/tools/search-email-tool.js +137 -0
- package/dist/src/tools/search-file-tool.js +4 -4
- package/dist/src/tools/search-message-tool.js +1 -0
- package/dist/src/tools/search-photo-gallery-tool.js +2 -2
- package/dist/src/tools/send-email-tool.d.ts +4 -0
- package/dist/src/tools/send-email-tool.js +134 -0
- package/dist/src/tools/send-file-to-user-tool.js +3 -5
- package/dist/src/tools/session-manager.js +2 -0
- package/dist/src/tools/upload-file-tool.js +4 -4
- package/dist/src/tools/upload-photo-tool.js +2 -2
- package/dist/src/tools/xiaoyi-add-collection-tool.js +23 -4
- package/dist/src/tools/xiaoyi-collection-tool.js +2 -1
- package/dist/src/tools/xiaoyi-delete-collection-tool.js +1 -1
- package/dist/src/utils/runtime-manager.js +24 -2
- package/dist/src/utils/self-evolution-manager.d.ts +10 -0
- package/dist/src/utils/self-evolution-manager.js +68 -0
- package/dist/src/utils/tool-call-nudge-manager.d.ts +16 -0
- package/dist/src/utils/tool-call-nudge-manager.js +47 -0
- package/dist/src/websocket.d.ts +3 -0
- package/dist/src/websocket.js +69 -0
- package/openclaw.plugin.json +21 -0
- package/package.json +3 -3
package/dist/src/websocket.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import WebSocket from "ws";
|
|
3
3
|
import { EventEmitter } from "events";
|
|
4
4
|
import { HeartbeatManager } from "./heartbeat.js";
|
|
5
|
+
import { MessageQueue } from "./message-queue.js";
|
|
5
6
|
/**
|
|
6
7
|
* Manages single WebSocket connection to XY server.
|
|
7
8
|
*
|
|
@@ -28,6 +29,10 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
28
29
|
heartbeat = null;
|
|
29
30
|
reconnectTimer = null;
|
|
30
31
|
isShuttingDown = false;
|
|
32
|
+
// Message queue for buffering during disconnection/reconnection
|
|
33
|
+
messageQueue;
|
|
34
|
+
isBuffering = false;
|
|
35
|
+
reconnectBufferTimer = null;
|
|
31
36
|
// Logging functions
|
|
32
37
|
log;
|
|
33
38
|
error;
|
|
@@ -39,6 +44,7 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
39
44
|
this.runtime = runtime;
|
|
40
45
|
this.log = runtime?.log ?? console.log;
|
|
41
46
|
this.error = runtime?.error ?? console.error;
|
|
47
|
+
this.messageQueue = new MessageQueue(this.log);
|
|
42
48
|
}
|
|
43
49
|
/**
|
|
44
50
|
* Set health event callback to report activity to OpenClaw framework.
|
|
@@ -85,6 +91,13 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
85
91
|
clearTimeout(this.reconnectTimer);
|
|
86
92
|
this.reconnectTimer = null;
|
|
87
93
|
}
|
|
94
|
+
// Clear message queue on explicit disconnect (not during reconnection)
|
|
95
|
+
if (this.reconnectBufferTimer) {
|
|
96
|
+
clearTimeout(this.reconnectBufferTimer);
|
|
97
|
+
this.reconnectBufferTimer = null;
|
|
98
|
+
}
|
|
99
|
+
this.messageQueue.clear();
|
|
100
|
+
this.isBuffering = false;
|
|
88
101
|
this.cleanupConnection();
|
|
89
102
|
this.log("Disconnected from XY WebSocket server");
|
|
90
103
|
}
|
|
@@ -92,6 +105,10 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
92
105
|
* Send a message to the server.
|
|
93
106
|
*/
|
|
94
107
|
async sendMessage(sessionId, message) {
|
|
108
|
+
if (this.isBuffering) {
|
|
109
|
+
this.messageQueue.enqueue(message);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
95
112
|
if (!this.ws || !this.state.ready || this.ws.readyState !== WebSocket.OPEN) {
|
|
96
113
|
throw new Error("WebSocket not ready");
|
|
97
114
|
}
|
|
@@ -185,6 +202,11 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
185
202
|
clearTimeout(this.reconnectTimer);
|
|
186
203
|
this.reconnectTimer = null;
|
|
187
204
|
}
|
|
205
|
+
// Clear reconnect buffer timer (but keep message queue for reconnection)
|
|
206
|
+
if (this.reconnectBufferTimer) {
|
|
207
|
+
clearTimeout(this.reconnectBufferTimer);
|
|
208
|
+
this.reconnectBufferTimer = null;
|
|
209
|
+
}
|
|
188
210
|
// Clean up WebSocket
|
|
189
211
|
if (this.ws) {
|
|
190
212
|
// Remove all event listeners
|
|
@@ -282,6 +304,24 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
282
304
|
// Mark as ready after init
|
|
283
305
|
this.state.ready = true;
|
|
284
306
|
this.emit("ready");
|
|
307
|
+
// Start 10-second buffer period after reconnection
|
|
308
|
+
if (this.isBuffering) {
|
|
309
|
+
this.log("[MessageQueue] Reconnected, starting 10s buffer period before flushing queue");
|
|
310
|
+
// Clear any existing buffer timer
|
|
311
|
+
if (this.reconnectBufferTimer) {
|
|
312
|
+
clearTimeout(this.reconnectBufferTimer);
|
|
313
|
+
}
|
|
314
|
+
this.reconnectBufferTimer = setTimeout(() => {
|
|
315
|
+
this.reconnectBufferTimer = null;
|
|
316
|
+
this.messageQueue.flush((msg) => {
|
|
317
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
318
|
+
this.ws.send(JSON.stringify(msg));
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
this.isBuffering = false;
|
|
322
|
+
this.log("[MessageQueue] Buffer period ended, resumed direct sending");
|
|
323
|
+
}, 10000);
|
|
324
|
+
}
|
|
285
325
|
// Start heartbeat
|
|
286
326
|
this.startHeartbeat();
|
|
287
327
|
}
|
|
@@ -394,6 +434,27 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
394
434
|
taskId: a2aRequest.params?.id, // 新的 taskId(点击推送时生成)
|
|
395
435
|
});
|
|
396
436
|
}
|
|
437
|
+
else if (item.header?.namespace === "AgentEvent" && item.header?.name === "ClawSelfEvolutionState") {
|
|
438
|
+
console.log("[XY] ClawSelfEvolutionState event detected, emitting self-evolution-event");
|
|
439
|
+
this.emit("self-evolution-event", {
|
|
440
|
+
event: item,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
else if (item.header?.namespace === "AgentEvent" && item.header?.name === "ClawSelfEvolutionStateGet") {
|
|
444
|
+
console.log("[XY] ClawSelfEvolutionStateGet event detected, emitting self-evolution-state-get-event");
|
|
445
|
+
this.emit("self-evolution-state-get-event", {
|
|
446
|
+
event: item,
|
|
447
|
+
sessionId: sessionId,
|
|
448
|
+
taskId: a2aRequest.params?.id,
|
|
449
|
+
messageId: a2aRequest.id,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
else if (item.header?.namespace === "LoginTokenEvent" && item.header?.name === "ClawAutoLogin") {
|
|
453
|
+
console.log("[XY] LoginTokenEvent.ClawAutoLogin detected, emitting login-token-event");
|
|
454
|
+
this.emit("login-token-event", {
|
|
455
|
+
event: item,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
397
458
|
}
|
|
398
459
|
}
|
|
399
460
|
return;
|
|
@@ -448,6 +509,12 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
448
509
|
taskId: inboundMsg.taskId || a2aRequest.params?.id,
|
|
449
510
|
});
|
|
450
511
|
}
|
|
512
|
+
else if (item.header?.namespace === "LoginTokenEvent" && item.header?.name === "ClawAutoLogin") {
|
|
513
|
+
console.log("[XY] LoginTokenEvent.ClawAutoLogin detected (wrapped format), emitting login-token-event");
|
|
514
|
+
this.emit("login-token-event", {
|
|
515
|
+
event: item,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
451
518
|
}
|
|
452
519
|
}
|
|
453
520
|
}
|
|
@@ -482,6 +549,8 @@ export class XYWebSocketManager extends EventEmitter {
|
|
|
482
549
|
}
|
|
483
550
|
this.state.connected = false;
|
|
484
551
|
this.state.ready = false;
|
|
552
|
+
// Start buffering messages during disconnection
|
|
553
|
+
this.isBuffering = true;
|
|
485
554
|
this.emit("disconnected");
|
|
486
555
|
// Clean up
|
|
487
556
|
if (this.heartbeat) {
|
package/openclaw.plugin.json
CHANGED
|
@@ -7,5 +7,26 @@
|
|
|
7
7
|
"type": "object",
|
|
8
8
|
"additionalProperties": false,
|
|
9
9
|
"properties": {}
|
|
10
|
+
},
|
|
11
|
+
"channelConfigs": {
|
|
12
|
+
"xiaoyi-channel": {
|
|
13
|
+
"schema": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"enabled": { "type": "boolean", "description": "Enable/disable the XY channel", "default": false },
|
|
17
|
+
"wsUrl1": { "type": "string", "description": "Primary WebSocket URL" },
|
|
18
|
+
"wsUrl2": { "type": "string", "description": "Secondary WebSocket URL" },
|
|
19
|
+
"apiKey": { "type": "string", "description": "API key for authentication" },
|
|
20
|
+
"uid": { "type": "string", "description": "User ID for file upload" },
|
|
21
|
+
"agentId": { "type": "string", "description": "Agent ID for this bot instance" },
|
|
22
|
+
"apiId": { "type": "string", "description": "API ID for push messages" },
|
|
23
|
+
"fileUploadUrl": { "type": "string", "description": "Base URL for file upload service" },
|
|
24
|
+
"pushUrl": { "type": "string", "description": "URL for push message service" }
|
|
25
|
+
},
|
|
26
|
+
"required": []
|
|
27
|
+
},
|
|
28
|
+
"label": "Xiaoyi Channel",
|
|
29
|
+
"description": "Xiaoyi A2A protocol integration"
|
|
30
|
+
}
|
|
10
31
|
}
|
|
11
32
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ynhcj/xiaoyi-channel",
|
|
3
|
-
"version": "0.0.75-
|
|
3
|
+
"version": "0.0.75-next",
|
|
4
4
|
"description": "OpenClaw Xiaoyi Channel plugin - Xiaoyi A2A protocol integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"openclaw.plugin.json"
|
|
17
17
|
],
|
|
18
18
|
"scripts": {
|
|
19
|
-
"build": "tsc"
|
|
19
|
+
"build": "node ./node_modules/typescript/bin/tsc"
|
|
20
20
|
},
|
|
21
21
|
"keywords": [
|
|
22
22
|
"openclaw",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
}
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"openclaw": ">=2026.
|
|
52
|
+
"openclaw": ">=2026.5.6"
|
|
53
53
|
},
|
|
54
54
|
"peerDependenciesMeta": {
|
|
55
55
|
"openclaw": {
|