@tencent-connect/dsh-qqbot 0.4.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.
- package/.orange-ci.yml +2 -68
- package/CHANGELOG.md +45 -0
- package/CHANGELOG_EN.md +84 -0
- package/README.md +107 -17
- package/README_EN.md +107 -17
- package/cordis.patch.yml +1 -1
- package/cordis.yml +46 -3
- package/dist/commands/help.d.ts +6 -7
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +23 -7
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +7 -5
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +12 -12
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/misc.d.ts +10 -8
- package/dist/commands/misc.d.ts.map +1 -1
- package/dist/commands/misc.js +45 -8
- package/dist/commands/misc.js.map +1 -1
- package/dist/commands/model.d.ts +3 -4
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +8 -7
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/preset.d.ts +8 -0
- package/dist/commands/preset.d.ts.map +1 -0
- package/dist/commands/preset.js +52 -0
- package/dist/commands/preset.js.map +1 -0
- package/dist/commands/session.d.ts +11 -7
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +29 -13
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts +3 -4
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/types.d.ts +9 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +35 -1
- package/dist/config.js.map +1 -1
- package/dist/features/answer-parser.d.ts +9 -0
- package/dist/features/answer-parser.d.ts.map +1 -0
- package/dist/features/answer-parser.js +23 -0
- package/dist/features/answer-parser.js.map +1 -0
- package/dist/features/approval-channel.d.ts +76 -0
- package/dist/features/approval-channel.d.ts.map +1 -0
- package/dist/features/approval-channel.js +142 -0
- package/dist/features/approval-channel.js.map +1 -0
- package/dist/features/approval-renderer.d.ts +18 -0
- package/dist/features/approval-renderer.d.ts.map +1 -0
- package/dist/features/approval-renderer.js +52 -0
- package/dist/features/approval-renderer.js.map +1 -0
- package/dist/features/button-utils.d.ts +33 -0
- package/dist/features/button-utils.d.ts.map +1 -0
- package/dist/features/button-utils.js +27 -0
- package/dist/features/button-utils.js.map +1 -0
- package/dist/features/history-store.d.ts.map +1 -1
- package/dist/features/history-store.js +0 -1
- package/dist/features/history-store.js.map +1 -1
- package/dist/features/question-channel.d.ts +96 -0
- package/dist/features/question-channel.d.ts.map +1 -0
- package/dist/features/question-channel.js +234 -0
- package/dist/features/question-channel.js.map +1 -0
- package/dist/features/question-renderer.d.ts +20 -0
- package/dist/features/question-renderer.d.ts.map +1 -0
- package/dist/features/question-renderer.js +70 -0
- package/dist/features/question-renderer.js.map +1 -0
- package/dist/gateway/bootstrap.d.ts +3 -3
- package/dist/gateway/bootstrap.d.ts.map +1 -1
- package/dist/gateway/bootstrap.js +74 -8
- package/dist/gateway/bootstrap.js.map +1 -1
- package/dist/gateway/index.d.ts +2 -2
- package/dist/gateway/index.js +2 -2
- package/dist/gateway/middleware-setup.d.ts +3 -3
- package/dist/gateway/middleware-setup.d.ts.map +1 -1
- package/dist/gateway/middleware-setup.js +9 -7
- package/dist/gateway/middleware-setup.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -4
- package/dist/media/media-cleaner.d.ts +19 -0
- package/dist/media/media-cleaner.d.ts.map +1 -0
- package/dist/media/media-cleaner.js +81 -0
- package/dist/media/media-cleaner.js.map +1 -0
- package/dist/media/send-file-tool.d.ts +35 -0
- package/dist/media/send-file-tool.d.ts.map +1 -0
- package/dist/media/send-file-tool.js +150 -0
- package/dist/media/send-file-tool.js.map +1 -0
- package/dist/media/vision-tool.d.ts +16 -0
- package/dist/media/vision-tool.d.ts.map +1 -0
- package/dist/media/vision-tool.js +241 -0
- package/dist/media/vision-tool.js.map +1 -0
- package/dist/middleware/attachment.d.ts +3 -3
- package/dist/middleware/attachment.d.ts.map +1 -1
- package/dist/middleware/attachment.js +17 -4
- package/dist/middleware/attachment.js.map +1 -1
- package/dist/middleware/question-answer.d.ts +10 -0
- package/dist/middleware/question-answer.d.ts.map +1 -0
- package/dist/middleware/question-answer.js +19 -0
- package/dist/middleware/question-answer.js.map +1 -0
- package/dist/model/index.d.ts +4 -4
- package/dist/model/index.js +3 -3
- package/dist/model/model-resolver.d.ts +27 -13
- package/dist/model/model-resolver.d.ts.map +1 -1
- package/dist/model/model-resolver.js +82 -27
- package/dist/model/model-resolver.js.map +1 -1
- package/dist/model/prefs-store.d.ts +6 -1
- package/dist/model/prefs-store.d.ts.map +1 -1
- package/dist/model/prefs-store.js +25 -1
- package/dist/model/prefs-store.js.map +1 -1
- package/dist/model/settings-reader.d.ts +1 -1
- package/dist/session/idle-evictor.d.ts +2 -2
- package/dist/session/idle-evictor.d.ts.map +1 -1
- package/dist/session/idle-evictor.js +1 -1
- package/dist/session/idle-evictor.js.map +1 -1
- package/dist/session/index.d.ts +3 -3
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +2 -2
- package/dist/session/session-manager.d.ts +67 -9
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +216 -20
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/types.d.ts +47 -1
- package/dist/session/types.d.ts.map +1 -1
- package/dist/shared/index.d.ts +3 -3
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +3 -3
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/send-helper.js +1 -1
- package/dist/shared/utils.d.ts +2 -0
- package/dist/shared/utils.d.ts.map +1 -1
- package/dist/shared/utils.js +2 -2
- package/dist/shared/utils.js.map +1 -1
- package/dist/transport/attachment.d.ts +18 -7
- package/dist/transport/attachment.d.ts.map +1 -1
- package/dist/transport/attachment.js +77 -30
- package/dist/transport/attachment.js.map +1 -1
- package/dist/transport/inbound.d.ts +5 -4
- package/dist/transport/inbound.d.ts.map +1 -1
- package/dist/transport/inbound.js +120 -80
- package/dist/transport/inbound.js.map +1 -1
- package/dist/transport/index.d.ts +4 -4
- package/dist/transport/index.js +4 -4
- package/dist/transport/msgid-cache.d.ts +23 -0
- package/dist/transport/msgid-cache.d.ts.map +1 -0
- package/dist/transport/msgid-cache.js +57 -0
- package/dist/transport/msgid-cache.js.map +1 -0
- package/dist/transport/outbound-buffer.d.ts +9 -6
- package/dist/transport/outbound-buffer.d.ts.map +1 -1
- package/dist/transport/outbound-buffer.js +5 -5
- package/dist/transport/outbound-buffer.js.map +1 -1
- package/dist/transport/outbound.d.ts +9 -9
- package/dist/transport/outbound.d.ts.map +1 -1
- package/dist/transport/outbound.js +7 -7
- package/dist/transport/outbound.js.map +1 -1
- package/dist/transport/reply-limiter.d.ts +31 -0
- package/dist/transport/reply-limiter.d.ts.map +1 -0
- package/dist/transport/reply-limiter.js +50 -0
- package/dist/transport/reply-limiter.js.map +1 -0
- package/dist/transport/reply-target.d.ts +29 -0
- package/dist/transport/reply-target.d.ts.map +1 -0
- package/dist/transport/reply-target.js +55 -0
- package/dist/transport/reply-target.js.map +1 -0
- package/dist/transport/streaming-writer.d.ts +3 -3
- package/dist/transport/streaming-writer.d.ts.map +1 -1
- package/dist/transport/streaming-writer.js +1 -1
- package/dist/transport/streaming-writer.js.map +1 -1
- package/dist/transport/tool-presenter.d.ts +0 -1
- package/dist/transport/tool-presenter.d.ts.map +1 -1
- package/dist/transport/tool-presenter.js +0 -1
- package/dist/transport/tool-presenter.js.map +1 -1
- package/dist/types.d.ts +9 -15
- package/dist/types.d.ts.map +1 -1
- package/docs/assets/qqchannel.jpg +0 -0
- package/docs/assets/qqgroup.jpg +0 -0
- package/docs/assets/qrcode.png +0 -0
- 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: '@
|
|
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:
|
|
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)
|
package/dist/commands/help.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* /bot-help —
|
|
2
|
+
* /bot-help — 查看所有指令,按「通用能力 / QQBot 特有」分组展示
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 通用能力:对应底层 dsh agent 能力(new/compact/model/stop),无前缀
|
|
5
|
+
* QQBot 特有:插件自身封装(bot-ping/bot-version/bot-status/bot-help),带 bot- 前缀
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
|
|
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,
|
|
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"}
|
package/dist/commands/help.js
CHANGED
|
@@ -1,18 +1,34 @@
|
|
|
1
|
-
import { sendMarkdownChunked } from
|
|
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
|
-
|
|
6
|
+
category: 'qqbot',
|
|
7
|
+
description: '查看所有指令',
|
|
7
8
|
handler: async (cmdCtx) => {
|
|
8
|
-
const
|
|
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
|
-
|
|
14
|
+
(cmd.category === 'agent' ? agentCmds : qqbotCmds).push(cmd);
|
|
14
15
|
}
|
|
15
|
-
|
|
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":"
|
|
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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 斜杠命令注册中心
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 每个命令拆分为独立文件,此处仅编排。工厂函数注入依赖,统一导出命令列表。
|
|
5
|
+
*
|
|
6
|
+
* 命令按 category 分两类:
|
|
7
|
+
* - agent:底层 dsh agent 通用能力(new/compact/model/stop)
|
|
8
|
+
* - qqbot:插件自身特有(ping/version/status/help)
|
|
6
9
|
*/
|
|
7
|
-
import type {
|
|
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):
|
|
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
|
|
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"}
|
package/dist/commands/index.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { modelCommand } from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
-
|
|
18
|
-
//
|
|
16
|
+
presetCommand(deps),
|
|
17
|
+
stopCommand(deps),
|
|
18
|
+
// QQBot 特有
|
|
19
19
|
pingCommand(),
|
|
20
20
|
versionCommand(deps),
|
|
21
|
-
|
|
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":"
|
|
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"}
|
package/dist/commands/misc.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 杂项命令
|
|
3
|
+
*
|
|
4
|
+
* - /bot-ping /bot-version:QQBot 插件特有(连通性测试、版本信息)
|
|
5
|
+
* - /stop:中止当前生成(对应底层 agent cancel,通用能力)
|
|
3
6
|
*/
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
|
|
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):
|
|
10
|
-
/** /
|
|
11
|
-
export declare function stopCommand():
|
|
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
|
|
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"}
|
package/dist/commands/misc.js
CHANGED
|
@@ -1,30 +1,67 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
6
|
-
|
|
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
|
|
42
|
+
return `dsh-qqbot v${PLUGIN_VERSION} | model: ${modelInfo}`;
|
|
18
43
|
},
|
|
19
44
|
};
|
|
20
45
|
}
|
|
21
|
-
/** /
|
|
22
|
-
export function stopCommand() {
|
|
46
|
+
/** /stop — 中止当前生成(隐藏) */
|
|
47
|
+
export function stopCommand({ manager }) {
|
|
23
48
|
return {
|
|
24
|
-
name: '
|
|
49
|
+
name: 'stop',
|
|
50
|
+
category: 'agent',
|
|
25
51
|
description: '中止当前生成',
|
|
26
52
|
hidden: true,
|
|
27
|
-
handler: () =>
|
|
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":"
|
|
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"}
|
package/dist/commands/model.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 模型命令:/
|
|
2
|
+
* 模型命令:/model — 查看或切换模型
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
5
|
-
|
|
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,
|
|
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"}
|
package/dist/commands/model.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { getScopePeer, sendMarkdownChunked } from
|
|
1
|
+
import { getScopePeer, sendMarkdownChunked } from "../shared/index.js";
|
|
2
2
|
export function modelCommand({ manager, config }) {
|
|
3
3
|
return {
|
|
4
|
-
name: '
|
|
5
|
-
|
|
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="/
|
|
30
|
+
lines.push(`<qqbot-cmd-input text="/model ${modelPath}" show="/model ${displayName}"/>`);
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
|
-
lines.push('', '手动指定: `/
|
|
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 '用法: /
|
|
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":"
|
|
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
|
-
*
|
|
2
|
+
* 会话相关命令
|
|
3
|
+
*
|
|
4
|
+
* - /new(别名 /reset /clear):开始新会话(换新 sessionId)
|
|
5
|
+
* - /compact:原地压缩会话历史(保留 sessionId,摘要替换旧历史)
|
|
6
|
+
*
|
|
7
|
+
* 两者都对应底层 dsh agent 能力,分类为 agent(通用能力)。
|
|
3
8
|
*/
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
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"}
|
package/dist/commands/session.js
CHANGED
|
@@ -1,25 +1,41 @@
|
|
|
1
|
-
import { getScopePeer } from
|
|
2
|
-
/** /
|
|
3
|
-
export function
|
|
1
|
+
import { getScopePeer } from "../shared/index.js";
|
|
2
|
+
/** /new(别名 /reset /clear)— 开始新会话 */
|
|
3
|
+
export function newCommand({ manager }) {
|
|
4
4
|
return {
|
|
5
|
-
name: ['
|
|
6
|
-
|
|
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
|
-
/** /
|
|
15
|
-
export function
|
|
15
|
+
/** /compact — 原地压缩会话历史 */
|
|
16
|
+
export function compactCommand({ manager }) {
|
|
16
17
|
return {
|
|
17
|
-
name: '
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
name: 'compact',
|
|
19
|
+
category: 'agent',
|
|
20
|
+
description: '压缩会话历史(摘要替换旧记录,保留上下文)',
|
|
21
|
+
handler: async (cmdCtx) => {
|
|
20
22
|
const { scope, peerId } = getScopePeer(cmdCtx);
|
|
21
|
-
|
|
22
|
-
|
|
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":"
|
|
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 {
|
|
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):
|
|
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,
|
|
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"}
|