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

桌面多窗口客户端 cuteG41cute/dsh-desktop

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

把网页界面变成独立桌面窗口,支持多会话分离与托盘常驻

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装;安装清单取自 dsh-cleaner/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add cuteG41cute/dsh-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · market
装得上吗
静态安装检查有提示项,装前建议看一眼 README
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装;安装清单取自 dsh-cleaner/package.json

展开查看检查明细 ↓

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

✗npm 包dsh-cleaner(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 163 处,展示前 55 条)
  • 读取本地文件
    backup/dsh-file-history/host-contract-check.mjs:65
    readFile(join(HERE, 'lib', 'index.js'), 'utf8'),
  • 发起网络请求
    backup/dsh-file-history/lib/client.js:19
    return fetch(API, {
  • 写入本地文件
    backup/dsh-file-history/lib/index.js:180
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    backup/dsh-file-history/lib/index.js:182
    await writeFile(tmp, data)
  • 写入本地文件
    backup/dsh-file-history/lib/index.js:184
    await rename(tmp, absPath)
  • 删除本地文件
    backup/dsh-file-history/lib/index.js:186
    await rm(tmp, { force: true }).catch(() => {})
  • 读取本地文件
    backup/dsh-file-history/lib/index.js:195
    return await readFile(absPath)
  • 读取本地文件
    backup/dsh-file-history/lib/index.js:226
    files = await readdir(metaDir)
  • 读取本地文件
    backup/dsh-file-history/lib/index.js:236
    meta = JSON.parse(await readFile(sidecarPath, 'utf8'))
  • 读取本地文件
    backup/dsh-file-history/lib/index.js:241
    const content = await stat(meta.backupPath).then(
  • 读取本地文件
    backup/dsh-file-history/lib/index.js:263
    sigs = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    backup/dsh-file-history/lib/index.js:273
    ids = await readdir(sigDir)
  • 删除本地文件
    backup/dsh-file-history/lib/index.js:382
    await rm(entry.backupPath, { force: true }).catch(() => {})
  • 删除本地文件
    backup/dsh-file-history/lib/index.js:383
    await rm(path.join(entry.dir, META_DIR_NAME, sidecarName(entry.backupName)), { force: true }).catch(() => {})
  • 删除本地文件
    backup/dsh-file-history/lib/index.js:415
    await rm(current, { recursive: false, force: true }).catch(() => {})
  • 删除本地文件递归
    backup/dsh-file-history/lib/index.js:440
    await rm(entryDir, { recursive: true, force: true }).catch(() => {})
  • 写入本地文件
    backup/dsh-file-history/lib/index.js:483
    await writeFile(
  • 写入本地文件
    backup/dsh-file-history/lib/index.js:537
    await mkdir(path.dirname(manifestPath), { recursive: true })
  • 写入本地文件
    backup/dsh-file-history/lib/index.js:538
    await appendFile(manifestPath, `${JSON.stringify(record)}\n`, 'utf8')
  • 删除本地文件
    backup/dsh-file-history/lib/index.js:1014
    await rm(entry.backupPath, { force: true }).catch(() => {})
  • 读取本地文件
    backup/dsh-file-history/selftest.mjs:197
    const files = await readdir(metaDir).catch(() => [])
  • 读取本地文件
    backup/dsh-file-history/selftest.mjs:202
    const meta = JSON.parse(await readFile(path.join(metaDir, name), 'utf8'))
  • 读取本地文件
    backup/dsh-file-history/selftest.mjs:214
    workspaces = await readdir(mod.HISTORY_DIR, { withFileTypes: true })
  • 读取本地文件
    backup/dsh-file-history/selftest.mjs:220
    const sigs = await readdir(path.join(mod.HISTORY_DIR, workspace.name), { withFileTypes: true }).catch(() => [])
  • 读取本地文件
    backup/dsh-file-history/selftest.mjs:223
    const ids = await readdir(path.join(mod.HISTORY_DIR, workspace.name, sig.name)).catch(() => [])
  • 读取本地文件
    backup/dsh-file-history/selftest.mjs:227
    const meta = JSON.parse(await readFile(metaPath, 'utf8'))
  • 写入本地文件
    backup/dsh-file-history/selftest.mjs:245
    await writeFile(target, 'line1\nline2\nline3\n', 'utf8')
  • 写入本地文件
    backup/dsh-file-history/selftest.mjs:261
    await mkdir(path.dirname(nested), { recursive: true })
  • 写入本地文件
    backup/dsh-file-history/selftest.mjs:262
    await writeFile(nested, 'export const v = 0\n', 'utf8')
  • 写入本地文件
    backup/dsh-file-history/selftest.mjs:271
    await writeFile(target, 'line1\nCHANGED\nline3\nline9\n', 'utf8')
  • 写入本地文件
    backup/dsh-file-history/selftest.mjs:283
    await writeFile(fileA, 'A0\n', 'utf8')
  • 写入本地文件
    backup/dsh-file-history/selftest.mjs:284
    await writeFile(fileB, 'B0\n', 'utf8')
  • 删除本地文件递归
    backup/dsh-file-history/selftest.mjs:369
    await rm(gitProject, { recursive: true, force: true }).catch(() => {})
  • 删除本地文件递归
    backup/dsh-file-history/selftest.mjs:387
    await rm(outerRepo, { recursive: true, force: true }).catch(() => {})
  • 删除本地文件递归
    backup/dsh-file-history/selftest.mjs:470
    await rm(project, { recursive: true, force: true }).catch(() => {})
  • 删除本地文件递归
    backup/dsh-file-history/selftest.mjs:471
    await rm(outsideDir, { recursive: true, force: true }).catch(() => {})
  • 发起网络请求
    dsh-cleaner/lib/client.js:20
    return fetch('/dsh-cleaner/api', {
  • 写入本地文件
    dsh-cleaner/lib/index.js:82
    mkdirSync(dirname(dest), { recursive: true })
  • 写入本地文件
    dsh-cleaner/lib/index.js:84
    renameSync(src, dest)
  • 删除本地文件递归
    dsh-cleaner/lib/index.js:89
    rmSync(src, { recursive: true, force: true })
  • 读取本地文件
    dsh-cleaner/lib/index.js:114
    if (!existsSync(legacy)) return
  • 写入本地文件
    dsh-cleaner/lib/index.js:116
    mkdirSync(bin, { recursive: true })
  • 读取本地文件
    dsh-cleaner/lib/index.js:117
    for (const name of readdirSync(legacy, { withFileTypes: true })) {
  • 读取本地文件
    dsh-cleaner/lib/index.js:120
    if (existsSync(to)) rmSync(from, { recursive: true, force: true })
  • 删除本地文件递归
    dsh-cleaner/lib/index.js:120
    if (existsSync(to)) rmSync(from, { recursive: true, force: true })
  • 写入本地文件
    dsh-cleaner/lib/index.js:121
    else renameSync(from, to)
  • 删除本地文件递归
    dsh-cleaner/lib/index.js:123
    try { rmSync(join(dshHome(), 'trash'), { recursive: true, force: true }) } catch { }
  • 读取本地文件
    dsh-cleaner/lib/index.js:138
    const raw = readFileSync(file, 'utf8')
  • 读取本地文件
    dsh-cleaner/lib/index.js:178
    if (!sessionId || !existsSync(root)) return found
  • 读取本地文件
    dsh-cleaner/lib/index.js:179
    for (const wsDir of readdirSync(root, { withFileTypes: true })) {
  • 写入本地文件
    dsh-cleaner/lib/index.js:221
    mkdirSync(bin, { recursive: true })
  • 写入本地文件
    dsh-cleaner/lib/index.js:224
    mkdirSync(entryDir, { recursive: true })
  • 删除本地文件递归
    dsh-cleaner/lib/index.js:720
    try { rmSync(entryDir, { recursive: true, force: true }) } catch { }
  • 删除本地文件递归
    dsh-cleaner/lib/index.js:733
    try { rmSync(entryDir, { recursive: true, force: true }) } catch { }
  • 删除本地文件递归
    dsh-cleaner/lib/index.js:787
    try { rmSync(projectDir, { recursive: true, force: true }) } catch { }
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 网页界面转独立窗口
  • 多会话独立窗口
  • 系统托盘常驻

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness 工作区 DeepSeek Harness 桌面版 本仓库存放 DeepSeek Harness 桌面版的源码与打包产物(GitHub:<https://github.com/cuteG41cute/dsh-desktop>)。 这个文件夹同时也是本机的 DeepSeek Harness 工作目录,所以除了仓库内容,还有几个由 harness / 其他项目生成的目录(见下表,均已 gitignore)。 目录一览 | 路径 | 内容 | | dsh-desktop/ | 桌面版的全部内容:Windows(WebView2 包装程序 + 启动器 + 安装程序)与 Linux(GTK/WebKitGTK)版源码、打包脚本、构建产物 dist/。桌面版相关的开发都在这里进行。 | | backup/dsh-file-history/ | 「改前自动备份」插件(随本仓库一起管理的小项目) | | dsh-mobile-app/ | 手机端安卓 App:把本机 WebUI 包成 App(无 Gradle/无 AndroidX 的纯 SDK 构建链)。
展开完整文档(README 剩余 1 节)
DeepSeek Harness 工作区

DeepSeek Harness 桌面版

本仓库存放 DeepSeek Harness 桌面版的源码与打包产物(GitHub:<https://github.com/cuteG41cute/dsh-desktop>)。

这个文件夹同时也是本机的 DeepSeek Harness 工作目录,所以除了仓库内容,还有几个由 harness / 其他项目生成的目录(见下表,均已 gitignore)。

目录一览

| 路径 | 内容 |
| dsh-desktop/ | 桌面版的全部内容:Windows(WebView2 包装程序 + 启动器 + 安装程序)与 Linux(GTK/WebKitGTK)版源码、打包脚本、构建产物 dist/。桌面版相关的开发都在这里进行。 |
| backup/dsh-file-history/ | 「改前自动备份」插件(随本仓库一起管理的小项目) |
| dsh-mobile-app/ | 手机端安卓 App:把本机 WebUI 包成 App(无 Gradle/无 AndroidX 的纯 SDK 构建链)。文档见 dsh-mobile-app/README.md |
| share/dsh-mobile-bridge/ | 手机接入桥:局域网反向代理 + 会话 cookie 注入 + APK 分发(/__bridge、/__apk)。随开机自启 |
| share/、skills/、api/ | DeepSeek Harness 运行时生成(插件/技能分发目录等,已 gitignore) |
| dsh-time-stamp/ | 时间戳插件(独立 git 仓库,不在本仓库内) |
| menmory logic/、.dsh/ | 用户与 harness 的运行数据 |
| .tmp/ | 本机构建工具缓存(WiX 工具链等,已 gitignore) |

快速入口

- 桌面版文档:dsh-desktop/README.md(功能、目录结构、打包、常见问题)
- 启动:双击 dsh-desktop/启动 DeepSeek Harness.vbs;安装后使用桌面上的「DeepSeek Harness」快捷方式
- 安装包:dsh-desktop/dist/,或下载 Releases
- 手机端:dsh-mobile-app/README.md(App 构建/安装)+ share/dsh-mobile-bridge/README.md(接入桥原理与运维)
- Linux 版:dsh-desktop/linux/README.md
- 打包:dsh-desktop/msi/build-msi.ps1(Windows MSI)、dsh-desktop/linux/build/build-linux.py(deb + tar.gz)

许可

MIT,见 LICENSE。
预览分享卡片长什么样 ↓cuteG41cute/dsh-desktop
分享 · DeepSeek Harness Hub
cuteG41cute/dsh-desktop

把网页界面变成独立桌面窗口,支持多会话分离与托盘常驻

这是你的仓库?认领条目

回到顶部