ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

DSH Desktop 架构解析:作为 DeepSeek Harness 插件生态的薄型 Electron 宿主

DSH Desktop 架构解析:作为 DeepSeek Harness 插件生态的薄型 Electron 宿主 人工智能AI 应用AI Agent桌面应用插件系统DeepSeekdsh-plugin【免费下载链接】deepseek-harness-desktop为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」桌面本身也是「插件」。项目地址https://gitcode.com/gh_mirrors/de/deepseek-harness-desktop点击查看免费下载导读本文基于 docs/architecture.en.md 展开系统讲解 DSH Desktopdsh-plugin-desktop如何在 Electron main 进程中启动官方 DSH Host、通过回环 HTTP/WebSocket Web carrier 承载沙箱化的 Web UI以及 profile、pnpm、发行通道、打包闭包等关键机制的设计边界。读完本文你将理解桌面本身也是插件这一架构主张背后的进程模型、generation 生命周期、desktopProfiles/desktopPnpm服务契约以及 Stable/Beta 双通道更新协议的完整规则并能在仓库源码中定位每一处关键实现。总览薄的 Electron 宿主不另造 IPC 插件系统DSH Desktop 的核心设计是一个薄的 Electron 宿主它在 Electron main 进程中启动官方 DSH HostHost 通过 HTTP WebSocket 的 Web carrier 提供普通 Web UI。carrier 默认只监听回环地址loopback只有用户明确确认风险后才向局域网开放。桌面端不创建第二条 renderer IPC 插件系统也不把原生 Electron API 暴露给页面——这是整篇架构文档反复强调的安全与组合边界。从源码看这一模型在 host-process.ts 中落地为隔离的 Host 子进程startIsolatedDesktopHost通过utilityProcess.fork启动host-process-entry.js注释明确写道Electron owns the child lifetime; the child owns the unchanged DSH Web server——Electron 拥有子进程生命周期而子进程拥有未改动的 DSH Web server。主进程与 Host 之间通过HostRpc120 秒 bootstrap 超时交换boot/stop/certificate/quit消息rendererToken则用于后续在 BrowserWindow 内换取同源渲染进程凭据。启动顺序从单实例锁到 last-known-good 提交架构文档给出 7 步启动顺序每一步都能在 main.ts 中找到对应实现获取单实例锁并读取 Desktop 私有状态app.requestSingleInstanceLock()失败即退出main.ts随后读取 profile/mode 状态readDesktopProfileState、desktopSafeModeRequested、desktopRecoveryModeRequested等。Launcher 准备激活 profile 而不改写用户 profilelistDesktopProfiles只是只读发现prepareDesktopProfile与DesktopProfileCheckpoint负责准备与记录上次可用状态。profileDirectoriesBeforeStartup集合在启动前快照已有目录避免仅因列举就触碰用户 profilemain.ts。提供 native runtime、desktopProfilesbootstrap 与内置 pnpm 环境Launcher 解析数据目录并设置DSH_HOMEresolveDesktopDataDirectoryprocess.env.DSH_HOME homeDirmain.ts随后安装 app 本地 pnpm 运行时installDesktopPnpmRuntime。Host Cordis root 装载 Loader entriesDesktop service 在第三方插件可读取前注册——host-bootstrap.ts 中依次providedesktopRuntime、desktopPnpmBootstrap、desktopBrowserAccess、desktopLanHttps等再plugin(DesktopProfileService, ...)与plugin(DesktopPluginsService, ...)。官方dsh-base、dsh-web-app与所选 profile 的第三方 bundle 组合成 Web carrier。Host 默认绑定 loopbackdesktop-network.ts中desktopLoopbackBrowserUrl返回http://127.0.0.1:port/且上游 HTTP origin 永不暴露LAN 意图只控制 HTTPS 边缘DESKTOP_LAN_HTTPS_AVAILABLE true。Electron 随后创建 BrowserWindow 并从 loopback 地址加载同源页面。Web surface 加载成功后才创建托盘并提交 last-known-goodElectronShellGeneration.mount()成功后才装配Trayelectron-shell-generation.tsDesktopProfileCheckpoint负责提交健康状态。任何 profile 或模式切换都会先 dispose 当前 generation 再启动新的 generationservice reference、窗口对象与 subprocess handle 均不能跨 generation 缓存。这一约束在ElectronDesktopRuntime.schedule()的 release 回调中体现它等待mountTask完成后调用generation.release()并清理 scheduled 状态electron-runtime.ts。Host、Client 与 native runtime 的职责边界层次职责Upstream Hostagent、model、tool、session、settings、webServer、subprocess 等官方能力Desktop Host窗口、托盘、profile、终端、更新以及对外开放的两个 servicedesktopProfiles、desktopPnpmWeb Client官方 Web UI 与第三方浏览器端贡献只通过共享 Web carrier 工作不直接调用 ElectronNative runtime适配 Electron BrowserWindow、托盘、文件/网络/安装器desktopRuntime仅限 Desktop 自有 row 使用三种呈现模式与材质 frame兼容模式compatibility校验环境后仅通过 overlay slot 叠加一条独立的 36 像素 Desktop frame官方 layout、root、sidebar 与 conversation 作为完全无关的内容 viewport 从 frame 下方开始。扩展窗口extended禁用官方 root layout安装 Desktop 独立注册的 layout/sidebar surface在倒 L 材质 frame 中继续承载官方 sidebar、conversation 与 details occupant。增强模式advanced保留独立 root registration 与最初的紧凑内部 caption 几何。macOS 与 Windows 按系统能力应用原生材质Windows 的 Mica、macOS 的 Dock 图标与原生菜单但不改变上游 occupant slot 的所有权。模式切换指令与状态由 compatibility-chrome-contract.ts 定义mode-compatibility、mode-extended、mode-advanced、terminal、restart等 command托盘菜单中的模式切换走canToggleShellMode能力门控electron-runtime.ts。Desktop 级对话框与恢复窗口Desktop 级确认、警告、错误与结果不会进入 Web Client 组件树。DesktopDialogWindowdesktop-dialog-window.ts创建独立的沙箱化模态BrowserWindow使用共享的空白 utility frameauxiliaryWindowChromeOptions、尽量以当前 generation 窗口为 parent、通过local-window-policy.ts的createDesktopLocalWindow施加本地窗口安全策略并且只接受一次有界本地响应MAX_BUTTONS 4。恢复模式Recovery与新增 Profile 是使用同一套无标题 frame 的独立 Desktop-owned 窗口。恢复页面本身是 shadcn 页面采用先展示原因reason-first的呈现方式提供四个工作流 Tab破坏性恢复操作会把确认交回DesktopDialogWindow见 startup-recovery-window.ts。原生 Shell generation 与平台 adapterElectronRuntimeelectron-runtime.ts负责协调 Host 与原生桌面环境但不直接拥有窗口和托盘细节。每次启动由一个ElectronShellGeneration模块electron-shell-generation.ts完整拥有BrowserWindow、Tray、相关 Electron listener、导航限制、外链处理与缩放快捷键。释放 generation 必须通过幂等的release()接口文件底部async release()调用方不能跨 generation 缓存或单独销毁这些资源。平台差异集中在启动时选择一次的ElectronPlatformStrategyseamelectron-platform.ts平台updateDownloadPlatformcanPickDirectorycanToggleShellMode平台专属行为Windowswin32win32是是window.removeMenu()、Mica 材质、NSIS 更新macOSdarwindarwin否是Dock 图标、原生应用菜单、DMG 更新Linux无不支持下载更新否否最小化适配新平台分支应进入对应 adaptergeneration 与 runtime 只保留各平台共享的生命周期流程。electronPlatformStrategy()在启动时依据process.platform选择一次electron-platform.ts。Profile 与服务边界desktopProfiles与desktopPnpmProfile 的名字与绝对目录必须来自desktopProfiles.current不能从 argv、settings 或 URL 猜测。list()是只读发现Re-read the available profile manifests without changing themselect()记录 pending target并通过有序重启完成切换。DesktopProfileServiceprofile-service.ts对切换做序列化首个持久化成功的 selection 成为 committed target并发目标不能覆盖它持久化失败会释放槽位重启失败则保留已提交目标以防重试覆盖profile-service.ts 注释。export interface DesktopProfiles { readonly current: DesktopCurrentProfile // 本 generation 固定的 profile 身份 create(name: string): DesktopProfileSummary // 创建但不选中、不重启 list(): readonly DesktopProfileSummary[] // 只读发现 prepareSelection(name: string): PromiseDesktopProfileSelection select(name: string): Promisevoid // 持久化并请求有序重启 canDelete(name: string): boolean delete(name: string): Promisevoid }desktopPnpm.run()pnpm.ts直接运行内置 pnpm以appExecutable --import clearEnvironmentPath pnpmBinPath ...形式在激活 profile 目录下启动先经过withDesktopPnpmPolicy策略校验。runPlugin()pnpm.ts则通过打包的 DSH CLIdesktop-cli.js维持 profile 初始化、相对 source 与 bundle reconcile 的权威语义。两者都属于当前 generation并通过上游 subprocess service 获得完整进程树归属DesktopPnpmService的ctx.effect在关闭时 terminate 活动子进程pnpm.ts。Launcher 私有的desktopRuntime、desktopPnpmBootstrap、Electron executable、Node helper 与 ABI 环境不是第三方 API。稳定包的公开导出是dsh-plugin-desktop/profile-service与dsh-plugin-desktop/pnpm另有./client、./webserver、./terminal、./profiles等见 package.jsonBeta 包提供对应的dsh-plugin-desktop-beta/*路径。完整的插件集成契约见 plugin-services.md其中明确声明不授予第三方访问原生 Electron API 或 launcher bootstrap 状态的权限并给出ctx.desktopProfiles、ctx.desktopPnpm、ctx.desktopWindow的数据流图。打包与运行时闭包发布产物使用 Electron Builder 与app.asar但必须物理存在的依赖例如 pnpm、node-pty、Windows ACL/原生文件放在app.asar.unpacked。packaged-runtime-path.ts提供unpackedAsarPath()将逻辑 ASAR 路径映射到物理 unpacked 树packaged-runtime-path.ts。Packaged runtime gate 会同时检查 ASAR 入口与物理运行时入口verify-packaged-runtime.tsprofile fallback 链接不能指向 Node 无法解析的虚拟 ASAR 路径对应实现笔记 packaged-profile-fallback。外层 workspace 使用 Yarn固定的deepseek-harness/子模块保持上游自己的 pnpm workspace。Stable 与 Beta 的桌面源码分别位于 dsh-plugin-desktop/ 与 dsh-plugin-desktop-beta/由变体同步检查约束共享行为——verify-desktop-variants.mjs 对比两目录源码只允许product-identity.ts与windows-pwsh-sandbox.ts差异后者因 Stable 停留在 dsh 0.1.5-rc.2、Beta 使用 0.1.6-alpha.1 的runArgv语义差异两个包都不修改上游子模块。发行通道协议Stable 与 Beta 的实体隔离Stable 与 Beta 是两个实体 npm 包和两个系统应用不由 Git 分支区分。身份常量集中在 product-identity.ts通道npm 包产品名appId数据目录名stabledsh-plugin-desktopDSH Desktopai.deepseek.dsh.desktop.dshbetadsh-plugin-desktop-betaDSH Desktop Betaai.deepseek.dsh.desktop.beta.dsh-betaupstream.json 同时记录两个通道的上游 commit、source 版本、runtime 包版本与 vendored runtime 清单stable:0.1.5-rc.2fb2c4b9...beta:0.1.6-alpha.10a15e36...根级精确 resolution 保证每个 workspace 只能解析自己的 DSH 运行时。请求头与版本校验规则版本检查与安装包下载都携带X-DSH-Desktop-Channel: stable|betaDESKTOP_RELEASE_CHANNEL_HEADERupdate-checker.ts。检查请求还携带当前版本头X-DSH-Desktop-Version以及安装标识X-DSH-Desktop-Installation-Id下载请求携带X-DSH-Desktop-Target-Version服务端必须回显与请求一致的通道与版本。核心规则如下无通道 header 的旧客户端按 stable 处理checkForStableUpdate默认channel: stableupdate-checker.ts。Beta 客户端必须收到显式channel: beta响应parseVersionResponse中expectedChannel beta value.channel ! beta直接返回 nullupdate-checker.ts。Stable 只接受正式 SemVer无 prereleaseBeta 只接受-beta.N数字后缀见parseCanonicalChannelVersionupdate-checker.ts。Beta 自动更新只查询 Beta 通道安装稳定版是独立的显式操作允许选择较低版本allowDowngrade语义update-checker.ts并将稳定版安装在 Beta 旁边安装器经--updated --force-run参数以可见窗口启动electron-runtime.ts。响应会做内容长度与读取上限校验MAX_VERSION_RESPONSE_BYTES版本号必须是规范化的通道 SemVer防止服务端返回畸数据。服务端必须在 Beta 发布前就实现上述选择与回显规则并为两个通道分别准备完整平台产物否则客户端会把响应视为无效不会静默跨通道下载。维护者深入阅读Desktop service contractPackage READMEPinned upstream and isolated Yarn workspaceProfile and pnpm services decisionAdvanced shell decisionNative shell generation and platform adapters配套中文版原文docs/architecture.md赞分享人工智能AI 应用AI Agent桌面应用插件系统DeepSeekdsh-plugin【免费下载链接】deepseek-harness-desktop为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」桌面本身也是「插件」。项目地址https://gitcode.com/gh_mirrors/de/deepseek-harness-desktop点击查看免费下载相关推荐OpenMAIC 结构化生成基石json-output-rules 提示词规则与 LLM 输出 JSON 容错解析管线解析OpenMAIC 结构化生成基石json output rules 提示词规则与 LLM 输出 JSON 容错解析管线解析 导读在 Open Multi A人工智能AI 应用AI Agent桌面应用插件系统DeepSeekdsh-plugin天若OCR开源版构建本地化文字识别解决方案的完整指南天若OCR开源版构建本地化文字识别解决方案的完整指南 天若OCR开源版是基于Chinese lite和PaddleOCR框架开发的本地化文字识别工具为需要完人工智能AI 应用AI Agent桌面应用插件系统DeepSeekdsh-pluginjax.extendJEP 15856详解JAX 内部机制的正式扩展库视图jax.extendJEP 15856详解JAX 内部机制的正式扩展库视图 导读 jax.extend 简称 jex 是 JAX 依据 JEP 158人工智能AI 应用AI Agent桌面应用插件系统DeepSeekdsh-plugin上一篇agent-starter-pack故障排除常见问题及解决方案下一篇Hackintosh系统主题更换终极指南打造个性化苹果体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表