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

原生桌面客户端 mel0nyrame/deepseek-harness-desktop

DeepSeek Harness
mel0nyrame60 天前有提交已提供中文文档扫描:含敏感能力

把智能体运行时打包成免装 Node 的桌面应用

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;engines.node 要求 >=24.0.0,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add mel0nyrame/deepseek-harness-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/11/02·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 60 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;engines.node 要求 >=24.0.0,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包@dsh-desktop/root(未发布到 npm,仅可源码安装)
✗Node 引擎要求 >=24.0.0 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/6 14:17:23

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 46 条)
  • 读取本地文件
    apps/desktop/src/main.ts:52
    if (!isAbsolute(value) || !existsSync(value)) throw new Error(`${label} must be an existing absolute path`)
  • 写入本地文件
    apps/desktop/src/main.ts:69
    mkdirSync(home, { recursive: true })
  • 读取本地文件
    apps/desktop/src/main.ts:76
    const manifest = JSON.parse(readFileSync(runtimeRequire.resolve(`${packageName}/package.json`), 'utf8')) as {
  • 读取本地文件
    apps/desktop/src/main.ts:126
    if (!isAbsolute(guard) || !statSync(guard, { throwIfNoEntry: false })?.isFile()) {
  • 发起网络请求
    apps/desktop/src/main.ts:137
    return await runtime.request({ type: 'request', ...request })
  • 执行外部命令固定命令
    apps/desktop/src/main.ts:181
    output = execFileSync('lsof', ['-a', '-p', String(pid), '-iTCP', '-sTCP:LISTEN'], {
  • 写入本地文件
    apps/desktop/src/main.ts:237
    mkdirSync(tracer.framesDir, { recursive: true })
  • 写入本地文件
    apps/desktop/src/main.ts:254
    writeFileSync(join(tracer.framesDir, `${String(frame).padStart(2, '0')}-${state}.png`), image.toPNG())
  • 写入本地文件
    apps/desktop/src/main.ts:326
    mkdirSync(framesDir, { recursive: true })
  • 写入本地文件
    apps/desktop/src/main.ts:328
    writeFileSync(join(framesDir, `${name}.png`), image.toPNG())
  • 执行外部命令固定命令
    apps/desktop/src/process-tree.ts:57
    execFileSync('/bin/ps', ['-axo', ...PS_COLUMNS], { encoding: 'utf8' }),
  • 发起网络请求
    apps/desktop/src/renderer.ts:56
    const response = await window.dshDesktop.request({
  • 执行外部命令来自配置/变量
    apps/desktop/src/supervisor.ts:157
    const child = fork(options.cliEntry, ['--profile', 'desktop'], {
  • 发起网络请求
    apps/desktop/src/supervisor.ts:345
    void this.request({
  • 读取本地文件
    apps/desktop/src/tracer.ts:43
    if (file === undefined || !isAbsolute(file) || !existsSync(file)) {
  • 读取本地文件
    apps/desktop/src/tracer.ts:62
    if (pickedDirectory === undefined || !isAbsolute(pickedDirectory) || !existsSync(pickedDirectory)) {
  • 读取本地文件
    apps/desktop/src/tracer.ts:67
    if (replayFile === undefined || !isAbsolute(replayFile) || !existsSync(replayFile)) {
  • 读取本地文件
    apps/desktop/src/tracer.ts:87
    if (!existsSync(pickedDirectory)) {
  • 读取本地文件
    apps/desktop/src/tracer.ts:92
    if (openedPath === undefined || !isAbsolute(openedPath) || !existsSync(openedPath)) {
  • 读取本地文件
    apps/desktop/src/tracer.ts:100
    if (replayFile === undefined || !isAbsolute(replayFile) || !existsSync(replayFile)) {
  • 写入本地文件
    apps/desktop/src/tracer.ts:157
    mkdirSync(profileDir, { recursive: true })
  • 写入本地文件
    apps/desktop/src/tracer.ts:158
    writeFileSync(
  • 写入本地文件
    apps/desktop/src/tracer.ts:164
    writeFileSync(settingsPath, [
  • 写入本地文件
    apps/desktop/src/tracer.ts:172
    mkdirSync(dirname(fallback), { recursive: true })
  • 删除本地文件
    apps/desktop/src/tracer.ts:179
    unlinkSync(fallback)
  • 写入本地文件
    apps/desktop/src/ui-evidence.ts:96
    writeFileSync(join(framesDir, file), png)
  • 写入本地文件
    apps/desktop/src/ui-evidence.ts:406
    mkdirSync(framesDir, { recursive: true })
  • 写入本地文件
    apps/desktop/src/ui-evidence.ts:504
    writeFileSync(join(framesDir, 'evidence.json'), `${JSON.stringify(evidence, null, 2)}\n`)
  • 发起网络请求
    apps/desktop/src/ui-protocol.ts:89
    const response = await runtime.request({
  • 读取本地文件
    packages/bundle/src/profile-bootstrap.ts:62
    if (!existsSync(file)) return undefined
  • 读取本地文件
    packages/bundle/src/profile-bootstrap.ts:63
    const source = readFileSync(file, 'utf8')
  • 写入本地文件
    packages/bundle/src/profile-bootstrap.ts:147
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    packages/bundle/src/profile-bootstrap.ts:151
    if (existsSync(target)) continue
  • 写入本地文件
    packages/bundle/src/profile-bootstrap.ts:152
    writeFileSync(target, content)
  • 读取本地文件
    packages/bundle/src/profile-bootstrap.ts:156
    if (!existsSync(rootPath) || readFileSync(rootPath, 'utf8') !== PROFILE_ROOT) {
  • 读取本地文件
    packages/bundle/src/profile-bootstrap.ts:156
    if (!existsSync(rootPath) || readFileSync(rootPath, 'utf8') !== PROFILE_ROOT) {
  • 写入本地文件
    packages/bundle/src/profile-bootstrap.ts:157
    writeFileSync(rootPath, PROFILE_ROOT)
  • 写入本地文件
    packages/bundle/src/profile-bootstrap.ts:163
    writeFileSync(manifestPath, repairManifest(source, manifest, bundles))
  • 发起网络请求
    packages/connection/src/carrier.ts:106
    const pending = bridge.request({
  • 发起网络请求
    packages/connection/src/index.ts:56
    fetch(request: Request): Promise<Response>
  • 发起网络请求
    packages/connection/src/index.ts:227
    const response = await handler.fetch(request)
  • 发起网络请求
    packages/native/src/gateway.ts:36
    const value = await channel.request({ action: 'open-path', path }, AbortSignal.any([signal, lifetime.signal]))
  • 发起网络请求
    packages/native/src/index.ts:41
    const value = await channel.request({ action: 'pick-directory' }, AbortSignal.any([signal, this.lifetime.signal]))
  • 读取本地文件
    packages/ui/src/assets.ts:108
    const source = await readFile(resolve(this.frontendRoot, 'index.html'), 'utf8')
  • 读取本地文件
    packages/ui/src/assets.ts:126
    private async readFile(path: string): Promise<DesktopUiAssetResponse> {
  • 读取本地文件
    packages/ui/src/assets.ts:128
    const body = await readFile(path)
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 打包为桌面应用
  • 免装Node运行
  • 内置智能体运行时

原生 Electron 桌面应用,内置 DeepSeek Harness 智能体运行时

README

由 DeepSeek 最新模型翻译生成
DSH Desktop deepseek-harness-desktop 将 DeepSeek Harness 打包为原生 Electron 应用 DSH Desktop。桌面外壳是本项目专属的产品层;内置 dsh 运行时继续保留插件系统、Session、工具、PTY、持久化、CLI 身份与文档术语。 使用隔离临时配置与预制会话,从已安装 macOS 应用包捕获的原生窗口,并以中性背景呈现。 原生 macOS 体验 紧凑原生框架内容铺满窗口,控件与红绿灯区域自然衔接,并保留原生拖动与全屏行为。 会记住偏好的玻璃侧栏浅色、深色与跟随系统外观匹配 macOS;玻璃偏好可以持久化,并兼容“减少透明度”的不透明回退。 零宽专注模式完全收起侧栏,让会话占满窗口宽度;再次展开时恢复上次可用的侧栏宽度。 桌面外壳,完整 harness 内置运行时安装后的应用会启动自己的应用级 DSH 子进程,不要求系统提供 Node.js,也不要求另行安装 DSH CLI。 私有桌面载体沙箱化 renderer 通过上下文隔离的 preload 桥和经过校验的 IPC 访问 DSH;desktop profile 不会打开面向浏览器的 HTTP 监听。
展开完整文档(README 剩余 1 节)
DSH Desktop

deepseek-harness-desktop 将 DeepSeek Harness 打包为原生 Electron 应用 DSH Desktop。桌面外壳是本项目专属的产品层;内置 dsh 运行时继续保留插件系统、Session、工具、PTY、持久化、CLI 身份与文档术语。

使用隔离临时配置与预制会话,从已安装 macOS 应用包捕获的原生窗口,并以中性背景呈现。

原生 macOS 体验

紧凑原生框架内容铺满窗口,控件与红绿灯区域自然衔接,并保留原生拖动与全屏行为。

会记住偏好的玻璃侧栏浅色、深色与跟随系统外观匹配 macOS;玻璃偏好可以持久化,并兼容“减少透明度”的不透明回退。

零宽专注模式完全收起侧栏,让会话占满窗口宽度;再次展开时恢复上次可用的侧栏宽度。

桌面外壳,完整 harness

内置运行时安装后的应用会启动自己的应用级 DSH 子进程,不要求系统提供 Node.js,也不要求另行安装 DSH CLI。
私有桌面载体沙箱化 renderer 通过上下文隔离的 preload 桥和经过校验的 IPC 访问 DSH;desktop profile 不会打开面向浏览器的 HTTP 监听。

原生 macOS 外壳Electron main 持有目录选择、路径打开、紧凑窗口框架与原生拖动、恢复和进程树清理;侧栏使用已保存的玻璃侧栏偏好。
共享 DSH 状态DSH Desktop 与 CLI 使用同一个 ~/.dsh 主目录,因此两者都能访问 Session、profile 与配置。

工作原理

React 客户端继续使用与 Web 产品相同、与传输无关的 Connection 接口。Electron main 持有原生窗口并监管一个专用 DSH 子进程;该子进程持有 Cordis、Session、插件、模型执行、PTY、持久化与子进程。

解耦前的载体与生命周期约定仍可在冻结的旧版桌面参考中查阅。当前外壳与桌面 Provider 约定位于 apps/desktop 和 packages/。

安装

Homebrew(推荐)

brew tap mel0nyrame/dsh
brew install --cask dsh-desktop

Cask 会为当前 Mac 选择 arm64 或 x64 构建,并在安装后移除隔离属性。稳定版发布后会自动更新 Cask;预发布版仅在 GitHub 提供。

GitHub Releases

从 GitHub Releases 下载适合当前 Mac 的 DMG(Apple 芯片选择 arm64,Intel 选择 x64),使用相邻的 .sha256 文件校验后,将 DSH Desktop 拖入“应用程序”。

发行 DMG 使用 ad-hoc 签名且未经公证。因此,直接下载 DMG 后可能需要在 macOS 上执行一次右键 → 打开;通过 Homebrew 安装时,Cask 会完成相应的隔离属性处理。

从源码启动

在当前仓库 checkout 中运行:

pnpm install
pnpm run check

运行 pnpm run package 可构建可安装且经过 ad-hoc 签名的应用与 DMG。
该命令会装配精确的已发布运行时、在 Electron 下验证原生 addon、校验应用身份与嵌入式运行时,并把产物写入 apps/desktop/dist/。运行
DSH_DESKTOP_PACKAGE_REQUIRED=1 pnpm run test:package 可执行安装态产品门禁。

项目边界

- DSH Desktop 外壳 — Electron 外壳角色及其边界。
- 桌面产品包 — @dsh-desktop/* 的归属与依赖方向规则。
- 冻结的解耦前 monorepo — 仅供历史对比与恢复。
- 冻结的旧版桌面参考 — 解耦前发布的 Electron 架构、安全、生命周期、打包、验收与限制。
- 固定的上游源码 — dsh-v0.1.0-rc.8 处锁定的官方 DeepSeek Harness 源码,仅用于源码检视与兼容性工作。
- 上游仓库 — 本桌面仓库直接基于的原始 DeepSeek Harness 项目。

状态与分发

- 仓库与应用仍在积极开发中,未来仍可能出现破坏兼容性的变更。
- 产品发行版分别提供 arm64 与 x64 macOS DMG,并附带 SHA-256 校验文件。
- 尚未配置 Developer ID 签名与公证;直接下载时可能需要执行上文所述的一次性右键 → 打开。再次分发产物前请阅读旧版桌面限制。

开发

CI 按变更风险分级:普通 pull request 运行快速工作区检查(.github/workflows/ci.yml),打包相关输入运行 macOS 打包门禁(.github/workflows/packaging.yml),带 release 标签的 pull request、版本标签或手动触发运行 arm64/x64 release 证据工作流(.github/workflows/release.yml)。以本分支为默认分支所需的晋升证据、受保护的手动真实 API 验收命令与晋升清单见 docs/promotion/promotion.md。

内核贡献流程以 AGENTS.md 为准;冻结的开发指南与 CONTRIBUTING.md 记录了解耦前的贡献流程。桌面端专属实现位于 apps/desktop 与桌面 Provider 包(packages/)中。

许可证

MIT

解耦前产品的第三方依赖及其许可证仍可在冻结的 THIRD_PARTY_NOTICES.md 中查阅。
预览分享卡片长什么样 ↓mel0nyrame/deepseek-harness-desktop
分享 · DeepSeek Harness Hub
mel0nyrame/deepseek-harness-desktop

把智能体运行时打包成免装 Node 的桌面应用

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部