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

桌面工作台 yijigao/deepseek-harness-desktop

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

把 AI Agent 会话搬进 Windows 原生窗口长期使用

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 64 处,展示前 58 条)
  • 读取本地文件
    app/fix-junctions.js:31
    return (await readFile(markerPath, 'utf8')).trim()
  • 读取本地文件
    app/fix-junctions.js:39
    manifest = JSON.parse(await readFile(manifestPath, 'utf8'))
  • 删除本地文件递归
    app/fix-junctions.js:67
    await rm(destPath, { recursive: true, force: true })
  • 写入本地文件
    app/fix-junctions.js:83
    await writeFile(markerPath, root)
  • 读取本地文件
    app/lib/exit-diagnostics.js:16
    while (!fs.existsSync(ancestor)) {
  • 读取本地文件
    app/lib/exit-diagnostics.js:33
    if (fs.existsSync(target) || !isStrictlyWithin(temporary, target)) {
  • 读取本地文件
    app/lib/release-package.js:33
    for (const entry of (await fs.readdir(dir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
  • 读取本地文件
    app/lib/release-package.js:42
    if (!(await fs.lstat(root)).isDirectory() || (await fs.lstat(root)).isSymbolicLink()) throw Error('Release root must be a real directory')
  • 读取本地文件
    app/lib/release-package.js:54
    if ((await fs.lstat(absolute)).isSymbolicLink()) throw Error(`Links are not allowed in release packages: ${name}`)
  • 读取本地文件
    app/lib/release-package.js:56
    for await (const chunk of createReadStream(absolute)) hash.update(chunk)
  • 读取本地文件
    app/lib/release-package.js:66
    if ((await fs.lstat(manifestPath)).isSymbolicLink()) throw Error('Manifest cannot be a link')
  • 读取本地文件
    app/lib/release-package.js:67
    const bytes = await fs.readFile(manifestPath)
  • 读取本地文件
    app/lib/titlebar-logo.js:9
    const bytes = fs.readFileSync(filename)
  • 读取本地文件
    app/lib/workspace-path.js:15
    while (!fs.existsSync(ancestor)) {
  • 写入本地文件
    app/lib/workspace-path.js:64
    fs.mkdirSync(target, { recursive: true, mode: 0o700 })
  • 读取本地文件
    app/lib/workspace-path.js:66
    try { stat = fs.statSync(target) } catch { fail('Workspace cannot be created') }
  • 读取本地文件
    app/main.js:80
    try { return normalizePinnedSessionIds(JSON.parse(fs.readFileSync(sessionPinsPath(), 'utf8'))) } catch { return [] }
  • 写入本地文件
    app/main.js:87
    fs.writeFileSync(temporary, `${JSON.stringify(pins)}\n`, { encoding: 'utf8', mode: 0o600 })
  • 写入本地文件
    app/main.js:88
    fs.renameSync(temporary, target)
  • 写入本地文件
    app/main.js:95
    try { fs.appendFileSync(LOG_PATH, text) } catch {}
  • 写入本地文件
    app/main.js:108
    try { fs.appendFileSync(exitDiagnostics.timelinePath, `${JSON.stringify(entry)}\n`, { encoding: 'utf8', mode: 0o600 }) } catch {}
  • 写入本地文件
    app/main.js:115
    fs.mkdirSync(isolated.crashDumps, { recursive: true, mode: 0o700 })
  • 写入本地文件
    app/main.js:140
    fs.writeFileSync(target, image.toPNG(), { flag: 'wx', mode: 0o600 })
  • 执行外部命令来自配置/变量
    app/main.js:177
    const child = spawn(nodeExePath(), ['--use-env-proxy', toolPath('model-resource-probe.mjs'), resolveRuntimeRoot(), dshHomePath()], {
  • 发起网络请求
    app/main.js:222
    const req = http.get({ host: '127.0.0.1', port, path: '/', timeout: 2000 }, (res) => {
  • 读取本地文件
    app/main.js:251
    if (!fs.existsSync(nodeExe)) {
  • 读取本地文件
    app/main.js:256
    if (!fs.existsSync(binJs)) {
  • 读取本地文件
    app/main.js:266
    if (fs.existsSync(fixer)) {
  • 执行外部命令来自配置/变量
    app/main.js:268
    const fix = spawnSync(nodeExe, [fixer, resources], {
  • 执行外部命令来自配置/变量
    app/main.js:281
    serverChild = spawn(nodeExe, ['--use-env-proxy', binJs, 'web', '--no-open', '--host', '127.0.0.1', '--port', String(port)], {
  • 读取本地文件
    app/main.js:353
    return fs.readFileSync(path.join(__dirname, name), 'utf8')
  • 读取本地文件
    app/main.js:434
    const data = JSON.parse(fs.readFileSync(credentialPath, 'utf8'))
  • 执行外部命令来自配置/变量
    app/main.js:458
    const child = spawn(nodeExePath(), [toolPath('patch-pi-ai-oauth.mjs'), resolveRuntimeRoot(), '--check'], {
  • 执行外部命令来自配置/变量
    app/main.js:579
    const child = spawn(nodeExePath(), [script, resolveRuntimeRoot()], {
  • 写入剪贴板
    app/main.js:672
    clipboard.writeText(value)
  • 读取本地文件
    config-example/oauth-login-openai-codex.mjs:36
    const raw = JSON.parse(readFileSync(path, "utf-8"));
  • 写入本地文件
    config-example/oauth-login-openai-codex.mjs:52
    mkdirSync(dirname(this.path), { recursive: true });
  • 写入本地文件
    config-example/oauth-login-openai-codex.mjs:53
    writeFileSync(this.path, JSON.stringify(Object.fromEntries(this.credentials), null, 2));
  • 执行外部命令固定命令
    config-example/oauth-login-openai-codex.mjs:100
    spawn("cmd", ["/c", "start", "", n.url], { stdio: "ignore", detached: true }).unref();
  • 读取本地文件
    config-example/test-openai-codex.mjs:32
    const raw = JSON.parse(readFileSync(path, "utf-8"));
  • 写入本地文件
    config-example/test-openai-codex.mjs:46
    mkdirSync(dirname(this.path), { recursive: true });
  • 写入本地文件
    config-example/test-openai-codex.mjs:47
    writeFileSync(this.path, JSON.stringify(Object.fromEntries(this.credentials), null, 2));
  • 执行外部命令固定命令
    dist-validation-alpha2-builder.cjs:17
    const result = spawnSync('robocopy.exe', [
  • 发起网络请求
    dist-validation-auth-audit.mjs:9
    const response = await fetch(url, { headers, signal: AbortSignal.timeout(10000) })
  • 执行外部命令来自配置/变量
    dist-validation-profile-audit.mjs:25
    const result = spawnSync(process.execPath, [path.join(runtime, 'lib/bin.js'), 'web', '--dump-config'], {
  • 读取本地文件
    electron-builder.r10-performance-guard.cjs:13
    if (fs.existsSync(path.join(output, 'win-unpacked/desktop-release.json'))) throw Error('Release is already sealed; select a new releaseId instead of o
  • 读取本地文件
    electron-builder.r10-performance-guard.cjs:15
    if (!fs.existsSync(path.join(runtime, 'lib/bin.js')) || !fs.existsSync(nodeExe)) throw Error('Incomplete build inputs')
  • 执行外部命令来自配置/变量
    electron-builder.r10-performance-guard.cjs:20
    const result = spawnSync(process.execPath, [path.join(root, 'scripts/qualify-runtime.mjs'), runtime], { stdio: 'inherit', windowsHide: true })
  • 执行外部命令固定命令
    electron-builder.r10-performance-guard.cjs:38
    const copied = spawnSync('robocopy.exe', [path.join(runtime, 'node_modules'), path.join(context.appOutDir, 'resources/runtime/node_modules'), '/E', '/
  • 读取本地文件
    electron-builder.r11-selective-upstream.cjs:13
    if (fs.existsSync(path.join(output, 'win-unpacked/desktop-release.json'))) throw Error('Release is already sealed; select a new releaseId instead of o
  • 读取本地文件
    electron-builder.r11-selective-upstream.cjs:15
    if (!fs.existsSync(path.join(runtime, 'lib/bin.js')) || !fs.existsSync(nodeExe)) throw Error('Incomplete build inputs')
  • 执行外部命令来自配置/变量
    electron-builder.r11-selective-upstream.cjs:20
    const result = spawnSync(process.execPath, [path.join(root, 'scripts/qualify-runtime.mjs'), runtime], { stdio: 'inherit', windowsHide: true })
  • 执行外部命令固定命令
    electron-builder.r11-selective-upstream.cjs:38
    const copied = spawnSync('robocopy.exe', [path.join(runtime, 'node_modules'), path.join(context.appOutDir, 'resources/runtime/node_modules'), '/E', '/
  • 读取本地文件
    electron-builder.release.cjs:10
    if (fs.existsSync(path.join(output, 'win-unpacked/desktop-release.json'))) throw Error('Release is already sealed; select a new releaseId instead of o
  • 读取本地文件
    electron-builder.release.cjs:12
    if (!fs.existsSync(path.join(runtime, 'lib/bin.js')) || !fs.existsSync(nodeExe)) throw Error('Incomplete build inputs')
  • 执行外部命令来自配置/变量
    electron-builder.release.cjs:17
    const result = spawnSync(process.execPath, [path.join(root, 'scripts/qualify-runtime.mjs'), runtime], { stdio: 'inherit', windowsHide: true })
  • 执行外部命令固定命令
    electron-builder.release.cjs:35
    const copied = spawnSync('robocopy.exe', [path.join(runtime, 'node_modules'), path.join(context.appOutDir, 'resources/runtime/node_modules'), '/E', '/
  • 执行外部命令固定命令
    maintenance/performance-20260913/prepare-source-provenance.mjs:19
    const result = spawnSync('git', ['-c', 'core.autocrlf=false', '-C', cwd, ...args], {
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • AIAgent会话
  • Windows原生窗口
  • 长期使用

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness Desktop 把 DeepSeek Harness 变成一个更适合长期使用的 Windows AI Agent 工作台。 多 Provider · 模型资源中心 · 原生会话管理 · 本地桌面体验下载 v2.2.0 安装版 · 版本说明 DeepSeek Harness Desktop 是由社区维护的 Windows AI Agent 工作台。它保留 Harness 原生的工作区、模型、插件、Agent 预设和权限体系,并补齐长期桌面使用所需的运行可靠性、模型接入、资源可见性和原生交互;它并非只把 dsh web 放进 Electron 窗口。 为什么它不只是一个桌面壳 - 多 Provider / OpenAI-compatible:复用 Harness Provider 架构,提供 OpenAI-compatible Provider 配置能力,以及 ChatGPT subscription OAuth 路由和第三方 Provider 配置示例。 - 模型资源中心:Provider 支持时显示真实账户用量、余额和重置时间;不支持时明确降级为本地 Token 观察,不伪造 Provider 数据。 - 原生桌面能力:提供会话置顶、原生剪贴板、独立窗口和本地运行时管理,并尽量在数据层或源码层集成,避免依赖脆弱的 DOM hack。
展开完整文档(README 剩余 1 节)
DeepSeek Harness Desktop
把 DeepSeek Harness 变成一个更适合长期使用的 Windows AI Agent 工作台。
多 Provider · 模型资源中心 · 原生会话管理 · 本地桌面体验下载 v2.2.0 安装版 · 版本说明

DeepSeek Harness Desktop 是由社区维护的 Windows AI Agent 工作台。它保留 Harness 原生的工作区、模型、插件、Agent 预设和权限体系,并补齐长期桌面使用所需的运行可靠性、模型接入、资源可见性和原生交互;它并非只把 dsh web 放进 Electron 窗口。

为什么它不只是一个桌面壳

- 多 Provider / OpenAI-compatible:复用 Harness Provider 架构,提供 OpenAI-compatible Provider 配置能力,以及 ChatGPT subscription OAuth 路由和第三方 Provider 配置示例。
- 模型资源中心:Provider 支持时显示真实账户用量、余额和重置时间;不支持时明确降级为本地 Token 观察,不伪造 Provider 数据。
- 原生桌面能力:提供会话置顶、原生剪贴板、独立窗口和本地运行时管理,并尽量在数据层或源码层集成,避免依赖脆弱的 DOM hack。
- 受控成品包升级:旧源码更新入口已退役。新流程校验固定发布包,区分桌面、引擎和数据格式更新;运行中的任务不会被自动停止,启动后的失败不会触发不安全降级。线上自动下载渠道尚未配置,详见发布流程。

[!TIP]
如果这个项目让 DeepSeek Harness 更好用,欢迎点一个 Star,帮助更多人发现它。

[!IMPORTANT]
本项目为非官方社区项目,不代表 DeepSeek 官方立场。

v2.2.0 有什么新功能

- 原生会话置顶:在会话菜单中置顶或取消置顶,结果持久保存。排序发生在 React 数据层,不使用 DOM 轮询、观察器或后台扫描。
- 模型资源中心:顶部常驻显示当前模型,并统一展示 ChatGPT 订阅配额、DeepSeek API 余额和本机 Token 用量;服务不可用时自动降级,不阻塞会话。
- 完整桌面体验:独立窗口、原生窗口控制、共享现有 Harness 配置和会话,关闭应用时同步回收本地服务。

DeepSeek Harness Desktop 中运行 GPT-6 Astra 长任务会话

快速开始

1. 从 Releases 下载安装版或便携版。
2. 安装并启动 DeepSeek Harness Desktop。
3. 继续使用原有 DSH_HOME(默认 %USERPROFILE%\.dsh)中的设置和会话。

应用只在 127.0.0.1 的随机端口启动 dsh web。账号凭据、历史会话、日志和本地配置不会被复制进项目目录。

会话置顶

在任意会话的菜单中选择“置顶会话”。空白的新会话始终位于最前,其后是已置顶会话,再后是普通会话。最多保存 50 个置顶会话 ID,避免长期使用造成无界增长。

该功能直接作用于会话数据层,没有 MutationObserver、定时器、页面扫描或额外子进程,设计目标是让长会话列表仍保持流畅。

模型资源中心

模型资源中心优先读取提供商返回的真实账户信息,在一个面板中展示当前会话路由、ChatGPT 订阅配额及恢复时间、DeepSeek API 人民币余额,以及当前会话、今日和本月的本机 Token 用量。若提供商不开放账户数据,则明确降级为本机 Token 统计,不伪造“余额”。账户探测和会话统计均在后台执行,不阻塞主界面启动与操作。
模型资源中心展示 ChatGPT 订阅配额、DeepSeek API 余额和本机 Token 用量

截图中的模型、配额和余额来自当前部署示例,不代表固定的产品限制或默认账户数据。

设置与兼容性

DeepSeek Harness Desktop 设置界面

桌面版保留工作区、模型、插件、Agent 预设、权限和语言等 Harness 原生能力,并直接复用现有 DSH_HOME。config-example/ 提供多提供商与 ChatGPT 订阅 OAuth 路由的配置示例;仓库不包含任何真实凭据。

提供商集成

DeepSeek Harness Desktop 复用 Harness 提供商架构。兼容 OpenAI 的提供商可以作为可选提供商添加,无需重写 Agent、会话或工具层。

有意进行经过测试的集成、接入引导、文档、在 API 支持范围内的资源或用量可见性,或发布协作的模型/API 提供商,可通过 GitHub Issue 联系本项目。

本地开发

要求 Node.js 22.15+:

cd app
npm ci
npm start

运行测试:

cd app
npm test

开发模式需要预先准备 staging/payload/runtime 和 staging/payload/node.exe,它们来自上游 DeepSeek Harness,不提交到本仓库。

Harness Lab 已从当前源码的日常界面、启动流程和发布包移除;不会删除历史会话,也不影响模型资源用量统计。旧版截图可能仍显示该按钮,已发布的旧安装包不会随源码自动变化。轨迹解析器保留用于用量统计和离线回归测试,历史设计见 归档说明。

轨迹格式的验证范围(不代表业务结果质量已验收):

基于 Schema 推导、经过合成测试,并针对本地生成的最小 DeepSeek Harness 会话进行了冒烟验证。

构建

使用固定工具链和已验证的引擎运行时作为构建输入。新的打包入口不合并上游源码,也不读取旧 staging/payload:

$env:DSH_RELEASE_RUNTIME = ''
$env:DSH_RELEASE_NODE = ''
cd app
npm ci
npm run dist

安装版与便携版生成在 release-artifacts//,不覆盖已封装的旧发布。固定引擎提交、可重放源码补丁及发布约定保存在 maintenance/。全新源码到分发运行时的完整复现仍待验证,不把现有运行时打包等同于源码构建完成。

安装需要当前包与新包的可信清单 SHA256。候选先隔离验证,Desktop 未关闭则拒绝切换;跨会话格式更新不走普通安装路径。具体封装、准备、安装命令及回退边界见发布流程。

隐私与安全

仓库明确排除以下内容:

- .dsh、API 凭据、OAuth Token、登录状态与历史会话;
- 日志、缓存、数据库、本地配置与环境变量文件;
- node_modules、运行时、构建产物、签名证书与私钥。

应用只读取你本机的 DSH_HOME,不会把这些数据复制到仓库或发送到远程分析服务。

许可

桌面端代码采用 MIT License。DeepSeek Harness 及其依赖仍分别适用各自的许可证和商标条款;分发包含上游运行时的安装包前,请自行核对对应许可。
预览分享卡片长什么样 ↓yijigao/deepseek-harness-desktop
分享 · DeepSeek Harness Hub
yijigao/deepseek-harness-desktop

把 AI Agent 会话搬进 Windows 原生窗口长期使用

这是你的仓库?认领条目

回到顶部