@zaofan/dsh-qqbot 1.1.0 → 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.
- package/client/qqbot-settings.js +571 -52
- package/dist/api/group-admin.d.ts +22 -0
- package/dist/api/group-admin.d.ts.map +1 -1
- package/dist/api/group-admin.js +32 -0
- package/dist/api/group-admin.js.map +1 -1
- package/dist/channel-tools.d.ts.map +1 -1
- package/dist/channel-tools.js +192 -77
- package/dist/channel-tools.js.map +1 -1
- package/dist/commands/botplay.d.ts.map +1 -1
- package/dist/commands/botplay.js +6 -2
- package/dist/commands/botplay.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +6 -2
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/inject.d.ts +17 -0
- package/dist/commands/inject.d.ts.map +1 -0
- package/dist/commands/inject.js +70 -0
- package/dist/commands/inject.js.map +1 -0
- package/dist/commands/misc.d.ts +1 -1
- package/dist/commands/misc.d.ts.map +1 -1
- package/dist/commands/misc.js +25 -3
- package/dist/commands/misc.js.map +1 -1
- package/dist/commands/session.d.ts +2 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +41 -3
- package/dist/commands/session.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/features/botplay-store.d.ts +13 -0
- package/dist/features/botplay-store.d.ts.map +1 -0
- package/dist/features/botplay-store.js +99 -0
- package/dist/features/botplay-store.js.map +1 -0
- package/dist/features/botplay.d.ts +8 -0
- package/dist/features/botplay.d.ts.map +1 -1
- package/dist/features/botplay.js +22 -7
- package/dist/features/botplay.js.map +1 -1
- package/dist/features/broadcast.d.ts +63 -0
- package/dist/features/broadcast.d.ts.map +1 -0
- package/dist/features/broadcast.js +225 -0
- package/dist/features/broadcast.js.map +1 -0
- package/dist/features/card-callback.d.ts +52 -0
- package/dist/features/card-callback.d.ts.map +1 -0
- package/dist/features/card-callback.js +133 -0
- package/dist/features/card-callback.js.map +1 -0
- package/dist/features/group-hub.d.ts +2 -0
- package/dist/features/group-hub.d.ts.map +1 -1
- package/dist/features/group-hub.js +2 -3
- package/dist/features/group-hub.js.map +1 -1
- package/dist/features/group-join-request.d.ts.map +1 -1
- package/dist/features/group-join-request.js +7 -1
- package/dist/features/group-join-request.js.map +1 -1
- package/dist/features/preset-switcher.d.ts +39 -0
- package/dist/features/preset-switcher.d.ts.map +1 -0
- package/dist/features/preset-switcher.js +172 -0
- package/dist/features/preset-switcher.js.map +1 -0
- package/dist/features/session-registry.d.ts +1 -1
- package/dist/features/session-registry.d.ts.map +1 -1
- package/dist/features/session-registry.js +30 -1
- package/dist/features/session-registry.js.map +1 -1
- package/dist/gateway/bootstrap.d.ts.map +1 -1
- package/dist/gateway/bootstrap.js +51 -4
- package/dist/gateway/bootstrap.js.map +1 -1
- package/dist/gateway/debounce.d.ts.map +1 -1
- package/dist/gateway/debounce.js +7 -0
- package/dist/gateway/debounce.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -5
- package/dist/index.js.map +1 -1
- package/dist/middleware/media-history.d.ts.map +1 -1
- package/dist/middleware/media-history.js +23 -6
- package/dist/middleware/media-history.js.map +1 -1
- package/dist/session/session-manager.d.ts +10 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +45 -0
- package/dist/session/session-manager.js.map +1 -1
- package/dist/transport/inbound.d.ts.map +1 -1
- package/dist/transport/inbound.js +46 -50
- package/dist/transport/inbound.js.map +1 -1
- package/dist/transport/inject-rules.d.ts.map +1 -1
- package/dist/transport/inject-rules.js +8 -2
- package/dist/transport/inject-rules.js.map +1 -1
- package/dist/transport/media-kind.d.ts +37 -0
- package/dist/transport/media-kind.d.ts.map +1 -0
- package/dist/transport/media-kind.js +60 -0
- package/dist/transport/media-kind.js.map +1 -0
- package/dist/transport/outbound-buffer.d.ts +20 -2
- package/dist/transport/outbound-buffer.d.ts.map +1 -1
- package/dist/transport/outbound-buffer.js +25 -5
- package/dist/transport/outbound-buffer.js.map +1 -1
- package/dist/transport/outbound.d.ts.map +1 -1
- package/dist/transport/outbound.js +68 -4
- package/dist/transport/outbound.js.map +1 -1
- package/package.json +1 -1
- package/settings-host.js +401 -20
|
@@ -128,10 +128,32 @@ export declare class GroupAdminClient {
|
|
|
128
128
|
sendGroupText(gid: string, content: string): Promise<ApiResult<{
|
|
129
129
|
id?: string;
|
|
130
130
|
}>>;
|
|
131
|
+
/**
|
|
132
|
+
* 向群发送自定义 markdown 卡片(带可选 keyboard 按钮)(2026-09-10 主人实测验证:
|
|
133
|
+
* markdown 嵌网络图+按钮可渲染, 按钮 type:2 点击后 data 以指令消息回到群里)。
|
|
134
|
+
* keyboard 结构: { content: { rows: [{ buttons: [{ id, render_data:{label,style}, action:{type,permission,data,enter} }] }] } }
|
|
135
|
+
* 官方限制: 最多 5 行 × 每行 5 按钮 = 25 个; 超限报 40034029。
|
|
136
|
+
* @returns 消息 id
|
|
137
|
+
*/
|
|
138
|
+
sendGroupCard(gid: string, markdown: string, keyboard?: Record<string, unknown>): Promise<ApiResult<{
|
|
139
|
+
id?: string;
|
|
140
|
+
}>>;
|
|
131
141
|
/** 以机器人身份向用户发私聊文本(c2c 主动消息; 同 sendGroupText 的通道选择逻辑) */
|
|
132
142
|
sendC2cText(userOpenid: string, content: string): Promise<ApiResult<{
|
|
133
143
|
id?: string;
|
|
134
144
|
}>>;
|
|
145
|
+
/**
|
|
146
|
+
* 向私聊(c2c)发送 markdown 卡片 + 可选 keyboard(2026-09-10 主人要求卡片支持私聊)。
|
|
147
|
+
* 官方 c2c 与群共用同一套 markdown/keyboard 结构, 仅 base path 不同。
|
|
148
|
+
*/
|
|
149
|
+
sendC2cCard(userOpenid: string, markdown: string, keyboard?: Record<string, unknown>): Promise<ApiResult<{
|
|
150
|
+
id?: string;
|
|
151
|
+
}>>;
|
|
152
|
+
/**
|
|
153
|
+
* 撤回机器人自己发的消息(官方撤回窗口 2 分钟, 仅能撤自己发的)。
|
|
154
|
+
* msgId: 发送成功时返回的 msg_id(群消息)或 id(私聊消息)。
|
|
155
|
+
*/
|
|
156
|
+
recallMessage(msgId: string): Promise<ApiResult<Record<string, unknown>>>;
|
|
135
157
|
}
|
|
136
158
|
/** 工厂: 每实例一个 client(配置来自各 bot config.appId/appSecret) */
|
|
137
159
|
export declare function createGroupAdmin(opts: GroupAdminOptions): GroupAdminClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-admin.d.ts","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"group-admin.d.ts","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"AAqBA,yDAAyD;AACzD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAO1E,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CAC1H;AAUD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,MAAM,CAQrJ;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IACjH,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/G;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEvG,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAa7E;AAsCD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBAEnB,IAAI,EAAE,iBAAiB;IAMpD,OAAO,CAAC,IAAI;YAME,IAAI;IAmBlB,oCAAoC;IAC9B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAO/G,yBAAyB;IACnB,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EAAE,EACvB,cAAc,UAAQ,GACrB,OAAO,CAAC,SAAS,CAAC;QAAE,qBAAqB,EAAE,MAAM,CAAC;QAAC,oCAAoC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IASxG,sBAAsB;IAChB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAK,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,SAAS,CAAC;QAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAQ9H,6CAA6C;IACvC,kBAAkB,CACtB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,SAAS,GAAG,SAAS,EACzB,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GACtF,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAS5C,uBAAuB;IACjB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAI9D,uDAAuD;IACjD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;QACjD,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC7E,CAAC,CAAC;IAIH;;;;OAIG;IACG,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAO5C;;;;;OAKG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAStF;;;;;;OAMG;IACG,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,SAAS,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAOtC,wDAAwD;IAClD,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAS3F;;;OAGG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,SAAS,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAOtC;;;OAGG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAIhF;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CAE1E;AAED,sCAAsC;AACtC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE"}
|
package/dist/api/group-admin.js
CHANGED
|
@@ -206,6 +206,20 @@ export class GroupAdminClient {
|
|
|
206
206
|
: { content, msg_type: 0, msg_seq: msgSeq };
|
|
207
207
|
return this.call('POST', `/v2/groups/${encodeURIComponent(gid)}/messages`, body);
|
|
208
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* 向群发送自定义 markdown 卡片(带可选 keyboard 按钮)(2026-09-10 主人实测验证:
|
|
211
|
+
* markdown 嵌网络图+按钮可渲染, 按钮 type:2 点击后 data 以指令消息回到群里)。
|
|
212
|
+
* keyboard 结构: { content: { rows: [{ buttons: [{ id, render_data:{label,style}, action:{type,permission,data,enter} }] }] } }
|
|
213
|
+
* 官方限制: 最多 5 行 × 每行 5 按钮 = 25 个; 超限报 40034029。
|
|
214
|
+
* @returns 消息 id
|
|
215
|
+
*/
|
|
216
|
+
async sendGroupCard(gid, markdown, keyboard) {
|
|
217
|
+
const msgSeq = Math.floor(Date.now() / 1000) % 1000000;
|
|
218
|
+
const body = { msg_type: 2, markdown: { content: markdown }, msg_seq: msgSeq };
|
|
219
|
+
if (keyboard && keyboard.content)
|
|
220
|
+
body.keyboard = keyboard;
|
|
221
|
+
return this.call('POST', `/v2/groups/${encodeURIComponent(gid)}/messages`, body);
|
|
222
|
+
}
|
|
209
223
|
/** 以机器人身份向用户发私聊文本(c2c 主动消息; 同 sendGroupText 的通道选择逻辑) */
|
|
210
224
|
async sendC2cText(userOpenid, content) {
|
|
211
225
|
const msgSeq = Math.floor(Date.now() / 1000) % 1000000;
|
|
@@ -215,6 +229,24 @@ export class GroupAdminClient {
|
|
|
215
229
|
: { content, msg_type: 0, msg_seq: msgSeq };
|
|
216
230
|
return this.call('POST', `/v2/users/${encodeURIComponent(userOpenid)}/messages`, body);
|
|
217
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* 向私聊(c2c)发送 markdown 卡片 + 可选 keyboard(2026-09-10 主人要求卡片支持私聊)。
|
|
234
|
+
* 官方 c2c 与群共用同一套 markdown/keyboard 结构, 仅 base path 不同。
|
|
235
|
+
*/
|
|
236
|
+
async sendC2cCard(userOpenid, markdown, keyboard) {
|
|
237
|
+
const msgSeq = Math.floor(Date.now() / 1000) % 1000000;
|
|
238
|
+
const body = { msg_type: 2, markdown: { content: markdown }, msg_seq: msgSeq };
|
|
239
|
+
if (keyboard && keyboard.content)
|
|
240
|
+
body.keyboard = keyboard;
|
|
241
|
+
return this.call('POST', `/v2/users/${encodeURIComponent(userOpenid)}/messages`, body);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* 撤回机器人自己发的消息(官方撤回窗口 2 分钟, 仅能撤自己发的)。
|
|
245
|
+
* msgId: 发送成功时返回的 msg_id(群消息)或 id(私聊消息)。
|
|
246
|
+
*/
|
|
247
|
+
async recallMessage(msgId) {
|
|
248
|
+
return this.call('DELETE', `/v2/messages/${encodeURIComponent(msgId)}`);
|
|
249
|
+
}
|
|
218
250
|
}
|
|
219
251
|
/** 工厂: 每实例一个 client(配置来自各 bot config.appId/appSecret) */
|
|
220
252
|
export function createGroupAdmin(opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-admin.js","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"group-admin.js","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-tools.d.ts","sourceRoot":"","sources":["../src/channel-tools.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAsElE,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAC1C,eAAO,MAAM,MAAM,UAAY,CAAC;AAShC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAI/D;AAmED,mDAAmD;AACnD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,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,CAqqCvD"}
|
package/dist/channel-tools.js
CHANGED
|
@@ -16,7 +16,7 @@ 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
18
|
import { verifyHuman, groupRegistryPath } from './api/group-admin.js';
|
|
19
|
-
import { wakeSessionAgent } from './features/group-hub.js';
|
|
19
|
+
import { wakeSessionAgent, safeAppendUserMessage } from './features/group-hub.js';
|
|
20
20
|
import { managersOf, findManagerByPeer, findManagerBySessionId } from './features/session-registry.js';
|
|
21
21
|
/** 诊断日志路径: 默认关闭; 需要排查时设环境变量 QQBOT_DIAG_FILE 指向日志文件 */
|
|
22
22
|
const DIAG_FILE = process.env.QQBOT_DIAG_FILE || '';
|
|
@@ -867,7 +867,7 @@ export async function apply(ctx) {
|
|
|
867
867
|
}
|
|
868
868
|
const listJoinRequestsTool = defineTool({
|
|
869
869
|
name: 'group_join_requests',
|
|
870
|
-
description: '群管理(读): 查看待审批的入群申请列表(申请人/验证消息/来源/风险提示)。默认查当前会话所在群/manageGroup; 也可传 gid 查指定群。仅主人要求时调用。需在设置开启"QQ群管理"
|
|
870
|
+
description: '群管理(读): 查看待审批的入群申请列表(申请人/验证消息/来源/风险提示)。默认查当前会话所在群/manageGroup; 也可传 gid 查指定群。仅主人要求时调用。需在设置开启"QQ群管理"且机器人为群管理员。⚠️群组管理器(收到【群管·入群申请】注入)的正确姿势: ①先用 session_list 找到【申请所在群】的会话; ②用 session_wake(session_id=该会话, mode=append, send_qq=true) 把申请转达过去; ③让【那个群的 bot 会话】用本工具核对名单、并用 group_approve_join 执行放行/拒绝 —— 每个群的审批交给该群自己的会话办(群成员表/权限/上下文都在那边); 只有在对方会话不可用时, 才由本会话显式带 gid 跨群代批。',
|
|
871
871
|
parameters: {
|
|
872
872
|
gid: { type: 'string', description: '目标群 openid(可选)。不填=当前会话群或 manageGroup; 填了则查指定群的待审批列表' },
|
|
873
873
|
},
|
|
@@ -888,16 +888,24 @@ export async function apply(ctx) {
|
|
|
888
888
|
const r = await ga.client.listJoinRequests(gid);
|
|
889
889
|
if (!r.ok)
|
|
890
890
|
return { ok: false, msg: r.err.human };
|
|
891
|
+
// 补群名(官方 info 接口, 失败不阻断)
|
|
892
|
+
let gname = '';
|
|
893
|
+
try {
|
|
894
|
+
const gi = await ga.client.getGroupInfo(gid);
|
|
895
|
+
if (gi.ok && gi.data?.group_name)
|
|
896
|
+
gname = gi.data.group_name;
|
|
897
|
+
}
|
|
898
|
+
catch { /* 群名失败不影响 */ }
|
|
891
899
|
const list = r.data.list;
|
|
892
900
|
if (list.length === 0)
|
|
893
|
-
return { ok: true, msg:
|
|
901
|
+
return { ok: true, msg: `当前没有待审批的入群申请 ✓(群 ${gname ? `「${gname}」` : ''}${gid})` };
|
|
894
902
|
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}
|
|
903
|
+
return { ok: true, msg: `入群申请 ${list.length} 条(群 ${gname ? `「${gname}」` : ''}${gid}):\n${lines.join('\n')}` };
|
|
896
904
|
},
|
|
897
905
|
});
|
|
898
906
|
const approveJoinTool = defineTool({
|
|
899
907
|
name: 'group_approve_join',
|
|
900
|
-
description: '群管理(写,危险): 审批入群申请。approve=放行 / decline=拒绝(可带理由)。支持批量: member_openids 数组一次批多人(优先); 也兼容单数 member_openid。仅主人明确要求时调用; 调用前建议先 group_join_requests
|
|
908
|
+
description: '群管理(写,危险): 审批入群申请。approve=放行 / decline=拒绝(可带理由)。支持批量: member_openids 数组一次批多人(优先); 也兼容单数 member_openid。仅主人明确要求时调用; 调用前建议先 group_join_requests 核对申请人。⚠️跨群审批务必显式传 gid(不传=当前会话所在群, 会批错群)。由群组管理器(hub)代批时的顺序: 优先用 session_wake 唤醒【申请所在群的会话】, 让那边的 bot 调本工具执行审批; 该会话不可用(无会话/append 失败)时才在本会话带 gid 直批。',
|
|
901
909
|
parameters: {
|
|
902
910
|
gid: { type: 'string', description: '目标群 openid(可选)。不填=当前会话群或 manageGroup; 填了则审批指定群的申请' },
|
|
903
911
|
member_openids: { type: 'array', description: '批量审批: 申请人 member_openid 数组(来自 group_join_requests), 一次批多人' },
|
|
@@ -1025,10 +1033,28 @@ export async function apply(ctx) {
|
|
|
1025
1033
|
}
|
|
1026
1034
|
const ga = groupAdminOf(exec);
|
|
1027
1035
|
if (ga) {
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1036
|
+
if (scope === 'c2c') {
|
|
1037
|
+
// c2c 主动推送必须走官方 is_wakeup 召回通道(30天窗), 自建 REST sendC2cText 无 is_wakeup
|
|
1038
|
+
// → 被动回复窗口外不投递(web LLM 已唤醒但 QQ 收不到, 2026-09-10 主人实测 bug)。
|
|
1039
|
+
// 优先 ch.sender.sendC2cWakeup(SDK sendWakeup); 无 sender 才退自建 REST。
|
|
1040
|
+
if (ch?.sender && typeof ch.sender.sendC2cWakeup === 'function') {
|
|
1041
|
+
try {
|
|
1042
|
+
await ch.sender.sendC2cWakeup({ scope, targetId: peer }, body);
|
|
1043
|
+
sent.push('📨已发到QQ 私聊');
|
|
1044
|
+
}
|
|
1045
|
+
catch (err) {
|
|
1046
|
+
sent.push(`⚠️QQ私聊发送失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
else {
|
|
1050
|
+
const sr = await ga.client.sendC2cText(peer, body);
|
|
1051
|
+
sent.push(sr.ok ? '📨已发到QQ 私聊(降级)' : `⚠️QQ发送失败: ${sr.err.human}`);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
else {
|
|
1055
|
+
const sr = await ga.client.sendGroupText(peer, body);
|
|
1056
|
+
sent.push(sr.ok ? '📨已发到QQ 群' : `⚠️QQ发送失败: ${sr.err.human}`);
|
|
1057
|
+
}
|
|
1032
1058
|
}
|
|
1033
1059
|
else {
|
|
1034
1060
|
sent.push('⚠️群管理未开启');
|
|
@@ -1037,13 +1063,25 @@ export async function apply(ctx) {
|
|
|
1037
1063
|
}
|
|
1038
1064
|
const sessionWakeTool = defineTool({
|
|
1039
1065
|
name: 'session_wake',
|
|
1040
|
-
description: '跨会话(写,需谨慎):
|
|
1066
|
+
description: '跨会话(写,需谨慎): 向指定会话发送一条消息; mode=wake(默认)唤醒该会话的 LLM(给 AI 看), mode=append 只把消息写进该会话上下文不唤醒(省 token, 喇叭模式, AI 下次回合自然看到)。同时把带来源标注的消息通过 QQBot 通道发到该会话绑定的群/私聊(给人看)。可用 session_list 查目标 id; 也支持按 peerId(群/私聊) 寻址。支持 batch 批量: 一次向多个会话各发不同文本(每项带自己的 session_id/peer_id/text/mode/send_qq/media)。仅主人明确要求时调用。', parameters: {
|
|
1041
1067
|
session_id: { type: 'string', description: '目标会话 id(完整 sessionId, 来自 session_list)' },
|
|
1042
1068
|
peer_id: { type: 'string', description: '或按 peer 寻址: 群 openid/私聊 openid(需带 scope)' },
|
|
1043
1069
|
scope: { type: 'string', enum: ['group', 'c2c'], description: 'peer_id 寻址时的范围(group=群 / c2c=私聊)' },
|
|
1044
|
-
text: { type: 'string', required: true, description: '
|
|
1045
|
-
|
|
1070
|
+
text: { type: 'string', required: true, description: '要发送的消息内容(唤醒模式会作为用户消息喂给 AI)' },
|
|
1071
|
+
mode: { type: 'string', enum: ['wake', 'append'], description: 'wake=唤醒 LLM 开回合(默认); append=只追加上下文不唤醒(省 token, 喇叭模式)' },
|
|
1072
|
+
send_qq: { type: 'boolean', description: '是否同时发到绑定的 QQ 群/私聊(给人看, 默认 true)。false=只处理 LLM 侧不走 QQ 通道' },
|
|
1046
1073
|
media: { type: 'string', description: '跨群发图: 图片本地路径或 http(s) URL, 随消息发到目标群(需 send_qq=true)' },
|
|
1074
|
+
batch: { type: 'array', description: '批量模式(2026-09-10): 一次向多个会话各发不同文本。每项: {session_id 或 peer_id+scope, text, mode?, send_qq?, media?}。单发参数与 batch 二选一, batch 优先。', items: {
|
|
1075
|
+
type: 'object', additionalProperties: false, properties: {
|
|
1076
|
+
session_id: { type: 'string', description: '目标会话 id' },
|
|
1077
|
+
peer_id: { type: 'string', description: '或 peer 寻址: 群/私聊 openid' },
|
|
1078
|
+
scope: { type: 'string', enum: ['group', 'c2c'], description: 'peer 寻址范围' },
|
|
1079
|
+
text: { type: 'string', required: true, description: '该会话要发的消息内容' },
|
|
1080
|
+
mode: { type: 'string', enum: ['wake', 'append'], description: '默认 wake' },
|
|
1081
|
+
send_qq: { type: 'boolean', description: '默认 true' },
|
|
1082
|
+
media: { type: 'string', description: '该会话随消息发的图片' },
|
|
1083
|
+
},
|
|
1084
|
+
} },
|
|
1047
1085
|
},
|
|
1048
1086
|
output: {
|
|
1049
1087
|
schema: {
|
|
@@ -1053,92 +1091,169 @@ export async function apply(ctx) {
|
|
|
1053
1091
|
render: (_a, v) => [{ type: 'text', text: v.ok ? v.msg : `失败: ${v.msg}` }],
|
|
1054
1092
|
},
|
|
1055
1093
|
async execute(args, exec) {
|
|
1056
|
-
const text = String(args.text || '');
|
|
1057
|
-
if (!text)
|
|
1058
|
-
return { ok: false, msg: '缺少 text' };
|
|
1059
1094
|
// 来源标注(便于对方直接会话): 优先当前执行 agent 的 id(=会话 id); 再取当前会话记录;
|
|
1060
1095
|
// 再回退 groupAdmin 的 hub 会话; 最后 'web'
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
else {
|
|
1096
|
+
const from = (() => {
|
|
1097
|
+
try {
|
|
1098
|
+
const aid = exec.agent?.id;
|
|
1099
|
+
if (typeof aid === 'string' && aid.length >= 8)
|
|
1100
|
+
return aid.slice(0, 8) + '…';
|
|
1067
1101
|
const ch0 = channelOf(exec);
|
|
1068
1102
|
const src = findSessionRec(ch0, exec);
|
|
1069
1103
|
if (src?.rec?.sessionId)
|
|
1070
|
-
|
|
1104
|
+
return src.rec.sessionId.slice(0, 8) + '…';
|
|
1071
1105
|
}
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1106
|
+
catch { /* 忽略 */ }
|
|
1107
|
+
return 'web';
|
|
1108
|
+
})();
|
|
1075
1109
|
const map = {
|
|
1076
1110
|
ok: '✅ 已发送并唤醒',
|
|
1077
1111
|
'no-session': `❌ 会话不存在: 目标会话不在任何已注册实例中(或已重建/换绑)`,
|
|
1078
1112
|
'no-followup': '❌ 该会话 agent 不支持 followup 唤醒',
|
|
1079
|
-
|
|
1113
|
+
'no-append': '❌ 该会话 agent 不支持上下文追加',
|
|
1114
|
+
'no-agent': '❌ 找不到目标会话 agent',
|
|
1115
|
+
busy: '⏳ 目标会话正忙(回合进行中且无安全注入通道)',
|
|
1116
|
+
fail: '❌ 处理异常',
|
|
1080
1117
|
};
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
const
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
const
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1118
|
+
/** 单条发送(单发与 batch 共用): one={session_id?|peer_id?+scope?, text, mode?, send_qq?, media?} */
|
|
1119
|
+
const sendOne = async (one) => {
|
|
1120
|
+
const text = String(one.text || '');
|
|
1121
|
+
if (!text)
|
|
1122
|
+
return '❌ 缺少 text';
|
|
1123
|
+
const body = `【来自会话 ${from}】\n${text}${one.media ? `\n[附带图片: ${one.media}]` : ''}`;
|
|
1124
|
+
const sid = String(one.session_id || '');
|
|
1125
|
+
if (sid) {
|
|
1126
|
+
// ① session_id 寻址: module 级注册表跨全部实例精确命中(重启后仍可查)
|
|
1127
|
+
const manager = findManagerBySessionId(sid);
|
|
1128
|
+
if (!manager)
|
|
1129
|
+
return `❌ 会话不存在: ${sid.slice(0, 8)}…(不在任何已注册实例)`;
|
|
1130
|
+
const mode = String(one.mode || 'wake');
|
|
1131
|
+
let r;
|
|
1132
|
+
if (mode === 'append') {
|
|
1133
|
+
const rec0 = manager.findBySessionId(sid);
|
|
1134
|
+
const targetAgent = rec0?.agent
|
|
1135
|
+
?? manager.findHostAgent(sid)?.agent
|
|
1136
|
+
?? (await manager.resumeHostAgent(sid).catch(() => undefined))?.agent;
|
|
1137
|
+
if (!targetAgent)
|
|
1138
|
+
r = 'no-session';
|
|
1139
|
+
else
|
|
1140
|
+
r = await safeAppendUserMessage(targetAgent, body, loggerLike(exec));
|
|
1097
1141
|
}
|
|
1098
1142
|
else {
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1143
|
+
r = await wakeSessionAgent(manager, sid, loggerLike(exec), body);
|
|
1144
|
+
}
|
|
1145
|
+
let extra = '';
|
|
1146
|
+
if (one.send_qq !== false) {
|
|
1147
|
+
// 目标 peer: ⚠️ 不能只问 findManagerBySessionId 返回的 manager——它可能经 findHostAgent 命中
|
|
1148
|
+
// 错误实例(宿主 registry 全局), 导致 rec=undefined → 静默不发(2026-09-10 04:35 实测)。
|
|
1149
|
+
let qScope;
|
|
1150
|
+
let qPeer = '';
|
|
1151
|
+
let ownerManager;
|
|
1152
|
+
for (const m of managersOf()) {
|
|
1153
|
+
try {
|
|
1154
|
+
const r2 = m.findBySessionId(sid);
|
|
1155
|
+
if (r2) {
|
|
1156
|
+
ownerManager = m;
|
|
1157
|
+
qScope = r2.scope;
|
|
1158
|
+
qPeer = r2.peerId;
|
|
1106
1159
|
break;
|
|
1107
1160
|
}
|
|
1108
1161
|
}
|
|
1162
|
+
catch { /* 单实例异常跳过 */ }
|
|
1163
|
+
}
|
|
1164
|
+
if (!ownerManager) {
|
|
1165
|
+
for (const m of managersOf()) {
|
|
1166
|
+
try {
|
|
1167
|
+
const raw = readFileSync(groupRegistryPath(m.cwd), 'utf8');
|
|
1168
|
+
const reg = JSON.parse(raw);
|
|
1169
|
+
for (const gid of Object.keys(reg ?? {})) {
|
|
1170
|
+
if (m.sessionIdFor('group', gid) === sid) {
|
|
1171
|
+
ownerManager = m;
|
|
1172
|
+
qScope = 'group';
|
|
1173
|
+
qPeer = gid;
|
|
1174
|
+
break;
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
if (ownerManager)
|
|
1178
|
+
break;
|
|
1179
|
+
}
|
|
1180
|
+
catch { /* 无注册表则跳过 */ }
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
if (ownerManager && qScope && qPeer) {
|
|
1184
|
+
extra = await sendQQWithMedia(ownerManager, qScope, qPeer, body, String(one.media || ''), exec);
|
|
1185
|
+
}
|
|
1186
|
+
else {
|
|
1187
|
+
const diag = `未找到目标会话的 QQ peer(findBySessionId 与群注册表均 miss, sid=${sid.slice(0, 8)}…)`;
|
|
1188
|
+
try {
|
|
1189
|
+
loggerLike(exec).warn(`[session_wake] ${diag}`);
|
|
1190
|
+
}
|
|
1191
|
+
catch { /* */ }
|
|
1192
|
+
extra = `;⚠️${diag}`;
|
|
1109
1193
|
}
|
|
1110
|
-
catch { /* 无注册表则跳过 */ }
|
|
1111
1194
|
}
|
|
1112
|
-
|
|
1113
|
-
|
|
1195
|
+
return `${map[r] ?? r} (${sid.slice(0, 8)}…)${extra}`;
|
|
1196
|
+
}
|
|
1197
|
+
// ② peer 寻址
|
|
1198
|
+
const peer = String(one.peer_id || '');
|
|
1199
|
+
const sc = String(one.scope || '');
|
|
1200
|
+
if (!peer || !sc)
|
|
1201
|
+
return '请给 session_id, 或 scope+peer_id';
|
|
1202
|
+
let manager = findManagerByPeer(sc, peer);
|
|
1203
|
+
if (!manager) {
|
|
1204
|
+
const curCh = channelOf(exec);
|
|
1205
|
+
if (curCh?.manager && curCh.manager.findByPeer(sc, peer))
|
|
1206
|
+
manager = curCh.manager;
|
|
1207
|
+
else if (curCh?.manager)
|
|
1208
|
+
manager = curCh.manager;
|
|
1209
|
+
}
|
|
1210
|
+
if (!manager)
|
|
1211
|
+
return '找不到会话管理器实例(无已注册实例)';
|
|
1212
|
+
let rec = manager.findByPeer(sc, peer);
|
|
1213
|
+
if (!rec) {
|
|
1214
|
+
if (sc === 'c2c') {
|
|
1215
|
+
return `❌ 未找到该私聊对象的真实会话(${peer.slice(0, 8)}…): 请先让对方主动私聊本 bot 一次(dock「💬聊天」里能直接发), 或用 session_id 寻址。原因: openid 按 bot 应用隔离, 乱建会话会发到错误实例`;
|
|
1114
1216
|
}
|
|
1217
|
+
rec = await manager.getOrCreate(sc, peer, 'master', { scope: sc, targetId: peer });
|
|
1218
|
+
if (!rec)
|
|
1219
|
+
return `会话创建失败: ${sc} ${peer.slice(0, 8)}…`;
|
|
1115
1220
|
}
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1221
|
+
const sid2 = rec.sessionId;
|
|
1222
|
+
const mode2 = String(one.mode || 'wake');
|
|
1223
|
+
let r;
|
|
1224
|
+
if (mode2 === 'append') {
|
|
1225
|
+
r = rec.agent
|
|
1226
|
+
? await safeAppendUserMessage(rec.agent, body, loggerLike(exec))
|
|
1227
|
+
: 'no-session';
|
|
1228
|
+
}
|
|
1229
|
+
else {
|
|
1230
|
+
r = await wakeSessionAgent(manager, sid2, loggerLike(exec), body);
|
|
1231
|
+
}
|
|
1232
|
+
let extra = '';
|
|
1233
|
+
if (one.send_qq !== false) {
|
|
1234
|
+
extra = await sendQQWithMedia(manager, sc, peer, body, String(one.media || ''), exec);
|
|
1235
|
+
}
|
|
1236
|
+
return `${map[r] ?? r} (${sid2.slice(0, 8)}…)${extra}`;
|
|
1237
|
+
};
|
|
1238
|
+
// batch 优先(2026-09-10 主人: 多参数=一次多个会话各发不同文本)
|
|
1239
|
+
if (Array.isArray(args.batch) && args.batch.length > 0) {
|
|
1240
|
+
const results = [];
|
|
1241
|
+
for (const item of args.batch) {
|
|
1242
|
+
if (!item || typeof item !== 'object') {
|
|
1243
|
+
results.push('❌ batch 项无效');
|
|
1244
|
+
continue;
|
|
1245
|
+
}
|
|
1246
|
+
try {
|
|
1247
|
+
results.push(await sendOne(item));
|
|
1248
|
+
}
|
|
1249
|
+
catch (e) {
|
|
1250
|
+
results.push(`❌ 发送异常: ${String(e?.message || e)}`);
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
return { ok: results.every((x) => x.startsWith('✅')), msg: `批量 ${results.length} 条:\n` + results.map((x, i) => `${i + 1}. ${x}`).join('\n') };
|
|
1140
1254
|
}
|
|
1141
|
-
|
|
1255
|
+
const oneR = await sendOne(args);
|
|
1256
|
+
return { ok: oneR.startsWith('✅'), msg: oneR };
|
|
1142
1257
|
},
|
|
1143
1258
|
});
|
|
1144
1259
|
const muteStateTool = defineTool({
|