@zaofan/dsh-qqbot 0.9.6 → 1.0.1

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 (110) hide show
  1. package/README.md +400 -344
  2. package/README_EN.md +313 -281
  3. package/client/qqbot-settings.js +431 -10
  4. package/dist/channel-tools.d.ts +1 -1
  5. package/dist/channel-tools.d.ts.map +1 -1
  6. package/dist/channel-tools.js +166 -15
  7. package/dist/channel-tools.js.map +1 -1
  8. package/dist/commands/approve.d.ts +17 -0
  9. package/dist/commands/approve.d.ts.map +1 -0
  10. package/dist/commands/approve.js +24 -0
  11. package/dist/commands/approve.js.map +1 -0
  12. package/dist/commands/botplay.d.ts +15 -0
  13. package/dist/commands/botplay.d.ts.map +1 -0
  14. package/dist/commands/botplay.js +34 -0
  15. package/dist/commands/botplay.js.map +1 -0
  16. package/dist/commands/exit.d.ts +7 -0
  17. package/dist/commands/exit.d.ts.map +1 -0
  18. package/dist/commands/exit.js +85 -0
  19. package/dist/commands/exit.js.map +1 -0
  20. package/dist/commands/index.d.ts.map +1 -1
  21. package/dist/commands/index.js +14 -1
  22. package/dist/commands/index.js.map +1 -1
  23. package/dist/commands/outmode.d.ts +7 -3
  24. package/dist/commands/outmode.d.ts.map +1 -1
  25. package/dist/commands/outmode.js +19 -9
  26. package/dist/commands/outmode.js.map +1 -1
  27. package/dist/commands/permission.d.ts +18 -0
  28. package/dist/commands/permission.d.ts.map +1 -0
  29. package/dist/commands/permission.js +43 -0
  30. package/dist/commands/permission.js.map +1 -0
  31. package/dist/commands/session.d.ts +5 -1
  32. package/dist/commands/session.d.ts.map +1 -1
  33. package/dist/commands/session.js +51 -5
  34. package/dist/commands/session.js.map +1 -1
  35. package/dist/config.d.ts +73 -0
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js +89 -0
  38. package/dist/config.js.map +1 -1
  39. package/dist/features/approval-switch.d.ts +22 -0
  40. package/dist/features/approval-switch.d.ts.map +1 -0
  41. package/dist/features/approval-switch.js +10 -0
  42. package/dist/features/approval-switch.js.map +1 -0
  43. package/dist/features/botplay.d.ts +141 -0
  44. package/dist/features/botplay.d.ts.map +1 -0
  45. package/dist/features/botplay.js +558 -0
  46. package/dist/features/botplay.js.map +1 -0
  47. package/dist/features/extension-store.d.ts +27 -0
  48. package/dist/features/extension-store.d.ts.map +1 -0
  49. package/dist/features/extension-store.js +152 -0
  50. package/dist/features/extension-store.js.map +1 -0
  51. package/dist/features/group-hub.d.ts +40 -0
  52. package/dist/features/group-hub.d.ts.map +1 -0
  53. package/dist/features/group-hub.js +174 -0
  54. package/dist/features/group-hub.js.map +1 -0
  55. package/dist/features/group-join-request.d.ts.map +1 -1
  56. package/dist/features/group-join-request.js +35 -33
  57. package/dist/features/group-join-request.js.map +1 -1
  58. package/dist/features/qq-approval.d.ts.map +1 -1
  59. package/dist/features/qq-approval.js +3 -1
  60. package/dist/features/qq-approval.js.map +1 -1
  61. package/dist/features/scheduler.d.ts.map +1 -1
  62. package/dist/features/scheduler.js +2 -1
  63. package/dist/features/scheduler.js.map +1 -1
  64. package/dist/gateway/bootstrap.d.ts.map +1 -1
  65. package/dist/gateway/bootstrap.js +91 -11
  66. package/dist/gateway/bootstrap.js.map +1 -1
  67. package/dist/gateway/data-root.d.ts +15 -0
  68. package/dist/gateway/data-root.d.ts.map +1 -0
  69. package/dist/gateway/data-root.js +59 -0
  70. package/dist/gateway/data-root.js.map +1 -0
  71. package/dist/gateway/debounce.d.ts.map +1 -1
  72. package/dist/gateway/debounce.js +3 -2
  73. package/dist/gateway/debounce.js.map +1 -1
  74. package/dist/gateway/middleware-setup.d.ts +1 -1
  75. package/dist/gateway/middleware-setup.d.ts.map +1 -1
  76. package/dist/gateway/middleware-setup.js +42 -14
  77. package/dist/gateway/middleware-setup.js.map +1 -1
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +22 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/middleware/attachment.d.ts.map +1 -1
  82. package/dist/middleware/attachment.js +2 -1
  83. package/dist/middleware/attachment.js.map +1 -1
  84. package/dist/middleware/media-history.d.ts +2 -0
  85. package/dist/middleware/media-history.d.ts.map +1 -1
  86. package/dist/middleware/media-history.js +6 -1
  87. package/dist/middleware/media-history.js.map +1 -1
  88. package/dist/middleware/sticker-capture.d.ts.map +1 -1
  89. package/dist/middleware/sticker-capture.js +2 -2
  90. package/dist/middleware/sticker-capture.js.map +1 -1
  91. package/dist/model/model-resolver.d.ts +12 -0
  92. package/dist/model/model-resolver.d.ts.map +1 -1
  93. package/dist/model/model-resolver.js +24 -0
  94. package/dist/model/model-resolver.js.map +1 -1
  95. package/dist/model/prefs-store.d.ts +16 -0
  96. package/dist/model/prefs-store.d.ts.map +1 -1
  97. package/dist/model/prefs-store.js +48 -0
  98. package/dist/model/prefs-store.js.map +1 -1
  99. package/dist/session/session-manager.d.ts +41 -2
  100. package/dist/session/session-manager.d.ts.map +1 -1
  101. package/dist/session/session-manager.js +185 -21
  102. package/dist/session/session-manager.js.map +1 -1
  103. package/dist/transport/attachment.d.ts.map +1 -1
  104. package/dist/transport/attachment.js +2 -1
  105. package/dist/transport/attachment.js.map +1 -1
  106. package/dist/transport/inbound.d.ts.map +1 -1
  107. package/dist/transport/inbound.js +9 -1
  108. package/dist/transport/inbound.js.map +1 -1
  109. package/package.json +1 -1
  110. package/settings-host.js +177 -52
@@ -0,0 +1,7 @@
1
+ import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
2
+ /** 触发自重启: 生成独立重启助手并脱手运行(当前宿主被杀也能继续拉起新宿主) */
3
+ export declare function selfRestart(delayMs?: number, killWaitMs?: number): boolean;
4
+ export declare function botRestartCommand(): SlashCommand;
5
+ /** /bot-exit 旧命令兼容: 同样走自重启(杀+拉一条龙) */
6
+ export declare function botExitCommand(): SlashCommand;
7
+ //# sourceMappingURL=exit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit.d.ts","sourceRoot":"","sources":["../../src/commands/exit.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,4CAA4C;AAC5C,wBAAgB,WAAW,CAAC,OAAO,SAAO,EAAE,UAAU,SAAO,GAAG,OAAO,CAyCtE;AAED,wBAAgB,iBAAiB,IAAI,YAAY,CAWhD;AAED,sCAAsC;AACtC,wBAAgB,cAAc,IAAI,YAAY,CAW7C"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * /bot-restart — 通用自重启 dsh 宿主(2026-09-08, 主人定: 通用插件能力)
3
+ *
4
+ * 通用性: 不依赖任何硬编码路径/外部脚本 —— 动态自发现:
5
+ * - process.execPath = node 可执行文件; process.argv.slice(1) = 宿主启动参数(如 bin.js web);
6
+ * - 中间"重启助手"脚本写入系统 tmpdir(无中文路径坑), 用同一 node 解释器 detached 运行;
7
+ * - 助手: 延迟→杀当前宿主进程(process.kill)→等端口释放→按原命令重新 spawn 宿主(detached, unref)。
8
+ * 跨平台(win/mac/linux), 任何机器装了本插件即可用 /bot-restart(或兼容的 /bot-exit)。
9
+ */
10
+ import { spawn } from 'node:child_process';
11
+ import { writeFileSync, rmSync } from 'node:fs';
12
+ import { tmpdir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ /** 触发自重启: 生成独立重启助手并脱手运行(当前宿主被杀也能继续拉起新宿主) */
15
+ export function selfRestart(delayMs = 1600, killWaitMs = 2000) {
16
+ try {
17
+ const exe = process.execPath; // node 路径(动态)
18
+ // 宿主启动参数(动态, 如 [bin.js, 'web'])——自重启强制带 --no-open:
19
+ // 后台重启不再弹浏览器标签页(dsh web 启动默认开浏览器; 主人 2026-09-08 定)。
20
+ const args = [...process.argv.slice(1)];
21
+ if (!args.includes('--no-open'))
22
+ args.push('--no-open');
23
+ const pid = process.pid; // 当前宿主 PID(自己)
24
+ const cwd = process.cwd();
25
+ // 重启助手(独立 node 进程): 延迟 → 杀宿主 → 等 → 按原命令拉起新宿主
26
+ const helper = [
27
+ "const { spawn } = require('child_process');",
28
+ `const pid = ${JSON.stringify(pid)};`,
29
+ `const exe = ${JSON.stringify(exe)};`,
30
+ `const args = ${JSON.stringify(args)};`,
31
+ `const cwd = ${JSON.stringify(cwd)};`,
32
+ 'setTimeout(() => {',
33
+ ' try { process.kill(pid, \'SIGTERM\'); } catch {}',
34
+ ` setTimeout(() => {`,
35
+ ' try {',
36
+ ' const c = spawn(exe, args, { detached: true, stdio: \'ignore\', cwd });',
37
+ ' c.unref();',
38
+ ' try { require(\'fs\').unlinkSync(__filename); } catch {}',
39
+ ' } catch (e) { console.error(\'[restart-helper] spawn fail\', e); }',
40
+ ` }, ${killWaitMs});`,
41
+ `}, ${delayMs});`,
42
+ ].join('\n');
43
+ const tmpFile = join(tmpdir(), `dsh-restart-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.cjs`);
44
+ writeFileSync(tmpFile, helper, 'utf8');
45
+ // detached + unref: 重启助手脱离宿主独立存活, 宿主被杀它继续执行
46
+ const child = spawn(exe, [tmpFile], { detached: true, stdio: 'ignore', windowsHide: true });
47
+ child.unref();
48
+ // 宿主若被杀, 助手自己清理 tmp; 这里再兜底一个延迟删除(助手若已删则忽略)
49
+ setTimeout(() => { try {
50
+ rmSync(tmpFile, { force: true });
51
+ }
52
+ catch { /* 已删 */ } }, delayMs + killWaitMs + 8000).unref?.();
53
+ return true;
54
+ }
55
+ catch (err) {
56
+ console.error('[bot-restart] 触发失败: ' + (err instanceof Error ? err.message : String(err)));
57
+ return false;
58
+ }
59
+ }
60
+ export function botRestartCommand() {
61
+ return {
62
+ name: 'bot-restart',
63
+ description: '通用自重启 dsh 宿主(动态识别启动命令, 杀旧+自动拉起; 回执后约4秒完成, 期间短暂离线)',
64
+ handler: async () => {
65
+ const ok = selfRestart();
66
+ return ok
67
+ ? '🔁 dsh web 即将自重启(约4秒, 期间短暂离线)。重启完成后我会回来报到~'
68
+ : '❌ 自重启触发失败(看宿主日志)';
69
+ },
70
+ };
71
+ }
72
+ /** /bot-exit 旧命令兼容: 同样走自重启(杀+拉一条龙) */
73
+ export function botExitCommand() {
74
+ return {
75
+ name: 'bot-exit',
76
+ description: '(已升级) 结束并自重启 dsh 宿主, 同 /bot-restart',
77
+ handler: async () => {
78
+ const ok = selfRestart();
79
+ return ok
80
+ ? '👋 即将自重启(约4秒)。此命令已升级为 /bot-restart 同款(动态识别, 杀+自动拉起)。'
81
+ : '❌ 自重启触发失败';
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=exit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit.js","sourceRoot":"","sources":["../../src/commands/exit.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,CAwBlE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW9C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,CAkClE"}
@@ -1,9 +1,12 @@
1
- import { resetCommand, newCommand } from './session.js';
1
+ import { resetCommand, newCommand, newPresetCommand, presetsCommand } from './session.js';
2
2
  import { modelCommand, modelAliasCommand } from './model.js';
3
3
  import { statusCommand } from './status.js';
4
4
  import { helpCommand } from './help.js';
5
5
  import { pingCommand, versionCommand, stopCommand, toolsReloadCommand } from './misc.js';
6
6
  import { outModeCommand } from './outmode.js';
7
+ import { permissionCommand } from './permission.js';
8
+ import { botplayCommand } from './botplay.js';
9
+ import { botRestartCommand, botExitCommand } from './exit.js';
7
10
  /**
8
11
  * 构建标准命令列表
9
12
  */
@@ -12,6 +15,9 @@ export function buildCommandList(deps) {
12
15
  // 会话
13
16
  resetCommand(deps),
14
17
  newCommand(deps),
18
+ // 人格(preset): /new <id> 按会话切换, /presets 查看可用(2026-09-08)
19
+ newPresetCommand(deps),
20
+ presetsCommand(deps),
15
21
  // 模型
16
22
  modelCommand(deps),
17
23
  modelAliasCommand(deps), // /model 简写
@@ -19,6 +25,13 @@ export function buildCommandList(deps) {
19
25
  statusCommand(deps),
20
26
  // 出站模式(逃生通道: SDK 直通不经 LLM, nothink 也能唤醒)
21
27
  outModeCommand(deps),
28
+ // 权限档位切换(宿主 permissionPresets)
29
+ permissionCommand(deps),
30
+ // botplay 互动事件(/botplay 列表/触发发卡)
31
+ botplayCommand(deps),
32
+ // 自重启(杀旧+自动拉起 dsh web; /bot-exit 兼容同款)
33
+ botRestartCommand(),
34
+ botExitCommand(),
22
35
  // 杂项
23
36
  pingCommand(),
24
37
  versionCommand(deps),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,MAAM,QAAQ,GAAmB;QAC/B,KAAK;QACL,YAAY,CAAC,IAAI,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC;QAChB,KAAK;QACL,YAAY,CAAC,IAAI,CAAC;QAClB,iBAAiB,CAAC,IAAI,CAAC,EAAE,YAAY;QACrC,KAAK;QACL,aAAa,CAAC,IAAI,CAAC;QACnB,yCAAyC;QACzC,cAAc,CAAC,IAAI,CAAC;QACpB,KAAK;QACL,WAAW,EAAE;QACb,cAAc,CAAC,IAAI,CAAC;QACpB,WAAW,EAAE;QACb,YAAY;QACZ,kBAAkB,CAAC,IAAI,CAAC;KACzB,CAAC;IAEF,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE9D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,MAAM,QAAQ,GAAmB;QAC/B,KAAK;QACL,YAAY,CAAC,IAAI,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC;QAChB,yDAAyD;QACzD,gBAAgB,CAAC,IAAI,CAAC;QACtB,cAAc,CAAC,IAAI,CAAC;QACpB,KAAK;QACL,YAAY,CAAC,IAAI,CAAC;QAClB,iBAAiB,CAAC,IAAI,CAAC,EAAE,YAAY;QACrC,KAAK;QACL,aAAa,CAAC,IAAI,CAAC;QACnB,yCAAyC;QACzC,cAAc,CAAC,IAAI,CAAC;QACpB,+BAA+B;QAC/B,iBAAiB,CAAC,IAAI,CAAC;QACvB,iCAAiC;QACjC,cAAc,CAAC,IAAI,CAAC;QACpB,uCAAuC;QACvC,iBAAiB,EAAE;QACnB,cAAc,EAAE;QAChB,KAAK;QACL,WAAW,EAAE;QACb,cAAc,CAAC,IAAI,CAAC;QACpB,WAAW,EAAE;QACb,YAAY;QACZ,kBAAkB,CAAC,IAAI,CAAC;KACzB,CAAC;IAEF,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -9,9 +9,13 @@
9
9
  * 切换实现走 outbound-mode-switch 注册表(index.ts 注册): 改 live config 立即热生效 +
10
10
  * settings 持久化 → dock/设置面板与 live 三方一致。
11
11
  *
12
- * 模式切换后写一条「模拟用户消息」进当前会话(append 不唤醒, 2026-09-07 主人定):
13
- * 斜杠命令不经 LLM → AI 本来看不见模式被切; 以 user/message 形态落一条
14
- * "[主人切换了出站模式] …" 进会话上下文, 等下一次真人消息开回合时 AI 自然读到。
12
+ * 切换后通知 AI(回合安全, 2026-09-09 主人定/修复):
13
+ * 斜杠命令不经 LLM → AI 不知道模式被切。用宿主的 agent.inject 注入一条
14
+ * "模式已切换" 消息(不唤醒)。⚠️ 必须在 AI 回合结束后注入:
15
+ * 回合中(assistant tool_calls 未结算)往会话塞消息会把 tool_calls 与其 tool 结果
16
+ * 拆开 → 下次请求 INVALID_REQUEST(insufficient tool messages)。
17
+ * 做法: 先回执给主人, 后台 await agent.whenIdle()(回合结束)后再 inject ——
18
+ * 与 QQ 入站"回合中攒消息、turn/end 后整批进上下文"同一安全语义。
15
19
  */
16
20
  import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
17
21
  import type { CommandDeps } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"outmode.d.ts","sourceRoot":"","sources":["../../src/commands/outmode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqC9C,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,YAAY,CAuB7E"}
1
+ {"version":3,"file":"outmode.d.ts","sourceRoot":"","sources":["../../src/commands/outmode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkD9C,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,YAAY,CAuB7E"}
@@ -10,25 +10,35 @@ const LABEL = {
10
10
  function currentOf(config) {
11
11
  return normalizeOutboundMode(config.outboundMode);
12
12
  }
13
- /** 往当前会话 append 一条模拟用户消息(不唤醒): 让 AI 下回合能读到"主人切了模式" */
13
+ /** 回合结束后注入"模式已切换"(fire-and-forget; 命令先回执不等回合) */
14
14
  async function noteModeChange(manager, cmdCtx, mode) {
15
15
  try {
16
16
  const { scope, peerId } = getScopePeer(cmdCtx);
17
17
  const record = manager.findByPeer(scope, peerId);
18
- if (!record)
19
- return;
20
- const sess = record.agent?.session;
21
- if (!sess || typeof sess.append !== 'function')
18
+ const agent = record?.agent;
19
+ if (!agent)
22
20
  return;
23
21
  const text = `[主人切换了出站模式] 现在: ${mode} — ${LABEL[mode] ?? ''}`;
24
22
  const msg = createUserMessage({
25
23
  content: [{ type: 'text', text }],
26
24
  source: { kind: 'user' },
27
25
  });
28
- sess.append('user/message', msg, { surfaceOp: 'append' }); // 不唤醒, 只落上下文
26
+ const doInject = () => {
27
+ if (typeof agent.inject === 'function') {
28
+ agent.inject(msg); // 宿主回合安全注入: 不唤醒, 排到下个 step 组包
29
+ return;
30
+ }
31
+ const sess = agent.session;
32
+ if (sess && typeof sess.append === 'function') {
33
+ sess.append('user/message', msg, { surfaceOp: 'append' });
34
+ }
35
+ };
36
+ // 等当前回合结束再注入(回合空闲时 whenIdle 立即返回)
37
+ await (typeof agent.whenIdle === 'function' ? agent.whenIdle().catch(() => undefined) : Promise.resolve());
38
+ doInject();
29
39
  }
30
40
  catch {
31
- /* 记录失败不影响切换本身 */
41
+ /* 通知失败不影响切换本身 */
32
42
  }
33
43
  }
34
44
  export function outModeCommand({ manager, config }) {
@@ -48,8 +58,8 @@ export function outModeCommand({ manager, config }) {
48
58
  const want = normalizeOutboundMode(args.toLowerCase());
49
59
  const r = await switchOutboundMode(want);
50
60
  if (r.ok) {
51
- // 切换成功 → 模拟用户消息告知 AI(不唤醒, 下回合可见)
52
- await noteModeChange(manager, cmdCtx, r.mode);
61
+ // 先回执; 后台等回合结束再通知 AI(回合安全, 不拆 tool_calls)
62
+ void noteModeChange(manager, cmdCtx, r.mode);
53
63
  }
54
64
  return r.ok ? `✅ 出站模式已切换: **${r.mode}**\n${LABEL[r.mode] ?? ''}` : `切换失败: ${r.msg}`;
55
65
  },
@@ -1 +1 @@
1
- {"version":3,"file":"outmode.js","sourceRoot":"","sources":["../../src/commands/outmode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outmode.js","sourceRoot":"","sources":["../../src/commands/outmode.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEhG,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,KAAK,GAA2B;IACpC,QAAQ,EAAE,qCAAqC;IAC/C,OAAO,EAAE,2BAA2B;IACpC,MAAM,EAAE,+BAA+B;IACvC,OAAO,EAAE,uCAAuC;CACjD,CAAC;AAEF,SAAS,SAAS,CAAC,MAAqB;IACtC,OAAO,qBAAqB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,iDAAiD;AACjD,KAAK,UAAU,cAAc,CAAC,OAA+B,EAAE,MAAe,EAAE,IAAY;IAC1F,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAe,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,EAAE,KAIT,CAAC;QACd,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,IAAI,GAAG,mBAAmB,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACjC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SACzB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACvC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B;gBACjD,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;QACF,kCAAkC;QAClC,MAAM,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3G,QAAQ,EAAE,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAe;IAC7D,OAAO;QACL,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,2DAA2D;QACxE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,oCAAoC,CAAC,CAAC;gBAC7F,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;oBAC/D,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBACT,0CAA0C;gBAC1C,KAAK,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;QACtF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * /permission — 切换宿主权限档位(2026-09-08)
3
+ *
4
+ * 档位(宿主 dsh-permission-presets 提供, 可配置):
5
+ * workspace-write 工作区内可写, 更宽操作需审批(ask)
6
+ * danger-full-access 全访问, 不再弹审批(never)
7
+ * read-only 只读(若宿主配置了该档)
8
+ *
9
+ * 用法:
10
+ * /permission → 查看当前档 + 可用档
11
+ * /permission <档名> → 切换到该档(即时生效, 作用于当前会话)
12
+ *
13
+ * ⚠️ 与 /approve 6位码(放行单笔审批)不同: 本命令切的是"会话级权限档位"。
14
+ */
15
+ import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
16
+ import type { CommandDeps } from './types.js';
17
+ export declare function permissionCommand({ manager }: CommandDeps): SlashCommand;
18
+ //# sourceMappingURL=permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../src/commands/permission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgB9C,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CA2BxE"}
@@ -0,0 +1,43 @@
1
+ import { getScopePeer } from '../shared/index.js';
2
+ /** 中文/简写 → 宿主档名映射(主人 2026-09-08: 懒得打长英文) */
3
+ const ALIAS = {
4
+ '只读': 'read-only', 'readonly': 'read-only', 'ro': 'read-only',
5
+ '工作区': 'workspace-write', '工作区写': 'workspace-write', 'workspace': 'workspace-write', 'ww': 'workspace-write', '写': 'workspace-write',
6
+ '全权': 'danger-full-access', '全访问': 'danger-full-access', '放开': 'danger-full-access', 'danger': 'danger-full-access', 'never': 'danger-full-access', 'fa': 'danger-full-access',
7
+ };
8
+ /** 反查: 宿主档名 → 好记中文(列表展示用) */
9
+ const LABEL = {
10
+ 'read-only': '只读',
11
+ 'workspace-write': '工作区写',
12
+ 'danger-full-access': '全权(不审批)',
13
+ };
14
+ export function permissionCommand({ manager }) {
15
+ return {
16
+ name: ['permission', 'perm', '权限'],
17
+ description: '切换权限档: /perm [只读|工作区|全权] 查看/切换',
18
+ usage: '/perm [只读|工作区|全权|档名]',
19
+ handler: async (cmdCtx) => {
20
+ const { scope, peerId } = getScopePeer(cmdCtx);
21
+ const rawArgs = String((cmdCtx.command?.raw ?? '').trim());
22
+ const list = await manager.listPermissionPresets();
23
+ const cur = manager.currentPermissionPreset(scope, peerId);
24
+ if (!rawArgs) {
25
+ if (list.length === 0)
26
+ return '宿主未提供 permissionPresets 服务(需装配 dsh-permission-presets)';
27
+ const curText = cur
28
+ ? (LABEL[cur] ? `${cur}(${LABEL[cur]})` : cur)
29
+ : '(会话尚无权限档记录 = 走宿主默认, 直接 /perm 切一个即可生效)';
30
+ const lines = ['### 🔐 权限档', '', `**当前: ${curText}**`, '', '发 `/perm 只读|工作区|全权` 或 `/perm 档名` 切换:'];
31
+ for (const p of list) {
32
+ lines.push(`- **${p.value}**${LABEL[p.value] ? `(${LABEL[p.value]})` : (p.name && p.name !== p.value ? `(${p.name})` : '')}${p.description ? ` — ${p.description}` : ''}`);
33
+ }
34
+ return lines.join('\n');
35
+ }
36
+ // 中文/简写归一 → 真实档名(宿主没配 read-only 时会失败并列出可用)
37
+ const mapped = ALIAS[rawArgs] ?? ALIAS[rawArgs.toLowerCase()] ?? rawArgs;
38
+ const r = await manager.switchPermissionPreset(scope, peerId, mapped);
39
+ return r.msg;
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/commands/permission.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,10 @@ import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
5
5
  import type { CommandDeps } from './types.js';
6
6
  /** /bot-reset /bot-clear — 重置当前会话 */
7
7
  export declare function resetCommand({ manager }: CommandDeps): SlashCommand;
8
- /** /bot-new — 开始新会话 */
8
+ /** /bot-new — 开启新会话(真 fork: 旧会话存档可回看, 本会话开新档; 2026-09-08 修假实现) */
9
9
  export declare function newCommand({ manager }: CommandDeps): SlashCommand;
10
+ /** /new <preset> — 按会话切换 agent preset(2026-09-08, 学 DLive 社区版; fork 开新档用指定人格) */
11
+ export declare function newPresetCommand({ manager }: CommandDeps): SlashCommand;
12
+ /** /presets — 列出全部可用 agent preset(2026-09-08, 配合 /new 切人格) */
13
+ export declare function presetsCommand({ manager }: CommandDeps): SlashCommand;
10
14
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUnE;AAED,uBAAuB;AACvB,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUjE"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUnE;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUjE;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CA0BvE;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAerE"}
@@ -11,15 +11,61 @@ export function resetCommand({ manager }) {
11
11
  },
12
12
  };
13
13
  }
14
- /** /bot-new — 开始新会话 */
14
+ /** /bot-new — 开启新会话(真 fork: 旧会话存档可回看, 本会话开新档; 2026-09-08 修假实现) */
15
15
  export function newCommand({ manager }) {
16
16
  return {
17
17
  name: 'bot-new',
18
- description: '开始新会话(清空上下文)',
19
- handler: (cmdCtx) => {
18
+ description: '开启新会话(保留旧会话存档, 可回看)',
19
+ handler: async (cmdCtx) => {
20
20
  const { scope, peerId } = getScopePeer(cmdCtx);
21
- void manager.remove(scope, peerId);
22
- return '已开启新会话 ✓';
21
+ const ok = await manager.startNewSession(scope, peerId, false);
22
+ return ok ? '已开启新会话 ✓(旧会话已存档)' : '当前没有活跃会话, 无需开新';
23
+ },
24
+ };
25
+ }
26
+ /** /new <preset> — 按会话切换 agent preset(2026-09-08, 学 DLive 社区版; fork 开新档用指定人格) */
27
+ export function newPresetCommand({ manager }) {
28
+ return {
29
+ name: 'new',
30
+ description: '以指定人格开新会话: /new <preset>(如 /new code); 不带参=/bot-new; /presets 查看可选人格',
31
+ usage: '/new [preset]',
32
+ handler: async (cmdCtx) => {
33
+ const { scope, peerId } = getScopePeer(cmdCtx);
34
+ const args = String((cmdCtx.command?.raw ?? '').trim());
35
+ if (!args) {
36
+ const ok = await manager.startNewSession(scope, peerId, false);
37
+ return ok ? '已开启新会话 ✓(使用当前默认人格)' : '当前没有活跃会话, 无需开新';
38
+ }
39
+ // 精确匹配 preset id(先验存在, 避免未知 id 建错会话)
40
+ const list = await manager.listPresets();
41
+ const hit = list.find((p) => p.id === args && !p.broken);
42
+ if (!hit) {
43
+ const lines = [`找不到人格「${args}」— 可用:`];
44
+ for (const p of list) {
45
+ lines.push(`- ${p.id}${p.name ? `(${p.name})` : ''}${p.broken ? ' [损坏]' : ''}`);
46
+ }
47
+ return lines.join('\n');
48
+ }
49
+ const ok = await manager.startNewSession(scope, peerId, false, hit.id);
50
+ return ok ? `✅ 已用人格「${hit.id}」开启新会话(旧会话存档可回看)` : '当前没有活跃会话, 请先聊一句再切';
51
+ },
52
+ };
53
+ }
54
+ /** /presets — 列出全部可用 agent preset(2026-09-08, 配合 /new 切人格) */
55
+ export function presetsCommand({ manager }) {
56
+ return {
57
+ name: 'presets',
58
+ description: '列出可用人格(preset), 配合 /new <id> 切换',
59
+ handler: async () => {
60
+ const list = await manager.listPresets();
61
+ if (list.length === 0)
62
+ return '宿主暂未提供 agent preset(或未挂载 agentPresets 服务)';
63
+ const lines = ['### 🧬 可用人格(preset)', '', '发 `/new <id>` 以该人格开新会话:'];
64
+ for (const p of list) {
65
+ lines.push(`- **${p.id}**${p.name ? ` ${p.name}` : ''}${p.broken ? ' ⚠️损坏' : ''}`);
66
+ }
67
+ lines.push('', '提示: /new 不带参=用默认人格开新档; 切人格不丢旧会话(存档可回看)');
68
+ return lines.join('\n');
23
69
  },
24
70
  };
25
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qCAAqC;AACrC,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAe;IACnD,OAAO;QACL,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;QAChC,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAe;IACjD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,UAAU,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -100,6 +100,57 @@ export interface ScheduleTargetConfig {
100
100
  export interface ScheduleConfig {
101
101
  targets: ScheduleTargetConfig[];
102
102
  }
103
+ /** botAction 行为类型: reply_text=回指定文本 | jump_url=跳转(官方action.type=0) | callback=仅回调结算无bot回复 | command=点击执行斜杠命令(host侧直发) */
104
+ export type BotplayActionType = 'reply_text' | 'jump_url' | 'callback' | 'command';
105
+ /** llmEffect.mode 三档: no_append=纯bot行为AI不知 / append_silent=记录不唤醒 / append_wake=记录并唤醒AI */
106
+ export type BotplayEffectMode = 'no_append' | 'append_silent' | 'append_wake';
107
+ /** perm.type: all=所有人 / triggerer=仅触发者本人 / owner=主人白名单 / users=指定openid列表 */
108
+ export type BotplayPermType = 'all' | 'triggerer' | 'owner' | 'users';
109
+ /** 一个按钮的完整定义 */
110
+ export interface BotplayButtonConfig {
111
+ /** 按钮 id(回调 data 编码 事件id::按钮id; 建议 [a-zA-Z0-9_-] 避免分隔符冲突) */
112
+ id: string;
113
+ /** 按钮显示文字 */
114
+ label: string;
115
+ /** 点击后显示文字(visitedLabel), 留空=label */
116
+ visitedLabel?: string;
117
+ /** 0灰 1蓝 */
118
+ style?: number;
119
+ /** 点击后 bot(非LLM)直接做什么 */
120
+ botAction: {
121
+ type: BotplayActionType;
122
+ /** reply_text 用(文本); command 用(斜杠命令名, 如 bot-status) */
123
+ text?: string;
124
+ /** jump_url 用 */
125
+ url?: string;
126
+ };
127
+ /** 点击事件对 LLM 的影响(自定义三档) */
128
+ llmEffect?: {
129
+ mode: BotplayEffectMode;
130
+ /** 自定义记录文本模板, 支持 {label} 占位; 空=默认可读描述 */
131
+ contextText?: string;
132
+ };
133
+ }
134
+ /** 一个可装配互动事件 */
135
+ export interface BotplayEventConfig {
136
+ /** 事件唯一 id(斜杠触发用; 建议 [a-zA-Z0-9_-]) */
137
+ id: string;
138
+ /** 显示名(/botplay 列表显示) */
139
+ name: string;
140
+ /** 接受点击数: 0=不限; N=单次触发实例最多点 N 次(点满失效) */
141
+ maxClicks?: number;
142
+ /** 发卡后有效期(秒): 超时按钮不再受理 */
143
+ expireSec?: number;
144
+ /** 每行几个按钮(Phase2: 1~5, 默认1=竖排; QQ 上限 5行×5钮) */
145
+ buttonsPerRow?: number;
146
+ /** 权限自定义(默认 all; triggerer=仅触发者本人) */
147
+ perm?: {
148
+ type: BotplayPermType;
149
+ /** users 时填 openid 列表; owner 时可用(留空=取群主白名单) */
150
+ userIds?: string[];
151
+ };
152
+ buttons: BotplayButtonConfig[];
153
+ }
103
154
  /** QQ 群管理(2026-09-05): 总开关 + 主人 openid 白名单(空=不校验; 建议填主人与常用小号) */
104
155
  export interface GroupAdminConfig {
105
156
  enabled: boolean;
@@ -118,9 +169,20 @@ export interface GroupAdminConfig {
118
169
  watchJoinRequests: boolean;
119
170
  /** 收到新入群申请事件时是否在该群内发一条 bot 提醒消息(默认开; 需机器人=该群管理员) */
120
171
  notifyInGroup: boolean;
172
+ /**
173
+ * 群组管理器会话 id(2026-09-09 M2): 该机器人各群的"群事件"(入群申请/新成员加入/机器人被拉群)
174
+ * 汇总注入到这一个会话(dock 群组管理 tab 一键设为当前 web 会话; 该会话须绑定某 QQ 群/私聊,
175
+ * 注入姿势=whenIdle 回合空闲后 append user/message 不唤醒 —— web 流可见、不坏聊天记录)。
176
+ * 配置了且注入成功 → 不再在该群内发提醒(统一收 hub, 避免重复打扰)。
177
+ */
178
+ hubSessionId: string;
179
+ /** 群事件转发到群组管理器的开关(默认开; 置 false 后只在原群内提醒) */
180
+ hubNotify: boolean;
121
181
  }
122
182
  /** Web 设置可编辑子集(不含 appId/appSecret 等敏感/底层字段) */
123
183
  export interface EditableConfig {
184
+ /** 插件数据根目录(可选; 缺省=cwd): 表情包/.qqbot/.qqbot-extensions 统一挂其下, 与工作区其他文件分离 */
185
+ dataRoot?: string;
124
186
  behavior: BehaviorConfig;
125
187
  groupAdmin: GroupAdminConfig;
126
188
  sticker: {
@@ -141,12 +203,19 @@ export interface EditableConfig {
141
203
  approvalTimeoutMs?: number;
142
204
  /** 出站模式: adaptive=适配主动(默认; 前5次带msg_id被动回复后自动转主动), passive=全被动回复, silent=完全不出站(思考但不发), nothink=完全不思考(QQ入站不唤醒LLM, 仅记录; 仅设置页可配防自锁) */
143
205
  outboundMode?: 'adaptive' | 'active' | 'passive' | 'silent' | 'nothink';
206
+ /** botplay 互动事件列表(dock「🎮 互动事件」装配器编辑; live 热更, 无需重启) */
207
+ botplayEvents: BotplayEventConfig[];
144
208
  }
145
209
  /**
146
210
  * 群聊默认常驻守则(表情包礼仪, P2 品味层)。
147
211
  * 由 qqbot 通道注入 agentBody(scope=group 时), 所有走 QQ 的 preset 通用, 不修改任何 persona。
148
212
  */
149
213
  export declare const DEFAULT_GROUP_PROMPT: string;
214
+ /**
215
+ * 通道固定注入上下文(2026-09-09): 与可编辑群守则(groupPrompt)无关、无条件注入每个 QQ 会话,
216
+ * 保证任何 AI/任何预设都会收到 QQ 通道的基础使用规则(即使群守则被清空/覆盖)。
217
+ */
218
+ export declare const FIXED_CHANNEL_CONTEXT: string;
150
219
  /** Web 设置页可编辑项的 schema(behavior/sticker.gates/injectRules/groupPrompt/schedule) */
151
220
  export declare const EditableConfigSchema: Schema<EditableConfig>;
152
221
  export interface ImQQBotConfig {
@@ -162,6 +231,8 @@ export interface ImQQBotConfig {
162
231
  preset?: string;
163
232
  /** Agent 工作目录(缺省回落到进程 cwd) */
164
233
  cwd?: string;
234
+ /** 插件数据根目录(可选): 表情包/.qqbot/扩展等数据统一挂其下, 不混进 cwd; 缺省=用 cwd(向后兼容)。设 cwd 下子目录(如 cwd/dshqqbot)即可把插件数据与工作区其他文件分开 */
235
+ dataRoot?: string;
165
236
  /** Web 设置命名空间(多账号时每个实例唯一, 默认 im-qqbot; 同进程多实例必须互不相同) */
166
237
  settingsNs?: string;
167
238
  /** 是否启用群消息 @mention 门控 */
@@ -206,6 +277,8 @@ export interface ImQQBotConfig {
206
277
  enableUserQuestions?: boolean;
207
278
  /** 出站模式: adaptive=适配主动(默认) / active=旧全主动(兼容) / passive=全被动回复 / silent=完全不出站 / nothink=完全不思考(仅设置页可配) */
208
279
  outboundMode?: 'adaptive' | 'active' | 'passive' | 'silent' | 'nothink';
280
+ /** botplay 互动事件列表(运行时 live, 与 settings 同源) */
281
+ botplayEvents: BotplayEventConfig[];
209
282
  }
210
283
  export declare const ConfigSchema: Schema<ImQQBotConfig>;
211
284
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}