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

macOS 桌面壳 lisongjianustc/dsh-desktop

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

双击启动后端,无需终端即可使用全部功能

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add lisongjianustc/dsh-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 20 处,展示前 20 条)
  • 读取本地文件
    src/config.js:32
    const raw = JSON.parse(fs.readFileSync(file, 'utf8'))
  • 写入本地文件
    src/config.js:46
    fs.mkdirSync(path.dirname(file), { recursive: true })
  • 写入本地文件
    src/config.js:47
    fs.writeFileSync(file, JSON.stringify(data, null, 2))
  • 写入本地文件
    src/logs.js:27
    fs.mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/logs.js:33
    if (fs.existsSync(file) && fs.statSync(file).size > MAX_BYTES) {
  • 删除本地文件
    src/logs.js:35
    fs.rmSync(file + '.1', { force: true })
  • 写入本地文件
    src/logs.js:36
    fs.renameSync(file, file + '.1')
  • 写入本地文件
    src/logs.js:39
    fs.appendFileSync(file, line + '\n')
  • 发起网络请求
    src/backend.js:22
    const req = http.get(url, { timeout: timeoutMs }, (res) => {
  • 执行外部命令固定命令
    src/backend.js:68
    const child = spawn('/bin/zsh', ['-lic', cmd], {
  • 执行外部命令来自配置/变量
    src/backend.js:118
    const child = spawn(pnpmPath, ['dlx', DSH_PACKAGE, '--version'], {
  • 执行外部命令来自配置/变量
    src/backend.js:158
    const child = spawn(npxPath, ['-y', DSH_PACKAGE, '--version'], {
  • 读取本地文件
    src/backend.js:195
    if (fs.existsSync(p)) return p
  • 读取本地文件
    src/backend.js:199
    if (fs.existsSync(pnpmShim)) return pnpmShim
  • 读取本地文件
    src/backend.js:201
    if (fs.existsSync(pnpmBinShim)) return pnpmBinShim
  • 执行外部命令来自配置/变量
    src/backend.js:287
    const child = spawn(cmd, args, { env, stdio: ['ignore', 'pipe', 'pipe'] })
  • 执行外部命令来自配置/变量
    src/backend.js:368
    this.child = spawn(process.execPath, spawnArgs, {
  • 执行外部命令固定命令
    src/updater.js:50
    const child = spawn('/bin/zsh', ['-lic', cmd], {
  • 执行外部命令来自配置/变量
    src/updater.js:118
    const child = spawn(cmd, args, {
  • 执行外部命令来自配置/变量
    src/watchdog.js:49
    child = spawn(cmd, args, {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 双击启动后端
  • 无需终端操作

README

由 DeepSeek 最新模型翻译生成
DSH Desktop DeepSeek Harness(DSH)的 macOS 桌面壳:双击即自动启动 dsh 后端,无需终端。窗口加载的就是本机 dsh 服务的页面,因此功能、插件、会话与浏览器版 100% 一致,插件开发(dev:web HMR)与插拔(dsh plugin add/remove)工作流原样保留。 行为约定 | 操作 | 行为 | | 打开 App | 自动定位 dsh(启动方式设置 → 默认 auto,见下)→ 自动端口 → 启动后端 → 打开窗口 | | 关闭窗口 | 弹窗三选:结束所有进程并退出 / 保持后端后台运行(驻留托盘)/ 取消(可在设置中改为固定行为) | | Dock 退出 / Cmd+Q | 默认结束所有进程(不弹窗) | | Dock 强制退出(Force Quit / kill) | 无法拦截,但 watchdog.js 会在父进程消失后自动回收后端,绝不遗留孤儿进程 | | 最小化 | 后端不受影响(独立子进程);可选“最小化到托盘” | | 审批 / 提问 | 壳直连后端 /api/events.mux 事件流,approval/requested / question/requested 到达时发系统通知,点击回到窗口;默认仅窗口不可见时通知(设置可调:总是 / 关闭) |
展开完整文档(README 剩余 1 节)
DSH Desktop

DeepSeek Harness(DSH)的 macOS 桌面壳:双击即自动启动 dsh 后端,无需终端。窗口加载的就是本机 dsh 服务的页面,因此功能、插件、会话与浏览器版 100% 一致,插件开发(dev:web HMR)与插拔(dsh plugin add/remove)工作流原样保留。

行为约定

| 操作 | 行为 |
| 打开 App | 自动定位 dsh(启动方式设置 → 默认 auto,见下)→ 自动端口 → 启动后端 → 打开窗口 |
| 关闭窗口 | 弹窗三选:结束所有进程并退出 / 保持后端后台运行(驻留托盘)/ 取消(可在设置中改为固定行为) |
| Dock 退出 / Cmd+Q | 默认结束所有进程(不弹窗) |
| Dock 强制退出(Force Quit / kill) | 无法拦截,但 watchdog.js 会在父进程消失后自动回收后端,绝不遗留孤儿进程 |
| 最小化 | 后端不受影响(独立子进程);可选“最小化到托盘” |
| 审批 / 提问 | 壳直连后端 /api/events.mux 事件流,approval/requested / question/requested 到达时发系统通知,点击回到窗口;默认仅窗口不可见时通知(设置可调:总是 / 关闭) |
| 后端崩溃 | 内置错误页:最近日志 + 重启后端 |
| 更新 | 启动时 + 每 24h 自动检查;一键更新 = 升级本机 dsh + web profile 插件 + 重启后端(桌面端零重新打包) |

后端启动方式

打开 App 时,桌面壳按下面的顺序发现 dsh(设置 → 后端 → 启动方式,可强制覆盖):

| 方式 | 探测路径 | 触发命令 |
| auto(默认) | 直接路径(config.dshPath → ~/Library/pnpm/dsh → ~/Library/pnpm/bin/dsh → 登录 shell command -v dsh)→ pnpm dlx 探测 → 旧 npx 探测 | 直接命中时:dshPath web --port 0;都没命中时:pnpm dlx @deepseek-ai/dsh web --port 0,再回退 npx -y @deepseek-ai/dsh web --port 0 |
| direct | 仅上述直接路径;都失败则报“未找到 dsh” | dshPath web --port 0 |
| pnpm | 直接跳过;只走 pnpm 探测(pnpm dlx @deepseek-ai/dsh --version 在 30s 内有版本输出即视为可用) | pnpm dlx @deepseek-ai/dsh web --port 0 |
| npx | 兼容旧配置;只走 npx 探测 | npx -y @deepseek-ai/dsh web --port 0 |

pnpm 模式适合已经把 dsh 改成 pnpm dlx @deepseek-ai/dsh 启动的用户:无需本机安装 dsh,pnpm 自动解析并下载对应版本;后端更新也由“重启 App”触发(pnpm 会在下次启动时拉到最新版),原“持久安装步骤”自动跳过,profile 插件更新照常运行。旧 npx 模式仍保留作为兼容。

后端由 watchdog.js 拉起,子进程以 detached: true 创建新进程组,全部信号通过 process.kill(-pid, sig) 作用到整个组——pnpm/npx 模式下能确保 pnpm/npx → node dsh 整个子孙链一并被回收,无孤儿子进程。

开发

pnpm install --store-dir .store # 依赖(本地 store)
pnpm start # 开发运行
DSH_HOME= DSH_DESKTOP_SMOKE=1 pnpm start # 无窗口冒烟测试
env -u ELECTRON_RUN_AS_NODE node_modules/.bin/electron test/test-notifier.cjs # 通知模块单元测试 bash test/watchdog-group-kill.sh # watchdog 组杀测试(验证 pnpm/npx 链式派生的无孤儿保证)
pnpm dist # 打包 dmg/zip(electron-builder)

冒烟测试约定:DSH_DESKTOP_SMOKE=1 时窗口隐藏,页面加载成功并探测到 __DSH_BOOT__(含插件条目)后打印 SMOKE OK 并以 0 退出;失败打印 SMOKE FAIL 并退出非 0。DSH_DESKTOP_USERDATA= 可将配置/日志/单实例锁隔离到指定目录,便于与运行中的实例并行测试。

结构

src/main.js Electron 主进程:窗口/托盘/菜单/关窗弹窗/最小化/IPC src/backend.js 后端进程管理:findDshInvocation(direct/pnpm/npx)、登录 shell PATH 修复、spawn、就绪探测、重启 src/watchdog.js 防孤儿守护:子进程以 detached 进程组形式拉起,process.kill(-pid) 信号整个组;父进程失联即回收后端 src/notifier.js 审批/提问系统通知:直连 /api/events.mux 事件流、去重、断线重连 src/updater.js 更新:pnpm/npm 版本比对、dsh 持久安装升级(dlx 模式跳过)、profile 插件更新、后端重启 src/status.html 启动中/崩溃/未安装 状态页(内置,loadFile 加载) src/settings.html 设置页:窗口行为/通知/后端/更新/日志 test/test-notifier.cjs 通知模块端到端测试(依赖零的伪 WS 服务器) test/watchdog-group-kill.sh watchdog 进程组杀测试(验证父进程失联后整个子孙链被回收) scripts/ 图标渲染与像素校验(Chromium 光栅化,无外部依赖) build/ 鲸鱼 SVG、icon.icns、图标构建资源

实现要点

- dsh 启动方式(direct / pnpm / npx):findDshInvocation() 先按 config.dshPath → ~/Library/pnpm/dsh → ~/Library/pnpm/bin/dsh → 登录 shell command -v dsh 尝试直接路径;都没命中时通过 pnpm dlx @deepseek-ai/dsh --version 探测 pnpm 可用性(再兼容旧 npx),按可用模式加载后端。settings 里可强制 direct / pnpm / npx / auto。
- 更新同步:窗口 loadURL(http://127.0.0.1:),升级本机 dsh 即完成桌面端同步,壳零重打包。pnpm/npx 模式下跳过持久安装步骤,重启 App 时对应 dlx 命令拉取最新版本;profile 插件更新照常运行。
- 无孤儿保证:后端由 watchdog 子进程持有,且后端 PID 经 stdout 上报给主进程;Electron 退出时双通道 SIGTERM(直接信号后端 + 经 watchdog 转发)。watchdog 使用 detached: true 创建新进程组,所有信号通过 process.kill(-pid, sig) 作用于整个组——pnpm/npx 模式下 pnpm/npx → node dsh 整个子孙链一并被回收,无孤儿子进程。被强杀时 watchdog 以 2s 轮询检测父进程失联并在宽限后 SIGKILL 整个组。
- 通知通道:主进程用自己的 WebSocket 直连后端 mux 事件流(与页面同一传输),按 approval/requested/question/requested 帧发系统通知;pending 集合去重(重连重放不重复提醒),resolved 后允许再次提醒,断线指数退避重连。
- GUI PATH 修复:Finder 启动的 GUI 进程无 shell PATH,启动时经 zsh -lic 获取用户登录 PATH 注入 spawn 环境(pnpm bin 前置)。
- 就绪契约:解析 stdout 的 dsh web: http://… 行 + 轮询 GET /(对上游依赖极薄,抗版本漂移)。
- 安全:webSecurity 保持默认;主窗口无 preload、contextIsolation 开启;外链一律交给系统浏览器;内置页面使用白名单 IPC。
- 隔离测试:开发期用临时 DSH_HOME(复制 web profile 的 package.json/cordis.patch.yml + 软链 node_modules)跑全链路,不影响正在运行的实例。
预览分享卡片长什么样 ↓lisongjianustc/dsh-desktop
分享 · DeepSeek Harness Hub
lisongjianustc/dsh-desktop

双击启动后端,无需终端即可使用全部功能

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