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

桌面工作台 yoshino-xiao7/deepseek-harness-desktop-yukiryou

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

DeepSeek Harness Desktop for macOS & Windows|面向 macOS 与 Windows 的独立 DeepSeek Harness 桌面工作台

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

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

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yoshino-xiao7/deepseek-harness-desktop-yukiryou
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · ui
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成

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

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

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包deepseek-harness-desktop-yukiryou(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

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

读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 89 处,展示前 72 条)
  • 读取密钥环境变量
    runtime/desktop-companion-plugin/index.js:13
    const expectedToken = process.env.DSH_DESKTOP_COMPANION_TOKEN ?? '';
  • 发起网络请求
    runtime/desktop-market-plugin/client.js:223
    const response = await fetch(`${route}?${params.toString()}`, {
  • 发起网络请求
    runtime/desktop-market-plugin/client.js:236
    const response = await fetch(sourcesRoute, { method: 'GET', credentials: 'same-origin', cache: 'no-store' });
  • 发起网络请求
    runtime/desktop-market-plugin/client.js:244
    const response = await fetch(`${updateCheckRoute}?${params.toString()}`, {
  • 发起网络请求
    runtime/desktop-market-plugin/client.js:255
    const response = await fetch(sourcesRoute, {
  • 发起网络请求
    runtime/desktop-market-plugin/client.js:266
    const response = await fetch(inspectionRoute, {
  • 读取密钥环境变量
    runtime/desktop-market-plugin/index.js:58
    const expectedPrivateToken = process.env.DSH_DESKTOP_COMPANION_TOKEN ?? '';
  • 写入本地文件
    runtime/desktop-market-plugin/managed-installer.js:55
    await mkdir(temporary, { mode: 0o700 });
  • 写入本地文件
    runtime/desktop-market-plugin/managed-installer.js:87
    await mkdir(packagePath, { recursive: true, mode: 0o700 });
  • 写入本地文件
    runtime/desktop-market-plugin/managed-installer.js:90
    await mkdir(dirname(target), { recursive: true, mode: 0o700 });
  • 写入本地文件
    runtime/desktop-market-plugin/managed-installer.js:91
    await writeFile(target, file.bytes, {
  • 写入本地文件
    runtime/desktop-market-plugin/managed-installer.js:117
    await mkdir(dirname(linkPath), { recursive: true, mode: 0o700 });
  • 写入本地文件
    runtime/desktop-market-plugin/managed-installer.js:130
    await mkdir(dirname(linkPath), { recursive: true, mode: 0o700 });
  • 删除本地文件递归
    runtime/desktop-market-plugin/managed-installer.js:163
    await rm(temporary, { recursive: true, force: true }).catch(() => undefined);
  • 读取本地文件
    runtime/desktop-market-plugin/managed-installer.js:325
    const root = await realpath(runtimeModulesRoot);
  • 读取本地文件
    runtime/desktop-market-plugin/managed-installer.js:329
    resolved = await realpath(candidate);
  • 读取本地文件
    runtime/desktop-market-plugin/managed-installer.js:339
    manifest = JSON.parse(await readFile(join(resolved, 'package.json'), 'utf8'));
  • 读取本地文件
    runtime/desktop-market-plugin/managed-installer.js:352
    const metadata = await lstat(path);
  • 读取本地文件
    runtime/desktop-market-plugin/managed-installer.js:361
    metadata = await lstat(path);
  • 读取本地文件
    runtime/desktop-market-plugin/managed-installer.js:370
    const manifest = JSON.parse(await readFile(join(path, '.dsh-generation.json'), 'utf8'));
  • 读取本地文件
    runtime/desktop-market-plugin/runtime-snapshot.js:39
    const bytes = await readFile(url);
  • 读取本地文件
    runtime/desktop-market-plugin/source-registry.js:115
    const metadata = await lstat(path);
  • 读取本地文件
    runtime/desktop-market-plugin/source-registry.js:119
    const encoded = await readFile(path, 'utf8');
  • 读取本地文件
    runtime/desktop-market-plugin/source-registry.js:134
    const rootMetadata = await lstat(root);
  • 写入本地文件
    runtime/desktop-market-plugin/source-registry.js:137
    await writeFile(temporaryPath, encoded, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
  • 写入本地文件
    runtime/desktop-market-plugin/source-registry.js:138
    await rename(temporaryPath, path);
  • 删除本地文件
    runtime/desktop-market-plugin/source-registry.js:140
    await unlink(temporaryPath).catch(() => undefined);
  • 读取本地文件
    runtime/desktop-settings-plugin/index.js:23
    const body = await readFile(BRAND_PATH);
  • 写入本地文件
    src/main/app-coordinator.ts:225
    await mkdir(runtimeHome, { recursive: true, mode: 0o700 });
  • 写入剪贴板
    src/main/app-coordinator.ts:1137
    clipboard.writeText(
  • 读取本地文件
    src/main/app-coordinator.ts:1397
    const manifest = JSON.parse(await readRecoveryFile(join(packageRoot, 'package.json'), 'utf8')) as { dsh?: { bundle?: { patch?: string } } };
  • 读取本地文件
    src/main/app-coordinator.ts:1400
    const entryIds = collectOwnedEntryIds(parseYaml(await readRecoveryFile(join(packageRoot, patch), 'utf8')), item.packageName);
  • 发起网络请求
    src/main/single-instance-lock.ts:23
    if (options.request()) return true;
  • 写入本地文件
    src/main/user-data-location.test.ts:18
    await expect(mkdir(result)).rejects.toMatchObject({ code: 'EEXIST' });
  • 写入本地文件
    src/main/user-data-location.test.ts:24
    await mkdir(legacy);
  • 写入本地文件
    src/main/user-data-location.test.ts:25
    await writeFile(join(legacy, 'desktop.json'), 'preserved');
  • 读取本地文件
    src/main/user-data-location.test.ts:30
    await expect(readFile(join(result, 'desktop.json'), 'utf8')).resolves.toBe(
  • 读取本地文件
    src/main/user-data-location.test.ts:34
    readFile(join(legacy, 'desktop.json'), 'utf8'),
  • 写入本地文件
    src/main/user-data-location.test.ts:42
    await mkdir(legacy);
  • 写入本地文件
    src/main/user-data-location.test.ts:43
    await mkdir(product);
  • 写入本地文件
    src/main/user-data-location.test.ts:44
    await writeFile(join(legacy, 'session.json'), 'legacy-session');
  • 读取本地文件
    src/main/user-data-location.test.ts:49
    await expect(readFile(join(product, 'session.json'), 'utf8')).resolves.toBe(
  • 读取本地文件
    src/main/user-data-location.test.ts:52
    await expect(readFile(join(product, 'Local State'), 'utf8')).resolves.toBe(
  • 读取本地文件
    src/main/user-data-location.test.ts:56
    readFile(join(product, '.migrated-from-dsh-desktop'), 'utf8'),
  • 写入本地文件
    src/main/user-data-location.ts:15
    await mkdir(productDirectory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    src/main/user-data-location.ts:28
    await writeFile(
  • 写入本地文件
    src/main/user-data-location.ts:41
    await mkdir(developmentDirectory, { recursive: true, mode: 0o700 });
  • 读取本地文件
    src/main/user-data-location.ts:47
    await stat(path);
  • 读取本地文件
    src/main/windows-release.test.ts:50
    const builder = await readFile('electron-builder.yml', 'utf8');
  • 读取本地文件
    src/main/windows-release.test.ts:57
    const packageJson = JSON.parse(await readFile('package.json', 'utf8')) as {
  • 读取本地文件
    src/main/windows-release.test.ts:62
    const updateConfig = await readFile('resources/app-update.yml', 'utf8');
  • 读取本地文件
    src/preload/sandbox-contract.test.ts:6
    const source = await readFile(new URL('./index.ts', import.meta.url), 'utf8');
  • 读取本地文件
    src/preload/update-button-contract.test.ts:5
    const preload = await readFile(new URL('./index.ts', import.meta.url), 'utf8');
  • 读取本地文件
    src/preload/update-button-contract.test.ts:6
    const client = await readFile(new URL('../../runtime/desktop-settings-plugin/client.js', import.meta.url), 'utf8');
  • 写入剪贴板
    src/renderer/index.ts:98
    writeClipboard(text: string): boolean;
  • 发起网络请求
    src/renderer/index.ts:302
    const response = await companionBridge.request({ kind: 'overview' });
  • 发起网络请求
    src/renderer/index.ts:507
    const response = await companionBridge.request({ kind: 'file.search', query });
  • 发起网络请求
    src/renderer/index.ts:582
    const response = await companionBridge.request({ kind: 'directory.list', nodeId: node.id });
  • 发起网络请求
    src/renderer/index.ts:594
    const response = await companionBridge.request({ kind: 'file.preview', nodeId });
  • 发起网络请求
    src/renderer/index.ts:602
    const response = await companionBridge.request({ kind: 'file.preview-relative', nodeId, target });
  • 发起网络请求
    src/renderer/index.ts:610
    const response = await companionBridge.request({ kind: 'change.diff', nodeId });
  • 写入剪贴板
    src/renderer/index.ts:655
    if (companionBridge?.writeClipboard(transition.effect.text) !== true) return;
  • 写入剪贴板
    src/renderer/index.ts:833
    if (companionBridge?.writeClipboard(text) === true) showReferenceFeedback(message);
  • 读取本地文件
    src/renderer/loading-brand-asset.test.ts:10
    const html = await readFile(new URL('./index.html', import.meta.url), 'utf8');
  • 读取本地文件
    src/renderer/loading-brand-asset.test.ts:15
    const image = await readFile(join(rendererPublicDirectory, source!.slice(1)));
  • 读取本地文件
    src/renderer/startup-motion.test.ts:8
    const css = await readFile(new URL('./styles.css', import.meta.url), 'utf8');
  • 读取本地文件
    src/renderer/workspace-review-ui-contract.test.ts:7
    readFile(new URL('./index.html', import.meta.url), 'utf8'),
  • 读取本地文件
    src/renderer/workspace-review-ui-contract.test.ts:8
    readFile(new URL('./styles.css', import.meta.url), 'utf8'),
  • 读取本地文件
    src/renderer/workspace-review-ui-contract.test.ts:9
    readFile(new URL('./index.ts', import.meta.url), 'utf8'),
  • 读取本地文件
    src/renderer/workspace-review-ui-contract.test.ts:26
    const html = await readFile(new URL('./index.html', import.meta.url), 'utf8');
  • 读取本地文件
    src/renderer/workspace-review-ui-contract.test.ts:34
    const styles = await readFile(new URL('./styles.css', import.meta.url), 'utf8');
  • 读取本地文件
    src/renderer/workspace-review-ui-contract.test.ts:44
    readFile(new URL('./index.html', import.meta.url), 'utf8'),
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 独立工作台

README

由 DeepSeek 最新模型翻译生成
DeepSeek YukiRyou — DeepSeek Harness Desktop for macOS & Windows 让 DeepSeek Harness 真正成为桌面应用。 面向 macOS 与 Windows 的独立工作台:内置运行时、Workspace Review、受管插件市场与可恢复的桌面生命周期。 简体中文 · English 下载最新版 安装指南 功能 本地开发 开发文档 反馈问题 ⭐ Star 支持 维护模式(2026-09-29):DeepSeek Harness 官方已经提供可下载的 macOS 与 Windows 桌面版,并继续在官方仓库迭代。本项目暂停新的基础桌面壳功能,保留现有发行版、兼容性修复、安全修复和严重安装问题处理。请优先查看 官方 Harness Desktop Releases。完整说明见 docs/maintenance-mode.md。
展开完整文档(README 剩余 1 节)
DeepSeek YukiRyou — DeepSeek Harness Desktop for macOS & Windows

让 DeepSeek Harness 真正成为桌面应用。
面向 macOS 与 Windows 的独立工作台:内置运行时、Workspace Review、受管插件市场与可恢复的桌面生命周期。

简体中文 · English

下载最新版

安装指南

功能

本地开发

开发文档

反馈问题

⭐ Star 支持

维护模式(2026-09-29):DeepSeek Harness 官方已经提供可下载的 macOS 与 Windows 桌面版,并继续在官方仓库迭代。本项目暂停新的基础桌面壳功能,保留现有发行版、兼容性修复、安全修复和严重安装问题处理。请优先查看 官方 Harness Desktop Releases。完整说明见 docs/maintenance-mode.md。

目录

- 维护模式
- 项目定位
- 下载与安装
- macOS
- Windows
- 校验下载文件
- 当前可用功能
- 为什么选择 YukiRyou
- 界面布局概览
- 后续路线图
- 版本与更新
- 技术架构
- 本地开发
- 固定运行时
- 常见问题
- 文档导航
- 参与项目

维护模式(2026-09-29)

官方 DeepSeek Harness 已公开桌面发行版,并提供 macOS 与 Windows 安装包。官方桌面端现在负责 Harness 的基础桌面承载、运行时打包和插件管理;本项目不再继续扩展相同的基础桌面壳能力。

本仓库继续保留已发布的 DeepSeek YukiRyou 发行版及其历史代码,维护范围收窄为:

- 官方 Harness 升级后的兼容性修复;
- 严重启动、安装、升级和数据保留问题;
- 现有公开版本的安全修复与用户迁移说明。

新功能、独立运行时分叉和与官方桌面端重复的基础能力暂不继续开发。需要使用官方版本时,请直接查看 官方 Releases 和 官方 Harness 项目。

项目定位

官方 DeepSeek Harness 现在同时提供 Web UI 和桌面版。本项目最初将 Harness Web UI、固定运行时、进程生命周期和发行更新收进一个可安装的跨平台桌面应用,并在官方界面之外补足账户状态、工作区文件和变更审核等桌面能力。

它不是 Harness 的重写版本,也不会改变 Agent 的工作方式。基础桌面壳能力现已进入维护模式,历史实现和已发布版本继续保留。

当前支持 Apple Silicon macOS 14+ 与 Windows 11 x64。Intel Mac、Windows on Arm 和 Linux 暂不支持。
| 打开即用 | 原生体验 | 可诊断 | 安全更新 |
| 内置固定版本的 Node.js、pnpm 与 Harness | 平台化窗口、主题同步、响应式 Workspace Review | 自动恢复运行时、日志轮转、脱敏诊断包 | macOS 签名和公证;Windows 真实安装生命周期验证与候选门禁 |

下载与安装

所有公开产物均可从 GitHub Releases 最新版本 下载。

macOS

系统要求:Apple Silicon Mac(M1 或更新芯片)、macOS 14 或更高版本。

每个版本提供两种产物:

DeepSeek.YukiRyou-<version>-arm64.dmg
DeepSeek.YukiRyou-darwin-arm64-<version>.zip

使用 DMG 安装:

1. 下载并打开 DMG。
2. 将 DeepSeek YukiRyou 拖入“应用程序”。
3. 从 Launchpad 或“应用程序”目录启动。
4. 在 Harness 界面中完成所需的服务配置,然后开始工作。

使用 ZIP:

1. 下载并解压 ZIP。
2. 将 DeepSeek YukiRyou.app 移入“应用程序”。
3. 从“应用程序”目录启动。

macOS 应用和更新包均使用 Developer ID 签名并经过 Apple 公证。

Windows

系统要求:Windows 11 x64。

每个版本提供安装版和便携版:

DeepSeek.YukiRyou-<version>-win32-x64-Setup.exe
DeepSeek.YukiRyou-win32-x64-<version>-portable.zip

使用安装版:

1. 下载并运行 Setup.exe。
2. 在 NSIS 安装向导中选择安装目录并完成安装。
3. 从开始菜单或安装目录启动 DeepSeek YukiRyou。

使用便携版:

1. 下载并完整解压 ZIP。
2. 从解压目录运行应用;便携版不会写入安装注册项。

Windows 产物暂未进行 Authenticode 签名,系统可能显示 SmartScreen 警告。请只从本仓库的 Release 下载并完成 SHA-256 校验;未签名产物不代表已获得 Windows 系统的发布者信任背书。

校验下载文件

每个正式版本都提供 SHA256SUMS.txt(macOS)和 SHA256SUMS-Windows.txt(Windows)。先将安装包与对应校验文件下载到同一目录,再执行:

macOS:

shasum -a 256 DeepSeek.YukiRyou-<version>-arm64.dmg
将输出与 SHA256SUMS.txt 中对应文件的值比较

Windows PowerShell:

Get-FileHash .\DeepSeek.YukiRyou-<version>-win32-x64-Setup.exe -Algorithm SHA256
将输出与 SHA256SUMS-Windows.txt 中对应文件的值比较

海外发行以 GitHub Releases 为源;中国大陆自动选择受 ESA 保护的 download-cn.suzuki.ink 国内镜像,失败时回退到 GitHub。镜像仅在 GitHub Release 已公开且全部校验通过后同步;其 downloads/latest.json 提供当前四个安装包的版本化直链、大小与 SHA-256。

当前可用功能

桌面与运行时

- 一体化窗口:本地顶栏与 Harness 共享视觉状态,浅色、深色和跟随系统主题会同步生效。
- 固定运行时:Node.js、pnpm 与 DeepSeek Harness 随应用交付,不读取用户的全局安装,也不会在首次启动时联网安装依赖。
- 安静的生命周期:单实例运行;关闭窗口时可隐藏,重新点击 Dock 图标即可恢复。
- 故障自恢复:Harness 或本地界面异常退出时分别恢复,避免单个区域的故障拖垮整个窗口。

账户与工作区

- 账户概览:“设置”上方默认显示当前凭据所属账户余额;悬浮时在同一行切换为本机今日估算,点击可同时刷新两项。今日金额依据会话中的官方 usage 和北京时间峰谷费率估算,不作为官方账单。
- Desktop Companion:可收起的右栏提供当前工作区文件树、相对 HEAD 的 Git 变更、增删行统计和只读 diff。
- 适合阅读的预览:Markdown 可在排版与源码之间切换,纯文本和常见图片也可在应用内预览。
- 逐轮变更入口:在 Harness 原生“产物”行下方展示本轮确认变更,点击即可进入对应文件审核。

设置、安全与发布

- 单一外观入口:浅色、深色和跟随系统统一使用“通用设置 → 外观”;“关于”展示版本、开发者信息与更新中心。
- 更新不打扰:应用定时在后台检查;只有发现可安装版本时,主界面才显示更新入口。
- 隐私友好的诊断:导出包只包含脱敏后的环境摘要和有界日志,不打包项目源码、会话或凭据。
- 可信发布链:候选包经过平台对应的安装、启动和稳定性门禁;macOS 还必须通过 Developer ID 签名、Apple 公证和最终产物复验。

插件市场

- 完整目录发现:市场基于完整本地索引提供搜索、分类、分页和自定义 HTTPS 来源管理,不把目录收录描述为官方认可或安全审核。
- 安装前安全预检:核验目录/npm 身份、仓库回链、生命周期脚本、完整性、平台、Runtime、完整依赖图、Peer 兼容性和真实包体。
- 受管生命周期:支持安装、更新、重装、启停、上一验证版本回滚和卸载;写入前需要原生确认,重启后健康失败会自动恢复。
- 明确权限边界:插件与 Harness 共享本机用户权限;Renderer 不会获得 Runtime token、缓存路径或可执行安装计划。

为什么选择 YukiRyou

- 真正的跨平台桌面产品:不是网页快捷方式。macOS 与 Windows 共享固定 Harness Runtime、核心能力和状态合同,平台差异收敛在窗口、路径、进程与安装适配层。
- 完整的工作区审阅闭环:无需离开对话,即可查看文件树、相对 HEAD 的 Git 变更、逐轮产物、增删行统计、只读 diff 与 Markdown 预览。
- 融入 Harness,而不是取代 Harness:账户概览、Desktop Companion、设置、插件市场和更新入口沿用 Harness 的交互节奏,不重写其 Agent 工作流。
- 可验证的发行结果:公开产物来自受控工作流,附带 SHA-256;macOS 还经过 Developer ID 签名、Apple 公证、异机安装和最终产物复验。
- 可诊断、可恢复:固定运行时、进程归属校验、日志轮转和脱敏诊断共同降低「换一台机器就无法复现」的桌面交付风险。

界面布局概览

应用保留 Harness 作为主工作区,并在同一窗口中补充桌面能力:

| 区域 | 主要内容 | 行为 |
| 桌面顶栏 | 窗口拖动、桌面状态与 Companion 开关 | 始终由原生桌面壳管理 |
| Harness 主工作区 | 会话、Agent 工具、设置与插件 | 保持官方 Harness 的核心交互 |
| Desktop Companion | 「变更」与「文件」两个视图 | 可收起、可调整宽度,不遮挡主工作区 |
| Workspace Review | 文件内容、只读 diff、Markdown 与图片预览 | 从 Companion 或逐轮产物进入,属于审阅视图而非独立工作流 |

后续路线图

| 功能 | 状态 | 计划范围 |
| 手机远程控制 | 规划中 | 通过明确配对和权限边界,在手机端查看任务状态、接收必要提醒,并在用户确认后继续任务;不会直接暴露本机 Harness 端口。 |
| 插件生态完善 | 持续开发 | 在现有发现、预检和受管生命周期上继续补齐可信发布者信号、权限可见性和更完整的兼容性信息。 |

路线图表示产品方向,不承诺具体发布日期。安全模型、上游 Harness 接口或素材准备不足时,相关功能会继续保持不可用,而不是通过不稳定的 DOM 注入或降低系统安全要求提前上线。

版本与更新

应用启动后会自动检查更新,也可以在「设置 → 关于」中手动检查。中国大陆优先使用国内镜像,其他地区优先使用 GitHub;国内源不可用时自动回退到 GitHub。macOS 与 Windows 安装版均在后台下载更新,完成后由用户确认重启安装。

桌面壳、Node.js 与 Harness 被视为一个原子发布单元:应用不会在后台单独升级运行时,避免新旧组件组合产生不可复现的问题。正式发布固定执行一次 DMG 公证,再从已完成 staple 的 App 生成自动更新 ZIP。详细流程见 发布 Runbook。

从早期测试版升级的注意事项

从 v0.2.1-beta.2 升级到首个 rc.8 版本前,请先通过应用菜单完整退出旧版。旧版 Runtime 没有 owner watchdog,而一次性 origin 迁移依赖最后一条 ready 记录。

如果旧版曾被强制退出、主进程崩溃,或桌面日志曾被手动清理,请先重启 macOS 再安装,以免新旧 Runtime 并发写入数据。如果 ready 记录已经丢失,升级后可能需要从侧栏重新选择一次原会话。

技术架构

flowchart LR
A["DeepSeek YukiRyou"] --> B["Electron 主进程"]
B --> C["应用内置 Node.js"]
C --> D["固定版本 DeepSeek Harness"]
D --> E["稳定 127.0.0.1 origin + HMAC secret 持有证明"]
E --> F["隔离的 Harness WebContentsView"]
B --> G["macOS / Windows 平台 Adapter"]
G --> F

运行时边界分为以下几层:

- 本地监听:Harness 只监听由应用持久选择的稳定回环地址,不向局域网暴露服务。
- 持有证明:每次 Runtime 启动都必须通过随机密钥的 HMAC 挑战,证明响应者持有本次 secret。
- 迁移保护:一次性旧日志迁移采用物理顺序中的最后一个 ready origin;轮转日志中保留的其他 ready 端口必须先释放。
- 失败关闭:如果遗留 Runtime 仍占用端口,应用会在复制或打开 Runtime Home 前按失败关闭(fail-closed)原则中止操作。
- 渲染隔离:网页运行在关闭 Node 集成、启用上下文隔离与沙盒的独立视图中;桌面桥只开放经过校验的少量能力。

HMAC 持有证明不等同于操作系统级进程隔离。完整边界见 安全设计。

本地开发

准备环境

- Node.js 22.19+ 或 24+
- Corepack / pnpm 10.34.5
- macOS 开发:Apple Silicon Mac、macOS 14+
- Windows 开发:Windows 11 x64;Windows Runtime 必须在 Windows 主机装配

macOS:启动与验证

corepack enable
pnpm install --frozen-lockfile
pnpm runtime:vendor -- --arch=arm64
pnpm dev

验证常规改动和 macOS 打包:

pnpm check
pnpm test:e2e
pnpm package:mac -- --arch=arm64

macOS 正式签名、公证和发行只通过 GitHub Actions 的 Release desktop (macOS + Windows) 工作流执行。本机只能生成不可发布的签名候选:

export MACOS_SIGN_IDENTITY="Developer ID Application: ... (...)"
pnpm release:mac:candidate
工作流使用多个全新 Apple Silicon runner:候选复制到 /Applications 后必须通过验签和启动验证,才能提交至 Apple 公证。公证后的 DMG 与 ZIP 还会在另一个 runner 上重新安装,并通过 Gatekeeper 验证和启动测试。全部门禁通过后只创建 Draft,获得显式允许后才公开 Release。

Windows:启动与验证

在 Windows x64 主机执行:

corepack enable
pnpm install --frozen-lockfile
pnpm runtime:vendor:win
pnpm runtime:verify
pnpm dev

生成并验证候选产物:

pnpm check
pnpm test:e2e
pnpm make:win

仓库的 Windows x64 candidate 工作流会验证向导式 NSIS 安装 EXE 与便携 ZIP,并真实执行自定义目录安装、启动、修复安装与卸载。正式桌面发行工作流将版本化 EXE、便携 ZIP 和 Windows SHA-256 清单加入与 macOS 相同的 GitHub Release。

完整门禁见 发布规则 和 更新日志。

固定运行时

| 组件 | 当前版本 | 策略 |
| DeepSeek Harness | 0.1.5-rc.2 | 随应用固定并验证 |
| Node.js | 24.19.0 | 按 darwin-arm64 / win32-x64 目标内置 |
| pnpm | 10.34.5 | 仅供内置 Harness 使用 |
| Electron | 43.4.0 | 桌面壳运行时 |

应用不会调用用户全局安装的 Node、dsh 或 pnpm,也不会在首次启动时在线安装依赖。

常见问题

这是 DeepSeek 官方客户端吗?

不是。这是由社区独立开发的跨平台桌面项目,与 DeepSeek 官方没有隶属或背书关系。

支持哪些平台和安装包?

当前支持 Apple Silicon macOS 14+ 与 Windows 11 x64。macOS 提供经签名和公证的 DMG 与 ZIP;Windows 提供未签名的安装 EXE 与便携 ZIP。所有产物均附带 SHA-256 校验信息。

为什么安装包比较大?

为了做到离线可启动和版本可复现,应用内置了经过校验的 Node.js、pnpm 与 Harness 运行时,而不是依赖用户电脑上的全局环境。

遇到启动问题怎么办?

先使用应用菜单导出诊断包,再到 Issues 描述操作系统版本、应用版本和复现步骤。提交前请自行确认附件中没有不希望公开的信息。

文档导航

完整索引见 docs/README.md。常用入口:

- 产品范围与验收标准
- 系统架构与安全模型
- 测试与发布及发布 Runbook
- 开发指南与当前实现状态
- Desktop Companion 方案
- 桌面框架与插件市场方案
- 临时 Harness 补丁
- 开发者实机验证插件来源
- English README

参与项目

- 遇到可复现问题,请使用 Bug 反馈表单。
- 有明确使用场景或产品建议,请使用 功能建议表单。
- 反馈前建议先安装 最新公开版本,并附上应用版本、操作系统版本和 CPU 架构。

开发者与许可

由 YukiRyou / yoshino-xiao7 开发和维护,项目代码采用 MIT License。随包提供的第三方运行时与依赖遵循各自许可证。

DeepSeek 与 DeepSeek Harness 名称归其各自权利人所有。
预览分享卡片长什么样 ↓yoshino-xiao7/deepseek-harness-desktop-yukiryou
分享 · DeepSeek Harness Hub
yoshino-xiao7/deepseek-harness-desktop-yukiryou

DeepSeek Harness Desktop for macOS & Windows|面向 macOS 与 Windows 的独立 DeepSeek Harness 桌面工作台

这是你的仓库?认领条目

回到顶部