@zaofan/dsh-qqbot 1.0.0 → 1.1.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 (80) hide show
  1. package/README.md +18 -6
  2. package/client/qqbot-settings.js +3501 -3214
  3. package/dist/api/group-admin.d.ts +15 -0
  4. package/dist/api/group-admin.d.ts.map +1 -1
  5. package/dist/api/group-admin.js +25 -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 +294 -41
  9. package/dist/channel-tools.js.map +1 -1
  10. package/dist/commands/outmode.d.ts +7 -3
  11. package/dist/commands/outmode.d.ts.map +1 -1
  12. package/dist/commands/outmode.js +19 -9
  13. package/dist/commands/outmode.js.map +1 -1
  14. package/dist/config.d.ts +37 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +30 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/features/botplay.d.ts.map +1 -1
  19. package/dist/features/botplay.js +13 -2
  20. package/dist/features/botplay.js.map +1 -1
  21. package/dist/features/group-hub.d.ts +52 -0
  22. package/dist/features/group-hub.d.ts.map +1 -0
  23. package/dist/features/group-hub.js +258 -0
  24. package/dist/features/group-hub.js.map +1 -0
  25. package/dist/features/group-join-request.d.ts.map +1 -1
  26. package/dist/features/group-join-request.js +37 -34
  27. package/dist/features/group-join-request.js.map +1 -1
  28. package/dist/features/poll-join-requests.d.ts +9 -0
  29. package/dist/features/poll-join-requests.d.ts.map +1 -0
  30. package/dist/features/poll-join-requests.js +249 -0
  31. package/dist/features/poll-join-requests.js.map +1 -0
  32. package/dist/features/scheduler.d.ts.map +1 -1
  33. package/dist/features/scheduler.js +2 -1
  34. package/dist/features/scheduler.js.map +1 -1
  35. package/dist/features/session-registry.d.ts +6 -0
  36. package/dist/features/session-registry.d.ts.map +1 -1
  37. package/dist/features/session-registry.js +51 -0
  38. package/dist/features/session-registry.js.map +1 -1
  39. package/dist/gateway/bootstrap.d.ts.map +1 -1
  40. package/dist/gateway/bootstrap.js +54 -10
  41. package/dist/gateway/bootstrap.js.map +1 -1
  42. package/dist/gateway/data-root.d.ts +15 -0
  43. package/dist/gateway/data-root.d.ts.map +1 -0
  44. package/dist/gateway/data-root.js +59 -0
  45. package/dist/gateway/data-root.js.map +1 -0
  46. package/dist/gateway/debounce.d.ts.map +1 -1
  47. package/dist/gateway/debounce.js +3 -2
  48. package/dist/gateway/debounce.js.map +1 -1
  49. package/dist/gateway/middleware-setup.d.ts.map +1 -1
  50. package/dist/gateway/middleware-setup.js +35 -15
  51. package/dist/gateway/middleware-setup.js.map +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +4 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/middleware/attachment.d.ts.map +1 -1
  56. package/dist/middleware/attachment.js +2 -1
  57. package/dist/middleware/attachment.js.map +1 -1
  58. package/dist/middleware/media-history.d.ts +2 -0
  59. package/dist/middleware/media-history.d.ts.map +1 -1
  60. package/dist/middleware/media-history.js +6 -1
  61. package/dist/middleware/media-history.js.map +1 -1
  62. package/dist/middleware/sticker-capture.d.ts.map +1 -1
  63. package/dist/middleware/sticker-capture.js +2 -2
  64. package/dist/middleware/sticker-capture.js.map +1 -1
  65. package/dist/model/settings-reader.d.ts +7 -0
  66. package/dist/model/settings-reader.d.ts.map +1 -1
  67. package/dist/model/settings-reader.js +14 -0
  68. package/dist/model/settings-reader.js.map +1 -1
  69. package/dist/session/session-manager.d.ts +20 -2
  70. package/dist/session/session-manager.d.ts.map +1 -1
  71. package/dist/session/session-manager.js +73 -5
  72. package/dist/session/session-manager.js.map +1 -1
  73. package/dist/transport/attachment.d.ts.map +1 -1
  74. package/dist/transport/attachment.js +2 -1
  75. package/dist/transport/attachment.js.map +1 -1
  76. package/dist/transport/inbound.d.ts.map +1 -1
  77. package/dist/transport/inbound.js +9 -1
  78. package/dist/transport/inbound.js.map +1 -1
  79. package/package.json +1 -1
  80. package/settings-host.js +182 -53
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/features/scheduler.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAqB1D;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,CA8GZ"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/features/scheduler.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,cAAc,CAAC;AAExE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAqB1D;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,CA8GZ"}
@@ -21,6 +21,7 @@
21
21
  */
22
22
  import { readFileSync, writeFileSync } from 'node:fs';
23
23
  import { join } from 'node:path';
24
+ import { dataRootOf } from '../gateway/data-root.js';
24
25
  import { handleInbound } from '../transport/inbound.js';
25
26
  /** 轮询间隔: 30s(分钟级精度足够, 不会跳整分钟) */
26
27
  const TICK_MS = 30_000;
@@ -38,7 +39,7 @@ function todayKey(d = new Date()) {
38
39
  * config 为 live 对象引用(schedule.targets 现读, Web 设置热更新即时生效)。
39
40
  */
40
41
  export function startScheduler(manager, config, logger) {
41
- const stateFile = join(config.cwd || process.cwd(), 'schedule-state.json');
42
+ const stateFile = join(dataRootOf(config), 'schedule-state.json');
42
43
  const state = { lastRun: {} };
43
44
  try {
44
45
  const raw = readFileSync(stateFile, 'utf8');
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/features/scheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/features/scheduler.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(先活跃表; 再按群注册表归属匹配; 最后回退任意一个已注册) */
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;AAgB7C,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,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAkB9F;AAED,0CAA0C;AAC1C,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAOpF"}
@@ -1,4 +1,16 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
1
3
  const managers = new Map();
4
+ /** 读某实例的群注册表 groups.json(cwd/.qqbot/groups.json); 失败返回 undefined */
5
+ function readJSONRegistry(cwd) {
6
+ try {
7
+ const raw = readFileSync(join(cwd || process.cwd(), '.qqbot', 'groups.json'), 'utf8');
8
+ return JSON.parse(raw);
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
2
14
  export function registerSessionManager(ns, m) {
3
15
  if (m)
4
16
  managers.set(ns, m);
@@ -92,4 +104,43 @@ export function hasManager(ns) {
92
104
  export function listManagerNs() {
93
105
  return [...managers.keys()];
94
106
  }
107
+ /** 全部已注册 manager(通用插件: 跨实例枚举/寻址用, 同一 ESM 实例无 realm 隔离) */
108
+ export function managersOf() {
109
+ return [...managers.values()];
110
+ }
111
+ /** 按 scope+peer 找目标实例的 manager(先活跃表; 再按群注册表归属匹配; 最后回退任意一个已注册) */
112
+ export function findManagerByPeer(scope, peerId) {
113
+ // ① 活跃会话表精确命中
114
+ for (const m of managers.values()) {
115
+ try {
116
+ if (m.findByPeer(scope, peerId))
117
+ return m;
118
+ }
119
+ catch { /* 单实例异常跳过 */ }
120
+ }
121
+ // ② 群注册表归属匹配(会话未创建时: 该群在哪个实例的 groups.json 里就是哪个实例)
122
+ if (scope === 'group' && peerId) {
123
+ for (const m of managers.values()) {
124
+ try {
125
+ const reg = readJSONRegistry(m.cwd);
126
+ if (reg && Object.prototype.hasOwnProperty.call(reg, peerId))
127
+ return m;
128
+ }
129
+ catch { /* 单实例异常跳过 */ }
130
+ }
131
+ }
132
+ // ③ 回退第一个已注册
133
+ return managers.values().next().value;
134
+ }
135
+ /** 按 sessionId 找目标实例的 manager(活跃表精确命中) */
136
+ export function findManagerBySessionId(sessionId) {
137
+ for (const m of managers.values()) {
138
+ try {
139
+ if (m.findBySessionId(sessionId) || m.findHostAgent(sessionId))
140
+ return m;
141
+ }
142
+ catch { /* 单实例异常跳过 */ }
143
+ }
144
+ return undefined;
145
+ }
95
146
  //# sourceMappingURL=session-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/features/session-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/features/session-registry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/gateway/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAK5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AA6B1C,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA4df"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/gateway/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAK5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiC1C,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAqgBf"}
@@ -5,17 +5,21 @@ import { SessionManager } from '../session/index.js';
5
5
  import { handleInbound, createOutboundHandler } from '../transport/index.js';
6
6
  import { buildUserAgent } from '../shared/index.js';
7
7
  import { setupMiddlewares } from './middleware-setup.js';
8
+ import { dataRootOf, migrateLegacyData, stickerDirOf } from './data-root.js';
8
9
  import { configureStickerStore } from '../features/sticker-store.js';
9
10
  import { initStickerGate, bindStickerGates, flushStickerGate, getStickerGate, StickerGateDenied } from '../features/sticker-gate.js';
10
11
  import { startScheduler } from '../features/scheduler.js';
12
+ import { startJoinRequestPolling } from '../features/poll-join-requests.js';
11
13
  import { configureScheduleStore, getScheduleStore } from '../features/schedule-store.js';
12
14
  import { setChannelBridge } from '../channel-tools.js';
13
15
  import { QqApprovalController, setApprovalDispatch, makeApprovalListener, registerApprovalController } from '../features/qq-approval.js';
14
16
  import { QqUserQuestionsController, registerQuestionController } from '../features/qq-user-questions.js';
15
17
  import { handleGroupJoinRequestEvent } from '../features/group-join-request.js';
18
+ import { handleGroupMemberAddEvent, handleGroupAddRobotEvent } from '../features/group-hub.js';
16
19
  import { registerSessionManager, setBotOnline } from '../features/session-registry.js';
17
20
  import { BotplayController, registerBotplayController, setBotplayTriggerImpl, setBotplayCatalogImpl } from '../features/botplay.js';
18
21
  import { buildCommandList } from '../commands/index.js';
22
+ import { SettingsReader } from '../model/settings-reader.js';
19
23
  /** 从 interaction 事件推出"回复目标"(回执发到按钮所在群/私聊)。scope 由事件 chat_type/scene 推断 */
20
24
  function replyTargetOfInteraction(event, _ctx, _manager) {
21
25
  const e = event;
@@ -28,15 +32,18 @@ function replyTargetOfInteraction(event, _ctx, _manager) {
28
32
  }
29
33
  export async function bootstrapGateway(ctx, agents, config, logger) {
30
34
  const manager = new SessionManager(ctx, agents, config, logger);
35
+ // ── dataRoot 启动迁移: 若配置了 dataRoot(如 cwd/dshqqbot), 先把 cwd 下的旧数据目录
36
+ // 搬进去(幂等, 不覆盖); 必须在任何数据目录初始化/写入之前执行。──
37
+ migrateLegacyData(config, logger);
31
38
  // QQ 远程审批控制器(enableApprovals 时创建; 定义在 sender 就绪后, 此处先声明供入站回调引用)
32
39
  let approvalController;
33
40
  let questionController;
34
41
  // botplay 互动事件控制器(事件配置 live 现读 config.botplayEvents; 定义在 sender 就绪后)
35
42
  let botplayController;
36
43
  // ── 表情包图库单例预初始化(防目录分裂) ──
37
- // ⚠️ 单例时序坑:谁先 getStickerStore 谁定路径。必须在启动早期按 config.cwd
44
+ // ⚠️ 单例时序坑:谁先 getStickerStore 谁定路径。必须在启动早期按数据根
38
45
  // 初始化,否则 list_stickers(无参)会以 process.cwd 建错目录(线上踩坑:C盘幽灵库)。
39
- const stickerDataDir = config.sticker.dataDir || join(config.cwd || process.cwd(), '表情包');
46
+ const stickerDataDir = stickerDirOf(config);
40
47
  const stickerStore = configureStickerStore(stickerDataDir, logger);
41
48
  // 启动维护: 清理损坏/空文件 + 物理清除超30天回收站条目
42
49
  try {
@@ -54,10 +61,26 @@ export async function bootstrapGateway(ctx, agents, config, logger) {
54
61
  const stickerGate = getStickerGate(stickerDataDir, logger);
55
62
  // ── 会话自设定时任务单例预初始化(schedule_timer 工具用) ──
56
63
  // 落盘 {cwd}/.qqbot/timers.json; 与图库同策略: 启动早期按 config.cwd 定路径防分裂。
57
- const scheduleDataDir = join(config.cwd || process.cwd(), '.qqbot');
64
+ const scheduleDataDir = join(dataRootOf(config), '.qqbot');
58
65
  configureScheduleStore(scheduleDataDir, logger);
59
66
  // ── 初始化 QQ Bot SDK ──
60
67
  const userAgent = buildUserAgent();
68
+ // 启动期合并 settings.yaml 的 groupAdmin(Web 可视化设置那份):
69
+ // QQBot 构造时 intents 一次性读取 config.groupAdmin; 而 settings 服务注入是异步的,
70
+ // 晚于 gateway 构造 → 仅靠 settings 同步拿不到值, 曾导致 watchJoinRequests 改完不生效
71
+ // (2026-09-09 复盘: 只能改 cordis.patch.yml 绕坑)。这里启动时直接读文件, 让
72
+ // Web 设置(存 settings.yaml)重启即生效, 无需手改 yml —— 通用且时序安全。
73
+ try {
74
+ const reader = new SettingsReader();
75
+ const ga = reader.readGroupAdmin(config.settingsNs?.trim() || 'im-qqbot');
76
+ if (ga) {
77
+ config.groupAdmin = { ...(config.groupAdmin ?? {}), ...ga };
78
+ logger.info(`[im-qqbot] 启动合并 settings.yaml groupAdmin: ${JSON.stringify(config.groupAdmin)}`);
79
+ }
80
+ }
81
+ catch (err) {
82
+ logger.warn?.(`[im-qqbot] settings.yaml groupAdmin 合并跳过: ${err instanceof Error ? err.message : String(err)}`);
83
+ }
61
84
  // 入群申请事件(GROUP_JOIN_REQUEST)订阅: intent GROUP_MEMBER_EVENT = 1<<24, SDK 默认 FULL_INTENTS 不含它。
62
85
  // ⚠️ 只在"群管理开启 + watchJoinRequests"时扩展 intents(Identify 携带未授权 intent 可能被拒连 4914/4915);
63
86
  // 该值在 gateway 连接建立时确定 → 修改 config 后需重启才生效(非 live)。
@@ -272,16 +295,32 @@ export async function bootstrapGateway(ctx, agents, config, logger) {
272
295
  manager.installChannelSender(sender);
273
296
  // 全局桥: 通道工具 execute 的兜底解析(不依赖 setup/provide, 防重启后 setup 未跑)
274
297
  setChannelBridge({ manager, sender });
275
- // ── 入群申请事件(P2.5): 实时 GROUP_JOIN_REQUEST → 提醒 + pending 待办 ──
276
- // SDK 未知事件走 rawEvent 透传; 需 watchJoinRequests(构造时已扩 intents)才收得到。
298
+ // ── 群事件(M2 群组管理器 + P2.5): rawEvent 分发 ──
299
+ // · GROUP_JOIN_REQUEST / GROUP_MEMBER_ADD: intent GROUP_MEMBER_EVENT(1<<24), 需 watchJoinRequests 已扩 intents;
300
+ // · GROUP_ADD_ROBOT: intent GROUP_AND_C2C_EVENT(1<<25, SDK FULL_INTENTS 基础订阅即收)。
277
301
  // 同一 bot 仅一个群管理实例; 事件带 group_openid, 天然按群路由。
278
302
  bot.on('rawEvent', (rawCtx) => {
279
- if (rawCtx.eventType !== 'GROUP_JOIN_REQUEST')
303
+ const et = rawCtx.eventType;
304
+ if (et === 'GROUP_JOIN_REQUEST') {
305
+ logger.info(`[group-join] rawEvent GROUP_JOIN_REQUEST 到达`);
306
+ void handleGroupJoinRequestEvent(rawCtx.data, { sender, config, logger, manager }).catch((err) => {
307
+ logger.error(`[group-join] 事件处理异常: ${err instanceof Error ? err.message : String(err)}`);
308
+ });
280
309
  return;
281
- logger.info(`[group-join] rawEvent GROUP_JOIN_REQUEST 到达`);
282
- void handleGroupJoinRequestEvent(rawCtx.data, { sender, config, logger, manager }).catch((err) => {
283
- logger.error(`[group-join] 事件处理异常: ${err instanceof Error ? err.message : String(err)}`);
284
- });
310
+ }
311
+ if (et === 'GROUP_MEMBER_ADD') {
312
+ logger.info(`[group-hub] rawEvent GROUP_MEMBER_ADD 到达`);
313
+ void handleGroupMemberAddEvent(rawCtx.data, { config, logger, manager }).catch((err) => {
314
+ logger.error(`[group-hub] member_add 处理异常: ${err instanceof Error ? err.message : String(err)}`);
315
+ });
316
+ return;
317
+ }
318
+ if (et === 'GROUP_ADD_ROBOT') {
319
+ logger.info(`[group-hub] rawEvent GROUP_ADD_ROBOT 到达`);
320
+ void handleGroupAddRobotEvent(rawCtx.data, { config, logger, manager }).catch((err) => {
321
+ logger.error(`[group-hub] add_robot 处理异常: ${err instanceof Error ? err.message : String(err)}`);
322
+ });
323
+ }
285
324
  });
286
325
  // ── QQ 远程审批: ACP 模式接入(专家考古实证, 见 qq-approval.ts 头注) ──
287
326
  // ①dispatch: ownership(只处理本 bot 的 agent)+ enableApprovals 闸门;
@@ -420,6 +459,7 @@ export async function bootstrapGateway(ctx, agents, config, logger) {
420
459
  });
421
460
  // ── 生命周期 ──
422
461
  let stopScheduler;
462
+ let stopJoinPoll;
423
463
  // 会话自设定时任务(schedule-store 系, schedule_timer 工具创建)
424
464
  let scheduleTicker;
425
465
  const scheduleInFlight = new Set();
@@ -432,6 +472,9 @@ export async function bootstrapGateway(ctx, agents, config, logger) {
432
472
  });
433
473
  // M3 定时唤醒调度器(与 bot 同生命周期; 任务到点 followup → 回复经出站链路主动推送)
434
474
  stopScheduler = startScheduler(manager, config, logger);
475
+ // 入群申请轮询(2026-09-09 主人定, 事件驱动兜底): 定时拉各群审批列表,
476
+ // 有新增就唤醒 LLM 提醒主人; live config 控制(Web 设置热更, 无需重启)。
477
+ stopJoinPoll = startJoinRequestPolling(manager, config, logger);
435
478
  // 会话自设定时任务 ticker(30s): due → injectToPeer 注入原会话 → 成功 markDone;
436
479
  // 失败(会话不在)连续≥3次自动停用; once 到期滞留 >24h 清理防堆积。
437
480
  const tickSchedule = () => {
@@ -509,6 +552,7 @@ export async function bootstrapGateway(ctx, agents, config, logger) {
509
552
  questionController?.dispose();
510
553
  botplayController?.clear();
511
554
  stopScheduler?.();
555
+ stopJoinPoll?.();
512
556
  if (scheduleTicker) {
513
557
  clearInterval(scheduleTicker);
514
558
  scheduleTicker = undefined;