dsh-asar-framework:DSH 桌面的 asar 壳桥基座

前言

在 DSH 桌面版里,主进程能力(托盘、原生通知、窗口)打包在 resources/app.asar 的 lib/main.js 中;Host 插件运行在 ELECTRON_RUN_AS_NODE=1 的子进程里,结构上无法直接调用 Electron 的 Tray、Menu、Notification。若每个需要这些能力的插件都自行改写 asar,会出现写入互相覆盖、备份分散、升级后状态不可追溯等问题。asar 又是只读归档,任意文件长度变化都会破坏目录头与 offset,能安全等长改写的托盘区域仅 1,253 字节。

下面介绍社区插件 dsh-asar-framework(@local/dsh-asar-framework):把「写 asar」收归一处,通过 Cordis 服务 asarShell 与文件通道,让 Host 插件在不改外壳协议、不重打包 asar 的前提下使用主进程侧的托盘、通知与窗口能力。

这是什么

dsh-asar-framework 由维护者 DX12xyz 发布,归类为 DSH 客户端插件,许可证 MIT。仓库:https://github.com/DX12xyz/dsh-asar-framework;社区目录页:https://www.skillhub.cn/plugins/DX12xyz/dsh-asar-framework。

一句话定位:DSH 桌面版的 asar「壳桥」基座——等长 asar 补丁、外置 tray-bridge.js、asarShell 服务与 JSONL 文件通道契约。当前资料标明适配 DSH Desktop 0.2.2-rc.1(Electron 44.7.0,Windows x64);Web 端可装 bundle,但无 Electron 桥与 asar 补丁,通知与窗口能力不可用。

核心功能

唯一写入者与冲突可观测

其他插件不直接改安装目录,只通过 asarShell 下单;能改 asar 的路径限于本基座(离线安装器或运行期等长 region 修复)。谁打的补丁、是否本框架、是否外来,都可分类、可拒绝、可还原;支持 --dry-run 看计划、--apply 写入、--restore 回到 stock,无后台自动改档。

等长补丁与外置桥

会做 不做
将 1,253 B 托盘 region 替换为「委托外置桥」实现,长度与 offset 不变 不重打包 asar、不新增注入点或 require 路径
在 resources/app.asar.unpacked/dsh/tray-bridge.js 原子换装桥文件 不自动更新 asar;升级需人工确认并重启
提供 asarShell 与文件通道(通知、窗口请求/结果、诊断) 不 provide tray、不写 menu.json(托盘贡献仍归既有插件)

主进程只处理「一行 JSON」;插件只认识 asarShell。中间状态落在 <DSH_HOME>/dsh-asar-framework/,桥轮询主进程,对通知与托盘而言延迟约在 250–700 ms。

已核实的能力面

  • notification:asarShell.forPlugin(owner).notification.show() → Host 写 notify.jsonl → 桥弹出原生通知 → 点击回传 events.jsonl。
  • window(v0.2 起):list / primary / show / focus;请求与结果走两条 JSONL,2 s 超时、最多 16 个在途;setTitleSuffix 目前固定返回 WINDOW_UNSUPPORTED。
  • compat gate(v0.2.2):每 60 s 快速巡检、外来来源启发式识别、POST /compat/repair 等长修复(需重启)、POST /compat/forget 等。
  • tray:asarShell.capabilities 当前仅含 notification 与 window;tray 为保留名,lib/tray/** 为已迁移领域库、尚未接线。

维护者声明:提供的是「秩序保护」,不是安全沙箱——能减轻协作型插件互相覆盖,不能防同权限恶意改写;威胁模型见仓库 docs/SECURITY.md。

安装与启用

前置条件:Windows x64;DSH Desktop(资料绑定 0.2.2-rc.1);安装/维护脚本需 Node.js 20+(资料写明已验证 Node.js 24)。可选使用 dsh CLI。

安装分两条链,勿混用:

链 作用 是否改安装目录
A. Cordis bundle profile 依赖与 bundle 否
B. asar 补丁 + 桥 app.asar 与外置桥、状态目录 是(--apply / --restore)

只完成 A 不会让通知/窗口生效:Host 服务会起,但主进程无桥。B 链须在 完全退出 DSH 桌面版后写入,写完再重启。

A. 安装 bundle

插件页(推荐)

  1. 打开 DSH 插件页 →「安装插件」;
  2. 安装源填 https://github.com/DX12xyz/dsh-asar-framework,或 github:DX12xyz/dsh-asar-framework;
  3. 按提示重启 DSH(Host 半身需重启;client 半身刷新页面即可)。

命令行

dsh plugin --profile desktop add github:DX12xyz/dsh-asar-framework

亦可用本地目录、file:<路径> 指向 clone 后的仓库,或从 GitHub Releases 下载 local-dsh-asar-framework-<版本>.tgz 后:

dsh plugin --profile desktop add "file:<下载的 tgz 路径>"

B. asar 补丁与外置桥

先设置安装根目录(含 resources\app.asar 的目录):

$env:DSH_DESKTOP_INSTALL_ROOT = "<你的 DSH 安装根目录>"

bundle 装好后首次启动会检测 B 链;未就绪可向导内「一键安装」,或完全退出 DSH 后手动执行:

node scripts/install.mjs --status  --install-root "$env:DSH_DESKTOP_INSTALL_ROOT"
node scripts/install.mjs --dry-run --install-root "$env:DSH_DESKTOP_INSTALL_ROOT"

# 托盘 → Quit 完全退出后再写

node scripts/install.mjs --apply   --install-root "$env:DSH_DESKTOP_INSTALL_ROOT"

回滚 stock region 与桥:

node scripts/install.mjs --restore --install-root "$env:DSH_DESKTOP_INSTALL_ROOT"

退出码:0 成功;2 校验失败/拒绝/外来补丁;3 用法错误。细项见仓库 INSTALL.md、docs/UPGRADE.md。

可选联动 dsh-power:检测到重启 API 时安装完成页可提供「重启 DSH」;否则仅提示手动重启。

典型用法

插件侧通过 Cordis 获取服务,按 owner 隔离调用:

const asarShell = ctx.get('asarShell');
// 通知
await asarShell.forPlugin(owner).notification.show({ /* 参数见 TECHDOC / CONTRACT */ });
// 窗口(v0.2+)
await asarShell.forPlugin(owner).window.show(/* ... */);

消费者可显式 asarShell.registerConsumer(...),或通过 forPlugin() 自动登记为 standard。完整 API、能力矩阵见仓库 TECHDOC.md;冻结契约以 CONTRACT.md 为准。

适用场景与注意

适合谁:在 DSH Desktop Windows x64 上开发需要原生通知或窗口控制的 Host 插件,且希望避免多方各自打 asar 补丁的团队或个人。

务必注意:

  1. 插件与本基座以当前 DSH 进程权限运行;安装前应阅读源码与 MIT 许可证,自行评估是否接受对 app.asar 托盘区域的等长改写。
  2. 仅支持资料列明的桌面版本 baseline;跨版本不沿用 baseline,哈希不符会隔离并自禁用。
  3. 卸载分两阶段:设置页「卸载 / 回滚」先 --restore,重启后再关插件或删 <DSH_HOME>\dsh-asar-framework;细节见 README「卸载与回滚」。
  4. 若重启后出现 Web authentication failed,资料说明少数情况与 Electron 会话 cookie 有关,与 asar 补丁无必然关系;可按 README 备份并删除 %APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies 后重启。

DSH 生态强调「一切皆插件」;skillhub.cn 为社区目录,与 DeepSeek / 幻方无官方从属关系。本介绍事实均来自上述仓库 README 与 package.json 抓取内容。

结尾

经过上面的步骤,你得到的是一条可审计的壳桥路径:Host 只谈 asarShell 与 JSONL,主进程只谈外置桥与原生 UI,asar 写入集中在一处。进一步阅读架构与测试矩阵可打开 GitHub 仓库;从目录页安装可走 skillhub 插件页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜