🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面客户端 chyra-moon/deepseek-harness-desktop

DeepSeek Harnessv0.4.1
chyra-moon7 天前有提交已提供中文文档扫描:高危

熟悉的 DeepSeek Harness,更顺手的 Windows 桌面体验。

40.9/100
综合分
19
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:要求 dsh 0.1.5-rc.1,而最新版为 0.2.1-rc.5;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add chyra-moon/deepseek-harness-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · market
装得上吗
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 7 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(dependency_conflict · 2026/9/28) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

要求 dsh 0.1.5-rc.1,而最新版为 0.2.1-rc.5;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包deepseek-harness-desktop @ 0.4.1
✓Node 引擎未声明 engines.node
✗dsh CLI 依赖要求 0.1.5-rc.1 · 最新 0.2.1-rc.5 不兼容
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 17:42:00

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

安装时即执行脚本命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 53 处,展示前 53 条)
  • 写入本地文件
    src/main.js:78
    fs.appendFileSync(
  • 读取本地文件
    src/main.js:93
    const text = fs.readFileSync(settingsFile(), "utf8").replace(/^ FEFF/, "");
  • 写入本地文件
    src/main.js:107
    fs.mkdirSync(path.dirname(settingsFile()), { recursive: true });
  • 写入本地文件
    src/main.js:108
    fs.writeFileSync(settingsFile(), JSON.stringify(settings, null, 2));
  • 读取本地文件
    src/main.js:119
    if (fs.existsSync(p)) return p;
  • 发起网络请求
    src/main.js:131
    const req = http.get(u, { headers: cookie ? { cookie } : {} }, (res) => {
  • 读取本地文件
    src/main.js:192
    for (const p of candidates) if (fs.existsSync(p)) return p;
  • 执行外部命令固定命令
    src/main.js:216
    child = spawn("cmd.exe", [
  • 执行外部命令来自配置/变量
    src/main.js:228
    child = spawn(process.execPath, [bin, "web", "--host", HOST, "--port", String(port), "--no-open"], {
  • 执行外部命令固定命令
    src/main.js:332
    spawnSync("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
  • 读取本地文件
    src/main.js:418
    const b = JSON.parse(fs.readFileSync(boundsFile(), "utf8"));
  • 写入本地文件
    src/main.js:425
    try { fs.writeFileSync(boundsFile(), JSON.stringify(mainWindow.getBounds())); } catch { }
  • 写入本地文件
    src/main.js:546
    fs.writeFileSync(
  • 写入本地文件
    src/main.js:635
    fs.writeFileSync(
  • 读取本地文件
    scripts/patch-dsh.js:45
    if (!fs.existsSync(TARGET)) {
  • 读取本地文件
    scripts/patch-dsh.js:49
    const src = fs.readFileSync(TARGET, "utf8");
  • 写入本地文件
    scripts/patch-dsh.js:64
    fs.writeFileSync(TARGET, patched, "utf8");
  • 读取本地文件
    src/updater.js:25
    if (fs.existsSync(f)) {
  • 读取本地文件
    src/updater.js:26
    const v = fs.readFileSync(f, "utf8").trim();
  • 读取本地文件
    scripts/ensure-icon.js:23
    const missing = needs.filter((p) => !fs.existsSync(p));
  • 执行外部命令固定命令
    scripts/ensure-icon.js:31
    execSync("electron scripts/make-icon.js", {
  • 读取本地文件
    scripts/feed-server.js:32
    fs.stat(file, (err, st) => {
  • 读取本地文件
    scripts/feed-server.js:51
    fs.createReadStream(file, { start, end }).pipe(res);
  • 读取本地文件
    scripts/feed-server.js:57
    fs.createReadStream(file).pipe(res);
  • 读取本地文件
    scripts/gen-whale-path.js:25
    const svg = fs.readFileSync(src, "utf8");
  • 写入本地文件
    scripts/gen-whale-path.js:45
    fs.writeFileSync(out, JSON.stringify({ body, belly, eye, spout }, null, 2) + "\n");
  • 读取本地文件
    scripts/make-icon.js:27
    return fs.existsSync(alt) ? alt : null;
  • 读取本地文件
    scripts/make-icon.js:60
    let svg = fs.readFileSync(src, "utf8");
  • 写入本地文件
    scripts/make-icon.js:70
    fs.mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    scripts/make-icon.js:71
    fs.writeFileSync(path.join(OUT_DIR, "icon.png"), img.resize({ width: 512, height: 512 }).toPNG());
  • 写入本地文件
    scripts/make-icon.js:72
    fs.writeFileSync(path.join(OUT_DIR, "icon-256.png"), img.resize({ width: 256, height: 256 }).toPNG());
  • 写入本地文件
    scripts/make-icon.js:73
    fs.writeFileSync(path.join(OUT_DIR, "tray.png"), img.resize({ width: 32, height: 32 }).toPNG());
  • 写入本地文件
    scripts/make-icon.js:74
    fs.writeFileSync(path.join(OUT_DIR, "tray@2x.png"), img.resize({ width: 64, height: 64 }).toPNG());
  • 写入本地文件
    scripts/preview-status.js:15
    fs.writeFileSync(out, buildStatusHtml("正在启动服务器…", "首次启动或复用外部服务器时可能需要几秒到几十秒。"));
  • 执行外部命令运行时拼接
    scripts/preview-status.js:21
    execSync(`start "" "${out}"`, { shell: "cmd.exe" });
  • 读取本地文件
    scripts/prune-node-modules.js:30
    if (!fs.existsSync(root)) {
  • 读取本地文件
    scripts/prune-node-modules.js:51
    entries = fs.readdirSync(dir, { withFileTypes: true });
  • 删除本地文件
    scripts/prune-node-modules.js:60
    fs.rmSync(full, { recursive: true, force: true });
  • 删除本地文件
    scripts/prune-node-modules.js:70
    fs.unlinkSync(full);
  • 读取本地文件
    scripts/scan-deps-bounded.js:13
    try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
  • 读取本地文件
    scripts/scan-deps-bounded.js:29
    if (fs.existsSync(path.join(dir, "node_modules", name))) return true;
  • 读取本地文件
    scripts/scan-deps-bounded.js:36
    if (path.basename(root) === "node_modules" && fs.existsSync(path.join(root, name))) return true;
  • 读取本地文件
    scripts/scan-deps-bounded.js:43
    try { j = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8")); } catch { continue; }
  • 读取本地文件
    scripts/update-dsh.js:28
    const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
  • 执行外部命令来自配置/变量
    scripts/update-dsh.js:35
    execSync(cmd, { cwd: root, stdio: "inherit" });
  • 执行外部命令运行时拼接
    scripts/update-dsh.js:59
    const tags = JSON.parse(execSync(`npm view ${name} dist-tags --json`, {
  • 执行外部命令运行时拼接
    scripts/update-dsh.js:67
    const list = JSON.parse(execSync(`npm view ${name} versions --json`, {
  • 写入本地文件
    scripts/update-dsh.js:122
    fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
  • 读取本地文件
    scripts/verify-package.js:20
    const VERSION = JSON.parse(fs.readFileSync(path.join(ROOT, "package.json"), "utf8")).version;
  • 读取本地文件
    scripts/verify-package.js:56
    const ok = fs.existsSync(p);
  • 读取本地文件
    scripts/verify-package.js:63
    const workerSrc = fs.existsSync(workerPath) ? fs.readFileSync(workerPath, "utf8") : "";
  • 读取本地文件
    scripts/verify-package.js:71
    const ok = fs.existsSync(p);
  • 读取本地文件
    scripts/verify-package.js:72
    const size = ok ? `(${(fs.statSync(p).size / 1048576).toFixed(1)}MB)` : "";
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-group@deepseek-ai/cordis-plugin-hmr@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-default-model@deepseek-ai/dsh-agent-presets@deepseek-ai/dsh-anonymous-user-id@deepseek-ai/dsh-api-gateway@deepseek-ai/dsh-api-remotes
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • Windows桌面外壳

DeepSeek Harness 桌面外壳:把官方 Web UI 原样搬成 Windows 桌面应用(社区项目)

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness Desktop 熟悉的 DeepSeek Harness,更顺手的 Windows 桌面体验。 官方 Web 界面 · 内置本地服务 · 托盘常驻 · 自动恢复 下载最新版 → · 快速开始 · 问题反馈 · 项目介绍 DeepSeek Harness Desktop 是 DeepSeek Harness 的 Windows 桌面适配版。项目使用 Electron 加载官方 Web 前端,把本地服务的启动、连接与恢复整合进桌面应用,让你从桌面直接进入 Harness 工作区。 安装包包含运行时与官方 dsh 服务,日常启动无需另行安装 Node.js 或输入命令。桌面适配层提供窗口管理、托盘驻留和连接恢复等能力;Harness 的核心功能与工作流程由内置的官方 dsh 提供。 本项目由社区维护,非 DeepSeek 官方客户端。DeepSeek Harness、@deepseek-ai/* 软件包及官方前端的版权归各自权利人所有。 桌面版带来了什么 | 能力 | 使用体验 | | 官方界面 | 加载官方 Web 前端,延续 Harness 的工作区与会话操作方式。 | | 服务自动管理 | 启动时自动连接或拉起本地 dsh 服务,无需单独维护终端窗口。
展开完整文档(README 剩余 1 节)
DeepSeek Harness Desktop

熟悉的 DeepSeek Harness,更顺手的 Windows 桌面体验。

官方 Web 界面 · 内置本地服务 · 托盘常驻 · 自动恢复

下载最新版 → · 快速开始 · 问题反馈 ·

项目介绍

DeepSeek Harness Desktop 是 DeepSeek Harness 的 Windows 桌面适配版。项目使用 Electron 加载官方 Web 前端,把本地服务的启动、连接与恢复整合进桌面应用,让你从桌面直接进入 Harness 工作区。

安装包包含运行时与官方 dsh 服务,日常启动无需另行安装 Node.js 或输入命令。桌面适配层提供窗口管理、托盘驻留和连接恢复等能力;Harness 的核心功能与工作流程由内置的官方 dsh 提供。

本项目由社区维护,非 DeepSeek 官方客户端。DeepSeek Harness、@deepseek-ai/* 软件包及官方前端的版权归各自权利人所有。

桌面版带来了什么

| 能力 | 使用体验 |
| 官方界面 | 加载官方 Web 前端,延续 Harness 的工作区与会话操作方式。 |
| 服务自动管理 | 启动时自动连接或拉起本地 dsh 服务,无需单独维护终端窗口。 |
| 已有服务复用 | 默认探测本机 3080 端口;识别到 dsh 服务后直接连接,可与浏览器使用同一实例。 |
| 连接异常恢复 | 定期检查服务状态,检测到异常后尝试恢复服务并重新加载页面。 |
| 桌面常驻 | 支持托盘显示与隐藏、窗口位置和尺寸记忆,以及单实例运行。 |
| 清晰的启动状态 | 鲸鱼光点动画搭配状态提示,展示服务启动与恢复过程。 |

下载与安装

获取最新版本 →

面向 Windows x64。进入发布页面,查看版本说明,并在 Assets 中选择适合你的文件:

| 发行形式 | 文件名特征 | 适合场景 |
| 安装版 · 推荐 | DeepSeek.Harness-<版本>-x64.exe | 日常使用,可选择安装目录,并创建桌面与开始菜单快捷方式。 |
| 解压版 | DeepSeek.Harness-<版本>-win32-x64.zip | 希望直接管理应用文件;完整解压后运行其中的程序。 |
| 单文件便携版 | DeepSeek.Harness-<版本>-portable-x64.exe | 无需安装;启动时需要解包,可能比安装版等待更久。 |

文件名以发布页面实际附件为准。下载入口不绑定具体版本,后续更新可继续通过同一链接获取;预发布版本也请在发布列表中查看。

快速开始

1. 下载并启动:安装应用,或将 ZIP 完整解压后运行 DeepSeek Harness.exe。
2. 等待服务就绪:应用自动启动内置服务;若默认端口已有可识别的 dsh 服务,则直接复用。
3. 进入工作区:在 Harness 界面中完成所需配置,选择工作区并开始使用。模型连接与凭据以官方界面的配置要求为准。

关闭窗口后,应用默认保留在系统托盘。点击托盘图标可恢复窗口;要完全关闭应用,请在托盘菜单中选择 退出。

常用快捷键

| 快捷键 | 操作 |
| Ctrl + R / F5 | 重新加载当前页面 |
| Ctrl + Shift + O | 在系统浏览器中打开当前服务 |
| Ctrl + Shift + I | 打开或关闭开发者工具 |

使用说明

与浏览器版一起使用

应用默认检查 127.0.0.1:3080,识别到已运行的 dsh 服务后会直接连接。同一服务实例下,桌面端和浏览器端访问的是同一套会话数据。

若该端口被其他程序占用,应用会尝试使用空闲端口启动内置服务。可通过托盘菜单中的 关于 查看当前服务地址和运行模式。

关闭托盘驻留与选择工作区

完全退出应用后,在应用数据目录的 settings.json 中将 closeToTray 改为 false,下次启动后关闭窗口即可退出。修改时保留文件中的其他配置项。
工作区默认使用应用内浏览式目录选择器,改善远程桌面及受控会话环境下的兼容性。当前版本启动时会把历史 directoryPicker: "native" 配置迁移为 "browse"。

版本更新

普通用户可随时从 Releases 页面 获取更新,具体变化以各版本的发布说明为准。

项目也提供可配置的自动更新机制:打包版通过环境变量 DSH_UPDATE_URL 或应用数据目录中的 update-url.txt 读取更新源。未配置更新源时跳过自动更新;配置有效更新源后,启动时检查、下载更新,下载完成后启动安装与重启流程。

更新源需要提供 electron-updater Generic Provider 所需的更新清单与安装文件,不能直接填入 GitHub Releases 页面地址。

升级到 0.1.5 时的会话数据变化

官方 dsh 0.1.5 起将会话日志格式升级到 V3:应用打开旧会话时会自动迁移,生成新版日志文件并保留原文件(同目录下 session.v3.jsonl.zstd 与 session.jsonl.zstd 并存)。

需要注意:升级后的新内容只写入 V3 文件,更早版本的应用无法读取它。因此从 0.1.5 回退到旧版本时,旧历史仍可读取,但升级之后产生的对话不会显示。

建议:跨大版本升级前先备份应用数据目录下的 sessions 文件夹(例如 %USERPROFILE%\.dsh\sessions)。

启动异常与问题反馈

服务恢复需要一定时间,实际耗时取决于本机环境与服务启动情况。若持续无法进入界面,可先通过托盘 关于 查看服务信息,再通过 Issues 反馈。

建议附上应用版本、Windows 版本、使用的发行形式和复现步骤;如有错误信息,可一并提供相关片段。

开发与构建

从源码运行、验证与打包

准备 Windows x64 与 Node.js / npm 环境,在项目目录执行:

npm install
npm run icon
npm start

常用维护命令:

| 命令 | 用途 |
| npm run smoke | 运行应用启动冒烟检查 |
| npm run dist | 构建安装版、解压版与便携版,并校验打包完整性 |
| npm run verify | 单独校验已生成的应用包 |
| npm run update:dsh | 升级官方 dsh 并重新构建发行包 |
| npm run preview -- --open | 在浏览器中预览启动状态页 |

构建产物位于 release/。当前源码中的桌面版本与内置 dsh 版本均为 0.1.5-rc.1;后续以 package.json 和发布说明为准。

致谢与许可

感谢 DeepSeek 及 DeepSeek Harness 贡献者提供的开源基础。

本项目以 MIT License 开源。上游软件包与其他依赖遵循各自的许可证。
预览分享卡片长什么样 ↓chyra-moon/deepseek-harness-desktop
分享 · DeepSeek Harness Hub
chyra-moon/deepseek-harness-desktop

熟悉的 DeepSeek Harness,更顺手的 Windows 桌面体验。

回到顶部