@zaofan/dsh-qqbot 1.7.4 → 1.7.6

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 (59) hide show
  1. package/client/qqbot-settings.js +24 -5
  2. package/dist/channel-tools.d.ts.map +1 -1
  3. package/dist/channel-tools.js +12 -4
  4. package/dist/channel-tools.js.map +1 -1
  5. package/dist/config.d.ts +14 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +4 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/features/card-callback.d.ts +6 -2
  10. package/dist/features/card-callback.d.ts.map +1 -1
  11. package/dist/features/card-callback.js +3 -1
  12. package/dist/features/card-callback.js.map +1 -1
  13. package/dist/features/ext-capabilities.d.ts +26 -0
  14. package/dist/features/ext-capabilities.d.ts.map +1 -1
  15. package/dist/features/ext-capabilities.js +32 -0
  16. package/dist/features/ext-capabilities.js.map +1 -1
  17. package/dist/features/ext-tool-cards.d.ts +52 -0
  18. package/dist/features/ext-tool-cards.d.ts.map +1 -0
  19. package/dist/features/ext-tool-cards.js +152 -0
  20. package/dist/features/ext-tool-cards.js.map +1 -0
  21. package/dist/features/ext-tool-interaction.d.ts +53 -0
  22. package/dist/features/ext-tool-interaction.d.ts.map +1 -0
  23. package/dist/features/ext-tool-interaction.js +103 -0
  24. package/dist/features/ext-tool-interaction.js.map +1 -0
  25. package/dist/features/extension-store.d.ts +24 -0
  26. package/dist/features/extension-store.d.ts.map +1 -1
  27. package/dist/features/extension-store.js +3 -0
  28. package/dist/features/extension-store.js.map +1 -1
  29. package/dist/features/qq-approval.d.ts +12 -0
  30. package/dist/features/qq-approval.d.ts.map +1 -1
  31. package/dist/features/qq-approval.js +43 -5
  32. package/dist/features/qq-approval.js.map +1 -1
  33. package/dist/features/qq-user-questions.d.ts +34 -2
  34. package/dist/features/qq-user-questions.d.ts.map +1 -1
  35. package/dist/features/qq-user-questions.js +106 -1
  36. package/dist/features/qq-user-questions.js.map +1 -1
  37. package/dist/gateway/bootstrap.d.ts.map +1 -1
  38. package/dist/gateway/bootstrap.js +53 -4
  39. package/dist/gateway/bootstrap.js.map +1 -1
  40. package/dist/gateway/debounce.d.ts.map +1 -1
  41. package/dist/gateway/debounce.js +132 -3
  42. package/dist/gateway/debounce.js.map +1 -1
  43. package/dist/transport/inbound.js +2 -1
  44. package/dist/transport/inbound.js.map +1 -1
  45. package/examples/ext-tools/README.md +47 -0
  46. package/examples/ext-tools/vote.mjs +318 -0
  47. package/package.json +1 -1
  48. package/client/qqbot-settings.js.bak-ctxkey-1790880133352 +0 -5069
  49. package/client/qqbot-settings.js.bak-diaglog +0 -5866
  50. package/client/qqbot-settings.js.bak-inc-1790865292905 +0 -4967
  51. package/client/qqbot-settings.js.bak-inc-1790865309979 +0 -4967
  52. package/client/qqbot-settings.js.bak-mmui-1790922963087 +0 -5085
  53. package/client/qqbot-settings.js.bak-mobile-css-1790817989692 +0 -4912
  54. package/client/qqbot-settings.js.bak-newer-1790865544006 +0 -5023
  55. package/client/qqbot-settings.js.bak-radio-1790899148239 +0 -5076
  56. package/client/qqbot-settings.js.bak-stick-1790865591295 +0 -5033
  57. package/client/qqbot-settings.js.bak-touch-1790818115035 +0 -4912
  58. package/client/qqbot-settings.js.bak-touch2-1790818130561 +0 -4912
  59. package/client/qqbot-settings.js.bak-ui4b-1790879732726 +0 -5046
@@ -218,7 +218,7 @@ window.__ModuleLoader__.load({
218
218
  sticker: v.sticker || {},
219
219
  injectRules: Array.isArray(v.injectRules) ? v.injectRules : [],
220
220
  imageHint: typeof v.imageHint === 'boolean' ? v.imageHint : undefined,
221
- messageReference: v.messageReference !== false,
221
+ messageReference: v.messageReference !== false,
222
222
  diagLog: v.diagLog === true,
223
223
  schedule: v.schedule && Array.isArray(v.schedule.targets) ? v.schedule : { targets: [] },
224
224
  // groupPrompt 必须读回来, 否则每次保存都会把它清空成 ''
@@ -272,7 +272,7 @@ window.__ModuleLoader__.load({
272
272
  injectRules: cfg.injectRules,
273
273
  // 2026-09-30 修: 这两个开关原来漏写进 patch → 面板勾了/取消了都存不下去(读得到、写不回)
274
274
  imageHint: cfg.imageHint !== false,
275
- messageReference: cfg.messageReference !== false,
275
+ messageReference: cfg.messageReference !== false,
276
276
  diagLog: cfg.diagLog === true,
277
277
  // 定时唤醒(④)已并入「定时任务」页编辑; 这里原样带过不丢即可
278
278
  schedule: cfg.schedule && Array.isArray(cfg.schedule.targets) ? cfg.schedule : { targets: [] },
@@ -292,7 +292,7 @@ window.__ModuleLoader__.load({
292
292
  behavior: v2.behavior || {}, sticker: v2.sticker || {},
293
293
  injectRules: Array.isArray(v2.injectRules) ? v2.injectRules : [],
294
294
  imageHint: typeof v2.imageHint === 'boolean' ? v2.imageHint : undefined,
295
- messageReference: v2.messageReference !== false,
295
+ messageReference: v2.messageReference !== false,
296
296
  diagLog: v2.diagLog === true,
297
297
  schedule: v2.schedule && Array.isArray(v2.schedule.targets) ? v2.schedule : { targets: [] },
298
298
  groupPrompt: typeof v2.groupPrompt === 'string' ? v2.groupPrompt : (typeof cfg.groupPrompt === 'string' ? cfg.groupPrompt : DEFAULT_GROUP_PROMPT),
@@ -336,7 +336,16 @@ window.__ModuleLoader__.load({
336
336
  BoolRow({ label: '开启延迟聚合(不勾=回到来一条回一条)', value: dbc.enabled !== false, onChange: function (v) { setBehavior({ debounce: { ...dbc, enabled: v } }) } }),
337
337
  NumRow({ label: '对方停口几秒后她才开口(默认3;0=不停顿)', value: dbc.silenceSec != null ? dbc.silenceSec : 3, onChange: function (v) { setBehavior({ debounce: { ...dbc, silenceSec: v } }) } }),
338
338
  NumRow({ label: '攒满几条立即开口,不等对方停(默认10)', value: dbc.maxMsgs != null ? dbc.maxMsgs : 10, onChange: function (v) { setBehavior({ debounce: { ...dbc, maxMsgs: v } }) } }),
339
- BoolRow({ label: '有人 @ 她时也走延迟(不勾=@到秒回)', value: dbc.mentionDelayed !== false, onChange: function (v) { setBehavior({ debounce: { ...dbc, mentionDelayed: v } }) } })),
339
+ BoolRow({ label: '有人 @ 她时也走延迟(不勾=@到秒回)', value: dbc.mentionDelayed !== false, onChange: function (v) { setBehavior({ debounce: { ...dbc, mentionDelayed: v } }) } }),
340
+ h('div', { style: { fontSize: 12, color: '#666', margin: '10px 0 2px' } }, '她正在思考/输出时, 群里又来了新消息怎么办(同宿主「繁忙时的发送行为」那两项):'),
341
+ h('div', { style: { display: 'flex', gap: 14, alignItems: 'center', flexWrap: 'wrap' } },
342
+ ['queue', 'interject'].map(function (m) {
343
+ var cur = dbc.busySendMode === 'interject' ? 'interject' : 'queue'
344
+ return h('label', { style: { display: 'inline-flex', gap: 5, alignItems: 'center', fontSize: 12, color: '#333', cursor: 'pointer' } },
345
+ h('input', { type: 'radio', name: 'qqs-busy', checked: cur === m, onChange: function () { setBehavior({ debounce: { ...dbc, busySendMode: m } }) } }),
346
+ m === 'queue' ? '排队发送(默认: 攒着, 等这轮回完再一起看)' : '插话发送(在这回的轮次之间立刻插进去)')
347
+ })),
348
+ h('div', { style: { fontSize: 12, color: '#888' } }, '排队=她正忙时消息攒在窗口里, 等这轮回合结束才整批送进去(带"上次回复前群友所发"的提示)。插话=照样先聚合(静默秒数/条数上限都不变, 不会一条条吵醒她), 但不等回合结束, 直接在回合内的轮次之间插进去 —— 每次插话都带一句"先做完当前任务、别被带偏"的轻提示。注意: 若她这一步是纯文字收尾(后面没有工具轮次), 插话会留到下次唤醒才被读到, 效果和排队一样(宿主 inject 的固有语义)。保存即热更新, 不用重启。')),
340
349
 
341
350
  h('div', { style: sectionTitle }, '② 发表情包的限制(全默认不限制)'),
342
351
  h('p', { style: { fontSize: 12, color: '#888' } }, '防止她聊天时表情包刷屏;下面两项是"她主动发图"时才用——群里很热闹才发,冷清就憋着。不想管就保持全 0,也别勾总开关。'),
@@ -376,6 +385,16 @@ window.__ModuleLoader__.load({
376
385
  BoolRow({ label: '开启 QQ 远程审批(不勾=保持默认审批方式)', value: cfg.enableApprovals === true, onChange: function (v) { setCfg(function (c) { return { ...c, enableApprovals: v } }) } }),
377
386
  NumRow({ label: '审批等待秒数(超时自动拒绝;默认120)', value: Math.round((cfg.approvalTimeoutMs || 120000) / 1000), onChange: function (v) { setCfg(function (c) { return { ...c, approvalTimeoutMs: v * 1000 } }) } })),
378
387
 
388
+ h('div', { style: sectionTitle }, '⑥ 提问卡片(她问人时要不要在旁边干等)'),
389
+ h('p', { style: { fontSize: 12, color: '#888' } }, '她调用 ask_user_question 问你或群友时怎么等答案。后台提问=卡片发出去她就能接着聊天/干活, 对方答完之后答案会作为一条"提问卡片·回执"自动送回她的会话(她正忙→插进当前回合不打断; 她闲着→叫醒她接着处理), 超时没答也会收到一条"超时未答"的回执。阻塞等待=旧行为, 她的这一回合一直挂到对方作答或超时, 期间收不了新消息。'),
390
+ h('div', { style: boxStyle },
391
+ ['async', 'blocking'].map(function (m) {
392
+ var cur = cfg.questionsMode === 'blocking' ? 'blocking' : 'async'
393
+ return h('label', { style: { display: 'inline-flex', gap: 5, alignItems: 'center', fontSize: 12, color: '#333', cursor: 'pointer', marginRight: 16 } },
394
+ h('input', { type: 'radio', name: 'qqs-qmode', checked: cur === m, onChange: function () { setCfg(function (c) { return { ...c, questionsMode: m } }) } }),
395
+ m === 'async' ? '后台提问(推荐默认: 不卡她)' : '阻塞等待(旧行为: 她会卡住)')
396
+ })),
397
+
379
398
  h('div', { style: { ...card, margin: '10px 0', padding: '12px 16px' } },
380
399
  h('div', { style: { fontWeight: 700, fontSize: 13, marginBottom: 2 } }, '⚙ 群管理基础设置'),
381
400
  h('p', { style: { fontSize: 12, color: T.text3, margin: '0 0 6px' } }, '开启后 QQ 会话里可用群管理工具; 踢人/成员列表等官方未开放能力会在下方 Tab 里提示等待公测。'),
@@ -979,7 +998,7 @@ window.__ModuleLoader__.load({
979
998
  },
980
999
  injectRules: Array.isArray(v.injectRules) ? v.injectRules : [],
981
1000
  imageHint: typeof v.imageHint === 'boolean' ? v.imageHint : undefined,
982
- messageReference: v.messageReference !== false,
1001
+ messageReference: v.messageReference !== false,
983
1002
  diagLog: v.diagLog === true,
984
1003
  schedule: { targets: targets() },
985
1004
  groupPrompt: typeof v.groupPrompt === 'string' ? v.groupPrompt : DEFAULT_GROUP_PROMPT,
@@ -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;AAGnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AA4FlE,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAI1C,eAAO,MAAM,MAAM,UAAY,CAAC;AAWhC,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAiC;AAkD5F,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAErH;AACD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9E;AACD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAI/D;AAkFD,mDAAmD;AACnD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAq7DvD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBvC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BvC;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;IAE1C;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAExF;AAYD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExD;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAKxI;AA4RD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAyI;AACzL,wBAAgB,eAAe,IAAI,MAAM,CAA2F;AA8CpI;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CA+CtJ"}
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;AAGnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AA4FlE,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAI1C,eAAO,MAAM,MAAM,UAAY,CAAC;AAWhC,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAiC;AAkD5F,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAErH;AACD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9E;AACD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAI/D;AAkFD,mDAAmD;AACnD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA67DvD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBvC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BvC;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;IAE1C;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAExF;AAYD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExD;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAKxI;AA4RD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAyI;AACzL,wBAAgB,eAAe,IAAI,MAAM,CAA2F;AA8CpI;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CA+CtJ"}
@@ -2203,11 +2203,19 @@ export async function apply(ctx) {
2203
2203
  });
2204
2204
  // 逐个注册并记录结果(便于线上定位是哪个工具失败)
2205
2205
  // 供 syncContextTools 动态挂载用(apply 早于 pre-step,填好即可)
2206
- // ★ 自动热刷(2026-10-02):apply 早于任何回合 ⇒ 在这里注册一次,第一回合的工具表里就有,
2207
- // 不必依赖 pre-step(那只在回合内生效,会滞后一回合 —— 表现为"工具不存在,得 tools_reload")。
2208
- // 之后 pre-step 仍按会话开关刷新:开则保持、关则注销。
2206
+ // ⚠️ 2026-10-07 修(主人实测:"明明没开无上下文模式,也冒出 context_compact / context_drop /
2207
+ // context_memo 三个工具"):
2208
+ // 这里原来写死 `syncContextTools(ctx, true)` ⇒ 把三个上下文工具**无条件**注册进了**插件作用域**;
2209
+ // 而真正按会话开关裁决的是 pre-step 那次(作用在 **agent 作用域**)—— **两次是不同对象**,
2210
+ // 所以"开则保持、关则注销"压根够不到 apply 这一份 ⇒ **没开的会话也能调用**(与设计
2211
+ // "只在「无上下文模式+智能判断」开启时出现"冲突)。
2212
+ // 现在传 false:插件作用域不再预注册这三个工具(②段的 QQ 群管理工具照旧挂,语义不变),
2213
+ // 三者完全交给 pre-step 按会话裁决 —— 开了的会话照挂,没开的会话真的没有。
2214
+ // ⛔ 别再改回 true:那等于给所有会话开后门。
2215
+ // 代价:插件作用域不再"提前"备一份,开启的会话若在极早期回合看不到工具,等下一个 step
2216
+ // (pre-step 每个 step 都跑)即出现 —— 比"人人都有"划算得多。
2209
2217
  try {
2210
- syncContextTools(ctx, true);
2218
+ syncContextTools(ctx, false);
2211
2219
  }
2212
2220
  catch { /* ignore */ }
2213
2221
  const toolDefs = [