@cxyhhhhh/dsh-qqbot 0.5.4-dev.202610281447 → 0.5.4-dev.202610301949
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/CHANGELOG.md +28 -2
- package/CHANGELOG_EN.md +28 -2
- package/README.md +2 -2
- package/README_EN.md +2 -2
- package/cordis.patch.yml +0 -5
- package/lib/client.js +20 -9
- package/lib/client.js.map +1 -1
- package/lib/commands/auth.d.ts +18 -0
- package/lib/commands/auth.d.ts.map +1 -0
- package/lib/commands/auth.js +15 -0
- package/lib/commands/auth.js.map +1 -0
- package/{dist → lib}/commands/help.d.ts.map +1 -1
- package/{dist → lib}/commands/help.js +3 -1
- package/lib/commands/help.js.map +1 -0
- package/{dist → lib}/commands/index.d.ts.map +1 -1
- package/{dist → lib}/commands/index.js +2 -1
- package/lib/commands/index.js.map +1 -0
- package/{dist → lib}/commands/misc.d.ts +8 -1
- package/lib/commands/misc.d.ts.map +1 -0
- package/{dist → lib}/commands/misc.js +27 -1
- package/lib/commands/misc.js.map +1 -0
- package/lib/commands/model.d.ts +6 -0
- package/lib/commands/model.d.ts.map +1 -0
- package/{dist → lib}/commands/model.js +5 -1
- package/lib/commands/model.js.map +1 -0
- package/{dist → lib}/commands/preset.d.ts +1 -1
- package/lib/commands/preset.d.ts.map +1 -0
- package/{dist → lib}/commands/preset.js +5 -1
- package/lib/commands/preset.js.map +1 -0
- package/{dist → lib}/commands/session.d.ts.map +1 -1
- package/{dist → lib}/commands/session.js +7 -1
- package/lib/commands/session.js.map +1 -0
- package/{dist → lib}/commands/status.d.ts.map +1 -1
- package/{dist → lib}/commands/status.js +1 -0
- package/lib/commands/status.js.map +1 -0
- package/{dist → lib}/commands/types.d.ts +2 -0
- package/lib/commands/types.d.ts.map +1 -0
- package/{dist → lib}/config.d.ts +1 -1
- package/{dist → lib}/config.d.ts.map +1 -1
- package/{dist → lib}/config.js +6 -6
- package/lib/config.js.map +1 -0
- package/{dist → lib}/features/approval-channel.d.ts +11 -3
- package/lib/features/approval-channel.d.ts.map +1 -0
- package/{dist → lib}/features/approval-channel.js +21 -5
- package/lib/features/approval-channel.js.map +1 -0
- package/{dist → lib}/features/approval-renderer.d.ts +3 -3
- package/{dist → lib}/features/approval-renderer.d.ts.map +1 -1
- package/{dist → lib}/features/approval-renderer.js +5 -5
- package/lib/features/approval-renderer.js.map +1 -0
- package/{dist → lib}/features/button-utils.d.ts +2 -1
- package/{dist → lib}/features/button-utils.d.ts.map +1 -1
- package/{dist → lib}/features/button-utils.js.map +1 -1
- package/{dist → lib}/gateway/bootstrap.js +1 -1
- package/{dist → lib}/gateway/bootstrap.js.map +1 -1
- package/{dist → lib}/gateway/middleware-setup.js +4 -4
- package/lib/gateway/middleware-setup.js.map +1 -0
- package/lib/host/adapter.d.ts +34 -0
- package/lib/host/adapter.d.ts.map +1 -0
- package/lib/host/adapter.js +96 -0
- package/lib/host/adapter.js.map +1 -0
- package/{dist → lib}/media/media-cleaner.d.ts.map +1 -1
- package/{dist → lib}/media/media-cleaner.js +2 -2
- package/lib/media/media-cleaner.js.map +1 -0
- package/{dist → lib}/media/send-file-tool.d.ts.map +1 -1
- package/{dist → lib}/media/send-file-tool.js +2 -2
- package/{dist → lib}/media/send-file-tool.js.map +1 -1
- package/{dist → lib}/media/send-media.d.ts +9 -1
- package/lib/media/send-media.d.ts.map +1 -0
- package/{dist → lib}/media/send-media.js +43 -3
- package/lib/media/send-media.js.map +1 -0
- package/{dist → lib}/media/vision-tool.d.ts.map +1 -1
- package/{dist → lib}/media/vision-tool.js +3 -1
- package/lib/media/vision-tool.js.map +1 -0
- package/{dist → lib}/model/prefs-store.js +2 -2
- package/lib/model/prefs-store.js.map +1 -0
- package/{dist → lib}/session/index.d.ts +1 -1
- package/{dist → lib}/session/index.d.ts.map +1 -1
- package/lib/session/session-id.d.ts +5 -0
- package/lib/session/session-id.d.ts.map +1 -0
- package/lib/session/session-id.js +15 -0
- package/lib/session/session-id.js.map +1 -0
- package/{dist → lib}/session/session-manager.d.ts +15 -8
- package/lib/session/session-manager.d.ts.map +1 -0
- package/{dist → lib}/session/session-manager.js +94 -49
- package/lib/session/session-manager.js.map +1 -0
- package/{dist → lib}/session/types.d.ts +5 -13
- package/lib/session/types.d.ts.map +1 -0
- package/{dist → lib}/setup/binding-service.js +1 -1
- package/{dist → lib}/setup/binding-service.js.map +1 -1
- package/{dist → lib}/setup/persist.d.ts +2 -0
- package/lib/setup/persist.d.ts.map +1 -0
- package/{dist → lib}/setup/persist.js +35 -2
- package/lib/setup/persist.js.map +1 -0
- package/lib/shared/dirs.d.ts +10 -0
- package/lib/shared/dirs.d.ts.map +1 -0
- package/lib/shared/dirs.js +20 -0
- package/lib/shared/dirs.js.map +1 -0
- package/{dist → lib}/shared/index.d.ts +1 -0
- package/{dist → lib}/shared/index.d.ts.map +1 -1
- package/{dist → lib}/shared/index.js +1 -0
- package/{dist → lib}/shared/index.js.map +1 -1
- package/{dist → lib}/shared/utils.d.ts.map +1 -1
- package/{dist → lib}/shared/utils.js +66 -1
- package/lib/shared/utils.js.map +1 -0
- package/{dist → lib}/transport/attachment.d.ts +14 -2
- package/lib/transport/attachment.d.ts.map +1 -0
- package/{dist → lib}/transport/attachment.js +46 -8
- package/lib/transport/attachment.js.map +1 -0
- package/{dist → lib}/transport/deliverables.d.ts.map +1 -1
- package/{dist → lib}/transport/deliverables.js +3 -3
- package/{dist → lib}/transport/deliverables.js.map +1 -1
- package/{dist → lib}/transport/reply-target.d.ts +3 -0
- package/{dist → lib}/transport/reply-target.d.ts.map +1 -1
- package/{dist → lib}/transport/reply-target.js +12 -3
- package/lib/transport/reply-target.js.map +1 -0
- package/package.json +5 -5
- package/dist/commands/help.js.map +0 -1
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/misc.d.ts.map +0 -1
- package/dist/commands/misc.js.map +0 -1
- package/dist/commands/model.d.ts +0 -6
- package/dist/commands/model.d.ts.map +0 -1
- package/dist/commands/model.js.map +0 -1
- package/dist/commands/preset.d.ts.map +0 -1
- package/dist/commands/preset.js.map +0 -1
- package/dist/commands/session.js.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/types.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/features/approval-channel.d.ts.map +0 -1
- package/dist/features/approval-channel.js.map +0 -1
- package/dist/features/approval-renderer.js.map +0 -1
- package/dist/gateway/middleware-setup.js.map +0 -1
- package/dist/media/media-cleaner.js.map +0 -1
- package/dist/media/send-media.d.ts.map +0 -1
- package/dist/media/send-media.js.map +0 -1
- package/dist/media/vision-tool.js.map +0 -1
- package/dist/model/prefs-store.js.map +0 -1
- package/dist/session/session-manager.d.ts.map +0 -1
- package/dist/session/session-manager.js.map +0 -1
- package/dist/session/types.d.ts.map +0 -1
- package/dist/setup/persist.d.ts.map +0 -1
- package/dist/setup/persist.js.map +0 -1
- package/dist/shared/utils.js.map +0 -1
- package/dist/transport/attachment.d.ts.map +0 -1
- package/dist/transport/attachment.js.map +0 -1
- package/dist/transport/reply-target.js.map +0 -1
- /package/{dist → lib}/commands/help.d.ts +0 -0
- /package/{dist → lib}/commands/index.d.ts +0 -0
- /package/{dist → lib}/commands/session.d.ts +0 -0
- /package/{dist → lib}/commands/status.d.ts +0 -0
- /package/{dist → lib}/commands/types.js +0 -0
- /package/{dist → lib}/commands/types.js.map +0 -0
- /package/{dist → lib}/features/answer-parser.d.ts +0 -0
- /package/{dist → lib}/features/answer-parser.d.ts.map +0 -0
- /package/{dist → lib}/features/answer-parser.js +0 -0
- /package/{dist → lib}/features/answer-parser.js.map +0 -0
- /package/{dist → lib}/features/button-utils.js +0 -0
- /package/{dist → lib}/features/history-store.d.ts +0 -0
- /package/{dist → lib}/features/history-store.d.ts.map +0 -0
- /package/{dist → lib}/features/history-store.js +0 -0
- /package/{dist → lib}/features/history-store.js.map +0 -0
- /package/{dist → lib}/features/question-channel.d.ts +0 -0
- /package/{dist → lib}/features/question-channel.d.ts.map +0 -0
- /package/{dist → lib}/features/question-channel.js +0 -0
- /package/{dist → lib}/features/question-channel.js.map +0 -0
- /package/{dist → lib}/features/question-renderer.d.ts +0 -0
- /package/{dist → lib}/features/question-renderer.d.ts.map +0 -0
- /package/{dist → lib}/features/question-renderer.js +0 -0
- /package/{dist → lib}/features/question-renderer.js.map +0 -0
- /package/{dist → lib}/gateway/bootstrap.d.ts +0 -0
- /package/{dist → lib}/gateway/bootstrap.d.ts.map +0 -0
- /package/{dist → lib}/gateway/index.d.ts +0 -0
- /package/{dist → lib}/gateway/index.d.ts.map +0 -0
- /package/{dist → lib}/gateway/index.js +0 -0
- /package/{dist → lib}/gateway/index.js.map +0 -0
- /package/{dist → lib}/gateway/middleware-setup.d.ts +0 -0
- /package/{dist → lib}/gateway/middleware-setup.d.ts.map +0 -0
- /package/{dist → lib}/index.d.ts +0 -0
- /package/{dist → lib}/index.d.ts.map +0 -0
- /package/{dist → lib}/index.js +0 -0
- /package/{dist → lib}/index.js.map +0 -0
- /package/{dist → lib}/media/media-cleaner.d.ts +0 -0
- /package/{dist → lib}/media/send-file-tool.d.ts +0 -0
- /package/{dist → lib}/media/vision-tool.d.ts +0 -0
- /package/{dist → lib}/middleware/attachment.d.ts +0 -0
- /package/{dist → lib}/middleware/attachment.d.ts.map +0 -0
- /package/{dist → lib}/middleware/attachment.js +0 -0
- /package/{dist → lib}/middleware/attachment.js.map +0 -0
- /package/{dist → lib}/middleware/question-answer.d.ts +0 -0
- /package/{dist → lib}/middleware/question-answer.d.ts.map +0 -0
- /package/{dist → lib}/middleware/question-answer.js +0 -0
- /package/{dist → lib}/middleware/question-answer.js.map +0 -0
- /package/{dist → lib}/model/index.d.ts +0 -0
- /package/{dist → lib}/model/index.d.ts.map +0 -0
- /package/{dist → lib}/model/index.js +0 -0
- /package/{dist → lib}/model/index.js.map +0 -0
- /package/{dist → lib}/model/model-resolver.d.ts +0 -0
- /package/{dist → lib}/model/model-resolver.d.ts.map +0 -0
- /package/{dist → lib}/model/model-resolver.js +0 -0
- /package/{dist → lib}/model/model-resolver.js.map +0 -0
- /package/{dist → lib}/model/prefs-store.d.ts +0 -0
- /package/{dist → lib}/model/prefs-store.d.ts.map +0 -0
- /package/{dist → lib}/model/settings-reader.d.ts +0 -0
- /package/{dist → lib}/model/settings-reader.d.ts.map +0 -0
- /package/{dist → lib}/model/settings-reader.js +0 -0
- /package/{dist → lib}/model/settings-reader.js.map +0 -0
- /package/{dist → lib}/model/types.d.ts +0 -0
- /package/{dist → lib}/model/types.d.ts.map +0 -0
- /package/{dist → lib}/model/types.js +0 -0
- /package/{dist → lib}/model/types.js.map +0 -0
- /package/{dist → lib}/session/idle-evictor.d.ts +0 -0
- /package/{dist → lib}/session/idle-evictor.d.ts.map +0 -0
- /package/{dist → lib}/session/idle-evictor.js +0 -0
- /package/{dist → lib}/session/idle-evictor.js.map +0 -0
- /package/{dist → lib}/session/index.js +0 -0
- /package/{dist → lib}/session/index.js.map +0 -0
- /package/{dist → lib}/session/types.js +0 -0
- /package/{dist → lib}/session/types.js.map +0 -0
- /package/{dist → lib}/setup/bind-routes.d.ts +0 -0
- /package/{dist → lib}/setup/bind-routes.d.ts.map +0 -0
- /package/{dist → lib}/setup/bind-routes.js +0 -0
- /package/{dist → lib}/setup/bind-routes.js.map +0 -0
- /package/{dist → lib}/setup/binding-service.d.ts +0 -0
- /package/{dist → lib}/setup/binding-service.d.ts.map +0 -0
- /package/{dist → lib}/setup/index.d.ts +0 -0
- /package/{dist → lib}/setup/index.d.ts.map +0 -0
- /package/{dist → lib}/setup/index.js +0 -0
- /package/{dist → lib}/setup/index.js.map +0 -0
- /package/{dist → lib}/setup/presenters.d.ts +0 -0
- /package/{dist → lib}/setup/presenters.d.ts.map +0 -0
- /package/{dist → lib}/setup/presenters.js +0 -0
- /package/{dist → lib}/setup/presenters.js.map +0 -0
- /package/{dist → lib}/setup/qr-svg.d.ts +0 -0
- /package/{dist → lib}/setup/qr-svg.d.ts.map +0 -0
- /package/{dist → lib}/setup/qr-svg.js +0 -0
- /package/{dist → lib}/setup/qr-svg.js.map +0 -0
- /package/{dist → lib}/shared/bind-protocol.d.ts +0 -0
- /package/{dist → lib}/shared/bind-protocol.d.ts.map +0 -0
- /package/{dist → lib}/shared/bind-protocol.js +0 -0
- /package/{dist → lib}/shared/bind-protocol.js.map +0 -0
- /package/{dist → lib}/shared/scope.d.ts +0 -0
- /package/{dist → lib}/shared/scope.d.ts.map +0 -0
- /package/{dist → lib}/shared/scope.js +0 -0
- /package/{dist → lib}/shared/scope.js.map +0 -0
- /package/{dist → lib}/shared/send-helper.d.ts +0 -0
- /package/{dist → lib}/shared/send-helper.d.ts.map +0 -0
- /package/{dist → lib}/shared/send-helper.js +0 -0
- /package/{dist → lib}/shared/send-helper.js.map +0 -0
- /package/{dist → lib}/shared/utils.d.ts +0 -0
- /package/{dist → lib}/transport/chunker.d.ts +0 -0
- /package/{dist → lib}/transport/chunker.d.ts.map +0 -0
- /package/{dist → lib}/transport/chunker.js +0 -0
- /package/{dist → lib}/transport/chunker.js.map +0 -0
- /package/{dist → lib}/transport/deliverables.d.ts +0 -0
- /package/{dist → lib}/transport/events.d.ts +0 -0
- /package/{dist → lib}/transport/events.d.ts.map +0 -0
- /package/{dist → lib}/transport/events.js +0 -0
- /package/{dist → lib}/transport/events.js.map +0 -0
- /package/{dist → lib}/transport/inbound.d.ts +0 -0
- /package/{dist → lib}/transport/inbound.d.ts.map +0 -0
- /package/{dist → lib}/transport/inbound.js +0 -0
- /package/{dist → lib}/transport/inbound.js.map +0 -0
- /package/{dist → lib}/transport/index.d.ts +0 -0
- /package/{dist → lib}/transport/index.d.ts.map +0 -0
- /package/{dist → lib}/transport/index.js +0 -0
- /package/{dist → lib}/transport/index.js.map +0 -0
- /package/{dist → lib}/transport/msgid-cache.d.ts +0 -0
- /package/{dist → lib}/transport/msgid-cache.d.ts.map +0 -0
- /package/{dist → lib}/transport/msgid-cache.js +0 -0
- /package/{dist → lib}/transport/msgid-cache.js.map +0 -0
- /package/{dist → lib}/transport/outbound-buffer.d.ts +0 -0
- /package/{dist → lib}/transport/outbound-buffer.d.ts.map +0 -0
- /package/{dist → lib}/transport/outbound-buffer.js +0 -0
- /package/{dist → lib}/transport/outbound-buffer.js.map +0 -0
- /package/{dist → lib}/transport/outbound.d.ts +0 -0
- /package/{dist → lib}/transport/outbound.d.ts.map +0 -0
- /package/{dist → lib}/transport/outbound.js +0 -0
- /package/{dist → lib}/transport/outbound.js.map +0 -0
- /package/{dist → lib}/transport/reply-limiter.d.ts +0 -0
- /package/{dist → lib}/transport/reply-limiter.d.ts.map +0 -0
- /package/{dist → lib}/transport/reply-limiter.js +0 -0
- /package/{dist → lib}/transport/reply-limiter.js.map +0 -0
- /package/{dist → lib}/transport/streaming-writer.d.ts +0 -0
- /package/{dist → lib}/transport/streaming-writer.d.ts.map +0 -0
- /package/{dist → lib}/transport/streaming-writer.js +0 -0
- /package/{dist → lib}/transport/streaming-writer.js.map +0 -0
- /package/{dist → lib}/transport/tool-presenter.d.ts +0 -0
- /package/{dist → lib}/transport/tool-presenter.d.ts.map +0 -0
- /package/{dist → lib}/transport/tool-presenter.js +0 -0
- /package/{dist → lib}/transport/tool-presenter.js.map +0 -0
- /package/{dist → lib}/types.d.ts +0 -0
- /package/{dist → lib}/types.d.ts.map +0 -0
- /package/{dist → lib}/types.js +0 -0
- /package/{dist → lib}/types.js.map +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -8,10 +8,36 @@
|
|
|
8
8
|
|
|
9
9
|
## [0.5.4] - 2026-10-28
|
|
10
10
|
|
|
11
|
+
### 新功能
|
|
12
|
+
|
|
13
|
+
- **新增 `/bot-me` 指令**:查看发送者 OpenID(私聊为 user openid,群聊为群成员 openid 与群 openid),作为白名单配置的自助入口——用户拿 ID 交管理员加入名单即可。
|
|
14
|
+
- **管理指令白名单鉴权**:`/preset`、`/model` 私聊/群聊均可用,但仅限白名单用户,非白名单成员不可切换 preset/模型(群聊中切换影响该群会话);指令的私聊/群聊适用范围在 `/bot-help` 中标注。(#5)
|
|
15
|
+
|
|
16
|
+
### ⚠️ 行为变更(安全默认)
|
|
17
|
+
|
|
18
|
+
- **访问控制默认收紧**:私聊默认白名单且留空拒绝所有人(此前留空会静默放行);群聊默认开放(有进群门槛与 @bot 双前置)。扫码绑定时私聊自动切白名单并重置为扫码用户(重绑即换人),绑定即授权。
|
|
19
|
+
- **工作目录默认独立**:Agent 工作目录缺省为 `~/.dsh-qqbot/workspace`,不再跟随 DSH 进程目录;显式配置 `cwd` 可覆盖。
|
|
20
|
+
- **审批按钮校验权限**:白名单模式下审批按钮只对名单内用户生效——非授权成员点击无效,私聊卡片转发后他人点击同样无效。
|
|
21
|
+
|
|
11
22
|
### 问题修复
|
|
12
23
|
|
|
13
|
-
-
|
|
14
|
-
-
|
|
24
|
+
- **保存配置不再破坏其他插件**:绑定、改配置、解绑只改自己的条目,其他插件内容与注释原样保留。(#53)
|
|
25
|
+
- **长提示词可保存**:配置保存请求体上限从 4KB 提高到 512KB。(#69)
|
|
26
|
+
- **视觉链路隐患修复**:`qqbot_describe_image` 的消息来源改为新版会话格式,未来图片注入主对话不会报错。(#77)
|
|
27
|
+
- **会话 id 加固**:统一 `session-` 前缀(#81)——社区插件不再误判,多进程并发不产生重复 id;老会话沿用原 id。
|
|
28
|
+
- **切换模型修复**:`/model` 崩溃与切换后重启的「历史加载失败」均已修复,会话历史完整保留。
|
|
29
|
+
- **会话事件读取修复**:`/tokens` 显示 0、`/export` 导出为空、审批按钮不回显被审批命令——均已修复。
|
|
30
|
+
- **压缩修复**:`/compact` 误报「压缩能力不可用」或「当前无活跃会话」——均已修复;后者场景会自动从磁盘拉起会话再压缩。
|
|
31
|
+
- **修复 link 安装后保存配置失败**:`dsh plugin add link:` 安装时界面保存一直报「无法定位 profile 目录」,现已修复;多 profile 共享源码时按当前进程的 profile 精确写入,仍失败时提示手动编辑 `cordis.patch.yml`。(#78)
|
|
32
|
+
- **修复白名单默认值可被绕过**:完全省略 `access` 配置时私聊仍回落开放模式(外层默认值未随子字段更新),现已对齐白名单并加测试钉死。(#94)
|
|
33
|
+
- **审批卡片防混淆与身份加固**:按钮绑定本次审批的唯一标识,旧卡片点击不再生效;白名单模式下点击者身份缺失同样拒绝。(#94)
|
|
34
|
+
- **文件发送路径白名单解析符号链接**:按真实位置判定,root 内的符号链接指向外部时拒绝访问。(#94)
|
|
35
|
+
- **图片附件按真实格式命名扩展名**:QQ 网关对图片统一标注 `image/png`(实际多为 GIF/JPEG),落盘文件名照搬导致按扩展名解码的读图工具失败;现按文件头(magic bytes)识别真实格式并校正扩展名,字节不变、不转码,识别不了的格式保持原行为。(#76)
|
|
36
|
+
- **统一 workspace 路径解析**:新增插件目录单一事实源(`~/.dsh-qqbot`),workspace、media、模型偏好等子路径统一派生,未配置 `cwd` 时不再误用宿主进程目录(此前导致 workspace 内文件发送被误拒);不存在的文件也改为报「文件不存在」而非误报路径不允许。
|
|
37
|
+
|
|
38
|
+
### 内部改进
|
|
39
|
+
|
|
40
|
+
- 新增宿主 API 适配层,统一兼容宿主新旧版本的接口形态。
|
|
15
41
|
|
|
16
42
|
## [0.5.3] - 2026-10-27
|
|
17
43
|
|
package/CHANGELOG_EN.md
CHANGED
|
@@ -8,10 +8,36 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
8
8
|
|
|
9
9
|
## [0.5.4] - 2026-10-28
|
|
10
10
|
|
|
11
|
+
### New Features
|
|
12
|
+
|
|
13
|
+
- **New `/bot-me` command**: shows the sender's OpenIDs (user openid in DMs; group-member openid and group openid in groups) as a self-service entry for allowlist onboarding — users hand the IDs to an admin to be added to the lists.
|
|
14
|
+
- **Admin command authorization**: `/preset` and `/model` work in both DMs and groups, but only allowlisted users may switch the preset or model (a group switch affects that group's session); each command's DM/group availability is shown in `/bot-help`. (#5)
|
|
15
|
+
|
|
16
|
+
### ⚠️ Behavior Changes (secure defaults)
|
|
17
|
+
|
|
18
|
+
- **Access control tightened by default**: DMs default to allowlist with an empty list rejecting everyone (previously empty lists silently allowed everyone); groups default to open (guarded by group membership and the @-mention gate). On QR binding, DMs switch to allowlist with the list reset to the scanning user (rebinding swaps the owner) — binding grants access.
|
|
19
|
+
- **Isolated default workspace**: the agent working directory now defaults to `~/.dsh-qqbot/workspace` instead of following the DSH process directory; set `cwd` explicitly to override.
|
|
20
|
+
- **Approval buttons check permissions**: in allowlist mode, approval buttons only take effect for allowlisted users — clicks by non-authorized members and forwarded DM cards clicked by others are ignored.
|
|
21
|
+
|
|
11
22
|
### Fixed
|
|
12
23
|
|
|
13
|
-
- **Saving configuration no longer clobbers other plugins**: binding, saving settings, and unbinding
|
|
14
|
-
- **Long prompts can be saved**: the settings-save request body limit is raised from 4KB to 512KB
|
|
24
|
+
- **Saving configuration no longer clobbers other plugins**: binding, saving settings, and unbinding only touch this plugin's own entry; other plugins' content and comments are preserved. (#53)
|
|
25
|
+
- **Long prompts can be saved**: the settings-save request body limit is raised from 4KB to 512KB. (#69)
|
|
26
|
+
- **Vision-path hazard fixed**: the `qqbot_describe_image` message source now uses the current session format, so future image injection into the main conversation will not fail. (#77)
|
|
27
|
+
- **Hardened session ids**: unified `session-` prefix (#81) — community plugins no longer misjudge QQ sessions, multi-process concurrency produces no duplicate ids, and existing sessions keep their original ids.
|
|
28
|
+
- **Fixed model switching**: both the `/model` crash and the "history failed to load" error after restarting post-switch are fixed, with conversation history fully preserved.
|
|
29
|
+
- **Fixed session-event reads**: `/tokens` showing 0, `/export` producing empty output, and approval buttons not echoing the gated command — all fixed.
|
|
30
|
+
- **Fixed compaction**: `/compact` wrongly reporting the service as unavailable or "no active session" — fixed; in the latter case the session is revived from disk before compacting.
|
|
31
|
+
- **Fixed config save failure with link installs**: saving from the settings UI kept reporting "profile directory not found" when installed via `dsh plugin add link:` — fixed. With multiple profiles sharing the same source, writes target the profile of the current process. Remaining failures point at manually editing `cordis.patch.yml`. (#78)
|
|
32
|
+
- **Fixed allowlist default bypass**: omitting `access` entirely still fell back to open DMs (the outer schema default was not updated with the field defaults) — now aligned to allowlist and pinned by tests. (#94)
|
|
33
|
+
- **Approval cards bound to their request and hardened**: buttons now carry the pending approval's unique nonce, so stale cards no longer settle; in allowlist mode a missing clicker identity is rejected too. (#94)
|
|
34
|
+
- **File-send path allowlist resolves symlinks**: paths are judged by their real locations; a symlink inside an allowed root pointing outside is rejected. (#94)
|
|
35
|
+
- **Image attachments named by their real format**: the QQ gateway labels all images `image/png` (most are actually GIF/JPEG), so saved files carried wrong extensions and extension-based image decoding failed; extensions are now corrected from the file header (magic bytes) — bytes unchanged, no transcoding, unknown formats keep the original behavior. (#76)
|
|
36
|
+
- **Unified workspace path resolution**: introduced a single source of truth for the plugin data directory (`~/.dsh-qqbot`), from which the workspace, media, and model-preference paths are uniformly derived; without an explicit `cwd` the host process directory is no longer wrongly used (previously causing workspace file sends to be denied). Missing files now report "file not found" instead of a misleading path denial.
|
|
37
|
+
|
|
38
|
+
### Internal
|
|
39
|
+
|
|
40
|
+
- Added a host-API adapter layer that uniformly supports both old and new host interface shapes.
|
|
15
41
|
|
|
16
42
|
## [0.5.3] - 2026-10-27
|
|
17
43
|
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
<table>
|
|
19
19
|
<tr>
|
|
20
|
-
<td align="center" width="50%"><img src="./assets/docs/qqgroup.jpg" height="360" alt="QQ 群二维码" /><br /><b>QQ 开发者交流群</b><br /><sub
|
|
20
|
+
<td align="center" width="50%"><img src="./assets/docs/qqgroup.jpg" height="360" alt="QQ 群二维码" /><br /><b>QQ 开发者交流群</b><br /><sub>1群: 1032635674 · 2群: 1056948758</sub></td>
|
|
21
21
|
<td align="center" width="50%"><img src="./assets/docs/qqchannel.jpg" height="360" alt="QQ 频道二维码" /><br /><b>QQ 开发者社区频道</b><br /><sub>频道号: 20dnumts4z</sub></td>
|
|
22
22
|
</tr>
|
|
23
23
|
</table>
|
|
@@ -218,7 +218,7 @@ src/
|
|
|
218
218
|
|
|
219
219
|
## 会话路由
|
|
220
220
|
|
|
221
|
-
sessionKey: `qqbot:${appId}:${scope}:${peerId}
|
|
221
|
+
sessionKey: `qqbot:${appId}:${scope}:${peerId}`,新会话铸造 UUID 会话 id 并持久化到 `model-prefs.json`,重启后按持久化 id 恢复;0.5.x 老会话按原派生 id 沿用。
|
|
222
222
|
|
|
223
223
|
解析策略:进程内复用 → 持久化恢复 → 全新创建。
|
|
224
224
|
|
package/README_EN.md
CHANGED
|
@@ -17,7 +17,7 @@ Scan to join the QQ group / channel
|
|
|
17
17
|
|
|
18
18
|
<table>
|
|
19
19
|
<tr>
|
|
20
|
-
<td align="center" width="50%"><img src="./assets/docs/qqgroup.jpg" height="360" alt="QQ Group QR Code" /><br /><b>QQ Developer Group</b><br /><sub>Group
|
|
20
|
+
<td align="center" width="50%"><img src="./assets/docs/qqgroup.jpg" height="360" alt="QQ Group QR Code" /><br /><b>QQ Developer Group</b><br /><sub>Group 1: 1032635674 · Group 2: 1056948758</sub></td>
|
|
21
21
|
<td align="center" width="50%"><img src="./assets/docs/qqchannel.jpg" height="360" alt="QQ Channel QR Code" /><br /><b>QQ Developer Channel</b><br /><sub>Channel ID: 20dnumts4z</sub></td>
|
|
22
22
|
</tr>
|
|
23
23
|
</table>
|
|
@@ -209,7 +209,7 @@ src/
|
|
|
209
209
|
|
|
210
210
|
## Session Routing
|
|
211
211
|
|
|
212
|
-
sessionKey: `qqbot:${appId}:${scope}:${peerId}`,
|
|
212
|
+
sessionKey: `qqbot:${appId}:${scope}:${peerId}`; a UUID session id is minted for new sessions and persisted to `model-prefs.json`, resuming by the persisted id after restarts; pre-0.6 sessions keep their originally derived ids.
|
|
213
213
|
|
|
214
214
|
Resolution strategy: in-process reuse → persisted resume → fresh create.
|
|
215
215
|
|
package/cordis.patch.yml
CHANGED
package/lib/client.js
CHANGED
|
@@ -178,11 +178,12 @@ window.__ModuleLoader__.load({
|
|
|
178
178
|
* gone 表示插件未启用(从未注册过路由),recheck 废弃当前
|
|
179
179
|
* 定时器并立即重新轮询(新轮询链取代旧链,不产生双计时器)。
|
|
180
180
|
*/
|
|
181
|
-
function useBindState() {
|
|
181
|
+
function useBindState(enabled = true) {
|
|
182
182
|
const [state, setState] = (0, react.useState)(null);
|
|
183
183
|
const [gone, setGone] = (0, react.useState)(false);
|
|
184
184
|
const recheckRef = (0, react.useRef)(() => {});
|
|
185
185
|
(0, react.useEffect)(() => {
|
|
186
|
+
if (!enabled) return;
|
|
186
187
|
let stopped = false;
|
|
187
188
|
let sawRoute = false;
|
|
188
189
|
let generation = 0;
|
|
@@ -443,10 +444,14 @@ window.__ModuleLoader__.load({
|
|
|
443
444
|
}
|
|
444
445
|
}, "手动填写")));
|
|
445
446
|
}
|
|
446
|
-
/**
|
|
447
|
-
function BindPanelBody() {
|
|
447
|
+
/** 依据宿主相位渲染面板主体(可注入共享轮询结果避免双计时器) */
|
|
448
|
+
function BindPanelBody(props) {
|
|
448
449
|
usePanelStyles();
|
|
449
|
-
const
|
|
450
|
+
const injected = props?.state !== void 0;
|
|
451
|
+
const internal = useBindState(!injected);
|
|
452
|
+
const state = injected ? props.state : internal.state;
|
|
453
|
+
const gone = injected ? props.gone ?? false : internal.gone;
|
|
454
|
+
const recheck = injected ? props.recheck ?? (() => {}) : internal.recheck;
|
|
450
455
|
const [lastQr, setLastQr] = (0, react.useState)(null);
|
|
451
456
|
(0, react.useEffect)(() => {
|
|
452
457
|
if (state === null) return;
|
|
@@ -704,13 +709,14 @@ window.__ModuleLoader__.load({
|
|
|
704
709
|
* 保存仅提交变更键(服务端按白名单合并),保存成功后提示
|
|
705
710
|
* HMR 重载语义(进行中的机器人会话将重置)。
|
|
706
711
|
*/
|
|
707
|
-
function ConfigPanel() {
|
|
712
|
+
function ConfigPanel(props) {
|
|
708
713
|
useConfigPanelStyles();
|
|
709
714
|
const [initial, setInitial] = (0, react.useState)(null);
|
|
710
715
|
const [form, setForm] = (0, react.useState)(null);
|
|
711
716
|
const [busy, setBusy] = (0, react.useState)(false);
|
|
712
717
|
const [result, setResult] = (0, react.useState)(null);
|
|
713
718
|
const [loadError, setLoadError] = (0, react.useState)(null);
|
|
719
|
+
const bindPhase = props?.bindPhase;
|
|
714
720
|
(0, react.useEffect)(() => {
|
|
715
721
|
let stopped = false;
|
|
716
722
|
fetch(BIND_CONFIG_PATH, { cache: "no-store" }).then(async (res) => {
|
|
@@ -725,7 +731,7 @@ window.__ModuleLoader__.load({
|
|
|
725
731
|
return () => {
|
|
726
732
|
stopped = true;
|
|
727
733
|
};
|
|
728
|
-
}, []);
|
|
734
|
+
}, [bindPhase]);
|
|
729
735
|
const patch = (0, react.useCallback)((key, value) => {
|
|
730
736
|
setForm((current) => current === null ? current : {
|
|
731
737
|
...current,
|
|
@@ -789,7 +795,7 @@ window.__ModuleLoader__.load({
|
|
|
789
795
|
}, "正在加载配置…");
|
|
790
796
|
const dirty = Object.keys(form).some((key) => !shallowEqual(form[key], initial[key]));
|
|
791
797
|
const access = form.access ?? {
|
|
792
|
-
c2cMode: "
|
|
798
|
+
c2cMode: "allowlist",
|
|
793
799
|
c2cAllow: [],
|
|
794
800
|
groupMode: "open",
|
|
795
801
|
groupAllow: []
|
|
@@ -936,9 +942,14 @@ window.__ModuleLoader__.load({
|
|
|
936
942
|
fill: "var(------icon_primary, #1A1A1A)"
|
|
937
943
|
}));
|
|
938
944
|
}
|
|
939
|
-
/**
|
|
945
|
+
/** 设置页栏目:共享一份绑定状态轮询,驱动绑定面板与配置刷新 */
|
|
940
946
|
function QQBotSettingsSection() {
|
|
941
|
-
|
|
947
|
+
const { state, gone, recheck } = useBindState();
|
|
948
|
+
return (0, react.createElement)("div", null, (0, react.createElement)(BindPanelBody, {
|
|
949
|
+
state,
|
|
950
|
+
gone,
|
|
951
|
+
recheck
|
|
952
|
+
}), (0, react.createElement)(ConfigPanel, { bindPhase: state?.phase }));
|
|
942
953
|
}
|
|
943
954
|
/** 主面板页面:与设置栏目同一内容,包一层滚动留白容器(plugins.detail.actions 的跳转目标) */
|
|
944
955
|
function QQBotPage() {
|