前言¶
DSH(DeepSeek Harness)采用「一切皆插件」的架构,开发者可以通过插件扩展功能。官方的 QQ Bot 插件(@tencent-connect/dsh-qqbot)运行后,所有会话都共享同一套配置和文件路径,容易造成上下文混乱、权限边界模糊。irislilymoon/dsh-qq-workspace 是一个客户端插件,它给 QQ Bot 指定独立工作目录,把会话按工作区分组,并提供会话级别的安全锁,让模型只能访问工作区内的文件和工具。
插件定位¶
这是一个 DSH Desktop 和 dsh web 通用插件,由 irislilymoon 维护,星标数 0。它不替代官方 QQ Bot 插件,而是在其基础上增加工作区管理、上传路由、上下文压缩和会话安全锁能力。
核心功能¶
1. 工作区目录与分组¶
在「设置 → QQ 工作区」里可以查看和修改 QQ 机器人的工作目录。插件支持系统文件夹选择器,也可以手动填写绝对路径;目录不存在时自动创建。
应用后,插件会在当前 DSH profile 的 cordis.patch.yml 的 im-qqbot.config.cwd 写入新目录,并创建/复用对应的 DSH 工作区(Desktop 和 dsh web 通用)。新产生的 QQ 会话会自动加入该工作区。
2. 旧会话清理¶
应用时插件会重置 QQ 会话 ID,下一条 QQ 消息在新目录新建会话。旧的 QQ 会话会移入 ~/.dsh/qq-workspace/trash/<时间戳>/,而不是永久删除;其他对话与目录内文件不受影响。
3. 上传文件路由¶
QQ 上传的图片/文件会落到工作区的 qq-uploads/,模型可以直接用 read / read_image 处理;设置页可选择长期保留。
4. 上下文管理¶
在「设置 → QQ 工作区 → 上下文管理」里开启。只作用于 QQ 工作区会话;你自己的普通会话继续使用 DSH 内建压缩。
两种触发条件,满足任一即可:
- 上下文比例(默认 80%)
- 对话轮数(默认关闭,可设为 N 轮)
触发后在下一次模型请求前,把较早的完整轮次交给 DSH 的压缩后端总结成一条摘要;最近一轮始终保留。只有一轮时不会压缩。
保留最近上下文:默认 15%,也可自定义 0–50%。含义是按当前上下文 Token 数的比例保留最近原文,并按完整轮次对齐。
压缩模型默认使用当前会话模型,不单独选择;每次压缩会多一次模型请求。摘要提示词和结构由当前 agent preset 的 dsh-compaction-basic 提供。
5. 持久化文件¶
在「设置 → QQ 工作区」分别开启。两个开关互相独立,默认都关闭:
- SOUL.md(人格):定义助手的语气、风格、价值观和边界。注入在系统提示前部;模型只在你明确要求时修改它。
- MEMORY.md(长期记忆):保存用户偏好、项目背景、重要决定等长期事实。模型可以主动维护。
每个文件每轮最多注入 12000 字符,超出会截断并提示模型用 read 查看全文;设置页编辑上限 60000 字符。注入前会经过与安全锁相同的路径脱敏。
6. 安全锁¶
安全锁仅对 QQ Bot 自动创建的会话生效,把模型限制在工作区内部。
在「设置 → QQ 工作区」打开安全锁后:
- 只允许 read、read_image、glob、grep、ask_user_question;可写权限下额外允许 write、edit。
- 未勾选「禁止联网」时额外允许 web_search 和 web_fetch;勾选后两者都禁用。
- bash、PowerShell、终端、working_directory、子代理、MCP、skill、文件发送、run_code 全部禁用;未列入白名单的新工具一律拒绝。
「禁止联网」开关同时控制 web_search / web_fetch:勾选=禁止,取消=允许。取消时 DSH 的抓取器会校验并固定公网 IP、拒绝本机/内网地址、只跟随同源跳转。
所有文件路径必须是工作区内的相对路径;绝对路径、盘符、UNC、设备名、冒号/ADS、~、..、沙箱升级参数和指向工作区外的符号链接/目录联接都会被拒绝。路径校验使用会话实际工作目录,并且该目录必须位于工作区内。
工作区内的 .git、.dsh、.agents、.vscode 控制目录,以及 AGENTS.md、CLAUDE.md、.mcp.json 等控制文件不允许读写;glob/grep 的搜索根目录包含这些控制项时也会被拒绝。
模型只能知道工作区名字(如 qq-workspace),看不到绝对路径、父目录、盘符、用户目录、操作系统或环境变量。系统提示只保留安全锁段(以及 prompt-studio 的自定义提示),DSH 的编码代理、Agent Teams、文件引用和环境段会被移除;工具结果中的路径会被替换。
权限卡点:read-only 仍然是只读;workspace-write 仍然是工作区写入;danger-full-access 在 QQ 会话里按工作区写入语义执行。插件会优先把沙箱策略封装到工作区;如果宿主沙箱服务无法封装,所有允许的文件工具仍会经过工作区路径校验,权限选择器保持你原来的显示。此时真正的边界是工具守卫和路径校验,而不是宿主沙箱。
QQ 命令锁:安全锁开启时,/model 只显示当前模型(不列出其他模型、不提供切换按钮),带参数的 /model 直接拒绝;/preset 只显示当前预设,带参数或 reset/default 的切换直接拒绝。模型和预设的切换请到 DSH 宿主端(Desktop / Web)进行。
设置页的安全锁卡片提供独立开关:总开关、核心保护(文件/工具/路径/环境)、禁止联网(网页搜索/打开网页,勾选=禁用)、禁止 QQ 切换模型、禁止 QQ 切换预设。
命令锁通过在 QQ SDK 的斜杠命令中间件中插入一个全局守卫实现;安装时会备份 slash-command.js.qq-workspace.bak。QQ SDK 更新后若补丁被覆盖,插件会在启动时提示重新安装/重启。
与 dsh-prompt-studio 兼容:当提示词工作室的完整替换段存在时,不额外追加安全提示段;工具、路径和命令约束仍然生效。
工具守卫初始化失败时不会静默降级:插件会按故障安全策略把 QQ 会话的工具列表清空,并在设置页显示错误。
QQ 上传目录:插件会把官方 QQ 插件的 ~/.dsh-qqbot/media 重定向为工作区内的 qq-uploads/(Windows 目录联接,其他平台为目录符号链接)。QQ 消息里的媒体路径会被改写成 qq-uploads/文件名,因此安全锁允许模型用 read / read_image 直接处理你上传的图片和文件。切换工作区时会自动重指向,旧文件留在旧工作区。
上传保留策略:设置页「QQ 上传文件」卡片提供「长期保留上传文件」开关。开启时写入 QQ 配置的 im-qqbot.config.media.ttlHours: 0,官方媒体清理不再删除上传;关闭时恢复 24 小时自动清理。修改会热重载 QQ 插件。长期保留会让 qq-uploads/ 持续增长,请定期手动清理不需要的文件。
关闭安全锁后,QQ 会话恢复普通权限。安全锁状态保存在 ~/.dsh/qq-workspace/security.json。
安装与启用¶
从 GitHub 克隆或下载后,在 DSH 宿主(DSH Desktop 或 dsh web)里:
git clone https://github.com/irislilymoon/dsh-qq-workspace.git(或下载 ZIP 解压到任意目录)。- 设置 → 插件 → 添加插件,填写本目录的绝对路径,例如:
D:\Code\dsh-qq-workspace
- 启用插件并重启 DSH 宿主(宿主部分需要重启才生效)。
- 进入 设置 → QQ 工作区,选择工作区目录并应用。
兼容性与要求¶
插件宿主端和设置页 client 都是 web 平台实现,DSH Desktop 与 dsh web 都可以安装使用。前提是当前 profile 已经安装并启用官方 QQ Bot 插件(@tencent-connect/dsh-qqbot),本插件只扩展它,不替代它。
每个 profile 独立写入自己的 cordis.patch.yml;QQ SDK 命令补丁也只改当前 profile 的 qqbot-nodejs。Desktop 和 Web 可以分别安装本插件。
官方 QQ Bot 的偏好与媒体目录是全局的:~/.dsh-qqbot/model-prefs.json、~/.dsh-qqbot/media;本插件的安全锁状态 ~/.dsh/qq-workspace/security.json 也是全局。因此同一个 QQ 机器人同一时间只应在一个 profile 里运行:在另一个 profile 应用工作区会重置全局会话 ID、重指向媒体联接,影响正在运行的那个。
切换 profile 使用前:在目标 profile 里重新应用一次工作区并重启宿主。媒体联接会指向最后应用的工作区,旧工作区的 qq-uploads/ 保留在原处。
上下文管理还需要宿主提供 tokenMeter 和 llm 服务(DSH base 默认提供),并使用当前 agent preset 的 compaction 引擎(DSH base / standard preset 默认提供)。
适用场景与注意¶
适合在需要为 QQ Bot 建立独立工作目录、隔离会话上下文、控制文件访问权限的场景使用。
插件以当前 dsh 进程权限运行,安装前应检查源码与许可证(MIT)。同一 QQ 机器人同一时间只应在一个 profile 里运行,否则会重置全局会话 ID、影响正在运行的那个。
目录页与 GitHub¶
插件目录页:https://www.skillhub.cn/plugins/irislilymoon/dsh-qq-workspace
GitHub:https://github.com/irislilymoon/dsh-qq-workspace