微信扫码
添加专属顾问
Minke v0.1.0发布!DeepSeek Harness原生桌面工作台,整合对话、文件、终端等,减少Agent切换成本,本地高效协作。 核心内容: 1. Minke命名与设计理念(小须鲸呼应蓝鲸,贴近用户桌面) 2. 技术选型与开发挑战(Tauri迁移Electron,跨平台打包问题) 3. Agent行动空间构建(整合多工具,补足Agent基建能力)
自从写完 DSH:DeepSeek Harness 架构解析 后,就想亲身体验一番。终于,经过这几天开发和比预想更曲折的跨平台打包,Minke v0.1.0[1] 发布了。
Minke 是一个面向 DeepSeek Harness[2] 的原生桌面工作台。它把对话、项目文件、终端、Web 工具、本地模型和桌面操作放在同一个工作空间里,希望减少 Agent 工作过程中不断切换应用和上下文的成本。
注意:Minke 并未做老数据迁移,这部分交给 AI 都可以处理,在项目 README.md 中有写数据存储位置。
GitHub:https://github.com/lencx/Minke
Minke 是小须鲸的英文名。根据 国际捕鲸委员会的介绍[3],小须鲸是体型最小、身形最流线的须鲸之一,天生适合快速游动。DeepSeek 的蓝鲸 Logo 为这个名字提供了另一层联系:蓝鲸代表模型与 Harness 向深处探索的力量,Minke 更靠近用户桌面,在本地的对话、文件、终端和浏览器之间灵活穿行。“小”强调贴近个人的产品角色。
注:Minke 是一个独立的社区项目,并非 DeepSeek 官方产品。
这篇文章记录 Minke v0.1.0 开发中的几个关键问题:
假设你对 Agent 说:“帮我排查这个打包错误。”
只待在对话框里的 Agent 会请你粘贴日志、猜测原因,再给出几条命令让你代为执行。你跑完命令,把结果贴回来,它再继续猜。这层中转把模型隔在问题现场之外。
获得文件、终端和浏览器访问能力后,Agent 可以查看项目、运行构建、观察输出、查阅资料、修改代码并重新验证。同一个模型开始从“给出可能的答案”走向“把事情做完”。
这就是我理解的 Agent 行动空间。Files 是它观察和修改项目的入口,Terminal 负责执行与验证,Web 把外部世界带进任务现场,Session log 保留一路发生过的事情。这些能力为 Agent 增加了眼睛、双手和记忆。Codex、Claude Code 以及许多 Agent 编码工具都在沿着这个方向发展。
完整的基础设施扩大了这个空间,也让 Agent 有机会处理更长、更复杂的任务。清晰的权限、可见的结果和可恢复的生命周期构成安全边界。Minke 想给 DSH 补足行动空间,继续完善这套基建。
技术选型应比较承载真实产品能力后的系统边界。空项目的安装包大小只是一项局部指标。
Minke 最早选用 Tauri,技术栈是 Tauri、Vite、React 和 Tailwind CSS(关于技术选型,我已经写过太多,如:Agent 开发指南:技术太多,该怎么学?)。
Tauri 当时的吸引力很直接:它复用操作系统提供的 WebView,桌面壳很轻;Rust Core 负责本机能力,前端通过受控 IPC 调用它。这套结构很适合以 Web UI 为主、原生能力较少的桌面应用。
DSH 还包含一个完整的 Node.js Harness runtime,负责启动 Host、解析插件树、加载 Node package、运行 node-pty 和安装外部插件。WebView 只承载其中的前端。
无感安装要求应用自带 Node runtime、Harness、包管理器和目标平台的 native module。用户无需预先配置正确版本的 Node.js 与 pnpm。
我先尝试保留 Tauri,把 Node 24、DSH 和 pnpm 封装进一个 Node.js Single Executable Application(SEA)sidecar。这个 sidecar 自带完整运行环境,并保留外部插件的安装、加载和 HMR。
方案跑通后,sidecar 经过裁剪仍有 150 MiB 以上,Tauri 的体积优势随之缩小。DSH 的动态包解析、native module 和插件机制还需要逐项适配 SEA。Minke 同时承担 Rust Core、Node sidecar 及其运行时协议的维护。长期演进成本开始主导技术选型。
Browser 能力进一步推动了迁移。Minke 的规划包含独立 Session、请求控制、页面调试和 Chrome DevTools Protocol(CDP)。Tauri 在 Windows、macOS 和 Linux 上分别使用 WebView2、WKWebView 和 WebKitGTK,平台差异会直接进入产品。Electron 提供统一的 Chromium 多进程模型,webContents.debugger 也可以直接使用 CDP。
相关差异可以参考 Tauri 的进程模型[4]、Electron 的进程模型[5] 和 Electron Debugger API[6]。
Node 分发、动态插件、CDP、Browser 扩展和跨平台一致性评估完成后,我迁移到了 Electron Forge。
Electron 的安装包更大,其中的 Node.js 直接承载 DSH,Chromium 提供 Browser Harness 所需的能力。迁移后,Minke 复用 Electron 自带的 Node runtime 启动 DSH,移除了 SEA 封装层;Session、网络请求、权限、WebContents 和 CDP 也统一到同一套浏览器模型。
DeepSeek Harness (DSH)[7] 用 “Everything is a Plugin” 概括自身。这句话直接描述了它的工程结构。
DSH 已经提供了一套相当完整的 Agent 基础设施:
模型适配器、工具、持久化、会话标题和 agent loop 都挂载在同一棵插件树上。profile、bundle 和 cordis.patch.yml 分层组合出一个运行中的 DSH。
把 DSH 当作固定 Web 应用会迫使 Minke 长期维护 fork 或依赖脆弱的 DOM patch。当前架构将 DSH 作为产品引擎,Minke 作为独立产品层。
Minke 的自定义代码集中在 @lencx/minke-harness-overlay,上游 vendor/deepseek-harness[8] 保持独立。公开的 --patch 组合入口将产品能力加入插件树:
- id: llm-pi-ai
disabled: true
- insert:
- id: model-runtime
name: "@lencx/minke-harness-overlay/model-runtime"
- id: minke-overlay
name: "@lencx/minke-harness-overlay"
这段配置由 Minke 的 model runtime 接管本地模型准备流程,再挂载 Minke 自己的 Host/Client overlay。
这条边界让上游保持独立,也让 Minke 形成自己的产品体验。它是 v0.1.0 最重要的架构选择。
DSH 的插件系统建立在 Cordis[9] 之上。Cordis 将自己定义为 “A Meta-Framework of Spatiotemporal Composability”;对应的论文是 A Programming Paradigm for Spatiotemporal Composability[10]。
用工程语言概括,Cordis 处理两类组合问题:
Minke 的 Client overlay 提供了一个具体例子。语言包、样式、标签页 renderer、会话订阅、快捷键 runtime 和桌面 surface adapter 都通过 ctx.effect() 注册;主题和语言变化通过 typed event 同步;UI 通过 Harness 暴露的 slot 接入:
ctx.effect(
() => ctx.locale.register(NAMESPACE, { zh, en }),
"minke-overlay: shortcut dictionaries",
)
ctx.slots.inject("shell.overlay", () =>
ctx.slots.register(
{
name: "shell.overlay",
id: "minke-tabs-right",
order: 20,
locale: TABS_NAMESPACE,
inject: () => ({
placement: "right",
runtime: rightTabs,
renderers: rightWorkspace.renderers,
}),
},
TabsPanel,
),
)
Minke 的扩展以带有明确生命周期的组件挂载。插件卸载时,相关订阅、样式和运行时资源会同步释放。
新功能从三个问题开始设计:
明确这些边界后,实现通常会简单很多。
Minke 的运行结构大致如下:
Electron 负责桌面环境和安全边界:窗口、菜单、快捷键、文件对话框、终端进程、Web tab session、导航策略和持久化配置。
DSH 运行在一个独立的本地子进程中。Minke 使用 Electron 自带的 Node runtime 启动它,监听 127.0.0.1 的随机端口;主进程从输出中读取 ready URL,再让窗口加载 Harness UI。启动超时、输出截断、异常退出后的恢复提示、进程组关闭,都由一个独立的 HarnessRuntime 模块管理。
浏览器侧的 Minke overlay 通过 context-isolated preload 暴露的窄接口访问桌面能力。Node 权限保留在 Electron 主进程,IPC 请求还会校验 sender 和 frame URL。
完整应用内部保留了三条清晰边界:
源码环境通过三条命令即可运行 DSH:
pnpm install
pnpm run build
pnpm dsh web
跨平台安装包还需要一套独立的构建与分发工程。
DSH 是一个大型 monorepo。完整 workspace 会带入开发依赖、源码、类型声明、source map、测试资产和其他平台的 native binary,体积也无法控制。pnpm 的 symlink 布局、Node native module、Electron ABI 和 ASAR 继续增加分发复杂度。
Minke 的独立 Harness staging 流程包含以下步骤:
@deepseek-ai/dsh、0.1.0-rc.7。pnpm deploy 生成候选 runtime,并补齐 deploy 忽略的 workspace package。.bin 等非运行时布局。node-pty、reflink 等 native asset。runtime/host。这部分是整个开发过程中最有意思、也最容易低估的工程之一。
最初从 monorepo 直接部署出来的 Harness Host,逻辑体积约为 244.5 MiB,共 33,269 个文件。内容分析显示其中混合了多类资源:
package.json 和运行时资源;.yarn 与构建缓存;每项删除都需要证明生产能力保持完整。裁剪分成多个独立批次,每一批都有反向门禁和打包态验证:
node-pty、pnpm 和其他 native asset。.node 文件存在性检查。.app 中的 Host 体积、文件数、必需路径和禁止路径设置发布预算。Electron locale 使用覆盖主要市场的 allowlist。最终保留 24 个语言包,供未来 Browser/WebView 中的 Chromium 原生菜单、权限提示和内置页面使用;其余 196 个长尾语言包被移除。
我用相同环境重建了优化前的提交,单独测量裁剪收益。下表记录裁剪阶段的中间快照;v0.1.0 的最终交付体积见表后数据:
主要收益来自 Harness source map、重复工具、类型声明、测试与示例、非目标平台资源,以及 Electron locale。本轮裁剪覆盖 Harness Host 及其依赖中的 source map。v0.1.0 仍包含 Electron 主进程的 source map,后续版本会单独移除。
桌面应用的“体积”至少有三种口径:运行时逻辑大小、安装后的磁盘占用和用户实际下载的压缩包。三个数字各自描述不同阶段,无法直接相加或相互替代。
v0.1.0 的 macOS arm64 最终交付数据如下:
.app:约 408 MiB;141.8 MiB 的 Host 是完整应用的一部分。408 MiB 还包含 Electron、Chromium、主流语言包和原生 Framework;143 MiB 是压缩后的下载体积。最终的 Harness runtime 拥有明确的依赖闭包、平台边界、体积预算和来源校验。
这套工程让我对 Harness 有了一个更具体的认识:
Harness 包含 agent loop 和 tools,也包含构建、裁剪、签名、升级、诊断和分发组成的软件供应链。
DSH 提供能力结构,Minke 负责将它变成桌面产品。
Minke v0.1.0 支持 LM Studio 和 Ollama,并保留通用的 OpenAI-compatible 配置。
model runtime 明确定义了三种生命周期:
external:连接用户已经运行的服务;ensure-running:服务不存在时启动;managed(LM Studio):在卸载时关闭由 Minke 启动的服务。LM Studio 还会检查当前加载实例的 context window。外部服务保持原有配置,Minke 报告当前值和要求值;由 Minke 管理生命周期的实例可以执行受控的 load/reload。
中心控制器会迅速积累平台、模型和生命周期的条件分支。Cordis 插件树让 provider、生命周期策略和产品配置分别演进。
v0.1.0 的大部分时间花在了打包上。
Electron Forge 清理 .bin 时使用了过宽的 glob,扫描范围超出目标 node_modules,Windows 打包表现为无报错卡住。pnpm patch 将扫描范围收敛到 buildPath/node_modules,打包随即恢复。
Squirrel 的 release extraction 使用独立的临时目录,TEMP 和 TMP 无法完整覆盖。SQUIRREL_TEMP 指向 Windows runner 上的 D:\t 后,路径长度得到控制:
TEMP: D:\t
TMP: D:\t
SQUIRREL_TEMP: D:\t
桌面发布中的每一层工具链都有自己的路径语义。
Ubuntu 上的 pnpm start 卡死源于 esbuild launcher 与平台 binary 共享 hard link。社区贡献的 PR #1[11] 修复了这个问题。
原来的优化逻辑在 launcher 路径上直接写入一个很小的 Node wrapper,同时修改了共享 inode,连 native binary 也被覆盖。修复采用原子目录项替换:先写临时文件,再 rename 到目标路径,保留 canonical binary 的 inode。
这是我很喜欢的一个 bug。它提醒我们:文件路径相同不代表文件身份独立。发布工程里,link、inode、copy-on-write 和 archive layout 都可能成为业务问题。
macOS Intel 的 DMG 曾在 hdiutil detach 阶段报告目标卷不存在,相同代码重新运行后成功。最终发布时,Linux runner 又在通常只需几秒的 apt-get install 上卡了二十分钟。
两次故障都先经过复现与历史耗时对比。macOS 问题未稳定复现;Linux workflow 被取消,随后只重跑 Linux job 及依赖它的 Release job。
CI 失败需要先归类:产品缺陷、工具链缺陷或 runner 瞬态故障。错误归因会制造无效修改。
Linux 安装包会生成 minke.desktop,Electron 的 desktopName 需要与它一致,桌面环境才能正确关联窗口和图标。社区贡献的 PR #2[12] 修复了配置,并补上针对性回归测试。
这一行配置连接了包名、desktop entry、Wayland app id 和 X11 WM_CLASS 四层契约。
发布前,Minke 的 227 项桌面测试覆盖交互、配置和架构约束:
Harness 产品最昂贵的回归集中在“源码—构建—runtime—Electron—安装包—操作系统”这条长链路的接缝上。这些测试直接覆盖接缝。
DSH 仍处于 developer preview,升级会有 breaking change;Cordis 也在快速演进。Minke 固定在 rc.7,下一次升级需要重新检查 settings、LLM adapter、attachment 和 native module 等契约。
DSH 对复杂性的组织方式改善了整体开发体验:
“Everything is a Plugin” 为复杂性定义了位置、依赖和生命周期。
这套结构让 Minke 聚焦产品体验:桌面工作区的组织方式、工具与上下文的距离、本地模型的所有权,以及原生能力的桥接范围。底层 Harness 保持独立演进。
v0.1.0 验证了一条路径:开放、可组合的 Agent Harness 可以在不 fork 上游的前提下,长出有明确产品判断的桌面应用。
Minke 定位为 DSH Harness 在桌面场景中的产品化实验。Cordis 的组合模型让这次实验直接从扩展与组合开始,保持上游源码独立。
做 Agent 产品时,可以把关注点从“模型调用”再向外扩一层:
这些问题决定了一个 Agent Demo 能否变成可维护、可分发的软件。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-09-16
Typefree 开源了,全新的 AI 语音输入法交互逻辑,丢掉键盘快捷键!
2026-09-16
腾讯云自研 AI 助手 Octop 正式开源!
2026-09-16
谷歌放大招了!开源AI项目Artemis,让手机自动化成功率飙升到99%
2026-09-15
我们给DeepSeek Harness接入了MemSearch ,自动把Memory提炼成Skill
2026-09-14
LiveKit:ChatGPT 语音模式背后的开源项目
2026-09-14
25GB 内存的破电脑,跑起了 744B 大模型
2026-09-14
小红书 AllSpark 发布 Iris:同量级最强开源 Search Agent
2026-09-14
开源版 AI Office 来了:HermesOffice 把本地 Agent 塞进文档、表格和 PPT
2026-06-22
2026-06-18
2026-07-23
2026-06-20
2026-06-23
2026-08-16
2026-06-29
2026-07-01
2026-07-25
2026-06-20
2026-09-11
2026-09-03
2026-08-31
2026-08-23
2026-08-20
2026-08-19
2026-08-14
2026-08-04
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。