dsh-vscode — 在 VS Code 侧栏使用 DeepSeek Harness (DSH)
把 DeepSeek Harness 的完整 Web UI 嵌入 VS Code 侧栏,像 Codex 的扩展那样在编辑器里直接使用 DSH。
侧栏 Webview 用 <iframe> 复用现有的 dsh web 页面,因此会话、流式输出、工具卡片、审批、预设、设置等全部功能都原样可用——不是重写的简化面板,而是完整的一体化体验。扩展负责「找到 / 拉起 DSH 服务 + 放进侧栏 + 恢复最近会话」,并额外提供编辑器上下文桥(把当前文件 / 选区 / git diff 一键喂给 DSH)。
功能
- 完整 DSH Web UI:侧栏内嵌
dsh web,功能与浏览器一致。
- 历史会话自动恢复:打开时拼
?session=<id>,直接回到最近一次对话。
- 自动拉起 / 复用:
127.0.0.1:3080 有健康 DSH 就复用,没有就按配置启动。
- 编辑器上下文桥:文件作为路径引用发送(不内联全文),选区 / git diff 直接内联。
- 📎 Add file 按钮:侧栏左下角,一键把文件加入会话(Codex 式)。
安装
方式 A:VS Code Marketplace(发布后)
code --install-extension name-loading.dsh-vscode
方式 B:本地打包安装
npm install -g @vscode/vsce
vsce package
code --install-extension dsh-vscode-0.2.0.vsix
方式 C:直接放入扩展目录(开发)
git clone https://github.com/name-loading/dsh-vscode ~/.vscode/extensions/dsh-vscode
然后 Ctrl+Shift+P → Reload Window,点左侧活动栏的 DSH(鲸鱼)图标。
建议放右侧:在 DSH 视图标题右键 → 移动到右侧(次级侧栏),这样和编辑器并排、不用左右来回切换。
编辑器上下文桥
把编辑器里的内容作为消息注入 DSH 当前会话(复用 Web UI 自己的 /api,无需改 harness):
| 命令 |
作用 |
内容形式 |
DSH: 询问选中代码 |
分析选中代码 |
内联(短) |
DSH: 询问当前文件 |
分析当前文件 |
路径引用 |
DSH: 解释当前文件 |
解释文件结构/职责 |
路径引用 |
DSH: 为当前文件写测试 |
写单元测试 |
路径引用 |
DSH: 审查当前改动 |
审查 git diff HEAD |
内联 |
- 文件类命令只发路径(
\绝对路径`(相对路径)+ 一句「先用 read 工具读取」),DSH 用自己的read` 工具去读文件,对话里不再出现几百行全文——Codex / Claude Code 的「文件作为引用」模型。
- 选区 / git diff 没有文件路径,仍内联内容(本身通常较短)。
- 📎 Add file 按钮(侧栏左下角):点击弹出文件选择器(可多选),把选中文件作为路径引用注入当前会话,agent 先读取、再等你下一步指令。
前提:文件类命令要求 DSH 当前会话的工作区 == 你在 VS Code 打开的那个文件夹,否则 agent 的 read 工具读不到文件。
工作原理
VS Code 侧栏 Webview
└─ <iframe src="http://127.0.0.1:3080/?session=<最近会话id>">
└─ 现有 DSH Web UI(完整功能)
└─ /api + WebSocket ──> dsh web 进程
- 复用优先:若
host:port 上已有健康的 DSH,直接接入,绝不重复启动。
- 自动拉起:没有就按配置启动
dsh web,探活成功后再把 iframe 指向真实 URL。
- 历史会话同步:扩展读取服务端
session.list,取最近一条非空会话,拼 ?session=<id> 打开。
- 生命周期:扩展只终止「自己启动的」进程;复用外部进程时不接管它的生死。
历史同步的前置条件
会话列表本身存在 DSH 服务端、跨端天然一致;「自动打开最近会话」依赖 Web UI 支持 ?session=<id> 深链(对 harness 的一处小改动):
- 改动:
packages/client/runtime/src/client/sessions/service.ts(新增 readDeepLinkSession(),让 ?session= 覆盖 localStorage 的当前会话)。
- 生效:重建 client 库
pnpm run build:lib:client,重启 dsh web。详见 docs/harness-deep-link-pr.md。
配置
开箱即用:默认 dsh.command = dsh、dsh.args = ["web"]、dsh.cwd = ""——适配 npm i -g @deepseek-ai/dsh 后 dsh 在 PATH 上的用户,且默认复用已运行的 DSH。
| 设置 |
默认 |
说明 |
dsh.command |
dsh |
启动 DSH 的可执行文件 |
dsh.args |
["web"] |
传给 command 的参数 |
dsh.cwd |
"" |
进程工作目录(空 = 继承 VS Code) |
dsh.host |
127.0.0.1 |
绑定主机(侧栏只能嵌入 loopback) |
dsh.port |
3080 |
监听端口 |
dsh.autoStart |
true |
视图可见且无服务时自动启动 |
dsh.reuseExisting |
true |
优先复用已运行的 DSH |
dsh.resumeRecent |
true |
打开时恢复最近一条非空会话 |
dsh.startupTimeoutMs |
30000 |
启动后等待可达的时长 |
源码 checkout(dsh 不在 PATH 上),在 VS Code 设置里加:
{
"dsh.command": "pnpm",
"dsh.args": ["run", "dsh", "web"],
"dsh.cwd": "/path/to/deepseek-harness"
}
命令
侧栏标题栏按钮(也注册为命令面板命令):
- DSH: Start / Reconnect (
dsh.start) — 探活/启动并重连。
- DSH: Stop Server (
dsh.stop) — 停止自己拉起的进程;复用外部实例时仅解除挂接。
- DSH: Open in Browser (
dsh.openExternal) — 用系统浏览器打开 DSH。
底部状态栏显示 DSH 状态,点击可一键启动 / 在浏览器打开。
已知限制
- 只嵌入 loopback(
127.0.0.1 / localhost)上的 DSH;跨主机/远程 DSH 需走浏览器。
- 侧栏宽度较窄时,DSH 的 Web 布局会自适应收窄(与窄窗口浏览器体验一致)。
- 部分 Web 动作若使用
window.open,会落在 iframe 内部而非新 VS Code 标签页;建议用「Open in Browser」处理需要独立窗口的场景。
- 「自动恢复最近会话」取的是最近一条非空会话(按
updatedAt),并非浏览器里精确的 dsh.sessions.current。
- 编辑器上下文桥的文件类命令依赖 DSH 会话工作区与 VS Code 工作区一致(见上文)。
项目结构
.
├── package.json # 扩展清单(视图容器、命令、配置项、图标)
├── extension.js # 宿主逻辑:Webview 视图 + 子进程生命周期 + 会话深链 + 上下文桥
├── media/
│ ├── dsh-icon.png # 扩展商店图标(128×128,DSH 鲸鱼 logo,黑白)
│ ├── dsh.svg # 活动栏图标(鲸鱼,currentColor 自适应主题)
│ ├── main.js # 侧栏 Webview 脚本(iframe + 状态 overlay + 📎 按钮)
│ └── style.css # 侧栏 Webview 样式
└── docs/
└── harness-deep-link-pr.md # 官方 harness 深链 PR 文本与补丁
纯 JavaScript、零构建步骤、无 npm 依赖(vscode 模块由扩展宿主在运行时提供)。
License
MIT