@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.
- package/README.md +18 -6
- package/client/qqbot-settings.js +3501 -3214
- package/dist/api/group-admin.d.ts +15 -0
- package/dist/api/group-admin.d.ts.map +1 -1
- package/dist/api/group-admin.js +25 -0
- package/dist/api/group-admin.js.map +1 -1
- package/dist/channel-tools.d.ts.map +1 -1
- package/dist/channel-tools.js +294 -41
- package/dist/channel-tools.js.map +1 -1
- package/dist/commands/outmode.d.ts +7 -3
- package/dist/commands/outmode.d.ts.map +1 -1
- package/dist/commands/outmode.js +19 -9
- package/dist/commands/outmode.js.map +1 -1
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -1
- package/dist/features/botplay.d.ts.map +1 -1
- package/dist/features/botplay.js +13 -2
- package/dist/features/botplay.js.map +1 -1
- package/dist/features/group-hub.d.ts +52 -0
- package/dist/features/group-hub.d.ts.map +1 -0
- package/dist/features/group-hub.js +258 -0
- package/dist/features/group-hub.js.map +1 -0
- package/dist/features/group-join-request.d.ts.map +1 -1
- package/dist/features/group-join-request.js +37 -34
- package/dist/features/group-join-request.js.map +1 -1
- package/dist/features/poll-join-requests.d.ts +9 -0
- package/dist/features/poll-join-requests.d.ts.map +1 -0
- package/dist/features/poll-join-requests.js +249 -0
- package/dist/features/poll-join-requests.js.map +1 -0
- package/dist/features/scheduler.d.ts.map +1 -1
- package/dist/features/scheduler.js +2 -1
- package/dist/features/scheduler.js.map +1 -1
- package/dist/features/session-registry.d.ts +6 -0
- package/dist/features/session-registry.d.ts.map +1 -1
- package/dist/features/session-registry.js +51 -0
- package/dist/features/session-registry.js.map +1 -1
- package/dist/gateway/bootstrap.d.ts.map +1 -1
- package/dist/gateway/bootstrap.js +54 -10
- package/dist/gateway/bootstrap.js.map +1 -1
- package/dist/gateway/data-root.d.ts +15 -0
- package/dist/gateway/data-root.d.ts.map +1 -0
- package/dist/gateway/data-root.js +59 -0
- package/dist/gateway/data-root.js.map +1 -0
- package/dist/gateway/debounce.d.ts.map +1 -1
- package/dist/gateway/debounce.js +3 -2
- package/dist/gateway/debounce.js.map +1 -1
- package/dist/gateway/middleware-setup.d.ts.map +1 -1
- package/dist/gateway/middleware-setup.js +35 -15
- package/dist/gateway/middleware-setup.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/attachment.d.ts.map +1 -1
- package/dist/middleware/attachment.js +2 -1
- package/dist/middleware/attachment.js.map +1 -1
- package/dist/middleware/media-history.d.ts +2 -0
- package/dist/middleware/media-history.d.ts.map +1 -1
- package/dist/middleware/media-history.js +6 -1
- package/dist/middleware/media-history.js.map +1 -1
- package/dist/middleware/sticker-capture.d.ts.map +1 -1
- package/dist/middleware/sticker-capture.js +2 -2
- package/dist/middleware/sticker-capture.js.map +1 -1
- package/dist/model/settings-reader.d.ts +7 -0
- package/dist/model/settings-reader.d.ts.map +1 -1
- package/dist/model/settings-reader.js +14 -0
- package/dist/model/settings-reader.js.map +1 -1
- package/dist/session/session-manager.d.ts +20 -2
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +73 -5
- package/dist/session/session-manager.js.map +1 -1
- package/dist/transport/attachment.d.ts.map +1 -1
- package/dist/transport/attachment.js +2 -1
- package/dist/transport/attachment.js.map +1 -1
- package/dist/transport/inbound.d.ts.map +1 -1
- package/dist/transport/inbound.js +9 -1
- package/dist/transport/inbound.js.map +1 -1
- package/package.json +1 -1
- package/settings-host.js +182 -53
|
@@ -27,6 +27,21 @@ export interface JoinRequest {
|
|
|
27
27
|
}>;
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* 入群申请的"验证信息"人话化:
|
|
32
|
+
* - review_qa_list 有内容 → 逐条「问题:xxx / 答案:yyy」;
|
|
33
|
+
* - 否则 verify_message 有值 → 直接显示用户填的答案(如「我是小号」);
|
|
34
|
+
* - 否则 method 有值 → 翻译成中文(admin_review_qa 这类英文枚举不该露给用户);
|
|
35
|
+
* - 都没有 → ''(无验证, 调用方显示 '-' 或不显示)。
|
|
36
|
+
*/
|
|
37
|
+
export declare function verifyHuman(vi?: {
|
|
38
|
+
method?: string;
|
|
39
|
+
verify_message?: string;
|
|
40
|
+
review_qa_list?: Array<{
|
|
41
|
+
question?: string;
|
|
42
|
+
answer?: string;
|
|
43
|
+
}>;
|
|
44
|
+
}): string;
|
|
30
45
|
export interface MuteState {
|
|
31
46
|
global_rule?: {
|
|
32
47
|
mode?: 'none' | 'always' | 'schedule';
|
|
@@ -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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"}
|
package/dist/api/group-admin.js
CHANGED
|
@@ -26,6 +26,31 @@ export const FEATURE_GATES = {
|
|
|
26
26
|
getMuteState: { open: true, human: '群禁言状态查询: 机器人需为群管理员' },
|
|
27
27
|
setMute: { open: true, human: '设置禁言: 机器人需为群管理员' },
|
|
28
28
|
};
|
|
29
|
+
/** 官方 verify_info.method 枚举 → 中文(用户可见)。未知枚举回落原文 */
|
|
30
|
+
const VERIFY_METHOD_HUMAN = {
|
|
31
|
+
admin_review_qa: '问题验证(需管理员审核)',
|
|
32
|
+
admin_review: '管理员审核',
|
|
33
|
+
free_join: '自由进群',
|
|
34
|
+
qa: '问题验证',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* 入群申请的"验证信息"人话化:
|
|
38
|
+
* - review_qa_list 有内容 → 逐条「问题:xxx / 答案:yyy」;
|
|
39
|
+
* - 否则 verify_message 有值 → 直接显示用户填的答案(如「我是小号」);
|
|
40
|
+
* - 否则 method 有值 → 翻译成中文(admin_review_qa 这类英文枚举不该露给用户);
|
|
41
|
+
* - 都没有 → ''(无验证, 调用方显示 '-' 或不显示)。
|
|
42
|
+
*/
|
|
43
|
+
export function verifyHuman(vi) {
|
|
44
|
+
const qa = vi?.review_qa_list?.filter((x) => x && (x.question || x.answer));
|
|
45
|
+
if (qa && qa.length) {
|
|
46
|
+
return qa.map((x) => `${x.question ?? '问题'}「${x.answer ?? '(未填)'}」`).join(';');
|
|
47
|
+
}
|
|
48
|
+
if (vi?.verify_message)
|
|
49
|
+
return vi.verify_message;
|
|
50
|
+
if (vi?.method)
|
|
51
|
+
return VERIFY_METHOD_HUMAN[vi.method] ?? `验证方式:${vi.method}`;
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
29
54
|
/** 官方错误码 → 人话(可扩充; code 映射不到时回落通用文案) */
|
|
30
55
|
export function mapErrHuman(code, gateHuman) {
|
|
31
56
|
const c = String(code);
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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,wCAAwC;AACxC,MAAM,UAAU,WAAW,CAAC,IAAqB,EAAE,SAAkB;IACnE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,KAAK,GAA2B;QACpC,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;KACxB,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC;AACzE,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,MAAsB,EAAE,IAAY,EAAE,IAAc;QACxE,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,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;CACF;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;
|
|
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;AAmED,mDAAmD;AACnD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA+kCvD"}
|
package/dist/channel-tools.js
CHANGED
|
@@ -8,25 +8,57 @@
|
|
|
8
8
|
* 复制进共享 node_modules,也不得在 dependencies 里自带 dsh-tools(避免双包)。
|
|
9
9
|
*/
|
|
10
10
|
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
11
|
-
import { appendFileSync, existsSync, statSync } from 'node:fs';
|
|
11
|
+
import { appendFileSync, existsSync, readFileSync, statSync } from 'node:fs';
|
|
12
12
|
import { getStickerStore } from './features/sticker-store.js';
|
|
13
13
|
import { autoTagImage } from './features/sticker-tagger.js';
|
|
14
14
|
import { isStickerGateDenied } from './features/sticker-gate.js';
|
|
15
15
|
import { getScheduleStore } from './features/schedule-store.js';
|
|
16
16
|
import { switchOutboundMode } from './features/outbound-mode-switch.js';
|
|
17
17
|
import { loadExtensionTools } from './features/extension-store.js';
|
|
18
|
+
import { verifyHuman, groupRegistryPath } from './api/group-admin.js';
|
|
19
|
+
import { wakeSessionAgent } from './features/group-hub.js';
|
|
20
|
+
import { managersOf, findManagerByPeer, findManagerBySessionId } from './features/session-registry.js';
|
|
18
21
|
/** 诊断日志路径: 默认关闭; 需要排查时设环境变量 QQBOT_DIAG_FILE 指向日志文件 */
|
|
19
22
|
const DIAG_FILE = process.env.QQBOT_DIAG_FILE || '';
|
|
20
23
|
/** 大文件异步发送阈值: 本地文件 >= 5MB 时走后台任务(SDK 分片上传耗时, 避免阻塞 LLM 回合) */
|
|
21
24
|
const FILE_ASYNC_MIN = 5 * 1024 * 1024;
|
|
25
|
+
/** 等回合空闲的最长时间(ms); 与 QQ 入站 debounce 排队/group-hub safeAppend 同款语义 */
|
|
26
|
+
const TURN_WAIT_MS = 60_000;
|
|
22
27
|
let bgSeq = 0;
|
|
23
28
|
function fmtMB(n) { return (n / 1048576).toFixed(1) + 'MB'; }
|
|
24
|
-
/**
|
|
25
|
-
function
|
|
29
|
+
/** 从 exec 取 logger(ctx.logger), 拿不到用 console 兜底(类型兼容 Logger) */
|
|
30
|
+
function loggerLike(exec) {
|
|
26
31
|
try {
|
|
27
|
-
const
|
|
32
|
+
const a = exec.agent;
|
|
33
|
+
if (a?.ctx?.logger)
|
|
34
|
+
return a.ctx.logger;
|
|
35
|
+
}
|
|
36
|
+
catch { /* 忽略 */ }
|
|
37
|
+
const c = console;
|
|
38
|
+
return {
|
|
39
|
+
info: (m, ...args) => c.info(m, ...args),
|
|
40
|
+
warn: (m, ...args) => c.warn(m, ...args),
|
|
41
|
+
error: (m, ...args) => c.error(m, ...args),
|
|
42
|
+
debug: (m, ...args) => c.debug(m, ...args),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 把后台任务结果作为 user/message 写回会话(不唤醒, 与入群申请通知同款; 失败静默)。
|
|
47
|
+
* 🔒 回合安全(主人硬约束 2026-09-09): LLM 回合进行中严禁 session.append(拆散 tool_calls 坏记录),
|
|
48
|
+
* 先 agent.whenIdle() 等回合结束再写(与 QQ 入站 debounce 排队同款); 无 whenIdle/超时放弃。
|
|
49
|
+
*/
|
|
50
|
+
async function notifySession(agent, text) {
|
|
51
|
+
try {
|
|
52
|
+
const a = agent;
|
|
53
|
+
const session = a?.session;
|
|
28
54
|
if (!session || typeof session.append !== 'function')
|
|
29
55
|
return;
|
|
56
|
+
if (typeof a.whenIdle === 'function') {
|
|
57
|
+
try {
|
|
58
|
+
await Promise.race([a.whenIdle(), new Promise((r) => setTimeout(r, TURN_WAIT_MS))]);
|
|
59
|
+
}
|
|
60
|
+
catch { /* whenIdle 超时/异常 → 放弃写回(不坏记录) */ }
|
|
61
|
+
}
|
|
30
62
|
session.append('user/message', {
|
|
31
63
|
id: 'bg-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2, 8),
|
|
32
64
|
role: 'user',
|
|
@@ -191,10 +223,10 @@ export async function apply(ctx) {
|
|
|
191
223
|
const st = statSync(lp);
|
|
192
224
|
const fname = (lp.split(String.fromCharCode(92)).pop() || '').split('/').pop() || 'file';
|
|
193
225
|
const seq = ++bgSeq;
|
|
194
|
-
const
|
|
226
|
+
const agent = rec.agent;
|
|
195
227
|
void ch.sender.sendMedia(rec.replyTarget, args.kind, { localPath: lp })
|
|
196
|
-
.then((r) => {
|
|
197
|
-
notifySession(
|
|
228
|
+
.then(async (r) => {
|
|
229
|
+
await notifySession(agent, '[系统] 后台任务 #' + seq + ' 完成:已发送 ' + fname + '(' + fmtMB(st.size) + ')。');
|
|
198
230
|
if (r && r.id) {
|
|
199
231
|
try {
|
|
200
232
|
const store = getStickerStore(ch.manager.stickerDataDir);
|
|
@@ -206,9 +238,9 @@ export async function apply(ctx) {
|
|
|
206
238
|
}
|
|
207
239
|
diag('bgSend #' + seq + ' ok ' + fname);
|
|
208
240
|
})
|
|
209
|
-
.catch((e) => {
|
|
241
|
+
.catch(async (e) => {
|
|
210
242
|
const msg = e instanceof Error ? e.message : String(e);
|
|
211
|
-
notifySession(
|
|
243
|
+
await notifySession(agent, '[系统] 后台任务 #' + seq + ' 失败:' + msg + '(未发送完成, 可重试或改用小文件)');
|
|
212
244
|
diag('bgSend #' + seq + ' fail ' + fname + ': ' + msg);
|
|
213
245
|
});
|
|
214
246
|
return { ok: true, msg: '📤 大文件 ' + fname + '(' + fmtMB(st.size) + ') 已提交后台任务 #' + seq + '——分片上传耗时较长, 完成/失败后会有系统消息通知' };
|
|
@@ -270,7 +302,7 @@ export async function apply(ctx) {
|
|
|
270
302
|
});
|
|
271
303
|
const listStickersTool = defineTool({
|
|
272
304
|
name: 'list_stickers',
|
|
273
|
-
description: '(
|
|
305
|
+
description: '(QQ聊天加分项,气氛对就大胆用!)查本地表情包库,返回图片本地路径+标签+详细描述。想用图回应的时刻——对方发图(接梗/回图)、爆笑/自嘲/庆祝/被夸/共鸣/话题热闹——**先**调它按情绪关键词搜库(query可空=最近收藏), 从返回里挑最贴切的一张, 用 send_media(kind=image, source=该路径) 发出去(0~1张, 一次最多一张)。每张的"描述"写着画面和适用场合帮你挑准; 只有实在查不到贴切的, 才退而回纯文字。别老憋着——QQ 聊天带张好图比干巴巴文字生动多了。',
|
|
274
306
|
parameters: {
|
|
275
307
|
query: { type: 'string', description: '语义关键词(可空=最近收藏; 会匹配标签和描述)' },
|
|
276
308
|
tag: { type: 'string', description: '标签过滤(可空)' },
|
|
@@ -364,7 +396,7 @@ export async function apply(ctx) {
|
|
|
364
396
|
};
|
|
365
397
|
const tagStickerTool = defineTool({
|
|
366
398
|
name: 'sticker_tag',
|
|
367
|
-
description: '
|
|
399
|
+
description: '(主动维护,别等用户开口!)看到"值得留"的图就调它收藏+打标: 群友发来有梗/好看/以后想用到的图(不管你这轮要不要发), 当场用 sticker_tag(传群消息里那张图的URL 或本地路径)收藏入库并给中文短标签+一句描述——图库越好用, 以后 list_stickers 越搜得到。已在库的图可改标签/描述; 缺标签或缺介绍的图(见 sticker_untagged)也用它补。tags=逗号分隔中文短标签(内容/情绪/用途, 如 爆笑,元气,打招呼); desc=一句"画面+情绪+适合场合"。想省视觉额度可传 vision=false(仅对已在库的图打标)。打标的意义: 你的表情包弹药库靠它养成, 不整理=好图烂在库里永远搜不到。',
|
|
368
400
|
parameters: {
|
|
369
401
|
sticker: { type: 'string', required: true, description: '图片URL 或 本地绝对路径(也可传 list_stickers 返回的路径)' },
|
|
370
402
|
tags: { type: 'string', description: '逗号分隔中文标签,如 开心,元气,打招呼' },
|
|
@@ -524,7 +556,7 @@ export async function apply(ctx) {
|
|
|
524
556
|
});
|
|
525
557
|
const statsStickerTool = defineTool({
|
|
526
558
|
name: 'sticker_stats',
|
|
527
|
-
description: '查看表情包库概况(
|
|
559
|
+
description: '查看表情包库概况(总数/各分区/未打标数/占用)。想了解库存或准备整理时用: 若"未打标"数大于0, 接着用 sticker_untagged 翻出未整理图并 sticker_tag 补标, 保持弹药库好用。',
|
|
528
560
|
parameters: {},
|
|
529
561
|
output: {
|
|
530
562
|
schema: {
|
|
@@ -549,7 +581,7 @@ export async function apply(ctx) {
|
|
|
549
581
|
});
|
|
550
582
|
const untaggedStickerTool = defineTool({
|
|
551
583
|
name: 'sticker_untagged',
|
|
552
|
-
description: '
|
|
584
|
+
description: '(日常整理巡检,AI应主动做)列出表情包库里还没整理完的图(缺标签或缺介绍)。群里没活/或想维护图库时先调它(也可先 sticker_stats 看有没有未打标), 发现有图就逐张用 sticker_tag 补标签和一句描述; 库越干净, list_stickers 搜图越准。参数 a: 1=全部(候选+收藏) 2=只看收藏(正式文件夹)。可选 limit(每批条数, 默认20, 上限100)、offset(跳过前N条, 翻页用)。',
|
|
553
585
|
parameters: {
|
|
554
586
|
a: { type: 'integer', enum: [1, 2], required: true, description: '1=查全部 2=只查收藏文件夹(正式)' },
|
|
555
587
|
limit: { type: 'integer', description: '每批返回条数(1-100, 默认20)' },
|
|
@@ -835,8 +867,10 @@ export async function apply(ctx) {
|
|
|
835
867
|
}
|
|
836
868
|
const listJoinRequestsTool = defineTool({
|
|
837
869
|
name: 'group_join_requests',
|
|
838
|
-
description: '群管理(读):
|
|
839
|
-
parameters: {
|
|
870
|
+
description: '群管理(读): 查看待审批的入群申请列表(申请人/验证消息/来源/风险提示)。默认查当前会话所在群/manageGroup; 也可传 gid 查指定群。仅主人要求时调用。需在设置开启"QQ群管理"且机器人为群管理员。',
|
|
871
|
+
parameters: {
|
|
872
|
+
gid: { type: 'string', description: '目标群 openid(可选)。不填=当前会话群或 manageGroup; 填了则查指定群的待审批列表' },
|
|
873
|
+
},
|
|
840
874
|
output: {
|
|
841
875
|
schema: {
|
|
842
876
|
type: 'object', additionalProperties: false,
|
|
@@ -844,27 +878,30 @@ export async function apply(ctx) {
|
|
|
844
878
|
},
|
|
845
879
|
render: (_a, v) => [{ type: 'text', text: v.ok ? v.msg : `失败: ${v.msg}` }],
|
|
846
880
|
},
|
|
847
|
-
async execute(
|
|
881
|
+
async execute(args, exec) {
|
|
848
882
|
const ga = groupAdminOf(exec);
|
|
849
883
|
if (!ga)
|
|
850
884
|
return { ok: false, msg: '群管理未开启(设置→QQ群管理)或非群会话' };
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
885
|
+
const gid = args.gid || ga.gid;
|
|
886
|
+
if (!gid)
|
|
887
|
+
return { ok: false, msg: '当前不是群会话且未指定 gid, 无法确定目标群' };
|
|
888
|
+
const r = await ga.client.listJoinRequests(gid);
|
|
854
889
|
if (!r.ok)
|
|
855
890
|
return { ok: false, msg: r.err.human };
|
|
856
891
|
const list = r.data.list;
|
|
857
892
|
if (list.length === 0)
|
|
858
893
|
return { ok: true, msg: '当前没有待审批的入群申请 ✓' };
|
|
859
|
-
const lines = list.map((j, i) => `${i + 1}. ${j.username ?? '?'} (${
|
|
860
|
-
return { ok: true, msg: `入群申请 ${list.length}
|
|
894
|
+
const lines = list.map((j, i) => `${i + 1}. ${j.username ?? '?'} (${j.member_openid}) 来源:${j.apply_source ?? '?'} 验证:${verifyHuman(j.verify_info) || '-'}${j.risk_tips ? ` ⚠️${j.risk_tips}` : ''}`);
|
|
895
|
+
return { ok: true, msg: `入群申请 ${list.length} 条${args.gid ? `(群 …${gid.slice(-6)})` : ''}:\n${lines.join('\n')}` };
|
|
861
896
|
},
|
|
862
897
|
});
|
|
863
898
|
const approveJoinTool = defineTool({
|
|
864
899
|
name: 'group_approve_join',
|
|
865
|
-
description: '群管理(写,危险): 审批入群申请。approve=放行 / decline=拒绝(可带理由)。仅主人明确要求时调用; 调用前建议先 group_join_requests 核对申请人。',
|
|
900
|
+
description: '群管理(写,危险): 审批入群申请。approve=放行 / decline=拒绝(可带理由)。支持批量: member_openids 数组一次批多人(优先); 也兼容单数 member_openid。仅主人明确要求时调用; 调用前建议先 group_join_requests 核对申请人。',
|
|
866
901
|
parameters: {
|
|
867
|
-
|
|
902
|
+
gid: { type: 'string', description: '目标群 openid(可选)。不填=当前会话群或 manageGroup; 填了则审批指定群的申请' },
|
|
903
|
+
member_openids: { type: 'array', description: '批量审批: 申请人 member_openid 数组(来自 group_join_requests), 一次批多人' },
|
|
904
|
+
member_openid: { type: 'string', description: '单个申请人 member_openid(批量时可不填)' },
|
|
868
905
|
op: { type: 'string', required: true, enum: ['approve', 'decline'], description: 'approve 放行 / decline 拒绝' },
|
|
869
906
|
reason: { type: 'string', required: true, description: '拒绝理由(decline 时填; approve 或不需要可填 "-")' },
|
|
870
907
|
},
|
|
@@ -879,22 +916,229 @@ export async function apply(ctx) {
|
|
|
879
916
|
const ga = groupAdminOf(exec);
|
|
880
917
|
if (!ga)
|
|
881
918
|
return { ok: false, msg: '群管理未开启或非群会话' };
|
|
882
|
-
|
|
883
|
-
|
|
919
|
+
const gid = args.gid || ga.gid;
|
|
920
|
+
if (!gid)
|
|
921
|
+
return { ok: false, msg: '当前不是群会话且未指定 gid' };
|
|
922
|
+
const targets = Array.isArray(args.member_openids) && args.member_openids.length
|
|
923
|
+
? args.member_openids
|
|
924
|
+
: (args.member_openid ? [args.member_openid] : []);
|
|
925
|
+
if (targets.length === 0)
|
|
926
|
+
return { ok: false, msg: '请提供要审批的 member_openid(可多个)' };
|
|
884
927
|
// join_request_id 官方审批必填(缺省报 40103007): 先拉列表按 member_openid 匹配自动补上
|
|
885
|
-
const listR = await ga.client.listJoinRequests(
|
|
928
|
+
const listR = await ga.client.listJoinRequests(gid);
|
|
886
929
|
if (!listR.ok)
|
|
887
930
|
return { ok: false, msg: listR.err.human };
|
|
888
|
-
const
|
|
889
|
-
const
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
931
|
+
const list = listR.data.list ?? [];
|
|
932
|
+
const results = [];
|
|
933
|
+
let failed = 0;
|
|
934
|
+
for (const midRaw of targets) {
|
|
935
|
+
const mid = String(midRaw);
|
|
936
|
+
const found = list.find((j) => j.member_openid === mid);
|
|
937
|
+
const r = await ga.client.approveJoinRequest(gid, mid, args.op, {
|
|
938
|
+
...(found ? { join_request_id: String(found.join_request_id ?? '') } : {}),
|
|
939
|
+
...(args.op === 'decline' && String(args.reason ?? '') && String(args.reason) !== '-'
|
|
940
|
+
? { reject_reason: String(args.reason) }
|
|
941
|
+
: {}),
|
|
942
|
+
});
|
|
943
|
+
if (r.ok) {
|
|
944
|
+
results.push(`${String(mid).slice(0, 10)}… ${args.op === 'approve' ? '✅放行' : '已拒绝'}${found ? `(${String(found.username ?? '')})` : ''}`);
|
|
945
|
+
}
|
|
946
|
+
else {
|
|
947
|
+
failed++;
|
|
948
|
+
results.push(`${String(mid).slice(0, 10)}… ❌ ${r.err.human}`);
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
if (failed === 0) {
|
|
952
|
+
return { ok: true, msg: `${args.op === 'approve' ? '✅ 已全部放行' : '已全部拒绝'} ${targets.length} 人:\n${results.join('\n')}` };
|
|
953
|
+
}
|
|
954
|
+
return { ok: failed === targets.length ? false : true, msg: `${targets.length - failed}/${targets.length} 成功:\n${results.join('\n')}` };
|
|
955
|
+
},
|
|
956
|
+
});
|
|
957
|
+
const sessionListTool = defineTool({
|
|
958
|
+
name: 'session_list',
|
|
959
|
+
description: '会话(读): 列出本 bot 全部活跃会话(sessionId/范围/peer/最近活跃/预设), 用于跨会话寻址(找 session_wake 的目标 id)。',
|
|
960
|
+
parameters: {},
|
|
961
|
+
output: {
|
|
962
|
+
schema: {
|
|
963
|
+
type: 'object', additionalProperties: false,
|
|
964
|
+
properties: { ok: { type: 'boolean', required: true }, msg: { type: 'string', required: true } },
|
|
965
|
+
},
|
|
966
|
+
render: (_a, v) => [{ type: 'text', text: v.ok ? v.msg : `失败: ${v.msg}` }],
|
|
967
|
+
},
|
|
968
|
+
async execute(_args, exec) {
|
|
969
|
+
const tail = (s, n = 10) => (s && s.length > n ? '…' + s.slice(-n) : (s ?? ''));
|
|
970
|
+
const lines = [];
|
|
971
|
+
// 遍历全部已注册实例(module 级注册表, 重启后仍可枚举; 不依赖 channelBridges)
|
|
972
|
+
const managers = managersOf();
|
|
973
|
+
if (managers.length === 0) {
|
|
974
|
+
const ch = channelOf(exec);
|
|
975
|
+
const manager = ch?.manager;
|
|
976
|
+
if (manager)
|
|
977
|
+
managers.push(manager);
|
|
978
|
+
}
|
|
979
|
+
if (managers.length === 0)
|
|
980
|
+
return { ok: false, msg: '找不到会话管理器实例(无已注册实例)' };
|
|
981
|
+
let n = 0;
|
|
982
|
+
for (const manager of managers) {
|
|
983
|
+
const list = manager.listSessions();
|
|
984
|
+
const ns = manager.settingsNs;
|
|
985
|
+
for (const s of list) {
|
|
986
|
+
n++;
|
|
987
|
+
lines.push(`${n}. [${s.scope}]${ns !== 'im-qqbot' ? `(${ns})` : ''} peer=${tail(s.peerId)} sender=${tail(s.senderId, 8)} id=${s.sessionId}${s.agentPreset ? ` (${s.agentPreset})` : ''} 活跃=${new Date(s.lastActivity).toLocaleTimeString()}`);
|
|
988
|
+
}
|
|
989
|
+
// 潜在会话: 群注册表里的群可能还没 getOrCreate(无活跃记录), 但 sessionId 可确定性算出
|
|
990
|
+
try {
|
|
991
|
+
const raw = readFileSync(groupRegistryPath(manager.cwd), 'utf8');
|
|
992
|
+
const reg = JSON.parse(raw);
|
|
993
|
+
const ids = new Set(list.map((s) => s.sessionId));
|
|
994
|
+
for (const gid of Object.keys(reg ?? {})) {
|
|
995
|
+
const sid = manager.sessionIdFor('group', gid);
|
|
996
|
+
if (!ids.has(sid))
|
|
997
|
+
lines.push(`[潜在群] ${reg[gid]?.name ?? ''}(${tail(gid)}) id=${sid} 活跃=未创建`);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
catch { /* 无注册表/读失败则跳过 */ }
|
|
1001
|
+
}
|
|
1002
|
+
if (lines.length === 0)
|
|
1003
|
+
return { ok: true, msg: '当前无活跃会话, 也无已注册群' };
|
|
1004
|
+
return { ok: true, msg: `会话 ${lines.length} 个:\n${lines.join('\n')}` };
|
|
1005
|
+
},
|
|
1006
|
+
});
|
|
1007
|
+
/** 发到目标 QQ 群/私聊: 若给了 media 先发图(用目标 manager 归属的 sender), 再发带来源文本; 无 sender 则 groupAdmin 文本兜底 */
|
|
1008
|
+
async function sendQQWithMedia(manager, scope, peer, body, media, exec) {
|
|
1009
|
+
const ch = channelBridges.find((b) => b.manager === manager);
|
|
1010
|
+
const sent = [];
|
|
1011
|
+
if (media) {
|
|
1012
|
+
if (ch?.sender) {
|
|
1013
|
+
try {
|
|
1014
|
+
const src = /^https?:\/\//i.test(media) ? { url: media } : { localPath: media };
|
|
1015
|
+
await ch.sender.sendMedia({ scope, targetId: peer }, 'image', src);
|
|
1016
|
+
sent.push('🖼️图');
|
|
1017
|
+
}
|
|
1018
|
+
catch {
|
|
1019
|
+
sent.push('⚠️发图失败');
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
else {
|
|
1023
|
+
sent.push('⚠️无发送通道');
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
const ga = groupAdminOf(exec);
|
|
1027
|
+
if (ga) {
|
|
1028
|
+
const sr = scope === 'group'
|
|
1029
|
+
? await ga.client.sendGroupText(peer, body)
|
|
1030
|
+
: await ga.client.sendC2cText(peer, body);
|
|
1031
|
+
sent.push(sr.ok ? `📨已发到QQ ${scope === 'group' ? '群' : '私聊'}` : `⚠️QQ发送失败: ${sr.err.human}`);
|
|
1032
|
+
}
|
|
1033
|
+
else {
|
|
1034
|
+
sent.push('⚠️群管理未开启');
|
|
1035
|
+
}
|
|
1036
|
+
return `;${sent.join(' ')}`;
|
|
1037
|
+
}
|
|
1038
|
+
const sessionWakeTool = defineTool({
|
|
1039
|
+
name: 'session_wake',
|
|
1040
|
+
description: '跨会话(写,需谨慎): 向指定会话发送一条消息并唤醒该会话的 LLM(给 AI 看); 同时把带来源标注的消息通过 QQBot 通道发到该会话绑定的群/私聊(给人看)。可用 session_list 查目标 id; 也支持按 peerId(群/私聊) 寻址。仅主人明确要求时调用。', parameters: {
|
|
1041
|
+
session_id: { type: 'string', description: '目标会话 id(完整 sessionId, 来自 session_list)' },
|
|
1042
|
+
peer_id: { type: 'string', description: '或按 peer 寻址: 群 openid/私聊 openid(需带 scope)' },
|
|
1043
|
+
scope: { type: 'string', enum: ['group', 'c2c'], description: 'peer_id 寻址时的范围(group=群 / c2c=私聊)' },
|
|
1044
|
+
text: { type: 'string', required: true, description: '要发送并唤醒 AI 的消息内容' },
|
|
1045
|
+
send_qq: { type: 'boolean', description: '是否同时发到绑定的 QQ 群/私聊(给人看, 默认 true)。false=只唤醒 LLM 不走 QQ 通道' },
|
|
1046
|
+
media: { type: 'string', description: '跨群发图: 图片本地路径或 http(s) URL, 随消息发到目标群(需 send_qq=true)' },
|
|
1047
|
+
},
|
|
1048
|
+
output: {
|
|
1049
|
+
schema: {
|
|
1050
|
+
type: 'object', additionalProperties: false,
|
|
1051
|
+
properties: { ok: { type: 'boolean', required: true }, msg: { type: 'string', required: true } },
|
|
1052
|
+
},
|
|
1053
|
+
render: (_a, v) => [{ type: 'text', text: v.ok ? v.msg : `失败: ${v.msg}` }],
|
|
1054
|
+
},
|
|
1055
|
+
async execute(args, exec) {
|
|
1056
|
+
const text = String(args.text || '');
|
|
1057
|
+
if (!text)
|
|
1058
|
+
return { ok: false, msg: '缺少 text' };
|
|
1059
|
+
// 来源标注(便于对方直接会话): 优先当前执行 agent 的 id(=会话 id); 再取当前会话记录;
|
|
1060
|
+
// 再回退 groupAdmin 的 hub 会话; 最后 'web'
|
|
1061
|
+
let from = 'web';
|
|
1062
|
+
try {
|
|
1063
|
+
const aid = exec.agent?.id;
|
|
1064
|
+
if (typeof aid === 'string' && aid.length >= 8)
|
|
1065
|
+
from = aid.slice(0, 8) + '…';
|
|
1066
|
+
else {
|
|
1067
|
+
const ch0 = channelOf(exec);
|
|
1068
|
+
const src = findSessionRec(ch0, exec);
|
|
1069
|
+
if (src?.rec?.sessionId)
|
|
1070
|
+
from = src.rec.sessionId.slice(0, 8) + '…';
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
catch { /* 忽略 */ }
|
|
1074
|
+
const body = `【来自会话 ${from}】\n${text}${args.media ? `\n[附带图片: ${args.media}]` : ''}`;
|
|
1075
|
+
const map = {
|
|
1076
|
+
ok: '✅ 已发送并唤醒',
|
|
1077
|
+
'no-session': `❌ 会话不存在: 目标会话不在任何已注册实例中(或已重建/换绑)`,
|
|
1078
|
+
'no-followup': '❌ 该会话 agent 不支持 followup 唤醒',
|
|
1079
|
+
fail: '❌ 唤醒异常',
|
|
1080
|
+
};
|
|
1081
|
+
const sid = String(args.session_id || '');
|
|
1082
|
+
if (sid) {
|
|
1083
|
+
// ① session_id 寻址: module 级注册表跨全部实例精确命中(重启后仍可查)
|
|
1084
|
+
const manager = findManagerBySessionId(sid);
|
|
1085
|
+
if (!manager)
|
|
1086
|
+
return { ok: false, msg: `❌ 会话不存在: ${sid.slice(0, 8)}…(不在任何已注册实例)` };
|
|
1087
|
+
const r = await wakeSessionAgent(manager, sid, loggerLike(exec), body);
|
|
1088
|
+
let extra = '';
|
|
1089
|
+
if (args.send_qq !== false) {
|
|
1090
|
+
// 目标 peer: 活跃会话直接取记录; 潜在群(未创建)从群注册表按 sessionIdFor 反查
|
|
1091
|
+
let qScope;
|
|
1092
|
+
let qPeer = '';
|
|
1093
|
+
const rec = manager.findBySessionId(sid);
|
|
1094
|
+
if (rec) {
|
|
1095
|
+
qScope = rec.scope;
|
|
1096
|
+
qPeer = rec.peerId;
|
|
1097
|
+
}
|
|
1098
|
+
else {
|
|
1099
|
+
try {
|
|
1100
|
+
const raw = readFileSync(groupRegistryPath(manager.cwd), 'utf8');
|
|
1101
|
+
const reg = JSON.parse(raw);
|
|
1102
|
+
for (const gid of Object.keys(reg ?? {})) {
|
|
1103
|
+
if (manager.sessionIdFor('group', gid) === sid) {
|
|
1104
|
+
qScope = 'group';
|
|
1105
|
+
qPeer = gid;
|
|
1106
|
+
break;
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
catch { /* 无注册表则跳过 */ }
|
|
1111
|
+
}
|
|
1112
|
+
if (qScope && qPeer) {
|
|
1113
|
+
extra = await sendQQWithMedia(manager, qScope, qPeer, body, String(args.media || ''), exec);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
return { ok: r === 'ok', msg: `${map[r] ?? r} (${sid.slice(0, 8)}…)${extra}` };
|
|
1117
|
+
}
|
|
1118
|
+
// ② peer 寻址: registry 按 scope+peer 找目标实例(跨全部实例), 找不到回退任意实例
|
|
1119
|
+
const peer = String(args.peer_id || '');
|
|
1120
|
+
const sc = String(args.scope || '');
|
|
1121
|
+
if (!peer || !sc)
|
|
1122
|
+
return { ok: false, msg: '请给 session_id, 或 scope+peer_id' };
|
|
1123
|
+
let manager = findManagerByPeer(sc, peer);
|
|
1124
|
+
if (!manager)
|
|
1125
|
+
manager = managersOf()[0];
|
|
1126
|
+
if (!manager)
|
|
1127
|
+
return { ok: false, msg: '找不到会话管理器实例(无已注册实例)' };
|
|
1128
|
+
let rec = manager.findByPeer(sc, peer);
|
|
1129
|
+
if (!rec) {
|
|
1130
|
+
// 会话未创建(懒创建): 用主人身份 getOrCreate 建起来再唤醒(2026-09-10 主人定)
|
|
1131
|
+
rec = await manager.getOrCreate(sc, peer, 'master', { scope: sc, targetId: peer });
|
|
1132
|
+
if (!rec)
|
|
1133
|
+
return { ok: false, msg: `会话创建失败: ${sc} ${peer.slice(0, 8)}…` };
|
|
1134
|
+
}
|
|
1135
|
+
const sid2 = rec.sessionId;
|
|
1136
|
+
const r = await wakeSessionAgent(manager, sid2, loggerLike(exec), body);
|
|
1137
|
+
let extra = '';
|
|
1138
|
+
if (args.send_qq !== false) {
|
|
1139
|
+
extra = await sendQQWithMedia(manager, sc, peer, body, String(args.media || ''), exec);
|
|
1140
|
+
}
|
|
1141
|
+
return { ok: r === 'ok', msg: `${map[r] ?? r} (${sid2.slice(0, 8)}…)${extra}` };
|
|
898
1142
|
},
|
|
899
1143
|
});
|
|
900
1144
|
const muteStateTool = defineTool({
|
|
@@ -994,6 +1238,8 @@ export async function apply(ctx) {
|
|
|
994
1238
|
{ name: 'group_approve_join', tool: approveJoinTool },
|
|
995
1239
|
{ name: 'group_mute_state', tool: muteStateTool },
|
|
996
1240
|
{ name: 'group_mute_member', tool: muteMemberTool },
|
|
1241
|
+
{ name: 'session_list', tool: sessionListTool },
|
|
1242
|
+
{ name: 'session_wake', tool: sessionWakeTool },
|
|
997
1243
|
{ name: 'list_stickers', tool: listStickersTool },
|
|
998
1244
|
{ name: 'sticker_tag', tool: tagStickerTool },
|
|
999
1245
|
{ name: 'sticker_delete', tool: deleteStickerTool },
|
|
@@ -1032,14 +1278,21 @@ export async function apply(ctx) {
|
|
|
1032
1278
|
return undefined;
|
|
1033
1279
|
}
|
|
1034
1280
|
})();
|
|
1035
|
-
//
|
|
1281
|
+
// 扫描根解析: 扩展目录挂在插件数据根(dataRoot=config.dataRoot||cwd), 与工作区其他文件分离。
|
|
1282
|
+
// ①agent ctx qqChannel; ②全局桥(热刷/自愈路径 ctx 可能无 qqChannel); ③ctx.cwd; ④进程 cwd
|
|
1036
1283
|
const bridgeCh = channelBridges.length ? channelBridges[channelBridges.length - 1] : undefined;
|
|
1037
|
-
const
|
|
1284
|
+
const extRoot = qqCh?.manager?.dataRoot
|
|
1285
|
+
|| bridgeCh?.manager?.dataRoot
|
|
1286
|
+
|| qqCh?.manager?.cwd
|
|
1287
|
+
|| bridgeCh?.manager?.cwd
|
|
1288
|
+
|| ctx.cwd
|
|
1289
|
+
|| process.cwd();
|
|
1290
|
+
const workCwd = qqCh?.manager?.cwd
|
|
1038
1291
|
|| bridgeCh?.manager?.cwd
|
|
1039
1292
|
|| ctx.cwd
|
|
1040
1293
|
|| process.cwd();
|
|
1041
|
-
const defs = await loadExtensionTools(
|
|
1042
|
-
extDiag(`apply
|
|
1294
|
+
const defs = await loadExtensionTools(extRoot, (ctx.logger ?? console));
|
|
1295
|
+
extDiag(`apply extRoot=${extRoot} defs=${defs.length} qqCh=${!!qqCh} bridge=${!!bridgeCh}`);
|
|
1043
1296
|
for (const def of defs) {
|
|
1044
1297
|
try {
|
|
1045
1298
|
const tool = defineTool({
|
|
@@ -1056,7 +1309,7 @@ export async function apply(ctx) {
|
|
|
1056
1309
|
async execute(args, exec) {
|
|
1057
1310
|
const sess = findSessionRec(channelOf(exec), exec);
|
|
1058
1311
|
const env = {
|
|
1059
|
-
cwd:
|
|
1312
|
+
cwd: workCwd, // 注入给扩展工具的工作目录保持 agent cwd(扫描根已用数据根)
|
|
1060
1313
|
manager: sess?.ch.manager,
|
|
1061
1314
|
sender: sess?.ch.sender,
|
|
1062
1315
|
replyTarget: sess?.rec.replyTarget,
|