@zaofan/dsh-qqbot 1.0.1 → 1.1.2

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 (105) hide show
  1. package/README.md +6 -0
  2. package/client/qqbot-settings.js +667 -54
  3. package/dist/api/group-admin.d.ts +37 -0
  4. package/dist/api/group-admin.d.ts.map +1 -1
  5. package/dist/api/group-admin.js +57 -0
  6. package/dist/api/group-admin.js.map +1 -1
  7. package/dist/channel-tools.d.ts.map +1 -1
  8. package/dist/channel-tools.js +373 -25
  9. package/dist/channel-tools.js.map +1 -1
  10. package/dist/commands/botplay.d.ts.map +1 -1
  11. package/dist/commands/botplay.js +6 -2
  12. package/dist/commands/botplay.js.map +1 -1
  13. package/dist/commands/index.d.ts.map +1 -1
  14. package/dist/commands/index.js +6 -2
  15. package/dist/commands/index.js.map +1 -1
  16. package/dist/commands/inject.d.ts +17 -0
  17. package/dist/commands/inject.d.ts.map +1 -0
  18. package/dist/commands/inject.js +70 -0
  19. package/dist/commands/inject.js.map +1 -0
  20. package/dist/commands/misc.d.ts +1 -1
  21. package/dist/commands/misc.d.ts.map +1 -1
  22. package/dist/commands/misc.js +25 -3
  23. package/dist/commands/misc.js.map +1 -1
  24. package/dist/commands/session.d.ts +2 -0
  25. package/dist/commands/session.d.ts.map +1 -1
  26. package/dist/commands/session.js +41 -3
  27. package/dist/commands/session.js.map +1 -1
  28. package/dist/config.d.ts +25 -0
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +18 -1
  31. package/dist/config.js.map +1 -1
  32. package/dist/features/botplay-store.d.ts +13 -0
  33. package/dist/features/botplay-store.d.ts.map +1 -0
  34. package/dist/features/botplay-store.js +99 -0
  35. package/dist/features/botplay-store.js.map +1 -0
  36. package/dist/features/botplay.d.ts +8 -0
  37. package/dist/features/botplay.d.ts.map +1 -1
  38. package/dist/features/botplay.js +22 -7
  39. package/dist/features/botplay.js.map +1 -1
  40. package/dist/features/broadcast.d.ts +63 -0
  41. package/dist/features/broadcast.d.ts.map +1 -0
  42. package/dist/features/broadcast.js +225 -0
  43. package/dist/features/broadcast.js.map +1 -0
  44. package/dist/features/card-callback.d.ts +52 -0
  45. package/dist/features/card-callback.d.ts.map +1 -0
  46. package/dist/features/card-callback.js +133 -0
  47. package/dist/features/card-callback.js.map +1 -0
  48. package/dist/features/group-hub.d.ts +14 -0
  49. package/dist/features/group-hub.d.ts.map +1 -1
  50. package/dist/features/group-hub.js +87 -4
  51. package/dist/features/group-hub.js.map +1 -1
  52. package/dist/features/group-join-request.d.ts.map +1 -1
  53. package/dist/features/group-join-request.js +9 -2
  54. package/dist/features/group-join-request.js.map +1 -1
  55. package/dist/features/poll-join-requests.d.ts +9 -0
  56. package/dist/features/poll-join-requests.d.ts.map +1 -0
  57. package/dist/features/poll-join-requests.js +249 -0
  58. package/dist/features/poll-join-requests.js.map +1 -0
  59. package/dist/features/preset-switcher.d.ts +39 -0
  60. package/dist/features/preset-switcher.d.ts.map +1 -0
  61. package/dist/features/preset-switcher.js +172 -0
  62. package/dist/features/preset-switcher.js.map +1 -0
  63. package/dist/features/session-registry.d.ts +6 -0
  64. package/dist/features/session-registry.d.ts.map +1 -1
  65. package/dist/features/session-registry.js +80 -0
  66. package/dist/features/session-registry.js.map +1 -1
  67. package/dist/gateway/bootstrap.d.ts.map +1 -1
  68. package/dist/gateway/bootstrap.js +74 -4
  69. package/dist/gateway/bootstrap.js.map +1 -1
  70. package/dist/gateway/debounce.d.ts.map +1 -1
  71. package/dist/gateway/debounce.js +7 -0
  72. package/dist/gateway/debounce.js.map +1 -1
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +24 -5
  75. package/dist/index.js.map +1 -1
  76. package/dist/middleware/media-history.d.ts.map +1 -1
  77. package/dist/middleware/media-history.js +23 -6
  78. package/dist/middleware/media-history.js.map +1 -1
  79. package/dist/model/settings-reader.d.ts +7 -0
  80. package/dist/model/settings-reader.d.ts.map +1 -1
  81. package/dist/model/settings-reader.js +14 -0
  82. package/dist/model/settings-reader.js.map +1 -1
  83. package/dist/session/session-manager.d.ts +26 -0
  84. package/dist/session/session-manager.d.ts.map +1 -1
  85. package/dist/session/session-manager.js +101 -0
  86. package/dist/session/session-manager.js.map +1 -1
  87. package/dist/transport/inbound.d.ts.map +1 -1
  88. package/dist/transport/inbound.js +46 -50
  89. package/dist/transport/inbound.js.map +1 -1
  90. package/dist/transport/inject-rules.d.ts.map +1 -1
  91. package/dist/transport/inject-rules.js +8 -2
  92. package/dist/transport/inject-rules.js.map +1 -1
  93. package/dist/transport/media-kind.d.ts +37 -0
  94. package/dist/transport/media-kind.d.ts.map +1 -0
  95. package/dist/transport/media-kind.js +60 -0
  96. package/dist/transport/media-kind.js.map +1 -0
  97. package/dist/transport/outbound-buffer.d.ts +20 -2
  98. package/dist/transport/outbound-buffer.d.ts.map +1 -1
  99. package/dist/transport/outbound-buffer.js +25 -5
  100. package/dist/transport/outbound-buffer.js.map +1 -1
  101. package/dist/transport/outbound.d.ts.map +1 -1
  102. package/dist/transport/outbound.js +68 -4
  103. package/dist/transport/outbound.js.map +1 -1
  104. package/package.json +1 -1
  105. package/settings-host.js +406 -21
@@ -19,7 +19,9 @@
19
19
  */
20
20
  import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
21
21
  import { join } from 'node:path';
22
- import { notifyGroupHub, safeAppendUserMessage } from './group-hub.js';
22
+ import { notifyGroupHub, safeAppendUserMessage, joinDataDir } from './group-hub.js';
23
+ import { appendGroupMember } from './chat-ledger.js';
24
+ import { verifyHuman } from '../api/group-admin.js';
23
25
  /** 内存去重(join_request_id)与群内提醒限频: 每群 5 分钟至多 1 条, 防风暴 */
24
26
  const recentIds = new Map();
25
27
  const lastGroupNotify = new Map();
@@ -106,7 +108,7 @@ export async function handleGroupJoinRequestEvent(data, opts) {
106
108
  logger.info(`[group-join] 自动审批通过(下行): gid=${gid} user=${ev.username}(${mid}) strategy=${ev.auto_approved.strategy_id}`);
107
109
  return true;
108
110
  }
109
- const verify = ev.verify_info?.verify_message || ev.verify_info?.method || '';
111
+ const verify = verifyHuman(ev.verify_info);
110
112
  const item = {
111
113
  group_openid: gid,
112
114
  join_request_id: jid,
@@ -122,6 +124,11 @@ export async function handleGroupJoinRequestEvent(data, opts) {
122
124
  };
123
125
  pushPendingJoinRequest(config.cwd, item);
124
126
  logger.info(`[group-join] 新入群申请: gid=${gid} user=${ev.username ?? '?'}(${mid.slice(0, 10)}…) src=${ev.apply_source ?? '?'}${ev.risk_tips ? ` risk=${ev.risk_tips}` : ''}`);
127
+ // 入群申请者也是"见过的成员": 记入本地成员台账(名字留空, 进群后群内发言会补上; 2026-09-10 M3)
128
+ try {
129
+ appendGroupMember(joinDataDir(config), { ts: Date.now(), gid, mid, name: ev.username || undefined });
130
+ }
131
+ catch { /* 台账失败不阻断 */ }
125
132
  // 通知策略(主人定稿 2026-09-05 21:10 + M2 2026-09-09 扩展):
126
133
  // 要"模拟用户消息 + 模拟点停止" = 把申请 append 为目标会话的 session log 一条
127
134
  // user/message 事件(turn() 中让消息显示在 web 的那一步), 但【不 wake 不开回合】→
@@ -1 +1 @@
1
- {"version":3,"file":"group-join-request.js","sourceRoot":"","sources":["../../src/features/group-join-request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"group-join-request.js","sourceRoot":"","sources":["../../src/features/group-join-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ImQQBotConfig } from '../config.js';
2
+ import type { Logger } from '../types.js';
3
+ import type { SessionManager } from '../session/index.js';
4
+ /**
5
+ * 启动入群申请轮询。config 为 live 引用(设置热更新即时生效); 返回 stop()。
6
+ * 依赖: manager.groupAdmin(GroupAdminClient) + manager(会话寻址/hub)。
7
+ */
8
+ export declare function startJoinRequestPolling(manager: SessionManager, config: ImQQBotConfig, logger: Logger): () => void;
9
+ //# sourceMappingURL=poll-join-requests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll-join-requests.d.ts","sourceRoot":"","sources":["../../src/features/poll-join-requests.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAoD1D;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,CA0LZ"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * poll-join-requests.ts — 入群申请轮询(2026-09-09 主人定, 事件驱动的兜底)
3
+ *
4
+ * 背景: GROUP_JOIN_REQUEST 事件订阅依赖"机器人为群管理员"且可能漏推(离线/没订阅)。
5
+ * 轮询 = 定时拉取各群审批列表, 保证待审批申请**总能被注意到**。
6
+ *
7
+ * 逻辑(主人拍板, 与"攒批"分开判断):
8
+ * - 每 intervalMin 分钟拉取群注册表(groups.json)所有群的 join_request_list;
9
+ * - 对比 pending(join-pending.json)里已见过的 join_request_id → 找出【新增】申请;
10
+ * - **新增 ≥1 个就唤醒**(minCount 默认 1, 可调) —— 一天只来 1 个人也立刻被注意, 不攒死;
11
+ * - 攒批靠轮询周期天然聚合: intervalMin 内来的申请下次轮询一起报, 大量时不一条条吵;
12
+ * - 唤醒 = 伪造【审批轮询】入站消息走 handleInbound(与 scheduler 同款姿势):
13
+ * AI 看到待审批列表, 按主人指令通过/拒绝 —— 不自动批, 听主人的。
14
+ *
15
+ * ⚠️ 本地手改功能: 同步纪律同 middleware-setup(改完保持 src 与部署 dist 一致)。
16
+ */
17
+ import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ import { handleInbound } from '../transport/inbound.js';
20
+ import { pushPendingJoinRequest } from './group-join-request.js';
21
+ import { notifyGroupHub, wakeHubAgent } from './group-hub.js';
22
+ import { groupRegistryPath } from '../api/group-admin.js';
23
+ import { verifyHuman } from '../api/group-admin.js';
24
+ import { dataRootOf } from '../gateway/data-root.js';
25
+ /** 轮询 tick: 30s 精度足够(分钟级间隔) */
26
+ const TICK_MS = 30_000;
27
+ function statePath(config) {
28
+ return join(dataRootOf(config), '.qqbot', 'join-poll-state.json');
29
+ }
30
+ function loadState(config) {
31
+ try {
32
+ const p = statePath(config);
33
+ if (!existsSync(p))
34
+ return { seen: {}, lastWakeAt: {} };
35
+ const raw = JSON.parse(readFileSync(p, 'utf8'));
36
+ return {
37
+ seen: raw?.seen ?? {},
38
+ lastWakeAt: raw?.lastWakeAt ?? {},
39
+ };
40
+ }
41
+ catch {
42
+ return { seen: {}, lastWakeAt: {} };
43
+ }
44
+ }
45
+ function saveState(config, s) {
46
+ try {
47
+ const p = statePath(config);
48
+ mkdirSync(join(p, '..'), { recursive: true });
49
+ // 只保留最近 30 个群, 每群最近 200 个 seen id(防文件膨胀)
50
+ const gids = Object.keys(s.seen).slice(0, 30);
51
+ const seen = {};
52
+ for (const g of gids) {
53
+ const arr = s.seen[g];
54
+ if (arr)
55
+ seen[g] = arr.slice(0, 200);
56
+ }
57
+ writeFileSync(p, JSON.stringify({ seen, lastWakeAt: s.lastWakeAt }, null, 1), 'utf8');
58
+ }
59
+ catch { /* 落盘失败不阻断 */ }
60
+ }
61
+ /**
62
+ * 启动入群申请轮询。config 为 live 引用(设置热更新即时生效); 返回 stop()。
63
+ * 依赖: manager.groupAdmin(GroupAdminClient) + manager(会话寻址/hub)。
64
+ */
65
+ export function startJoinRequestPolling(manager, config, logger) {
66
+ const state = loadState(config);
67
+ function persist() {
68
+ saveState(config, state);
69
+ }
70
+ /** 读群注册表 → 待轮询的群 gid 列表 */
71
+ function registryGids() {
72
+ try {
73
+ const raw = readFileSync(groupRegistryPath(config.cwd), 'utf8');
74
+ const obj = JSON.parse(raw);
75
+ return obj ? Object.keys(obj) : [];
76
+ }
77
+ catch {
78
+ return [];
79
+ }
80
+ }
81
+ /** 从 join-pending.json 读已见过 id(与事件链路共享同一份, 互不重复报) */
82
+ function pendingSeenIds(gid) {
83
+ const ids = new Set();
84
+ try {
85
+ const p = join(dataRootOf(config), '.qqbot', 'join-pending.json');
86
+ if (existsSync(p)) {
87
+ const raw = JSON.parse(readFileSync(p, 'utf8'));
88
+ for (const it of raw[gid] ?? [])
89
+ if (it?.join_request_id)
90
+ ids.add(it.join_request_id);
91
+ }
92
+ }
93
+ catch { /* 读失败不阻断 */ }
94
+ return ids;
95
+ }
96
+ /** 一次轮询: 拉各群审批列表, 发现新增 → 汇总唤醒 */
97
+ async function pollOnce() {
98
+ const ga = config.groupAdmin;
99
+ if (!ga?.enabled || !ga.pollJoinRequests?.enabled)
100
+ return;
101
+ const poll = ga.pollJoinRequests; // 非空: 上方已判 enabled
102
+ const client = manager.groupAdmin;
103
+ if (!client) {
104
+ logger.warn?.('[join-poll] 群管理 client 未就绪, 跳过本轮');
105
+ return;
106
+ }
107
+ const gids = registryGids();
108
+ if (gids.length === 0)
109
+ return;
110
+ const now = Date.now();
111
+ const newlyFound = [];
112
+ for (const gid of gids) {
113
+ try {
114
+ const r = await client.listJoinRequests(gid);
115
+ if (!r.ok) {
116
+ // 常见: 机器人不是该群管理员(11703/403)或群已注销(11255) → 静默跳过, 不刷日志
117
+ continue;
118
+ }
119
+ const list = r.data?.list ?? [];
120
+ if (list.length === 0)
121
+ continue;
122
+ // 已见过的 = pending 里共享的 + 本群 state 里见过的
123
+ const known = new Set([...pendingSeenIds(gid), ...(state.seen[gid] ?? [])]);
124
+ const fresh = list.filter((it) => it?.join_request_id && !known.has(it.join_request_id));
125
+ // 更新 state.seen(见过即记, 无论是否唤醒)
126
+ if (fresh.length > 0) {
127
+ state.seen[gid] = [...(state.seen[gid] ?? []), ...fresh.map((f) => f.join_request_id)].slice(0, 200);
128
+ persist();
129
+ }
130
+ if (fresh.length === 0)
131
+ continue;
132
+ // 攒批防打扰: 同一群两次唤醒之间至少隔 intervalMin 分钟(新申请攒着下轮再报)
133
+ const minGap = (poll.intervalMin ?? 5) * 60_000;
134
+ const lastWake = state.lastWakeAt[gid] ?? 0;
135
+ if (now - lastWake < minGap) {
136
+ logger.info(`[join-poll] ${gid.slice(0, 8)}… 新增${fresh.length}条, 冷却中(距上次唤醒 ${Math.round((now - lastWake) / 1000)}s)暂缓`);
137
+ continue;
138
+ }
139
+ // 组装待办条目(与事件链路同形, 落盘共享)
140
+ const items = fresh.map((it) => ({
141
+ group_openid: gid,
142
+ join_request_id: it.join_request_id,
143
+ member_openid: it.member_openid,
144
+ username: it.username,
145
+ apply_at: it.apply_at,
146
+ apply_source: it.apply_source,
147
+ invited_by: it.invited_by,
148
+ risk_tips: it.risk_tips,
149
+ verify_message: verifyHuman(it.verify_info),
150
+ seen_at: new Date().toISOString(),
151
+ notified: false,
152
+ }));
153
+ // 先落盘(即使本轮不唤醒, 下轮也认作"已见过", 不重复)
154
+ for (const it of items)
155
+ pushPendingJoinRequest(config.cwd, it);
156
+ newlyFound.push({ gid, items });
157
+ }
158
+ catch (err) {
159
+ logger.warn?.(`[join-poll] ${gid.slice(0, 8)}… 拉取失败: ${err instanceof Error ? err.message : String(err)}`);
160
+ }
161
+ }
162
+ if (newlyFound.length === 0)
163
+ return;
164
+ // ── 汇总要唤醒的群: 满足 minCount 的才唤醒(默认 1 = 任何新增都唤醒) ──
165
+ const minCount = poll.minCount ?? 1;
166
+ const wakeTargets = newlyFound.filter((n) => n.items.length >= minCount);
167
+ if (wakeTargets.length === 0) {
168
+ logger.info(`[join-poll] 新增不足 minCount=${minCount}, 仅落盘不唤醒`);
169
+ return;
170
+ }
171
+ const total = wakeTargets.reduce((acc, n) => acc + n.items.length, 0);
172
+ const lines = [`【审批轮询】发现 ${total} 个新的入群申请:`];
173
+ for (const { gid, items } of wakeTargets) {
174
+ for (const it of items) {
175
+ const src = it.apply_source === 'invited' ? '被邀请' : '主动申请';
176
+ lines.push(`· ${it.username ?? '(未知昵称)'}(${src})${it.verify_message ? ` 验证「${it.verify_message}」` : ''}${it.risk_tips ? ` ⚠️${it.risk_tips}` : ''}`);
177
+ }
178
+ lines.push(`(群 …${gid.slice(-6)}; 回复我处理, 如: 通过 ${items[0]?.username ?? '该申请人'})`);
179
+ state.lastWakeAt[gid] = now;
180
+ }
181
+ persist();
182
+ const summary = lines.join('\n');
183
+ // ── 注入策略(主人 2026-09-10 定稿): 三开关独立, 唤醒与 hub 注入互斥, 都带完整明细 ──
184
+ // hubNotify → 注入 hub 会话(web 可见, 不唤醒)
185
+ // wakeLlm → followup 唤醒 hub agent(AI 起来处理) —— 与 hubNotify 互斥(避免双条)
186
+ // notifyGroup → 是否同时伪造消息进普通群会话(默认关=只走群组管理器, 普通群不打扰)
187
+ const first = wakeTargets[0];
188
+ if (first) {
189
+ if (poll.wakeLlm !== false) {
190
+ // 唤醒群组管理器会话的 AI(带完整明细): 主人 web 这边 AI 起来查列表/处理
191
+ // summary 首行已含「【审批轮询】发现 N 个…」标题, 这里不再重复拼
192
+ const wakeText = `${summary}\n\n可回复我处理(如: 查看入群申请 / 通过 某人 / 拒绝 某人)`;
193
+ const w = await wakeHubAgent(manager, config, logger, wakeText);
194
+ logger.info(`[join-poll] 唤醒 hub agent: ${w}`);
195
+ }
196
+ else {
197
+ // 不唤醒 → hub 注入带完整明细(web 可见不 wake, 信息不丢)
198
+ if (poll.hubNotify !== false) {
199
+ const hubR = await notifyGroupHub(manager, config, logger, {
200
+ kind: 'join_request',
201
+ gid: first.gid,
202
+ memberOpenid: first.items[0]?.member_openid,
203
+ name: first.items[0]?.username,
204
+ extra: summary,
205
+ });
206
+ logger.info(`[join-poll] hub 注入(带明细): ${hubR}`);
207
+ }
208
+ else {
209
+ logger.info(`[join-poll] wakeLlm=false 且 hubNotify=false, 仅落盘`);
210
+ }
211
+ }
212
+ // 通知普通群(独立开关, 默认 false): 在普通群会话也伪造一条(带明细)
213
+ if (poll.notifyGroup !== false) {
214
+ const now2 = new Date();
215
+ const pad = (n) => String(n).padStart(2, '0');
216
+ const ts = `${now2.getFullYear()}-${pad(now2.getMonth() + 1)}-${pad(now2.getDate())} ${pad(now2.getHours())}:${pad(now2.getMinutes())}`;
217
+ const fakeMsg = {
218
+ kind: 'group',
219
+ senderId: 'master',
220
+ senderName: '审批轮询',
221
+ content: `[审批轮询 ${ts}] ${summary}\n\n可回复我处理(如: 查看入群申请 / 通过 某人 / 拒绝 某人)`,
222
+ messageId: '',
223
+ timestamp: now2.toISOString(),
224
+ groupOpenid: first.gid,
225
+ msgType: 0,
226
+ attachments: undefined,
227
+ };
228
+ try {
229
+ await handleInbound(fakeMsg, manager, config, logger, undefined);
230
+ logger.info(`[join-poll] 普通群已提醒(notifyGroup)`);
231
+ }
232
+ catch (err) {
233
+ logger.warn?.(`[join-poll] 普通群提醒失败: ${err instanceof Error ? err.message : String(err)}`);
234
+ }
235
+ }
236
+ }
237
+ }
238
+ const timer = setInterval(() => { void pollOnce(); }, TICK_MS);
239
+ timer.unref?.();
240
+ void pollOnce();
241
+ const poll = config.groupAdmin?.pollJoinRequests;
242
+ logger.info(`[join-poll] started (enabled=${poll?.enabled} interval=${poll?.intervalMin}min minCount=${poll?.minCount} wakeLlm=${poll?.wakeLlm} notifyGroup=${poll?.notifyGroup})`);
243
+ return () => {
244
+ clearInterval(timer);
245
+ persist();
246
+ logger.info('[join-poll] stopped');
247
+ };
248
+ }
249
+ //# sourceMappingURL=poll-join-requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll-join-requests.js","sourceRoot":"","sources":["../../src/features/poll-join-requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 预设切换卡片(2026-09-10): /preset 无参时发一张带按钮的卡片,
3
+ * 每个可选人格一个按钮, 点击即热切换(宿主 agentPresets.recompose)。
4
+ *
5
+ * 交互设计仿 botplay 目录卡翻页(参考 features/botplay.ts catalogKeyboard):
6
+ * - 每行 2 个按钮, 最多 4 行 = 8 个/页, 第 5 行留翻页导航(◀上一页/下一页▶);
7
+ * - 按钮 data = `ps:<page>:<idx>`(page=页码, idx=该页内序号);
8
+ * - interaction 回调(INTERACTION_CREATE type=11)解析后直接调 manager.switchPreset。
9
+ */
10
+ import type { QQBotSender } from '../transport/outbound-buffer.js';
11
+ import type { SessionManager } from '../session/session-manager.js';
12
+ type PresetCardImpl = (target: Parameters<QQBotSender['sendMarkdownWithKeyboard']>[0], scope: 'group' | 'c2c', peerId: string, page?: number) => Promise<string>;
13
+ /** bootstrap 接线: 注入真实实现 */
14
+ export declare function setPresetCardImpl(impl: PresetCardImpl): void;
15
+ /** 命令层调用: 发预设选择卡片 */
16
+ export declare function sendPresetCard(target: Parameters<QQBotSender['sendMarkdownWithKeyboard']>[0], scope: 'group' | 'c2c', peerId: string, page?: number): Promise<string>;
17
+ /**
18
+ * 解析 preset 按钮数据: `ps:<page>:<idx>` → {page, idx}; 非本卡片按钮返回 null。
19
+ * prev/next 为翻页导航(同前缀, idx 用字符串区分)。
20
+ */
21
+ export declare function parsePresetButton(data: string | undefined): {
22
+ page: number;
23
+ idx: number;
24
+ } | 'prev' | 'next' | null;
25
+ export declare class PresetSwitcherController {
26
+ private readonly manager;
27
+ private readonly sender;
28
+ private readonly logger;
29
+ constructor(manager: SessionManager, sender: QQBotSender, logger: {
30
+ info?: (m: string) => void;
31
+ warn?: (m: string) => void;
32
+ });
33
+ /** 发预设选择卡片(某页)。返回给人看的摘要文本(命令 handler 用)。 */
34
+ sendCard(target: Parameters<QQBotSender['sendMarkdownWithKeyboard']>[0], scope: 'group' | 'c2c', peerId: string, page?: number): Promise<string>;
35
+ /** interaction 回调: 解析 ps:<page>:<idx|prev|next> → 切换或翻页。@returns true=已消费 */
36
+ handleInteraction(event: unknown, target: Parameters<QQBotSender['sendMarkdownWithKeyboard']>[0], scope: 'group' | 'c2c', peerId: string): Promise<boolean>;
37
+ }
38
+ export {};
39
+ //# sourceMappingURL=preset-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-switcher.d.ts","sourceRoot":"","sources":["../../src/features/preset-switcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAapE,KAAK,cAAc,GAAG,CACpB,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9D,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,KACV,OAAO,CAAC,MAAM,CAAC,CAAC;AAIrB,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAE5D;AAED,qBAAqB;AACrB,wBAAsB,cAAc,CAClC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9D,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,SAAI,GACP,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAWlH;AAiDD,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE;IAGrF,4CAA4C;IACtC,QAAQ,CACZ,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9D,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,SAAI,GACP,OAAO,CAAC,MAAM,CAAC;IAgClB,6EAA6E;IACvE,iBAAiB,CACrB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9D,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;CA+CpB"}
@@ -0,0 +1,172 @@
1
+ /** 按钮回调数据前缀 */
2
+ const BTN_PREFIX = 'ps:';
3
+ /** 每页行数(第5行留给翻页导航, 对齐 QQ 按钮最多5行) */
4
+ const MAX_ROWS = 4;
5
+ /** 每行按钮数 */
6
+ const COLS = 2;
7
+ /** 每页预设数 */
8
+ const PER_PAGE = MAX_ROWS * COLS;
9
+ let presetCardImpl;
10
+ /** bootstrap 接线: 注入真实实现 */
11
+ export function setPresetCardImpl(impl) {
12
+ presetCardImpl = impl;
13
+ }
14
+ /** 命令层调用: 发预设选择卡片 */
15
+ export async function sendPresetCard(target, scope, peerId, page = 0) {
16
+ if (!presetCardImpl)
17
+ return '预设切换卡片未就绪(宿主未接线), 可用 /presets 查看、/preset <id> 切换';
18
+ return presetCardImpl(target, scope, peerId, page);
19
+ }
20
+ /**
21
+ * 解析 preset 按钮数据: `ps:<page>:<idx>` → {page, idx}; 非本卡片按钮返回 null。
22
+ * prev/next 为翻页导航(同前缀, idx 用字符串区分)。
23
+ */
24
+ export function parsePresetButton(data) {
25
+ if (!data || !data.startsWith(BTN_PREFIX))
26
+ return null;
27
+ const rest = data.slice(BTN_PREFIX.length);
28
+ const parts = rest.split(':');
29
+ if (parts.length !== 2)
30
+ return null;
31
+ const [pageStr, key] = parts;
32
+ const page = Number(pageStr);
33
+ if (!Number.isInteger(page) || page < 0)
34
+ return null;
35
+ if (key === 'prev' || key === 'next')
36
+ return key;
37
+ const idx = Number(key);
38
+ return Number.isInteger(idx) && idx >= 0 ? { page, idx } : null;
39
+ }
40
+ /** 从按钮 data 提取页码(翻页导航用; 无效返回 0) */
41
+ function pageOfData(data) {
42
+ if (!data || !data.startsWith(BTN_PREFIX))
43
+ return 0;
44
+ const page = Number(data.slice(BTN_PREFIX.length).split(':')[0]);
45
+ return Number.isInteger(page) && page >= 0 ? page : 0;
46
+ }
47
+ /** 构造预设选择卡片 keyboard(仿 botplay catalogKeyboard: 每行2个 + 翻页行) */
48
+ function presetKeyboard(page, presets, currentId) {
49
+ const pages = Math.max(1, Math.ceil(presets.length / PER_PAGE));
50
+ const safePage = Math.min(page, pages - 1);
51
+ const start = safePage * PER_PAGE;
52
+ const pagePresets = presets.slice(start, start + PER_PAGE);
53
+ const btn = (label, key, style) => ({
54
+ id: `${BTN_PREFIX}${safePage}:${key}`,
55
+ render_data: {
56
+ label: String(label).slice(0, 24),
57
+ visited_label: String(label).slice(0, 24),
58
+ style,
59
+ },
60
+ action: {
61
+ type: 1,
62
+ permission: { type: 2 }, // 群聊谁都可见可点(切人格不是敏感操作)
63
+ data: `${BTN_PREFIX}${safePage}:${key}`,
64
+ unsupport_tips: '请直接回复 /preset <id>',
65
+ },
66
+ });
67
+ const rows = [];
68
+ // 预设按钮: 每行 COLS 个, 最多 MAX_ROWS 行(第5行留给翻页导航 → 合计≤5行)
69
+ for (let i = 0; i < pagePresets.length && rows.length < MAX_ROWS; i += COLS) {
70
+ const rowIdx = i; // 页面内起点序号
71
+ rows.push({
72
+ buttons: pagePresets.slice(i, i + COLS).map((p, j) => btn(p.name || p.id, String(rowIdx + j), p.id === currentId ? 1 : 0)),
73
+ });
74
+ }
75
+ // 翻页行: 上一页 + 下一页(仿 botplay; 页码显示在 markdown 文本里)
76
+ const navBtns = [];
77
+ if (safePage > 0)
78
+ navBtns.push(btn('◀ 上一页', 'prev', 0));
79
+ if (safePage < pages - 1)
80
+ navBtns.push(btn('下一页 ▶', 'next', 0));
81
+ if (navBtns.length > 0)
82
+ rows.push({ buttons: navBtns });
83
+ return { content: { rows } };
84
+ }
85
+ export class PresetSwitcherController {
86
+ manager;
87
+ sender;
88
+ logger;
89
+ constructor(manager, sender, logger) {
90
+ this.manager = manager;
91
+ this.sender = sender;
92
+ this.logger = logger;
93
+ }
94
+ /** 发预设选择卡片(某页)。返回给人看的摘要文本(命令 handler 用)。 */
95
+ async sendCard(target, scope, peerId, page = 0) {
96
+ const list = await this.manager.listPresets();
97
+ const available = list.filter((p) => !p.broken);
98
+ if (available.length === 0)
99
+ return '宿主暂未提供 agent preset(或未挂载 agentPresets 服务)';
100
+ const current = this.manager.getEffectivePreset(scope, peerId);
101
+ const pages = Math.max(1, Math.ceil(available.length / PER_PAGE));
102
+ const safePage = Math.min(Math.max(0, page), pages - 1);
103
+ const start = safePage * PER_PAGE;
104
+ const shown = available.slice(start, start + PER_PAGE);
105
+ const lines = [
106
+ '### 🧬 热切换人格',
107
+ '',
108
+ `**当前:** ${current ?? '宿主默认'}`,
109
+ '',
110
+ ...shown.map((p) => `- ${p.name || p.id}${p.id === current ? ' ⭐' : ''}`),
111
+ '',
112
+ pages > 1 ? `第 ${safePage + 1}/${pages} 页 · 点按钮立即切换(共 ${available.length} 个)` : `点按钮立即切换(共 ${available.length} 个)`,
113
+ '',
114
+ '对话历史保留, 即时生效。',
115
+ ];
116
+ const content = lines.join('\n');
117
+ try {
118
+ await this.sender.sendMarkdownWithKeyboard(target, content, presetKeyboard(safePage, available, current));
119
+ return `✅ 已发出人格切换卡片(第 ${safePage + 1}/${pages} 页)`;
120
+ }
121
+ catch (err) {
122
+ this.logger.warn?.(`[preset-switcher] 卡片发送失败: ${err instanceof Error ? err.message : String(err)}`);
123
+ return `⚠️ 卡片发送失败, 请直接 /preset <id> 切换`;
124
+ }
125
+ }
126
+ /** interaction 回调: 解析 ps:<page>:<idx|prev|next> → 切换或翻页。@returns true=已消费 */
127
+ async handleInteraction(event, target, scope, peerId) {
128
+ const e = event;
129
+ if (e?.data?.type !== 11)
130
+ return false;
131
+ const parsed = parsePresetButton(e.data.resolved?.button_data);
132
+ if (parsed === null)
133
+ return false;
134
+ try {
135
+ const list = await this.manager.listPresets();
136
+ const available = list.filter((p) => !p.broken);
137
+ const pages = Math.max(1, Math.ceil(available.length / PER_PAGE));
138
+ // 翻页导航: 按钮 data 里 page 字段 = 当前页
139
+ if (parsed === 'prev') {
140
+ const cur = pageOfData(e.data.resolved?.button_data);
141
+ await this.sendCard(target, scope, peerId, Math.max(0, cur - 1));
142
+ return true;
143
+ }
144
+ if (parsed === 'next') {
145
+ const cur = pageOfData(e.data.resolved?.button_data);
146
+ await this.sendCard(target, scope, peerId, Math.min(cur + 1, pages - 1));
147
+ return true;
148
+ }
149
+ const pageStart = parsed.page * PER_PAGE;
150
+ const pick = available[pageStart + parsed.idx];
151
+ if (!pick) {
152
+ await this.sender.sendMarkdown(target, '这个预设已不存在, 请重新发 /preset 刷新卡片~');
153
+ return true;
154
+ }
155
+ const r = await this.manager.switchPreset(scope, peerId, pick.id);
156
+ if (r === 'ok') {
157
+ const label = pick.name ? `${pick.name}(${pick.id})` : pick.id;
158
+ await this.sender.sendMarkdown(target, `✅ 已热切换人格为「${label}」,对话历史保留,即时生效!`);
159
+ }
160
+ else {
161
+ await this.sender.sendMarkdown(target, `⚠️ 切换「${pick.id}」失败(${r}), 可试 /new <id> 开新档`);
162
+ }
163
+ return true;
164
+ }
165
+ catch (err) {
166
+ this.logger.warn?.(`[preset-switcher] 回调处理异常: ${err instanceof Error ? err.message : String(err)}`);
167
+ await this.sender.sendMarkdown(target, '⚠️ 切换异常, 请重试或 /preset <id> 手动切换');
168
+ return true;
169
+ }
170
+ }
171
+ }
172
+ //# sourceMappingURL=preset-switcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-switcher.js","sourceRoot":"","sources":["../../src/features/preset-switcher.ts"],"names":[],"mappings":"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"}
@@ -48,4 +48,10 @@ export declare function isBotOnline(ns: string): boolean;
48
48
  /** 是否已注册某 ns(诊断用) */
49
49
  export declare function hasManager(ns: string): boolean;
50
50
  export declare function listManagerNs(): string[];
51
+ /** 全部已注册 manager(通用插件: 跨实例枚举/寻址用, 同一 ESM 实例无 realm 隔离) */
52
+ export declare function managersOf(): SessionManager[];
53
+ /** 按 scope+peer 找目标实例的 manager(先活跃表; 再按群注册表/c2c台账归属匹配; 最后回退任意一个已注册) */
54
+ export declare function findManagerByPeer(scope: ChatScope, peerId: string): SessionManager | undefined;
55
+ /** 按 sessionId 找目标实例的 manager(活跃表精确命中) */
56
+ export declare function findManagerBySessionId(sessionId: string): SessionManager | undefined;
51
57
  //# sourceMappingURL=session-registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/features/session-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAGtF;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAwBD;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAepH;AAED,kFAAkF;AAClF,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,SAAW,GAClB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAe7H;AAID,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAG1D;AACD,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,qBAAqB;AACrB,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
1
+ {"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/features/session-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAiB7C,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAGtF;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAwBD;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAepH;AAED,kFAAkF;AAClF,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,SAAW,GAClB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAe7H;AAID,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAG1D;AACD,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,qBAAqB;AACrB,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,IAAI,cAAc,EAAE,CAE7C;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAuC9F;AAED,0CAA0C;AAC1C,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAOpF"}