Skip to content

feat(injection): 统一面板宿主注入重构——含块层+几何写路径+chunk缓存+锚点弱化+桌面/移动适配 - #232

Merged
Menghuan1918 merged 17 commits into
mainfrom
feat/injection-unified-host
Aug 19, 2026
Merged

feat(injection): 统一面板宿主注入重构——含块层+几何写路径+chunk缓存+锚点弱化+桌面/移动适配#232
Menghuan1918 merged 17 commits into
mainfrom
feat/injection-unified-host

Conversation

@Menghuan1918

Copy link
Copy Markdown
Collaborator

背景

侧边栏面板注入的兼容性与性能专项(设计文档:docs/plans/2026-08-19-sidebar-injection-unified-host-design.md,路线 B/官方 issue 已按用户决策关闭,纯插件侧实现)。

改动(6 个提交,每步独立可验证)

  1. 挂载层Sidebar 渲染根包 [data-dsh-panel-host] 固定含块层(fixed inset-0 pointer-events:none z-40);面板/开关簇 fixed→absolute(层内视口坐标等价)——免疫桌面套壳中间层 transform 对 fixed 含块的劫持;挂载自检(页面级 transform → data-dsh-panel-host-degraded 降级 + rAF 视口同步);MutationObserver 守卫锚点被宿主清空时重挂。
  2. 几何层writeGeometry 统一拖拽/打开态推挤写路径;面板 contain: layout style;拖拽期 will-change: transform
  3. chunk 缓存revalidateChunksOnReactivate()——激活时 HEAD 每个已加载 chunk 对比 ETag,未变保留已解析 exports(跳过重注入/重执行),变更/不可达 fail-open 重取。
  4. 布局锚点nth-child(2)#root [data-dsh-frame] > [data-pane="conversation"](真实页面实证同元素);#root width: calc(100% - var) 与 margin 锁步过渡,根因吸收 fix(layout): 兼容 DSH Desktop 外壳,侧栏/底部面板不再遮挡会话 (#208) #226 桌面壳溢出(实测 1140+300=1440 无溢出)。
  5. 桌面/移动适配:新增 desktop-env.tsdsh-desktop-mode/platform URL 信号 + preload 标记);win32 advanced 自动启用标题栏兼容(32px overlay,手动 pref 可覆盖);visualViewport 键盘 inset;env(safe-area-inset-*)
  6. 测试与契约desktop-env.spec.ts 7 例、chunk 重验证 4 例;mount.e2e.ts 新增 data-dsh-panel-host 断言 + 桌面信号场景;AGENTS.md §8 契约同步。

验证

  • pnpm typecheck ✅ pnpm test 635 通过(含新增 11 例)✅
  • pnpm test:mount 真实挂载冒烟 3/3 通过(真 DSH + Chromium):drag-layout(拖拽 1:1 跟踪/过渡禁用)、mount 深扫(含新断言)、桌面信号场景
  • 真实页面探针:新锚点与旧 nth-child 命中同一元素;推挤无溢出;拖拽基线 40 帧均 8.36ms/p95 10.2ms

外部契约零变化

[data-dsh-better-sidebar] 锚点、--dsh-sidebar-width/height 变量、body 属性(data-dsh-sidebar-*/data-dsh-title-bar-compat)、ctx.betterSidebar 服务 API 全部不变。

本地 Node 24 跑 test:mount 需 node --expose-internals 启动 dsh CLI(HMR 服务要求;CI Node 22 无此问题,未改仓库脚本)。

- Sidebar 渲染根包 [data-dsh-panel-host](fixed inset-0 pointer-events:none)
- 面板/开关簇由 fixed 改 absolute(层内视口坐标等价),免疫套壳中间层 transform 劫持
- 挂载后一次性几何自检:页面级 transform 时降级 absolute + rAF 视口同步
- MutationObserver(body childList)守卫锚点被宿主清空时重挂
- 拖拽帧与打开态共用单一推挤写入器(--dsh-sidebar-width/height)
- .panel/.bottomPanel contain: layout style——内部重排不外泄
- 拖拽期(body[data-dsh-sidebar-dragging])才挂 will-change: transform
- 新增 revalidateChunksOnReactivate():激活时 HEAD 每个已加载 chunk 对比 ETag,
  未变保留内存缓存(跳过重注入/重执行),变更或不可达则 fail-open 重取
- 测试夹具与孤儿缓存条目不跨激活存活
- index.tsx 激活路径由 resetChunks() 改为 revalidateChunksOnReactivate()
- nth-child(2) → #root [data-dsh-frame] > [data-pane="conversation"](实证同元素)
- #root 宽度 calc(100% - var) 与 margin 同步过渡:web 视觉不变(实测 1140+300=1440 无溢出),
  Desktop 壳(#208)width:100% 的加性溢出根因消除
- 新增 desktop-env.ts:解析 dsh-desktop-mode/platform URL 信号与 preload 标记
- win32 advanced 壳自动启用 titleBarCompat(32px overlay),手动 pref 仍可覆盖
- visualViewport 键盘 inset:底部面板/窄屏抽屉键盘弹起时上移
- 面板与开关簇 safe-area-inset 适配(env() 桌面端为 0)
- 单测 7 例(含 URLSearchParams 前导 ? 剥除修复)
- 设计文档:路线 B 标记关闭、§8.1 改单 PR 步骤(含 commit 对照)、拖拽基线数据、实施偏差记录
- AGENTS.md §8:data-dsh-panel-host 含块层、推挤锚点契约(禁 nth-child)、桌面信号
- mount.e2e:data-dsh-panel-host 断言 + win32 advanced 桌面信号场景
@Menghuan1918

Copy link
Copy Markdown
Collaborator Author

@codex CR

@chatgpt-codex-connector

Copy link
Copy Markdown

Code Review

Findings

  • [P1] The degraded viewport correction removes itself as soon as it succeeds.
    When a transformed <html> or <body> offsets the panel host, sync() applies a compensating translation. On the next animation frame, the corrected rectangle satisfies the viewport checks, so the code removes both data-dsh-panel-host-degraded and the inline transform, then exits. The original ancestor-induced offset therefore immediately returns, leaving the panel misplaced—the exact condition this fallback is intended to handle. The correction should remain applied while the ancestor transform persists, or the uncorrected geometry should be measured independently before clearing degraded mode. src/client/index.tsxL151-L183

  • [P1] Chunk revalidation races with rendering and can expose stale exports after HMR.
    apply() starts revalidateChunksOnReactivate() without awaiting it, while mounting proceeds independently. During the pending HEAD requests, loadChunk() can still return the old promise from cache; a currently open lazy editor or terminal can therefore render stale exports before lines 265–268 invalidate them. React lazy consumers may then retain that resolved module even after the loader cache is cleared. Revalidation needs to become a barrier for chunk loads/mounting, or each cached entry needs a pending revalidation promise that loadChunk() awaits. The added tests await revalidation explicitly, so they do not cover the production call pattern. src/client/index.tsxL112-L118 src/client/chunk-loader.tsL245-L269

  • [P2] The visual-viewport inset overestimates keyboard occlusion when the viewport has a vertical offset.
    The obscured bottom area is innerHeight - (visualViewport.height + visualViewport.offsetTop), not simply innerHeight - visualViewport.height. During mobile viewport scrolling, zooming, or browser-chrome movement, offsetTop can be nonzero, causing the panels to be shifted too far upward. The hook also listens only for resize, although offsetTop may change through the visual viewport’s scroll event. src/client/Sidebar.tsxL144-L167

Verification

  • git diff --check 14ef8e4..b71b562
  • pnpm typecheck

No repository changes were made as part of this review, so no commit or follow-up pull request was created.

View task →

- P1 降级同步:按未修正几何判定(跟踪自身补偿量),祖先 transform 消失才退出循环——
  修正后矩形不再被误判为无需修正(自清除缺陷)
- P1 chunk 重验证成为 loadChunk 屏障:重验证挂起期间不提供缓存,杜绝 HMR 竞态陈旧 exports;
  测试夹具加载不再被误记为生产加载
- P2 键盘 inset:innerHeight - (vv.height + vv.offsetTop),并监听 scroll(offsetTop 变化)
- 新增屏障单测 1 例;设计文档偏差记录更新
@Menghuan1918

Copy link
Copy Markdown
Collaborator Author

已按 CR 修复三条 findings(commit 67b4f1d),验证全绿:

P1-1 降级同步自清除:sync 循环改为跟踪自身补偿量(applied),按未修正几何(rect − applied)判定——修正后的矩形不再被误判为「无需修正」;祖先 transform 真正消失才清除 degraded 并退出循环(期间 transform 未变化时不重复写样式)。

P1-2 chunk 重验证竞态revalidateChunksOnReactivate() 返回的 promise 现在是 loadChunk屏障——重验证挂起期间任何 chunk 加载先 await 再取缓存,杜绝「HEAD 未完成时渲染陈旧 exports」;测试夹具加载不再被误记为生产加载(tracking 移回任务内,用 cache 存在性判定)。新增屏障单测:重验证挂起时 loadChunk 不 resolve,释放后重新注入新 exports。

P2 键盘 inset 高估:公式改为 innerHeight − (vv.height + vv.offsetTop),并补监听 visualViewport 的 scroll 事件(offsetTop 变化路径)。

验证:pnpm typecheck ✅、pnpm test 636 通过 ✅、pnpm test:mount 真实挂载冒烟 3/3 通过(drag-layout / mount 深扫 / 桌面信号场景)。

- revalidateChunksOnReactivate 的 HEAD 与 recordEtag 均带
  AbortSignal.timeout(5s):路由挂起时 fail-open(drop + 重取),
  屏障不再可能无限期阻塞所有懒加载 chunk(CR #232 P1 修复的健壮性缺口)
- resetChunks 同步清 revalidation:重验证挂起期间重置后,
  loadChunk 不再等待已丢弃状态的孤儿任务(finally 身份判断 no-op)
- 单测 +2:HEAD 挂起超时 fail-open(fake AbortSignal.timeout 触发中止)、
  resetChunks 清屏障后 loadChunk 立即放行
- peer/devDependencies: 13 个 @deepseek-ai/* 从 ^0.1.0-rc.7 升至
  ^0.1.0-rc.8;删除随 rc.8 消失的 dsh-client-web-react / dsh-client-schema-form
  (无 rc.8 发布、rc.8 依赖树与壳 bundle 零引用、插件 src 零引用);
  cordis peer/devDep 同步升 ^4.0.0-rc.8
- 版本 0.13.1 -> 0.14.0(package.json / dsh.plugin.json /
  SIDEBAR_SERVICE_VERSION 三处同步)
- CHUNK_EXTERNALS / CLIENT_EXTERNALS / CLIENT_REQUIRE_ALLOWED 三处镜像
  同步删除两个死包(primitives/slots 仍是 rc.8 壳静态模块表种子,保留)
- CI 挂载冒烟钉版 @deepseek-ai/dsh@0.1.0-rc.7 -> rc.8
- pnpm clean --lockfile 全量重解析:lockfile 内 @deepseek-ai/* rc.7 残留
  清零(传递链同升 rc.8,杜绝 #206 式混用树);pnpm-workspace.yaml
  minimumReleaseAgeExclude 按 #207 模式整体换为 rc.8 列表
- 文档同步:README 安装说明、AGENTS.md CI 钉版、外部插件指南与设计文档
  cordis 示例、issue 模板版本示例
- SIDEBAR_PREFS_DEFAULTS 与 host PrefsSchema 的 editorExplorer 默认
  true -> false:新会话树点击/打开文件按 path 新开 tab,无路径窗口即
  纯资源管理器;合并模式保留为可选手动开启(持久化过的用户设置不受影响)
- 测试同步:prefs.spec 默认断言翻转、plugin-shape.spec 与 smoke.spec
  默认对象翻转;editor-host 合并模式用例显式开启 editorExplorer(split
  用例本已显式);side-card-section-rows 的 select 行用例固定选中 Merged
- e2e 重写:mount.e2e 文件打开流程从 in-place 断言改为独立模式
  (新开 hello.txt tab、Files home tab 保留),文件头注释同步
- 契约文档同步:AGENTS.md §3.4 editor 行默认描述翻转 + CI 冒烟描述、
  README/README_EN v0.13.0 特性描述 + v0.14.0 changelog
rc.8 不再暴露 window.__DSH_MODULES__ 页面全局(改由 ctx.modules 服务
提供),chunk 外部依赖解析全面失效(terminal/editor/mermaid 全部
"client module system unavailable")。修复:

- src/client/index.tsx: inject 增加 'modules'(Cordis 服务访问守卫,
  此前直接读 ctx.modules 抛 "cannot get property modules without
  inject");apply() 激活时 setChunkModuleSystem(ctx.modules)
- package.json dsh.client.inject 增加 @deepseek-ai/dsh-client-modules
- chunk-loader: 注入写插件自有页面全局 __dshSidebarModuleSystem__——
  懒加载 chunk bundle 各自内联一份 loader(rc.7 靠官方全局回退工作,
  rc.8 全局消失后副本注入变量恒空);moduleSystem() 按
  注入变量 → 插件全局 → rc.7 全局回退解析
- context-types: Context 镜像补 modules 服务声明(client half)
- e2e: assertNoCrash 失败时输出错误条文本;独立模式断言修正
  (Files 数量按存在性、mermaid 流程先切回 Files、md 预览 locator 去掉
  重复的 [data-dsh-better-sidebar] 嵌套)

验证:typecheck / 639 测试全绿;本地 rc.8 CLI + Chromium 挂载冒烟 3/3
通过(drag-layout、mount 深扫含 editor/mermaid chunk、桌面信号)
@Menghuan1918

Copy link
Copy Markdown
Collaborator Author

审查补充:CR 三条修复核验 + 本轮新增(rc.8 适配 / P2 修复 / 默认独立)

一、远端 CR 三条 findings 核验(67b4f1d)——全部修复正确,无遗留 P1

  • P1-1 降级同步自清除:正确。applied 补偿量跟踪 + 按未修正几何(rect.left − applied)判定,清除条件对 translate/scale/rotate 类仿射祖先变换等价于「变换消失」;递推有界 ±0.5px 无累积漂移;8px/1px 滞回合理。
  • P1-2 chunk 重验证竞态:正确。屏障同步赋值、入口同步检查后 await,无竞态窗口;任务永不 reject、finally 身份判断,无死锁;cache.get 守卫正确处理中途 sweep。
  • P2 键盘 inset:正确。innerHeight − (vv.height + vv.offsetTop) 几何正确,scroll 监听已补。

二、本轮新增提交(4 个,全部在本地验证通过)

  1. fix(chunks):屏障 HEAD 加 AbortSignal.timeout(5s) 超时兜底(路由挂起时 fail-open 重取,屏障不再可能无限期阻塞懒加载);resetChunks 清挂起的 revalidation 屏障;单测 +2。
  2. fix(deps):@deepseek-ai/* 13 包 peer/devDeps 全部升 ^0.1.0-rc.8pnpm clean --lockfile 全量重解析,lockfile 零 rc.7 残留——杜绝 [兼容性] 主框架升至 dsh 0.1.0-rc.7 后,rc.6 peer 依赖导致选模型/发消息报 unscoped context #206 式混用树);cordis^4.0.0-rc.8;移除 rc.8 消失的 dsh-client-web-react / dsh-client-schema-form(rc.8 依赖树/壳 bundle 零引用,插件 src 零引用,仅 external 列表死条目);CHUNK_EXTERNALS / CLIENT_EXTERNALS / CLIENT_REQUIRE_ALLOWED 三处镜像同步;CI 挂载冒烟钉版 rc.8;pnpm-workspace.yaml minimumReleaseAgeExclude 按 fix(deps): 对齐 DSH 0.1.0-rc.7 peer 依赖,修复混用树 unscoped context #207 模式换为 rc.8 列表;版本 0.13.1 → 0.14.0(package.json / dsh.plugin.json / service.ts 同步)。
  3. feat(prefs)editorExplorer 默认独立(关)——prefs-shared.ts / config.ts 默认翻转;prefs/plugin-shape/smoke/editor-host/side-card 测试同步;mount.e2e 文件打开流程重写为独立模式断言;AGENTS.md §3.4 与 README 契约同步。
  4. fix(client)rc.8 模块系统迁移(挂载冒烟抓出的运行时破坏点)——rc.8 不再暴露 window.__DSH_MODULES__ 全局(改由 ctx.modules 服务提供),chunk 外部依赖解析全部失效。修复:client inject 增加 'modules' + dsh.client.inject 增加 @deepseek-ai/dsh-client-modules(Cordis 服务访问守卫要求);setChunkModuleSystem(ctx.modules) 注入;注入同步写插件自有全局 __dshSidebarModuleSystem__(懒加载 chunk bundle 各自内联一份 loader 副本,rc.7 靠官方全局回退工作,rc.8 全局消失后副本注入变量恒空——这是 mermaid 等 chunk 失败的直接原因);moduleSystem() 按 注入变量 → 插件全局 → rc.7 全局 三级解析。

验证pnpm typecheck ✅ / pnpm test 639 全绿 ✅ / pnpm build + pnpm check:consumer-types ✅ / 本地 rc.8 CLI + Chromium 挂载冒烟 3/3 通过(drag-layout、mount 深扫含 editor + mermaid chunk、桌面信号场景)。CI plugin-mount job 为权威门禁(Node 22 无需 --expose-internals)。

三、后续建议(非阻塞,可单独跟进)

  1. titleBarCompat 语义与文档矛盾(Sidebar.tsx ~L220):win32 advanced 下 titleBarCompat || 使手动 pref 无法关闭(设置开关变 no-op),与 prefs-shared.ts「Off by default」及 AGENTS.md §8.1「手动 pref 可覆盖」不符。建议 pref 三态(auto/on/off)或文档改为「auto 为下限、手动只叠加」。
  2. #root width calc 桌面壳未实测(layout.css):依赖级联胜过桌面壳自身 width: 100%,实测只在 web 环境。建议在 DSH Desktop 壳验证一次并记录,或提高特异性兜底。
  3. 降级自检 one-shot + React 18 异步提交(index.tsx ~L160):首帧 rAF 早于 React commit 时 layer 缺失会永久错过检测,建议 layer 缺失重试数帧;「仅挂载时检测一次」建议写入文档。
  4. 测试缺口:降级同步循环与键盘 inset 无自动化测试(设计文档 §8.1 承诺未交付)。

四、疑问点

  1. 在途加载跨 HMR 边界残余竞态(chunk-loader):屏障只护缓存读,入口检查时已在途的 script 加载完成仍会交付旧 exports——窗口极窄,建议注释说明。
  2. guardAnchor 无退避/去抖:壳若反复移除/重建 body 内容会立即塞回 host,可能与壳流程拉扯。
  3. 降级循环逐帧 getBoundingClientRect(强制 layout),与设计文档「观察器均为一次性廉价检查」表述不符。
  4. 67b4f1d 提交信息「测试夹具不再被误记为生产加载」措辞不实(夹具路径本就在追踪代码之前 return);真实新增是屏障 + 中途 sweep 守卫。

- SidebarPrefs 新增 terminalShell / terminalShellArgs(默认空 = 保持
  yaml config.shell → $SHELL / 登录 shell / powershell.exe 的既有解析)
- 终端卡齿轮二级页面新增两行 text 配置(与字体行同列)
- host 侧生效链路:UI 终端 WS 打开与 agent terminal_create 均读取
  设置文档覆盖(ptyManager.open / AgentPtyRegistry.create 增加可选
  shell 覆盖参数;shellOverridesOf 解析设置文档);设置页写入即时
  影响之后打开的终端(既有 pty 保持原 shell)
- locales zh/en 文案;parsePrefs 校验新字段;测试同步
- 设置页 intro 下新增身份徽标:名称 + v{service.version}(服务实例
  版本,与 package.json 由 tests/service.spec.ts 保持同步)
- token 驱动样式(--dsw-alias-*),名称/版本 pill 布局
快速释放(浏览器合并/丢失 pointermove 突发,超快速 flick 甚至可能
完全无 move)时的回退问题:
- pointerup 优先采用最后一次已知拖动值(rAF pending),而非 up 位置
  (事件合并时可能等于按下位置)
- pointercancel / lostpointercapture 中断时同样提交最后已知位置;
  无 move 时用中断事件自身的坐标计算(clamp 后提交)——只有真正
  未产生位移的拖动才回滚
- commitDrag 统一 flush + 同值提交 + 立即重测中心列(消除提交后
  React 用旧 centerRect 覆盖底栏 right 的中间帧)

HMR 重激活后底栏空白(输入框被推挤上移、强制刷新恢复):
- 根因:新组件实例重跑 locate 时壳的 centerCol 尚未就绪,而壳重建
  复用 #root 子节点(childList 观察器不触发)→ centerRect 卡 {0,0}
  → 底栏 visibility:hidden 永久空白
- 修复:额外观察 <html> 的 style 属性(layout push 写回 --dsh-sidebar-*
  时重定位重测);底栏打开时 effect 重跑 locate/measure 兜底
- 底栏未测量时由「不渲染」改为 visibility:hidden(渲染链不被几何
  门控,jsdom 测试不回归)

e2e 新增:极快拖动(单 move 立即 up)提交拖动位置、稳定后不回退
- PluginListBody 顶部加实时搜索框(按名称/id/描述过滤,空结果提示)
- PluginEntry 增加可选 category 分组字段(i18n 友好),目录条目按组
  渲染(未分类条目保持平铺);数量徽标跟随过滤结果
- 条目列表 max-height + overflow-y 独立滚动,插件多时弹窗不再无限
  增长;渲染数量由搜索天然收敛
- locales zh/en(搜索占位、无匹配);测试文件固定英文环境
  (vitest 4.1.11+ jsdom 跟随系统 locale,本机 zh-CN 导致英文文案
  断言漂移)
pnpm 11.8.0 起对 lockfile 既有条目强制 minimumReleaseAge 校验,
且精确 exclude(@scope/pkg@version)对带 peer 依赖后缀的解析条目
匹配失效(44 条误报违规,CI 全红)。@deepseek-ai/* scope 为官方
可信 scope,minimumReleaseAgeExclude 改为 '@deepseek-ai/*' 通配
(保留 rc.1 历史与 stable 条目);通配经实测通过全部 504 条校验。
新增条目:终端 shell/shellArgs 设置页配置、设置页版本徽标、
添加插件目录搜索/分组/滚动、rc.8 模块系统迁移、拖拽健壮性修复;
版本说明块醒目声明本版适配 DSH 0.1.0-rc.8(rc.7 及更早无法解析依赖)
@Menghuan1918

Copy link
Copy Markdown
Collaborator Author

补充:v0.14.0 最终内容(4 项优化 + 两个已知问题)

在之前内容基础上,本分支新增(本地全部验证:typecheck ✅ / 639 测试 ✅ / 本地 rc.8 挂载冒烟 ✅ / 已装本地 web):

  1. feat(settings):终端 shell/shellArgs 设置页可配(UI 终端与 agent terminal_create 对之后打开的终端生效);侧边卡片设置页加 DSH-better-sidebar v0.14.0 版本徽标。
  2. feat(plugins):添加插件目录支持实时搜索 / category 分组 / 独立滚动(为插件生态增长做准备)。
  3. fix(drag):快速释放提交最后已知拖动位置(up / pointercancel / lost-pointercapture 三路兜底,e2e 新增极快拖动用例);HMR 重激活后中心列重定位兜底(<html> style 观察 + 底栏打开重测)。
  4. chore(deps):pnpm 11.8 supply-chain 校验适配(精确 exclude 对 peer 变体条目失效的 bug,@deepseek-ai/* scope 通配)。

已知问题(已单独提 issue,不阻塞本版发版)

发版说明

  • 版本 0.14.0,明确适配 DSH 0.1.0-rc.8(README changelog 已特别声明:rc.7 及更早无法解析本版依赖)。
  • 自 v0.13.1 全部更改已写入 README/README_EN changelog(注入重构、rc.8 适配+模块系统迁移、editorExplorer 默认独立、终端 shell 设置、版本徽标、插件目录搜索、chunk 屏障超时、拖拽健壮性)。

LiarCoder pushed a commit to LiarCoder/DSH-better-sidebar that referenced this pull request Sep 3, 2026
peer 基线已是 ^0.1.2-rc.1(全部 dsh-* peer),最后提供
window.__DSH_MODULES__ 页面全局的宿主是 0.1.0-rc.7,远低于下限,
装不上本插件——回退在受支持宿主上不可达。受支持宿主上 apply() 在
任何懒加载发生前调 setChunkModuleSystem(ctx.modules),moduleSystem()
前两跳(注入变量 + 插件全局 __dshSidebarModuleSystem__)必中。

回退的唯一活消费者是 vitest fixture:installModuleSystem() 原先经
rc.7 全局投递 fake 模块系统,现改为与生产同路径的 setChunkModuleSystem
注入;无任何专测回退分支的用例,全部断言保持不变。

- chunk-loader.ts: 删 moduleSystem() 第三跳,同步头注 /
  ChunkModuleSystem 接口注中的回退描述
- index.tsx: 删「falls back to the rc.7 global」注释
- README v0.14.0 changelog 与 docs/plans 设计文档中的提及属历史
  存档(描述 PR omdsh-dev#232 当时的迁移),保留不改

验证:lint / typecheck / build / vitest 119 文件 1243 用例全绿;
真机挂载 lane(钉版 @deepseek-ai/dsh@0.1.2-rc.1 CLI)mount.e2e
全内置 tab sweep(含终端 / editor 懒加载 chunk)通过;lib/*.js
产物中无 __DSH_MODULES__ 残留。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant