@tencent-connect/dsh-qqbot 0.4.0 → 0.5.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 (216) hide show
  1. package/.orange-ci.yml +2 -68
  2. package/CHANGELOG.md +56 -0
  3. package/CHANGELOG_EN.md +95 -0
  4. package/README.md +119 -18
  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 +40 -0
  39. package/dist/config.d.ts.map +1 -1
  40. package/dist/config.js +45 -9
  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 +84 -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 +4 -3
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +44 -25
  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/bind-routes.d.ts +78 -0
  128. package/dist/setup/bind-routes.d.ts.map +1 -0
  129. package/dist/setup/bind-routes.js +311 -0
  130. package/dist/setup/bind-routes.js.map +1 -0
  131. package/dist/setup/binding-service.d.ts +86 -0
  132. package/dist/setup/binding-service.d.ts.map +1 -0
  133. package/dist/setup/binding-service.js +175 -0
  134. package/dist/setup/binding-service.js.map +1 -0
  135. package/dist/setup/index.d.ts +50 -0
  136. package/dist/setup/index.d.ts.map +1 -0
  137. package/dist/setup/index.js +98 -0
  138. package/dist/setup/index.js.map +1 -0
  139. package/dist/setup/persist.d.ts +41 -0
  140. package/dist/setup/persist.d.ts.map +1 -0
  141. package/dist/setup/persist.js +201 -0
  142. package/dist/setup/persist.js.map +1 -0
  143. package/dist/setup/presenters.d.ts +40 -0
  144. package/dist/setup/presenters.d.ts.map +1 -0
  145. package/dist/setup/presenters.js +84 -0
  146. package/dist/setup/presenters.js.map +1 -0
  147. package/dist/setup/qr-svg.d.ts +8 -0
  148. package/dist/setup/qr-svg.d.ts.map +1 -0
  149. package/dist/setup/qr-svg.js +20 -0
  150. package/dist/setup/qr-svg.js.map +1 -0
  151. package/dist/shared/bind-protocol.d.ts +42 -0
  152. package/dist/shared/bind-protocol.d.ts.map +1 -0
  153. package/dist/shared/bind-protocol.js +19 -0
  154. package/dist/shared/bind-protocol.js.map +1 -0
  155. package/dist/shared/index.d.ts +3 -3
  156. package/dist/shared/index.d.ts.map +1 -1
  157. package/dist/shared/index.js +3 -3
  158. package/dist/shared/index.js.map +1 -1
  159. package/dist/shared/send-helper.js +1 -1
  160. package/dist/shared/utils.d.ts +10 -3
  161. package/dist/shared/utils.d.ts.map +1 -1
  162. package/dist/shared/utils.js +47 -6
  163. package/dist/shared/utils.js.map +1 -1
  164. package/dist/transport/attachment.d.ts +18 -7
  165. package/dist/transport/attachment.d.ts.map +1 -1
  166. package/dist/transport/attachment.js +77 -30
  167. package/dist/transport/attachment.js.map +1 -1
  168. package/dist/transport/inbound.d.ts +5 -4
  169. package/dist/transport/inbound.d.ts.map +1 -1
  170. package/dist/transport/inbound.js +120 -80
  171. package/dist/transport/inbound.js.map +1 -1
  172. package/dist/transport/index.d.ts +4 -4
  173. package/dist/transport/index.js +4 -4
  174. package/dist/transport/msgid-cache.d.ts +23 -0
  175. package/dist/transport/msgid-cache.d.ts.map +1 -0
  176. package/dist/transport/msgid-cache.js +57 -0
  177. package/dist/transport/msgid-cache.js.map +1 -0
  178. package/dist/transport/outbound-buffer.d.ts +9 -6
  179. package/dist/transport/outbound-buffer.d.ts.map +1 -1
  180. package/dist/transport/outbound-buffer.js +5 -5
  181. package/dist/transport/outbound-buffer.js.map +1 -1
  182. package/dist/transport/outbound.d.ts +9 -9
  183. package/dist/transport/outbound.d.ts.map +1 -1
  184. package/dist/transport/outbound.js +7 -7
  185. package/dist/transport/outbound.js.map +1 -1
  186. package/dist/transport/reply-limiter.d.ts +31 -0
  187. package/dist/transport/reply-limiter.d.ts.map +1 -0
  188. package/dist/transport/reply-limiter.js +50 -0
  189. package/dist/transport/reply-limiter.js.map +1 -0
  190. package/dist/transport/reply-target.d.ts +29 -0
  191. package/dist/transport/reply-target.d.ts.map +1 -0
  192. package/dist/transport/reply-target.js +55 -0
  193. package/dist/transport/reply-target.js.map +1 -0
  194. package/dist/transport/streaming-writer.d.ts +3 -3
  195. package/dist/transport/streaming-writer.d.ts.map +1 -1
  196. package/dist/transport/streaming-writer.js +1 -1
  197. package/dist/transport/streaming-writer.js.map +1 -1
  198. package/dist/transport/tool-presenter.d.ts +0 -1
  199. package/dist/transport/tool-presenter.d.ts.map +1 -1
  200. package/dist/transport/tool-presenter.js +0 -1
  201. package/dist/transport/tool-presenter.js.map +1 -1
  202. package/dist/types.d.ts +9 -15
  203. package/dist/types.d.ts.map +1 -1
  204. package/docs/assets/qqchannel.jpg +0 -0
  205. package/docs/assets/qqgroup.jpg +0 -0
  206. package/docs/assets/qrcode.png +0 -0
  207. package/lib/client.js +996 -0
  208. package/lib/client.js.map +1 -0
  209. package/package.json +44 -7
  210. package/pnpm-workspace.yaml +1 -0
  211. package/tsconfig.client.json +19 -0
  212. package/tsdown.client.config.ts +58 -0
  213. package/dist/setup.d.ts +0 -24
  214. package/dist/setup.d.ts.map +0 -1
  215. package/dist/setup.js +0 -170
  216. package/dist/setup.js.map +0 -1
package/cordis.patch.yml CHANGED
@@ -22,7 +22,7 @@
22
22
  textChunkLimit: 4500
23
23
  sessionIdleTimeout: 1800000
24
24
  maxQueue: 20
25
- processingTimeoutMs: 120000
25
+ processingTimeoutMs: 1800000
26
26
  historyLimit: 10
27
27
  access:
28
28
  c2cMode: open
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 — 查看所有指令,按「通用能力 / QQ 机器人特有」分组展示
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 = ['### 🤖 QQ 机器人指令', ''];
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":"AAIA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAe;IAC3D,OAAO;QACL,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAEhD,2BAA2B;YAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAEnD,iDAAiD;gBACjD,IAAI,cAAc,GAAG,QAAQ,CAAC;gBAC9B,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC9F,cAAc,GAAG,OAAO,EAAE,IAAI,IAAI,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3E,CAAC;gBAED,MAAM,KAAK,GAAa;oBACtB,aAAa;oBACb,EAAE;oBACF,aAAa,cAAc,EAAE;iBAC9B,CAAC;gBAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;oBAClC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;wBACvB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;wBAC1C,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;wBACrD,KAAK,CAAC,IAAI,CAAC,iCAAiC,SAAS,kBAAkB,WAAW,KAAK,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,+BAA+B,CAAC,CAAC;gBAEhD,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;gBAC3E,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;YACnC,CAAC;YAED,uBAAuB;YACvB,IAAI,QAAgB,CAAC;YACrB,IAAI,KAAa,CAAC;YAElB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,+BAA+B;gBAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACzD,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,mBAAmB,CAAC;gBACpD,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YAED,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,2EAA2E,CAAC;YACrF,CAAC;YAED,MAAM,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACnE,OAAO,YAAY,QAAQ,IAAI,KAAK,iBAAiB,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -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