@zaofan/dsh-qqbot 0.9.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +394 -344
  2. package/README_EN.md +313 -281
  3. package/client/qqbot-settings.js +3214 -2986
  4. package/dist/channel-tools.d.ts +1 -1
  5. package/dist/channel-tools.d.ts.map +1 -1
  6. package/dist/channel-tools.js +134 -3
  7. package/dist/channel-tools.js.map +1 -1
  8. package/dist/commands/approve.d.ts +17 -0
  9. package/dist/commands/approve.d.ts.map +1 -0
  10. package/dist/commands/approve.js +24 -0
  11. package/dist/commands/approve.js.map +1 -0
  12. package/dist/commands/botplay.d.ts +15 -0
  13. package/dist/commands/botplay.d.ts.map +1 -0
  14. package/dist/commands/botplay.js +34 -0
  15. package/dist/commands/botplay.js.map +1 -0
  16. package/dist/commands/exit.d.ts +7 -0
  17. package/dist/commands/exit.d.ts.map +1 -0
  18. package/dist/commands/exit.js +85 -0
  19. package/dist/commands/exit.js.map +1 -0
  20. package/dist/commands/index.d.ts.map +1 -1
  21. package/dist/commands/index.js +14 -1
  22. package/dist/commands/index.js.map +1 -1
  23. package/dist/commands/permission.d.ts +18 -0
  24. package/dist/commands/permission.d.ts.map +1 -0
  25. package/dist/commands/permission.js +43 -0
  26. package/dist/commands/permission.js.map +1 -0
  27. package/dist/commands/session.d.ts +5 -1
  28. package/dist/commands/session.d.ts.map +1 -1
  29. package/dist/commands/session.js +51 -5
  30. package/dist/commands/session.js.map +1 -1
  31. package/dist/config.d.ts +55 -0
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +75 -0
  34. package/dist/config.js.map +1 -1
  35. package/dist/features/approval-switch.d.ts +22 -0
  36. package/dist/features/approval-switch.d.ts.map +1 -0
  37. package/dist/features/approval-switch.js +10 -0
  38. package/dist/features/approval-switch.js.map +1 -0
  39. package/dist/features/botplay.d.ts +141 -0
  40. package/dist/features/botplay.d.ts.map +1 -0
  41. package/dist/features/botplay.js +547 -0
  42. package/dist/features/botplay.js.map +1 -0
  43. package/dist/features/extension-store.d.ts +27 -0
  44. package/dist/features/extension-store.d.ts.map +1 -0
  45. package/dist/features/extension-store.js +152 -0
  46. package/dist/features/extension-store.js.map +1 -0
  47. package/dist/features/qq-approval.d.ts.map +1 -1
  48. package/dist/features/qq-approval.js +3 -1
  49. package/dist/features/qq-approval.js.map +1 -1
  50. package/dist/gateway/bootstrap.d.ts.map +1 -1
  51. package/dist/gateway/bootstrap.js +60 -1
  52. package/dist/gateway/bootstrap.js.map +1 -1
  53. package/dist/gateway/middleware-setup.d.ts +1 -1
  54. package/dist/gateway/middleware-setup.d.ts.map +1 -1
  55. package/dist/gateway/middleware-setup.js +10 -2
  56. package/dist/gateway/middleware-setup.js.map +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +19 -2
  59. package/dist/index.js.map +1 -1
  60. package/dist/model/model-resolver.d.ts +12 -0
  61. package/dist/model/model-resolver.d.ts.map +1 -1
  62. package/dist/model/model-resolver.js +24 -0
  63. package/dist/model/model-resolver.js.map +1 -1
  64. package/dist/model/prefs-store.d.ts +16 -0
  65. package/dist/model/prefs-store.d.ts.map +1 -1
  66. package/dist/model/prefs-store.js +48 -0
  67. package/dist/model/prefs-store.js.map +1 -1
  68. package/dist/session/session-manager.d.ts +37 -0
  69. package/dist/session/session-manager.d.ts.map +1 -1
  70. package/dist/session/session-manager.js +168 -16
  71. package/dist/session/session-manager.js.map +1 -1
  72. package/package.json +1 -1
@@ -0,0 +1,141 @@
1
+ /**
2
+ * botplay.ts — botplay 互动事件装配器(2026-09-08, Phase1 MVP)
3
+ *
4
+ * 设计定稿见工作区 参考文档/botplay互动事件装配器_设计完整稿.md(唯一权威):
5
+ * 一句话本质 = 自定义 bot 互动事件: ①bot(非LLM)发出什么交互卡片 →
6
+ * ②用户点哪个按钮 → ③这件事要不要/怎么影响 LLM, 全部可配置。
7
+ *
8
+ * 本文件职责(参照 qq-approval.ts / qq-user-questions.ts 的注册表范式):
9
+ * - BotplayController: 发卡(trigger) + interaction 回调结算(handleInteraction)
10
+ * + append 三档(no_append / append_silent / append_wake)
11
+ * - 事件配置从 live config(config.botplayEvents, settings 同源热更)现读;
12
+ * dock「🎮 互动事件」装配器编辑后保存即热更, 无需重启。
13
+ * - /botplay 命令经 triggerBotplay() 模块级注册表触发(仿 outbound-mode-switch)。
14
+ *
15
+ * Phase1 MVP 范围: schema 最小集(id/name/buttons[label,botAction.reply_text,
16
+ * llmEffect.mode]/maxClicks/expireSec); perm 默认 all, triggerer 推荐;
17
+ * 行为类型 reply_text 落地, jump_url/callback 预留。
18
+ */
19
+ import type { ReplyTarget } from '@tencent-connect/qqbot-nodejs';
20
+ import type { QQBotSender } from '../transport/outbound-buffer.js';
21
+ import type { SessionManager } from '../session/index.js';
22
+ import type { Logger } from '../types.js';
23
+ import type { BotplayButtonConfig, BotplayEventConfig } from '../config.js';
24
+ export interface BotplayTriggerResult {
25
+ ok: boolean;
26
+ msg: string;
27
+ }
28
+ /**
29
+ * 构造事件卡片 keyboard(官方 msg_type=2 + keyboard)。
30
+ * QQ 限制: rows ≤5 行 × 5 按钮/行; 默认每行1个(竖排, 字宽不截断),
31
+ * 事件 buttonsPerRow(1~5)可设每行多个(Phase2)。
32
+ * permission: 按事件 perm 决定 —— all→type2所有人 / triggerer→type0 指定触发者 /
33
+ * owner→type0 主人白名单 / users→type0 指定 openid。
34
+ * 按钮 action.type 按 botAction 区分(Phase2):
35
+ * reply_text/callback/command → 1 回调按钮(点击回后台, data=bp:card:btn)
36
+ * jump_url → 0 跳转按钮(data=http(s) 链接, 点击直接跳不走回调)
37
+ */
38
+ export declare function botplayKeyboard(cardId: string, buttons: BotplayButtonConfig[], perm: NonNullable<BotplayEventConfig['perm']>, ownerIds: string[], triggererId?: string, buttonsPerRow?: number): {
39
+ content: {
40
+ rows: unknown[];
41
+ };
42
+ };
43
+ /** 从 interaction button_data 解析 cardId + buttonId; 非 botplay 按钮返回 null */
44
+ export declare function parseBotplayButton(data: string | undefined): {
45
+ cardId: string;
46
+ buttonId: string;
47
+ } | null;
48
+ export declare function parseCatalogButton(data: string | undefined): {
49
+ page: number;
50
+ key: string;
51
+ } | null;
52
+ export declare class BotplayController {
53
+ private readonly manager;
54
+ private readonly sender;
55
+ private readonly logger;
56
+ /** live 事件配置 getter(config.botplayEvents, 每次现读支持热更) */
57
+ private readonly eventsGetter;
58
+ /** 主人 openid 白名单 getter(config.groupAdmin.owners; perm=owner 用) */
59
+ private readonly ownersGetter;
60
+ /** 台账 dataDir getter(表情包目录; 点击人昵称反查, 与 dock 禁言面板同源) */
61
+ private readonly ledgerDataDirGetter;
62
+ private readonly cards;
63
+ constructor(manager: SessionManager, sender: QQBotSender, logger: Logger,
64
+ /** live 事件配置 getter(config.botplayEvents, 每次现读支持热更) */
65
+ eventsGetter: () => BotplayEventConfig[],
66
+ /** 主人 openid 白名单 getter(config.groupAdmin.owners; perm=owner 用) */
67
+ ownersGetter: () => string[],
68
+ /** 台账 dataDir getter(表情包目录; 点击人昵称反查, 与 dock 禁言面板同源) */
69
+ ledgerDataDirGetter: () => string);
70
+ /** 指令型按钮执行器(bootstrap 注入: 执行斜杠命令并返回文本) */
71
+ private commandExecutor;
72
+ setCommandExecutor(fn: ((cmdName: string, target: ReplyTarget) => Promise<string>) | undefined): void;
73
+ /** 列出所有事件(公开, dock/命令共用) */
74
+ listEvents(): BotplayEventConfig[];
75
+ /** 按事件 id 精确查(live 现读) */
76
+ findEvent(eventId: string): BotplayEventConfig | undefined;
77
+ /**
78
+ * 触发发卡(/botplay 事件名)。定位会话用命令上下文所在 scope/peerId,
79
+ * 归属人 = 触发者本人 openid(group=c2c 同 senderId)。
80
+ */
81
+ trigger(target: ReplyTarget, eventId: string, triggererId: string): Promise<BotplayTriggerResult>;
82
+ /** 发送事件目录卡(/botplay 无参 或 目录卡翻页; 点事件名按钮 → handleInteraction 直接触发) */
83
+ sendCatalog(target: ReplyTarget, page?: number): Promise<BotplayTriggerResult>;
84
+ /**
85
+ * interaction 回调结算(bootstrap interaction 分发转发; type=11 消息按钮)。
86
+ * 流程: 解析 bp:<cardId>:<buttonId> → 查卡(过期/点满) → 查事件配置(live)
87
+ * → 校验按钮存在与点击人权限 → 执行 botAction → 按 llmEffect.mode append/唤醒。
88
+ * @returns true = 已被 botplay 消费(调用方无需其它处理)
89
+ */
90
+ handleInteraction(event: unknown, replyTarget: ReplyTarget): Promise<boolean>;
91
+ /**
92
+ * 点击人可读标签(与 dock 禁言面板/审批同源的昵称反查):
93
+ * ①群成员台账 group-members.jsonl(gid:mid → name, 由 chat-ledger 中间件持续记录)
94
+ * ②私聊台账 known-chats.jsonl(c2c:id → name)
95
+ * ③会话最近 user/message 消息壳 [昵称 (openid)] 兜底
96
+ * ④全 miss 回落 openid。
97
+ */
98
+ private clickerLabel;
99
+ /** 权限判定: all 放行 / triggerer=触发者本人 / owner=主人白名单 / users=指定 openid */
100
+ private checkPerm;
101
+ /**
102
+ * append 三档落点: 往该 peer 的会话写上下文/唤醒 AI。
103
+ * ⚠️ 会话不在内存(重启后未恢复/被 idle 回收)→ getOrCreate 恢复/重建(不触发回合),
104
+ * 保证 append/injectToPeer 有 record 可挂 —— 这是"点击没反应"的常见根因。
105
+ */
106
+ private applyEffect;
107
+ private safeReply;
108
+ /** 清理全部活动卡(dispose 用) */
109
+ clear(): void;
110
+ /** 扫掉过期卡(Phase2: 定期/触发时调用, 防内存积压) */
111
+ sweepExpired(): number;
112
+ /** 活动卡数量(诊断用) */
113
+ get cardCount(): number;
114
+ }
115
+ export declare function registerBotplayController(ns: string, c: BotplayController | undefined): void;
116
+ /** /botplay 命令触发入口: bootstrap 注册实现(带 sender/manager) */
117
+ type TriggerFn = (target: ReplyTarget, eventId: string, triggererId: string) => Promise<BotplayTriggerResult>;
118
+ export declare function setBotplayTriggerImpl(fn: TriggerFn | undefined): void;
119
+ export declare function triggerBotplay(target: ReplyTarget, eventId: string, triggererId: string): Promise<BotplayTriggerResult>;
120
+ /** 事件目录卡入口: bootstrap 注册实现(带 sender/manager); /botplay 无参调用 */
121
+ type CatalogFn = (target: ReplyTarget, page: number) => Promise<BotplayTriggerResult>;
122
+ export declare function setBotplayCatalogImpl(fn: CatalogFn | undefined): void;
123
+ export declare function botplayCatalog(target: ReplyTarget, page?: number): Promise<BotplayTriggerResult>;
124
+ /** 取某 ns 的事件列表(dock 装配器读; settings value 里其实已有, 此出口备用) */
125
+ export declare function listBotplayEventsAny(): Array<BotplayEventConfig & {
126
+ ns: string;
127
+ }>;
128
+ /** 会话定位 → ReplyTarget(命令层用; senderId 即触发者) */
129
+ export declare function resolveCommandTarget(cmdCtx: {
130
+ message?: {
131
+ kind?: string;
132
+ groupOpenid?: string;
133
+ senderId?: string;
134
+ messageId?: string;
135
+ };
136
+ }): {
137
+ target: ReplyTarget;
138
+ triggererId: string;
139
+ };
140
+ export {};
141
+ //# sourceMappingURL=botplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botplay.d.ts","sourceRoot":"","sources":["../../src/features/botplay.ts"],"names":[],"mappings":"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"}