DeepSeek Harness Hub
← 返回列表

三体隔离 Agent 工作台yuntaojinghong/DeepHarness

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

把三个 AI 编程 Agent 隔离装进一个桌面客户端

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/13 · 已提供中文文档

DeepHarness:把三个相互隔离的 AI 编程 Agent 收进一个桌面工作台 —— DeepSeek Harness(官方 dsh)、Codex 与自研多步规划 Agent,目录 / 配置 / 权限白名单 / 插件作用域各自独立。Tauri 2 + React 19 + Rust,纯本地、零遥测。Three isolated AI agent workbenches in one desktop app.

综合分
29.7
GitHub 分
29.7
用户评分
★ Stars
0
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add yuntaojinghong/DeepHarness
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

DeepHarness

English · 中文

三个相互隔离的 Agent 工作台,装完即用。

DeepHarness 是一个 Windows 桌面客户端:把官方 DeepSeek Harness(dsh)连同便携版 Node 运行时一起装进安装包,同时提供两个自家 Agent。三个 Agent 在进程、工作区、会话、配置、日志、插件与内存配额上完全隔离——一个崩溃、越权或跑飞,都不会影响另外两个。

✨ 三个 Agent

1. DeepSeek Harness

官方 @deepseek-ai/dsh 运行时,随包内置(含便携版 Node),无需自行安装。

dsh 0.1.5 起官方 Web UI 需要每次启动重新生成的一次性 token,直接访问固定地址只会得到 401。DeepHarness 从 dsh 运行日志中解析出本次有效的地址,并交给系统默认浏览器打开;token 始终留在后端,界面与日志里一律脱敏为 token=**。

2. Codex

按需拉起本机已安装的 Codex CLI,独立 CODEX_HOME,流式输出转发到界面。启动前会探测本机 CLI 可用性,不可用时明确告知而非静默失败。

3. DeepHarness(自研原生 Agent)

不依赖任何外部 CLI 的自研循环,也是本项目真正的主体:

- 多步规划:目标 → 结构化计划(工具步骤 / 纯回答步骤),非法输出带错误反馈自动重试,步骤数有上限防失控
- 工具执行:读文件 / 写文件 / 列目录 / 建目录 / 删路径,每一次调用都过权限白名单
- 反思与重试:每步执行后由模型结构化评审(成功与否 / 摘要 / 是否重试 / 建议),失败自动重试一次;模型不可用时退化为确定性策略,保证循环一定有出口
- 长期记忆:SQLite(rusqlite bundled,免系统依赖)存 fact / preference / event / reflection 四类记忆,支持标签、重要度与分词召回;任务事件自动沉淀
- 插件系统:见下

🔌 插件系统(.dph-plugin)

一个插件就是一个 zip:根目录放 manifest.json 与 index.js。

// index.js
module.exports = {
tools: {
async count_lines(args, ctx) {
const files = await ctx.listDir(ctx.workspace);   // 经宿主白名单校验
ctx.log(workspace 下有 ${files.length} 项);
return { ok: true, count: files.length };
},
},
};

装进哪个 Agent 的 plugins/ 目录,就只有那个 Agent 能用它——插件作用域和会话、配置一样按 Agent 隔离。

三重隔离,缺一不可:

| 层 | 机制 | 挡住什么 |
| --- | --- | --- |
| 进程 | 每次工具调用起一个 node 子进程,返回即退出,超时直接杀 | 插件崩溃 / 死循环只影响这一次调用,不拖垮 Agent |
| 文件系统 | node --permission --allow-fs-read= | 越界读与任何写都被 Node 内核拒绝(ERR_ACCESS_DENIED) |
| 白名单 | ctx.readFile / writeFile / listDir 经 JSON Lines 回传宿主 | 与内置工具走同一道 PermissionStore 闸门,未授权路径拿到的仍是「需要用户授权」而不是文件内容 |

插件与内置工具同名时内置优先——插件不能顶掉内置工具。工具目录在一次任务开始时冻结,避免执行到一半插件被卸载后留下悬空步骤。

插件是可选增强:随包 Node 缺失、宿主落地失败、清单读不动,任一前置条件不满足都只是「没有插件工具」,内置工具与 Agent 启动完全不受影响。

🔒 权限模型

- 每个 Agent 有独立的白名单文件(permissions.json),互不可见
- Agent 自有的 workspace/ 隐式可读写;外部路径必须由用户显式授权(读 / 读写两种模式,记录授权时间与来源,原子落盘)
- 路径按规范化后的前缀匹配,C:\dir 的授权无法被 C:\dir-evil 绕过
- 旧版那个可以执行任意系统命令的 run_command 已被移除,Agent 的文件能力只剩白名单内的几个工具,越权时向模型返回明确的授权引导话术
- 每个 Agent 独占一个 Windows Job Object:独立内存配额 + kill-on-close,主应用退出自动回收全部子进程

🛠 技术栈

- 桌面壳:Tauri 2(Rust)
- 前端:React 19 + TypeScript(全量 strict)+ Vite 6 + zustand 5
- 核心:官方 DeepSeek Harness(@deepseek-ai/dsh,MIT)+ 便携版 Node
- 存储:SQLite(长期记忆,bundled 免系统依赖)+ 每 Agent 独立会话目录(原子写、单文件损坏自动跳过)

一些实现取向

- HTTP 走 Windows 原生 WinHTTP(系统 SChannel TLS),不为一次 API 调用引入 OpenSSL 编译负担
- 所有控制台子进程都设 CREATE_NO_WINDOW:从 GUI 拉起 netstat / taskkill / node / cmd /C start 时不闪黑框、不抢焦点。这类问题无法在别处统一注入,CREATE_NO_WINDOW 是创建标志,漏掉一个调用点就仍会闪窗,因此全部收敛到一个 process 模块
- 渲染期异常一律显示可读卡片(ErrorBoundary:错误名、信息、组件栈、「复制详情 / 重新加载」),不做静默黑屏
- 全本地、零遥测:API Key 只留在本机 Agent 隔离目录内,界面只回显尾号

🚀 开发运行

前置条件(Windows)

1. Node.js ≥ 22
2. Rust:rustup 安装 stable-msvc
3. Visual Studio Build Tools(含「使用 C++ 的桌面开发」工作负载)——MSVC 链接必需

npm install

一键准备内置资源(下载便携 Node + 安装官方 dsh,打包前必须执行)
npm run setup:resources

完整桌面应用(开发模式,自动启动 Rust 后端)
npm run tauri dev

仅前端预览(浏览器,无系统能力,用于调界面)
npm run dev

校验
npm run typecheck && npm test

界面端到端验证(无头 Edge + CDP,改界面时跑)
npm run verify:ui

打包安装程序
npm run tauri build

npm run setup:resources 会把便携版 Node 与 @deepseek-ai/dsh 装到 resources/(已 gitignore),打包时随安装包内置,用户侧无需安装任何东西。脚本是版本驱动的:随包 Node 与 dsh 版本与目标不一致时会自动重装,不需要手工删目录。

本地不装 Rust 工具链也能改前端:npm run typecheck / npm test / npm run build / npm run verify:ui 都不需要 Rust。Rust 侧的改动请依赖 CI 验证。

📥 下载安装

前往 Releases 下载最新的 DeepHarness_.exe,双击安装即可(默认装到用户目录,无需管理员权限,自动创建桌面快捷方式)。

安装包约 55MB——因为内置了 node.exe(单文件约 70MB,压缩后占比最大)与整棵 dsh 依赖树。这是刻意的取舍:零配置优先于体积预算,干净机器装完就能直接用 Harness Agent,不必再单独下载运行时。

想绿色便携使用?在安装目录旁放一个空的 portable.flag 文件,数据就会跟随应用目录存储,整个文件夹拷到 U 盘即可随处使用。

🎬 首次使用

1. 启动后按欢迎页引导,决定是否填入 DeepSeek API Key(platform.deepseek.com 获取)
2. 左侧切换 Agent;中间是对话 / 任务视图,右侧是上下文与配置面板
3. 要用自研 Agent 的任务控制台:在右侧面板配置模型 → 输入目标 → 「生成计划」预览步骤 → 「执行任务」看逐步时间线(工具、结果、反思建议、重试与步骤修订标注)→ 任务总结
4. 要用插件:右侧面板「插件」区域选择 .dph-plugin 文件安装,装完即热重载,不必重启应用

📁 项目结构

DeepHarness/
├── src/                          # React 前端(唯一主界面)
│   ├── App.tsx                   # 布局、启动动画、错误边界
│   ├── store.ts                  # zustand 全局状态
│   ├── components/
│   │   ├── ChatArea.tsx          # 对话视图
│   │   ├── DeepHarnessView.tsx   # 任务控制台(计划 / 执行时间线 / 总结)
│   │   ├── DeepHarnessPanel.tsx  # 右侧面板(模型配置 / 记忆 / 插件)
│   │   └── PluginSection.tsx     # 插件安装、启停、卸载
│   ├── lib/
│   │   ├── deepharness.ts        # Agent 契约层(与 Rust 命令一一对应)
│   │   ├── plugins.ts            # 插件契约层
│   │   ├── hooks.ts              # store 选择器收敛(只取状态切片)
│   │   └── selector-guard.test.ts# 静态守卫:禁止把会新建引用的方法塞进选择器
│   └── styles/global.css         # 设计系统
├── src-tauri/
│   ├── plugin-host/host.cjs      # 插件宿主 shim(include_str! 内嵌进二进制)
│   └── src/
│       ├── permissions.rs        # 每 Agent 独立白名单 + 规范化路径匹配
│       ├── plugins/              # 插件:store(zip 解包)/ host(沙箱桥)/ commands
│       ├── native/               # 自研 Agent:planner / executor / reflector / tools / memory / model
│       ├── agents/               # 三 Agent 运行时与注册表
│       ├── open_url.rs           # 只允许回环地址与白名单公网的浏览器打开
│       └── process.rs            # 统一的静默子进程创建
├── scripts/
│   ├── setup-resources.sh        # 下载便携 Node + 安装 dsh(版本驱动)
│   ├── scan-peers.cjs            # 同行依赖扫描补齐
│   ├── verify-ui.mjs             # 界面端到端验证(无头 Edge + CDP)
│   └── gen_icons.py              # 品牌图标程序化生成
└── docs/index.html               # GitHub Pages 主页

🧪 测试

npm test                                        # 前端单元测试(vitest)
npm run verify:ui                               # 界面端到端验证(无头 Edge + CDP)
cargo test --manifest-path src-tauri/Cargo.toml # Rust 单元测试 + 跨模块集成测试

Rust 侧除了各模块单测,还有一层跨模块集成测试(src-tauri/tests/public_api.rs):只经公开接口访问,校验规划器 ↔ 工具注册表、serde 的 camelCase 契约、配置持久化与三 Agent 目录隔离等跨模块约定——这类约定最容易在重构中悄悄破掉。

npm run verify:ui 在真实浏览器里验证界面,不依赖任何浏览器自动化 CLI:脚本自行托管 dist/、拉起无头 Edge 并经 CDP 驱动,还会往 localStorage 写入一段种子会话再重载,从而在不需要 API Key 的情况下走通 MessageBubble → 异步 Markdown → 代码高亮 整条渲染链路。它断言的不只是「元素存在」,而是算出来的结果对:无未捕获异常、代码块确实被着色、innerHTML 去标签后原始 token 不丢、未注册语言保持纯文本、异步 chunk 真的按需加载、界面文案与真实工具集一致。报告与截图落在 .verify-ui/。

CI 分三个 job 并行:前端(类型检查 / 单测 / 构建)、Rust(编译 + 测试 + 应用清单校验)、打包(NSIS 安装程序,产物缺失即判失败)。Rust job 会额外解析 exe 的 RT_MANIFEST 资源并断言含 Common-Controls v6——缺了它,tao 静态导入的 comctl32!TaskDialogIndirect 会让测试进程在加载期以 0xc0000139 整体退出。

⭐ 支持项目

如果这个项目对你有帮助,欢迎点个 Star ⭐。应用内标题栏也有「支持作者」入口。

🤝 贡献

欢迎提交 Issue 与 Pull Request。提交前请确保 npm run typecheck、npm test、npm run build 通过;改动界面的话再跑一次 npm run verify:ui。

📄 License

MIT © 2026 yuntaojinghong

™️ 商标

本项目内置官方 DeepSeek Harness(MIT)作为其中一个 Agent 运行时,品牌文案中出现的「DeepSeek」指代该官方项目。DeepHarness 是独立开发的第三方桌面客户端,与 DeepSeek 公司无官方隶属关系。如需将本项目用于商业再分发,请自行评估并遵守相关品牌使用条款。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群