timbot 2026.2.3

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/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # Tencent Cloud IM Channel Plugin for Clawdbot
2
+
3
+ Maintainer: longyuqi@tencent.com
4
+
5
+ Status: Tencent Cloud IM intelligent bot via webhooks + REST API.
6
+
7
+ ## Install
8
+
9
+ ### Option A: Install from npm
10
+ ```bash
11
+ clawdbot plugins install @clawdbot/timbot
12
+ clawdbot plugins enable timbot
13
+ clawdbot gateway restart
14
+ ```
15
+
16
+ ### Option B: Local development (link)
17
+ ```bash
18
+ clawdbot plugins install --link extensions/timbot
19
+ clawdbot plugins enable timbot
20
+ clawdbot gateway restart
21
+ ```
22
+
23
+ ## Configure
24
+
25
+ ```json5
26
+ {
27
+ channels: {
28
+ timbot: {
29
+ enabled: true,
30
+ webhookPath: "/timbot",
31
+ sdkAppId: "YOUR_SDK_APP_ID",
32
+ secretKey: "YOUR_SECRET_KEY",
33
+ botAccount: "YOUR_BOT_ACCOUNT",
34
+ apiDomain: "https://console.tim.qq.com",
35
+ token: "YOUR_CALLBACK_TOKEN",
36
+ welcomeText: "Hello!",
37
+ dm: { policy: "open" }
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ ### Configuration Options
44
+
45
+ | Option | Description |
46
+ |--------|-------------|
47
+ | `webhookPath` | Webhook endpoint path |
48
+ | `sdkAppId` | Tencent Cloud IM SDK App ID |
49
+ | `secretKey` | Secret key for generating UserSig (obtained from IM Console) |
50
+ | `botAccount` | Bot account ID |
51
+ | `apiDomain` | Tencent IM API domain |
52
+ | `token` | Callback token for signature verification |
53
+ | `welcomeText` | Welcome message for new conversations |
54
+ | `dm.policy` | DM policy: `pairing`, `allowlist`, `open`, or `disabled` |
55
+
56
+ ## Notes
57
+
58
+ - Webhooks require public HTTPS. For security, only expose the webhook path to the internet.
59
+ - Obtain `sdkAppId` and `secretKey` from the [Tencent Cloud IM Console](https://console.cloud.tencent.com/im). The `secretKey` is used to dynamically generate UserSig.
60
+ - Supports multiple accounts via the `accounts` configuration.
61
+
62
+ ---
63
+
64
+ # Clawdbot 腾讯云 IM Channel 插件
65
+
66
+ 维护者:longyuqi@tencent.com
67
+
68
+ 状态:支持腾讯云即时通信 IM 智能机器人,通过 Webhook 回调 + REST API 实现。
69
+
70
+ ## 安装
71
+
72
+ ### 方式 A:从 npm 安装
73
+ ```bash
74
+ clawdbot plugins install @clawdbot/timbot
75
+ clawdbot plugins enable timbot
76
+ clawdbot gateway restart
77
+ ```
78
+
79
+ ### 方式 B:本地开发(link)
80
+ ```bash
81
+ clawdbot plugins install --link extensions/timbot
82
+ clawdbot plugins enable timbot
83
+ clawdbot gateway restart
84
+ ```
85
+
86
+ ## 配置
87
+
88
+ ```json5
89
+ {
90
+ channels: {
91
+ timbot: {
92
+ enabled: true,
93
+ webhookPath: "/timbot",
94
+ sdkAppId: "YOUR_SDK_APP_ID",
95
+ secretKey: "YOUR_SECRET_KEY",
96
+ botAccount: "YOUR_BOT_ACCOUNT",
97
+ apiDomain: "https://console.tim.qq.com",
98
+ token: "YOUR_CALLBACK_TOKEN",
99
+ welcomeText: "你好!",
100
+ dm: { policy: "open" }
101
+ }
102
+ }
103
+ }
104
+ ```
105
+
106
+ ### 配置项说明
107
+
108
+ | 配置项 | 说明 |
109
+ |--------|------|
110
+ | `webhookPath` | Webhook 回调路径 |
111
+ | `sdkAppId` | 腾讯云 IM SDK 应用 ID |
112
+ | `secretKey` | 密钥,用于动态生成 UserSig(从 IM 控制台获取) |
113
+ | `botAccount` | 机器人账号 ID |
114
+ | `apiDomain` | 腾讯 IM API 域名 |
115
+ | `token` | 回调签名验证 Token |
116
+ | `welcomeText` | 新会话欢迎语 |
117
+ | `dm.policy` | 私聊策略:`pairing`、`allowlist`、`open` 或 `disabled` |
118
+
119
+ ## 说明
120
+
121
+ - Webhook 必须是公网 HTTPS。出于安全考虑,建议只对外暴露 webhook 路径。
122
+ - `sdkAppId` 和 `secretKey` 需从[腾讯云 IM 控制台](https://console.cloud.tencent.com/im)获取。`secretKey` 用于动态生成 UserSig。
123
+ - 支持通过 `accounts` 配置多账号。
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Author: YanHaidao
3
+ */
4
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
5
+ declare const plugin: {
6
+ id: string;
7
+ name: string;
8
+ description: string;
9
+ configSchema: any;
10
+ register(api: OpenClawPluginApi): void;
11
+ };
12
+ export default plugin;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAO7D,QAAA,MAAM,MAAM;;;;;kBAKI,iBAAiB,GAAG,IAAI;CAKvC,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
2
+ import { handleTimbotWebhookRequest } from "./src/monitor.js";
3
+ import { setTimbotRuntime } from "./src/runtime.js";
4
+ import { timbotPlugin } from "./src/channel.js";
5
+ const plugin = {
6
+ id: "timbot",
7
+ name: "Tencent IM",
8
+ description: "Tencent Cloud IM intelligent bot channel via webhooks + REST API",
9
+ configSchema: emptyPluginConfigSchema(),
10
+ register(api) {
11
+ setTimbotRuntime(api.runtime);
12
+ api.registerChannel({ plugin: timbotPlugin });
13
+ api.registerHttpHandler(handleTimbotWebhookRequest);
14
+ },
15
+ };
16
+ export default plugin;
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,kEAAkE;IAC/E,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC7B,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9C,GAAG,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;IACtD,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { OpenClawConfig } from "openclaw/plugin-sdk";
2
+ import type { ResolvedTimbotAccount } from "./types.js";
3
+ export declare function listTimbotAccountIds(cfg: OpenClawConfig): string[];
4
+ export declare function resolveDefaultTimbotAccountId(cfg: OpenClawConfig): string;
5
+ export declare function resolveTimbotAccount(params: {
6
+ cfg: OpenClawConfig;
7
+ accountId?: string | null;
8
+ }): ResolvedTimbotAccount;
9
+ export declare function listEnabledTimbotAccounts(cfg: OpenClawConfig): ResolvedTimbotAccount[];
10
+ //# sourceMappingURL=accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAqC,MAAM,YAAY,CAAC;AAW3F,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAIlE;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAMzE;AAoBD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,qBAAqB,CAyCxB;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,cAAc,GAAG,qBAAqB,EAAE,CAItF"}
@@ -0,0 +1,83 @@
1
+ import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk";
2
+ import { logSimple } from "./logger.js";
3
+ const DEFAULT_API_DOMAIN = "console.tim.qq.com";
4
+ function listConfiguredAccountIds(cfg) {
5
+ const accounts = cfg.channels?.timbot?.accounts;
6
+ if (!accounts || typeof accounts !== "object")
7
+ return [];
8
+ return Object.keys(accounts).filter(Boolean);
9
+ }
10
+ export function listTimbotAccountIds(cfg) {
11
+ const ids = listConfiguredAccountIds(cfg);
12
+ if (ids.length === 0)
13
+ return [DEFAULT_ACCOUNT_ID];
14
+ return ids.sort((a, b) => a.localeCompare(b));
15
+ }
16
+ export function resolveDefaultTimbotAccountId(cfg) {
17
+ const timbotConfig = cfg.channels?.timbot;
18
+ if (timbotConfig?.defaultAccount?.trim())
19
+ return timbotConfig.defaultAccount.trim();
20
+ const ids = listTimbotAccountIds(cfg);
21
+ if (ids.includes(DEFAULT_ACCOUNT_ID))
22
+ return DEFAULT_ACCOUNT_ID;
23
+ return ids[0] ?? DEFAULT_ACCOUNT_ID;
24
+ }
25
+ function resolveAccountConfig(cfg, accountId) {
26
+ const accounts = cfg.channels?.timbot?.accounts;
27
+ if (!accounts || typeof accounts !== "object")
28
+ return undefined;
29
+ return accounts[accountId];
30
+ }
31
+ function mergeTimbotAccountConfig(cfg, accountId) {
32
+ const raw = (cfg.channels?.timbot ?? {});
33
+ const { accounts: _ignored, defaultAccount: _ignored2, ...base } = raw;
34
+ const account = resolveAccountConfig(cfg, accountId) ?? {};
35
+ const merged = { ...base, ...account };
36
+ return merged;
37
+ }
38
+ export function resolveTimbotAccount(params) {
39
+ const accountId = normalizeAccountId(params.accountId);
40
+ const timbotConfig = params.cfg.channels?.timbot;
41
+ const baseEnabled = timbotConfig?.enabled !== false;
42
+ const merged = mergeTimbotAccountConfig(params.cfg, accountId);
43
+ const enabled = baseEnabled && merged.enabled !== false;
44
+ // 从合并后的配置中提取字段
45
+ const sdkAppId = merged.sdkAppId?.trim() || undefined;
46
+ const identifier = merged.identifier?.trim() || undefined;
47
+ const secretKey = merged.secretKey?.trim() || undefined;
48
+ const botAccount = merged.botAccount?.trim() || undefined;
49
+ const apiDomain = merged.apiDomain?.trim() || DEFAULT_API_DOMAIN;
50
+ const token = merged.token?.trim() || undefined;
51
+ // 配置完整需要 sdkAppId + secretKey(identifier 可选,默认使用 administrator)
52
+ const configured = Boolean(sdkAppId && secretKey);
53
+ // 配置不完整时输出警告
54
+ if (!configured && Boolean(timbotConfig)) {
55
+ const missing = [];
56
+ if (!sdkAppId)
57
+ missing.push("sdkAppId");
58
+ if (!secretKey)
59
+ missing.push("secretKey");
60
+ if (missing.length > 0) {
61
+ logSimple("warn", `配置不完整,缺少: ${missing.join(", ")}`);
62
+ }
63
+ }
64
+ return {
65
+ accountId,
66
+ name: merged.name?.trim() || undefined,
67
+ enabled,
68
+ configured,
69
+ sdkAppId,
70
+ identifier,
71
+ secretKey,
72
+ botAccount,
73
+ apiDomain,
74
+ token,
75
+ config: merged,
76
+ };
77
+ }
78
+ export function listEnabledTimbotAccounts(cfg) {
79
+ return listTimbotAccountIds(cfg)
80
+ .map((accountId) => resolveTimbotAccount({ cfg, accountId }))
81
+ .filter((account) => account.enabled);
82
+ }
83
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ChannelPlugin } from "openclaw/plugin-sdk";
2
+ import type { ResolvedTimbotAccount } from "./types.js";
3
+ export declare const timbotPlugin: ChannelPlugin<ResolvedTimbotAccount>;
4
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAU7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAsBxD,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,qBAAqB,CAyL7D,CAAC"}
@@ -0,0 +1,203 @@
1
+ import { DEFAULT_ACCOUNT_ID, deleteAccountFromConfigSection, formatPairingApproveHint, setAccountEnabledInConfigSection, } from "openclaw/plugin-sdk";
2
+ import { listTimbotAccountIds, resolveDefaultTimbotAccountId, resolveTimbotAccount } from "./accounts.js";
3
+ import { timbotConfigSchema } from "./config-schema.js";
4
+ import { registerTimbotWebhookTarget, sendTimbotMessage } from "./monitor.js";
5
+ const meta = {
6
+ id: "timbot",
7
+ label: "Tencent IM",
8
+ selectionLabel: "Tencent IM (plugin)",
9
+ detailLabel: "Tencent Cloud IM Bot",
10
+ docsPath: "/channels/timbot",
11
+ docsLabel: "timbot",
12
+ blurb: "Tencent Cloud IM bot via webhooks + REST API.",
13
+ aliases: ["tencentim", "腾讯im", "即时通信"],
14
+ order: 85,
15
+ quickstartAllowFrom: true,
16
+ };
17
+ function normalizeTimbotMessagingTarget(raw) {
18
+ const trimmed = raw.trim();
19
+ if (!trimmed)
20
+ return undefined;
21
+ return trimmed.replace(/^(timbot|tencentim):/i, "").trim() || undefined;
22
+ }
23
+ export const timbotPlugin = {
24
+ id: "timbot",
25
+ meta,
26
+ capabilities: {
27
+ chatTypes: ["direct"],
28
+ media: false,
29
+ reactions: false,
30
+ threads: false,
31
+ polls: false,
32
+ nativeCommands: false,
33
+ blockStreaming: false,
34
+ },
35
+ reload: { configPrefixes: ["channels.timbot"] },
36
+ configSchema: timbotConfigSchema,
37
+ config: {
38
+ listAccountIds: (cfg) => listTimbotAccountIds(cfg),
39
+ resolveAccount: (cfg, accountId) => resolveTimbotAccount({ cfg: cfg, accountId }),
40
+ defaultAccountId: (cfg) => resolveDefaultTimbotAccountId(cfg),
41
+ setAccountEnabled: ({ cfg, accountId, enabled }) => setAccountEnabledInConfigSection({
42
+ cfg: cfg,
43
+ sectionKey: "timbot",
44
+ accountId,
45
+ enabled,
46
+ allowTopLevel: true,
47
+ }),
48
+ deleteAccount: ({ cfg, accountId }) => deleteAccountFromConfigSection({
49
+ cfg: cfg,
50
+ sectionKey: "timbot",
51
+ clearBaseFields: ["name", "webhookPath", "sdkAppId", "identifier", "secretKey", "botAccount", "apiDomain", "welcomeText"],
52
+ accountId,
53
+ }),
54
+ isConfigured: (account) => account.configured,
55
+ describeAccount: (account) => ({
56
+ accountId: account.accountId,
57
+ name: account.name,
58
+ enabled: account.enabled,
59
+ configured: account.configured,
60
+ webhookPath: account.config.webhookPath ?? "/timbot",
61
+ }),
62
+ resolveAllowFrom: ({ cfg, accountId }) => {
63
+ const account = resolveTimbotAccount({ cfg: cfg, accountId });
64
+ return (account.config.dm?.allowFrom ?? []).map((entry) => String(entry));
65
+ },
66
+ formatAllowFrom: ({ allowFrom }) => allowFrom
67
+ .map((entry) => String(entry).trim())
68
+ .filter(Boolean)
69
+ .map((entry) => entry.toLowerCase()),
70
+ },
71
+ security: {
72
+ resolveDmPolicy: ({ cfg, accountId, account }) => {
73
+ const resolvedAccountId = accountId ?? account.accountId ?? DEFAULT_ACCOUNT_ID;
74
+ const useAccountPath = Boolean(cfg.channels?.timbot?.accounts?.[resolvedAccountId]);
75
+ const basePath = useAccountPath ? `channels.timbot.accounts.${resolvedAccountId}.` : "channels.timbot.";
76
+ return {
77
+ policy: account.config.dm?.policy ?? "open",
78
+ allowFrom: (account.config.dm?.allowFrom ?? []).map((entry) => String(entry)),
79
+ policyPath: `${basePath}dm.policy`,
80
+ allowFromPath: `${basePath}dm.allowFrom`,
81
+ approveHint: formatPairingApproveHint("timbot"),
82
+ normalizeEntry: (raw) => raw.trim().toLowerCase(),
83
+ };
84
+ },
85
+ },
86
+ groups: {
87
+ resolveRequireMention: () => true,
88
+ },
89
+ threading: {
90
+ resolveReplyToMode: () => "off",
91
+ },
92
+ messaging: {
93
+ normalizeTarget: normalizeTimbotMessagingTarget,
94
+ targetResolver: {
95
+ looksLikeId: (raw) => Boolean(raw.trim()),
96
+ hint: "<userid>",
97
+ },
98
+ },
99
+ outbound: {
100
+ deliveryMode: "direct",
101
+ chunkerMode: "text",
102
+ textChunkLimit: 10000,
103
+ sendText: async ({ account, target, text }) => {
104
+ const result = await sendTimbotMessage({
105
+ account,
106
+ toAccount: target,
107
+ text,
108
+ fromAccount: account.botAccount,
109
+ });
110
+ return {
111
+ channel: "timbot",
112
+ ok: result.ok,
113
+ messageId: result.messageId ?? "",
114
+ error: result.error ? new Error(result.error) : undefined,
115
+ };
116
+ },
117
+ },
118
+ status: {
119
+ defaultRuntime: {
120
+ accountId: DEFAULT_ACCOUNT_ID,
121
+ running: false,
122
+ lastStartAt: null,
123
+ lastStopAt: null,
124
+ lastError: null,
125
+ },
126
+ buildChannelSummary: ({ snapshot }) => ({
127
+ configured: snapshot.configured ?? false,
128
+ running: snapshot.running ?? false,
129
+ webhookPath: snapshot.webhookPath ?? null,
130
+ lastStartAt: snapshot.lastStartAt ?? null,
131
+ lastStopAt: snapshot.lastStopAt ?? null,
132
+ lastError: snapshot.lastError ?? null,
133
+ lastInboundAt: snapshot.lastInboundAt ?? null,
134
+ lastOutboundAt: snapshot.lastOutboundAt ?? null,
135
+ probe: snapshot.probe,
136
+ lastProbeAt: snapshot.lastProbeAt ?? null,
137
+ }),
138
+ probeAccount: async () => ({ ok: true }),
139
+ buildAccountSnapshot: ({ account, runtime }) => ({
140
+ accountId: account.accountId,
141
+ name: account.name,
142
+ enabled: account.enabled,
143
+ configured: account.configured,
144
+ webhookPath: account.config.webhookPath ?? "/timbot",
145
+ running: runtime?.running ?? false,
146
+ lastStartAt: runtime?.lastStartAt ?? null,
147
+ lastStopAt: runtime?.lastStopAt ?? null,
148
+ lastError: runtime?.lastError ?? null,
149
+ lastInboundAt: runtime?.lastInboundAt ?? null,
150
+ lastOutboundAt: runtime?.lastOutboundAt ?? null,
151
+ dmPolicy: account.config.dm?.policy ?? "open",
152
+ }),
153
+ },
154
+ gateway: {
155
+ startAccount: async (ctx) => {
156
+ const account = ctx.account;
157
+ // verbose 级别打印配置信息
158
+ ctx.log?.debug(`启动账号: ${account.accountId}, configured=${account.configured}, enabled=${account.enabled}`);
159
+ ctx.log?.debug(`sdkAppId=${account.sdkAppId ?? "[未设置]"}, secretKey=${account.secretKey ? "[已配置]" : "[未设置]"}`);
160
+ if (!account.configured) {
161
+ ctx.log?.warn(`[${account.accountId}] timbot not configured; skipping webhook registration`);
162
+ ctx.setStatus({ accountId: account.accountId, running: false, configured: false });
163
+ return { stop: () => { } };
164
+ }
165
+ const path = (account.config.webhookPath ?? "/timbot").trim();
166
+ const unregister = registerTimbotWebhookTarget({
167
+ account,
168
+ config: ctx.cfg,
169
+ runtime: ctx.runtime,
170
+ core: {},
171
+ path,
172
+ statusSink: (patch) => ctx.setStatus({ accountId: ctx.accountId, ...patch }),
173
+ });
174
+ ctx.log?.info(`[${account.accountId}] timbot webhook registered at ${path}`);
175
+ ctx.setStatus({
176
+ accountId: account.accountId,
177
+ running: true,
178
+ configured: true,
179
+ webhookPath: path,
180
+ lastStartAt: Date.now(),
181
+ });
182
+ return {
183
+ stop: () => {
184
+ unregister();
185
+ ctx.log?.info(`[${account.accountId}] timbot webhook unregistered`);
186
+ ctx.setStatus({
187
+ accountId: account.accountId,
188
+ running: false,
189
+ lastStopAt: Date.now(),
190
+ });
191
+ },
192
+ };
193
+ },
194
+ stopAccount: async (ctx) => {
195
+ ctx.setStatus({
196
+ accountId: ctx.account.accountId,
197
+ running: false,
198
+ lastStopAt: Date.now(),
199
+ });
200
+ },
201
+ },
202
+ };
203
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ChannelConfigSchema } from "openclaw/plugin-sdk";
2
+ export declare const timbotConfigSchema: ChannelConfigSchema;
3
+ //# sourceMappingURL=config-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAiC/D,eAAO,MAAM,kBAAkB,EAAE,mBAwBhC,CAAC"}
@@ -0,0 +1,55 @@
1
+ const dmSchema = {
2
+ type: "object",
3
+ properties: {
4
+ enabled: { type: "boolean" },
5
+ policy: { type: "string", enum: ["pairing", "allowlist", "open", "disabled"] },
6
+ allowFrom: {
7
+ type: "array",
8
+ items: { oneOf: [{ type: "string" }, { type: "number" }] },
9
+ },
10
+ },
11
+ additionalProperties: false,
12
+ };
13
+ const accountSchema = {
14
+ type: "object",
15
+ properties: {
16
+ name: { type: "string" },
17
+ enabled: { type: "boolean" },
18
+ webhookPath: { type: "string" },
19
+ sdkAppId: { type: "string" },
20
+ identifier: { type: "string" },
21
+ secretKey: { type: "string" },
22
+ botAccount: { type: "string" },
23
+ apiDomain: { type: "string" },
24
+ token: { type: "string" },
25
+ welcomeText: { type: "string" },
26
+ dm: dmSchema,
27
+ },
28
+ additionalProperties: false,
29
+ };
30
+ export const timbotConfigSchema = {
31
+ schema: {
32
+ $schema: "http://json-schema.org/draft-07/schema#",
33
+ type: "object",
34
+ properties: {
35
+ name: { type: "string" },
36
+ enabled: { type: "boolean" },
37
+ webhookPath: { type: "string" },
38
+ sdkAppId: { type: "string" },
39
+ identifier: { type: "string" },
40
+ secretKey: { type: "string" },
41
+ botAccount: { type: "string" },
42
+ apiDomain: { type: "string" },
43
+ token: { type: "string" },
44
+ welcomeText: { type: "string" },
45
+ dm: dmSchema,
46
+ defaultAccount: { type: "string" },
47
+ accounts: {
48
+ type: "object",
49
+ additionalProperties: accountSchema,
50
+ },
51
+ },
52
+ additionalProperties: false,
53
+ },
54
+ };
55
+ //# sourceMappingURL=config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG;IACf,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;QAC9E,SAAS,EAAE;YACT,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;SAC3D;KACF;IACD,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,EAAE,EAAE,QAAQ;KACb;IACD,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,MAAM,EAAE;QACN,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,EAAE,EAAE,QAAQ;YACZ,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAClC,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,aAAa;aACpC;SACF;QACD,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC"}
@@ -0,0 +1,99 @@
1
+ /* eslint-disable */
2
+ import LibGenerateTestUserSig from './lib-generate-test-usersig-es.min.js';
3
+
4
+ /**
5
+ * 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。
6
+ *
7
+ * 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId,
8
+ * 它是腾讯云用于区分客户的唯一标识。
9
+ */
10
+ const SDKAPPID = 0;
11
+
12
+
13
+ /**
14
+ * 签名过期时间,建议不要设置的过短
15
+ * <p>
16
+ * 时间单位:秒
17
+ * 默认时间:7 x 24 x 60 x 60 = 604800 = 7 天
18
+ */
19
+ const EXPIRETIME = 604800;
20
+
21
+
22
+ /**
23
+ * 计算签名用的加密密钥,获取步骤如下:
24
+ *
25
+ * step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,
26
+ * step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。
27
+ * step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
28
+ *
29
+ * 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
30
+ * 文档:https://cloud.tencent.com/document/product/647/17275#Server
31
+ */
32
+ const SECRETKEY = '';
33
+
34
+ /*
35
+ * Module: GenerateTestUserSig
36
+ *
37
+ * Function: 用于生成测试用的 UserSig,UserSig 是腾讯云为其云服务设计的一种安全保护签名。
38
+ * 其计算方法是对 SDKAppID、UserID 和 EXPIRETIME 进行加密,加密算法为 HMAC-SHA256。
39
+ *
40
+ * Attention: 请不要将如下代码发布到您的线上正式版本的 App 中,原因如下:
41
+ *
42
+ * 本文件中的代码虽然能够正确计算出 UserSig,但仅适合快速调通 SDK 的基本功能,不适合线上产品,
43
+ * 这是因为客户端代码中的 SECRETKEY 很容易被反编译逆向破解,尤其是 Web 端的代码被破解的难度几乎为零。
44
+ * 一旦您的密钥泄露,攻击者就可以计算出正确的 UserSig 来盗用您的腾讯云流量。
45
+ *
46
+ * 正确的做法是将 UserSig 的计算代码和加密密钥放在您的业务服务器上,然后由 App 按需向您的服务器获取实时算出的 UserSig。
47
+ * 由于破解服务器的成本要高于破解客户端 App,所以服务器计算的方案能够更好地保护您的加密密钥。
48
+ *
49
+ * Reference:https://cloud.tencent.com/document/product/647/17275#Server
50
+ */
51
+
52
+ /**
53
+ * 生成临时 UserSig,请不要将如下代码发布或者提交到您的代码仓库中。
54
+ *
55
+ * @param {{userID: string, SDKAppID: number, SecretKey: string, ExpireTime?: number}} options
56
+ * @param {string} options.userID - 用户名
57
+ * @param {string} options.SDKAppID:开发者在控制台注册的应用的 SDKAppID
58
+ * @param {string} options.SecretKey:开发者在控制台注册的应用的 SecretKey
59
+ * @param {number=} options.ExpireTime:签名过期时间,建议不要设置的过短,时间单位:秒,默认时间:7 x 24 x 60 x 60 = 604800 = 7 天
60
+ *
61
+ * @returns {{userSig: string, SDKAppID: number}} result
62
+ * @returns {string} result.userSig:用户签名
63
+ * @returns {number} result.SDKAppID:SDKAppID
64
+ *
65
+ * @example
66
+ * const { userSig } = genTestUserSig({
67
+ * userID: "Alice",
68
+ * SDKAppID: 0,
69
+ * SecretKey: "YOUR_SECRETKEY"
70
+ * });
71
+ */
72
+ function genTestUserSig({ userID, SDKAppID, SecretKey, ExpireTime }) {
73
+ if (!userID) {
74
+ console.error("userID 参数缺失");
75
+ return;
76
+ }
77
+ if (!SDKAppID) {
78
+ console.error("SDKAppID 参数缺失");
79
+ return;
80
+ }
81
+ if (!SecretKey) {
82
+ console.error("SecretKey 参数缺失");
83
+ return;
84
+ }
85
+
86
+ const sdkAppID = SDKAppID || SDKAPPID;
87
+ const secretKey = SecretKey || SECRETKEY;
88
+ const expireTime = ExpireTime || EXPIRETIME;
89
+
90
+ const generator = new LibGenerateTestUserSig(sdkAppID, secretKey, expireTime);
91
+ const userSig = generator.genTestUserSig(userID);
92
+
93
+ return {
94
+ userSig,
95
+ SDKAppID: sdkAppID
96
+ };
97
+ }
98
+
99
+ export { genTestUserSig };