Skip to content

Releases: realguan/dsh-deepseek-chat-embed

v0.1.2 — 模态弹窗期间原生子视窗让位

Choose a tag to compare

@realguan realguan released this 16 Oct 06:03

修复

DSH Dock 下打开「设置」弹窗时,右侧 DeepSeek 聊天遮挡弹窗。

弹窗经 React Portal 挂在 document.body,遮罩 z-index:1000 + 居中 800px 卡片;而 Dock 的聊天是顶层原生 WKWebView,物理图层压在主页 Webview 之上,遮罩盖不住——弹窗右半边被白底遮挡,表单与关闭按钮不可见不可点,点击右侧也无法击中遮罩。

  • 弹窗在场即 hide() 让位,退场后自动 open() 原位接回,会话历史 / 登录态 / 滚动位置零损失
  • MutationObserver 只看 document.body 直接子节点(不开 subtree),不解析节点、不猜 class 名
  • 判定与策略分离:anyModalActive()(事实)→ modalBlocksHost()(策略)

仅对原生视窗壳生效

壳 聊天形态 遮罩能否盖住 行为
DSH Dock (Tauri) 原生 WKWebView ❌ 盖不住 让位
官方桌面版 (Electron) DOM <webview>(.dsce-overlay z-index 200) ✅ 官方遮罩 1000 天然盖住 零干预
web profile 无 guest ✅ 零干预

官方 Electron 下聊天在磨砂遮罩下依稀可见正是官方交互,跟着 hide() 反而会把聊天整个弄消失——那是回归,不是修复。此分流有回归测试钉住。

质量整改(相对初版)

  • 删掉 43 行可证明死代码的重复监听(syncToHost 在无 host 时直接 return,而有 host 时 attach() 已建过监听)
  • 删掉 [class*="overlay"] 式 class 名猜测选择器及整套节点匹配循环 + 死分支
  • 抽取 frameThrottle:chrome / modal / scroll 三条路径重复的「压到下一帧、一帧一次」防抖收为一处
  • hostIsBlockedByModal → anyModalActive + modalBlocksHost:判定与策略分离,策略处按宿主分流
  • 撤掉 fix 提交里违反仓库惯例的版本号 bump(版本只在 chore(release) 动)

契约测试 89 → 100 项全绿(含 4 项环境分流回归断言)。

已知取舍

Dock 下弹窗期间右侧为空白,与官方「聊天在遮罩下依稀可见」仍有差距。追平它需要壳侧新增原生视窗截图 IPC(takeSnapshot → PNG 垫进 DOM),属另一档复杂度,本版不做——已在 docs/embedding-contract.md §11 与代码注释中如实记录,不假装不存在。

升级提示

壳侧无需任何改动(复用既有 embed_chat_open / embed_chat_hide),插件单包即可生效。

v0.1.1 — 修复官方桌面端安装失败;浮层脱流不变量

Choose a tag to compare

@realguan realguan released this 14 Oct 08:56

修复

1. 官方桌面端安装失败(#1)

移除 prepare 构建钩子。pnpm 11 的供应链策略要求 git 托管的包在执行构建脚本前,必须在该 Profile 的 pnpm-workspace.yaml 中按「精确到 tarball(含 commit hash)」加入 allowBuilds;而 dist/ 本就随仓库提交,消费者侧不需要任何构建步骤。

实测(pnpm 11.7.0,与官方客户端同版本):github:realguan/dsh-deepseek-chat-embed#v0.1.1 与默认分支均可直接安装,无任何白名单要求;带 prepare 的 v0.1.0 则会命中该策略。

2. 浮层脱流不变量(2026-10-14 现场故障)

.dsce-overlay 的 position: fixed 原先只来自插件自己注入的 <style>;样式表先被 dispose 时,浮层退化成 <body> 末尾的普通块——壳文档被撑高、整页可滚,并留下一张挂在活 guest 上的 538x124 白卡。

  • 脱流不变量(position/z-index/display/overflow/box-sizing/background)写入行内样式,不再依赖可被移除的样式表;
  • 应用期与样式表清理时按 DOM 标记清扫残骸;
  • destroy() 先摘 DOM 再释放租约,释放失败只记日志,不拿页面布局陪葬;
  • 宿主离开视口即让位;补 scroll 捕获监听(rAF 节流、只测宿主一个盒子),避免逐帧跑文档级查询。

工程

  • 新增 --check 门禁:dist 与 src/client.js 不一致时 npm run check 直接失败且不写文件——删除 prepare 后没有人会在消费者侧重建 dist,没有这道门禁就会静默发出陈旧 bundle(正反两向已实测)。
  • 测试 81 → 89 项;README 更新安装说明、开发门禁与 FAQ。

安装

github:realguan/dsh-deepseek-chat-embed#v0.1.1

v0.1.0 及更早版本仍会命中 pnpm 构建脚本审批;若需继续使用旧版,请按 pnpm 报错提示把对应 key 加入 allowBuilds。