timbot 2026.3.12 → 2026.3.19

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.en.md CHANGED
@@ -45,7 +45,7 @@ All options are under `channels.timbot` in the OpenClaw config.
45
45
  | `typingText` | Placeholder text while the bot is generating (in non-streaming mode, sent as a placeholder message then modified; in streaming mode, used as CompatibleText) | `正在思考中...` |
46
46
  | `streamingMode` | Streaming mode: `off` / `text_modify` / `custom_modify` / `tim_stream` | `off` |
47
47
  | `fallbackPolicy` | Streaming fallback policy: `strict` (no fallback) / `final_text` (degrade to final text on failure) | `strict` |
48
- | `overflowPolicy` | What to do when a streaming reply gets too large: `stop` (stop and send a notice) / `split` (continue by splitting into follow-up messages, default) | `split` |
48
+ | `overflowPolicy` | What to do when a streaming reply gets too large: `stop` (stop and send a notice, default) / `split` (continue by hard-splitting into follow-up messages) | `stop` |
49
49
 
50
50
  ### DM Policy
51
51
 
@@ -92,10 +92,10 @@ openclaw config set channels.timbot.streamingMode off
92
92
  # Set fallback policy to degrade to final text on failure
93
93
  openclaw config set channels.timbot.fallbackPolicy final_text
94
94
 
95
- # Stop and send a notice when streaming output gets too large
95
+ # Stop and send a notice when streaming output gets too large (default)
96
96
  openclaw config set channels.timbot.overflowPolicy stop
97
97
 
98
- # Continue by splitting long output into follow-up messages (default)
98
+ # Continue by hard-splitting long output into follow-up messages
99
99
  openclaw config set channels.timbot.overflowPolicy split
100
100
 
101
101
  # Customize typing placeholder text
package/README.md CHANGED
@@ -21,6 +21,11 @@ Local testing, streaming mode selection, and webhook replay examples are documen
21
21
 
22
22
  ## Changelog
23
23
 
24
+ ### 2026.3.19
25
+
26
+ - fix: 群聊多机器人路由匹配(`AtRobots_Account`)
27
+ - feat: Web Demo 支持添加非好友成员入群
28
+
24
29
  ### 2026.3.12
25
30
 
26
31
  - docs: 补充流式模式依赖上游 partial 输出的说明与可观测性日志
package/README.zh-CN.md CHANGED
@@ -45,7 +45,7 @@ bash install-timbot.sh
45
45
  | `typingText` | 机器人生成中占位文案(非流式模式下通过发送占位消息 + modify 实现;流式模式下作为 CompatibleText) | `正在思考中...` |
46
46
  | `streamingMode` | 流式模式:`off` / `text_modify` / `custom_modify` / `tim_stream` | `off` |
47
47
  | `fallbackPolicy` | 流式失败兜底策略:`strict`(不降级)/ `final_text`(降级为最终文本) | `strict` |
48
- | `overflowPolicy` | 流式超限后的处理策略:`stop`(停止并提示)/ `split`(按长度分段续发,默认) | `split` |
48
+ | `overflowPolicy` | 流式超限后的处理策略:`stop`(停止并提示,默认)/ `split`(按长度强行分段续发) | `stop` |
49
49
 
50
50
  ### 私聊策略(dm)
51
51
 
@@ -93,16 +93,307 @@ openclaw config set channels.timbot.streamingMode off
93
93
  # 设置失败兜底策略为降级发送最终文本
94
94
  openclaw config set channels.timbot.fallbackPolicy final_text
95
95
 
96
- # 长文本超限后直接停止并提示
96
+ # 长文本超限后直接停止并提示(默认)
97
97
  openclaw config set channels.timbot.overflowPolicy stop
98
98
 
99
- # 长文本超限后按长度继续分段发送(默认)
99
+ # 长文本超限后按长度继续分段发送
100
100
  openclaw config set channels.timbot.overflowPolicy split
101
101
 
102
102
  # 自定义占位文案
103
103
  openclaw config set channels.timbot.typingText "思考中,请稍候..."
104
104
  ```
105
105
 
106
+ ## 多 Agent 配置教程
107
+
108
+ timbot 支持在同一个腾讯 IM 应用下配置多个机器人账号,每个机器人绑定不同的 OpenClaw Agent,实现"不同会话 = 不同 AI 助手"的体验。
109
+
110
+ ### 前置条件
111
+
112
+ - timbot >= 2026.3.12
113
+ - 单账号基础配置已完成(`sdkAppId` + `secretKey`)
114
+ - **在腾讯云 IM 控制台创建好多个机器人账号(`@RBT#001`、`@RBT#002` 等)**
115
+
116
+ > 每个 sdkAppId 最多支持 20 个 `@RBT#` 机器人账号。
117
+
118
+ ### 原理概览
119
+
120
+ ```
121
+ 用户发消息给 @RBT#002
122
+
123
+ 腾讯 IM Webhook(To_Account = "@RBT#002")
124
+
125
+ timbot 按 To_Account 匹配到 accountId = "translator"
126
+
127
+ OpenClaw bindings 将 accountId 路由到 agentId = "translator"
128
+
129
+ translator agent 的 workspace 处理消息并回复
130
+ ```
131
+
132
+ ### 第一步:创建 Agent workspace
133
+
134
+ 为每个 Agent 创建独立的 workspace:
135
+
136
+ ```bash
137
+ openclaw agents add translator
138
+ openclaw agents add coder
139
+ ```
140
+
141
+ 每个 Agent 拥有独立的 `SOUL.md`(人设)、`AGENTS.md`(行为指令)、session 存储和 auth 配置。
142
+
143
+ ### 第二步:配置 timbot 多账号
144
+
145
+ #### 方式 A:CLI 命令(推荐)
146
+
147
+ ```bash
148
+ # 设置默认账号
149
+ openclaw config set channels.timbot.defaultAccount default
150
+
151
+ # 为每个账号设置 botAccount
152
+ openclaw config set channels.timbot.accounts.default.botAccount "@RBT#001"
153
+ openclaw config set channels.timbot.accounts.translator.botAccount "@RBT#002"
154
+ openclaw config set channels.timbot.accounts.coder.botAccount "@RBT#003"
155
+
156
+ # 可按账号覆盖顶层配置(可选)
157
+ openclaw config set channels.timbot.accounts.coder.streamingMode tim_stream
158
+ ```
159
+
160
+ 也可以用 `--batch-json` 一次性批量设置:
161
+
162
+ ```bash
163
+ openclaw config set --batch-json '[
164
+ { "path": "channels.timbot.defaultAccount", "value": "default" },
165
+ { "path": "channels.timbot.accounts.default.botAccount", "value": "@RBT#001" },
166
+ { "path": "channels.timbot.accounts.translator.botAccount", "value": "@RBT#002" },
167
+ { "path": "channels.timbot.accounts.coder.botAccount", "value": "@RBT#003" }
168
+ ]'
169
+ ```
170
+
171
+ #### 方式 B:手动编辑配置文件
172
+
173
+ 编辑 `~/.openclaw/openclaw.json`:
174
+
175
+ ```json5
176
+ {
177
+ channels: {
178
+ timbot: {
179
+ // 共享凭证
180
+ sdkAppId: "1600012345",
181
+ secretKey: "your-secret-key",
182
+ token: "webhook-token",
183
+ webhookPath: "/timbot",
184
+
185
+ // 顶层作为所有账号的默认值
186
+ streamingMode: "off",
187
+ dm: { policy: "open", allowFrom: ["*"] },
188
+
189
+ // 默认账号
190
+ defaultAccount: "default",
191
+
192
+ // 多账号配置
193
+ accounts: {
194
+ default: {
195
+ botAccount: "@RBT#001", // AI 助手
196
+ },
197
+ translator: {
198
+ botAccount: "@RBT#002", // 翻译官
199
+ },
200
+ coder: {
201
+ botAccount: "@RBT#003", // 代码助手
202
+ streamingMode: "tim_stream", // 可按账号覆盖
203
+ },
204
+ },
205
+ },
206
+ },
207
+ }
208
+ ```
209
+
210
+ 账号级字段会覆盖顶层同名字段,未指定的继承顶层默认值。`sdkAppId`、`secretKey` 等共享凭证只需在顶层写一次。
211
+
212
+ ### 第三步:添加 bindings
213
+
214
+ bindings 将 timbot 的 `accountId` 映射到 OpenClaw 的 `agentId`。
215
+
216
+ #### 方式 A:CLI 命令(推荐)
217
+
218
+ ```bash
219
+ # 将 timbot 的各账号绑定到对应 agent
220
+ openclaw agents bind --agent main --bind timbot:default
221
+ openclaw agents bind --agent translator --bind timbot:translator
222
+ openclaw agents bind --agent coder --bind timbot:coder
223
+
224
+ # 验证绑定关系
225
+ openclaw agents bindings
226
+ ```
227
+
228
+ #### 方式 B:手动编辑配置文件
229
+
230
+ 在 `~/.openclaw/openclaw.json` 中添加:
231
+
232
+ ```json5
233
+ {
234
+ agents: {
235
+ list: [
236
+ { id: "main", default: true, workspace: "~/.openclaw/workspace" },
237
+ { id: "translator", workspace: "~/.openclaw/workspace-translator" },
238
+ { id: "coder", workspace: "~/.openclaw/workspace-coder" },
239
+ ],
240
+ },
241
+
242
+ bindings: [
243
+ { agentId: "main", match: { channel: "timbot", accountId: "default" } },
244
+ { agentId: "translator", match: { channel: "timbot", accountId: "translator" } },
245
+ { agentId: "coder", match: { channel: "timbot", accountId: "coder" } },
246
+ ],
247
+
248
+ channels: {
249
+ timbot: {
250
+ // ... 上一步的配置
251
+ },
252
+ },
253
+ }
254
+ ```
255
+
256
+ ### 第四步:设置 Agent 人设
257
+
258
+ 每个 Agent 的 workspace 下编辑 `SOUL.md` 定义人格:
259
+
260
+ ```bash
261
+ # ~/.openclaw/workspace-translator/SOUL.md
262
+ echo "你是一位专业翻译官,擅长中英互译。请用简洁准确的风格翻译用户提供的内容。" \
263
+ > ~/.openclaw/workspace-translator/SOUL.md
264
+
265
+ # ~/.openclaw/workspace-coder/SOUL.md
266
+ echo "你是一位资深程序员,擅长代码审查、调试和编写。回复时附带代码示例。" \
267
+ > ~/.openclaw/workspace-coder/SOUL.md
268
+ ```
269
+
270
+ ### 第五步:重启并验证
271
+
272
+ ```bash
273
+ # 重启 Gateway
274
+ openclaw gateway restart
275
+
276
+ # 检查 agents 和 bindings
277
+ openclaw agents list --bindings
278
+
279
+ # 检查通道状态
280
+ openclaw channels status --probe
281
+ ```
282
+
283
+ ### 按用户路由(可选)
284
+
285
+ 如果只有一个机器人账号,但想把不同用户的消息路由到不同 Agent,可以用 peer 匹配:
286
+
287
+ ```json5
288
+ {
289
+ bindings: [
290
+ // 指定用户 → translator agent
291
+ {
292
+ agentId: "translator",
293
+ match: { channel: "timbot", peer: { kind: "direct", id: "user_alice" } },
294
+ },
295
+ // 指定群 → coder agent
296
+ {
297
+ agentId: "coder",
298
+ match: { channel: "timbot", peer: { kind: "group", id: "@TGS#group001" } },
299
+ },
300
+ // 其余走默认
301
+ { agentId: "main", match: { channel: "timbot" } },
302
+ ],
303
+ }
304
+ ```
305
+
306
+ peer 匹配优先级高于 accountId 匹配。更多路由规则见 [OpenClaw Multi-Agent 文档](https://docs.openclaw.ai/concepts/multi-agent)。
307
+
308
+ ### 完整配置示例
309
+
310
+ ```json5
311
+ {
312
+ agents: {
313
+ list: [
314
+ {
315
+ id: "main",
316
+ default: true,
317
+ name: "AI 助手",
318
+ workspace: "~/.openclaw/workspace",
319
+ },
320
+ {
321
+ id: "translator",
322
+ name: "翻译官",
323
+ workspace: "~/.openclaw/workspace-translator",
324
+ },
325
+ {
326
+ id: "coder",
327
+ name: "代码助手",
328
+ workspace: "~/.openclaw/workspace-coder",
329
+ model: "anthropic/claude-sonnet-4-5",
330
+ },
331
+ ],
332
+ },
333
+
334
+ bindings: [
335
+ { agentId: "main", match: { channel: "timbot", accountId: "default" } },
336
+ { agentId: "translator", match: { channel: "timbot", accountId: "translator" } },
337
+ { agentId: "coder", match: { channel: "timbot", accountId: "coder" } },
338
+ ],
339
+
340
+ channels: {
341
+ timbot: {
342
+ sdkAppId: "1600012345",
343
+ secretKey: "your-secret-key",
344
+ token: "webhook-token",
345
+ webhookPath: "/timbot",
346
+ streamingMode: "tim_stream",
347
+ fallbackPolicy: "final_text",
348
+ dm: { policy: "open", allowFrom: ["*"] },
349
+ defaultAccount: "default",
350
+ accounts: {
351
+ default: {
352
+ botAccount: "@RBT#001",
353
+ },
354
+ translator: {
355
+ botAccount: "@RBT#002",
356
+ },
357
+ coder: {
358
+ botAccount: "@RBT#003",
359
+ },
360
+ },
361
+ },
362
+ },
363
+ }
364
+ ```
365
+
366
+ ### 调试
367
+
368
+ ```bash
369
+ # 前台运行,观察路由日志
370
+ openclaw gateway run --verbose --force
371
+
372
+ # 模拟向 @RBT#002 发消息
373
+ TS=$(date +%s) && RAND=$RANDOM
374
+ curl -sS 'http://127.0.0.1:18789/timbot' \
375
+ -H 'content-type: application/json' \
376
+ --data-binary "{
377
+ \"CallbackCommand\":\"Bot.OnC2CMessage\",
378
+ \"From_Account\":\"test_user\",
379
+ \"To_Account\":\"@RBT#002\",
380
+ \"MsgTime\":$TS,
381
+ \"MsgRandom\":$RAND,
382
+ \"MsgKey\":\"test_${TS}_${RAND}\",
383
+ \"MsgBody\":[{\"MsgType\":\"TIMTextElem\",\"MsgContent\":{\"Text\":\"翻译:hello world\"}}]
384
+ }"
385
+ ```
386
+
387
+ 日志中应出现 `agentId=translator`,说明路由生效。
388
+
389
+ ### 注意事项
390
+
391
+ - 每个 sdkAppId 最多 20 个 `@RBT#` 机器人账号
392
+ - `@RBT#` 机器人发送 C2C 消息不校验好友关系,但用户端会话列表需要机器人先主动发一条消息或通过 `friend_add` API 强制添加
393
+ - 体验版每日限 1000 条消息(所有机器人共享),生产环境需升级
394
+ - 当前 onboarding 向导不支持多账号交互配置,需手动编辑配置文件
395
+ - Agent 的 auth profile 是隔离的,如需共享 provider 凭证,将 `auth-profiles.json` 复制到对应 Agent 的 `agentDir`
396
+
106
397
  ## 常用命令速查
107
398
 
108
399
  ### Gateway 前台运行 + 日志
@@ -1 +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,EACV,qBAAqB,EAMtB,MAAM,YAAY,CAAC;AAYpB,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,CA6DxB;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,cAAc,GAAG,qBAAqB,EAAE,CAItF"}
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,EACV,qBAAqB,EAMtB,MAAM,YAAY,CAAC;AAWpB,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,CA4DxB;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,cAAc,GAAG,qBAAqB,EAAE,CAItF"}
@@ -1,5 +1,4 @@
1
1
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk";
2
- import { normalizeOptionalText } from "./config-text.js";
3
2
  import { logSimple } from "./logger.js";
4
3
  const DEFAULT_API_DOMAIN = "console.tim.qq.com";
5
4
  function listConfiguredAccountIds(cfg) {
@@ -43,12 +42,12 @@ export function resolveTimbotAccount(params) {
43
42
  const merged = mergeTimbotAccountConfig(params.cfg, accountId);
44
43
  const enabled = baseEnabled && merged.enabled !== false;
45
44
  // 从合并后的配置中提取字段
46
- const sdkAppId = normalizeOptionalText(merged.sdkAppId);
47
- const identifier = normalizeOptionalText(merged.identifier);
48
- const secretKey = normalizeOptionalText(merged.secretKey);
49
- const botAccount = normalizeOptionalText(merged.botAccount);
50
- const apiDomain = normalizeOptionalText(merged.apiDomain) || DEFAULT_API_DOMAIN;
51
- const token = normalizeOptionalText(merged.token);
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;
52
51
  const streamingMode = merged.streamingMode === "custom_modify"
53
52
  ? "custom_modify"
54
53
  : merged.streamingMode === "text_modify"
@@ -60,7 +59,6 @@ export function resolveTimbotAccount(params) {
60
59
  ? "final_text"
61
60
  : "strict";
62
61
  const overflowPolicy = merged.overflowPolicy === "split"
63
- || !merged.overflowPolicy
64
62
  ? "split"
65
63
  : "stop";
66
64
  // 配置完整需要 sdkAppId + secretKey(identifier 可选,默认使用 administrator)
@@ -78,7 +76,7 @@ export function resolveTimbotAccount(params) {
78
76
  }
79
77
  return {
80
78
  accountId,
81
- name: normalizeOptionalText(merged.name),
79
+ name: merged.name?.trim() || undefined,
82
80
  enabled,
83
81
  configured,
84
82
  sdkAppId,
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ const accountSchema = {
16
16
  name: { type: "string" },
17
17
  enabled: { type: "boolean" },
18
18
  webhookPath: { type: "string" },
19
- sdkAppId: { oneOf: [{ type: "string" }, { type: "number" }] },
19
+ sdkAppId: { type: "string" },
20
20
  identifier: { type: "string" },
21
21
  secretKey: { type: "string" },
22
22
  botAccount: { type: "string" },
@@ -40,7 +40,7 @@ export const timbotConfigSchema = {
40
40
  name: { type: "string" },
41
41
  enabled: { type: "boolean" },
42
42
  webhookPath: { type: "string" },
43
- sdkAppId: { oneOf: [{ type: "string" }, { type: "number" }] },
43
+ sdkAppId: { type: "string" },
44
44
  identifier: { type: "string" },
45
45
  secretKey: { type: "string" },
46
46
  botAccount: { type: "string" },
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ResolvedTimbotAccount, TimbotInboundMessage, TimbotMsgBodyElement } from "./types.js";
2
+ export type TimbotWebhookRoutingTarget = {
3
+ account: Pick<ResolvedTimbotAccount, "configured" | "sdkAppId" | "botAccount" | "token">;
4
+ };
5
+ export declare function extractTextFromMsgBody(msgBody?: TimbotMsgBodyElement[]): string;
6
+ export declare function extractMentionedBotAccounts(rawBody: string): string[];
7
+ export declare function matchTimbotWebhookTargetsBySdkAppId<T extends TimbotWebhookRoutingTarget>(targets: T[], sdkAppId: string): T[];
8
+ export declare function selectTimbotWebhookTarget<T extends TimbotWebhookRoutingTarget>(params: {
9
+ targets: T[];
10
+ msg: TimbotInboundMessage;
11
+ }): T | undefined;
12
+ //# sourceMappingURL=inbound-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-routing.d.ts","sourceRoot":"","sources":["../../src/inbound-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC;CAC1F,CAAC;AA4BF,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,oBAAoB,EAAE,GAAG,MAAM,CA2B/E;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAerE;AAED,wBAAgB,mCAAmC,CAAC,CAAC,SAAS,0BAA0B,EACtF,OAAO,EAAE,CAAC,EAAE,EACZ,QAAQ,EAAE,MAAM,GACf,CAAC,EAAE,CAIL;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,0BAA0B,EAAE,MAAM,EAAE;IACtF,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,GAAG,EAAE,oBAAoB,CAAC;CAC3B,GAAG,CAAC,GAAG,SAAS,CAoChB"}
@@ -0,0 +1,112 @@
1
+ function normalizeBotAccount(raw) {
2
+ const trimmed = raw?.trim();
3
+ if (!trimmed)
4
+ return undefined;
5
+ return trimmed.replace(/^@/u, "@").toLowerCase();
6
+ }
7
+ function extractMentionedBotAccountsFromField(msg) {
8
+ const mentions = Array.isArray(msg.AtRobots_Account) ? msg.AtRobots_Account : [];
9
+ const normalizedMentions = [];
10
+ const seen = new Set();
11
+ for (const mention of mentions) {
12
+ const normalized = normalizeBotAccount(mention);
13
+ if (!normalized || seen.has(normalized))
14
+ continue;
15
+ seen.add(normalized);
16
+ normalizedMentions.push(mention.replace(/^@/u, "@"));
17
+ }
18
+ return normalizedMentions;
19
+ }
20
+ function isGroupMessage(msg) {
21
+ return msg.CallbackCommand === "Bot.OnGroupMessage" || Boolean(msg.GroupId?.trim());
22
+ }
23
+ // 从 MsgBody 提取文本内容
24
+ export function extractTextFromMsgBody(msgBody) {
25
+ if (!msgBody || !Array.isArray(msgBody))
26
+ return "";
27
+ const texts = [];
28
+ for (const elem of msgBody) {
29
+ if (elem.MsgType === "TIMTextElem" && elem.MsgContent?.Text) {
30
+ texts.push(elem.MsgContent.Text);
31
+ }
32
+ else if (elem.MsgType === "TIMCustomElem") {
33
+ texts.push("[custom]");
34
+ }
35
+ else if (elem.MsgType === "TIMImageElem") {
36
+ texts.push("[image]");
37
+ }
38
+ else if (elem.MsgType === "TIMSoundElem") {
39
+ texts.push("[voice]");
40
+ }
41
+ else if (elem.MsgType === "TIMFileElem") {
42
+ texts.push("[file]");
43
+ }
44
+ else if (elem.MsgType === "TIMVideoFileElem") {
45
+ texts.push("[video]");
46
+ }
47
+ else if (elem.MsgType === "TIMFaceElem") {
48
+ texts.push("[face]");
49
+ }
50
+ else if (elem.MsgType === "TIMLocationElem") {
51
+ texts.push("[location]");
52
+ }
53
+ else if (elem.MsgType === "TIMStreamElem") {
54
+ texts.push("[stream]");
55
+ }
56
+ }
57
+ return texts.join("\n");
58
+ }
59
+ export function extractMentionedBotAccounts(rawBody) {
60
+ if (!rawBody.trim())
61
+ return [];
62
+ const matches = rawBody.match(/[@@]RBT#[A-Za-z0-9._-]+/giu) ?? [];
63
+ const mentions = [];
64
+ const seen = new Set();
65
+ for (const match of matches) {
66
+ const normalized = normalizeBotAccount(match);
67
+ if (!normalized || seen.has(normalized))
68
+ continue;
69
+ seen.add(normalized);
70
+ mentions.push(match.replace(/^@/u, "@"));
71
+ }
72
+ return mentions;
73
+ }
74
+ export function matchTimbotWebhookTargetsBySdkAppId(targets, sdkAppId) {
75
+ const trimmed = sdkAppId.trim();
76
+ if (!trimmed)
77
+ return [...targets];
78
+ return targets.filter((candidate) => candidate.account.sdkAppId === trimmed);
79
+ }
80
+ export function selectTimbotWebhookTarget(params) {
81
+ const configuredTargets = params.targets.filter((candidate) => candidate.account.configured);
82
+ if (configuredTargets.length === 0)
83
+ return undefined;
84
+ const toAccount = normalizeBotAccount(params.msg.To_Account);
85
+ if (toAccount) {
86
+ const directMatch = configuredTargets.find((candidate) => normalizeBotAccount(candidate.account.botAccount) === toAccount);
87
+ if (directMatch)
88
+ return directMatch;
89
+ }
90
+ if (configuredTargets.length === 1) {
91
+ return configuredTargets[0];
92
+ }
93
+ if (!isGroupMessage(params.msg)) {
94
+ return undefined;
95
+ }
96
+ const mentionedAccounts = [
97
+ ...extractMentionedBotAccountsFromField(params.msg),
98
+ ...extractMentionedBotAccounts(extractTextFromMsgBody(params.msg.MsgBody)),
99
+ ];
100
+ const seenMentions = new Set();
101
+ for (const mentionedAccount of mentionedAccounts) {
102
+ const normalizedMention = normalizeBotAccount(mentionedAccount);
103
+ if (!normalizedMention || seenMentions.has(normalizedMention))
104
+ continue;
105
+ seenMentions.add(normalizedMention);
106
+ const matched = configuredTargets.find((candidate) => normalizeBotAccount(candidate.account.botAccount) === normalizedMention);
107
+ if (matched)
108
+ return matched;
109
+ }
110
+ return undefined;
111
+ }
112
+ //# sourceMappingURL=inbound-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-routing.js","sourceRoot":"","sources":["../../src/inbound-routing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/monitor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,KAAK,EACV,qBAAqB,EAKtB,MAAM,YAAY,CAAC;AAmBpB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACnF,CAAC;AAiYF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAG/D;AAkFD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAGhF;AA8iDD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAWnF;AAED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAuHlB"}
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/monitor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,KAAK,EACV,qBAAqB,EAKtB,MAAM,YAAY,CAAC;AAsBpB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACnF,CAAC;AAodF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAG/D;AAkFD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAGhF;AAmyCD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,IAAI,CAWnF;AAED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAsIlB"}