@cxyhhhhh/dsh-qqbot 0.4.0-dev.202608272143 → 0.5.0-dev.202610101526

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 (50) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/CHANGELOG_EN.md +84 -0
  3. package/README.md +77 -5
  4. package/README_EN.md +65 -4
  5. package/dist/commands/misc.d.ts +1 -1
  6. package/dist/commands/misc.d.ts.map +1 -1
  7. package/dist/commands/misc.js +25 -3
  8. package/dist/commands/misc.js.map +1 -1
  9. package/dist/features/approval-channel.d.ts.map +1 -1
  10. package/dist/features/approval-channel.js +0 -3
  11. package/dist/features/approval-channel.js.map +1 -1
  12. package/dist/index.d.ts +2 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -3
  15. package/dist/index.js.map +1 -1
  16. package/dist/setup/bind-routes.d.ts +35 -0
  17. package/dist/setup/bind-routes.d.ts.map +1 -0
  18. package/dist/setup/bind-routes.js +79 -0
  19. package/dist/setup/bind-routes.js.map +1 -0
  20. package/dist/setup/binding-service.d.ts +86 -0
  21. package/dist/setup/binding-service.d.ts.map +1 -0
  22. package/dist/setup/binding-service.js +172 -0
  23. package/dist/setup/binding-service.js.map +1 -0
  24. package/dist/setup/index.d.ts +31 -0
  25. package/dist/setup/index.d.ts.map +1 -0
  26. package/dist/setup/index.js +54 -0
  27. package/dist/setup/index.js.map +1 -0
  28. package/dist/{setup.d.ts → setup/persist.d.ts} +1 -8
  29. package/dist/setup/persist.d.ts.map +1 -0
  30. package/dist/{setup.js → setup/persist.js} +13 -66
  31. package/dist/setup/persist.js.map +1 -0
  32. package/dist/setup/presenters.d.ts +37 -0
  33. package/dist/setup/presenters.d.ts.map +1 -0
  34. package/dist/setup/presenters.js +81 -0
  35. package/dist/setup/presenters.js.map +1 -0
  36. package/dist/setup/qr-svg.d.ts +8 -0
  37. package/dist/setup/qr-svg.d.ts.map +1 -0
  38. package/dist/setup/qr-svg.js +20 -0
  39. package/dist/setup/qr-svg.js.map +1 -0
  40. package/dist/shared/utils.d.ts +8 -3
  41. package/dist/shared/utils.d.ts.map +1 -1
  42. package/dist/shared/utils.js +45 -4
  43. package/dist/shared/utils.js.map +1 -1
  44. package/lib/client.js +278 -0
  45. package/lib/client.js.map +1 -0
  46. package/package.json +23 -9
  47. package/tsconfig.client.json +19 -0
  48. package/tsdown.client.config.ts +52 -0
  49. package/dist/setup.d.ts.map +0 -1
  50. package/dist/setup.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,9 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ > [English](./CHANGELOG_EN.md)
4
+
3
5
  本文件从产品视角记录 dsh-qqbot 的重要更新,聚焦用户可感知的变化。
4
6
 
5
7
  格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)。
6
8
 
9
+ ## [0.5.0] - 2026-09-08
10
+
11
+ ### 新功能
12
+
13
+ - **图片理解**:发送图片给机器人,它会自动理解图片内容(截图、照片、图表等),可结合文字指令一起分析。
14
+ - **发送文件**:机器人可将本地文件(文档、图片等)直接发送给你,不再局限于纯文字回复。
15
+ - **主动提问**:机器人遇到不确定的信息时,会主动向你提问,并通过按钮让你一键选择,交互更顺畅。
16
+ - **操作确认**:执行敏感或关键操作前,机器人会先发起确认,你通过「允许/拒绝」按钮即可放行或拦截。
17
+ - **会话压缩**:新增 `/compact` 指令,一键压缩当前会话历史,保留上下文的同时释放空间,适合超长对话。
18
+ - **预设切换**:新增 `/preset` 指令,查看或切换机器人的人格/行为预设。
19
+ - **网络延迟检测**:`/bot-ping` 升级,返回网络传输耗时与插件处理耗时,方便排查连接延迟。
20
+
21
+ ### 体验优化
22
+
23
+ - 长任务执行超时延长到 30 分钟,复杂任务不再中途中断。
24
+ - 私聊与群聊按场景注入更贴合的系统提示词,回复更符合语境。
25
+ - 主动消息推送失败时自动降级为被动回复,减少「机器人没反应」的情况。
26
+ - 图片等媒体文件使用后自动清理,避免长期占用磁盘空间。
27
+
28
+ ### 问题修复
29
+
30
+ - 修复 `/stop` 指令无法真正中止正在生成内容的问题(此前为无效操作)。
31
+ - 修复操作确认通道的注册顺序问题,确保确认请求能被正确捕获和处理。
32
+
33
+ ### 文档
34
+
35
+ - README 补充 `/preset`、`/compact` 等新增指令说明,以及扫码升级引导。
36
+
7
37
  ## [0.4.0] - 2026-08-16
8
38
 
9
39
  ### 新功能
@@ -0,0 +1,84 @@
1
+ # Changelog
2
+
3
+ > [简体中文](./CHANGELOG.md)
4
+
5
+ This file records significant dsh-qqbot updates from a product perspective, focusing on user-visible changes.
6
+
7
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
8
+
9
+ ## [0.5.0] - 2026-09-08
10
+
11
+ ### Added
12
+
13
+ - **Image understanding**: send images to the bot and it will automatically understand their content (screenshots, photos, charts, etc.), and can analyze them together with text instructions.
14
+ - **File sending**: the bot can send local files (documents, images, etc.) directly to you, no longer limited to plain-text replies.
15
+ - **Proactive questions**: when the bot encounters uncertain information, it proactively asks you questions, letting you pick an answer with a single tap for smoother interaction.
16
+ - **Action confirmation**: before performing sensitive or critical operations, the bot requests confirmation, which you approve or block via "Allow/Deny" buttons.
17
+ - **Session compaction**: new `/compact` command to compress the current session history in one step, preserving context while freeing space — ideal for very long conversations.
18
+ - **Preset switching**: new `/preset` command to view or switch the bot's persona/behavior preset.
19
+ - **Network latency test**: upgraded `/bot-ping` to return network transport time and plugin processing time, making it easier to diagnose connection latency.
20
+
21
+ ### Improved
22
+
23
+ - Long-task execution timeout extended to 30 minutes, so complex tasks are no longer interrupted mid-way.
24
+ - Direct and group chats now receive more context-appropriate system prompts.
25
+ - Failed proactive message pushes automatically fall back to passive replies, reducing "the bot didn't respond" situations.
26
+ - Media files such as images are automatically cleaned up after use, avoiding long-term disk usage.
27
+
28
+ ### Fixed
29
+
30
+ - Fixed the `/stop` command not actually aborting in-progress generation (it was previously a no-op).
31
+ - Fixed the registration order of the approval channel, ensuring confirmation requests are captured and handled correctly.
32
+
33
+ ### Documentation
34
+
35
+ - README updated with the new `/preset` and `/compact` commands, plus QR-code upgrade guidance.
36
+
37
+ ## [0.4.0] - 2026-08-16
38
+
39
+ ### Added
40
+
41
+ - **QR link**: when the QR code renders incorrectly, you can click the link printed in the terminal to complete scanning in a browser.
42
+
43
+ ### Improved
44
+
45
+ - Supports auto-saving QR credentials on Windows (previously failed due to path issues).
46
+ - When auto-saving credentials fails, it now clearly guides manual configuration instead of silently dropping existing config.
47
+
48
+ ### Documentation
49
+
50
+ - Added QR-code screenshots and upgrade guidance.
51
+
52
+ ## [0.3.0] - 2026-08-15
53
+
54
+ ### Added
55
+
56
+ - **File understanding**: send a file to the bot and it will automatically download and understand its contents, supporting extract, read, analyze, and more.
57
+ - **Streaming replies**: replies are displayed incrementally in real time, no need to wait for full generation — a smoother, more natural experience.
58
+ - **Visible progress**: when the bot runs tasks (running commands, reading/writing files), you can see what it is doing — no longer a "black box".
59
+ - **Error feedback**: when a task ends abnormally, the bot clearly explains the reason, no more "half replies" or "no response at all".
60
+
61
+ ### Improved
62
+
63
+ - Correctly displays the speaker's nickname in group chats instead of an unreadable string.
64
+ - Automatically clears group chat history after replying to avoid cross-conversation interference.
65
+ - Voice messages are recognized and kept as text only, without extra invalid links.
66
+ - The bot now "actually gets things done": for requests like "download, extract, install", it executes real tool actions instead of just restating the steps.
67
+
68
+ ### Fixed
69
+
70
+ - Fixed the bot being unable to read/write files (the working directory was misconfigured).
71
+ - Fixed duplicate content and too-few chunks in streaming replies.
72
+
73
+ ## [0.1.0] - 2026-08-14
74
+
75
+ ### Added
76
+
77
+ - **First release**: QQ bot integrated with an AI assistant, supporting direct and group chats.
78
+ - **Model switching**: supports switching between different AI models.
79
+ - **Common commands**: built-in help, status query, session management, and more.
80
+ - **QR binding**: bind the bot by scanning a QR code on first use, with simple setup.
81
+
82
+ ### Fixed
83
+
84
+ - Fixed config parsing issues.
package/README.md CHANGED
@@ -27,7 +27,7 @@
27
27
  ## 架构
28
28
 
29
29
  ```
30
- QQ 用户 → QQ WebSocket → dsh-im-qqbot → ctx.agents → dsh agent loop → LLM
30
+ QQ 用户 → QQ WebSocket → dsh-qqbot → ctx.agents → dsh agent loop → LLM
31
31
  ↑ │
32
32
  └── session/event ──────────┘
33
33
  (assistant reply → QQ sendMarkdown)
@@ -47,6 +47,8 @@ npx @deepseek-ai/dsh --profile qqbot
47
47
 
48
48
  首次启动时,插件检测到凭据未配置会自动进入扫码引导:终端输出二维码 → 手机 QQ 扫码绑定 → 凭据自动保存到 profile,后续启动无需再次扫码。
49
49
 
50
+ DSH **桌面版 / Web** 下会自动打开应用内「QQ Bot 绑定」页(右侧边栏),端内渲染二维码并实时展示绑定状态,扫码成功后自动完成保存与插件重载;CLI 模式保持终端二维码引导。设置 `QQBOT_BIND_OPEN_BROWSER=1` 可在无端内页的环境额外拉起系统浏览器扫码页作为降级通道。
51
+
50
52
  <img src="./docs/assets/qrcode.png" alt="二维码扫码示意图" width="280" />
51
53
 
52
54
  > **提示**:建议升级至 `0.4.0` 以上版本扫码,支持点击链接在浏览器打开,避免部分终端二维码渲染错位的问题。
@@ -87,10 +89,50 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
87
89
  | `groupPrompt` | string | - | 群聊额外 system prompt |
88
90
  | `directPrompt` | string | - | 私聊额外 system prompt |
89
91
  | `textChunkLimit` | number | `4500` | 单条消息最大字符数 |
92
+ | `streaming` | boolean | `true` | 是否启用流式输出(群聊始终不启用) |
90
93
  | `sessionIdleTimeout` | number | `1800000` | 会话闲置超时(ms),默认 30 分钟 |
94
+ | `processingTimeoutMs` | number | `1800000` | 处理超时(ms),超时中断当前 LLM 调用 |
95
+ | `maxQueue` | number | `20` | 并发队列最大长度 |
96
+ | `historyLimit` | number | `10` | 群历史缓冲条数 |
91
97
  | `askTimeoutMs` | number | `300000` | 待答问题超时(ms),默认 5 分钟(ask_user_question) |
98
+ | `showToolResults` | boolean | `false` | 是否展示工具调用成功结果(错误始终展示) |
92
99
  | `debug` | boolean | `false` | 调试模式 |
93
100
 
101
+ ### 访问控制(access)
102
+
103
+ | 配置 | 类型 | 默认值 | 说明 |
104
+ |------|------|--------|------|
105
+ | `access.c2cMode` | `open`/`allowlist`/`disabled` | `open` | 私聊访问模式 |
106
+ | `access.c2cAllow` | string[] | `[]` | 私聊白名单(user openid) |
107
+ | `access.groupMode` | `open`/`allowlist`/`disabled` | `open` | 群聊访问模式 |
108
+ | `access.groupAllow` | string[] | `[]` | 群聊白名单(group openid) |
109
+
110
+ ### 富媒体理解(media)
111
+
112
+ | 配置 | 类型 | 默认值 | 说明 |
113
+ |------|------|--------|------|
114
+ | `media.enabled` | boolean | `true` | 是否启用富媒体理解(图片/视频下载 + 工具分析) |
115
+ | `media.maxMB` | number | `200` | 富媒体下载大小上限(MB) |
116
+ | `media.ttlHours` | number | `24` | 富媒体存活时长(小时),0=永不过期 |
117
+
118
+ ### 视觉理解(vision)
119
+
120
+ | 配置 | 类型 | 默认值 | 说明 |
121
+ |------|------|--------|------|
122
+ | `vision.enabled` | boolean | `false` | 是否启用视觉理解(qqbot_describe_image 工具) |
123
+ | `vision.provider` | string | - | 视觉模型 provider(如 pi-ai) |
124
+ | `vision.model` | string | - | 视觉模型 id(如 qwen-vl-max) |
125
+ | `vision.maxBytes` | number | `10MB` | 图片字节上限 |
126
+ | `vision.maxTokens` | number | `1024` | 输出 token 上限 |
127
+ | `vision.timeoutMs` | number | `120000` | 视觉调用超时(ms) |
128
+
129
+ ### 附件发送(sendFile)
130
+
131
+ | 配置 | 类型 | 默认值 | 说明 |
132
+ |------|------|--------|------|
133
+ | `sendFile.restrictPaths` | boolean | `true` | 是否启用路径白名单(仅 media + cwd + extraRoots) |
134
+ | `sendFile.extraRoots` | string[] | `[]` | 额外允许访问的根目录 |
135
+
94
136
  ## 内置命令
95
137
 
96
138
  | 命令 | 说明 |
@@ -100,7 +142,7 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
100
142
  | `/model` | 查看或切换模型 |
101
143
  | `/preset` | 查看或切换 agent preset(新会话生效) |
102
144
  | `/stop` | 中止当前生成 |
103
- | `/bot-ping` | 连通性测试 |
145
+ | `/bot-ping` | 网络延迟检测(返回传输与处理耗时) |
104
146
  | `/bot-version` | 查看版本信息 |
105
147
  | `/bot-status` | 查看当前会话状态 |
106
148
  | `/bot-help` | 查看所有指令 |
@@ -112,11 +154,28 @@ src/
112
154
  ├── index.ts # Cordis 插件入口(async apply)
113
155
  ├── config.ts # 配置 Schema
114
156
  ├── types.ts # 全局类型定义
115
- ├── setup.ts # 凭据绑定(扫码)
157
+ ├── setup/ # 凭据绑定(扫码)
158
+ │ ├── index.ts # 绑定编排(ensureCredentials)
159
+ │ ├── binding-service.ts # 扫码状态机(宿主内唯一事实源)
160
+ │ ├── bind-routes.ts # 端内绑定页路由(/qqbot/im-qqbot/bind)
161
+ │ ├── presenters.ts # 呈现策略(终端/浏览器降级)
162
+ │ ├── qr-svg.ts # 二维码 SVG 渲染(宿主侧)
163
+ │ └── persist.ts # 凭据写入 cordis.patch.yml
164
+ ├── client/ # 浏览器半边(dsh.client Web Bundle)
165
+ │ ├── index.ts # 侧栏 Tab 注册 + 待绑定自动引导
166
+ │ └── bind-page.ts # 端内绑定页(二维码 + 状态轮询)
167
+ ├── gateway/ # 网关装配
168
+ │ ├── bootstrap.ts # 启动装配(监听 session/event 等)
169
+ │ └── middleware-setup.ts # 中间件链配置
116
170
  ├── transport/ # 传输层
117
171
  │ ├── inbound.ts # QQ 入站消息 → agent.followup()
118
172
  │ ├── outbound.ts # session/event → QQ sendMarkdown
119
173
  │ ├── outbound-buffer.ts # 流式缓冲
174
+ │ ├── streaming-writer.ts # 流式写入
175
+ │ ├── reply-target.ts # 回复目标解析
176
+ │ ├── msgid-cache.ts # 被动回复 msgid 缓存
177
+ │ ├── reply-limiter.ts # 被动回复限流
178
+ │ ├── tool-presenter.ts # 工具调用展示
120
179
  │ └── chunker.ts # Markdown 文本切分
121
180
  ├── session/ # 会话管理层
122
181
  │ ├── session-manager.ts # QQ peer → Agent 映射
@@ -125,12 +184,22 @@ src/
125
184
  │ ├── model-resolver.ts # 路由解析
126
185
  │ ├── prefs-store.ts # per-peer 偏好持久化
127
186
  │ └── settings-reader.ts # settings.yaml 只读
187
+ ├── features/ # 交互特性
188
+ │ ├── question-channel.ts # ask_user_question 问答通道
189
+ │ ├── approval-channel.ts # approval 审批确认通道
190
+ │ └── answer-parser.ts # 答案解析
191
+ ├── media/ # 多媒体
192
+ │ ├── vision-tool.ts # 图片视觉理解
193
+ │ ├── send-file-tool.ts # 发送本地文件
194
+ │ └── media-cleaner.ts # 媒体 TTL 清理
195
+ ├── middleware/ # 中间件
196
+ │ ├── question-answer.ts # 问答答案处理
197
+ │ └── attachment.ts # 附件处理
128
198
  ├── shared/ # 共享工具
129
199
  │ ├── utils.ts # 通用函数
130
200
  │ ├── scope.ts # scope/peer 提取
131
201
  │ └── send-helper.ts # 分块发送
132
- ├── commands/ # 斜杠命令
133
- └── typings/ # 外部模块声明
202
+ └── commands/ # 斜杠命令
134
203
  ```
135
204
 
136
205
  ## 会话路由
@@ -147,7 +216,10 @@ sessionKey: `qqbot:${appId}:${scope}:${peerId}`,由 SHA-256 确定性派生 Se
147
216
  - **Preset 支持** — 可通过 `agent-presets` 服务挂载预设(工具集、prompt 等)
148
217
  - **闲置回收** — 超时自动 dispose Agent,防止内存泄漏
149
218
  - **Markdown 输出** — 回复以 Markdown 格式发送,支持代码块/表格感知切分
219
+ - **图片理解** — 支持 `qqbot_describe_image` 视觉理解,可分析用户发送的图片
220
+ - **附件发送** — 支持 `qqbot_send_file` 将本地文件发送给用户(默认启用路径白名单)
150
221
  - **问答互动** — 支持 `ask_user_question`,单选生成内联按钮(点一个其余变灰)、多选回复编号,逐题推进 + 问题级超时
222
+ - **操作确认** — 支持 `approval/request`,关键操作通过「允许/拒绝」按钮请求用户确认
151
223
 
152
224
  ## 本地开发
153
225
 
package/README_EN.md CHANGED
@@ -27,7 +27,7 @@ Scan to join the QQ group / channel
27
27
  ## Architecture
28
28
 
29
29
  ```
30
- QQ User → QQ WebSocket → dsh-im-qqbot → ctx.agents → dsh agent loop → LLM
30
+ QQ User → QQ WebSocket → dsh-qqbot → ctx.agents → dsh agent loop → LLM
31
31
  ↑ │
32
32
  └── session/event ──────────┘
33
33
  (assistant reply → QQ sendMarkdown)
@@ -87,10 +87,50 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
87
87
  | `groupPrompt` | string | - | Extra system prompt for group chats |
88
88
  | `directPrompt` | string | - | Extra system prompt for direct chats |
89
89
  | `textChunkLimit` | number | `4500` | Max chars per message |
90
+ | `streaming` | boolean | `true` | Enable streaming output (always disabled in groups) |
90
91
  | `sessionIdleTimeout` | number | `1800000` | Session idle timeout (ms), default 30 min |
92
+ | `processingTimeoutMs` | number | `1800000` | Processing timeout (ms), aborts the current LLM call |
93
+ | `maxQueue` | number | `20` | Max concurrent queue length |
94
+ | `historyLimit` | number | `10` | Group history buffer size |
91
95
  | `askTimeoutMs` | number | `300000` | Question timeout (ms), default 5 min (ask_user_question) |
96
+ | `showToolResults` | boolean | `false` | Show successful tool-call results (errors always shown) |
92
97
  | `debug` | boolean | `false` | Debug mode |
93
98
 
99
+ ### Access control (access)
100
+
101
+ | Config | Type | Default | Description |
102
+ |------|------|--------|------|
103
+ | `access.c2cMode` | `open`/`allowlist`/`disabled` | `open` | Direct-chat access mode |
104
+ | `access.c2cAllow` | string[] | `[]` | Direct-chat allowlist (user openid) |
105
+ | `access.groupMode` | `open`/`allowlist`/`disabled` | `open` | Group access mode |
106
+ | `access.groupAllow` | string[] | `[]` | Group allowlist (group openid) |
107
+
108
+ ### Rich media (media)
109
+
110
+ | Config | Type | Default | Description |
111
+ |------|------|--------|------|
112
+ | `media.enabled` | boolean | `true` | Enable rich media understanding (image/video download + tool analysis) |
113
+ | `media.maxMB` | number | `200` | Max download size (MB) |
114
+ | `media.ttlHours` | number | `24` | Media lifetime (hours), 0 = never expire |
115
+
116
+ ### Vision (vision)
117
+
118
+ | Config | Type | Default | Description |
119
+ |------|------|--------|------|
120
+ | `vision.enabled` | boolean | `false` | Enable vision (qqbot_describe_image tool) |
121
+ | `vision.provider` | string | - | Vision model provider (e.g. pi-ai) |
122
+ | `vision.model` | string | - | Vision model id (e.g. qwen-vl-max) |
123
+ | `vision.maxBytes` | number | `10MB` | Max image bytes |
124
+ | `vision.maxTokens` | number | `1024` | Max output tokens |
125
+ | `vision.timeoutMs` | number | `120000` | Vision call timeout (ms) |
126
+
127
+ ### File sending (sendFile)
128
+
129
+ | Config | Type | Default | Description |
130
+ |------|------|--------|------|
131
+ | `sendFile.restrictPaths` | boolean | `true` | Enable path allowlist (media + cwd + extraRoots only) |
132
+ | `sendFile.extraRoots` | string[] | `[]` | Extra allowed root directories |
133
+
94
134
  ## Built-in Commands
95
135
 
96
136
  | Command | Description |
@@ -100,7 +140,7 @@ npx @deepseek-ai/dsh web --patch /path/to/dsh-qqbot/cordis.dev.yml
100
140
  | `/model` | View or switch model |
101
141
  | `/preset` | View or switch agent preset (applies to new sessions) |
102
142
  | `/stop` | Abort the current generation |
103
- | `/bot-ping` | Connectivity test |
143
+ | `/bot-ping` | Network latency test (transport & processing time) |
104
144
  | `/bot-version` | View version info |
105
145
  | `/bot-status` | View current session status |
106
146
  | `/bot-help` | View all commands |
@@ -113,10 +153,18 @@ src/
113
153
  ├── config.ts # Config schema
114
154
  ├── types.ts # Global types
115
155
  ├── setup.ts # Credential binding (QR)
156
+ ├── gateway/ # Gateway assembly
157
+ │ ├── bootstrap.ts # Startup wiring (session/event listeners, etc.)
158
+ │ └── middleware-setup.ts # Middleware chain config
116
159
  ├── transport/ # Transport layer
117
160
  │ ├── inbound.ts # QQ inbound message → agent.followup()
118
161
  │ ├── outbound.ts # session/event → QQ sendMarkdown
119
162
  │ ├── outbound-buffer.ts # Streaming buffer
163
+ │ ├── streaming-writer.ts # Streaming writer
164
+ │ ├── reply-target.ts # Reply target resolution
165
+ │ ├── msgid-cache.ts # Passive reply msgid cache
166
+ │ ├── reply-limiter.ts # Passive reply rate limiter
167
+ │ ├── tool-presenter.ts # Tool-call presentation
120
168
  │ └── chunker.ts # Markdown chunking
121
169
  ├── session/ # Session management
122
170
  │ ├── session-manager.ts # QQ peer → Agent mapping
@@ -125,12 +173,22 @@ src/
125
173
  │ ├── model-resolver.ts # Route resolution
126
174
  │ ├── prefs-store.ts # Per-peer preference persistence
127
175
  │ └── settings-reader.ts # settings.yaml read-only
176
+ ├── features/ # Interaction features
177
+ │ ├── question-channel.ts # ask_user_question Q&A channel
178
+ │ ├── approval-channel.ts # approval confirmation channel
179
+ │ └── answer-parser.ts # Answer parsing
180
+ ├── media/ # Media
181
+ │ ├── vision-tool.ts # Image vision understanding
182
+ │ ├── send-file-tool.ts # Send local files
183
+ │ └── media-cleaner.ts # Media TTL cleanup
184
+ ├── middleware/ # Middleware
185
+ │ ├── question-answer.ts # Q&A answer handling
186
+ │ └── attachment.ts # Attachment handling
128
187
  ├── shared/ # Shared utilities
129
188
  │ ├── utils.ts # Common helpers
130
189
  │ ├── scope.ts # scope/peer extraction
131
190
  │ └── send-helper.ts # Chunked send
132
- ├── commands/ # Slash commands
133
- └── typings/ # External module declarations
191
+ └── commands/ # Slash commands
134
192
  ```
135
193
 
136
194
  ## Session Routing
@@ -147,7 +205,10 @@ Resolution strategy: in-process reuse → persisted resume → fresh create.
147
205
  - **Preset support** — mount presets (toolkits, prompts, etc.) via the `agent-presets` service
148
206
  - **Idle eviction** — auto-dispose Agents on timeout to prevent memory leaks
149
207
  - **Markdown output** — replies sent as Markdown with code-block/table-aware chunking
208
+ - **Image understanding** — supports `qqbot_describe_image` vision to analyze images sent by users
209
+ - **File sending** — supports `qqbot_send_file` to send local files to users (path allowlist enabled by default)
150
210
  - **Question interaction** — supports `ask_user_question` with inline keyboard buttons (mutually exclusive) or numbered replies, one question at a time with timeout
211
+ - **Approval confirmation** — supports `approval/request` to ask for user confirmation on critical actions via allow/deny buttons
151
212
 
152
213
  ## Local Development
153
214
 
@@ -5,7 +5,7 @@
5
5
  * - /stop:中止当前生成(对应底层 agent cancel,通用能力)
6
6
  */
7
7
  import type { CommandDeps, CategorizedCommand } from './types.ts';
8
- /** /bot-ping — 连通性测试 */
8
+ /** /bot-ping — 测试当前 dsh 与 QQ 连接的网络延迟 */
9
9
  export declare function pingCommand(): CategorizedCommand;
10
10
  /** /bot-version — 查看版本信息 */
11
11
  export declare function versionCommand({ manager }: CommandDeps): CategorizedCommand;
@@ -1 +1 @@
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,wBAAwB;AACxB,wBAAgB,WAAW,IAAI,kBAAkB,CAOhD;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
+ {"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,11 +1,33 @@
1
1
  import { getScopePeer, PLUGIN_VERSION } from "../shared/index.js";
2
- /** /bot-ping — 连通性测试 */
2
+ /** /bot-ping — 测试当前 dsh 与 QQ 连接的网络延迟 */
3
3
  export function pingCommand() {
4
4
  return {
5
5
  name: 'bot-ping',
6
6
  category: 'qqbot',
7
- description: '连通性测试',
8
- handler: () => 'pong 🏓',
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
+ },
9
31
  };
10
32
  }
11
33
  /** /bot-version — 查看版本信息 */
@@ -1 +1 @@
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,wBAAwB;AACxB,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,OAAO;QACjB,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,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
+ {"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 +1 @@
1
- {"version":3,"file":"approval-channel.d.ts","sourceRoot":"","sources":["../../src/features/approval-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMlE,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;AAExF,uDAAuD;AACvD,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAC1E;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE;YAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;SAAE,CAAC;KAC7C,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAID,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IAC1E,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;CAC3F;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrG;AAED,oDAAoD;AACpD,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,EAAE,CACA,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACxC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9B,IAAI,CAAC;CACT;AAyCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAG9B,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,yBAAyB,EACjC,MAAM,EAAE,MAAM;IAOhB;;OAEG;IACI,OAAO,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IA0BjD,wCAAwC;IACjC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ9C,8CAA8C;IACvC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO;IAoB1D,wCAAwC;YAC1B,IAAI;IAkClB,OAAO,CAAC,WAAW;CAKpB"}
1
+ {"version":3,"file":"approval-channel.d.ts","sourceRoot":"","sources":["../../src/features/approval-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMlE,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;AAExF,uDAAuD;AACvD,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAC1E;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE;YAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;SAAE,CAAC;KAC7C,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAID,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IAC1E,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;CAC3F;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrG;AAED,oDAAoD;AACpD,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,EAAE,CACA,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACxC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9B,IAAI,CAAC;CACT;AAyCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAG9B,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,yBAAyB,EACjC,MAAM,EAAE,MAAM;IAOhB;;OAEG;IACI,OAAO,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAuBjD,wCAAwC;IACjC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ9C,8CAA8C;IACvC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO;IAoB1D,wCAAwC;YAC1B,IAAI;IAkClB,OAAO,CAAC,WAAW;CAKpB"}
@@ -60,9 +60,6 @@ export class ApprovalChannel {
60
60
  return;
61
61
  }
62
62
  const self = this;
63
- // prepend: true 抢到 waterfall 链首。本 answerer 是「命中 QQ 会话才 park、未命中
64
- // next()」的路由式 answerer,prepend 只会认领 QQ 自己的会话,其余请求照旧 next()
65
- // 委托给 api-proxy(Web 管理端)等其他 answerer,避免被其抢占导致 QQ 收不到审批。
66
63
  ctx.on('approval/request', (req, next) => {
67
64
  const request = req;
68
65
  const nextFn = next;
@@ -1 +1 @@
1
- {"version":3,"file":"approval-channel.js","sourceRoot":"","sources":["../../src/features/approval-channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approval-channel.js","sourceRoot":"","sources":["../../src/features/approval-channel.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,8 @@
2
2
  * dsh-im-qqbot — QQ Bot IM channel plugin for deepseek-harness
3
3
  *
4
4
  * Cordis 插件入口。将 QQ 消息平台作为 dsh 的前端协议驱动。
5
- * 网关组装(中间件编排 + 事件 + 出站 + 生命周期)见 src/gateway/。
5
+ * 网关组装(中间件编排 + 事件 + 出站 + 生命周期)见 src/gateway/;
6
+ * 凭据绑定编排(扫码状态机 + 端内绑定页路由)见 src/setup/。
6
7
  */
7
8
  import type { Context } from '@deepseek-ai/cordis';
8
9
  import { type ImQQBotConfig } from './config.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ/D,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAa,CAAC;AACjC,eAAO,MAAM,MAAM,2DAAe,CAAC;AAEnC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ/D,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAa,CAAC;AACjC,eAAO,MAAM,MAAM,2DAAe,CAAC;AAEnC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC9E"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ConfigSchema } from "./config.js";
2
2
  import { bootstrapGateway } from "./gateway/index.js";
3
3
  import { getProfileDir, resolveEnv } from "./shared/index.js";
4
- import { runQrSetup, persistCredentialsToProfile } from "./setup.js";
4
+ import { ensureCredentials, persistCredentialsToProfile } from "./setup/index.js";
5
5
  // ── Cordis 插件元数据 ──
6
6
  export const name = 'im-qqbot';
7
7
  export const inject = ['agents'];
@@ -10,13 +10,12 @@ export const Config = ConfigSchema;
10
10
  export async function apply(ctx, config) {
11
11
  const agents = ctx.agents;
12
12
  const logger = ctx.logger ?? console;
13
- console.log('[im-qqbot] apply() called');
14
13
  let appId = resolveEnv(config.appId, 'QQBOT_APPID');
15
14
  let appSecret = resolveEnv(config.appSecret, 'QQBOT_SECRET');
16
15
  // ── 凭据缺失时唤起扫码绑定 ──
17
16
  if (!appId || !appSecret) {
18
17
  logger.info('凭据未配置,尝试扫码绑定...');
19
- const credentials = await runQrSetup();
18
+ const credentials = await ensureCredentials(ctx, { logger });
20
19
  if (!credentials) {
21
20
  logger.error('无法获取 QQ Bot 凭据,插件未启动');
22
21
  return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAGrE,qBAAqB;AACrB,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;AAInC,aAAa;AACb,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,MAAqB;IAC7D,MAAM,MAAM,GAAI,GAA0C,CAAC,MAA0B,CAAC;IACtF,MAAM,MAAM,GAAa,GAA0C,CAAC,MAAiB,IAAI,OAAO,CAAC;IAEjG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAE7D,oBAAoB;IACpB,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,UAAU,EAAE,CAAC;QAEvC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC;QACjD,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAC1B,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAElC,0CAA0C;QAC1C,MAAM,SAAS,GAAG,2BAA2B,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,SAAS,EAAE,MAAM,CAAC,CAAC;QACjG,IAAI,SAAS,EAAE,CAAC;YACd,6CAA6C;YAC7C,mBAAmB;YACnB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,cAAc,GAAkB,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAEtE,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAGlF,qBAAqB;AACrB,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;AAInC,aAAa;AACb,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,MAAqB;IAC7D,MAAM,MAAM,GAAI,GAA0C,CAAC,MAA0B,CAAC;IACtF,MAAM,MAAM,GAAa,GAA0C,CAAC,MAAiB,IAAI,OAAO,CAAC;IAEjG,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAE7D,oBAAoB;IACpB,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE/B,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC;QACjD,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAC1B,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAElC,0CAA0C;QAC1C,MAAM,SAAS,GAAG,2BAA2B,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,SAAS,EAAE,MAAM,CAAC,CAAC;QACjG,IAAI,SAAS,EAAE,CAAC;YACd,6CAA6C;YAC7C,mBAAmB;YACnB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,cAAc,GAAkB,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAEtE,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 端内绑定页路由 — /qqbot/im-qqbot/bind
3
+ *
4
+ * 注册在 dsh-host-webserver(ctx.webServer)的具名路由:
5
+ * - Web 模式:页面同源直接访问
6
+ * - Desktop:渲染进程的 fetch 经 IPC 桥自动附加 Host 认证转发
7
+ *
8
+ * 响应只含 task 级短时效数据(二维码 URL/SVG);appSecret 绝不出现在
9
+ * 任何响应中。路由仅在「待绑定」的插件 fiber 内注册,已绑定/未安装时
10
+ * 客户端以 404 区分。
11
+ */
12
+ import type { IncomingMessage, ServerResponse } from 'node:http';
13
+ import type { Logger } from '../types.ts';
14
+ import type { BindingService } from './binding-service.ts';
15
+ /** 状态查询(绑定页轮询) */
16
+ export declare const BIND_STATE_PATH = "/qqbot/im-qqbot/bind";
17
+ /** 刷新二维码(绑定页按钮) */
18
+ export declare const BIND_REFRESH_PATH = "/qqbot/im-qqbot/bind/refresh";
19
+ /** dsh-host-webserver 的具名路由注册形状(局部投影,避免硬依赖) */
20
+ export interface WebRoute {
21
+ kind: 'exact' | 'prefix';
22
+ path: string;
23
+ handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
24
+ }
25
+ /** ctx.webServer 的局部投影(服务可用性由调用方探测) */
26
+ export interface WebServerLike {
27
+ register(route: WebRoute): () => void;
28
+ }
29
+ /**
30
+ * 注册绑定路由。
31
+ *
32
+ * @returns 注销函数(与插件 fiber 生命周期绑定)
33
+ */
34
+ export declare function registerBindRoutes(webServer: WebServerLike, service: BindingService, logger: Logger): () => void;
35
+ //# sourceMappingURL=bind-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bind-routes.d.ts","sourceRoot":"","sources":["../../src/setup/bind-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,kBAAkB;AAClB,eAAO,MAAM,eAAe,yBAAyB,CAAC;AAEtD,mBAAmB;AACnB,eAAO,MAAM,iBAAiB,iCAAiC,CAAC;AAEhE,+CAA+C;AAC/C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E;AAED,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,IAAI,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAehH"}