桌面版来了,给 DSH 补了个 Electron 桌面版(file:// + IPC,无需本地服务) #3118
Replies: 6 comments
|
补充一下接下来的计划,回应"跑法对普通人太难"这个反馈:
先打个 mac 的 |
|
打包这步打通了 ✅ mac 的 做法上最折腾的是依赖这块:DSH 主进程是运行时按名字加载一堆插件包的,没法像普通 Electron 应用那样 bundle 成一个 js,得把整棵 pnpm 依赖树"摊平"成真实文件随包分发(pnpm 的符号链接在打包后解析不了,还有循环链接会把拷贝卡死)。写了个收集脚本( 几个关键点:
代码在 现在的限制:dmg 没签名,别人装会被 Gatekeeper 拦(右键打开能绕过)。要正经分发得上 Developer ID 签名 + 公证,我正在弄。下一步把"设置→模型里填 key"这条链路在打包版里实测通,这样大家装完打开填一次 key 就能用。 |
|
修复了一个启动崩溃 + 顺带瘦了体积。 有同学反馈装的 .app 打不开,报 体积也从 800M 降到 544M(dmg 152M)——electron-builder 在 pnpm monorepo 里会把整个 workspace 都收进来,得显式排掉。 修复在 |
|
用的时候发现一个事,跟大家同步下,也想听听你们的想法。 插件列表页是只读的,这不是 bug。 我去翻了下官方代码,
所以"列表里不能调启停、不能直接加插件"这个行为,跟官方 web 版是一致的——它不是把管理功能藏在 UI 里,而是放在 CLI 和配置里。 但 Electron 打包版在这有个真实的坎。 官方 想征询下大家的建议:
如果你们用桌面版时有别的卡点,也欢迎提。 |
|
我也做了一个https://github.com/LoongSerpent9Realms/deepseek-harness-installer |
|
我在做一个 DSH-native 的模型策略/profile 分发层 DSHelm,刚整理了一份可复用的桌面宿主验收思路,放在这个 PR 里供参考:Altairpaca/dshelm#5 重点不是再造一个 Electron 壳,而是验证桌面宿主能否像 Web 一样:
PR 里有桌面/窄屏截图、干净 HOME/DSH_HOME 的 profile fixture,以及 source-preview 安装脚本。当前明确是 alpha,npm 还未发布;我没有把源码流程包装成已经可用的一键安装。 如果这个验收方向对官方桌面宿主有帮助,我可以把 fixture 缩成独立的通用插件/profile contract,不绑定 DSHelm。 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
效果图(都是 Electron 原生窗口实拍,下方gif加载较慢,也可看 源视频,建议 ⌘+点击新标签页打开):
折腾了一个 DSH 的 Electron 桌面版,不用起本地服务那种
一直想要个能直接双击打开的 DSH 窗口,不想每次都
dsh web起个本地 server 再开浏览器。翻了下源码发现官方其实早就把路铺好了——packages/host/webserver里写着 "Web shape only — Electron loads dist overfile://and carries fetch over an IPC bridge",AbstractApiClient.doFetch也把 IPC bridge 列为预期传输之一。位置都留好了,那我来实现。代码在 fork 上,欢迎来踩:
分支:https://github.com/imlx/deepseek-harness/tree/feat/electron-transport
设计笔记(中英双语):
.agents/notes/proposed/architecture/2026-08-14-electron-file-ipc-transport.md大概干了三件事:
dsh-client-connection里加了个ElectronApiClient,unary 走 preload 注入的window.dshIpc桥,下行流 override 成走 IPC 推送而不是 WebSocket。apply()就多了一个分支(?fixture→ Electron → 浏览器),重连循环、RPC 校验这些都是复用原来的,没动 core。apps/electron主进程壳,进程内拉起一份 profile,用 overlay patch 把所有"起端口/组浏览器图"的行关掉,再把网关桥到 IPC。下行流在主进程里迭代apiProxy.events推给渲染进程。dsh.client声明重组,bundle 用file://绝对路径,默认<script src>加载直接就能跑。原生能力(比如目录选择)走的是 provider 接缝,没往壳里写死。
踩了两个印象比较深的坑,记一下免得别人再踩:
/api网关,但file://的 hostname 是空的,isLoopbackHostname会判成非回环。这个一开始没处理,结果所有 settings 作用域全退化成内存态,"插件配置"页整页空白,查了半天才发现是这一行的事。streamReady再推。测试和门禁都过了:
connection包 121 个单测,改动的两个文件保持仓库要求的单文件 100% 覆盖;build/knip/constraints/publint/doc-sync/typecheck/lint 全绿。macOS 上端到端跑过:起窗、过 onboarding、设置页三张卡(Shell / Agent 循环 / 网页搜索)都正常。最后补充一下:现在仓库只开了 Discussions,Issues 和 PR 都关着。这套东西基本是照着官方预留的蓝图补全的,规范也都严格按仓库要求走。如果方向 OK,我很乐意整理成正式 PR;要是官方对桌面端另有打算,也麻烦指个方向,我可以配合调整,或者就当个社区维护的可选形态继续养着。
跑法:clone fork 切到
feat/electron-transport,cd apps/electron && pnpm start(完成后仅需填入DEEPSEEK_API_KEY,体验飞速响应)。All reactions