# DSH Process Guardian [English](README.md) 这是一个用于 [DeepSeek Harness(DSH)](https://github.com/deepseek-ai/deepseek-harness) 的 Cordis 插件,用于拦截常见的、由模型误判产生的 DSH 主进程终止操作。 ## 根因 触发本插件开发的事故并不是 DSH 自动“恢复旧状态”。当时有两个互相独立的根任务在同一个工作区执行相反目标,并持续覆盖同一批文件。一个模型发现文件被另一任务改回后,误判 DSH 服务在恢复旧文件,定位到 `dsh web` 的 PID,并执行了: ```bash kill ``` Bash 工具本身是该 DSH 进程的子进程,因此这条命令会终止宿主、打断所有任务,并使工具结果无法正常持久化。命令和界面中的描述均由模型生成,不是 DSH 内置的清理逻辑。 ## 保护方式 插件启动时记录 DSH 宿主 PID、父 PID、进程组、命令行、进程名和 `dsh web --port`。在 `bash`、`pwsh` 或 `terminal_send` 命令执行前,通过不可被后续监听器覆盖的 `tools.guard()` 拦截以下风险: - 直接 `kill` DSH PID; - `kill $PPID` 或以负 PGID 终止 DSH 进程组; - 能匹配 DSH 的 `pkill`、`killall`; - `pgrep`/`lsof` 配合 `xargs kill`; - 带有明确 DSH PID 的 Node、Python、PowerShell 或 `taskkill` 调用。 `kill -0 ` 这类只探测进程是否存在的操作仍然允许;终止无关的本地开发服务器 PID 也仍然允许。 ## 安装 使用 DSH 插件管理器,把已标记的版本安装到 `web` profile: ```bash dsh plugin --profile web add -w github:emeryxu1-blip/dsh-process-guardian#v0.1.1 ``` 显式的 `-w` 表示确认 DSH profile 是其单包 pnpm workspace 的根目录。该命令会安装依赖,并把包声明的 `dsh.bundle` 加入 profile。无需启动另一个服务即可检查组合结果: ```bash dsh --profile web --dump-config ``` 安装后正常重启一次 DSH,使保护在新任务开始前生效。 如需卸载: ```bash dsh plugin --profile web remove dsh-process-guardian ``` ## 配置 | 配置项 | 默认值 | 作用 | |---|---:|---| | `protectProcessGroup` | `true` | 防止通过负 PGID 向已发现的 DSH 进程组发送信号。 | | `protectTerminalSend` | `true` | 检查提交到持久终端的命令。 | | `additionalProtectedPids` | `[]` | 在本次 DSH 生命周期内额外保护的固定 PID。 | | `additionalProtectedPorts` | `[]` | 在动态 `lsof`/`xargs kill` 中额外保护的端口。 | | `additionalProcessNames` | `[]` | 额外保护的进程名或选择器。 | 一般无需手动填写 DSH PID 或端口;插件会自动发现。 ## 边界 本插件解决“DSH 误杀自身”的直接路径,但不会自动仲裁多个根任务对同一工作区的所有权。不要让目标冲突的任务同时修改同一个 checkout;应使用不同 worktree,或先停止其中一个任务。 这是一层静态命令保护,不是操作系统级安全沙箱。隐藏在不透明脚本、package script、编码载荷、原生程序或多次终端输入中的信号仍可能绕过检查。恶意代码隔离应使用独立系统用户、容器、虚拟机或 syscall 策略。详见 [SECURITY.md](SECURITY.md)。 ## 开发 ```bash pnpm install pnpm test ``` ## License MIT