@sumeai/sumeclaw 1.1.19 → 1.2.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.
- package/dist/channel-CAf407pr.d.ts +7 -0
- package/dist/chunk-RIUKFLMY.js +746 -0
- package/dist/chunk-RIUKFLMY.js.map +1 -0
- package/dist/index.d.ts +14 -3
- package/dist/index.js +83 -66
- package/dist/index.js.map +1 -1
- package/dist/setup-entry.d.ts +8 -3
- package/dist/setup-entry.js +10 -11
- package/dist/setup-entry.js.map +1 -1
- package/openclaw.plugin.json +101 -10
- package/package.json +37 -28
- package/readme.md +61 -0
- package/dist/index.d.ts.map +0 -1
- package/dist/setup-entry.d.ts.map +0 -1
- package/dist/src/channel.d.ts +0 -7
- package/dist/src/channel.d.ts.map +0 -1
- package/dist/src/channel.js +0 -162
- package/dist/src/channel.js.map +0 -1
- package/dist/src/gateway.d.ts +0 -46
- package/dist/src/gateway.d.ts.map +0 -1
- package/dist/src/gateway.js +0 -621
- package/dist/src/gateway.js.map +0 -1
- package/dist/src/runtime.d.ts +0 -3
- package/dist/src/runtime.d.ts.map +0 -1
- package/dist/src/runtime.js +0 -12
- package/dist/src/runtime.js.map +0 -1
package/dist/src/channel.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwDD,eAAO,MAAM,cAAc,KAqHzB,CAAC"}
|
package/dist/src/channel.js
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sumeclawPlugin = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* 友虾名片 ChannelPlugin 核心定义
|
|
6
|
-
*
|
|
7
|
-
* 基于新版 plugin-sdk(2026.3.22+)的 createChatChannelPlugin API。
|
|
8
|
-
*/
|
|
9
|
-
const channel_core_1 = require("openclaw/plugin-sdk/channel-core");
|
|
10
|
-
const gateway_js_1 = require("./gateway.js");
|
|
11
|
-
/**
|
|
12
|
-
* 安装/配置向导 — 交互式提示用户输入 registrationToken
|
|
13
|
-
*/
|
|
14
|
-
const channelKey = "sumeclaw";
|
|
15
|
-
const channelConfigAdapter = {
|
|
16
|
-
listAccountIds(cfg) {
|
|
17
|
-
const accounts = cfg.channels?.[channelKey]?.accounts ?? {};
|
|
18
|
-
return Object.keys(accounts);
|
|
19
|
-
},
|
|
20
|
-
resolveAccount(cfg, accountId) {
|
|
21
|
-
const accounts = cfg.channels?.[channelKey]?.accounts ?? {};
|
|
22
|
-
return (accounts[accountId ?? "default"] ?? {});
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
const setupWizard = {
|
|
26
|
-
channel: channelKey,
|
|
27
|
-
/** 根据当前配置显示连接状态 */
|
|
28
|
-
status: {
|
|
29
|
-
configuredLabel: "已连接友虾名片",
|
|
30
|
-
unconfiguredLabel: "尚未配置",
|
|
31
|
-
resolveConfigured: ({ cfg }) => {
|
|
32
|
-
const accounts = cfg.channels?.[channelKey]?.accounts ?? {};
|
|
33
|
-
return Object.values(accounts).some((acct) => acct?.registrationToken);
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
/** 交互式凭据收集 — 引导用户输入 registrationToken */
|
|
37
|
-
credentials: [
|
|
38
|
-
{
|
|
39
|
-
inputKey: "registrationToken",
|
|
40
|
-
credentialLabel: "友虾名片注册令牌",
|
|
41
|
-
preferredEnvVar: "SUMECLAW_REGISTRATION_TOKEN",
|
|
42
|
-
envPrompt: "是否使用环境变量 SUMECLAW_REGISTRATION_TOKEN?",
|
|
43
|
-
keepPrompt: "保留当前 registrationToken?",
|
|
44
|
-
inputPrompt: "请输入从友虾小程序获取的 registrationToken:",
|
|
45
|
-
inspect: ({ cfg, accountId }) => {
|
|
46
|
-
const token = cfg.channels?.[channelKey]?.accounts?.[accountId ?? "default"]?.registrationToken;
|
|
47
|
-
return {
|
|
48
|
-
accountConfigured: Boolean(token),
|
|
49
|
-
hasConfiguredValue: Boolean(token),
|
|
50
|
-
};
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
};
|
|
55
|
-
exports.sumeclawPlugin = (0, channel_core_1.createChatChannelPlugin)({
|
|
56
|
-
base: (0, channel_core_1.createChannelPluginBase)({
|
|
57
|
-
id: channelKey,
|
|
58
|
-
setupWizard,
|
|
59
|
-
setup: {
|
|
60
|
-
/**
|
|
61
|
-
* 从用户配置中解析账户信息
|
|
62
|
-
*/
|
|
63
|
-
resolveAccount(cfg, accountId) {
|
|
64
|
-
const accounts = cfg.channels?.[channelKey]?.accounts ?? {};
|
|
65
|
-
return (accounts[accountId ?? "default"] ?? {});
|
|
66
|
-
},
|
|
67
|
-
/**
|
|
68
|
-
* 检查账户配置状态
|
|
69
|
-
*/
|
|
70
|
-
inspectAccount(cfg, accountId) {
|
|
71
|
-
const account = cfg.channels?.[channelKey]?.accounts?.[accountId ?? "default"];
|
|
72
|
-
return {
|
|
73
|
-
enabled: !!account?.registrationToken,
|
|
74
|
-
configured: !!account?.registrationToken,
|
|
75
|
-
};
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
}),
|
|
79
|
-
/**
|
|
80
|
-
* 渠道配置适配器 (ChannelConfigAdapter)
|
|
81
|
-
*/
|
|
82
|
-
config: channelConfigAdapter,
|
|
83
|
-
/**
|
|
84
|
-
* DM 安全策略
|
|
85
|
-
*
|
|
86
|
-
* 友虾名片场景下,所有通过名片访问的用户都允许对话。
|
|
87
|
-
* 名片主可在小程序端管理黑名单(后续扩展)。
|
|
88
|
-
*/
|
|
89
|
-
security: {
|
|
90
|
-
dm: {
|
|
91
|
-
channelKey: "sumeclaw",
|
|
92
|
-
resolvePolicy: () => "open",
|
|
93
|
-
defaultPolicy: "open",
|
|
94
|
-
},
|
|
95
|
-
},
|
|
96
|
-
/**
|
|
97
|
-
* 出站消息处理
|
|
98
|
-
*
|
|
99
|
-
* 当 OpenClaw Agent 生成回复后,通过 WebSocket 推回友虾名片平台。
|
|
100
|
-
*/
|
|
101
|
-
outbound: {
|
|
102
|
-
attachedResults: {
|
|
103
|
-
sendText: async ({ text, to, accountId }) => {
|
|
104
|
-
const resolvedAccountId = accountId ?? "default";
|
|
105
|
-
const ws = (0, gateway_js_1.getWebSocket)(resolvedAccountId);
|
|
106
|
-
if (!ws || ws.readyState !== 1) {
|
|
107
|
-
throw new Error("WebSocket 未连接到友虾名片平台");
|
|
108
|
-
}
|
|
109
|
-
const pending = (0, gateway_js_1.getPendingReplyContext)(resolvedAccountId, to);
|
|
110
|
-
const messageId = `sumeclaw-${Date.now()}`;
|
|
111
|
-
if (pending?.stream) {
|
|
112
|
-
(0, gateway_js_1.appendPendingReplyText)(resolvedAccountId, to, text);
|
|
113
|
-
ws.send(JSON.stringify({
|
|
114
|
-
type: "agent_delta",
|
|
115
|
-
requestId: pending.requestId,
|
|
116
|
-
userId: to,
|
|
117
|
-
sessionKey: pending.sessionKey,
|
|
118
|
-
text,
|
|
119
|
-
messageId,
|
|
120
|
-
}));
|
|
121
|
-
console.log("[sumeclaw] 📤 outbound agent_delta sent", {
|
|
122
|
-
accountId: resolvedAccountId,
|
|
123
|
-
requestId: pending.requestId,
|
|
124
|
-
userId: to,
|
|
125
|
-
textLength: text.length,
|
|
126
|
-
});
|
|
127
|
-
return { messageId };
|
|
128
|
-
}
|
|
129
|
-
if (pending && !pending.stream) {
|
|
130
|
-
(0, gateway_js_1.appendPendingReplyText)(resolvedAccountId, to, text);
|
|
131
|
-
console.log("[sumeclaw] 📥 outbound reply buffered", {
|
|
132
|
-
accountId: resolvedAccountId,
|
|
133
|
-
requestId: pending.requestId,
|
|
134
|
-
userId: to,
|
|
135
|
-
textLength: text.length,
|
|
136
|
-
});
|
|
137
|
-
return { messageId };
|
|
138
|
-
}
|
|
139
|
-
const finalPending = (0, gateway_js_1.consumePendingReplyContext)(resolvedAccountId, to);
|
|
140
|
-
ws.send(JSON.stringify({
|
|
141
|
-
type: "agent_reply",
|
|
142
|
-
requestId: finalPending?.requestId,
|
|
143
|
-
userId: to,
|
|
144
|
-
sessionKey: finalPending?.sessionKey,
|
|
145
|
-
text,
|
|
146
|
-
messageId,
|
|
147
|
-
}));
|
|
148
|
-
console.log("[sumeclaw] 📤 outbound agent_reply sent", {
|
|
149
|
-
accountId: resolvedAccountId,
|
|
150
|
-
requestId: finalPending?.requestId,
|
|
151
|
-
userId: to,
|
|
152
|
-
textLength: text.length,
|
|
153
|
-
});
|
|
154
|
-
return { messageId };
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
// Some OpenClaw gateway health paths read plugin.config directly after the
|
|
160
|
-
// SDK wrapper is created. Keep this explicit for compatibility across builds.
|
|
161
|
-
exports.sumeclawPlugin.config ??= channelConfigAdapter;
|
|
162
|
-
//# sourceMappingURL=channel.js.map
|
package/dist/src/channel.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}
|
package/dist/src/gateway.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
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
|
-
export declare function getWebSocket(accountId: string): WebSocket | undefined;
|
|
13
|
-
export declare function rememberPendingReplyContext(params: {
|
|
14
|
-
accountId: string;
|
|
15
|
-
userId: string;
|
|
16
|
-
requestId?: string;
|
|
17
|
-
sessionKey: string;
|
|
18
|
-
stream?: boolean;
|
|
19
|
-
}): void;
|
|
20
|
-
export declare function getPendingReplyContext(accountId: string, userId: string): {
|
|
21
|
-
requestId?: string;
|
|
22
|
-
sessionKey: string;
|
|
23
|
-
stream?: boolean;
|
|
24
|
-
accumulatedText: string;
|
|
25
|
-
} | undefined;
|
|
26
|
-
export declare function consumePendingReplyContext(accountId: string, userId: string): {
|
|
27
|
-
requestId?: string;
|
|
28
|
-
sessionKey: string;
|
|
29
|
-
stream?: boolean;
|
|
30
|
-
accumulatedText: string;
|
|
31
|
-
} | undefined;
|
|
32
|
-
export declare function appendPendingReplyText(accountId: string, userId: string, text: string): string;
|
|
33
|
-
export interface MinicardAccount {
|
|
34
|
-
registrationToken?: string;
|
|
35
|
-
platformUrl?: string;
|
|
36
|
-
enabled?: boolean;
|
|
37
|
-
}
|
|
38
|
-
type ConnectOptions = {
|
|
39
|
-
accountId: string;
|
|
40
|
-
platformUrl?: string;
|
|
41
|
-
registrationToken: string;
|
|
42
|
-
api: any;
|
|
43
|
-
};
|
|
44
|
-
export declare function connectGateway(opts: ConnectOptions): void;
|
|
45
|
-
export {};
|
|
46
|
-
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;AA4C3B,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAErE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,QAQA;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;gBA/BxD,MAAM;gBACN,MAAM;aACT,OAAO;qBACC,MAAM;cA8B1B;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;gBAnC5D,MAAM;gBACN,MAAM;aACT,OAAO;qBACC,MAAM;cAqC1B;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAarF;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,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,GAAG,CAAC;CACV,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,QAooBlD"}
|