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

桌面客户端 xuanyuying/dsh-desktop

DeepSeek Harnessv0.2.0
xuanyuying52 天前有提交已提供中文文档扫描:含敏感能力

在 Windows 窗口内启动完整 Web 界面并实时显示余额

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

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

自动兼容检查有告警:npm 同名包「dsh-desktop」归属 snowcrescenter-tech/dsh-desktop,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xuanyuying/dsh-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

npm 同名包「dsh-desktop」归属 snowcrescenter-tech/dsh-desktop,装到的可能不是本插件

展开查看检查明细 ↓

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

✓npm 包dsh-desktop @ 0.2.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 61 处,展示前 53 条)
  • 写入本地文件
    src/main.js:50
    fs.mkdirSync(LOG_DIR, { recursive: true });
  • 读取本地文件
    src/main.js:52
    const st = fs.statSync(LOG_FILE);
  • 写入本地文件
    src/main.js:53
    if (st.size > 2 * 1024 * 1024) fs.writeFileSync(LOG_FILE, '');
  • 写入本地文件
    src/main.js:57
    fs.appendFileSync(LOG_FILE, '[' + new Date().toISOString() + '] ' + String(line) + '\n');
  • 写入本地文件
    src/main.js:78
    fs.mkdirSync(LOG_DIR, { recursive: true });
  • 读取本地文件
    src/main.js:82
    recent = fs.readFileSync(STARTUP_LOG, 'utf8').split('\n').filter(Boolean);
  • 写入本地文件
    src/main.js:108
    fs.writeFileSync(STARTUP_LOG, (kept ? kept + '\n' : '') + line, 'utf8');
  • 读取本地文件
    src/main.js:926
    if (fs.existsSync(file)) {
  • 读取本地文件
    src/main.js:1094
    if (fs.existsSync(c)) return c;
  • 读取本地文件
    src/main.js:1235
    const st = fs.statSync(getLogFilePath());
  • 执行外部命令来自配置/变量
    src/main.js:1343
    spawn(dest, [], { detached: true, stdio: 'ignore' }).unref();
  • 写入本地文件
    src/main.js:1460
    fs.writeFileSync(getLogFilePath(), '');
  • 发起网络请求
    src/lib/harness.js:91
    const res = await fetch(`${getHarnessUrl()}/`, {
  • 发起网络请求
    src/lib/harness.js:108
    const res = await fetch(`${getHarnessUrl()}/`, {
  • 读取本地文件
    src/lib/harness.js:169
    const dirs = fs.readdirSync(npxRoot);
  • 读取本地文件
    src/lib/harness.js:181
    if (explicit && fs.existsSync(explicit)) return { command: explicit };
  • 读取本地文件
    src/lib/harness.js:186
    if (fs.existsSync(full)) return { command: full };
  • 执行外部命令固定命令
    src/lib/harness.js:197
    const out = execFileSync('npm', ['root', '-g'], {
  • 读取本地文件
    src/lib/harness.js:204
    if (root && fs.existsSync(root)) return root;
  • 读取本地文件
    src/lib/harness.js:214
    if (fs.existsSync(c)) return c;
  • 读取本地文件
    src/lib/harness.js:222
    if (!fs.existsSync(pkgJson)) return null;
  • 执行外部命令固定命令
    src/lib/harness.js:350
    const out = spawnSync('netstat', ['-ano'], { encoding: 'utf8', windowsHide: true }).stdout || '';
  • 执行外部命令固定命令
    src/lib/harness.js:361
    const info = spawnSync(
  • 执行外部命令固定命令
    src/lib/harness.js:372
    spawnSync('taskkill', ['/pid', pid, '/T', '/F'], { stdio: 'ignore', windowsHide: true });
  • 执行外部命令来自配置/变量
    src/lib/harness.js:432
    child = spawn(dshEntry.command, args, {
  • 执行外部命令固定命令
    src/lib/harness.js:518
    const child = spawn('npm', ['install', '-g', '@deepseek-ai/dsh'], {
  • 读取本地文件
    src/lib/balance.js:50
    if (fs.existsSync(file)) return { created: false, path: file };
  • 写入本地文件
    src/lib/balance.js:52
    fs.mkdirSync(path.dirname(file), { recursive: true });
  • 写入本地文件
    src/lib/balance.js:55
    fs.writeFileSync(file, JSON.stringify({ apiKey: '' }, null, 2), 'utf8');
  • 读取本地文件
    src/lib/balance.js:65
    const raw = fs.readFileSync(configFilePath(), 'utf8');
  • 读取密钥环境变量
    src/lib/balance.js:95
    if (process.env.DEEPSEEK_API_KEY && process.env.DEEPSEEK_API_KEY.trim()) {
  • 写入本地文件
    src/lib/balance.js:122
    fs.mkdirSync(path.dirname(file), { recursive: true });
  • 写入本地文件
    src/lib/balance.js:131
    fs.writeFileSync(file, JSON.stringify(cfg, null, 2), 'utf8');
  • 读取本地文件
    src/lib/balance.js:143
    const text = fs.readFileSync(credFile, 'utf8');
  • 读取密钥环境变量
    src/lib/balance.js:154
    if (process.env.DEEPSEEK_API_KEY) return process.env.DEEPSEEK_API_KEY.trim();
  • 发起网络请求
    src/lib/balance.js:166
    const req = https.request(
  • 写入本地文件
    src/lib/peak-desktop.js:38
    fs.mkdirSync(d, { recursive: true });
  • 读取本地文件
    src/lib/peak-desktop.js:59
    if (c && fs.existsSync(c) && fs.statSync(c).isFile()) return path.resolve(c);
  • 写入本地文件
    src/lib/peak-desktop.js:98
    fs.writeFileSync(p, renderPatch(guardPluginPath), 'utf8');
  • 读取本地文件
    src/lib/peak-desktop.js:110
    const j = JSON.parse(fs.readFileSync(controlPath(), 'utf8'));
  • 写入本地文件
    src/lib/peak-desktop.js:129
    fs.writeFileSync(controlPath(), JSON.stringify(next, null, 2), 'utf8');
  • 读取本地文件
    src/lib/peak-desktop.js:135
    if (!fs.existsSync(controlPath())) {
  • 写入本地文件
    src/lib/peak-desktop.js:137
    fs.writeFileSync(controlPath(), JSON.stringify(defaultControl(), null, 2), 'utf8');
  • 读取本地文件
    src/lib/peak-desktop.js:145
    const j = JSON.parse(fs.readFileSync(statusPath(), 'utf8'));
  • 删除本地文件
    src/lib/peak-desktop.js:166
    fs.rmSync(statusPath(), { force: true });
  • 读取本地文件
    src/lib/ui-state.js:83
    const j = JSON.parse(fs.readFileSync(file, 'utf8'));
  • 写入本地文件
    src/lib/ui-state.js:95
    fs.mkdirSync(path.dirname(file), { recursive: true });
  • 写入本地文件
    src/lib/ui-state.js:96
    fs.writeFileSync(file, JSON.stringify(next, null, 2), 'utf8');
  • 写入本地文件
    src/lib/updater.js:181
    fs.mkdirSync(path.dirname(dest), { recursive: true });
  • 写入本地文件
    src/lib/updater.js:185
    const out = fs.createWriteStream(dest);
  • 读取本地文件
    resources/peak-guard.mjs:92
    const j = JSON.parse(readFileSync(controlPath(), 'utf8'));
  • 写入本地文件
    resources/peak-guard.mjs:109
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    resources/peak-guard.mjs:112
    writeFileSync(
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 窗口内启动Web界面
  • 实时显示余额

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness 桌面版 (DSH Desktop) 一个基于 Electron 的 Windows 桌面应用,用于启动并承载 DeepSeek Harness 的完整 Web 界面(对话、插件、技能、工作流、子代理、设置等全部功能),并在窗口右下角实时显示 DeepSeek 账户余额。 技术栈 平台 License Release 💡 通用版:不含任何个人 API Key,开箱即用,配置你自己的 Key 即可。 💡 无需 Visual Studio / 任何 IDE:Node.js + Electron,命令行即可运行、测试、打包。 🧩 DeepSeek Harness 社区项目:本应用是 DeepSeek Harness(DSH)生态的桌面客户端,通过 dsh-plugin 主题与官方社区关联。
展开完整文档(README 剩余 1 节)
DeepSeek Harness 桌面版 (DSH Desktop)

一个基于 Electron 的 Windows 桌面应用,用于启动并承载 DeepSeek Harness 的完整 Web 界面(对话、插件、技能、工作流、子代理、设置等全部功能),并在窗口右下角实时显示 DeepSeek 账户余额。

技术栈 平台 License Release

💡 通用版:不含任何个人 API Key,开箱即用,配置你自己的 Key 即可。
💡 无需 Visual Studio / 任何 IDE:Node.js + Electron,命令行即可运行、测试、打包。
🧩 DeepSeek Harness 社区项目:本应用是 DeepSeek Harness(DSH)生态的桌面客户端,通过 dsh-plugin 主题与官方社区关联。

✨ 功能特性

🖥️ 桌面集成
- 标准菜单栏:文件 / 编辑 / 视图 / 工具 / 帮助 五段式菜单,符合 Windows 桌面软件习惯
- 文件:新建会话(Ctrl+N)、刷新界面(Ctrl+R)、在浏览器打开、打开配置目录、退出
- 编辑:撤销 / 重做 / 剪切 / 复制 / 粘贴 / 全选
- 视图:重新加载(F5)、强制重载、缩放、全屏(F11)、开发者工具(F12)
- 工具:检查 dsh 更新、重启 dsh 服务、查看服务状态
- 帮助:官方文档、项目主页、反馈问题、关于
- 快捷键:Ctrl+N 新建会话、F5 刷新、F11 全屏、F12 开发者工具

🚀 自动启动前提启动时自动完成,无需手动执行任何命令:
1. 定位 dsh 命令(全局 npm / npx 缓存 / PATH)
2. 未安装时自动 npm install -g @deepseek-ai/dsh
3. 自动启动 dsh web(带 --no-open,界面由窗口承载而非跳浏览器)
4. 服务就绪后自动加载界面(含渲染检查与失败重试)

🔄 版本管理
- 菜单「工具 → 检查 dsh 更新」:对比本地与 npm 最新版本,一键升级 dsh
- 升级后提示重启服务以生效

💰 余额显示
- 右下角实时显示账户余额(30 秒刷新,点击手动刷新,悬停看明细)

🔌 DeepSeek Harness 0.1.5+ 适配
- 认证机制适配(关键):0.1.5 起 dsh web 需要认证,裸访问返回 401。本应用会捕获启动输出中的带 token URL 并用它加载界面(303 → cookie → 200),彻底解决黑屏
- 端口冲突自愈:若 3080 被无法认证的遗留服务占用,自动清理该 dsh web 进程并重启自己的服务
- 代理支持:传递 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / NO_PROXY 环境变量(0.1.5 新增)
- 兼容 --no-open 官方参数(0.1.5 官方推荐用法)
- 支持 0.1.5 新特性:DeepSeek-V41-Flash 模型、任意文件上传、右侧 Sidebar 预览

🩺 诊断工具

遇到启动问题时运行(输出环境、服务、认证、余额、代理状态):

node scripts\doctor.js

📸 运行截图

DSH Desktop 运行截图

⬇️ 下载安装

前往 Releases 页面 下载 DSH Desktop Setup 1.2.1.exe 安装程序(Windows 10/11,约 95 MB)。

或克隆源码自行构建:

git clone https://github.com/xuanyuying/dsh-desktop.git
cd dsh-desktop
npm install
npm start

功能特性

- 🚀 一键启动:自动检测 dsh web 服务;未运行时自动拉起,已运行时直接复用(端口 3080)
- 🖥️ 完整 Harness 内容:窗口内嵌全部 Web UI,无任何功能裁剪
- 💰 右下角余额实时显示:每 30 秒自动刷新 DeepSeek 账户余额;点击手动刷新;悬停查看赠金/充值明细(与左下角"设置"按钮错开,互不遮挡)
- 🪟 桌面窗口体验:独立窗口、无地址栏、外链用系统浏览器打开
- 🧹 干净退出:由本应用启动的服务在退出时自动关闭,不影响外部已运行的服务

环境要求

| 依赖 | 版本 | 说明 |
| Node.js | ≥ 20 | 必装(含 npm) |
| DeepSeek Harness | ≥ 0.1.0-rc | 通过 npm install -g @deepseek-ai/dsh 安装;或由本应用自动发现 npx 缓存 |
| DeepSeek API Key | - | 见下方"API Key 配置" |

API Key 配置(通用版)

按优先级自动读取,任选其一:

1. 环境变量 setx DEEPSEEK_API_KEY "sk-你的key"

2. 应用配置文件(推荐)复制模板到用户目录并填入你的 Key copy config.example.json %USERPROFILE%\.dsh-desktop\config.json 编辑 config.json,把 apiKey 改为 sk-你的key

配置文件格式: { "apiKey": "sk-你的DeepSeek-API-Key" }

3. 兼容读取 Harness 凭据:若你已用 dsh 且 ~/.dsh/.credentials.yaml 中存在 DEEPSEEK_API_KEY,自动复用。

API Key 获取:https://platform.deepseek.com → API Keys。

快速开始

方式一:直接启动(推荐)

双击项目目录下的 启动桌面端.bat。

首次运行自动安装 Electron 依赖并下载运行时(需联网,约 2~5 分钟),之后秒开。

方式二:命令行启动

cd dsh-desktop-desk
npm install # 首次
npm start

运行测试(无需 IDE)

node scripts\smoke-test.js # 冒烟测试:服务检测 + 余额 API
node scripts\test-lib.js # lib 模块:12 项断言
node scripts\test-preload.js # 浮层 UI:11 项断言

打包为安装程序

通用方式(默认走 GitHub,需要能访问 GitHub)

npm run dist

国内网络 / 无 GitHub 访问(推荐)

node scripts\build-dist.js

一键脚本自动完成(全程走 npmmirror 国内镜像、不访问 GitHub):
1. 从国内镜像下载 NSIS / winCodeSign / nsis-resources 构建工具
2. 解压工具到本地缓存(幂等,二次打包秒过)
3. 自动 patch electron-builder 适配受限环境
4. 使用本地已解压的 Electron(electronDist),全程离线
5. 产出 dist\DSH Desktop Setup 1.2.1.exe

项目结构

dsh-desktop-desk/
├── src/
│ ├── main.js # 主进程:Electron 集成(窗口、IPC、菜单、生命周期) │ ├── menu.js # 应用菜单栏(文件/编辑/视图/工具/帮助) │ ├── preload.js # 预加载:右下角余额浮层 UI + IPC 桥 │ └── lib/ │ ├── harness.js # Harness 服务检测/启动/停止 + 版本检测升级(纯 Node) │ └── balance.js # DeepSeek 余额 API 查询(纯 Node 模块,通用 Key 解析) ├── scripts/ │ ├── build-dist.js # 一键打包(国内镜像 / 离线) │ ├── prepare-builder-cache.js # 构建工具缓存准备 │ ├── download-builder-tools.js # 构建工具下载(npmmirror) │ ├── smoke-test.js / test-lib.js / test-preload.js / test-menu.js # 测试 │ └── gen-ico.js / download-electron.js / extract-electron.js / patch-builder.js ├── build/ # 应用图标 ├── config.example.json # API Key 配置模板(通用) ├── package.json ├── 启动桌面端.bat # 一键启动脚本 └── README.md

常见问题

Q: 启动时报"未找到 dsh 命令"?
A: 执行 npm install -g @deepseek-ai/dsh,或确认 dsh 在 PATH / npx 缓存中。

Q: 余额显示"不可用"?
A: 检查 API Key 配置(环境变量或 ~/.dsh-desktop/config.json),以及网络能否访问 api.deepseek.com。

Q: 关闭窗口后 dsh 服务还在运行?
A: 若服务由本应用启动,退出时自动关闭;若外部启动(如命令行 dsh web),本应用不接管其生命周期。

Q: 如何修改端口?
A: 编辑 src/lib/harness.js 的 HARNESS_PORT(默认 3080),或设置环境变量 DSH_DESKTOP_PORT。
预览分享卡片长什么样 ↓xuanyuying/dsh-desktop
分享 · DeepSeek Harness Hub
xuanyuying/dsh-desktop

在 Windows 窗口内启动完整 Web 界面并实时显示余额

这是你的仓库?认领条目

回到顶部