@zaofan/dsh-qqbot 1.1.0 → 1.1.3

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 (100) hide show
  1. package/client/qqbot-settings.js +571 -52
  2. package/dist/api/group-admin.d.ts +22 -0
  3. package/dist/api/group-admin.d.ts.map +1 -1
  4. package/dist/api/group-admin.js +32 -0
  5. package/dist/api/group-admin.js.map +1 -1
  6. package/dist/channel-tools.d.ts.map +1 -1
  7. package/dist/channel-tools.js +192 -77
  8. package/dist/channel-tools.js.map +1 -1
  9. package/dist/commands/botplay.d.ts.map +1 -1
  10. package/dist/commands/botplay.js +6 -2
  11. package/dist/commands/botplay.js.map +1 -1
  12. package/dist/commands/index.d.ts.map +1 -1
  13. package/dist/commands/index.js +6 -2
  14. package/dist/commands/index.js.map +1 -1
  15. package/dist/commands/inject.d.ts +17 -0
  16. package/dist/commands/inject.d.ts.map +1 -0
  17. package/dist/commands/inject.js +70 -0
  18. package/dist/commands/inject.js.map +1 -0
  19. package/dist/commands/misc.d.ts +1 -1
  20. package/dist/commands/misc.d.ts.map +1 -1
  21. package/dist/commands/misc.js +25 -3
  22. package/dist/commands/misc.js.map +1 -1
  23. package/dist/commands/session.d.ts +2 -0
  24. package/dist/commands/session.d.ts.map +1 -1
  25. package/dist/commands/session.js +41 -3
  26. package/dist/commands/session.js.map +1 -1
  27. package/dist/config.d.ts +6 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +2 -1
  30. package/dist/config.js.map +1 -1
  31. package/dist/features/botplay-store.d.ts +13 -0
  32. package/dist/features/botplay-store.d.ts.map +1 -0
  33. package/dist/features/botplay-store.js +99 -0
  34. package/dist/features/botplay-store.js.map +1 -0
  35. package/dist/features/botplay.d.ts +8 -0
  36. package/dist/features/botplay.d.ts.map +1 -1
  37. package/dist/features/botplay.js +22 -7
  38. package/dist/features/botplay.js.map +1 -1
  39. package/dist/features/broadcast.d.ts +63 -0
  40. package/dist/features/broadcast.d.ts.map +1 -0
  41. package/dist/features/broadcast.js +225 -0
  42. package/dist/features/broadcast.js.map +1 -0
  43. package/dist/features/card-callback.d.ts +52 -0
  44. package/dist/features/card-callback.d.ts.map +1 -0
  45. package/dist/features/card-callback.js +133 -0
  46. package/dist/features/card-callback.js.map +1 -0
  47. package/dist/features/group-hub.d.ts +2 -0
  48. package/dist/features/group-hub.d.ts.map +1 -1
  49. package/dist/features/group-hub.js +4 -5
  50. package/dist/features/group-hub.js.map +1 -1
  51. package/dist/features/group-join-request.d.ts.map +1 -1
  52. package/dist/features/group-join-request.js +7 -1
  53. package/dist/features/group-join-request.js.map +1 -1
  54. package/dist/features/preset-switcher.d.ts +39 -0
  55. package/dist/features/preset-switcher.d.ts.map +1 -0
  56. package/dist/features/preset-switcher.js +172 -0
  57. package/dist/features/preset-switcher.js.map +1 -0
  58. package/dist/features/session-registry.d.ts +1 -1
  59. package/dist/features/session-registry.d.ts.map +1 -1
  60. package/dist/features/session-registry.js +30 -1
  61. package/dist/features/session-registry.js.map +1 -1
  62. package/dist/gateway/bootstrap.d.ts.map +1 -1
  63. package/dist/gateway/bootstrap.js +51 -4
  64. package/dist/gateway/bootstrap.js.map +1 -1
  65. package/dist/gateway/debounce.d.ts.map +1 -1
  66. package/dist/gateway/debounce.js +7 -0
  67. package/dist/gateway/debounce.js.map +1 -1
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +24 -5
  70. package/dist/index.js.map +1 -1
  71. package/dist/middleware/media-history.d.ts.map +1 -1
  72. package/dist/middleware/media-history.js +23 -6
  73. package/dist/middleware/media-history.js.map +1 -1
  74. package/dist/session/session-manager.d.ts +10 -0
  75. package/dist/session/session-manager.d.ts.map +1 -1
  76. package/dist/session/session-manager.js +45 -0
  77. package/dist/session/session-manager.js.map +1 -1
  78. package/dist/setup.d.ts +15 -3
  79. package/dist/setup.d.ts.map +1 -1
  80. package/dist/setup.js +51 -32
  81. package/dist/setup.js.map +1 -1
  82. package/dist/transport/inbound.d.ts.map +1 -1
  83. package/dist/transport/inbound.js +46 -50
  84. package/dist/transport/inbound.js.map +1 -1
  85. package/dist/transport/inject-rules.d.ts.map +1 -1
  86. package/dist/transport/inject-rules.js +8 -2
  87. package/dist/transport/inject-rules.js.map +1 -1
  88. package/dist/transport/media-kind.d.ts +37 -0
  89. package/dist/transport/media-kind.d.ts.map +1 -0
  90. package/dist/transport/media-kind.js +60 -0
  91. package/dist/transport/media-kind.js.map +1 -0
  92. package/dist/transport/outbound-buffer.d.ts +20 -2
  93. package/dist/transport/outbound-buffer.d.ts.map +1 -1
  94. package/dist/transport/outbound-buffer.js +25 -5
  95. package/dist/transport/outbound-buffer.js.map +1 -1
  96. package/dist/transport/outbound.d.ts.map +1 -1
  97. package/dist/transport/outbound.js +68 -4
  98. package/dist/transport/outbound.js.map +1 -1
  99. package/package.json +1 -1
  100. package/settings-host.js +538 -44
@@ -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"}
@@ -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,CA+kCvD"}
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"}
@@ -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} 条${args.gid ? `(群 …${gid.slice(-6)})` : ''}:\n${lines.join('\n')}` };
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
- 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}`);
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: '跨会话(写,需谨慎): 向指定会话发送一条消息并唤醒该会话的 LLM(给 AI 看); 同时把带来源标注的消息通过 QQBot 通道发到该会话绑定的群/私聊(给人看)。可用 session_list 查目标 id; 也支持按 peerId(群/私聊) 寻址。仅主人明确要求时调用。', parameters: {
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: '要发送并唤醒 AI 的消息内容' },
1045
- send_qq: { type: 'boolean', description: '是否同时发到绑定的 QQ 群/私聊(给人看, 默认 true)。false=只唤醒 LLM 不走 QQ 通道' },
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
- 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 {
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
- from = src.rec.sessionId.slice(0, 8) + '…';
1104
+ return src.rec.sessionId.slice(0, 8) + '…';
1071
1105
  }
1072
- }
1073
- catch { /* 忽略 */ }
1074
- const body = `【来自会话 ${from}】\n${text}${args.media ? `\n[附带图片: ${args.media}]` : ''}`;
1106
+ catch { /* 忽略 */ }
1107
+ return 'web';
1108
+ })();
1075
1109
  const map = {
1076
1110
  ok: '✅ 已发送并唤醒',
1077
1111
  'no-session': `❌ 会话不存在: 目标会话不在任何已注册实例中(或已重建/换绑)`,
1078
1112
  'no-followup': '❌ 该会话 agent 不支持 followup 唤醒',
1079
- fail: '❌ 唤醒异常',
1113
+ 'no-append': '❌ 该会话 agent 不支持上下文追加',
1114
+ 'no-agent': '❌ 找不到目标会话 agent',
1115
+ busy: '⏳ 目标会话正忙(回合进行中且无安全注入通道)',
1116
+ fail: '❌ 处理异常',
1080
1117
  };
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;
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
- 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;
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
- if (qScope && qPeer) {
1113
- extra = await sendQQWithMedia(manager, qScope, qPeer, body, String(args.media || ''), exec);
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
- 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);
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
- return { ok: r === 'ok', msg: `${map[r] ?? r} (${sid2.slice(0, 8)}…)${extra}` };
1255
+ const oneR = await sendOne(args);
1256
+ return { ok: oneR.startsWith('✅'), msg: oneR };
1142
1257
  },
1143
1258
  });
1144
1259
  const muteStateTool = defineTool({