@zaofan/dsh-qqbot 1.1.7 → 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.
Files changed (61) hide show
  1. package/README.md +10 -4
  2. package/README_EN.md +1 -0
  3. package/client/qqbot-settings.js +114 -26
  4. package/dist/api/group-admin.d.ts +13 -3
  5. package/dist/api/group-admin.d.ts.map +1 -1
  6. package/dist/api/group-admin.js +49 -5
  7. package/dist/api/group-admin.js.map +1 -1
  8. package/dist/channel-tools.d.ts.map +1 -1
  9. package/dist/channel-tools.js +386 -14
  10. package/dist/channel-tools.js.map +1 -1
  11. package/dist/commands/answer.d.ts +29 -0
  12. package/dist/commands/answer.d.ts.map +1 -0
  13. package/dist/commands/answer.js +29 -0
  14. package/dist/commands/answer.js.map +1 -0
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +5 -0
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/misc.d.ts.map +1 -1
  19. package/dist/commands/misc.js +15 -1
  20. package/dist/commands/misc.js.map +1 -1
  21. package/dist/commands/outmode.d.ts.map +1 -1
  22. package/dist/commands/outmode.js +3 -2
  23. package/dist/commands/outmode.js.map +1 -1
  24. package/dist/config.d.ts +4 -4
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +2 -2
  27. package/dist/config.js.map +1 -1
  28. package/dist/features/broadcast.d.ts.map +1 -1
  29. package/dist/features/broadcast.js +3 -1
  30. package/dist/features/broadcast.js.map +1 -1
  31. package/dist/features/group-hub.d.ts +3 -1
  32. package/dist/features/group-hub.d.ts.map +1 -1
  33. package/dist/features/group-hub.js +5 -3
  34. package/dist/features/group-hub.js.map +1 -1
  35. package/dist/features/group-join-request.d.ts.map +1 -1
  36. package/dist/features/group-join-request.js +6 -5
  37. package/dist/features/group-join-request.js.map +1 -1
  38. package/dist/features/outbound-mode-switch.d.ts +8 -2
  39. package/dist/features/outbound-mode-switch.d.ts.map +1 -1
  40. package/dist/features/outbound-mode-switch.js +2 -2
  41. package/dist/features/outbound-mode-switch.js.map +1 -1
  42. package/dist/features/poll-join-requests.js +2 -2
  43. package/dist/features/poll-join-requests.js.map +1 -1
  44. package/dist/features/qq-user-questions.d.ts +127 -4
  45. package/dist/features/qq-user-questions.d.ts.map +1 -1
  46. package/dist/features/qq-user-questions.js +314 -74
  47. package/dist/features/qq-user-questions.js.map +1 -1
  48. package/dist/gateway/bootstrap.d.ts.map +1 -1
  49. package/dist/gateway/bootstrap.js +17 -0
  50. package/dist/gateway/bootstrap.js.map +1 -1
  51. package/dist/gateway/data-root.d.ts +13 -4
  52. package/dist/gateway/data-root.d.ts.map +1 -1
  53. package/dist/gateway/data-root.js +22 -12
  54. package/dist/gateway/data-root.js.map +1 -1
  55. package/dist/index.js +2 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/transport/outbound.d.ts.map +1 -1
  58. package/dist/transport/outbound.js +60 -5
  59. package/dist/transport/outbound.js.map +1 -1
  60. package/package.json +1 -1
  61. package/settings-host.js +75 -6
package/README.md CHANGED
@@ -69,6 +69,7 @@
69
69
  - 收到【审批轮询】= **系统唤醒**——主动 `group_join_requests` 查看新申请,把申请人+验证信息汇报给主人,等主人拍板再批/拒
70
70
  - 消息里带 `@bot` = 有人 @ 本机器人(`@bot` 就是自己)
71
71
  - 会话归属、工作区挂载等宿主问题已按官方机制修好(移植上游 PR #21,幂等、全 fail-soft)
72
+ - **官方接口文档**(写扩展、查事件字段/错误码、确认按钮与卡片字段时先看这里):QQ 机器人 api-v2 文档 <https://bot.q.qq.com/wiki/develop/api-v2/>
72
73
  - **你可以自己写 markdown、自己写工具、自己写斜杠命令**(不用等人给你做功能):
73
74
  - 卡片正文就是**你直接写的 markdown**(`#` 标题、加粗、`![说明](图片URL)`、代码块)——**本插件没有模板引擎,模板就是你**;要"带按钮的卡片"则走 botplay 事件或 dock 卡片编辑器(按钮回调须由 host 注册)。
74
75
  - 工具/命令写在**账号数据目录**的 `.qqbot-extensions/{tools,commands}/`,**不在插件包内** → **升级/重装插件(换 node_modules)不会覆盖你的扩展**,扩展原样保留。
@@ -238,10 +239,11 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
238
239
 
239
240
  **群组管理四个独立开关(dock 设置, v1.1.4+)**: `唤醒AI`=唤醒群管会话 AI 处理; `注入群管会话`=hub web 注记(不唤醒); `通知普通群`=申请所在群 web 注记(不唤醒); `唤醒普通群AI`=唤醒申请所在群 AI——事件与轮询两条链路都生效, 互不干扰。
240
241
 
241
- **跨群/跨会话工具**(v1.1.0+):
242
+ **跨群/跨会话工具**(v1.1.0+ / **v1.2.0 扩充**):
242
243
  - `group_join_requests(gid=…)` / `group_approve_join(member_openids=…)`: 传 `gid` 可查询/审批**指定群**的入群申请(不限于当前会话群), 支持一次批量审批多人;
243
- - `session_list`: 列出全部会话(含群注册表里的"潜在群", 重启后仍可靠), 给出每个会话/群的 sessionId 供寻址;
244
- - `session_wake(session_id 或 scope+peer_id, text, send_qq?, media?)`: 向指定会话/群发消息并唤醒对方 LLM, 同时可走 QQBot 通道发到绑定的群/私聊(带 `【来自会话 xxx…】` 来源标注), `media` 支持跨群发图。
244
+ - `session_list` / `session_wake`: 列出全部会话(含群注册表里的"潜在群", 重启后仍可靠)供寻址 / 向指定会话发消息并唤醒对方 LLM(可带 `media` 跨群发图);
245
+ - **`broadcast_send`(v1.2.0)**: **一键群发** —— 同一段内容一次发到多个群/私聊, `targets` 直接写**分组名 / 群名 / 备注或 openid**; 走插件广播队列(串行+失败重试, 与 dock「📤 群发 · 广播」面板**同一份任务**), 默认直接发, 返回逐目标 `message_id`, 2 分钟内可 `action:"recall"` 撤回;
246
+ - **`target_group`(v1.2.0)**: **分组管理** —— list/create/rename/delete/add/remove, 读写的正是 dock「📇 群组管理 → 🗂 分组」那份数据 → **AI 与主人共用同一份分组**: 主人在面板分好组, AI 直接"发给群友"就能群发。
245
247
 
246
248
  **配置项**(Web 面板 ⑥ 可改, 见下表 `groupAdmin.*`)
247
249
 
@@ -254,7 +256,8 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
254
256
  | `provider` | string | `deepseek-official` | LLM 提供商名称 |
255
257
  | `model` | string | `deepseek-chat` | 模型名称 |
256
258
  | `preset` | string | - | Agent preset id |
257
- | `cwd` | string | `process.cwd()` | Agent 工作目录 |
259
+ | `cwd` | string | `process.cwd()` | Agent 工作目录(**不是**数据目录) |
260
+ | `dataRoot` | string | `{cwd}/dshqqbot` | 插件数据根(表情包 / `.qqbot` / `.qqbot-extensions`)。**默认就在 `{cwd}/dshqqbot`** —— 工作目录保持干净; 想放别处显式配置; 老数据首次启动自动迁入 |
258
261
  | `requireMention` | boolean | `true` | 群聊是否需要 @bot 才触发 |
259
262
  | `groupPrompt` | string | - | 群聊额外 system prompt |
260
263
  | `directPrompt` | string | - | 私聊额外 system prompt |
@@ -277,6 +280,7 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
277
280
  |------|------|
278
281
  | `/outmode` | 查看当前出站模式与四档说明 |
279
282
  | `/outmode adaptive` | 切到 **适配主动**(默认): 收到真人消息前5条带引用回你, 之后自动转独立消息, 连发不被吞 |
283
+ | `/outmode detail` | 切到 **详细主动**(v1.2.0): 聊天同"适配主动", 但**额外把 AI 的工具调用/结果也推到 QQ**(看进度用, 消息会变多) |
280
284
  | `/outmode passive` | 切到 **被动**: 始终回复你那条(连发约4~5条后被QQ吞) |
281
285
  | `/outmode silent` | 切到 **完全不出站**: 她照常思考但不向QQ发任何回复(web可对话) |
282
286
  | `/outmode nothink` | 切到 **完全不思考**: QQ入站不唤醒AI, 消息只记录(逃生通道, 可随时切回) |
@@ -291,6 +295,7 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
291
295
  | `/botplay` | 出互动事件目录卡(点事件直接触发, 自动翻页); `/botplay 事件名` 直接触发(如 `/botplay 签到`) |
292
296
  | `/perm` | 切换权限档: `/perm` 查看; `/perm 只读\|工作区\|全权` 切换(即时生效) |
293
297
  | `/new [preset]` | 以指定人格开新会话(旧会话存档可回看); `/presets` 看可用人格 |
298
+ | `/答 <内容>` / `/ans` | **回答提问卡片**(v1.2.0): 按钮点不动或想自己打字时用 —— `/答 A`(选第1个)、`/答 1 3`(多选)、`/答 #2 B`(多个提问时指定第2问)、`/答 你的话`(不是选项 → 当自由回答原样转给 AI) |
294
299
  | `/bot-help` | 查看所有指令 |
295
300
  | `/tools-reload` | 热刷新 QQ 通道工具(开发用, 新工具无需重启即可用) |
296
301
 
@@ -353,6 +358,7 @@ export default {
353
358
  5. 生效方式: 工具发 `/tools-reload` 或调 `tools_reload` —— 新工具即时生效; **同名工具改内容会被工具注册表跳过(`already registered`) → 换名或重启宿主**; 命令一律需重启宿主(`/bot-restart`)。
354
359
  6. 能力边界: **扩展工具无法注册"按钮点击回调"** —— 按钮回调只能由 host 侧的 botplay 事件 / dock 卡片编辑器注册。纯扩展方案的交互范式 = "卡片 + 用户回个编号", 由 AI 当状态机再调一次工具。
355
360
  7. 示范(点歌): ①工具里 fetch 搜索接口 → ②拼一段 markdown(封面/歌名/歌手/歌词) → ③`sender.sendMarkdown(replyTarget, 卡片)` → ④要试听就 `sender.sendMedia(...)` → ⑤返回 `{ok:true,msg:'已发卡'}`。
361
+ 8. **接口字段别猜**: 写扩展遇到不确定的官方字段/事件/错误码, 先查官方 api-v2 文档 <https://bot.q.qq.com/wiki/develop/api-v2/> (按钮 `action.type` 0=跳转/1=回调/2=指令、键盘 5 行上限、错误码等都在里面), 不要凭印象写。
356
362
 
357
363
  ## 富媒体指令(AI 回复里写标记,自动变成真消息)
358
364
 
package/README_EN.md CHANGED
@@ -268,6 +268,7 @@ Then run `/tools-reload` (or ask the AI to call the `tools_reload` tool). Comman
268
268
  - Hot reload: `/tools-reload` (or call `tools_reload`) picks up **new** tools; **editing a tool under the same name is skipped by the registry → rename it or restart the host**; commands always need a restart.
269
269
  - Limitation: extensions **cannot register button callbacks** — those require a botplay event or the dock card editor. Extension-only flows are "card + user replies a number", with the AI acting as the state machine.
270
270
  - Example (song request): fetch a search API → build a markdown card (cover / title / artist / lyrics) → `sender.sendMarkdown(replyTarget, card)` → optionally `sender.sendMedia(...)` for a preview → return `{ ok: true, msg: 'card sent' }`.
271
+ - API reference: when a field/event/error code is unclear, read the official QQ bot api-v2 docs <https://bot.q.qq.com/wiki/develop/api-v2/> instead of guessing (button `action.type` 0=link / 1=callback / 2=command, keyboard 5-row limit, error codes…).
271
272
 
272
273
  ## Core Modules
273
274
 
@@ -220,7 +220,7 @@ window.__ModuleLoader__.load({
220
220
  groupPrompt: typeof v.groupPrompt === 'string' ? v.groupPrompt : DEFAULT_GROUP_PROMPT,
221
221
  enableApprovals: v.enableApprovals === true,
222
222
  approvalTimeoutMs: typeof v.approvalTimeoutMs === 'number' ? v.approvalTimeoutMs : 120000,
223
- outboundMode: (v.outboundMode === 'silent' || v.outboundMode === 'nothink' ? v.outboundMode : (v.outboundMode === 'passive' ? 'passive' : 'adaptive')),
223
+ outboundMode: (v.outboundMode === 'detail' || v.outboundMode === 'passive' || v.outboundMode === 'silent' || v.outboundMode === 'nothink' ? v.outboundMode : 'adaptive'),
224
224
  groupAdmin: { enabled: v.groupAdmin && v.groupAdmin.enabled === true, owners: Array.isArray(v.groupAdmin && v.groupAdmin.owners) ? v.groupAdmin.owners : [], manageGroup: v.groupAdmin && typeof v.groupAdmin.manageGroup === 'string' ? v.groupAdmin.manageGroup : '', watchJoinRequests: !!(v.groupAdmin && v.groupAdmin.watchJoinRequests), notifyInGroup: v.groupAdmin && v.groupAdmin.notifyInGroup !== false },
225
225
  }
226
226
  setCfg(base); setRev(d.revision); setMsg('')
@@ -269,7 +269,7 @@ window.__ModuleLoader__.load({
269
269
  groupPrompt: typeof gpOverride === 'string' ? gpOverride : (typeof cfg.groupPrompt === 'string' ? cfg.groupPrompt : ''),
270
270
  enableApprovals: cfg.enableApprovals === true,
271
271
  approvalTimeoutMs: typeof cfg.approvalTimeoutMs === 'number' ? cfg.approvalTimeoutMs : 120000,
272
- outboundMode: cfg.outboundMode === 'silent' || cfg.outboundMode === 'nothink' ? cfg.outboundMode : (cfg.outboundMode === 'passive' ? 'passive' : 'adaptive'),
272
+ outboundMode: cfg.outboundMode === 'detail' || cfg.outboundMode === 'passive' || cfg.outboundMode === 'silent' || cfg.outboundMode === 'nothink' ? cfg.outboundMode : 'adaptive',
273
273
  groupAdmin: { enabled: cfg.groupAdmin && cfg.groupAdmin.enabled === true, owners: Array.isArray(cfg.groupAdmin && cfg.groupAdmin.owners) ? cfg.groupAdmin.owners : [], manageGroup: cfg.groupAdmin && typeof cfg.groupAdmin.manageGroup === 'string' ? cfg.groupAdmin.manageGroup : '', watchJoinRequests: !!(cfg.groupAdmin && cfg.groupAdmin.watchJoinRequests), notifyInGroup: cfg.groupAdmin && cfg.groupAdmin.notifyInGroup !== false },
274
274
  }
275
275
  fetch(UPDATE, {
@@ -285,7 +285,7 @@ window.__ModuleLoader__.load({
285
285
  groupPrompt: typeof v2.groupPrompt === 'string' ? v2.groupPrompt : (typeof cfg.groupPrompt === 'string' ? cfg.groupPrompt : DEFAULT_GROUP_PROMPT),
286
286
  enableApprovals: v2.enableApprovals === true,
287
287
  approvalTimeoutMs: typeof v2.approvalTimeoutMs === 'number' ? v2.approvalTimeoutMs : 120000,
288
- outboundMode: (v2.outboundMode === 'silent' || v2.outboundMode === 'nothink' ? v2.outboundMode : (v2.outboundMode === 'passive' ? 'passive' : 'adaptive')),
288
+ outboundMode: (v2.outboundMode === 'detail' || v2.outboundMode === 'passive' || v2.outboundMode === 'silent' || v2.outboundMode === 'nothink' ? v2.outboundMode : 'adaptive'),
289
289
  groupAdmin: { enabled: v2.groupAdmin && v2.groupAdmin.enabled === true, owners: Array.isArray(v2.groupAdmin && v2.groupAdmin.owners) ? v2.groupAdmin.owners : [], manageGroup: v2.groupAdmin && typeof v2.groupAdmin.manageGroup === 'string' ? v2.groupAdmin.manageGroup : '', watchJoinRequests: !!(v2.groupAdmin && v2.groupAdmin.watchJoinRequests), notifyInGroup: v2.groupAdmin && v2.groupAdmin.notifyInGroup !== false },
290
290
  })
291
291
  setRev(d.revision); setMsg('已保存 ✓(live 生效)')
@@ -319,7 +319,7 @@ window.__ModuleLoader__.load({
319
319
  NumRow({ label: '群里没人 @ 她时,隔几秒才回一次(0=每条都回)', value: cfg.behavior.freeIntervalSec, onChange: function (v) { setBehavior({ freeIntervalSec: v }) } }),
320
320
  NumRow({ label: '有人 @ 她时,两次回复至少隔几秒(0=随叫随到)', value: cfg.behavior.mentionIntervalSec, onChange: function (v) { setBehavior({ mentionIntervalSec: v }) } }),
321
321
  NumRow({ label: '私聊里隔几秒回一次(0=不限制)', value: cfg.behavior.directIntervalSec, onChange: function (v) { setBehavior({ directIntervalSec: v }) } }),
322
- h('div', { style: { fontSize: 12, color: '#666', margin: '10px 0 2px' } }, '出站方式(连发消息 QQ 端丢失时切主动):'), h('div', { style: { display: 'flex', gap: 14, alignItems: 'center', flexWrap: 'wrap' } }, ['adaptive', 'passive', 'silent', 'nothink'].map(function (m) { var cur = (cfg.outboundMode || 'adaptive'); if (cur === 'active') cur = 'adaptive'; return h('label', { style: { display: 'inline-flex', gap: 5, alignItems: 'center', fontSize: 12, color: '#333', cursor: 'pointer' } }, h('input', { type: 'radio', name: 'qqs-outbound', checked: cur === m, onChange: function () { setCfg(function (c) { return Object.assign({}, c, { outboundMode: m }) }) } }), m === 'adaptive' ? '适配主动(推荐默认)' : (m === 'passive' ? '被动(只回最后一句)' : (m === 'silent' ? '完全不出站(静默)' : '完全不思考(QQ入站不唤醒,仅设置页)'))) })), h('div', { style: { fontSize: 12, color: '#888' } }, '适配主动=刚收到真人消息时前5条带引用回你, 第6条起自动转独立新消息(连发不被QQ吞); 一段时间没新消息的主动推送(定时等)也走独立消息。被动=始终回你那条(连发约4~5条后被QQ吞)。完全不出站=照常思考但不向QQ发任何回复(AI 可用工具切回)。完全不思考=QQ入站不唤醒AI, 消息只记录(仅本页可开; 唤醒请发 /outmode adaptive)。保存即热更新, 不用重启。'), h('div', { style: { fontSize: 12, color: '#666', margin: '10px 0 2px' } }, '延迟聚合(另一套机制,和上面冷却不冲突): 她收到消息先等一小会儿, 把连发的话攒一起综合回, 免得只回第一句。'),
322
+ h('div', { style: { fontSize: 12, color: '#666', margin: '10px 0 2px' } }, '出站方式(连发消息 QQ 端丢失时切主动):'), h('div', { style: { display: 'flex', gap: 14, alignItems: 'center', flexWrap: 'wrap' } }, ['adaptive', 'detail', 'passive', 'silent', 'nothink'].map(function (m) { var cur = (cfg.outboundMode || 'adaptive'); if (cur === 'active') cur = 'adaptive'; return h('label', { style: { display: 'inline-flex', gap: 5, alignItems: 'center', fontSize: 12, color: '#333', cursor: 'pointer' } }, h('input', { type: 'radio', name: 'qqs-outbound', checked: cur === m, onChange: function () { setCfg(function (c) { return Object.assign({}, c, { outboundMode: m }) }) } }), m === 'adaptive' ? '适配主动(推荐默认)' : (m === 'detail' ? '详细主动(连工具调用一起推)' : (m === 'passive' ? '被动(只回最后一句)' : (m === 'silent' ? '完全不出站(静默)' : '完全不思考(QQ入站不唤醒,仅设置页)')))) })), h('div', { style: { fontSize: 12, color: '#888' } }, '适配主动=刚收到真人消息时前5条带引用回你, 第6条起自动转独立新消息(连发不被QQ吞); 一段时间没新消息的主动推送(定时等)也走独立消息。被动=始终回你那条(连发约4~5条后被QQ吞)。完全不出站=照常思考但不向QQ发任何回复(AI 可用工具切回)。完全不思考=QQ入站不唤醒AI, 消息只记录(仅本页可开; 唤醒请发 /outmode adaptive)。保存即热更新, 不用重启。'), h('div', { style: { fontSize: 12, color: '#666', margin: '10px 0 2px' } }, '延迟聚合(另一套机制,和上面冷却不冲突): 她收到消息先等一小会儿, 把连发的话攒一起综合回, 免得只回第一句。'),
323
323
  BoolRow({ label: '开启延迟聚合(不勾=回到来一条回一条)', value: dbc.enabled !== false, onChange: function (v) { setBehavior({ debounce: { ...dbc, enabled: v } }) } }),
324
324
  NumRow({ label: '对方停口几秒后她才开口(默认3;0=不停顿)', value: dbc.silenceSec != null ? dbc.silenceSec : 3, onChange: function (v) { setBehavior({ debounce: { ...dbc, silenceSec: v } }) } }),
325
325
  NumRow({ label: '攒满几条立即开口,不等对方停(默认10)', value: dbc.maxMsgs != null ? dbc.maxMsgs : 10, onChange: function (v) { setBehavior({ debounce: { ...dbc, maxMsgs: v } }) } }),
@@ -1887,7 +1887,9 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
1887
1887
 
1888
1888
  // ── 面板状态(每个实例独立保存, 切回不丢) ──
1889
1889
  var state = { ns: '', accts: [], gid: '', groups: [], tab: 'chat', sendScope: 'group', sendTo: '', sendName: '', sendText: '', insertCtx: true, targetQ: '', c2cs: [], joins: null, mutes: null, members: null, muteSecs: '60', bindGid: '', bindName: '', msg: '', busy: '', wantPeer: null, lookedUp: false, detected: null, detectedHit: null, chatItems: [], chatMore: false, chatBusy: '', chatErr: '', chatOldest: 0, chatText: '', chatIns: true, outMode: '', outRev: undefined, bpEvents: [], bpSel: null, bpDraft: null, rosterSel: {}, rosterScope: 'all', rosterQ: '', hubSid: '', hubRev: undefined, hubBusy: '', hubMsg: '', gaEnabled: false, gaPoll: false, gaPollWake: true, gaHubNotify: true, gaNotifyGroup: true, gaInterval: 5, gaMinCount: 1, gaMsg: '', gaBusy: '', bcDraft: null, bcTasks: null, cardMd: '', cardBtns: '', cardGid: '', cardBusy: '', cardQ: '', tgGroups: [], tgCur: '' }
1890
- // 🗂 自定义目标分组(仿 QQ 分组, 2026-09-10 主人要求): localStorage 持久化
1890
+ // 🗂 自定义目标分组(仿 QQ 分组): 2026-09-12 起**host 持久化**({dataRoot}/.qqbot/target-groups.json),
1891
+ // localStorage 只当秒开缓存 —— 这样 **AI 与主人共用同一份分组**(agent 侧 broadcast_send 可直接写分组名群发),
1892
+ // 顺带修掉"换个浏览器分组就没了"的老毛病。
1891
1893
  // 结构: [{ id, name, members: ['group:xxx' | 'c2c:yyy', ...] }]
1892
1894
  try {
1893
1895
  var _tg = localStorage.getItem('qqs-target-groups')
@@ -1895,6 +1897,27 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
1895
1897
  } catch (e) {}
1896
1898
  function saveTgGroups() {
1897
1899
  try { localStorage.setItem('qqs-target-groups', JSON.stringify(state.tgGroups || [])) } catch (e) {}
1900
+ // 同步 host(与 AI 共用); 失败不影响本地缓存与当前操作
1901
+ try {
1902
+ fetch(api('group/target-groups'), {
1903
+ method: 'POST', headers: { 'content-type': 'application/json' },
1904
+ body: JSON.stringify({ ns: state.ns || undefined, groups: state.tgGroups || [] }),
1905
+ }).catch(function () {})
1906
+ } catch (e) {}
1907
+ }
1908
+ function loadTgGroupsFromHost() {
1909
+ fetch(api('group/target-groups' + (state.ns ? '?ns=' + encodeURIComponent(state.ns) : '')), { cache: 'no-store' })
1910
+ .then(function (r) { return r.json() }).then(function (d) {
1911
+ if (!d || !d.ok) return
1912
+ var host = Array.isArray(d.groups) ? d.groups : []
1913
+ if (host.length > 0) {
1914
+ state.tgGroups = host
1915
+ try { localStorage.setItem('qqs-target-groups', JSON.stringify(host)) } catch (e) {}
1916
+ } else if ((state.tgGroups || []).length > 0) {
1917
+ saveTgGroups() // 迁移: 本地有、host 还空 → 推上去(第一次打开新版时发生一次)
1918
+ }
1919
+ if (state.tab === 'roster' || state.tab === 'broadcast') paintBody()
1920
+ }).catch(function () {})
1898
1921
  }
1899
1922
  // 📇 群组管理 M1: 勾选集合本地持久化(刷新/重开不丢, 供后续群发/批量操作使用)
1900
1923
  try { var _rs = localStorage.getItem('qqs-roster-sel'); if (_rs) { var _rso = JSON.parse(_rs); if (_rso && typeof _rso === 'object') state.rosterSel = _rso } } catch (e) {}
@@ -1947,7 +1970,7 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
1947
1970
  function loadOutMode() {
1948
1971
  if (state.tab !== 'out') return
1949
1972
  fetch(READ + (state.ns ? '?' + outNsQ() : '')).then(function (r) { return r.json() }).then(function (d) {
1950
- if (d && d.value) { state.outMode = (d.value.outboundMode === 'silent' || d.value.outboundMode === 'nothink' ? d.value.outboundMode : (d.value.outboundMode === 'passive' ? 'passive' : 'adaptive')); state.outRev = d.revision; paintBody() }
1973
+ if (d && d.value) { state.outMode = (d.value.outboundMode === 'detail' || d.value.outboundMode === 'passive' || d.value.outboundMode === 'silent' || d.value.outboundMode === 'nothink' ? d.value.outboundMode : 'adaptive'); state.outRev = d.revision; paintBody() }
1951
1974
  }).catch(function () {})
1952
1975
  }
1953
1976
  // ⚙️ 出站方式: 保存(全量 patch 只带 outboundMode; settings.update 部分合并)
@@ -1961,7 +1984,7 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
1961
1984
  method: 'POST', headers: { 'content-type': 'application/json' },
1962
1985
  body: JSON.stringify({ ns: state.ns || undefined, patch: patch, expectedRevision: curRev }),
1963
1986
  }).then(function (r) { return r.json().catch(function () { return null }) }).then(function (d) {
1964
- if (d && d.value) { state.outMode = (d.value.outboundMode === 'silent' || d.value.outboundMode === 'nothink' ? d.value.outboundMode : (d.value.outboundMode === 'passive' ? 'passive' : 'adaptive')); state.outRev = d.revision; var h2 = panel ? panel.querySelector('#dk-out-hint') : null; if (h2) h2.textContent = '已保存 ✓ live 热更新已生效(不用重启)' }
1987
+ if (d && d.value) { state.outMode = (d.value.outboundMode === 'detail' || d.value.outboundMode === 'passive' || d.value.outboundMode === 'silent' || d.value.outboundMode === 'nothink' ? d.value.outboundMode : 'adaptive'); state.outRev = d.revision; var h2 = panel ? panel.querySelector('#dk-out-hint') : null; if (h2) h2.textContent = '已保存 ✓ live 热更新已生效(不用重启)' }
1965
1988
  else {
1966
1989
  var conflicted = !!(d && d.error && String(d.error).indexOf('changed since it was read') >= 0)
1967
1990
  if (conflicted && !attempt) { refreshOutModeAndRetry(m) }
@@ -2371,6 +2394,30 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2371
2394
  var ta = panel && panel.querySelector('#dk-bc-text')
2372
2395
  if (ta) ta.focus()
2373
2396
  }
2397
+ /**
2398
+ * 撤回"勾选目标"最近一条广播消息(2026-09-12 主人要求): **不必去任务列表翻 task_id** ——
2399
+ * 服务端自己找该目标最新的、已成功且有 message_id 的广播记录(2 分钟窗口内)。
2400
+ * 主人原话: "直接在勾选里面加撤回按钮, 无条件发送撤回"。
2401
+ */
2402
+ function recallSelectedLast() {
2403
+ var tg = rosterSelectedTargets()
2404
+ if (!tg.length) { rosterHint('先勾选要撤回的目标'); return }
2405
+ if (!window.confirm('撤回这些目标**最近一条广播消息**?\n\n' + tg.slice(0, 8).map(function (t) { return '· ' + (t.name || t.peerId) }).join('\n') + (tg.length > 8 ? '\n…' : '') + '\n\n(发出超过 2 分钟的会失败)')) return
2406
+ rosterHint('撤回中…')
2407
+ apiPost('group/recall-last', { ns: state.ns || undefined, targets: tg.map(function (t) { return { scope: t.scope, peerId: t.peerId } }) }).then(function (d) {
2408
+ if (!d || !d.ok) { rosterHint('❌ ' + ((d && d.error) || '撤回失败')); return }
2409
+ var rs = d.results || []
2410
+ var okN = rs.filter(function (r) { return r.ok }).length
2411
+ var fails = rs.filter(function (r) { return !r.ok })
2412
+ rosterHint('✅ 已撤回 ' + okN + '/' + rs.length + ' 个' + (fails.length ? ';失败 ' + fails.length + ' 个: ' + fails.slice(0, 2).map(function (r) { return (r.err || '未知') }).join(' / ') : ''))
2413
+ }).catch(function () { rosterHint('❌ 撤回异常') })
2414
+ }
2415
+ /** 选目标页的提示行(与 bcHint 同款, 元素 id 不同) */
2416
+ function rosterHint(t) {
2417
+ state.msg = t || ''
2418
+ var el = panel && panel.querySelector('#dk-roster-hint')
2419
+ if (el) el.textContent = t || ''
2420
+ }
2374
2421
  function bcHint(t) {
2375
2422
  state.msg = t || ''
2376
2423
  var el = panel && panel.querySelector('.dk-msg#dk-bc-hint')
@@ -2412,6 +2459,9 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2412
2459
  if (!panel) return
2413
2460
  var sendB = panel.querySelector('#dk-roster-send')
2414
2461
  if (sendB) sendB.onclick = function () { openBroadcastDraft('') }
2462
+ // ↩ 撤回勾选项最近消息(2026-09-12): 选目标页与广播页共用同一个按钮 id(tab 互斥渲染)
2463
+ var recallB = panel.querySelector('#dk-roster-recall')
2464
+ if (recallB) recallB.onclick = function () { recallSelectedLast() }
2415
2465
  // 广播子页: 跳去「📇 群组管理」勾选目标(2026-09-10)
2416
2466
  var gotoB = panel.querySelector('#dk-bc-goto')
2417
2467
  if (gotoB) gotoB.onclick = function () { state.tab = 'roster'; paintBody(); bindBodyEvents() }
@@ -2424,15 +2474,23 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2424
2474
  var text = ta ? ta.value.trim() : state.bcDraft.text
2425
2475
  if (!text) { bcHint('内容不能为空'); return }
2426
2476
  var targets = state.bcDraft.targets
2477
+ bcHint('发送中…')
2427
2478
  apiPost('group/broadcast/create', { ns: state.ns || undefined, type: 'text', text: text, targets: targets }).then(function (d) {
2428
- if (!d || !d.ok || !d.task) { bcHint((d && d.error) || '创建失败'); return }
2479
+ if (!d || !d.ok || !d.task) { bcHint('❌ ' + ((d && d.error) || '创建失败')); return }
2429
2480
  // 二次确认: 已弹「确认群发」按钮, 这里直接 confirm 入队
2430
2481
  return apiPost('group/broadcast/confirm', { ns: state.ns || undefined, task_id: d.task.task_id }).then(function (d2) {
2431
2482
  state.bcDraft = null
2432
- if (d2 && d2.ok) { bcHint('✅ 已确认群发 ' + targets.length + ' 个目标(逐目标发送中)'); loadBroadcastTasks(true) }
2433
- else bcHint((d2 && (d2.msg || d2.error)) || '确认失败')
2483
+ if (d2 && d2.ok) {
2484
+ // 2026-09-12 修: 确认后**切到「📢 广播」子页** —— 任务列表(含逐目标撤回)只在该页渲染,
2485
+ // 以前留在「🎯 选目标」页: 界面毫无变化(主人以为没反应/是 bug), 也从来没见过撤回按钮。
2486
+ state.tab = 'broadcast'
2487
+ state.msg = '✅ 已确认群发 ' + targets.length + ' 个目标(逐目标发送中, 2 分钟内可逐目标撤回)'
2488
+ paintBody(); bindBodyEvents()
2489
+ loadBroadcastTasks(true)
2490
+ startBroadcastAdvance()
2491
+ } else { bcHint('❌ ' + ((d2 && (d2.msg || d2.error)) || '确认失败')) }
2434
2492
  })
2435
- }).catch(function () { bcHint('创建异常') })
2493
+ }).catch(function () { bcHint('❌ 创建异常') })
2436
2494
  }
2437
2495
  var refreshB = panel.querySelector('#dk-bc-refresh')
2438
2496
  if (refreshB) refreshB.onclick = function () { loadBroadcastTasks(true) }
@@ -2441,15 +2499,19 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2441
2499
  var b = e.target
2442
2500
  var cn = b.getAttribute && b.getAttribute('data-bccancel')
2443
2501
  if (cn) { apiPost('group/broadcast/cancel', { ns: state.ns || undefined, task_id: cn }).then(function () { loadBroadcastTasks(true) }); return }
2444
- var rn = b.getAttribute && b.getAttribute('data-bcrecall')
2445
- if (rn) {
2446
- var tk = (state.bcTasks || []).find(function (x) { return x.task_id === rn })
2447
- if (!tk) return
2448
- var peer = window.prompt('撤回哪个目标的已发消息? 填目标 peerId(…后6位即可)\n' + tk.targets.map(function (t2) { return t2.peerId.slice(-6) + ' ' + (t2.name || '') }).join('\n'))
2449
- if (!peer) return
2450
- var hit = tk.targets.find(function (t2) { return t2.peerId.endsWith(peer) })
2451
- if (!hit) { bcHint('未匹配到该目标'); return }
2452
- apiPost('group/broadcast/recall', { ns: state.ns || undefined, task_id: rn, peerId: hit.peerId }).then(function (d) { bcHint(d && d.ok ? '✅ 已撤回' : ((d && d.err) || '撤回失败')) })
2502
+ // 逐目标撤回(2026-09-12 重做): 任务卡片里每个"已发出"的目标自带「↩ 撤回」按钮, 点一下直接撤 ——
2503
+ // 不再弹 window.prompt 让主人手填 peerId 后 6 位(旧交互隐蔽又别扭, 主人根本没找到过)。
2504
+ var r1 = b.getAttribute && b.getAttribute('data-bcrecall1')
2505
+ if (r1) {
2506
+ var parts = String(r1).split('|')
2507
+ var t1 = (state.bcTasks || []).find(function (x) { return x.task_id === parts[0] })
2508
+ var who = t1 && t1.targets.find(function (t2) { return t2.peerId === parts[1] })
2509
+ bcHint('撤回中…')
2510
+ apiPost('group/broadcast/recall', { ns: state.ns || undefined, task_id: parts[0], peerId: parts[1] }).then(function (d) {
2511
+ bcHint(d && d.ok ? ('✅ 已撤回 ' + ((who && who.name) || parts[1])) : ('❌ ' + ((d && d.err) || '撤回失败')))
2512
+ loadBroadcastTasks(false)
2513
+ })
2514
+ return
2453
2515
  }
2454
2516
  }
2455
2517
  }
@@ -2753,19 +2815,38 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2753
2815
  + '<button class="dk-btn ok" id="dk-bc-confirm">✅ 确认群发(发 ' + bc.targets.length + ' 个目标)</button>'
2754
2816
  + '<span class="dk-msg" style="flex:1;text-align:right;font-size:11px;color:#c23131">⚠️ 高影响操作: 发送后 2 分钟内可逐目标撤回</span></div>'
2755
2817
  }
2818
+ // 反馈行(2026-09-12 修): bcHint() 一直在找 `#dk-bc-hint`, 但本面板从未渲染过这个元素
2819
+ // → 点「确认群发」后界面**零反馈**(消息其实已经发出去了, 主人以为没反应/是 bug)。
2820
+ out += '<div class="dk-row"><span class="dk-msg" id="dk-bc-hint" style="color:#2f9e44;font-size:12px;margin:2px 0"></span></div>'
2756
2821
  if (state.bcTasks && state.bcTasks.length) {
2757
2822
  out += '<div class="dk-row"><b style="font-size:12px">📋 群发任务</b>'
2758
2823
  + '<button class="dk-btn" id="dk-bc-refresh" style="margin-left:auto">🔄 刷新进度</button></div>'
2759
2824
  state.bcTasks.forEach(function (tk) {
2760
2825
  var stc = { draft: '#888', queued: '#1971c2', sending: '#f08c00', partial_failed: '#e03131', done: '#2f9e44', cancelled: '#868e96' }[tk.state] || '#888'
2761
2826
  var okN = tk.targets.filter(function (t2) { return tk.results[t2.peerId] && tk.results[t2.peerId].ok }).length
2762
- out += '<div class="dk-item" style="border:1px solid #eee;border-radius:6px;margin:1px 0;padding:3px 6px;flex-wrap:wrap">'
2827
+ // 2 分钟撤回窗口(以服务端为准): 从任务完成时刻起算的剩余秒数
2828
+ var left = ''
2829
+ if ((tk.state === 'done' || tk.state === 'partial_failed') && tk.done_at) {
2830
+ var sec = Math.floor((tk.done_at + 120000 - Date.now()) / 1000)
2831
+ left = sec > 0 ? ('可撤 ' + sec + 's') : '已过撤回窗口'
2832
+ }
2833
+ out += '<div class="dk-item" style="border:1px solid #eee;border-radius:6px;margin:2px 0;padding:4px 6px;display:block">'
2834
+ + '<div style="display:flex;align-items:center;gap:6px">'
2763
2835
  + '<span style="font-size:11px;font-weight:700;color:' + stc + '">' + ({ draft: '草稿', queued: '排队中', sending: '发送中', partial_failed: '部分失败', done: '已完成', cancelled: '已中止' }[tk.state] || tk.state) + '</span>'
2764
2836
  + '<span style="flex:1;font-size:11px;color:#555;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"> ' + esc(String(tk.payload.content || '').slice(0, 30)) + '</span>'
2765
- + '<span style="font-size:11px;color:#666">' + okN + '/' + tk.targets.length + '</span>'
2837
+ + '<span style="font-size:11px;color:#666">' + okN + '/' + tk.targets.length + (left ? ' · ' + left : '') + '</span>'
2766
2838
  + (tk.state === 'queued' || tk.state === 'sending' ? '<button class="dk-btn no" data-bccancel="' + esc(tk.task_id) + '" style="margin-left:6px">⏹ 中止</button>' : '')
2767
- + (tk.state === 'done' || tk.state === 'partial_failed' ? '<button class="dk-btn" data-bcrecall="' + esc(tk.task_id) + '" style="margin-left:6px" title="撤回该任务 2 分钟内已发的消息(逐目标)">↩ 撤回</button>' : '')
2768
2839
  + '</div>'
2840
+ // 逐目标明细 + 该目标的「↩ 撤回」(2026-09-12): 谁发出去了、谁失败了、谁能撤, 一眼看清
2841
+ tk.targets.forEach(function (t2) {
2842
+ var r2 = tk.results && tk.results[t2.peerId]
2843
+ var mark = !r2 ? '⏳ 待发' : (r2.ok ? '✅ 已发' : ('❌ ' + esc(String(r2.err || '失败'))))
2844
+ out += '<div style="display:flex;align-items:center;gap:6px;font-size:11px;color:#555;padding-left:6px">'
2845
+ + '<span style="flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">' + (t2.scope === 'group' ? '👥' : '👤') + ' ' + esc(t2.name || String(t2.peerId).slice(0, 12)) + ' <span style="color:#aaa">…' + esc(String(t2.peerId).slice(-4)) + '</span> ' + mark + '</span>'
2846
+ + (r2 && r2.ok ? '<button class="dk-btn no" data-bcrecall1="' + esc(tk.task_id) + '|' + esc(t2.peerId) + '" style="font-size:11px">↩ 撤回</button>' : '')
2847
+ + '</div>'
2848
+ })
2849
+ out += '</div>'
2769
2850
  })
2770
2851
  }
2771
2852
  out += '</div>'
@@ -2820,7 +2901,7 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2820
2901
  + '<button class="dk-btn ok" id="dk-tg-add"' + (state.tgCur ? '' : ' disabled') + ' title="把上面勾选的目标加入当前分组">➕ 勾选的加入本组</button>'
2821
2902
  + '<button class="dk-btn" id="dk-tg-remove"' + (state.tgCur ? '' : ' disabled') + ' title="把勾选的从当前分组移出">➖ 从本组移出</button>'
2822
2903
  + '<button class="dk-btn" id="dk-tg-pickall"' + (state.tgCur ? '' : ' disabled') + ' title="勾选当前分组的全部成员">☑ 选中本组</button>'
2823
- + '<span class="dk-msg" style="font-size:11px;color:#888">分组仅存本机浏览器, 用于快速批量勾选</span>'
2904
+ + '<span class="dk-msg" style="font-size:11px;color:#888">分组已存到 host(与 AI 共用): 直接说"发给【分组名】"即可群发</span>'
2824
2905
  + '</div>'
2825
2906
  body += '<div class="dk-row">范围: '
2826
2907
  + '<label style="display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-size:12px"><input type="radio" name="dk-rscope" value="all"' + (state.rosterScope === 'all' ? ' checked' : '') + '> 全部</label>'
@@ -2923,7 +3004,9 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2923
3004
  + '<button class="dk-btn" id="dk-roster-all">全选(当前范围)</button>'
2924
3005
  + '<button class="dk-btn" id="dk-roster-clear">清空</button>'
2925
3006
  + '<span class="dk-msg" style="flex:1;text-align:right;color:#2f9e44">已选 ' + rosterSelN() + ' 个</span>'
2926
- + '<button class="dk-btn ok" id="dk-roster-send">🚀 群发勾选项</button></div>'
3007
+ + '<button class="dk-btn ok" id="dk-roster-send">🚀 群发勾选项</button>'
3008
+ + '<button class="dk-btn no" id="dk-roster-recall" title="撤回这些目标最近一条广播消息(2 分钟内有效); 不用去任务列表翻 task_id">↩ 撤回勾选项最近消息</button></div>'
3009
+ body += '<div class="dk-row"><span class="dk-msg" id="dk-roster-hint" style="color:#2f9e44;font-size:12px"></span></div>'
2927
3010
  body += '<div class="dk-list" id="dk-roster-list"></div>'
2928
3011
  // ── M3 群发面板(与「📤 群发 · 广播」子页共用, 2026-09-10 抽成 broadcastPanel) ──
2929
3012
  body += broadcastPanel()
@@ -2936,7 +3019,9 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2936
3019
  body += '<div class="dk-row" style="gap:6px;flex-wrap:wrap">'
2937
3020
  + '<button class="dk-btn" id="dk-bc-goto">📇 去勾选目标</button>'
2938
3021
  + '<button class="dk-btn ok" id="dk-roster-send"' + (btg.length ? '' : ' disabled') + ' title="把勾选的目标纳入群发">🚀 群发勾选项</button>'
3022
+ + '<button class="dk-btn no" id="dk-roster-recall" title="撤回这些目标最近一条广播消息(2 分钟内有效)">↩ 撤回勾选项最近消息</button>'
2939
3023
  + '</div>'
3024
+ body += '<div class="dk-row"><span class="dk-msg" id="dk-roster-hint" style="color:#2f9e44;font-size:12px"></span></div>'
2940
3025
  if (btg.length) {
2941
3026
  body += '<div class="dk-item" style="border:1px solid #eef7ee;border-radius:6px;margin:4px 0;padding:3px 6px;max-height:16vh;overflow:auto">'
2942
3027
  btg.forEach(function (t2) {
@@ -2950,9 +3035,10 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
2950
3035
  if (om === 'nothink') body += '<div class="dk-msg" style="color:#c23131;margin:2px 0">⚠️ 当前为「完全不思考」(设置页开启): QQ 入站不唤醒 AI。发 /outmode adaptive 可唤醒。</div>'
2951
3036
  body += '<div class="dk-row" style="font-weight:700;font-size:13px;margin:4px 0 2px">⇄ 出站方式(保存即热更新,不用重启)</div>'
2952
3037
  body += '<div class="dk-row">'
2953
- + ['adaptive','passive','silent'].map(function (m2) { return '<label style="display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-size:12px;color:#333"><input type="radio" name="dk-outmode" value="' + m2 + '"' + (om === m2 ? ' checked' : '') + '> ' + (m2==='adaptive' ? '适配主动(推荐默认)' : (m2==='passive' ? '被动(只回最后一句)' : '完全不出站(静默)')) + '</label>' }).join('')
3038
+ + ['adaptive','detail','passive','silent'].map(function (m2) { return '<label style="display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-size:12px;color:#333"><input type="radio" name="dk-outmode" value="' + m2 + '"' + (om === m2 ? ' checked' : '') + '> ' + (m2==='adaptive' ? '适配主动(推荐默认)' : (m2==='detail' ? '详细主动(连工具调用一起推)' : (m2==='passive' ? '被动(只回最后一句)' : '完全不出站(静默)'))) + '</label>' }).join('')
2954
3039
  + '</div>'
2955
3040
  body += '<div class="dk-msg" style="line-height:1.6">适配主动=和QQ有关的会话回复都发到QQ: 刚收到真人消息时前5条带引用回你(能看到回的是哪句), 第6条起自动转独立新消息, 连发不被QQ吞; 定时/后台等没有新真人消息的主动推送也走独立消息。'
3041
+ body += '详细主动=聊天行为与适配主动完全一样, 但额外把 AI 的工具调用(🔧 工具调用)与工具结果也推到 QQ —— 能在 QQ 上看她正在干什么; 消息会明显变多, 看完记得切回适配主动。'
2956
3042
  body += '被动=始终以「回复你那条」发出, 连发约4~5条后会被QQ吞掉。完全不出站=本机静默, 不向QQ发任何回复(AI 可用工具随时切回)。本开关对纯web(没绑QQ)的会话不生效。</div>'
2957
3043
  body += '<span class="dk-msg" id="dk-out-hint" style="color:#2f9e44;margin:4px 0"></span>'
2958
3044
  } else if (state.tab === 'card') {
@@ -3081,6 +3167,8 @@ var QQS_CSS = ".qqs-btn{font:inherit;color:#333;background:linear-gradient(180de
3081
3167
  if (state.tab === 'card') bindCardEvents()
3082
3168
  // 📤 广播子页: 绑定群发按钮 + 刷新任务列表(任务列表静默拉取, 不重绘 → 防死循环)
3083
3169
  if (state.tab === 'broadcast') { bindBroadcastEvents(); loadBroadcastTasks(false, true); startBroadcastAdvance() }
3170
+ // 分组(host 持久化, 与 AI 共用): 进选目标/广播页时拉一次, 保证多浏览器与 AI 侧看到的是同一份
3171
+ if (state.tab === 'roster' || state.tab === 'broadcast') loadTgGroupsFromHost()
3084
3172
  // 注: 📤 群发子标签栏的点击绑定由上面 bindBodyEvents() 统一处理(它含 [data-subtab])
3085
3173
  // 首次进入聊天 tab 自动拉最新一页
3086
3174
  if (state.tab === 'chat' && !state.chatItems.length && !state.chatBusy) loadChat(true)
@@ -65,7 +65,12 @@ export type ApiResult<T> = {
65
65
  human: string;
66
66
  };
67
67
  };
68
- /** 官方错误码 → 人话(可扩充; code 映射不到时回落通用文案) */
68
+ /**
69
+ * 官方错误码 → 人话(可扩充; code 映射不到时回落通用文案)。
70
+ * 2026-09-12 增强(主人要求"错误人话化"): 不只说"哪里错了", 还要给**可执行的下一步** ——
71
+ * 之前只覆盖群管理类码, 发消息类的报错会把裸码抛给用户/AI(如"被动回复时间或次数超过限制"),
72
+ * 以致 AI 得自己猜怎么绕。
73
+ */
69
74
  export declare function mapErrHuman(code: string | number, gateHuman?: string): string;
70
75
  export interface GroupAdminOptions {
71
76
  appId: string;
@@ -151,9 +156,14 @@ export declare class GroupAdminClient {
151
156
  }>>;
152
157
  /**
153
158
  * 撤回机器人自己发的消息(官方撤回窗口 2 分钟, 仅能撤自己发的)。
154
- * msgId: 发送成功时返回的 msg_id(群消息)或 id(私聊消息)。
159
+ * ⚠️ 2026-09-12 修(主人实测报 **11001**): 原实现打的是 `/v2/messages/{id}` —— **官方没有这个路径**,
160
+ * 正确路径按场景分(官方文档已核对):
161
+ * 群聊 DELETE `/v2/groups/{group_openid}/messages/{message_id}`
162
+ * 单聊 DELETE `/v2/users/{user_openid}/messages/{message_id}`
163
+ * @param peerId 群 openid(scope=group) 或 用户 openid(scope=c2c)
164
+ * @param msgId 发送成功时返回的 message_id
155
165
  */
156
- recallMessage(msgId: string): Promise<ApiResult<Record<string, unknown>>>;
166
+ recallMessage(peerId: string, msgId: string, scope?: 'group' | 'c2c'): Promise<ApiResult<Record<string, unknown>>>;
157
167
  }
158
168
  /** 工厂: 每实例一个 client(配置来自各 bot config.appId/appSecret) */
159
169
  export declare function createGroupAdmin(opts: GroupAdminOptions): GroupAdminClient;
@@ -1 +1 @@
1
- {"version":3,"file":"group-admin.d.ts","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"group-admin.d.ts","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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"}
@@ -51,10 +51,16 @@ export function verifyHuman(vi) {
51
51
  return VERIFY_METHOD_HUMAN[vi.method] ?? `验证方式:${vi.method}`;
52
52
  return '';
53
53
  }
54
- /** 官方错误码 → 人话(可扩充; code 映射不到时回落通用文案) */
54
+ /**
55
+ * 官方错误码 → 人话(可扩充; code 映射不到时回落通用文案)。
56
+ * 2026-09-12 增强(主人要求"错误人话化"): 不只说"哪里错了", 还要给**可执行的下一步** ——
57
+ * 之前只覆盖群管理类码, 发消息类的报错会把裸码抛给用户/AI(如"被动回复时间或次数超过限制"),
58
+ * 以致 AI 得自己猜怎么绕。
59
+ */
55
60
  export function mapErrHuman(code, gateHuman) {
56
61
  const c = String(code);
57
62
  const table = {
63
+ // ── 群管理/权限类 ──
58
64
  '11253': gateHuman || '该能力官方尚未开放/未授权(内邀中或需白名单), 请联系平台运营',
59
65
  '11703': gateHuman || '机器人无该接口权限: 需为该群管理员, 或该能力尚未对应用开放(探针实测 2026-09-05)',
60
66
  '40103004': '不能操作该成员: 群主/管理员/机器人不可被禁言(只能禁普通成员)',
@@ -63,8 +69,40 @@ export function mapErrHuman(code, gateHuman) {
63
69
  '40101': '频控: 请求太快, 稍等再试',
64
70
  '403': '机器人缺少群管理员身份或未授权',
65
71
  '401': '访问凭证无效, 请刷新后重试',
72
+ '11001': '接口或参数不正确(实测: 调用的 API 路径/字段写错时会返回它) —— 检查 URL 与参数, 不是网络问题',
73
+ // ── 消息发送类(2026-09-12 补: 每条都给"怎么办") ──
74
+ '304103': '被动回复的 msg_id 已过期(窗口 5 分钟): 去掉 msg_id 改**主动消息**, 或等群里有人先说一句',
75
+ '40034005': '回复的 msg_id 已过期(被动回复 5 分钟内有效): 改**主动消息**发送, 或让群里先有人说话',
76
+ '304036': '机器人没有 Markdown 模板权限: 改用 `type=text` 纯文本(或去 QQ 开放平台申请 Markdown 模板)',
77
+ '40034008': 'markdown 参数里有空值: 每个模板参数都要有值',
78
+ '40034009': 'markdown 参数里有换行符: 去掉参数中的换行',
79
+ '40034010': '模板参数里不能含 markdown 语法: 参数用纯文本',
80
+ '40034006': '内容违规: 改一下措辞(去掉敏感词/可疑链接)',
81
+ '40034029': '键盘按钮超限(最多 5 行 × 每行 5 个): 减少按钮数量',
82
+ '304004': '无权限使用该 ARK 模板',
83
+ '305007': 'keyboard 结构不对: 检查 rows/buttons 层级',
84
+ '340069': 'msg_type 无效: 只能 0=文本 / 2=markdown / 7=富媒体',
85
+ '22006': '消息类型与内容不匹配: msg_type 要和实际内容字段对应',
86
+ '40034004': '富媒体转存失败(平台没能下载你的 URL): 换可直连的直链, 或改用本地文件上传后重试',
87
+ '304080': 'file_info 无效/已过期: 重新上传文件再发(带 ttl)',
88
+ '304064': '订阅消息未授权: 需用户先授权订阅',
66
89
  };
67
- return table[c] ?? table[String(Number(c))] ?? `调用失败(错误码 ${c}), 请稍后重试`;
90
+ const hit = table[c] ?? table[String(Number(c))];
91
+ if (hit)
92
+ return hit;
93
+ // 有些错误不是数字码而是官方 message 文本(如"被动回复时间或次数超过限制") → 关键词兜底, 同样给下一步
94
+ if (!/^\d+$/u.test(c)) {
95
+ if (/被动|回复.*(超|限)/u.test(c)) {
96
+ return `被动回复超限(同一条 msg_id 最多回 ~5 条 / 5 分钟窗口): 去掉 msg_id 改主动消息, 或隔 5 秒重试 · 原文: ${c}`;
97
+ }
98
+ if (/频|限流|太快|too\s*many/iu.test(c))
99
+ return `触发频控, 等 5~10 秒再试 · 原文: ${c}`;
100
+ if (/过期|expire/iu.test(c))
101
+ return `引用的消息已过期(被动回复 5 分钟窗口): 改用主动消息 · 原文: ${c}`;
102
+ if (/markdown|模板/iu.test(c))
103
+ return `Markdown 模板问题: 改用 type=text 纯文本最稳 · 原文: ${c}`;
104
+ }
105
+ return `调用失败(错误码 ${c}), 请稍后重试`;
68
106
  }
69
107
  /** per-appId token 缓存(带过期提前刷新与并发单飞) */
70
108
  class TokenCache {
@@ -242,10 +280,16 @@ export class GroupAdminClient {
242
280
  }
243
281
  /**
244
282
  * 撤回机器人自己发的消息(官方撤回窗口 2 分钟, 仅能撤自己发的)。
245
- * msgId: 发送成功时返回的 msg_id(群消息)或 id(私聊消息)。
283
+ * ⚠️ 2026-09-12 修(主人实测报 **11001**): 原实现打的是 `/v2/messages/{id}` —— **官方没有这个路径**,
284
+ * 正确路径按场景分(官方文档已核对):
285
+ * 群聊 DELETE `/v2/groups/{group_openid}/messages/{message_id}`
286
+ * 单聊 DELETE `/v2/users/{user_openid}/messages/{message_id}`
287
+ * @param peerId 群 openid(scope=group) 或 用户 openid(scope=c2c)
288
+ * @param msgId 发送成功时返回的 message_id
246
289
  */
247
- async recallMessage(msgId) {
248
- return this.call('DELETE', `/v2/messages/${encodeURIComponent(msgId)}`);
290
+ async recallMessage(peerId, msgId, scope = 'group') {
291
+ const base = scope === 'c2c' ? '/v2/users' : '/v2/groups';
292
+ return this.call('DELETE', `${base}/${encodeURIComponent(peerId)}/messages/${encodeURIComponent(msgId)}`);
249
293
  }
250
294
  }
251
295
  /** 工厂: 每实例一个 client(配置来自各 bot config.appId/appSecret) */
@@ -1 +1 @@
1
- {"version":3,"file":"group-admin.js","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"group-admin.js","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,4CAA4C;AAC5C,MAAM,SAAS,GAAG,2CAA2C,CAAC;AAC9D,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C,yDAAyD;AACzD,MAAM,CAAC,MAAM,aAAa,GAAqD;IAC7E,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE;IACtE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,gDAAgD,EAAE;IACvF,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE;IAC5D,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE;IAC9D,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE;IACzD,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;CAClD,CAAC;AAqBF,mDAAmD;AACnD,MAAM,mBAAmB,GAA2B;IAClD,eAAe,EAAE,cAAc;IAC/B,YAAY,EAAE,OAAO;IACrB,SAAS,EAAE,MAAM;IACjB,EAAE,EAAE,MAAM;CACX,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,EAAiH;IAC3I,MAAM,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,EAAE,EAAE,cAAc;QAAE,OAAO,EAAE,CAAC,cAAc,CAAC;IACjD,IAAI,EAAE,EAAE,MAAM;QAAE,OAAO,mBAAmB,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;IAC7E,OAAO,EAAE,CAAC;AACZ,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAqB,EAAE,SAAkB;IACnE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,KAAK,GAA2B;QACpC,gBAAgB;QAChB,OAAO,EAAE,SAAS,IAAI,kCAAkC;QACxD,OAAO,EAAE,SAAS,IAAI,kDAAkD;QACxE,UAAU,EAAE,mCAAmC;QAC/C,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,0DAA0D;QACnE,uCAAuC;QACvC,QAAQ,EAAE,4DAA4D;QACtE,UAAU,EAAE,sDAAsD;QAClE,QAAQ,EAAE,mEAAmE;QAC7E,UAAU,EAAE,6BAA6B;QACzC,UAAU,EAAE,4BAA4B;QACxC,UAAU,EAAE,8BAA8B;QAC1C,UAAU,EAAE,yBAAyB;QACrC,UAAU,EAAE,iCAAiC;QAC7C,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,mCAAmC;QAC7C,QAAQ,EAAE,2CAA2C;QACrD,OAAO,EAAE,iCAAiC;QAC1C,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE,mCAAmC;QAC7C,QAAQ,EAAE,mBAAmB;KAC9B,CAAC;IACF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,6DAA6D;IAC7D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,OAAO,yEAAyE,CAAC,EAAE,CAAC;QACtF,CAAC;QACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,0BAA0B,CAAC,EAAE,CAAC;QACzE,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,uCAAuC,CAAC,EAAE,CAAC;QAC7E,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,2CAA2C,CAAC,EAAE,CAAC;IACrF,CAAC;IACD,OAAO,YAAY,CAAC,UAAU,CAAC;AACjC,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU;IACN,KAAK,GAAG,IAAI,GAAG,EAA+C,CAAC;IAC/D,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtD,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,SAAiB;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,MAAM;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;QAChE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;gBACd,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;oBACjC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;iBACzD,CAAC,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoF,CAAC;gBAChH,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;gBACtF,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBACvG,OAAO,CAAC,CAAC,YAAY,CAAC;YACxB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;AAC/C,SAAS,IAAI,CAAC,IAAY;IACxB,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC;QAAC,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC/F,CAAC;AAUD,MAAM,OAAO,gBAAgB;IAIE;IAHZ,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAC1B,KAAK,CAA0B;IAEhD,YAA6B,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;QAClD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAC7B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CACzF,CAAC;IACJ,CAAC;IAEO,IAAI,CAAC,IAAY;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,iBAAiB,EAAE,EAAE,CAAC;IAChG,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,MAA2C,EAAE,IAAY,EAAE,IAAc;QAC7F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAE;YAC5C,MAAM;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,KAAK,EAAE;gBAC/B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC5D,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA2F,CAAC;QACzI,IAAI,CAAC,iBAAiB,MAAM,IAAI,IAAI,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;QACjH,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAM,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,aAAa,CACjB,GAAW,EACX,aAAuB,EACvB,cAAc,GAAG,KAAK;QAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,uBAAuB,EAAE;YACrF,cAAc,EAAE,aAAa;YAC7B,uBAAuB,EAAE,cAAc;SACxC,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,KAAK,CAAC,gBAAgB,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,MAAM;YAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE;YAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,kBAAkB,CACtB,GAAW,EACX,YAAoB,EACpB,EAAyB,EACzB,IAAuF;QAEvF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,0BAA0B,kBAAkB,CAAC,YAAY,CAAC,EAAE,EAAE;YAC1H,EAAE;YACF,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACzF,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,YAAY,CAAC,GAAW;QAI5B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,GAAW,EACX,YAAoB,EACpB,YAA2B;QAE3B,MAAM,OAAO,GAAG,YAAY;YAC1B,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;YAC5E,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACvG,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,OAAe;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,kCAAkC;QAC1F,MAAM,MAAM,GAAG,0EAA0E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxG,MAAM,IAAI,GAA4B,MAAM;YAC1C,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE;YACzD,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnF,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,GAAW,EACX,QAAgB,EAChB,QAAkC;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;QACvD,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACxG,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnF,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,OAAe;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;QACvD,MAAM,MAAM,GAAG,0EAA0E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxG,MAAM,IAAI,GAA4B,MAAM;YAC1C,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE;YACzD,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACzF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,UAAkB,EAClB,QAAgB,EAChB,QAAkC;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;QACvD,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACxG,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACzF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,KAAa,EAAE,QAAyB,OAAO;QACjF,MAAM,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,kBAAkB,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5G,CAAC;CAEF;AAED,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACvD,OAAO,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC7D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"channel-tools.d.ts","sourceRoot":"","sources":["../src/channel-tools.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAsElE,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAC1C,eAAO,MAAM,MAAM,UAAY,CAAC;AAShC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAI/D;AAkFD,mDAAmD;AACnD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4qCvD"}
1
+ {"version":3,"file":"channel-tools.d.ts","sourceRoot":"","sources":["../src/channel-tools.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAuElE,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAC1C,eAAO,MAAM,MAAM,UAAY,CAAC;AAShC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAI/D;AAkFD,mDAAmD;AACnD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA+/CvD"}