@sumeai/sumeclaw 1.0.25 → 1.0.26
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 +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -28
- package/dist/index.js.map +1 -1
- package/dist/src/gateway.d.ts +8 -8
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +79 -72
- package/dist/src/gateway.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @sumeai/sumeclaw —
|
|
2
|
+
* @sumeai/sumeclaw — 稳定版(强制 channel 识别)
|
|
3
3
|
*/
|
|
4
|
-
declare const _default:
|
|
4
|
+
declare const _default: {
|
|
5
|
+
type: string;
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
onReady(ctx: any): Promise<void>;
|
|
10
|
+
};
|
|
5
11
|
export default _default;
|
|
6
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAGA;;GAEG;;;;;;iBAYkB,GAAG;;AARxB,wBAiDE"}
|
package/dist/index.js
CHANGED
|
@@ -1,56 +1,47 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* @sumeai/sumeclaw —
|
|
3
|
+
* @sumeai/sumeclaw — 稳定版(强制 channel 识别)
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const channel_core_1 = require("openclaw/plugin-sdk/channel-core");
|
|
7
6
|
const gateway_js_1 = require("./src/gateway.js");
|
|
8
|
-
exports.default =
|
|
7
|
+
exports.default = {
|
|
8
|
+
// 🔥 核心:手动声明 channel 类型(解决 missing id)
|
|
9
|
+
type: "channel",
|
|
9
10
|
id: "sumeclaw",
|
|
10
11
|
name: "友虾名片",
|
|
11
12
|
description: "友虾名片 Channel",
|
|
12
|
-
/**
|
|
13
|
-
* ✅ 核心:插件启动自动连接
|
|
14
|
-
*/
|
|
15
13
|
async onReady(ctx) {
|
|
16
14
|
const { api, cfg } = ctx;
|
|
17
15
|
console.log("[sumeclaw] 🚀 插件启动");
|
|
18
|
-
|
|
19
|
-
console.log("[sumeclaw] cfg
|
|
20
|
-
|
|
21
|
-
const accounts = cfg?.channels?.sumeclaw?.accounts ||
|
|
22
|
-
|
|
16
|
+
// 🔍 调试用(可以先保留)
|
|
17
|
+
console.log("[sumeclaw] cfg =", JSON.stringify(cfg, null, 2));
|
|
18
|
+
// ✅ 兼容不同 OpenClaw 版本
|
|
19
|
+
const accounts = cfg?.channels?.sumeclaw?.accounts ||
|
|
20
|
+
cfg?.channel?.accounts || // ⚠️ 有些版本是扁平的
|
|
21
|
+
{};
|
|
22
|
+
if (!accounts || Object.keys(accounts).length === 0) {
|
|
23
23
|
console.warn("[sumeclaw] ⚠️ 没有配置 accounts");
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
for (const accountId of Object.keys(accounts)) {
|
|
27
27
|
const account = accounts[accountId];
|
|
28
28
|
if (!account?.registrationToken) {
|
|
29
|
-
console.error(`[sumeclaw] ❌ account ${accountId} 缺少
|
|
29
|
+
console.error(`[sumeclaw] ❌ account ${accountId} 缺少 registrationToken`);
|
|
30
30
|
continue;
|
|
31
31
|
}
|
|
32
32
|
console.log(`[sumeclaw] 🔗 正在连接 account: ${accountId}`);
|
|
33
33
|
try {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
(0, gateway_js_1.connectGateway)({
|
|
35
|
+
accountId,
|
|
36
|
+
platformUrl: account.platformUrl,
|
|
37
|
+
registrationToken: account.registrationToken,
|
|
38
|
+
api
|
|
37
39
|
});
|
|
38
|
-
console.log(`[sumeclaw] ✅ 已连接: ${accountId}`);
|
|
39
40
|
}
|
|
40
41
|
catch (err) {
|
|
41
|
-
console.error(
|
|
42
|
+
console.error("[sumeclaw] ❌ 连接失败:", err);
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
|
-
},
|
|
45
|
-
/**
|
|
46
|
-
* 🔥 Agent 回复 → 回传 WS
|
|
47
|
-
*/
|
|
48
|
-
async onChannelMessage({ event }) {
|
|
49
|
-
const { reply, accountId } = event;
|
|
50
|
-
(0, gateway_js_1.sendToClient)(accountId, {
|
|
51
|
-
type: "reply",
|
|
52
|
-
content: reply
|
|
53
|
-
});
|
|
54
45
|
}
|
|
55
|
-
}
|
|
46
|
+
};
|
|
56
47
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAGA;;GAEG;;AAEH,iDAAkD;AAElD,kBAAe;IACb,uCAAuC;IACvC,IAAI,EAAE,SAAS;IAEf,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAE3B,KAAK,CAAC,OAAO,CAAC,GAAQ;QACpB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;QAEzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAElC,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9D,qBAAqB;QACrB,MAAM,QAAQ,GACZ,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;YACjC,GAAG,EAAE,OAAO,EAAE,QAAQ,IAAM,cAAc;YAC1C,EAAE,CAAC;QAEL,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YAEpC,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,wBAAwB,SAAS,uBAAuB,CAAC,CAAC;gBACxE,SAAS;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;YAExD,IAAI,CAAC;gBACH,IAAA,2BAAc,EAAC;oBACb,SAAS;oBACT,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;oBAC5C,GAAG;iBACJ,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/src/gateway.d.ts
CHANGED
|
@@ -15,12 +15,12 @@ export interface MinicardAccount {
|
|
|
15
15
|
platformUrl?: string;
|
|
16
16
|
enabled?: boolean;
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export
|
|
18
|
+
type ConnectOptions = {
|
|
19
|
+
accountId: string;
|
|
20
|
+
platformUrl: string;
|
|
21
|
+
registrationToken: string;
|
|
22
|
+
api: any;
|
|
23
|
+
};
|
|
24
|
+
export declare function connectGateway(opts: ConnectOptions): void;
|
|
25
|
+
export {};
|
|
26
26
|
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;AA4B3B,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAErE;AAID,MAAM,WAAW,eAAe;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD,KAAK,cAAc,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,GAAG,CAAC;CACV,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,QA0GlD"}
|
package/dist/src/gateway.js
CHANGED
|
@@ -14,8 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
14
|
};
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
16
|
exports.getWebSocket = getWebSocket;
|
|
17
|
-
exports.
|
|
18
|
-
exports.sendToClient = sendToClient;
|
|
17
|
+
exports.connectGateway = connectGateway;
|
|
19
18
|
const ws_1 = __importDefault(require("ws"));
|
|
20
19
|
/**
|
|
21
20
|
* 全局 WS 管理
|
|
@@ -35,80 +34,88 @@ const connections = new Map();
|
|
|
35
34
|
function getWebSocket(accountId) {
|
|
36
35
|
return connections.get(accountId);
|
|
37
36
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
function connectGateway(opts) {
|
|
38
|
+
const { accountId, platformUrl, registrationToken, api } = opts;
|
|
39
|
+
let ws = null;
|
|
40
|
+
let heartbeatTimer = null;
|
|
41
|
+
let reconnectTimer = null;
|
|
42
|
+
const HEARTBEAT_INTERVAL = 30_000;
|
|
43
|
+
const RECONNECT_DELAY = 5_000;
|
|
44
|
+
function start() {
|
|
45
|
+
console.log(`[sumeclaw] 🌐 connecting -> ${platformUrl} (${accountId})`);
|
|
46
|
+
ws = new ws_1.default(platformUrl);
|
|
47
|
+
ws.on("open", () => {
|
|
48
|
+
console.log(`[sumeclaw] ✅ connected: ${accountId}`);
|
|
49
|
+
// 🔐 注册
|
|
50
|
+
ws?.send(JSON.stringify({
|
|
51
|
+
type: "register",
|
|
52
|
+
token: registrationToken
|
|
53
|
+
}));
|
|
54
|
+
// ❤️ 心跳
|
|
55
|
+
heartbeatTimer = setInterval(() => {
|
|
56
|
+
if (ws?.readyState === ws_1.default.OPEN) {
|
|
57
|
+
ws.send(JSON.stringify({ type: "ping" }));
|
|
58
|
+
}
|
|
59
|
+
}, HEARTBEAT_INTERVAL);
|
|
60
|
+
});
|
|
61
|
+
ws.on("message", (data) => {
|
|
62
|
+
try {
|
|
63
|
+
const msg = JSON.parse(data.toString());
|
|
64
|
+
// 🔍 调试
|
|
65
|
+
console.log("[sumeclaw] 📩 message:", msg);
|
|
66
|
+
handleMessage(msg);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error("[sumeclaw] ❌ parse message error", err);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
ws.on("close", () => {
|
|
73
|
+
console.warn(`[sumeclaw] ⚠️ disconnected: ${accountId}`);
|
|
74
|
+
cleanup();
|
|
75
|
+
scheduleReconnect();
|
|
76
|
+
});
|
|
77
|
+
ws.on("error", (err) => {
|
|
78
|
+
console.error(`[sumeclaw] ❌ ws error: ${accountId}`, err);
|
|
79
|
+
ws?.close();
|
|
80
|
+
});
|
|
46
81
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
*/
|
|
68
|
-
await api.dispatchChannelMessage({
|
|
69
|
-
channel: "sumeclaw",
|
|
70
|
-
accountId,
|
|
71
|
-
senderId: msg.userId || "anonymous",
|
|
72
|
-
text: msg.content || "",
|
|
73
|
-
raw: msg
|
|
74
|
-
});
|
|
82
|
+
function handleMessage(msg) {
|
|
83
|
+
switch (msg.type) {
|
|
84
|
+
case "pong":
|
|
85
|
+
// 心跳回应
|
|
86
|
+
break;
|
|
87
|
+
case "message":
|
|
88
|
+
// 👉 这里接入 OpenClaw
|
|
89
|
+
console.log("[sumeclaw] 💬 收到消息:", msg);
|
|
90
|
+
// 示例:推给 agent
|
|
91
|
+
api?.emit?.("message", {
|
|
92
|
+
accountId,
|
|
93
|
+
text: msg.text,
|
|
94
|
+
raw: msg
|
|
95
|
+
});
|
|
96
|
+
break;
|
|
97
|
+
case "registered":
|
|
98
|
+
console.log(`[sumeclaw] 🔐 注册成功: ${accountId}`);
|
|
99
|
+
break;
|
|
100
|
+
default:
|
|
101
|
+
console.log("[sumeclaw] ❓ 未处理消息:", msg);
|
|
75
102
|
}
|
|
76
|
-
catch (err) {
|
|
77
|
-
console.error("[sumeclaw] ❌ message parse error:", err.message);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
/**
|
|
81
|
-
* 连接关闭
|
|
82
|
-
*/
|
|
83
|
-
ws.on("close", () => {
|
|
84
|
-
console.warn(`[sumeclaw] ⚠️ disconnected: ${accountId}`);
|
|
85
|
-
});
|
|
86
|
-
/**
|
|
87
|
-
* 错误
|
|
88
|
-
*/
|
|
89
|
-
ws.on("error", (err) => {
|
|
90
|
-
console.error("[sumeclaw] ❌ ws error:", err);
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* 回传消息给前端(Agent → 名片)
|
|
95
|
-
*/
|
|
96
|
-
function sendToClient(accountId, payload) {
|
|
97
|
-
const ws = wsMap[accountId];
|
|
98
|
-
if (!ws) {
|
|
99
|
-
console.error("[sumeclaw] ❌ ws not found:", accountId);
|
|
100
|
-
return;
|
|
101
103
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
ws.send(JSON.stringify(payload));
|
|
108
|
-
console.log("[sumeclaw] 📤 send:", payload);
|
|
104
|
+
function cleanup() {
|
|
105
|
+
if (heartbeatTimer) {
|
|
106
|
+
clearInterval(heartbeatTimer);
|
|
107
|
+
heartbeatTimer = null;
|
|
108
|
+
}
|
|
109
109
|
}
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
function scheduleReconnect() {
|
|
111
|
+
if (reconnectTimer)
|
|
112
|
+
return;
|
|
113
|
+
console.log(`[sumeclaw] 🔁 reconnecting in ${RECONNECT_DELAY / 1000}s`);
|
|
114
|
+
reconnectTimer = setTimeout(() => {
|
|
115
|
+
reconnectTimer = null;
|
|
116
|
+
start();
|
|
117
|
+
}, RECONNECT_DELAY);
|
|
112
118
|
}
|
|
119
|
+
start();
|
|
113
120
|
}
|
|
114
121
|
//# sourceMappingURL=gateway.js.map
|
package/dist/src/gateway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"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"}
|