@sumeai/sumeclaw 1.0.19 → 1.0.21
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 +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -34
- package/dist/index.js.map +1 -1
- package/dist/setup-entry.js +5 -3
- package/dist/setup-entry.js.map +1 -1
- package/dist/src/channel.js +8 -5
- package/dist/src/channel.js.map +1 -1
- package/dist/src/gateway.d.ts +4 -6
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +85 -126
- package/dist/src/gateway.js.map +1 -1
- package/package.json +3 -3
- package/Archive.zip +0 -0
package/dist/index.d.ts
CHANGED
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":"AAAA;;GAEG;;AAMH,wBAyDG"}
|
package/dist/index.js
CHANGED
|
@@ -1,47 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
|
-
* @sumeai/sumeclaw —
|
|
3
|
-
*
|
|
4
|
-
* 优先保证 Gateway 连接功能,CLI 命令后续再优化
|
|
3
|
+
* @sumeai/sumeclaw — 修复版(可连接)
|
|
5
4
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const channel_core_1 = require("openclaw/plugin-sdk/channel-core");
|
|
7
|
+
const channel_js_1 = require("./src/channel.js");
|
|
8
|
+
const gateway_js_1 = require("./src/gateway.js");
|
|
9
|
+
exports.default = (0, channel_core_1.defineChannelPluginEntry)({
|
|
10
10
|
id: "sumeclaw",
|
|
11
11
|
name: "友虾名片",
|
|
12
|
-
description: "
|
|
13
|
-
plugin: sumeclawPlugin,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
description: "友虾名片 Channel",
|
|
13
|
+
plugin: channel_js_1.sumeclawPlugin,
|
|
14
|
+
/**
|
|
15
|
+
* ✅ 核心:插件启动自动连接
|
|
16
|
+
*/
|
|
17
|
+
async onStart(ctx) {
|
|
18
|
+
const { api, cfg } = ctx;
|
|
19
|
+
console.log("[sumeclaw] 🚀 插件启动");
|
|
20
|
+
const accounts = cfg?.channels?.sumeclaw?.accounts || {};
|
|
21
|
+
if (Object.keys(accounts).length === 0) {
|
|
22
|
+
console.warn("[sumeclaw] ⚠️ 没有配置 accounts");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
for (const accountId of Object.keys(accounts)) {
|
|
26
|
+
const account = accounts[accountId];
|
|
20
27
|
if (!account?.registrationToken) {
|
|
21
|
-
console.error(
|
|
22
|
-
|
|
28
|
+
console.error(`[sumeclaw] ❌ account ${accountId} 缺少 token`);
|
|
29
|
+
continue;
|
|
23
30
|
}
|
|
31
|
+
console.log(`[sumeclaw] 🔗 正在连接 account: ${accountId}`);
|
|
24
32
|
try {
|
|
25
|
-
await connectSumeclaw(api,
|
|
26
|
-
|
|
33
|
+
await (0, gateway_js_1.connectSumeclaw)(api, {
|
|
34
|
+
...account,
|
|
35
|
+
accountId
|
|
36
|
+
});
|
|
37
|
+
console.log(`[sumeclaw] ✅ 已连接: ${accountId}`);
|
|
27
38
|
}
|
|
28
39
|
catch (err) {
|
|
29
|
-
console.error(
|
|
40
|
+
console.error(`[sumeclaw] ❌ 连接失败: ${accountId}`, err.message);
|
|
30
41
|
}
|
|
31
|
-
}
|
|
32
|
-
api.registerGatewayMethod("sumeclaw.disconnect", async ({ accountId = "default" }) => {
|
|
33
|
-
console.log(`[sumeclaw] 执行 disconnect`);
|
|
34
|
-
try {
|
|
35
|
-
await disconnectSumeclaw(accountId);
|
|
36
|
-
console.log("✅ [sumeclaw] 已断开连接");
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
console.error(`❌ [sumeclaw] disconnect 失败: ${err.message}`);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
console.log("📋 [sumeclaw] 插件加载完成");
|
|
43
|
-
console.log(" 临时使用 Gateway 方法调用:");
|
|
44
|
-
console.log(" openclaw gateway method call sumeclaw.connect");
|
|
42
|
+
}
|
|
45
43
|
},
|
|
44
|
+
/**
|
|
45
|
+
* 🔥 Agent 回复 → 回传 WS
|
|
46
|
+
*/
|
|
47
|
+
async onChannelMessage({ event }) {
|
|
48
|
+
const { reply, accountId } = event;
|
|
49
|
+
(0, gateway_js_1.sendToClient)(accountId, {
|
|
50
|
+
type: "reply",
|
|
51
|
+
content: reply
|
|
52
|
+
});
|
|
53
|
+
}
|
|
46
54
|
});
|
|
47
55
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,mEAA4E;AAC5E,iDAAkD;AAClD,iDAAiE;AAEjE,kBAAe,IAAA,uCAAwB,EAAC;IACtC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAE3B,MAAM,EAAE,2BAAc;IAEtB;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,GAAQ;QACpB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;QAEzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAElC,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;QAEzD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,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,WAAW,CAAC,CAAC;gBAC5D,SAAS;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;YAExD,IAAI,CAAC;gBACH,MAAM,IAAA,4BAAe,EAAC,GAAG,EAAE;oBACzB,GAAG,OAAO;oBACV,SAAS;iBACV,CAAC,CAAC;gBAEH,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;YAEhD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,SAAS,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE;QAC9B,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAEnC,IAAA,yBAAY,EAAC,SAAS,EAAE;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
package/dist/setup-entry.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
3
|
/**
|
|
2
4
|
* 友虾名片 Channel 插件 — 轻量设置入口
|
|
3
5
|
*
|
|
4
6
|
* 此入口在 openclaw plugins install 阶段加载,
|
|
5
7
|
* 用于展示配置向导和验证 Token 有效性。
|
|
6
8
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
const channel_core_1 = require("openclaw/plugin-sdk/channel-core");
|
|
10
|
+
const channel_js_1 = require("./src/channel.js");
|
|
11
|
+
exports.default = (0, channel_core_1.defineSetupPluginEntry)(channel_js_1.sumeclawPlugin);
|
|
10
12
|
//# sourceMappingURL=setup-entry.js.map
|
package/dist/setup-entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-entry.js","sourceRoot":"","sources":["../setup-entry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,
|
|
1
|
+
{"version":3,"file":"setup-entry.js","sourceRoot":"","sources":["../setup-entry.ts"],"names":[],"mappings":";;AAAA;;;;;GAKG;AACH,mEAA0E;AAC1E,iDAAkD;AAElD,kBAAe,IAAA,qCAAsB,EAAC,2BAAc,CAAC,CAAC"}
|
package/dist/src/channel.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sumeclawPlugin = void 0;
|
|
1
4
|
/**
|
|
2
5
|
* 友虾名片 ChannelPlugin 核心定义
|
|
3
6
|
*
|
|
4
7
|
* 基于新版 plugin-sdk(2026.3.22+)的 createChatChannelPlugin API。
|
|
5
8
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
const channel_core_1 = require("openclaw/plugin-sdk/channel-core");
|
|
10
|
+
const gateway_js_1 = require("./gateway.js");
|
|
8
11
|
/**
|
|
9
12
|
* 安装/配置向导 — 交互式提示用户输入 registrationToken
|
|
10
13
|
*/
|
|
@@ -39,8 +42,8 @@ const setupWizard = {
|
|
|
39
42
|
},
|
|
40
43
|
],
|
|
41
44
|
};
|
|
42
|
-
|
|
43
|
-
base: createChannelPluginBase({
|
|
45
|
+
exports.sumeclawPlugin = (0, channel_core_1.createChatChannelPlugin)({
|
|
46
|
+
base: (0, channel_core_1.createChannelPluginBase)({
|
|
44
47
|
id: channelKey,
|
|
45
48
|
setupWizard,
|
|
46
49
|
setup: {
|
|
@@ -97,7 +100,7 @@ export const sumeclawPlugin = createChatChannelPlugin({
|
|
|
97
100
|
outbound: {
|
|
98
101
|
attachedResults: {
|
|
99
102
|
sendText: async ({ text, to, accountId }) => {
|
|
100
|
-
const ws = getWebSocket(accountId ?? "default");
|
|
103
|
+
const ws = (0, gateway_js_1.getWebSocket)(accountId ?? "default");
|
|
101
104
|
if (!ws || ws.readyState !== 1) {
|
|
102
105
|
throw new Error("WebSocket 未连接到友虾名片平台");
|
|
103
106
|
}
|
package/dist/src/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}
|
package/dist/src/gateway.d.ts
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* - Agent 回复通过 WS 推回平台
|
|
10
10
|
*/
|
|
11
11
|
import WebSocket from "ws";
|
|
12
|
-
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
13
12
|
export declare function getWebSocket(accountId: string): WebSocket | undefined;
|
|
14
13
|
export interface MinicardAccount {
|
|
15
14
|
registrationToken?: string;
|
|
@@ -17,12 +16,11 @@ export interface MinicardAccount {
|
|
|
17
16
|
enabled?: boolean;
|
|
18
17
|
}
|
|
19
18
|
/**
|
|
20
|
-
*
|
|
21
|
-
* 由 index.ts 中的 registerGatewayMethod("sumeclaw.connect") 调用。
|
|
19
|
+
* 建立连接
|
|
22
20
|
*/
|
|
23
|
-
export declare function connectSumeclaw(api:
|
|
21
|
+
export declare function connectSumeclaw(api: any, account: any): Promise<void>;
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
23
|
+
* 回传消息给前端(Agent → 名片)
|
|
26
24
|
*/
|
|
27
|
-
export declare function
|
|
25
|
+
export declare function sendToClient(accountId: string, payload: any): void;
|
|
28
26
|
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;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;AAGD;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,iBA8D3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAmB3D"}
|
package/dist/src/gateway.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* 友虾名片 OpenClaw Channel 插件 — Gateway 层
|
|
3
4
|
*
|
|
@@ -8,13 +9,21 @@
|
|
|
8
9
|
* - 平台下发的消息注入 OpenClaw Agent
|
|
9
10
|
* - Agent 回复通过 WS 推回平台
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.getWebSocket = getWebSocket;
|
|
17
|
+
exports.connectSumeclaw = connectSumeclaw;
|
|
18
|
+
exports.sendToClient = sendToClient;
|
|
19
|
+
const ws_1 = __importDefault(require("ws"));
|
|
20
|
+
/**
|
|
21
|
+
* 全局 WS 管理
|
|
22
|
+
*/
|
|
23
|
+
const wsMap = {};
|
|
24
|
+
// const __filename = fileURLToPath(import.meta.url);
|
|
25
|
+
// const __dirname = dirname(__filename);
|
|
26
|
+
// const pkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8"));
|
|
18
27
|
// ─── 配置常量 ────────────────────────────────────────────────────────────────
|
|
19
28
|
const DEFAULT_PLATFORM_URL = "wss://api.gixin.cc";
|
|
20
29
|
const HEARTBEAT_MS = 30_000;
|
|
@@ -23,133 +32,83 @@ const BASE_BACKOFF_MS = 1_000;
|
|
|
23
32
|
// ─── 连接池 ──────────────────────────────────────────────────────────────────
|
|
24
33
|
/** key: accountId → WebSocket */
|
|
25
34
|
const connections = new Map();
|
|
26
|
-
|
|
35
|
+
function getWebSocket(accountId) {
|
|
27
36
|
return connections.get(accountId);
|
|
28
37
|
}
|
|
29
38
|
/**
|
|
30
|
-
*
|
|
31
|
-
* 由 index.ts 中的 registerGatewayMethod("sumeclaw.connect") 调用。
|
|
39
|
+
* 建立连接
|
|
32
40
|
*/
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
if (!
|
|
36
|
-
|
|
41
|
+
async function connectSumeclaw(api, account) {
|
|
42
|
+
const { accountId, platformUrl, registrationToken } = account;
|
|
43
|
+
if (!platformUrl || !registrationToken) {
|
|
44
|
+
console.error("[sumeclaw] ❌ 缺少 platformUrl 或 token");
|
|
45
|
+
return;
|
|
37
46
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
// 使用新版 channel-message pipeline 分发入站消息
|
|
84
|
-
try {
|
|
85
|
-
const { dispatchChannelMessageReplyWithBase } = await import("openclaw/plugin-sdk/channel-message");
|
|
86
|
-
await dispatchChannelMessageReplyWithBase({
|
|
87
|
-
channel: "sumeclaw",
|
|
88
|
-
accountId,
|
|
89
|
-
chatType: "direct",
|
|
90
|
-
chatId: sessionKey,
|
|
91
|
-
messageId: `${Date.now()}`,
|
|
92
|
-
text: message,
|
|
93
|
-
from: meta?.user_id ?? "unknown",
|
|
94
|
-
timestamp: Date.now(),
|
|
95
|
-
deliver: async (replyPayload) => {
|
|
96
|
-
// Agent 回复 → 通过 WS 推回平台
|
|
97
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
98
|
-
ws.send(JSON.stringify({
|
|
99
|
-
type: "agent_reply",
|
|
100
|
-
userId: meta?.user_id,
|
|
101
|
-
agentId: meta?.agent_id,
|
|
102
|
-
text: replyPayload.text,
|
|
103
|
-
sessionKey,
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
// 如果 channel-message 模块不可用,回退到直接 dispatch
|
|
111
|
-
console.warn(`[sumeclaw] channel-message 不可用,尝试降级: ${err.message}`);
|
|
112
|
-
// 降级:通过标准 outbound.sendText 回复
|
|
113
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
114
|
-
ws.send(JSON.stringify({
|
|
115
|
-
type: "agent_reply",
|
|
116
|
-
userId: meta?.user_id,
|
|
117
|
-
agentId: meta?.agent_id,
|
|
118
|
-
text: "[系统] 收到您的消息,正在处理中...",
|
|
119
|
-
sessionKey,
|
|
120
|
-
}));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch (err) {
|
|
126
|
-
console.error(`[sumeclaw] 消息处理失败: ${err.message}`);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
ws.on("close", (code, reason) => {
|
|
130
|
-
if (heartbeat)
|
|
131
|
-
clearInterval(heartbeat);
|
|
132
|
-
connections.delete(accountId);
|
|
133
|
-
console.warn(`[sumeclaw] 连接断开 (code=${code}), 准备重连`);
|
|
134
|
-
scheduleReconnect();
|
|
135
|
-
});
|
|
136
|
-
ws.on("error", (err) => {
|
|
137
|
-
if (heartbeat)
|
|
138
|
-
clearInterval(heartbeat);
|
|
139
|
-
console.error(`[sumeclaw] WebSocket 错误: ${err.message}`);
|
|
140
|
-
// ws.on("close") 会触发重连
|
|
141
|
-
});
|
|
142
|
-
};
|
|
143
|
-
connect();
|
|
47
|
+
const url = `${platformUrl}/api/channel/${registrationToken}`;
|
|
48
|
+
console.log("[sumeclaw] 🔗 connecting:", url);
|
|
49
|
+
const ws = new ws_1.default(url);
|
|
50
|
+
wsMap[accountId] = ws;
|
|
51
|
+
/**
|
|
52
|
+
* 连接成功
|
|
53
|
+
*/
|
|
54
|
+
ws.on("open", () => {
|
|
55
|
+
console.log(`[sumeclaw] ✅ connected: ${accountId}`);
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* 收到消息(来自你的名片系统)
|
|
59
|
+
*/
|
|
60
|
+
ws.on("message", async (raw) => {
|
|
61
|
+
try {
|
|
62
|
+
const text = raw.toString();
|
|
63
|
+
console.log("[sumeclaw] 📩 recv:", text);
|
|
64
|
+
const msg = JSON.parse(text);
|
|
65
|
+
/**
|
|
66
|
+
* 🔥 核心:注入 OpenClaw
|
|
67
|
+
*/
|
|
68
|
+
await api.dispatchChannelMessage({
|
|
69
|
+
channel: "sumeclaw",
|
|
70
|
+
accountId,
|
|
71
|
+
senderId: msg.userId || "anonymous",
|
|
72
|
+
text: msg.content || "",
|
|
73
|
+
raw: msg
|
|
74
|
+
});
|
|
75
|
+
}
|
|
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
|
+
});
|
|
144
92
|
}
|
|
145
93
|
/**
|
|
146
|
-
*
|
|
94
|
+
* 回传消息给前端(Agent → 名片)
|
|
147
95
|
*/
|
|
148
|
-
|
|
149
|
-
const ws =
|
|
150
|
-
if (ws) {
|
|
151
|
-
|
|
152
|
-
|
|
96
|
+
function sendToClient(accountId, payload) {
|
|
97
|
+
const ws = wsMap[accountId];
|
|
98
|
+
if (!ws) {
|
|
99
|
+
console.error("[sumeclaw] ❌ ws not found:", accountId);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (ws.readyState !== ws_1.default.OPEN) {
|
|
103
|
+
console.error("[sumeclaw] ❌ ws not open:", accountId);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
ws.send(JSON.stringify(payload));
|
|
108
|
+
console.log("[sumeclaw] 📤 send:", payload);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error("[sumeclaw] ❌ send error:", err.message);
|
|
153
112
|
}
|
|
154
113
|
}
|
|
155
114
|
//# 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":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sumeai/sumeclaw",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.21",
|
|
4
4
|
"description": "友虾名片 OpenClaw Channel 插件 — 将 OpenClaw 连接到友虾名片平台,通过 AI 名片为客户提供服务",
|
|
5
|
-
"type": "
|
|
5
|
+
"type": "commonjs",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "tsc",
|
|
9
|
-
"
|
|
9
|
+
"prepublishOnly": "npm run build"
|
|
10
10
|
},
|
|
11
11
|
"openclaw": {
|
|
12
12
|
"extensions": [
|
package/Archive.zip
DELETED
|
Binary file
|