dsh-vscode-mode 0.25.1 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +25 -11
  2. package/lib/client.js +1969 -1344
  3. package/lib/client.js.map +2 -2
  4. package/lib/index.js +1443 -716
  5. package/lib/index.js.map +1 -1
  6. package/package.json +1 -1
  7. package/src/client/compatSummary.ts +4 -0
  8. package/src/client/contextMenusOfficial.ts +80 -0
  9. package/src/client/forgeBridge.ts +28 -0
  10. package/src/client/index.ts +18 -3
  11. package/src/client/monaco/lsp/lspClient.ts +25 -7
  12. package/src/client/officialSidebar.ts +15 -3
  13. package/src/client/reviewBar.ts +3 -0
  14. package/src/client/reviewBatch.ts +9 -1
  15. package/src/client/reviewKeepAll.ts +72 -0
  16. package/src/client/sidebar/menuItems.ts +6 -0
  17. package/src/client/sidebar/panels/FileExplorer.ts +26 -1
  18. package/src/client/sidebar/types.ts +3 -0
  19. package/src/client/state/diffSummary.ts +34 -7
  20. package/src/client/state/recordsFeed.ts +40 -3
  21. package/src/client/state/reviewFeed.ts +9 -2
  22. package/src/client/tabMenu.ts +5 -0
  23. package/src/client/ui/ClaimRouter.ts +11 -5
  24. package/src/client/ui/EditorPane.ts +9 -1
  25. package/src/client/ui/EditorView.ts +164 -39
  26. package/src/client/ui/OfficialSideTab.ts +13 -5
  27. package/src/client/ui/ReviewAllConfirm.ts +1 -1
  28. package/src/index.ts +1 -1
  29. package/src/pending/capture.ts +96 -47
  30. package/src/pending/persist.ts +94 -5
  31. package/src/pending/store.ts +171 -58
  32. package/src/pendingCompat.ts +72 -9
  33. package/src/pendingRpc.ts +10 -10
  34. package/src/reviewCapture.ts +64 -23
  35. package/src/reviewDb.ts +119 -8
  36. package/src/reviewEvidence.ts +1 -1
  37. package/src/reviewRpc.ts +115 -9
  38. package/src/rpc.ts +14 -10
  39. package/src/shared/review.ts +21 -0
  40. package/src/shared/rpc.ts +3 -1
  41. package/src/store.ts +44 -0
  42. package/src/toolTargets.ts +63 -0
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  ![同屏工作台:中央 AI 对话、右侧 Monaco 编辑器与底部差异操作条](docs/screenshots/workbench.png)
12
12
 
13
13
  - 📝 **同屏编辑**:DSH 0.1.5+ 官方右侧 Sidebar,AI 对话与文件编辑同屏
14
- - 🔍 **差异审查**:Keep / Undo / 回滚 / 归档,状态持久化重启不丢
14
+ - 🔍 **差异审查**:Keep / Undo / 回滚 / 归档,状态持久化重启不丢。同工作区内所有对话共享待审列表、统计与决定,来源对话仅用于追溯;不同工作区隔离。当前页操作后刷新,其他已打开页面通过约 5 秒轮询同步(后台页面恢复可见后刷新)。写操作仍要求本端活跃会话和原有权限。
15
15
  - 🧠 **LSP 智能**:转到定义 / 查找引用 / Peek 多结果选择 / 智能补全(注释索引)/ 签名帮助
16
16
  - 🐞 **断点调试**:DAP 桥通用化,行内断点、`.dsh/launch.json`、四段调试面板
17
17
  - ⌨️ **命令面板**:`Ctrl+Shift+P`,19 条命令开箱即用,可编程扩展
@@ -198,14 +198,23 @@ Host 优先采集官方 `workspaceChanges` 的轮次净差异;旧版逐工具
198
198
  身份(转为 `'file'`),此后再 Revert 是写回而不是删除。
199
199
  - **判定粒度**:块、行区间、文件、全部。**Keep 只推进投影、零写盘**;Revert 才写回文件,
200
200
  新建条目整条 Revert 等于删除该文件。块身份由当前差异现场推导,不依赖落库状态。
201
- - **判定安全**:Revert 走 `replaceIfVersion` 版本守卫并写后读回;内容与投影不一致、
201
+ - **判定安全**:Revert 先按 `stat → read → stat` 确认内容和版本一致,再走
202
+ `replaceIfVersion` 并写后读回;缺失重建使用 `createIfAbsent`。新建文件回退通过
203
+ provider `deleteFile` 传递版本、取消信号和会话沙箱策略,旧 Host 缺能力时安全拒绝,
204
+ 不回落宿主直删。读回失败不按缺失处理、不提交决定。内容与投影不一致、
202
205
  条目已解决、行区间歧义时拒绝并给出原因码(`revision-mismatch` / `diverged` /
203
206
  `settled` / `unknown-block` / `no-block` / `ambiguous-block`)。
204
207
  - **撤销/重做**:判定入 `pending_history`(游标模型,撤销后重做回到同一状态),
205
208
  幂等由 `operationId` 保证;决策栈跨重启保留(上游只在面板打开期间保留)。
206
- - **差异来源**:`edit` / `write` 结果自带 before/after 直接采集;`str_replace_editor`
207
- 结果只有成功消息,靠 `fs/edit-intent`、`fs/write-intent` 在写前取预像、`fs/observed`
208
- 在写后取终像配对。可另外从版本库导入基线改动(git / svn / Perforce)。
209
+ - **差异来源**:对 `edit` / `write` / `str_replace_editor` 环绕工具执行读取真实前后字节;
210
+ `apply_patch` 通过可选官方解析器枚举全部源/移动目标,再逐目标独立取证。结果中的
211
+ `before:null` 不作为新建依据;部分成功只记录实际观测到的变化,unknown/畸形结果提供诊断。
212
+ 缺少 raw byte 能力、二进制、无可信基线或超限时不伪造可撤记录。UTF-8 BOM 和行尾按字节保留。
213
+ 可另外从版本库导入基线改动(git / svn / Perforce)。
214
+ - **采集诊断**:进程内按工作区最多 50 条、全局最多 500 条;会话/插件释放后清理,Host 重启不保留。
215
+ 它不替代官方持久化采集完整性记录,也不绕过写回内容和 provider 原子版本守卫。
216
+ - **采集作用域**:写前冻结当前 `workingDirectory`、provider 与目标;写后读回完成才释放
217
+ 同目标占用,卸载后不上报。只修正新采集,不自动搬迁历史目录归属错误的记录。
209
218
  - **外部改动**:已入列路径被外部改写时,新内容被吸收为最新待审内容并标记分歧,
210
219
  基线保持不动;文件缺失/读不到时条目转为 `missing`,不再参与写回。
211
220
  - **判定入口**:差异直接画在编辑器里,块级 Keep/Undo 用行内药丸;文件级 Keep/Undo
@@ -217,11 +226,11 @@ Host 优先采集官方 `workspaceChanges` 的轮次净差异;旧版逐工具
217
226
  |---|---|---|---|
218
227
  | 条目键 | 全局裸路径 | 工作区 + 路径 | 多工作区同名文件不能互相覆盖 |
219
228
  | 文本存储 | 内存/全量 JSON | SQLite,有大小上限 | 大文件不拖垮 Host,超大只按时间戳比较 |
220
- | Revert 写回 | 无条件写 | 版本守卫 + 写后读回 | provider 不具备跨进程原子 CAS |
229
+ | Revert 写回 | 无条件写 | 稳定快照 + provider 版本守卫 + 写后读回 | 原子守卫依赖 provider 契约,缺版本拒绝写入 |
221
230
  | 撤销栈 | 仅面板打开期间 | 持久化到 SQLite | 重启后仍可撤销上次决定 |
222
231
  | 界面 | 自带整套 UI | 复用现有面板 | 保留本插件视觉与交互 |
223
232
  | Perforce | 支持 | 支持,但只有假 shell 单测 | 本机无 p4 客户端,无法真机验证 |
224
- | 新建文件 Revert | 删除文件 | 删除文件(直接 `unlink`) | fs 抽象没有删除动作,已限制在工作区内 |
233
+ | 新建文件 Revert | 删除文件 | provider 受控删除,内容与版本双检查 | 继承沙箱策略;旧 Host 缺删除能力时拒绝 |
225
234
 
226
235
  数据与迁移:新增 `pending_*` 表,`SCHEMA_VERSION` 递增并用 `PRAGMA table_info` 判缺列后
227
236
  `ALTER TABLE`,既有 `review_*` 事实表一概不动;首次改动前写 `.before-pending.bak` 备份;
@@ -578,13 +587,13 @@ profile 请替换为实际目标,不要把示例目录当成当前运行 profi
578
587
 
579
588
  ```bash
580
589
  # ① Git 安装(clone + prepare 构建;推荐打固定 tag)
581
- dsh plugin --profile web add github:Lenonss/DSH_VsCodeMode#v0.25.1
590
+ dsh plugin --profile web add github:Lenonss/DSH_VsCodeMode#v0.27.0
582
591
 
583
592
  # ② npm 注册表(发布到 npm 后)
584
- dsh plugin --profile web add dsh-vscode-mode@0.25.1
593
+ dsh plugin --profile web add dsh-vscode-mode@0.27.0
585
594
 
586
595
  # ③ GitHub Release tgz 直装(Release asset 可用后)
587
- dsh plugin --profile web add https://github.com/Lenonss/DSH_VsCodeMode/releases/download/v0.25.1/dsh-vscode-mode-0.25.1.tgz
596
+ dsh plugin --profile web add https://github.com/Lenonss/DSH_VsCodeMode/releases/download/v0.27.0/dsh-vscode-mode-0.27.0.tgz
588
597
  ```
589
598
 
590
599
  > **DSH 版本政策(0.17.0 起)**:六项 DSH peer 仍统一声明为 `*`,另以
@@ -964,6 +973,8 @@ Keep All / Undo All 却是亮的。修复:单文件 Keep / Undo 覆盖冲突
964
973
 
965
974
  | 版本 | 要点 |
966
975
  | --- | --- |
976
+ | v0.27.0 | DSH alpha.3 官方菜单/Forge 导航/设置图标与能力诊断;多目标 patch 字节采集;回滚版本与会话策略守卫;工作区共享差异基线;隐藏轮询门控与导航隔离 |
977
+ | v0.26.0 | Keep All 改为单次批量(不再因单条过期/冷端条目整批中止,2N+1 次往返降到 2 次);差异审查旧通道遗留清理:待审接管的旧记录自动结案、守卫改会话作用域、失败原因不再被通用文案吞掉 |
967
978
  | v0.25.1 | 下载到本机支持选择保存文件夹(目录选择器),按工作区相对路径写入 |
968
979
  | v0.25.0 | 资源管理器右键「下载到本机」:远程访问时把工作区文件拉回浏览器所在机器 |
969
980
  | v0.24.0 | 经第三方远程访问插件时,文件管理器与 Monaco 恢复可用;加载失败提示按状态区分 |
@@ -975,8 +986,11 @@ Keep All / Undo All 却是亮的。修复:单文件 Keep / Undo 覆盖冲突
975
986
  | v0.23.0 | 快捷菜单:可拖动悬浮按钮 + 自定义菜单树 |
976
987
 
977
988
  <details>
978
- <summary>完整版本记录(v0.25.1 → v0.1.5x,点击展开)</summary>
989
+ <summary>完整版本记录(v0.27.0 → v0.1.5x,点击展开)</summary>
979
990
 
991
+ - **v0.27.0**:接入 DSH 0.2.2-alpha.3 官方共享菜单(树/页签、键盘入口、陈旧目标守卫、旧 Host 回退)、Forge 面板/本地变更导航(缺能力隐藏,不接管 PR 快照)、设置图标与能力诊断;apply_patch 多目标采集采用独立原始字节前后像,保留 BOM/行尾,不把结果 before:null 当作文件缺失。回滚使用 provider 原子版本与内容守卫,删除无直接文件系统兜底,修复累计待审入口漏传会话沙箱策略;差异按工作区共享基线及接管登记。展示轮询隐藏门控与单飞合并,LSP 旧会话结果隔离,导航补列及 owner/session 守卫。实机 write/edit → GUI Undo → 磁盘读回已通过。**已知缺口**:Undo 后当前已结算文件可能仍显示“待审”和超出总数的序号;真实 apply_patch 工具、Forge 已启用环境、真实后台请求与多会话完整矩阵尚未实测。缺口经维护者接受发布;不宣称完整端到端验收或 Console 零错误。
992
+
993
+ - **v0.26.0**:Keep All 从「逐条预检 + 逐条决策」改为**一次批量**,并且不再被单条基线问题整批阻断。原因有两层:一是往返次数与数据量——原实现先取一次快照,再为每条待审记录调一次 `edrv.review.detail`(每条带完整 diff 过桥)与一次 `edrv.review.decide`,一次 Keep All 等于 `2N + 1` 次 RPC;待审投影侧每条 detail/decide 内部又先 `loadEntries(cwd)` 把整表 old_text/new_text 全文读进内存再线性查找,N 条即 O(N²) 全文读。二是「一票否决」——预检期任一条处于冷端(会话在另一端活跃)、revision/seq 漂移、`settled`、`oversized`、有尚待核对的 Undo,或执行期任一条 decide 失败,整批立刻中止、其余一条不动。现新增宿主 RPC `edrv.review.keepAll`(只做 Keep):一次 `BEGIN IMMEDIATE` 内逐条 CAS,写入条件取**库内当前 revision**而非客户端快照值,因此快照漂移不再等于失败;`operationId = sha256(batchId|id|seq)` 保证同批重放幂等;不能保留的条目(冷端待审、已结案、`prepared` Undo、超限文本)只写进 `skipped` 并附原因,段级异常只写 `result.error`,另一段照常完成;超过 2000 条与原分页上限一致地拒绝。待审投影侧新增 `store.keepAll`:一次 `loadEntries` + 逐条 `decide`(Keep 零写盘)+ `persist.saveDecisions` 单事务带 revision CAS 落库,落库冲突只把该条移入 skipped;`saveEntry`/`saveBlocks`/`pushHistory` 抽出 `upsertEntry`/`writeBlocks`/`insertHistory` 共用,单条路径行为不变。客户端新增 `src/client/reviewKeepAll.ts`:guard → 快照(校验失败自动重试一次,自愈分页漂移)→ 一次批量 → 再 guard,正常仅 **2 次 RPC**。界面:状态栏「Keep All:已保留 X / Y,跳过 Z 条」,跳过明细用轻提示列前 3 条(`display:原因`)并汇总余量,跳过不算错误、条目仍留在列表可逐条处理;确认弹窗补一句跳过说明并保留「不改写文件」语义。**Undo All 完全不变**(仍逐条预检能力、遇冲突立即停止、精确报告已完成项),因为它会改写磁盘。验证:typecheck 0 error;定向单测 8 文件 67 例全过(`reviewKeepAll` 新增 7、`reviewDb` 12、`pendingStore` 20、`reviewRpc` 10 及 `reviewBatch`/`reviewAllConfirm`/`reviewFeed`/`reviewFlow`);新用例覆盖一次快照+一次批量、漂移重试一次、guard 先于快照、过期 revision 仍接受、同批重放幂等、`prepared` Undo 只挡自己、冷端官方照常完成而待审只 skip、空列表与超 2000 条拒绝。同版另一组修复针对差异审查的旧通道遗留问题(用户实报「Keep 了为什么还要被拦」与「1 处差异处理失败」):①被待审累计基线接管的路径,其旧 sidecar 记录由 host 自动结案(`retireCovered`,归档原因「已由待审累计基线接管,旧工具记录不再单独决策」),编辑器与差异列表不再渲染这些「看得见、点不动」的旧 hunk;②`legacyBlocked` 守卫改为**会话作用域**——只有本会话可见的待审接管才拦旧写入口,别的会话持有接管时本会话放行,消除「拦得住、看不见」的死锁;③客户端不再用「1 处差异处理失败(可能已被后续修改影响)」覆盖 host 真实原因,按 `error` 原样展示,会话未激活时改为「Keep/Undo 没有执行(记录未改动),在会话里发一条消息激活后重试」;④「历史改动」通道 Keep 成功后的状态文案改为「已标记为看过(未改动文件)」。覆盖登记同步改为按会话登记 + 整集重建(`trackPendingCover(cwd,path,covered,sessionId?)`/`setPendingCovers`/`pendingCovers(cwd,path,sessionId?)`),旧 2 参调用仍走工作区集合。验证:typecheck 0 error、全量 293 文件 3754 通过 + 22 跳过(`tests/dapFakeAdapter` 首发抖动,隔离重跑 7/7 绿)、build 四 bundle 通过;现场验收:live 会话下 `edrv.accept` 与 `edrv.decideBatch` 对受管路径返回守卫文案且零写盘、重启后自动结案已产生 895 批次 / 1096 条归档、被接管文件在差异栏只剩「待审」徽标而无「历史改动」。GUI 点按验收需重启 DSH 部署本版,本次未做;真实大工作区耗时未实测,速度结论来自 RPC 次数与数据层复杂度。见 [0.26.0 发布说明](docs/release-0.26.0.md)。
980
994
  - **v0.25.1**:下载到本机支持选择保存位置——点「下载」先弹系统目录选择器(File System Access API:Chrome/Edge、https 或 localhost 安全上下文),选一次目标文件夹后,文件按**工作区相对路径**逐个写入(文件夹下载自动建子目录,仍不打包)。用户取消选择则整批中止并提示「已取消下载」;Firefox/Safari、局域网 http、或目录写入权限被拒时自动回落浏览器默认下载目录,并分别提示具体原因,不静默改语义。确认框底栏按钮改为「选择位置并下载 N 个文件」并加一行说明;选择器在用户手势的同步栈内触发,不依赖额外点击。验证:typecheck 0 error;全量 288 文件、3733 通过 + 22 跳过;build 四 bundle 通过;本机冒烟覆盖 4 条分支(取消 / 拒绝授权回落 / 选中目录按 `tests/officialBackfill.test.ts` 相对路径写 4328 B / 文件夹流程写 `.codegraph/.gitignore` 229 B)。见 [0.25.1 发布说明](docs/release-0.25.1.md)。
981
995
  - **v0.25.0**:新增远程下载——经远程访问插件打开 DSH 时,工作区文件原本只能到远端机器上自己下载再传回,现在资源管理器右键菜单新增「下载到本机」(仅远程访问页可见,本机回环不出现):文件右键直接下载原文件;文件夹与根空白区弹出确认框,按需懒加载展开目录树、逐级勾选文件后逐个下载原文件(不打包)。取字节复用既有链路(`edrv.readBinary` 二进制直出,远程代理剥掉 `x-edrv-*` 时自动回落 `edrv.read` 的 base64 分支),点选的文件名与远端一致,超过 32MB 的文件在弹窗内标明并禁用、不静默失败;确认框复用 `ModalShell`(自动满足 `data-edrv-view` 浮层契约与 z-index 阶梯),目录整行可展开、点文件名也能勾选、加载失败行带重试。可见性判据与 v0.24.0 的远程通道同源(`src/shared/remoteChannel.ts` 新增 `isRemoteChannel()`,即 `channelPrefix()` 非空),非远程页面完全不出现该条目、打开菜单也不发请求。不新增 host 路由、不改鉴权、不动既有导出实现。验证:typecheck 0 error;全量 287 文件、3715 通过 + 22 跳过;`node --test tests/nativeOpen.test.mjs` 9/9;build 四 bundle 通过;本机 GUI 注入远程座位后冒烟:菜单出现且位置正确、单文件下载落盘名正确、根/文件夹弹窗展开 105 行、单选 1 / 全选已展开 82 / 清空 0、勾选 2 个文件逐个下载成功(`edrv.readBinary` ×2),干净刷新后控制台无新增报错;**真实远程设备(真插件 + 真配对)未验收,缺口保留**。见 [0.25.0 发布说明](docs/release-0.25.0.md)。
982
996