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

桌面客户端 AmazingBoyCrazy/dsh_desktop

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

DeepSeek-herness桌面版0.1.7-rc1

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

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

自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add AmazingBoyCrazy/dsh_desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✓npm 包deepseek-harness-desktop @ 0.4.1
✓Node 引擎要求 >=22.12.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖要求 0.2.1-rc.2 · 最新 0.2.1-rc.2 兼容
✓入口文件main/exports/bin 已声明

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/19 22:22:16

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

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

安装时即执行脚本可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 47 条)
  • 读取本地文件
    scripts/ensure-electron.mjs:24
    return existsSync(binary)
  • 执行外部命令来自配置/变量
    scripts/ensure-electron.mjs:35
    const result = spawnSync(process.execPath, [installScript], { stdio: 'inherit' })
  • 写入本地文件
    src/main/harness.mjs:91
    mkdirSync(modulesDir, { recursive: true })
  • 读取本地文件
    src/main/harness.mjs:101
    if (existsSync(link)) {
  • 读取本地文件
    src/main/harness.mjs:102
    const stat = lstatSync(link)
  • 删除本地文件
    src/main/harness.mjs:104
    unlinkSync(link)
  • 读取本地文件
    src/main/harness.mjs:126
    if (!existsSync(join(profileDir, 'package.json'))) {
  • 写入本地文件
    src/main/harness.mjs:127
    mkdirSync(profileDir, { recursive: true })
  • 写入本地文件
    src/main/harness.mjs:128
    writeFileSync(join(profileDir, 'package.json'), `${JSON.stringify(defaultProfileManifest(), null, 2)}\n`)
  • 写入本地文件
    src/main/harness.mjs:161
    writeFileSync(patchPath, content)
  • 读取本地文件
    src/main/harness.mjs:218
    const pkg = JSON.parse(readFileSync(manifest, 'utf8'))
  • 写入本地文件
    src/main/harness.mjs:360
    mkdirSync(sandboxTemp, { recursive: true })
  • 写入本地文件
    src/main/harness.mjs:368
    mkdirSync(this.logDir, { recursive: true })
  • 读取本地文件
    src/main/harness.mjs:370
    if (existsSync(logFile)) {
  • 读取本地文件
    src/main/harness.mjs:372
    if (statSync(logFile).size > HARNESS_LOG_MAX_BYTES) {
  • 执行外部命令来自配置/变量
    src/main/harness.mjs:383
    this.child = spawn(process.execPath, nodeArgs, {
  • 发起网络请求
    src/main/harness.mjs:437
    const response = await fetch(this.baseUrl, {
  • 写入本地文件
    src/main/log.mjs:28
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/main/log.mjs:30
    if (existsSync(file)) {
  • 读取本地文件
    src/main/log.mjs:32
    if (statSync(file).size > MAX_LOG_BYTES) {
  • 写入本地文件
    src/main/log.mjs:34
    stream = createWriteStream(file, { flags: 'w' })
  • 写入本地文件
    src/main/log.mjs:41
    stream = createWriteStream(file, { flags: 'a' })
  • 读取本地文件
    src/main/log.mjs:69
    if (!existsSync(file)) return '(no log file yet)'
  • 读取本地文件
    src/main/log.mjs:70
    const text = readFileSync(file, 'utf8')
  • 读取本地文件
    scripts/bump-version.mjs:47
    const pkg = JSON.parse(readFileSync(PACKAGE_PATH, 'utf8'))
  • 写入本地文件
    scripts/bump-version.mjs:61
    writeFileSync(PACKAGE_PATH, `${JSON.stringify(pkg, null, 2)}\n`)
  • 读取本地文件
    scripts/check-upstream.mjs:24
    const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'))
  • 发起网络请求
    scripts/check-upstream.mjs:34
    const response = await fetch(url, { headers, signal: AbortSignal.timeout(30_000) })
  • 读取本地文件
    scripts/release-plan.mjs:35
    const pkg = JSON.parse(readFileSync(PACKAGE_PATH, 'utf8'))
  • 执行外部命令固定命令
    scripts/release-plan.mjs:74
    execSync('npm install --package-lock-only --ignore-scripts --no-audit --no-fund', { stdio: ['ignore', 'pipe', 'pipe'] })
  • 写入本地文件
    scripts/release-plan.mjs:93
    writeFileSync(PACKAGE_PATH, `${JSON.stringify(pkg, null, 2)}\n`)
  • 写入本地文件
    scripts/release-plan.mjs:97
    writeFileSync(PACKAGE_PATH, `${JSON.stringify(pkg, null, 2)}\n`)
  • 读取本地文件
    scripts/repro-fresh-boot.mjs:26
    if (existsSync(profileManifest)) {
  • 读取本地文件
    scripts/repro-fresh-boot.mjs:29
    console.log(readFileSync(profileManifest, 'utf8'))
  • 执行外部命令来自配置/变量
    scripts/repro-fresh-boot.mjs:36
    const child = spawn(process.execPath, [entry, 'web', '--host', '127.0.0.1', '--port', '0'], {
  • 读取本地文件
    scripts/repro-fresh-boot.mjs:64
    console.log(readFileSync(profileManifest, 'utf8'))
  • 删除本地文件递归
    scripts/repro-fresh-boot.mjs:68
    try { rmSync(home, { recursive: true, force: true }) } catch { }
  • 执行外部命令来自配置/变量
    scripts/smoke-dsh-web.mjs:47
    const child = spawn(process.execPath, [entry, ...args], {
  • 发起网络请求
    scripts/smoke-dsh-web.mjs:89
    const handshake = await fetch(launchUrl, { redirect: 'manual', signal: AbortSignal.timeout(15_000) })
  • 发起网络请求
    scripts/smoke-dsh-web.mjs:100
    const response = await fetch(origin, {
  • 删除本地文件递归
    scripts/smoke-dsh-web.mjs:144
    await rm(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })
  • 执行外部命令来自配置/变量
    scripts/win32-console-patch-probe.mjs:66
    const child = spawn(binary, ['--import', patchSpecifier, '--input-type=module', '-e', inline], {
  • 执行外部命令来自配置/变量
    scripts/win32-runner-injection.spec.mjs:73
    const child = spawn(process.execPath, buildInjectedArgv(['-e', script, '--', '--workspace', 'W', '--mode', 'read-only']), {
  • 发起网络请求
    watch-ci.mjs:8
    const runs = await (await fetch(`${base}/actions/runs?per_page=5`, h)).json()
  • 发起网络请求
    watch-ci.mjs:12
    const jobs = await (await fetch(run.jobs_url, h)).json()
  • 发起网络请求
    watch-ci3.mjs:8
    const runs = await (await fetch(`${base}/actions/runs?per_page=5`, h)).json()
  • 发起网络请求
    watch-ci3.mjs:12
    const jobs = await (await fetch(run.jobs_url, h)).json()
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis-plugin-group@deepseek-ai/dsh@deepseek-ai/dsh-anonymous-user-id@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-attachment@deepseek-ai/dsh-authorization@deepseek-ai/dsh-bash-local@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-compaction@deepseek-ai/dsh-deepseek-account
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness 桌面版 CI GitHub release License: MIT DeepSeek Harness 桌面版 是 DeepSeek Harness 的桌面客户端:不需要终端、不需要安装 Node.js、也不需要 dsh web 命令。双击图标,完整的 DeepSeek Harness 网页版界面就会在自己的窗口里打开。 项目来源与维护说明 - 引擎:内嵌官方 npm 包 @deepseek-ai/dsh(DeepSeek 官方发布,版本精确锁定),升级完全跟随官方,与 CLI 共用同一数据目录 ~/.dsh。 - 桌面壳:基于 deepseek-harness-desktop(MIT)起步,原作者版权与署名保留(见 LICENSE)。本仓库在此之上独立维护,后续不再依赖第三方桌面壳,更新来源以 DeepSeek 官方引擎为准。 本仓库相对原始壳的改进 1. 修复应用内自动更新(Windows/Linux):原始版 latest.yml 指向不存在的文件(404),自动更新必然失败;本仓库显式指定 artifactName,更新元数据与实际产物一致,已实测 200 OK。 2. 修复 Windows 终端弹窗:引擎与沙箱 runner 均为无控制台进程,执行命令时 Windows 会为每个子进程弹出可见终端窗口。
展开完整文档(README 剩余 1 节)
DeepSeek Harness 桌面版

CI
GitHub release
License: MIT

DeepSeek Harness 桌面版 是 DeepSeek Harness 的桌面客户端:不需要终端、不需要安装 Node.js、也不需要 dsh web 命令。双击图标,完整的 DeepSeek Harness 网页版界面就会在自己的窗口里打开。

项目来源与维护说明

- 引擎:内嵌官方 npm 包 @deepseek-ai/dsh(DeepSeek 官方发布,版本精确锁定),升级完全跟随官方,与 CLI 共用同一数据目录 ~/.dsh。
- 桌面壳:基于 deepseek-harness-desktop(MIT)起步,原作者版权与署名保留(见 LICENSE)。本仓库在此之上独立维护,后续不再依赖第三方桌面壳,更新来源以 DeepSeek 官方引擎为准。

本仓库相对原始壳的改进

1. 修复应用内自动更新(Windows/Linux):原始版 latest.yml 指向不存在的文件(404),自动更新必然失败;本仓库显式指定 artifactName,更新元数据与实际产物一致,已实测 200 OK。
2. 修复 Windows 终端弹窗:引擎与沙箱 runner 均为无控制台进程,执行命令时 Windows 会为每个子进程弹出可见终端窗口。本仓库在引擎与 runner 两层实现“隐藏控制台”方案(引擎 AllocConsole + SW_HIDE,runner 通过 --import 预加载补丁并 AttachConsole 共享引擎控制台),全链路命令执行不再产生任何窗口;普通子进程另有 windowsHide 自适应兜底。
3. 修复 Windows 沙箱命令 100% 失败:桌面版工作区为用户主目录,而 ACL 沙箱要求临时目录在工作区之外;引擎的 TMP/TEMP 已重定向到 C:\Users\Public\dsh-desktop-tmp,沙箱命令恢复可用。
4. 新增 Windows CI:引擎冒烟、真实 Electron 桌面冒烟、控制台补丁探针、runner 注入形状测试,全部在 Windows runner 上执行(原始壳仅 Linux CI)。
5. 依赖显式化:补丁依赖的 @deepseek-ai/dsh-host-directory-picker 显式声明,不再依赖 npm 提升(hoisting)。
6. 鲸鱼图标:窗口/任务栏/dock 图标替换为 DeepSeek Harness 官方鲸鱼 Logo。
7. 内置增强插件机制保留、本版本暂不随包:插件通过官方 dsh.profile.bundles 机制挂载(写入 web profile 的 package.json,仅当不存在时;与 dsh plugin add 一致,绝不写 cordis.patch.yml 行,避免双挂载 duplicate 崩溃)。清单由 src/main/harness.mjs 的 BUNDLED_PLUGINS 驱动,当前为空(原因见“内置插件”一节):第三方插件生态仍以 0.1.5-rc 引擎线为 peer 目标,混挂会导致引擎启动失败。
8. 修复引擎 token 门禁下的白屏:0.1.6-alpha 起的网页界面要求“进程级浏览器会话令牌”,裸访问回环地址会返回 401。桌面壳改为解析引擎打印的 dsh web: http://127.0.0.1:/?token=… 就绪行,窗口按该 URL 加载(令牌一次性换取 Cookie),此前会白屏。
9. 补全打包裁剪的引擎依赖:electron-builder 按依赖图收集 node_modules,会漏掉仅以 peer 边存在的引擎包(dsh-jobs、dsh-settings、dsh-attachment、dsh-session-persistence 等 13 个),打包版启动即 ERR_MODULE_NOT_FOUND。这些包已在 package.json 显式声明。

工作原理

桌面壳(Electron 主进程)以 ELECTRON_RUN_AS_NODE=1 方式把内嵌引擎(@deepseek-ai/dsh 的 dsh web 配置档)作为子进程拉起,等引擎打印带令牌的就绪行后,窗口加载该 URL(引擎的网页界面从 0.1.6-alpha 起要求进程级令牌,裸回环地址返回 401)。引擎只监听 127.0.0.1,会话、设置、插件全部存放在 ~/.dsh,与 CLI 完全共享。

桌面壳(Electron)──守护──▶ 引擎子进程(Electron Node 24) │ │ 提供网页界面 127.0.0.1:32123 └──窗口(沙箱渲染进程)◀────┘ 会话/设置/插件 ⇄ ~/.dsh(与 CLI 共享)

安装使用

从 Releases 下载对应平台安装包:

| 平台 | 安装包 |
| Windows 10/11(x64) | deepseek-harness-desktop--x64.exe(NSIS 安装程序) |
| macOS(Apple Silicon / Intel) | -arm64.dmg / -x64.dmg |
| Linux(x64) | -x86_64.AppImage 或 .deb |

- 未签名:Windows SmartScreen 提示时点 更多信息 → 仍要运行;macOS 首次打开请右键 打开*。
- 安装后双击图标即用,首次启动需几秒初始化。
- 数据共享:默认使用 ~/.dsh(与 CLI/网页版共享会话、设置、凭据)。同一时间只运行一个引擎(桌面版或 dsh web 二选一),避免并发写冲突。

配置

| 变量 | 默认值 | 含义 |
| DSH_HOME | ~/.dsh | harness 数据目录,原样透传引擎 |
| DSH_DESKTOP_PORT | 32123,32124,32125 | 引擎回环端口候选(逗号分隔) |
| DSH_DESKTOP_PATCH_DEBUG | 未设置 | 1 时输出控制台补丁诊断日志到引擎日志 |

内置插件

本版本(0.1.7-rc.1 引擎线)不随包附带任何第三方插件:插件生态当前仍以 0.1.5-rc 引擎为 peer 目标,版本不匹配会让引擎启动直接失败(fail-loud),因此优先保证"装了就能开"。首次启动只挂载引擎自带的 @deepseek-ai/dsh-base、@deepseek-ai/dsh-web-app 两个 bundle(由引擎自身初始化 profile,桌面壳不再写 seed)。

- 想要增强插件:等对应插件支持本条引擎线后,用插件市场 UI 或 dsh plugin --profile web add 安装——两者都走官方 dsh.profile.bundles 机制。
- 重新随包内置:把包名填进 src/main/harness.mjs 的 BUNDLED_PLUGINS(空数组即"不内置"),profile 清单与依赖列表都由它派生;同时把包名加回 package.json 的 dependencies,否则打包后解析不到。
- 禁用/卸载插件:用插件市场 UI 或 dsh plugin --profile web remove 。不要手改 cordis.patch.yml 的插件行——官方 bundle 挂载与手写行同时存在会触发 duplicate loader entry id 崩溃(本仓库早期版本踩过这个坑)。

从源码开发

需要 Node.js ≥ 22.12:

git clone https://github.com/AmazingBoyCrazy/dsh_desktop.git
cd dsh_desktop
npm ci
npm start

常用脚本:npm start(开发模式)、npm run smoke(引擎冒烟)、npm run dist(打包)、npm run check:upstream(检查上游引擎版本)。

开发模式注意:

- npm start 与已安装的桌面版共用同一个 userData 目录与单实例锁,已安装版本正在运行时开发模式会直接退出(表现为"点了没反应")。先完全退出已安装版本,或换一份数据目录:npx electron . --user-data-dir=。
- Electron 版本必须精确等于 44.0.0:引擎通过 node-addon-require-builtin 读取 Node 内部模块(配置档解析需要),该原生模块只支持精确指纹(43.0.0、44.0.0、45.0.0-alpha.6),换成 43.4.0、^44 等都会让引擎启动即失败(Unsupported/no-context)。上游官方桌面版同样固定在 Electron 44。
- 在 DSH 引擎里开的终端会继承 ELECTRON_RUN_AS_NODE=1,此时 npm start 会把 Electron 当纯 Node 跑并报 does not provide an export named 'Menu';在普通终端里运行,或先 Remove-Item Env:\ELECTRON_RUN_AS_NODE。

自动发版

release.yml 每日定时检查 npm 官方仓库:上游 @deepseek-ai/dsh 发布新版本后自动固定版本、构建三平台安装包并发布 GitHub Release,全程无需人工介入。手动触发:Actions → Release → Run workflow。

已知限制

- 安装包未签名(macOS Gatekeeper / Windows SmartScreen 提示;代码签名在路线图中)。
- Electron 版本被引擎钉死:必须精确 44.0.0(原生模块指纹限制),因此不能在发版前随意升级 Electron;升级前请确认目标版本出现在 node-addon-native-custom-loader 的支持列表里。
- 本版不内置第三方插件(生态尚未跟上 0.1.7-rc 引擎线),需自行从插件市场安装。
- Windows 退出时引擎为硬终止:Windows 不支持 SIGTERM 优雅停机,退出应用可能丢失少量未落盘会话数据(上游 CLI 在 POSIX 下无此问题)。
- 应用内自动更新依赖网络:更新检查走 GitHub,被代理/网络环境拦截时(表现为日志中 SSL 握手失败)请手动下载安装包。
- 引擎继承上游运行要求(shell 工具需要宿主机具备 PowerShell 等)。

许可证

MIT — 见 LICENSE。引擎上游:deepseek-ai/deepseek-harness(MIT)。
预览分享卡片长什么样 ↓AmazingBoyCrazy/dsh_desktop
分享 · DeepSeek Harness Hub
AmazingBoyCrazy/dsh_desktop

DeepSeek-herness桌面版0.1.7-rc1

回到顶部