@tencent-connect/dsh-qqbot 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/.orange-ci.yml +2 -68
  2. package/CHANGELOG.md +45 -0
  3. package/CHANGELOG_EN.md +84 -0
  4. package/README.md +107 -17
  5. package/README_EN.md +107 -17
  6. package/cordis.patch.yml +1 -1
  7. package/cordis.yml +46 -3
  8. package/dist/commands/help.d.ts +6 -7
  9. package/dist/commands/help.d.ts.map +1 -1
  10. package/dist/commands/help.js +23 -7
  11. package/dist/commands/help.js.map +1 -1
  12. package/dist/commands/index.d.ts +7 -5
  13. package/dist/commands/index.d.ts.map +1 -1
  14. package/dist/commands/index.js +12 -12
  15. package/dist/commands/index.js.map +1 -1
  16. package/dist/commands/misc.d.ts +10 -8
  17. package/dist/commands/misc.d.ts.map +1 -1
  18. package/dist/commands/misc.js +45 -8
  19. package/dist/commands/misc.js.map +1 -1
  20. package/dist/commands/model.d.ts +3 -4
  21. package/dist/commands/model.d.ts.map +1 -1
  22. package/dist/commands/model.js +8 -7
  23. package/dist/commands/model.js.map +1 -1
  24. package/dist/commands/preset.d.ts +8 -0
  25. package/dist/commands/preset.d.ts.map +1 -0
  26. package/dist/commands/preset.js +52 -0
  27. package/dist/commands/preset.js.map +1 -0
  28. package/dist/commands/session.d.ts +11 -7
  29. package/dist/commands/session.d.ts.map +1 -1
  30. package/dist/commands/session.js +29 -13
  31. package/dist/commands/session.js.map +1 -1
  32. package/dist/commands/status.d.ts +3 -4
  33. package/dist/commands/status.d.ts.map +1 -1
  34. package/dist/commands/status.js +2 -1
  35. package/dist/commands/status.js.map +1 -1
  36. package/dist/commands/types.d.ts +9 -2
  37. package/dist/commands/types.d.ts.map +1 -1
  38. package/dist/config.d.ts +38 -0
  39. package/dist/config.d.ts.map +1 -1
  40. package/dist/config.js +35 -1
  41. package/dist/config.js.map +1 -1
  42. package/dist/features/answer-parser.d.ts +9 -0
  43. package/dist/features/answer-parser.d.ts.map +1 -0
  44. package/dist/features/answer-parser.js +23 -0
  45. package/dist/features/answer-parser.js.map +1 -0
  46. package/dist/features/approval-channel.d.ts +76 -0
  47. package/dist/features/approval-channel.d.ts.map +1 -0
  48. package/dist/features/approval-channel.js +142 -0
  49. package/dist/features/approval-channel.js.map +1 -0
  50. package/dist/features/approval-renderer.d.ts +18 -0
  51. package/dist/features/approval-renderer.d.ts.map +1 -0
  52. package/dist/features/approval-renderer.js +52 -0
  53. package/dist/features/approval-renderer.js.map +1 -0
  54. package/dist/features/button-utils.d.ts +33 -0
  55. package/dist/features/button-utils.d.ts.map +1 -0
  56. package/dist/features/button-utils.js +27 -0
  57. package/dist/features/button-utils.js.map +1 -0
  58. package/dist/features/history-store.d.ts.map +1 -1
  59. package/dist/features/history-store.js +0 -1
  60. package/dist/features/history-store.js.map +1 -1
  61. package/dist/features/question-channel.d.ts +96 -0
  62. package/dist/features/question-channel.d.ts.map +1 -0
  63. package/dist/features/question-channel.js +234 -0
  64. package/dist/features/question-channel.js.map +1 -0
  65. package/dist/features/question-renderer.d.ts +20 -0
  66. package/dist/features/question-renderer.d.ts.map +1 -0
  67. package/dist/features/question-renderer.js +70 -0
  68. package/dist/features/question-renderer.js.map +1 -0
  69. package/dist/gateway/bootstrap.d.ts +3 -3
  70. package/dist/gateway/bootstrap.d.ts.map +1 -1
  71. package/dist/gateway/bootstrap.js +76 -8
  72. package/dist/gateway/bootstrap.js.map +1 -1
  73. package/dist/gateway/index.d.ts +2 -2
  74. package/dist/gateway/index.js +2 -2
  75. package/dist/gateway/middleware-setup.d.ts +3 -3
  76. package/dist/gateway/middleware-setup.d.ts.map +1 -1
  77. package/dist/gateway/middleware-setup.js +9 -7
  78. package/dist/gateway/middleware-setup.js.map +1 -1
  79. package/dist/index.d.ts +2 -2
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +16 -11
  82. package/dist/index.js.map +1 -1
  83. package/dist/media/media-cleaner.d.ts +19 -0
  84. package/dist/media/media-cleaner.d.ts.map +1 -0
  85. package/dist/media/media-cleaner.js +81 -0
  86. package/dist/media/media-cleaner.js.map +1 -0
  87. package/dist/media/send-file-tool.d.ts +35 -0
  88. package/dist/media/send-file-tool.d.ts.map +1 -0
  89. package/dist/media/send-file-tool.js +150 -0
  90. package/dist/media/send-file-tool.js.map +1 -0
  91. package/dist/media/vision-tool.d.ts +16 -0
  92. package/dist/media/vision-tool.d.ts.map +1 -0
  93. package/dist/media/vision-tool.js +241 -0
  94. package/dist/media/vision-tool.js.map +1 -0
  95. package/dist/middleware/attachment.d.ts +3 -3
  96. package/dist/middleware/attachment.d.ts.map +1 -1
  97. package/dist/middleware/attachment.js +17 -4
  98. package/dist/middleware/attachment.js.map +1 -1
  99. package/dist/middleware/question-answer.d.ts +10 -0
  100. package/dist/middleware/question-answer.d.ts.map +1 -0
  101. package/dist/middleware/question-answer.js +19 -0
  102. package/dist/middleware/question-answer.js.map +1 -0
  103. package/dist/model/index.d.ts +4 -4
  104. package/dist/model/index.js +3 -3
  105. package/dist/model/model-resolver.d.ts +27 -13
  106. package/dist/model/model-resolver.d.ts.map +1 -1
  107. package/dist/model/model-resolver.js +82 -27
  108. package/dist/model/model-resolver.js.map +1 -1
  109. package/dist/model/prefs-store.d.ts +6 -1
  110. package/dist/model/prefs-store.d.ts.map +1 -1
  111. package/dist/model/prefs-store.js +25 -1
  112. package/dist/model/prefs-store.js.map +1 -1
  113. package/dist/model/settings-reader.d.ts +1 -1
  114. package/dist/session/idle-evictor.d.ts +2 -2
  115. package/dist/session/idle-evictor.d.ts.map +1 -1
  116. package/dist/session/idle-evictor.js +1 -1
  117. package/dist/session/idle-evictor.js.map +1 -1
  118. package/dist/session/index.d.ts +3 -3
  119. package/dist/session/index.d.ts.map +1 -1
  120. package/dist/session/index.js +2 -2
  121. package/dist/session/session-manager.d.ts +67 -9
  122. package/dist/session/session-manager.d.ts.map +1 -1
  123. package/dist/session/session-manager.js +216 -20
  124. package/dist/session/session-manager.js.map +1 -1
  125. package/dist/session/types.d.ts +47 -1
  126. package/dist/session/types.d.ts.map +1 -1
  127. package/dist/setup.d.ts +4 -4
  128. package/dist/setup.d.ts.map +1 -1
  129. package/dist/setup.js +63 -28
  130. package/dist/setup.js.map +1 -1
  131. package/dist/shared/index.d.ts +3 -3
  132. package/dist/shared/index.d.ts.map +1 -1
  133. package/dist/shared/index.js +3 -3
  134. package/dist/shared/index.js.map +1 -1
  135. package/dist/shared/send-helper.js +1 -1
  136. package/dist/shared/utils.d.ts +8 -1
  137. package/dist/shared/utils.d.ts.map +1 -1
  138. package/dist/shared/utils.js +18 -7
  139. package/dist/shared/utils.js.map +1 -1
  140. package/dist/transport/attachment.d.ts +18 -7
  141. package/dist/transport/attachment.d.ts.map +1 -1
  142. package/dist/transport/attachment.js +77 -30
  143. package/dist/transport/attachment.js.map +1 -1
  144. package/dist/transport/inbound.d.ts +5 -4
  145. package/dist/transport/inbound.d.ts.map +1 -1
  146. package/dist/transport/inbound.js +120 -80
  147. package/dist/transport/inbound.js.map +1 -1
  148. package/dist/transport/index.d.ts +4 -4
  149. package/dist/transport/index.js +4 -4
  150. package/dist/transport/msgid-cache.d.ts +23 -0
  151. package/dist/transport/msgid-cache.d.ts.map +1 -0
  152. package/dist/transport/msgid-cache.js +57 -0
  153. package/dist/transport/msgid-cache.js.map +1 -0
  154. package/dist/transport/outbound-buffer.d.ts +9 -6
  155. package/dist/transport/outbound-buffer.d.ts.map +1 -1
  156. package/dist/transport/outbound-buffer.js +5 -5
  157. package/dist/transport/outbound-buffer.js.map +1 -1
  158. package/dist/transport/outbound.d.ts +9 -9
  159. package/dist/transport/outbound.d.ts.map +1 -1
  160. package/dist/transport/outbound.js +7 -7
  161. package/dist/transport/outbound.js.map +1 -1
  162. package/dist/transport/reply-limiter.d.ts +31 -0
  163. package/dist/transport/reply-limiter.d.ts.map +1 -0
  164. package/dist/transport/reply-limiter.js +50 -0
  165. package/dist/transport/reply-limiter.js.map +1 -0
  166. package/dist/transport/reply-target.d.ts +29 -0
  167. package/dist/transport/reply-target.d.ts.map +1 -0
  168. package/dist/transport/reply-target.js +55 -0
  169. package/dist/transport/reply-target.js.map +1 -0
  170. package/dist/transport/streaming-writer.d.ts +3 -3
  171. package/dist/transport/streaming-writer.d.ts.map +1 -1
  172. package/dist/transport/streaming-writer.js +1 -1
  173. package/dist/transport/streaming-writer.js.map +1 -1
  174. package/dist/transport/tool-presenter.d.ts +0 -1
  175. package/dist/transport/tool-presenter.d.ts.map +1 -1
  176. package/dist/transport/tool-presenter.js +0 -1
  177. package/dist/transport/tool-presenter.js.map +1 -1
  178. package/dist/types.d.ts +9 -15
  179. package/dist/types.d.ts.map +1 -1
  180. package/docs/assets/qqchannel.jpg +0 -0
  181. package/docs/assets/qqgroup.jpg +0 -0
  182. package/docs/assets/qrcode.png +0 -0
  183. package/package.json +21 -4
package/cordis.yml CHANGED
@@ -7,6 +7,8 @@
7
7
  # QQBOT_SECRET - QQ Bot AppSecret
8
8
  # DEEPSEEK_API_KEY - DeepSeek API Key
9
9
  # DSH_CWD - Agent 工作目录(可选)
10
+ # HUNYUAN_API_KEY - 视觉模型 API Key(qqbot_describe_image 工具,hunyuan-vision)
11
+ # DSH_PRESET_ROOT - 系统预置 preset 目录(可选,默认 ./apps/cli/config/agent-presets)
10
12
 
11
13
  # ── 核心 spine ──
12
14
  - id: sessions
@@ -21,15 +23,52 @@
21
23
  - id: system-prompt
22
24
  name: '@deepseek-ai/dsh-system-prompt'
23
25
 
26
+ - id: approval
27
+ name: '@deepseek-ai/dsh-user-approval'
28
+ config:
29
+ policy: !!js "process.platform === 'win32' ? 'never' : ((process.env.DSH_PERMISSION_MODE ?? 'workspace-write') === 'danger-full-access' ? 'never' : 'ask')"
30
+
24
31
  - id: tools
25
32
  name: '@deepseek-ai/dsh-tools'
26
33
 
34
+ # ── Agent Preset 服务(/preset 命令切换 preset 依赖) ──
35
+ - id: agent-presets
36
+ name: '@deepseek-ai/dsh-agent-presets'
37
+ config:
38
+ default: standard
39
+ roots:
40
+ # 系统预置 preset 目录(deepseek-harness 的 apps/cli/config/agent-presets,含 standard/code/cordis/minimal)
41
+ - path: ${DSH_PRESET_ROOT:-./apps/cli/config/agent-presets}
42
+ trust: system
43
+ # includeUserRoot 默认 true:额外加载 $DSH_HOME/.agent-presets(用户自定义 preset)
44
+
45
+ # ── 附件存储(describe_image 工具的 attachments.saveImage 依赖) ──
46
+ - id: attachment-local
47
+ name: '@deepseek-ai/dsh-attachment-local'
48
+
27
49
  # ── LLM 适配器 ──
28
50
  - id: llm-deepseek
29
51
  name: '@deepseek-ai/dsh-llm-deepseek'
30
52
  config:
31
53
  apiKey: ${DEEPSEEK_API_KEY}
32
54
 
55
+ # 视觉模型适配器(qqbot_describe_image 工具用 llm.stream 调多模态模型)
56
+ - id: llm-pi-ai
57
+ name: '@deepseek-ai/dsh-llm-pi-ai'
58
+ config:
59
+ providers:
60
+ hunyuan:
61
+ displayName: Hunyuan Vision
62
+ apiKeyEnv: HUNYUAN_API_KEY
63
+ api: openai-completions
64
+ baseURL: https://api.hunyuan.cloud.tencent.com/v1
65
+ defaultInput: [text, image]
66
+ models:
67
+ - id: hunyuan-vision
68
+ name: Hunyuan Vision
69
+ contextWindow: 32768
70
+ maxTokens: 4096
71
+
33
72
  # ── 执行能力(按需启用) ──
34
73
  - id: tool-bash
35
74
  name: '@deepseek-ai/dsh-tool-bash'
@@ -55,15 +94,19 @@
55
94
 
56
95
  # ── QQ Bot IM 驱动 ──
57
96
  - id: im-qqbot
58
- name: '@deepseek-ai/dsh-im-qqbot'
97
+ name: '@tencent-connect/dsh-qqbot'
59
98
  config:
60
99
  appId: ${QQBOT_APPID}
61
100
  appSecret: ${QQBOT_SECRET}
62
- transport: websocket
63
101
  provider: deepseek
64
102
  model: deepseek-chat
65
103
  cwd: ${DSH_CWD:-/tmp/dsh-qqbot}
66
- requireMention: false
104
+ requireMention: true
67
105
  textChunkLimit: 4500
68
106
  sessionIdleTimeout: 1800000
107
+ showToolResults: false
69
108
  debug: false
109
+ vision:
110
+ enabled: false
111
+ provider: '' # 视觉模型 provider(需与上方 llm-pi-ai 配置的路由一致,如 hunyuan)
112
+ model: '' # 视觉模型 id(如 hunyuan-vision)
@@ -1,11 +1,10 @@
1
1
  /**
2
- * /bot-help — 查看所有指令以及用途
2
+ * /bot-help — 查看所有指令,按「通用能力 / QQBot 特有」分组展示
3
3
  *
4
- * 参考 openclaw-qqbot 的 bot-help.ts:遍历所有非隐藏命令,
5
- * 用 <qqbot-cmd-input> 展示为可点击按钮,以 Markdown 格式发送。
4
+ * 通用能力:对应底层 dsh agent 能力(new/compact/model/stop),无前缀
5
+ * QQBot 特有:插件自身封装(bot-ping/bot-version/bot-status/bot-help),带 bot- 前缀
6
6
  */
7
- import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
8
- import type { CommandDeps } from './types.js';
9
- /** /bot-help — 查看所有指令以及用途 */
10
- export declare function helpCommand({ config }: CommandDeps, allCommands: () => SlashCommand[]): SlashCommand;
7
+ import type { CommandDeps, CategorizedCommand } from './types.ts';
8
+ /** /bot-help — 分组查看所有指令 */
9
+ export declare function helpCommand({ config }: CommandDeps, allCommands: () => CategorizedCommand[]): CategorizedCommand;
11
10
  //# sourceMappingURL=help.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,EAAE,GAAG,YAAY,CAkBpG"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGlE,2BAA2B;AAC3B,wBAAgB,WAAW,CACzB,EAAE,MAAM,EAAE,EAAE,WAAW,EACvB,WAAW,EAAE,MAAM,kBAAkB,EAAE,GACtC,kBAAkB,CAoCpB"}
@@ -1,18 +1,34 @@
1
- import { sendMarkdownChunked } from '../shared/index.js';
2
- /** /bot-help — 查看所有指令以及用途 */
1
+ import { sendMarkdownChunked, PLUGIN_VERSION } from "../shared/index.js";
2
+ /** /bot-help — 分组查看所有指令 */
3
3
  export function helpCommand({ config }, allCommands) {
4
4
  return {
5
5
  name: 'bot-help',
6
- description: '查看所有指令以及用途',
6
+ category: 'qqbot',
7
+ description: '查看所有指令',
7
8
  handler: async (cmdCtx) => {
8
- const lines = ['### QQBot插件内置指令', ''];
9
+ const agentCmds = [];
10
+ const qqbotCmds = [];
9
11
  for (const cmd of allCommands()) {
10
- const name = Array.isArray(cmd.name) ? cmd.name[0] : cmd.name;
11
12
  if (cmd.hidden)
12
13
  continue;
13
- lines.push(`<qqbot-cmd-input text="/${name}" show="/${name}"/> ${cmd.description ?? ''}`);
14
+ (cmd.category === 'agent' ? agentCmds : qqbotCmds).push(cmd);
14
15
  }
15
- lines.push('', '> dsh-qqbot v0.1.0');
16
+ const render = (cmds) => {
17
+ const out = [];
18
+ for (const cmd of cmds) {
19
+ const name = Array.isArray(cmd.name) ? cmd.name[0] : cmd.name;
20
+ out.push(`<qqbot-cmd-input text="/${name}" show="/${name}"/> ${cmd.description ?? ''}`);
21
+ }
22
+ return out;
23
+ };
24
+ const lines = ['### 🤖 QQBot 指令', ''];
25
+ if (agentCmds.length > 0) {
26
+ lines.push('**通用能力**', '', ...render(agentCmds), '');
27
+ }
28
+ if (qqbotCmds.length > 0) {
29
+ lines.push('**插件内置指令**', '', ...render(qqbotCmds), '');
30
+ }
31
+ lines.push('', `> dsh-qqbot v${PLUGIN_VERSION}`);
16
32
  await sendMarkdownChunked(cmdCtx, lines.join('\n'), config.textChunkLimit);
17
33
  return { kind: 'noop' };
18
34
  },
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,6BAA6B;AAC7B,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAe,EAAE,WAAiC;IACpF,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YAEtC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC9D,IAAI,GAAG,CAAC,MAAM;oBAAE,SAAS;gBACzB,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,YAAY,IAAI,OAAO,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;YACrC,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3E,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzE,2BAA2B;AAC3B,MAAM,UAAU,WAAW,CACzB,EAAE,MAAM,EAAe,EACvB,WAAuC;IAEvC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,SAAS,GAAyB,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAyB,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,EAAE,CAAC;gBAChC,IAAI,GAAG,CAAC,MAAM;oBAAE,SAAS;gBACzB,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,IAA0B,EAAY,EAAE;gBACtD,MAAM,GAAG,GAAa,EAAE,CAAC;gBACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC9D,GAAG,CAAC,IAAI,CAAC,2BAA2B,IAAI,YAAY,IAAI,OAAO,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1F,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,KAAK,GAAa,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YAEhD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,cAAc,EAAE,CAAC,CAAC;YACjD,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3E,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,13 +1,15 @@
1
1
  /**
2
2
  * 斜杠命令注册中心
3
3
  *
4
- * 每个命令拆分为独立文件,此处仅编排。参考 openclaw-qqbot 的
5
- * commands/index.ts 模式:工厂函数注入依赖,统一导出命令列表。
4
+ * 每个命令拆分为独立文件,此处仅编排。工厂函数注入依赖,统一导出命令列表。
5
+ *
6
+ * 命令按 category 分两类:
7
+ * - agent:底层 dsh agent 通用能力(new/compact/model/stop)
8
+ * - qqbot:插件自身特有(ping/version/status/help)
6
9
  */
7
- import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
8
- import type { CommandDeps } from './types.js';
10
+ import type { CommandDeps, CategorizedCommand } from './types.ts';
9
11
  /**
10
12
  * 构建标准命令列表
11
13
  */
12
- export declare function buildCommandList(deps: CommandDeps): SlashCommand[];
14
+ export declare function buildCommandList(deps: CommandDeps): CategorizedCommand[];
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAO9C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,CAmBlE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQlE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,kBAAkB,EAAE,CAkBxE"}
@@ -1,24 +1,24 @@
1
- import { resetCommand, newCommand } from './session.js';
2
- import { modelCommand } from './model.js';
3
- import { statusCommand } from './status.js';
4
- import { helpCommand } from './help.js';
5
- import { pingCommand, versionCommand, stopCommand } from './misc.js';
1
+ import { newCommand, compactCommand } from "./session.js";
2
+ import { modelCommand } from "./model.js";
3
+ import { presetCommand } from "./preset.js";
4
+ import { statusCommand } from "./status.js";
5
+ import { helpCommand } from "./help.js";
6
+ import { pingCommand, versionCommand, stopCommand } from "./misc.js";
6
7
  /**
7
8
  * 构建标准命令列表
8
9
  */
9
10
  export function buildCommandList(deps) {
10
11
  const commands = [
11
- // 会话
12
- resetCommand(deps),
12
+ // 通用能力(底层 agent)
13
13
  newCommand(deps),
14
- // 模型
14
+ compactCommand(deps),
15
15
  modelCommand(deps),
16
- // 状态
17
- statusCommand(deps),
18
- // 杂项
16
+ presetCommand(deps),
17
+ stopCommand(deps),
18
+ // QQBot 特有
19
19
  pingCommand(),
20
20
  versionCommand(deps),
21
- stopCommand(),
21
+ statusCommand(deps),
22
22
  ];
23
23
  // help 需要访问完整列表(含自身),通过闭包惰性引用
24
24
  commands.push(helpCommand(deps, () => commands));
@@ -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,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErE;;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,KAAK;QACL,aAAa,CAAC,IAAI,CAAC;QACnB,KAAK;QACL,WAAW,EAAE;QACb,cAAc,CAAC,IAAI,CAAC;QACpB,WAAW,EAAE;KACd,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":"AAUA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,MAAM,QAAQ,GAAyB;QACrC,iBAAiB;QACjB,UAAU,CAAC,IAAI,CAAC;QAChB,cAAc,CAAC,IAAI,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC;QAClB,aAAa,CAAC,IAAI,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC;QACjB,WAAW;QACX,WAAW,EAAE;QACb,cAAc,CAAC,IAAI,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC;KACpB,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,12 +1,14 @@
1
1
  /**
2
- * 杂项命令:/ping /version /stop
2
+ * 杂项命令
3
+ *
4
+ * - /bot-ping /bot-version:QQBot 插件特有(连通性测试、版本信息)
5
+ * - /stop:中止当前生成(对应底层 agent cancel,通用能力)
3
6
  */
4
- import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
5
- import type { CommandDeps } from './types.js';
6
- /** /bot-ping — 连通性测试 */
7
- export declare function pingCommand(): SlashCommand;
7
+ import type { CommandDeps, CategorizedCommand } from './types.ts';
8
+ /** /bot-ping — 测试当前 dsh 与 QQ 连接的网络延迟 */
9
+ export declare function pingCommand(): CategorizedCommand;
8
10
  /** /bot-version — 查看版本信息 */
9
- export declare function versionCommand({ manager }: CommandDeps): SlashCommand;
10
- /** /bot-stop — 中止当前生成(隐藏) */
11
- export declare function stopCommand(): SlashCommand;
11
+ export declare function versionCommand({ manager }: CommandDeps): CategorizedCommand;
12
+ /** /stop — 中止当前生成(隐藏) */
13
+ export declare function stopCommand({ manager }: CommandDeps): CategorizedCommand;
12
14
  //# sourceMappingURL=misc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAwB;AACxB,wBAAgB,WAAW,IAAI,YAAY,CAM1C;AAED,4BAA4B;AAC5B,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAUrE;AAED,6BAA6B;AAC7B,wBAAgB,WAAW,IAAI,YAAY,CAO1C"}
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGlE,wCAAwC;AACxC,wBAAgB,WAAW,IAAI,kBAAkB,CA6BhD;AAED,4BAA4B;AAC5B,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,kBAAkB,CAW3E;AAED,yBAAyB;AACzB,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,kBAAkB,CAoBxE"}
@@ -1,30 +1,67 @@
1
- /** /bot-ping — 连通性测试 */
1
+ import { getScopePeer, PLUGIN_VERSION } from "../shared/index.js";
2
+ /** /bot-ping — 测试当前 dsh 与 QQ 连接的网络延迟 */
2
3
  export function pingCommand() {
3
4
  return {
4
5
  name: 'bot-ping',
5
- description: '连通性测试',
6
- handler: () => 'pong 🏓',
6
+ category: 'qqbot',
7
+ description: '测试当前 dsh 与 QQ 连接的网络延迟',
8
+ usage: [
9
+ '/bot-ping',
10
+ '',
11
+ '测试 dsh 主机与 QQ 服务器之间的网络延迟。',
12
+ '返回网络传输耗时和插件处理耗时。',
13
+ ].join('\n'),
14
+ handler: (ctx) => {
15
+ const now = Date.now();
16
+ const ts = ctx.message.timestamp;
17
+ const eventTime = ts ? new Date(ts).getTime() : NaN;
18
+ if (Number.isNaN(eventTime)) {
19
+ return '✅ pong!';
20
+ }
21
+ const totalMs = now - eventTime;
22
+ const qqToPlugin = ctx.receivedAt - eventTime;
23
+ const pluginProcess = now - ctx.receivedAt;
24
+ return [
25
+ '✅ pong!',
26
+ `⏱ 延迟: ${totalMs}ms`,
27
+ ` ├ 网络传输: ${qqToPlugin}ms`,
28
+ ` └ 插件处理: ${pluginProcess}ms`,
29
+ ].join('\n');
30
+ },
7
31
  };
8
32
  }
9
33
  /** /bot-version — 查看版本信息 */
10
34
  export function versionCommand({ manager }) {
11
35
  return {
12
36
  name: 'bot-version',
37
+ category: 'qqbot',
13
38
  description: '查看版本信息',
14
39
  handler: () => {
15
40
  const current = manager.getEffectiveModel('c2c', '');
16
41
  const modelInfo = current ? `${current.provider}/${current.model}` : '宿主默认';
17
- return `dsh-qqbot v0.1.0 | model: ${modelInfo}`;
42
+ return `dsh-qqbot v${PLUGIN_VERSION} | model: ${modelInfo}`;
18
43
  },
19
44
  };
20
45
  }
21
- /** /bot-stop — 中止当前生成(隐藏) */
22
- export function stopCommand() {
46
+ /** /stop — 中止当前生成(隐藏) */
47
+ export function stopCommand({ manager }) {
23
48
  return {
24
- name: 'bot-stop',
49
+ name: 'stop',
50
+ category: 'agent',
25
51
  description: '中止当前生成',
26
52
  hidden: true,
27
- handler: () => ({ kind: 'noop' }),
53
+ handler: (cmdCtx) => {
54
+ const { scope, peerId } = getScopePeer(cmdCtx);
55
+ const record = manager.getSessionRecord(scope, peerId);
56
+ // 会话存在不等于正在生成:只有 agent 处于 running 才算有进行中的回复
57
+ if (record === undefined || record.agent.status !== 'running') {
58
+ return '当前没有进行中的生成';
59
+ }
60
+ // cancel 会让当前轮以 turn/end (kind=interrupted) 收尾,
61
+ // 出站侧据此 flush 已生成的文本并关闭流式会话。
62
+ record.agent.cancel({ kind: 'user' });
63
+ return '已中止 ⛔';
64
+ },
28
65
  };
29
66
  }
30
67
  //# sourceMappingURL=misc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AAMA,wBAAwB;AACxB,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,OAAO;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAe;IACrD,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5E,OAAO,6BAA6B,SAAS,EAAE,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAElE,wCAAwC;AACxC,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE;YACL,WAAW;YACX,EAAE;YACF,2BAA2B;YAC3B,kBAAkB;SACnB,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;YACjC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACpD,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC;YAChC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;YAC9C,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC;YAC3C,OAAO;gBACL,SAAS;gBACT,SAAS,OAAO,IAAI;gBACpB,aAAa,UAAU,IAAI;gBAC3B,aAAa,aAAa,IAAI;aAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAe;IACrD,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5E,OAAO,cAAc,cAAc,aAAa,SAAS,EAAE,CAAC;QAC9D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAe;IAClD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACvD,4CAA4C;YAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9D,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,gDAAgD;YAChD,6BAA6B;YAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,7 +1,6 @@
1
1
  /**
2
- * 模型命令:/bot-model — 查看或切换模型
2
+ * 模型命令:/model — 查看或切换模型
3
3
  */
4
- import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
5
- import type { CommandDeps } from './types.js';
6
- export declare function modelCommand({ manager, config }: CommandDeps): SlashCommand;
4
+ import type { CommandDeps, CategorizedCommand } from './types.ts';
5
+ export declare function modelCommand({ manager, config }: CommandDeps): CategorizedCommand;
7
6
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.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,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,YAAY,CAgE3E"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,kBAAkB,CAiEjF"}
@@ -1,15 +1,16 @@
1
- import { getScopePeer, sendMarkdownChunked } from '../shared/index.js';
1
+ import { getScopePeer, sendMarkdownChunked } from "../shared/index.js";
2
2
  export function modelCommand({ manager, config }) {
3
3
  return {
4
- name: 'bot-model',
5
- description: '查看或切换模型(用法: /bot-model [provider/model])',
4
+ name: 'model',
5
+ category: 'agent',
6
+ description: '查看或切换模型(用法: /model [provider/model])',
6
7
  handler: async (cmdCtx) => {
7
8
  const { scope, peerId } = getScopePeer(cmdCtx);
8
9
  const args = (cmdCtx.command?.raw ?? '').trim();
9
10
  // 无参数:显示当前模型 + 可用模型列表(可点击)
10
11
  if (!args) {
11
12
  const current = manager.getEffectiveModel(scope, peerId);
12
- const models = manager.listAvailableModels();
13
+ const models = await manager.listAvailableModels();
13
14
  // 当前模型展示:优先用别名(name),找不到别名时回退到 provider/model id
14
15
  let currentDisplay = '宿主默认配置';
15
16
  if (current) {
@@ -26,10 +27,10 @@ export function modelCommand({ manager, config }) {
26
27
  for (const m of models) {
27
28
  const modelPath = `${m.provider}/${m.id}`;
28
29
  const displayName = m.name ? `${m.name}` : modelPath;
29
- lines.push(`<qqbot-cmd-input text="/bot-model ${modelPath}" show="/bot-model ${displayName}"/>`);
30
+ lines.push(`<qqbot-cmd-input text="/model ${modelPath}" show="/model ${displayName}"/>`);
30
31
  }
31
32
  }
32
- lines.push('', '手动指定: `/bot-model provider/model`');
33
+ lines.push('', '手动指定: `/model provider/model`');
33
34
  await sendMarkdownChunked(cmdCtx, lines.join('\n'), config.textChunkLimit);
34
35
  return { kind: 'noop' };
35
36
  }
@@ -48,7 +49,7 @@ export function modelCommand({ manager, config }) {
48
49
  model = args;
49
50
  }
50
51
  if (!provider || !model) {
51
- return '用法: /bot-model provider/model\n示例: /bot-model deepseek-official/deepseek-v4-flash';
52
+ return '用法: /model provider/model\n示例: /model deepseek-official/deepseek-v4-flash';
52
53
  }
53
54
  await manager.setModelOverride(scope, peerId, { provider, model });
54
55
  return `✅ 模型已切换: ${provider}/${model}\n立即生效,对话上下文保留。`;
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/commands/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Preset 命令:/preset — 查看或切换 agent preset
3
+ *
4
+ * 无参数列出可用 preset(可点击切换),有参数切换,reset/default 重置为默认。
5
+ */
6
+ import type { CommandDeps, CategorizedCommand } from './types.ts';
7
+ export declare function presetCommand({ manager, config }: CommandDeps): CategorizedCommand;
8
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../src/commands/preset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,kBAAkB,CAwDlF"}
@@ -0,0 +1,52 @@
1
+ import { getScopePeer, sendMarkdownChunked } from "../shared/index.js";
2
+ export function presetCommand({ manager, config }) {
3
+ return {
4
+ name: 'preset',
5
+ category: 'agent',
6
+ description: '查看或切换 agent preset(用法: /preset [id])',
7
+ handler: async (cmdCtx) => {
8
+ const { scope, peerId } = getScopePeer(cmdCtx);
9
+ const args = (cmdCtx.command?.raw ?? '').trim();
10
+ // 无参数:列出可用 preset + 当前
11
+ if (!args) {
12
+ const presets = await manager.listPresets();
13
+ if (presets.length === 0) {
14
+ return '当前部署无可用的 agent preset';
15
+ }
16
+ const record = manager.getSessionRecord(scope, peerId);
17
+ const currentId = record?.agentPreset ?? manager.getEffectivePreset(scope, peerId);
18
+ const lines = ['### 🧩 Agent Preset', ''];
19
+ lines.push(`**当前:** ${currentId ?? '默认'}`);
20
+ lines.push('', '**可用 preset(点击切换):**');
21
+ for (const p of presets) {
22
+ const display = p.name ? `${p.name} (${p.id})` : p.id;
23
+ lines.push(`<qqbot-cmd-input text="/preset ${p.id}" show="/preset ${display}"/>`);
24
+ }
25
+ lines.push('', '手动指定: `/preset <id>`,重置默认: `/preset reset`');
26
+ await sendMarkdownChunked(cmdCtx, lines.join('\n'), config.textChunkLimit);
27
+ return { kind: 'noop' };
28
+ }
29
+ // reset / default:清除 per-peer 覆盖,回到默认
30
+ if (args === 'reset' || args === 'default') {
31
+ const outcome = await manager.clearPresetOverride(scope, peerId);
32
+ return outcome.ok ? '✅ 已重置为默认 preset(新会话生效)' : '重置失败';
33
+ }
34
+ // 切换到指定 preset
35
+ const outcome = await manager.setPresetOverride(scope, peerId, args);
36
+ if (!outcome.ok) {
37
+ switch (outcome.reason) {
38
+ case 'unavailable':
39
+ return '当前部署不支持 agent preset(agentPresets 服务未注入)';
40
+ case 'unknown-preset':
41
+ return `未知 preset: ${args}`;
42
+ case 'broken':
43
+ return `preset ${args} 加载失败: ${outcome.message ?? '未知错误'}`;
44
+ default:
45
+ return `切换失败: ${outcome.message ?? '未知错误'}`;
46
+ }
47
+ }
48
+ return `✅ preset 已切换: ${args}\n新会话生效(当前会话保持原 preset,发送 /new 后生效)。`;
49
+ },
50
+ };
51
+ }
52
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/commands/preset.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,14 @@
1
1
  /**
2
- * 会话相关命令:/bot-reset /bot-clear /bot-new
2
+ * 会话相关命令
3
+ *
4
+ * - /new(别名 /reset /clear):开始新会话(换新 sessionId)
5
+ * - /compact:原地压缩会话历史(保留 sessionId,摘要替换旧历史)
6
+ *
7
+ * 两者都对应底层 dsh agent 能力,分类为 agent(通用能力)。
3
8
  */
4
- import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
5
- import type { CommandDeps } from './types.js';
6
- /** /bot-reset /bot-clear — 重置当前会话 */
7
- export declare function resetCommand({ manager }: CommandDeps): SlashCommand;
8
- /** /bot-new — 开始新会话 */
9
- export declare function newCommand({ manager }: CommandDeps): SlashCommand;
9
+ import type { CommandDeps, CategorizedCommand } from './types.ts';
10
+ /** /new(别名 /reset /clear)— 开始新会话 */
11
+ export declare function newCommand({ manager }: CommandDeps): CategorizedCommand;
12
+ /** /compact — 原地压缩会话历史 */
13
+ export declare function compactCommand({ manager }: CommandDeps): CategorizedCommand;
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;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGlE,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,kBAAkB,CAWvE;AAED,0BAA0B;AAC1B,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,kBAAkB,CA0B3E"}
@@ -1,25 +1,41 @@
1
- import { getScopePeer } from '../shared/index.js';
2
- /** /bot-reset /bot-clear — 重置当前会话 */
3
- export function resetCommand({ manager }) {
1
+ import { getScopePeer } from "../shared/index.js";
2
+ /** /new(别名 /reset /clear)— 开始新会话 */
3
+ export function newCommand({ manager }) {
4
4
  return {
5
- name: ['bot-reset', 'bot-clear'],
6
- description: '重置当前会话(清除上下文)',
5
+ name: ['new', 'reset', 'clear'],
6
+ category: 'agent',
7
+ description: '开始新会话(清空上下文)',
7
8
  handler: (cmdCtx) => {
8
9
  const { scope, peerId } = getScopePeer(cmdCtx);
9
10
  void manager.remove(scope, peerId);
10
- return '会话已重置 ✓';
11
+ return '已开启新会话 ✓';
11
12
  },
12
13
  };
13
14
  }
14
- /** /bot-new — 开始新会话 */
15
- export function newCommand({ manager }) {
15
+ /** /compact — 原地压缩会话历史 */
16
+ export function compactCommand({ manager }) {
16
17
  return {
17
- name: 'bot-new',
18
- description: '开始新会话(清空上下文)',
19
- handler: (cmdCtx) => {
18
+ name: 'compact',
19
+ category: 'agent',
20
+ description: '压缩会话历史(摘要替换旧记录,保留上下文)',
21
+ handler: async (cmdCtx) => {
20
22
  const { scope, peerId } = getScopePeer(cmdCtx);
21
- void manager.remove(scope, peerId);
22
- return '已开启新会话 ✓';
23
+ const outcome = await manager.compact(scope, peerId);
24
+ if (outcome.ok) {
25
+ if (!outcome.shadowed)
26
+ return '没有可压缩的历史';
27
+ return `✅ 已压缩 ${outcome.shadowed} 条历史记录(约 ${outcome.tokens ?? 0} tokens)`;
28
+ }
29
+ switch (outcome.reason) {
30
+ case 'no-session':
31
+ return '当前无活跃会话';
32
+ case 'busy':
33
+ return '正在生成中,无法压缩';
34
+ case 'unavailable':
35
+ return '压缩能力不可用(当前会话的 agent preset 未加载 compaction 服务)';
36
+ default:
37
+ return `压缩失败: ${outcome.message ?? '未知错误'}`;
38
+ }
23
39
  },
24
40
  };
25
41
  }
@@ -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":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,oCAAoC;AACpC,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAe;IACjD,OAAO;QACL,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QAC/B,QAAQ,EAAE,OAAO;QACjB,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;AAED,0BAA0B;AAC1B,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAe;IACrD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,uBAAuB;QACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAErD,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,QAAQ;oBAAE,OAAO,UAAU,CAAC;gBACzC,OAAO,SAAS,OAAO,CAAC,QAAQ,YAAY,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC;YAC5E,CAAC;YAED,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvB,KAAK,YAAY;oBACf,OAAO,SAAS,CAAC;gBACnB,KAAK,MAAM;oBACT,OAAO,YAAY,CAAC;gBACtB,KAAK,aAAa;oBAChB,OAAO,+CAA+C,CAAC;gBACzD;oBACE,OAAO,SAAS,OAAO,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,8 +1,7 @@
1
1
  /**
2
- * 状态命令:/bot-status
2
+ * 状态命令:/bot-status(QQBot 特有)
3
3
  */
4
- import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
5
- import type { CommandDeps } from './types.js';
4
+ import type { CommandDeps, CategorizedCommand } from './types.ts';
6
5
  /** /bot-status — 查看当前会话状态 */
7
- export declare function statusCommand({ manager }: CommandDeps): SlashCommand;
6
+ export declare function statusCommand({ manager }: CommandDeps): CategorizedCommand;
8
7
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.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,6BAA6B;AAC7B,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,YAAY,CAmBpE"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGlE,6BAA6B;AAC7B,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,kBAAkB,CAoB1E"}