@sumeai/sumeclaw 1.0.0

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.
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAWA,wBA6CG"}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @sumeai/sumeclaw — 友虾名片 OpenClaw Channel 插件入口
3
+ *
4
+ * 用法:
5
+ * openclaw plugins install @sumeai/sumeclaw
6
+ * openclaw config set channels.sumeclaw.accounts.default.registrationToken <从友虾小程序获取的Token>
7
+ */
8
+ import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
9
+ import { sumeclawPlugin } from "./src/channel.js";
10
+ import { connectSumeclaw, disconnectSumeclaw } from "./src/gateway.js";
11
+ export default defineChannelPluginEntry({
12
+ id: "sumeclaw",
13
+ name: "友虾名片",
14
+ description: "将 OpenClaw 连接到友虾名片平台(wss://api.gixin.cc),通过 AI 名片为客户提供服务。",
15
+ plugin: sumeclawPlugin,
16
+ registerFull(api) {
17
+ /**
18
+ * 注册网关方法:连接友虾名片平台
19
+ *
20
+ * OpenClaw 启动后自动调用此方法建立出站 WebSocket 连接。
21
+ */
22
+ api.registerGatewayMethod("sumeclaw.connect", async ({ accountId, cfg, }) => {
23
+ const account = cfg.channels?.sumeclaw?.accounts?.[accountId ?? "default"];
24
+ if (!account?.registrationToken) {
25
+ api.log("warn", "[sumeclaw] 缺少 registrationToken,请先在友虾小程序中创建 OpenClaw 智能体获取 Token");
26
+ return;
27
+ }
28
+ await connectSumeclaw(api, account);
29
+ });
30
+ /**
31
+ * 注册网关方法:断开友虾名片平台连接
32
+ */
33
+ api.registerGatewayMethod("sumeclaw.disconnect", async ({ accountId }) => {
34
+ await disconnectSumeclaw(accountId ?? "default");
35
+ api.log("info", "[sumeclaw] 已断开与友虾名片平台的连接");
36
+ });
37
+ api.log("info", "[sumeclaw] 友虾名片 Channel 插件已注册");
38
+ },
39
+ });
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,eAAe,wBAAwB,CAAC;IACtC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,2DAA2D;IAExE,MAAM,EAAE,cAAc;IAEtB,YAAY,CAAC,GAAG;QACd;;;;WAIG;QACH,GAAG,CAAC,qBAAqB,CACvB,kBAAkB,EAClB,KAAK,EAAE,EACL,SAAS,EACT,GAAG,GAIJ,EAAE,EAAE;YACH,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;YAC3E,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;gBAChC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,kEAAkE,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;YAED,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC,CACF,CAAC;QAEF;;WAEG;QACH,GAAG,CAAC,qBAAqB,CACvB,qBAAqB,EACrB,KAAK,EAAE,EAAE,SAAS,EAA0B,EAAE,EAAE;YAC9C,MAAM,kBAAkB,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;YACjD,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;IACnD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=setup-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-entry.d.ts","sourceRoot":"","sources":["../setup-entry.ts"],"names":[],"mappings":";AASA,wBAAsD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 友虾名片 Channel 插件 — 轻量设置入口
3
+ *
4
+ * 此入口在 openclaw plugins install 阶段加载,
5
+ * 用于展示配置向导和验证 Token 有效性。
6
+ */
7
+ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
8
+ import { sumeclawPlugin } from "./src/channel.js";
9
+ export default defineSetupPluginEntry(sumeclawPlugin);
10
+ //# sourceMappingURL=setup-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-entry.js","sourceRoot":"","sources":["../setup-entry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAe,sBAAsB,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface SumelawAccount {
2
+ registrationToken?: string;
3
+ platformUrl?: string;
4
+ enabled?: boolean;
5
+ }
6
+ export declare const sumeclawPlugin: any;
7
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,cAAc,KAkEzB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 友虾名片 ChannelPlugin 核心定义
3
+ *
4
+ * 基于新版 plugin-sdk(2026.3.22+)的 createChatChannelPlugin API。
5
+ */
6
+ import { createChatChannelPlugin, createChannelPluginBase, } from "openclaw/plugin-sdk/channel-core";
7
+ import { getWebSocket } from "./gateway.js";
8
+ export const sumeclawPlugin = createChatChannelPlugin({
9
+ base: createChannelPluginBase({
10
+ id: "sumeclaw",
11
+ setup: {
12
+ /**
13
+ * 从用户配置中解析账户信息
14
+ */
15
+ resolveAccount(cfg, accountId) {
16
+ const accounts = cfg.channels?.sumeclaw?.accounts ?? {};
17
+ return (accounts[accountId ?? "default"] ?? {});
18
+ },
19
+ /**
20
+ * 检查账户配置状态
21
+ */
22
+ inspectAccount(cfg, accountId) {
23
+ const account = cfg.channels?.sumeclaw?.accounts?.[accountId ?? "default"];
24
+ return {
25
+ enabled: !!account?.registrationToken,
26
+ configured: !!account?.registrationToken,
27
+ };
28
+ },
29
+ },
30
+ }),
31
+ /**
32
+ * DM 安全策略
33
+ *
34
+ * 友虾名片场景下,所有通过名片访问的用户都允许对话。
35
+ * 名片主可在小程序端管理黑名单(后续扩展)。
36
+ */
37
+ security: {
38
+ dm: {
39
+ channelKey: "sumeclaw",
40
+ resolvePolicy: () => "open",
41
+ defaultPolicy: "open",
42
+ },
43
+ },
44
+ /**
45
+ * 出站消息处理
46
+ *
47
+ * 当 OpenClaw Agent 生成回复后,通过 WebSocket 推回友虾名片平台。
48
+ */
49
+ outbound: {
50
+ attachedResults: {
51
+ sendText: async ({ text, to, accountId }) => {
52
+ const ws = getWebSocket(accountId ?? "default");
53
+ if (!ws || ws.readyState !== 1) {
54
+ throw new Error("WebSocket 未连接到友虾名片平台");
55
+ }
56
+ ws.send(JSON.stringify({
57
+ type: "agent_reply",
58
+ userId: to,
59
+ text,
60
+ }));
61
+ return {};
62
+ },
63
+ },
64
+ },
65
+ });
66
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ5C,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAiB;IACpE,IAAI,EAAE,uBAAuB,CAAC;QAC5B,EAAE,EAAE,UAAU;QACd,KAAK,EAAE;YACL;;eAEG;YACH,cAAc,CAAC,GAAG,EAAE,SAAS;gBAC3B,MAAM,QAAQ,GAAI,GAAG,CAAC,QAAgB,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;gBACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAmB,CAAC;YACpE,CAAC;YAED;;eAEG;YACH,cAAc,CAAC,GAAG,EAAE,SAAS;gBAC3B,MAAM,OAAO,GAAI,GAAG,CAAC,QAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CACzD,SAAS,IAAI,SAAS,CACvB,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,iBAAiB;oBACrC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,iBAAiB;iBACzC,CAAC;YACJ,CAAC;SACF;KACF,CAAC;IAEF;;;;;OAKG;IACH,QAAQ,EAAE;QACR,EAAE,EAAE;YACF,UAAU,EAAE,UAAU;YACtB,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM;YAC3B,aAAa,EAAE,MAAM;SACtB;KACF;IAED;;;;OAIG;IACH,QAAQ,EAAE;QACR,eAAe,EAAE;YACf,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC1C,MAAM,EAAE,GAAG,YAAY,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;gBAChD,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC1C,CAAC;gBAED,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,EAAE;oBACV,IAAI;iBACL,CAAC,CACH,CAAC;gBAEF,OAAO,EAAE,CAAC;YACZ,CAAC;SACF;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 友虾名片 OpenClaw Channel 插件 — Gateway 层
3
+ *
4
+ * WebSocket 连接管理:
5
+ * - 出站连接到 wss://api.gixin.cc/api/channel/{registrationToken}
6
+ * - 心跳保活(30s 间隔)
7
+ * - 断线自动重连(指数退避,最大 60s)
8
+ * - 平台下发的消息注入 OpenClaw Agent
9
+ * - Agent 回复通过 WS 推回平台
10
+ */
11
+ import WebSocket from "ws";
12
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
13
+ export declare function getWebSocket(accountId: string): WebSocket | undefined;
14
+ export interface MinicardAccount {
15
+ registrationToken?: string;
16
+ platformUrl?: string;
17
+ enabled?: boolean;
18
+ }
19
+ /**
20
+ * 建立到友虾名片平台的 WebSocket 连接。
21
+ * 由 index.ts 中的 registerGatewayMethod("sumeclaw.connect") 调用。
22
+ */
23
+ export declare function connectSumeclaw(api: OpenClawPluginApi, account: MinicardAccount): Promise<void>;
24
+ /**
25
+ * 断开到友虾名片平台的 WebSocket 连接。
26
+ */
27
+ export declare function disconnectSumeclaw(accountId: string): Promise<void>;
28
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAqB7D,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;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAkIf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * 友虾名片 OpenClaw Channel 插件 — Gateway 层
3
+ *
4
+ * WebSocket 连接管理:
5
+ * - 出站连接到 wss://api.gixin.cc/api/channel/{registrationToken}
6
+ * - 心跳保活(30s 间隔)
7
+ * - 断线自动重连(指数退避,最大 60s)
8
+ * - 平台下发的消息注入 OpenClaw Agent
9
+ * - Agent 回复通过 WS 推回平台
10
+ */
11
+ import WebSocket from "ws";
12
+ import { readFileSync } from "fs";
13
+ import { fileURLToPath } from "url";
14
+ import { dirname, join } from "path";
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
18
+ // ─── 配置常量 ────────────────────────────────────────────────────────────────
19
+ const DEFAULT_PLATFORM_URL = "wss://api.gixin.cc";
20
+ const HEARTBEAT_MS = 30_000;
21
+ const MAX_RECONNECT_MS = 60_000;
22
+ const BASE_BACKOFF_MS = 1_000;
23
+ // ─── 连接池 ──────────────────────────────────────────────────────────────────
24
+ /** key: accountId → WebSocket */
25
+ const connections = new Map();
26
+ export function getWebSocket(accountId) {
27
+ return connections.get(accountId);
28
+ }
29
+ /**
30
+ * 建立到友虾名片平台的 WebSocket 连接。
31
+ * 由 index.ts 中的 registerGatewayMethod("sumeclaw.connect") 调用。
32
+ */
33
+ export async function connectSumeclaw(api, account) {
34
+ const token = account.registrationToken;
35
+ if (!token) {
36
+ throw new Error("缺少 registrationToken,请在友虾小程序中创建 OpenClaw 智能体获取 Token");
37
+ }
38
+ const baseUrl = account.platformUrl ?? DEFAULT_PLATFORM_URL;
39
+ const wsUrl = `${baseUrl}/api/channel/${token}`;
40
+ const accountId = "default";
41
+ api.log("info", `[sumeclaw] 正在连接友虾名片平台: ${wsUrl.replace(token, "***")}`);
42
+ const connect = () => {
43
+ const ws = new WebSocket(wsUrl);
44
+ let heartbeat = null;
45
+ let reconnectTimer = null;
46
+ let attempt = 0;
47
+ const scheduleReconnect = () => {
48
+ attempt++;
49
+ const backoff = Math.min(BASE_BACKOFF_MS * 2 ** attempt, MAX_RECONNECT_MS);
50
+ api.log("warn", `[sumeclaw] ${backoff / 1000}s 后重连(第 ${attempt} 次)`);
51
+ reconnectTimer = setTimeout(() => connect(), backoff);
52
+ };
53
+ ws.on("open", () => {
54
+ attempt = 0;
55
+ connections.set(accountId, ws);
56
+ api.log("info", "[sumeclaw] ✅ 已连接到友虾名片平台");
57
+ // 上报插件注册信息
58
+ ws.send(JSON.stringify({
59
+ type: "register_info",
60
+ agentId: "auto",
61
+ pluginVersion: pkg.version,
62
+ }));
63
+ // 启动心跳
64
+ heartbeat = setInterval(() => {
65
+ if (ws.readyState === WebSocket.OPEN) {
66
+ ws.send(JSON.stringify({ type: "heartbeat" }));
67
+ }
68
+ }, HEARTBEAT_MS);
69
+ });
70
+ ws.on("message", async (raw) => {
71
+ try {
72
+ const msg = JSON.parse(raw.toString());
73
+ // 心跳 ack — 无需处理
74
+ if (msg.type === "heartbeat_ack")
75
+ return;
76
+ // 平台下发的用户消息 → 注入 OpenClaw Agent
77
+ if (msg.type === "hooks_agent") {
78
+ const { payload } = msg;
79
+ const sessionKey = payload.sessionKey ?? `${Date.now()}`;
80
+ const message = payload.message ?? "";
81
+ const meta = payload.meta ?? {};
82
+ api.log("info", `[sumeclaw] 收到用户消息: sessionKey=${sessionKey}`);
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
+ api.log("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
+ api.log("error", `[sumeclaw] 消息处理失败: ${err.message}`);
127
+ }
128
+ });
129
+ ws.on("close", (code, reason) => {
130
+ if (heartbeat)
131
+ clearInterval(heartbeat);
132
+ connections.delete(accountId);
133
+ api.log("warn", `[sumeclaw] 连接断开 (code=${code}), 准备重连`);
134
+ scheduleReconnect();
135
+ });
136
+ ws.on("error", (err) => {
137
+ if (heartbeat)
138
+ clearInterval(heartbeat);
139
+ api.log("error", `[sumeclaw] WebSocket 错误: ${err.message}`);
140
+ // ws.on("close") 会触发重连
141
+ });
142
+ };
143
+ connect();
144
+ }
145
+ /**
146
+ * 断开到友虾名片平台的 WebSocket 连接。
147
+ */
148
+ export async function disconnectSumeclaw(accountId) {
149
+ const ws = connections.get(accountId);
150
+ if (ws) {
151
+ connections.delete(accountId);
152
+ ws.close(1000, "用户主动断开");
153
+ }
154
+ }
155
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "sumeclaw",
3
+ "name": "友虾名片",
4
+ "version": "1.0.0",
5
+ "description": "将 OpenClaw 连接到友虾名片平台(wss://api.gixin.cc),通过 AI 名片为客户提供服务。",
6
+ "author": "sumeai",
7
+ "homepage": "https://www.gixin.cc",
8
+ "configSchema": {
9
+ "type": "object",
10
+ "properties": {
11
+ "registrationToken": {
12
+ "type": "string",
13
+ "description": "在友虾小程序中创建 OpenClaw 智能体后获得的注册 Token",
14
+ "secret": true
15
+ },
16
+ "platformUrl": {
17
+ "type": "string",
18
+ "description": "友虾名片平台 WebSocket 地址",
19
+ "default": "wss://api.gixin.cc"
20
+ }
21
+ },
22
+ "required": ["registrationToken"]
23
+ }
24
+ }
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@sumeai/sumeclaw",
3
+ "version": "1.0.0",
4
+ "description": "友虾名片 OpenClaw Channel 插件 — 将 OpenClaw 连接到友虾名片平台,通过 AI 名片为客户提供服务",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch"
10
+ },
11
+ "openclaw": {
12
+ "extensions": [
13
+ "dist/index.js"
14
+ ],
15
+ "setupEntry": "dist/setup-entry.js",
16
+ "channel": {
17
+ "id": "sumeclaw",
18
+ "label": "友虾名片",
19
+ "blurb": "将 OpenClaw 连接到友虾名片平台,通过 AI 名片为客户提供服务。"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "ws": "^8.18.0"
24
+ },
25
+ "devDependencies": {
26
+ "typescript": "^5.7.0",
27
+ "@types/ws": "^8.5.0"
28
+ },
29
+ "engines": {
30
+ "openclaw": ">=2026.3.22"
31
+ },
32
+ "keywords": [
33
+ "openclaw",
34
+ "channel",
35
+ "minicard",
36
+ "友虾名片",
37
+ "ai-card"
38
+ ],
39
+ "author": "sumeai",
40
+ "license": "MIT",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ }
44
+ }