dsh-remote-workspace
为 DeepSeek Harness(DSH)提供 SSH 远程工作区能力:已核验的服务器身份、失败关闭的 Agent 执行路由、远端文件与命令操作;提供 Windows 离线一键安装包,无需 Node.js 或构建工具。
- Stars
- 1
- Language
- TypeScript
- Created
- Aug 24, 2026
- Updated
- Aug 25, 2026
Introduction
DSH Remote Workspace
DSH Remote Workspace 不是另一个 SSH 终端。它让本地目录与服务器目录并列成为明确的工作区目标:选择远端工作区后,Agent 的文件工具与普通命令才会路由到已核验的 SSH Provider;当身份、连接或权限无法确认时,操作会失败关闭,而不会静默回落到本机。
当前项目状态(2026-08-25)
v0.6.0 已通过 GitHub Releases 公开发布。 普通用户下载离线安装包即可完成安装,无需 Node.js、源码或构建工具。运行时仍精确锁定 DSH Desktop
2.0.2/ DSH core0.1.1-rc.2——要让任意版本的 stock DSH 无门槛安装,仍需上游提供稳定的Workspace Provider API v1扩展点。
- 公开分发已上线: Releases 提供
dsh-remote-workspace-release-vX.Y.Z.zip,内含预构建插件、核心兼容产物(逐文件 SHA-256 清单)、CHECKSUMS.txt 与中文安装指南;按下方“公开安装全过程”执行即可。 - 上游沟通持续进行: 已在 DeepSeek Harness 官方仓库发布 Workspace Provider API v1 设计讨论,内容涵盖无凭据目标模型、断联即失败关闭、会话兼容与 Agent 执行路由。
- 安全承诺: 服务器密码、私钥内容与认证令牌不会提交到本仓库、上游 Discussion、Session、RPC、日志或对话中。
- 下一步: 跟进上游对 API 边界的反馈,推动核心兼容层收敛为标准插件扩展;期间按版本迭代维护离线安装包与兼容矩阵。
功能演示
① 新建连接 — KEY ONLY 认证 · 测试连接核验主机指纹 |
② 创建服务器工作区 — 目标显式化 · 允许根目录校验 · Agent 路由 |

整体路由概念循环演示。以上画面均为脱敏重建:示例地址使用 RFC 5737 保留段 203.0.113.10,无真实服务器或密钥数据;动画由 Huashu-Design 生成,源文件见 docs/assets/src。
查看完整交互版 ·
安全策略 ·
兼容性说明
它解决什么问题
| 过去 | 使用 DSH Remote Workspace 后 |
|---|---|
| Agent 不知道命令究竟在哪台机器执行 | 工作区本身就是执行目标,本地与远端清晰区分 |
| 远程连接依赖重复登录或临时命令拼接 | 连接配置、主机指纹与允许目录组成可复用身份 |
| 连接失败时容易误把操作落到本机 | 身份失配、断联或 Provider 不可用时直接失败关闭 |
| 远端目录缺少风险边界 | 路径在服务器端规范化后校验,越界访问被拒绝 |
一次操作如何到达服务器
| 步骤 | 用户与系统发生的事 |
|---|---|
| 01 · 选择 | 在工作区列表中选择已连接的服务器目录,而非本地路径 |
| 02 · 核验 | 使用密钥对 / SSH Agent、主机指纹及允许根目录确认目标身份 |
| 03 · 路由 | Agent 的文件读写与普通命令按当前 WorkspaceTarget 进入 SSH Provider |
| 04 · 执行 | 远端进程受 DSH 权限策略与工作目录边界约束;出现不确定状态立即停止 |
核心能力
连接与身份
- 设置中提供一级“远程连接”栏目;新建连接默认选择密钥文件认证,也可切换到 SSH Agent。
- 可在当前 DSH Host 生成独立的 ED25519 密钥对;界面只获得公钥、指纹与私钥路径,私钥内容不会返回。
- 配对帮助覆盖通用 Linux / 宝塔、阿里云、腾讯云、华为云、AWS、Azure 与 Google Cloud。
- 首次连接确认主机指纹;后续严格校验
known_hosts,支持自动连接与断线重试。
工作区与文件
- 在“新建工作区”中并列选择本地目录或服务器目录;远端目录注册为结构化
WorkspaceTarget,不会伪装成本机路径。 - 远端目录浏览、UTF-8 文本读取与带版本写入均限制在允许根目录内。
- 工作区侧栏在目录右侧显示服务器 IP:连接时为蓝色
●,断联或 Provider 不可用时为红色×,并配有非颜色状态文本。
Agent 执行
- 远程工作区的文件工具和普通 shell 子进程按精确的 Agent 身份路由到 SSH Provider。
- Provider 缺失、身份不匹配或连接断开时不会回落到本机执行。
- 当前覆盖 Agent 文件工具与普通 shell 命令;交互式 SSH PTY / persistent terminal 暂未提供,调用会明确失败。
安全设计
root登录、整机目录/与/root均为高风险操作。它们必须经过不可跳过的显式确认;取消、关闭、点击遮罩或按 Esc 均不会授权。
- 私钥不离开 Host:仅保存路径引用,不进入 Renderer、HTTP 响应、日志、对话或剪贴板。
- 路径不可逃逸:远端路径会在服务器端
realpath后校验允许根目录,阻止..与符号链接越界。 - 主机身份固定:工作区绑定主机、端口、用户名与主机指纹;任一身份字段改变都会使旧工作区失效。
- 写入不盲覆盖:文本更新携带内容版本,发生冲突时拒绝写入。
- 远程清理可证明:普通命令使用受监督的独立进程组;不确定、断联或异常退出均会保留保护性 cleanup fence,而不是把状态误判为成功。
详细边界见 SECURITY.md。
平台、兼容性与发布状态
| 项目 | 当前状态 |
|---|---|
| DSH Desktop 与本机 Web | 共享同一套 Client / Host 插件能力 |
| Web 场景的 SSH 发起位置 | DSH Web Host 所在机器,而不是浏览器所在机器 |
| 支持的运行时 | DSH Desktop 2.0.2 / DSH core 0.1.1-rc.2(发行包内置对应核心兼容产物,逐哈希校验) |
| stock DSH 任意版本 | 尚不能宣称兼容:上游仍缺少 Workspace Provider API v1 |
| 面向公众发布 | 已开放:GitHub Releases 离线一键安装包(MIT 许可,附上游许可归属) |
本仓库同时包含 SSH 插件源码与 DSH core 兼容补丁。补丁精确对应 DeepSeek Harness b150a551b8d465e31e418e1b2eaf5e79bbb7d28e,不包含上游仓库、依赖目录或本地连接数据。
快速开始
公开安装全过程(GitHub Releases,v0.6.0 起)
面向普通用户的离线安装包,无需 Node.js 或任何构建工具。
第 1 步 · 自检环境
- Windows 10/11(系统自带 PowerShell 5.1+ 即可)。
- DeepSeek Harness Desktop 必须是 2.0.2(内置 DSH core 0.1.1-rc.2),见 Desktop 关于页版本号。其他版本会被安全拒绝。
- 记下两个路径备用:
DSH Desktop.exe所在目录;Desktop 安装目录下的resources\app.asar.unpacked\node_modules\@deepseek-ai\dsh。
第 2 步 · 下载与校验
从 Releases 下载 dsh-remote-workspace-release-vX.Y.Z.zip。右键文件 → 属性 → 勾选"解除锁定"→ 解压后进入文件夹。入口脚本会自动按 CHECKSUMS.txt 校验全部文件(fail-closed);也可手动核对:
Get-ChildItem -File | Get-FileHash SHA256 # 与 CHECKSUMS.txt 逐行对照
第 3 步 · 完全退出 DSH
退出 DSH Desktop 与 DSH Web Host(含托盘图标)。安装器自带进程守卫:检测到残留进程会点名 PID 并拒绝继续。
第 4 步 · 执行安装
cd <解压出的文件夹>
# Desktop + Web 双端(推荐):
powershell -ExecutionPolicy Bypass -File .\install-release.ps1 `
-DshDesktopExecutable '<DSH 安装目录>\DSH Desktop.exe' `
-DshPackageRoot '<DSH 安装目录>\resources\app.asar.unpacked\node_modules\@deepseek-ai\dsh'
# 只用 Web 端:省略 -DshDesktopExecutable 即可
官方 dsh 命令已在 PATH 时可省略 -DshPackageRoot(安装器会自动发现并逐候选验证)。安装流程:完整性校验 → 预检(版本/身份/哈希/进程)→ 备份 → 事务化替换 → 写入收据。任何一步失败都会自动恢复原状,备份保留于 <DSH_HOME>\backups\remote-workspace\<时间戳>。
第 5 步 · 旧版会话日志迁移(如被提示)
若预检发现 v0 会话日志会拒绝安装并列出全部文件与迁移命令。先预览再执行:
powershell -ExecutionPolicy Bypass -File .\scripts\migrate-session-logs.ps1 -DshHome "$env:USERPROFILE\.dsh" -WhatIf
powershell -ExecutionPolicy Bypass -File .\scripts\migrate-session-logs.ps1 -DshHome "$env:USERPROFILE\.dsh"
# 或在安装命令上直接追加 -MigrateV0Sessions 一步完成
迁移只改写头行版本号(正文逐字节不变),原文件备份到 <DSH_HOME>\backups\session-v0-migration\<时间戳>。
第 6 步 · 重启并验收
重启 DSH Desktop 后依次确认:
- 设置页出现"远程连接"入口;
/dsh-remote/api/health返回workspaceProvider=READY;- 新建 SSH 连接并创建服务器工作区,状态 connected;
- 打开一个旧会话仍能正常加载。
回滚与卸载
- 整体回滚(插件 + 核心 + profile 三者精确还原):同一安装命令追加
-RestoreLastInstall。 - 仅移除插件注册:
scripts\uninstall-local.ps1;完整还原必须用-RestoreLastInstall。 - 回滚不会删除已保存的连接元数据。
上游标准 bundle 安装(长期方向)
普通用户最终应通过 DSH 的标准 bundle 安装机制安装 dsh.bundle.patch 指向的 cordis.patch.yml,而无需替换 DSH core 包。
此路径仍待上游支持:stock DSH 尚未提供本插件要求的 Workspace Provider API v1。在官方扩展点落地前,GitHub Releases 的离线安装包是唯一的公开分发方式。
开发者 fork / compat 安装
仅面向维护者。 安装器会事务性替换锁定版本的本地 DSH runtime 包;普通用户不要执行。
安装器严格绑定 DSH Desktop 2.0.2 与 DSH core 0.1.1-rc.2。先完全退出 DSH Desktop 和 DSH Web Host,构建相邻的 dsh-core-remote-provider 与本插件,再为 Desktop 显式传入可执行文件:
powershell -ExecutionPolicy Bypass -File .\scripts\install-local.ps1 `
-DshDesktopExecutable 'C:\path\to\DSH Desktop.exe' `
-DshPackageRoot 'C:\path\to\resources\app.asar.unpacked\node_modules\@deepseek-ai\dsh'
只安装 Web profile 时无需 Desktop 可执行文件:
powershell -ExecutionPolicy Bypass -File .\scripts\install-local.ps1 -Profiles web
若要撤销最近一次已完成安装并恢复安装前的插件、core 与 profile:
powershell -ExecutionPolicy Bypass -File .\scripts\install-local.ps1 `
-DshPackageRoot 'C:\path\to\resources\app.asar.unpacked\node_modules\@deepseek-ai\dsh' `
-RestoreLastInstall
uninstall-local.ps1 仅移除插件注册;需要完整恢复时必须使用 -RestoreLastInstall。恢复与卸载均不会删除已保存的连接元数据。
旧版 v0 会话日志迁移
新版 core 只读取 v1 会话格式。安装前若检测到 v0 日志,安装器会失败关闭并列出全部文件;可先预览再原位迁移(仅重写头行版本号,正文逐字节不变,自动镜像备份到 $DSH_HOME/backups/session-v0-migration/):
powershell -ExecutionPolicy Bypass -File .\scripts\migrate-session-logs.ps1 -WhatIf # 预览
powershell -ExecutionPolicy Bypass -File .\scripts\migrate-session-logs.ps1 # 迁移
或在重跑安装器时显式加 -MigrateV0Sessions 由其先行迁移。损坏、未知版本或形状不符的日志会被跳过并逐条说明,永不盲改。
兼容原生模式:首次工作区引导
维护者可把一份不含密钥内容、密码、Token 或命令的远端连接/目录声明传给安装器。安装器只把它原子写入插件自己的待导入队列;下一次启动时,插件会等待 Provider API v1 就绪,再通过 DSH 的结构化工作区服务创建远端工作区。它不会直接编辑 session JSONL、工作区数据库或把远端路径伪装成本机路径。
连接配置保存在 $DSH_HOME/remote-workspace/<profile>/connections.v1.json,其中仅含非机密元数据与私钥路径引用。自动生成的密钥位于 $DSH_HOME/remote-workspace/<profile>/keys/<uuid>/id_ed25519;删除连接不会删除密钥文件。
构建与验证
pnpm install
pnpm typecheck
pnpm test
pnpm build
pnpm verify:public-release # 发布门禁:清单 / pack 审计 / 内容审计,输出 READY
# 维护者:产出发布物
powershell -ExecutionPolicy Bypass -File .\scripts\export-core-artifact.ps1 # 核心兼容产物 + 逐文件 SHA-256 清单
powershell -ExecutionPolicy Bypass -File .\scripts\export-release-bundle.ps1 # 离线安装包(CHECKSUMS.txt + 中文指南)
pnpm pack:public # 标准 npm 包(prepack 自动重跑完整校验)
# 安装链路冒烟套件(含普通用户端到端仿真:下载 zip → 解压 → 校验 → 安装 → 回滚)
powershell -ExecutionPolicy Bypass -File .\scripts\test-installer.ps1
- 插件类型检查与 Host / Client 构建通过;插件测试为 20 个文件、171 项。
- DSH core Workspace Provider 定向测试 7 项通过;Windows 上两项符号链接用例会受当前账户“创建符号链接”权限影响,不属于本功能断言失败。
- 已完成密钥生成、root 授权门、主机指纹、远程命令清理与 SSH key-only 连接的隔离验证;验证不会读取或输出私钥内容。
- 安装链路已在真实 Desktop / Web Host 完成功能验收(连接、远端工作区创建、会话读写与回滚);界面视觉走查随版本迭代持续进行。
pack:plugin / pack:public 是公开发布的标准 npm 入口,发布元数据已确认(MIT,见 LICENSE),prepack 会自动执行类型检查、构建、发布门禁与内容审计;pack:developer 用于本地受限的 fork / compat 包验证。
展开:完整安全与安装约束
安全约束
- SSH 密码与键盘交互认证始终禁止。自动生成的私钥只写入当前 DSH Host 的插件数据目录;加密密钥须预先加载到 SSH Agent。
- 每次生成密钥都会使用独立随机目录且绝不覆盖旧文件。Windows 仅允许当前账户、SYSTEM 与 Administrators;POSIX 使用目录
0700、密钥文件0600。权限无法严格验证时失败关闭。 - 插件不会自动修改服务器的
authorized_keys;用户必须在帮助指引下显式安装公钥,并保留救援会话完成测试。 - 首次配置必须检测并确认
SHA256:主机指纹。ssh-keyscan不兼容时,插件会以禁用全部认证、远端命令和终端分配的ssh/ssh.exe回退,只协商并读取服务器公钥。 - 连接管理、目录与文件 API 只调用固定 Python helper;只有已创建远程 Session 的 Agent shell 工具可在所选服务器工作区执行命令,并持续受 DSH 权限策略与工作目录边界约束。
root、/与/root风险确认会随主机、端口、用户名或主机指纹变化而失效,必须重新确认。- 远程普通命令由 Linux subreaper 监督,使用独立进程组,并执行
TERM → grace → KILL。执行前会原子持久化 cleanup fence;同一连接的并发执行世界全部经独立校验静止后才清除。Host 强杀、断电或崩溃后的 fence 只允许 SSH 身份完全一致的新上下文继承;身份修改与连接删除仍会被阻断。命令输出、旧控制文件、SSH 退出码或传输关闭都不能伪造成功。管理员只有在服务器侧独立确认残留进程已清理后,才能在退出 DSH 后备份并移除该 fence 文件以恢复。 - 连接管理 API 仅接受直接 loopback 请求。远程浏览器必须通过 SSH 本地端口转发访问;DSH 当前没有可复用的插件认证 seam,因此非 loopback Web 管理被安全禁用。
安装约束
脚本会在任何修改前严格核对 DSH core 源码、已安装 runtime 的 name / version、所需 core seam 与应用退出状态;再校验同级实际 runtime package 的 name / version 与锁定 hash。随后取得按 $DSH_HOME 隔离的进程互斥锁和独占文件锁,备份 Desktop / Web profile、旧插件与受影响的 core package,再以同卷暂存目录进行替换。安装回执绑定规范化路径、备份与 SHA-256;恢复会在首次写入前完整验证 schema、集合唯一性、备份存在性、哈希和 manifest。任一步失败或下次发现未完成事务时,都会恢复精确旧状态。