deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:enoughpower/dsh-desktop-mac
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
把 DeepSeek Harness(@deepseek-ai/dsh)封装成原生 macOS 桌面应用。壳使用系统 WKWebView(不是 Electron),后端打包精简后的 Node.js 运行时 + 精简 node_modules,因此体积远小于 Electron 方案。
./build.sh 会产出 dist/DeepSeekHarness.app,双击即可运行(本地临时签名)。
| 组成 | 大小 | 说明 |
|---|---|---|
node 运行时 |
~85 MB | 本地 Node 用 strip -x 去掉调试/本地符号(保留原生 addon 需要的导出符号) |
node_modules |
~94 MB | 生产依赖再精简(见下) |
| Swift 壳 | ~0.1 MB | AppKit + WKWebView 单文件 |
| 合计 | ~180 MB | 对比:Electron 方案通常 200 MB 起,且不含后端依赖 |
desktop/
├── App/
│ ├── main.swift # 原生 WKWebView 壳:起后端、读 DSH_READY、加载页面、随退出清理
│ ├── Info.plist # 应用清单(含 ATS 本地网络豁免)
│ ├── make_icon.swift # 图标生成(可选)
│ └── icon.icns # 已生成的图标
├── launcher.mjs # 后端监督进程:spawn dsh web,确认就绪后输出 DSH_READY=<url>
├── prune.patch.yml # 禁用被裁剪掉的插件行(llm-pi-ai、telemetry)
├── git.patch.yml # 注册内置 Git 插件
├── billing.patch.yml # 注册内置余额/消费插件
├── updater.patch.yml # 注册内置版本号/检查更新插件
├── skill-manager.patch.yml # 注册内置技能管理器插件
├── mcp-settings.patch.yml # 注册内置 MCP 服务管理插件
├── vision.patch.yml # 注册识图插件 dsh-vision(接管 llm-deepseek)
├── prune.sh # node_modules 精简脚本
├── build.sh # 一键构建
├── plugins/ # 内置插件源码(构建时拷入后端 node_modules)
└── package.json # 仅声明依赖 @deepseek-ai/dsh
依赖:macOS + Xcode 命令行工具(swiftc/codesign)+ Node.js(用于打包运行时与装依赖)。
cd desktop
./build.sh # 默认:完整多供应商版(包含 Pi.ai / Mistral / Anthropic / Google / AWS Bedrock / OpenAI 等全部 SDK)
KEEP_EXTRA_PROVIDERS=0 ./build.sh # 最小版:仅 DeepSeek,约小 110 MB
首次构建会 npm install --omit=dev 安装 @deepseek-ai/dsh 的生产依赖。
build.sh默认export KEEP_EXTRA_PROVIDERS=1(保留多供应商 SDK 与llm-pi-ai行启用)。 设KEEP_EXTRA_PROVIDERS=0走精简路径:prune.sh会删除 Pi.ai 相关 SDK,prune.patch.yml把llm-pi-ai行置为disabled。
prune.sh,仅最小构建时从 ~307 MB → ~94 MB):@earendil-works/pi-ai 及其拖入的
@mistralai/@google/@anthropic-ai/@aws-sdk/@opentelemetry/openai,约 110 MB),
通过 prune.patch.yml 把 llm-pi-ai 行置为 disabled;默认模型仍是
deepseek-official(deepseek-v4-flash)。@opentelemetry,默认即关闭)。.ts/.d.ts/.map/第三方 .md/LICENSE/test/examples/CI 目录等非运行文件。strip -x:去掉本地符号表(~21 MB),保留原生 addon(sharp、koffi、
node-pty、better-sqlite3)链接所需的导出符号。注意不能用完整 strip,否则 addon
dlopen 时找不到符号而段错误。默认
./build.sh产物约 290 MB,包含全部多供应商 SDK;构建后在 设置 → 模型 → 添加提供方 里可启用 amazon-bedrock / anthropic / google / google-vertex / mistral / openai / openrouter / xai / groq / nvidia 等 30+ 提供方(llm-pi-ai 插件按需休眠加载,配置 provider 即可激活)。
Process 拉起 Contents/Resources/backend/node launcher.mjs。launcher.mjs 启动 dsh web --patch prune.patch.yml --host 127.0.0.1 --port 0,
轮询确认前端可访问后,向 stdout 打一行 DSH_READY=http://127.0.0.1:<port>。DSH_READY 后把该地址加载进 WKWebView。~/.dsh,与命令行 dsh 共享。SIGTERM,launcher 转发给 dsh web 完成优雅退出。后端只监听 127.0.0.1 的随机端口,避免端口冲突与暴露到局域网。
应用在窗口右上角常驻显示当前 DeepSeek Harness 版本号(@deepseek-ai/dsh 包版本,
如 v0.1.0-rc.6)。「设置 → 检查更新」里可以:
@deepseek-ai/dsh 的最新版本;@deepseek-ai/* 依赖)并原子替换进
应用包内的 node_modules,完成后自动重启应用(重启前会重新签名,保证 arm64
上的 ad-hoc 签名仍然有效)。实现是内置插件(与 git/billing 同模式):
| 文件 | 作用 |
|---|---|
plugins/dsh-updater/ |
宿主半部:/updater JSON API(version / check / update / status) |
plugins/dsh-client-ui-updater/ |
浏览器半部:右上角版本徽标 + 设置里的「检查更新」区块 |
updater.patch.yml |
注册这两个插件(launcher 启动时经 --patch 传入) |
运行时「检查更新」只替换当前应用包内那份 node_modules,不会写回桌面源码依赖。
因此只要重新运行 ./build.sh,版本就会回到源码锁定的版本(build.sh 每次都从
desktop/node_modules 重新拷贝)。
要永久升级(让 ./build.sh 稳定产出新版本):
cd desktop
# 1) 把 package.json 里 @deepseek-ai/dsh 的版本号改成目标版本(如 0.1.0-rc.7)
# 2) 用可用的 node/npm 重装依赖(系统 node 可能因 icu4c 损坏,用 nvm 的 node)
$HOME/.nvm/versions/node/v22.19.0/bin/npm install --omit=dev --no-audit --no-fund
# 3) 重建
./build.sh
./build.sh 产出应用包的 @deepseek-ai/dsh 版本 = desktop/node_modules 里的版本,
所以以 package.json 声明的版本为准。
内置的 Git 插件提供全屏 Git 面板:点击侧边栏底部的 Git 按钮打开,Esc / 关闭按钮
退出。打开时自动关联当前会话的工作目录(useSessions 读取当前会话 cwd),也支持
在顶部输入任意仓库路径。
功能:
⋯ 菜单 →「丢弃改动」恢复工作区改动(未跟踪文件不提供);
「移除文件」从工作区删除该文件(含未跟踪文件,二次确认后不可恢复)。提交已暂存 (N)),未暂存的不受影响;
支持 amend 上次提交;消息输入区 + 输出回显。git log -- <file>)与 blame。@@ -旧行 +新行 @@。| 文件 | 作用 |
|---|---|
plugins/dsh-git/ |
宿主半部:/git JSON API(status/stage/diff/commit/branch/merge/log/blame/cat 等 28 个操作) |
plugins/dsh-client-ui-git/ |
浏览器半部:侧边栏 Git 入口 + 全屏面板 UI |
git.patch.yml |
注册这两个插件(launcher 经 --patch 传入) |
内置第三方插件 dsh-vision(见其 GitHub 仓库),给纯文本模型(DeepSeek 等) 提供近原生图片理解:
~/.dsh/settings.yaml 的 llm-deepseek 段
(visionBackend / visionBackendModel / visionBackendBaseURL / maxImages);
密钥用环境变量(如 ZENMUX_API_KEY)。说明:dsh-vision 会接管官方
llm-deepseek适配器(保留模型目录、设置与凭证), 已在 rc.7 上做兼容修复(keyed 插槽补key)。原先的「图片转文字」手动插件 (image-input)已删除,图片识图统一由 dsh-vision 接管。
| 文件 | 作用 |
|---|---|
plugins/@oil-oil/dsh-vision/ |
插件源码(宿主半:视觉桥接适配器;浏览器半:「视觉识别」配置卡片) |
vision.patch.yml |
注册该插件并接管 llm-deepseek(launcher 经 --patch 传入) |
内置了第三方插件 dsh-skill-manager(npm 包),在设置页加一个「技能」入口,
列出已安装技能(名称 / 描述 / 模型-用户调用类型 / 来源根目录)并支持搜索。只读浏览
本地技能目录($DSH_HOME/skills、~/.agents/skills)。
| 文件 | 作用 |
|---|---|
plugins/dsh-skill-manager/ |
插件源码(宿主半:/api/skill-manager/list;浏览器半:设置页技能列表) |
skill-manager.patch.yml |
注册该插件(launcher 经 --patch 传入) |
内置了第三方插件 @opendsh/dsh-plugin-setting-mcp(npm 包),在设置页加一个
「MCP 服务」入口,可查看、新增、修改、移除、启用/停用 MCP 服务(stdio /
Streamable HTTP),点「保存」即热更新生效(无需重启进程)。它管理的是
@deepseek-ai/dsh-mcp-client 的 loader 条目,并把服务集合持久化写回 profile 的
cordis.patch.yml。
| 文件 | 作用 |
|---|---|
plugins/@opendsh/dsh-plugin-setting-mcp/ |
插件源码(宿主半:typert ctx.mcp 服务;浏览器半:设置页 MCP 服务管理) |
mcp-settings.patch.yml |
注册该插件(launcher 经 --patch 传入) |
launcher 还会把后端目录(含内置 node 二进制)放在 PATH 最前,确保插件跑视觉
子进程时用的是应用自带的 Node,而非可能损坏的系统 Node。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。