deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
English | 中文
面向 DeepSeek Harness Web / Desktop 的 Codex 风格 SSH 远程工作区插件。它从本机 OpenSSH 配置发现 具体 Host,通过标准「添加工作区」选择远端目录,并把 DSH 原生文件、Shell 和终端操作 路由到远端的版本化 helper。
/api/file。本地文档也保留自身会话身份。文件相关的兼容边界见下文;这些改进不等同于完整的远程编辑器集成。
打开一个 SSH 工作区会话,点击 远程文件 或 远程终端:空会话的入口在输入框 上方,已有对话的入口在会话顶部。复用 DSH 原生右侧栏,不需要发送模型消息。
此功能要求当前 DSH 组合提供原生右侧栏;精简组合未提供侧栏服务时不显示入口, 提供侧栏但缺少具体文件/终端面板时按钮禁用,均不会阻止整个插件加载。 文件面板是预览器,不是可保存的远程代码编辑器。设计见 ADR-0005。
rg。显示搜索可用性、错误原因及修复建议,
不自动安装远端依赖;补装后点击刷新即可,无须中断正在运行的任务。进程清理保证覆盖原始托管进程组及 PTY 的当前前台组;主动用 setsid / setpgid
脱离的后台服务不属于全权限模式下的任意进程树回收保证。受限模式额外由 bubblewrap
PID namespace 提供退出清理。插件不会按进程名扫描并终止其他任务。
默认数据平面已经改为:
本机 DSH Web
└─ dsh-ssh-remote
└─ system OpenSSH(保留原始 Host alias)
└─ 按内容寻址的 Python helper
└─ 用户私有 Unix-socket daemon
├─ dirfd 隔离文件系统
├─ 进程 / PTY supervisor
└─ 可恢复 client session
这个设计借鉴 Codex App Server 中很有价值的原则:版本化多路复用控制通道、健康检查、 能力协商、有界输出、稳定资源 ID 和断线恢复,但不会把两者描述成兼容协议。参考 Codex App Server 官方文档和 ADR-0004。
当前已经实现:
Host、Include、Match、ssh-agent、Keychain、
证书、FIDO/PKCS#11、ProxyJump、ProxyCommand、known_hosts 和 host-key 策略都交给
本机 ssh,插件不再复制一套残缺配置。curl | sh、postinstall 或远端包管理器。ctx.shell 在本地 sandbox argv 生成前完成远程路由,避免
把 macOS 的 sandbox 命令错误拿到 Linux 执行;前台和后台进程都有有界输出并可跨
connector 重连继续读取。read-only / workspace-write 进程与 PTY 使用
bubblewrap。缺少可验证 runner 时失败即关闭,绝不静默升级为远端账号完整权限。0.5.1 面向 DSH 0.2.0-rc.2。取消的连接探测即使遇到 broken pipe,也会回收 daemon
连接计数;握手阶段的连接级错误保留原始错误代码和提示。早期版本的 dsh-settings register API 和
ShellExecutor 的 run/start 接口已分别被标准 Cordis Config 和单一
execute() 方法取代,插件已随之适配。SSH 上传中断只会令本次连接失败。
当前公开接口仍带来以下用户可见限制:
ssh://alias/remote/path。远端源码不会复制进去。SubprocessRuntime.spawn() 是同步接口,必须立即返回本机 PID。直接使用该底层
seam 的调用仍保留「每进程 system SSH」兼容路由;正常模型 Shell 与终端走 helper。listDir() 暂无分页契约;标准 FS 遇到超过 1000 项的目录会诚实失败,工作区
选择器则使用有界的「只扫描目录」模式。原生文件面板有独立的 truncated 契约,
展示有界结果并明确标注截断,不将缺失项伪装成完整目录。要删除 anchor 和最后一层路由 hook,仍需 DSH 上游提供一等
{ hostId, remotePath, runtime } 工作区契约。
0.2.0-rc.2 或兼容的更新 0.2.x 版本。~/.ssh/config 中存在具体 Host alias,且 ssh <alias> 的 batch 连接可用。glob / grep 搜索需要远端 PATH 中提供 rg(ripgrep)。插件会使用
远端二进制并转换工作区路径,不会把本机打包的可执行文件发送到另一种操作系统运行。read-only / workspace-write 进程和 PTY 隔离需要 Linux bubblewrap (bwrap);
文件操作本身始终独立使用 dirfd 限制。请把 User、Port、代理和认证信息写在 OpenSSH 配置里,不要编码为
ssh://user@host:port:
Host devbox
HostName devbox.example.com
User you
Port 22
IdentityFile ~/.ssh/id_ed25519
ProxyJump bastion
若以后删除该具体 alias,已持久化工作区会在新建 SSH 连接前失败即关闭,不会把 alias 退化成普通 DNS 主机名继续连接。
在 Web 使用前先运行一次 ssh devbox,按你的 OpenSSH 策略核对新主机指纹。
helper 连接固定使用 BatchMode=yes。已由 agent/Keychain 托管的密钥、证书和预授权
硬件密钥继续由 OpenSSH 处理,但 Web 后台连接无法回答交互式密码、PIN、passphrase 或
MFA 提示;请先准备好 agent/登录会话。
# npm 发布后
dsh plugin --profile web add dsh-ssh-remote
# 直接从 GitHub 安装
dsh plugin --profile web add 'github:CrazyShout/dsh-ssh-remote'
重启 dsh web,打开「设置 → 内置插件 → SSH Remote」,可以先连接,也可以直接在「添加工作区」
中选择主机。首次连接会自动安装匹配版本的 helper。
官方 Desktop 复用同一套 Web 客户端和 Host 插件接口。在桌面应用的插件管理页面中安装
github:CrazyShout/dsh-ssh-remote,然后重启应用,即可使用「SSH Remote」设置和远程
目录工作区选择器。请确认桌面应用内置的是兼容的 DSH 0.2.x 引擎,最低版本为
0.2.0-rc.2;旧 0.1.x 引擎应继续使用插件 0.3.1(Git commit 1432649)。
不同桌面发行版的 profile 可能不同,CLI 的 --profile web 安装命令不应代替桌面应用
自己的插件管理入口。
Harness 会把精确映射保存在 $DSH_HOME/ssh-workspace-anchors.json,anchor 目录位于
$DSH_HOME/ssh-workspace-anchors/。其他本地路径继续使用原来的本机 provider。
0700,Unix socket 为 0600;恢复必须同时通过稳定
clientId 与恒定时间比较的随机 token。workspace/open 是唯一接受绝对路径的文件请求;后续请求只能使用 root fd 下的相对
路径,拒绝 ..、NUL 和符号链接穿越。operationId。只有密码学恢复到同一 server session
后,断线 mutation 才允许最多重放一次。~/.ssh/config、私钥或 known_hosts。POSIX 没有通用的「仅当路径仍指向 inode X 时 rename」原语。helper 会串行化自身写入、
在发布前复核身份和内容并原子发布,但任意不合作的外部 writer 仍可能卡入最后一次检查到
rename 的极短窗口。能力会诚实报告 externalWriterRaceFree: false。
npm ci
npm run test:helper
npm test
npm run build
# 可选真实远端验收:自动创建并清理一个 /tmp/dsh-ssh-smoke.* 测试目录
node scripts/smoke-remote.mjs YOUR_SSH_ALIAS
CI 覆盖 Node 22/24 与 Python 3.8/3.9/3.10/3.12。仓库提交 lib/,因为 DSH 可以直接从
Git 安装,不应依赖安装时执行构建脚本。
设计记录:
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。