dsh-vscode-mode 0.23.0 → 0.23.1
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.
- package/README.md +5 -3
- package/lib/client.js +17 -23
- package/lib/client.js.map +2 -2
- package/lib/index.js +42 -0
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/src/client/reviewBatch.ts +17 -21
- package/src/client/ui/EditorView.ts +5 -1
- package/src/reviewRpc.ts +40 -0
- package/src/shared/rpc.ts +1 -1
package/README.md
CHANGED
|
@@ -521,6 +521,7 @@ DSH 每次启动监听随机端口,`http://127.0.0.1:<port>` 就是浏览器 o
|
|
|
521
521
|
|
|
522
522
|
官方 `dsh plugin` 方式,三选一。下面以 `web` profile 为例;Desktop 或其他命名
|
|
523
523
|
profile 请替换为实际目标,不要把示例目录当成当前运行 profile。升级前可阅读
|
|
524
|
+
**v0.23.1** 修复「Keep All / Undo All」在工作区待审超过一页时必定中止:批量按钮原先复用官方审查的分页接口逐页取待审条目,并把每页返回的展示用计数当成全量总数校验,因此官方待审超过 50 条(本仓库常态约 150 条)时会先报「待审记录在分页期间变化」或最终报「待审记录数量不完整」,实际一条都不会被决策(已完成 0 项)。现在批量操作改走一次性完整快照——`edrv.review.list` 新增 `all: true` 参数,服务端循环分页取全官方待审行,与工作区历史改动投影按路径去重后返回 `nextCursor: null` 与真实总数(`pending`),客户端单次取快照、校验条目唯一且仍为待审后才逐项决策;快照总量超过 2000 条时明确拒绝并提示分批处理,条目在决策途中变化则继续整批中止、不做部分写入。差异栏的日常浏览仍走原分页接口,展示行为不变。本版修复只经单测与真实审查库只读核对,未在重启后的 GUI 上点按批量按钮验证,缺口保留,见 [0.23.1 发布说明](docs/release-0.23.1.md)。以下保留历史版本事实:
|
|
524
525
|
**v0.23.0** 的快捷菜单:编辑器内一个可拖动悬浮按钮,点开是自定义菜单树(组 / 按钮,最多 5 层),按钮可携带提示词并直接发送给 AI 或只填入输入框;配置存于 `<DSH_HOME>/dsh-vscode-mode/data/quick-menu.json`,带 `revision` 乐观锁与损坏降级;节点可限定生效工作区(默认全部),按钮可绑定技能与规则,发送时按当前会话可见性校验后只拼装通过的绑定。新增 `skills.list` 只读 RPC 枚举「全局技能 + 当前工作区技能」作为候选,配置界面的工作区、技能、规则全部改为下拉弹层/多选下拉,菜单设置重排为四段并统一按钮盒模型(修掉「导入 JSON」下移不居中)。本版**未做 GUI 真机验收**(本机 pnpm store 损坏、插件未部署),缺口已获用户接受,见 [0.23.0 发布说明](docs/release-0.23.0.md)。以下保留历史版本事实:
|
|
525
526
|
**v0.22.0** 的累计基线待审(非 UI 能力对齐 dsh-diff-approval):同一文件的多次编辑折叠成一条待审、基线保留最早内容,A→B→C 显示 A→C、A→B→A 自然归零;Keep 只推进基线不改磁盘,Revert 走版本守卫写回并读回校验,撤销/重做用游标模型跨重启保留;新增 `str_replace_editor` 预像配对、`fs/observed` 终像、已入列路径的外部改动吸收与缺失/不可读生命周期、git/svn/Perforce 基线导入,以及旧 sidecar 写入口对已接管路径的服务端拒绝。差异仍在编辑器内行内展示、块级 Keep/Undo 用药丸,文件级在差异栏;详情面板与批注(含「让 AI 应答」)本版移除。验收边界:p4 仅有假 shell 单测(本机无 Perforce 客户端),「让 AI 应答」随批注一并下线故不再验证;本版未在宿主上重启验收 GUI 全流程,见 [0.22.0 发布说明](docs/release-0.22.0.md)。以下保留历史版本事实:
|
|
526
527
|
**v0.21.4** 的任务发送结果分类与诚实草稿降级:只有明确 accepted 才等待分析方案;unknown/submitted/cancelled 不另填草稿或重发,安全降级只填实际当前会话草稿并提示手动发送。旧 boolean 接口保留,legacy true 不等于受理。开发 link 客户端 rev458288ddb012 的真实公开入口与目标受理已验;完整 SVN 分析/方案投递因 `SetNamedSecurityInfoW failed (Win32 5)` 未完成,用户仅本批接受此缺口,不代表 Host 整体升级或当前实例已安装 npm 0.21.4。见 [0.21.4 发布说明](docs/release-0.21.4.md)。保留以下历史版本事实:
|
|
@@ -531,13 +532,13 @@ profile 请替换为实际目标,不要把示例目录当成当前运行 profi
|
|
|
531
532
|
|
|
532
533
|
```bash
|
|
533
534
|
# ① Git 安装(clone + prepare 构建;推荐打固定 tag)
|
|
534
|
-
dsh plugin --profile web add github:Lenonss/DSH_VsCodeMode#v0.23.
|
|
535
|
+
dsh plugin --profile web add github:Lenonss/DSH_VsCodeMode#v0.23.1
|
|
535
536
|
|
|
536
537
|
# ② npm 注册表(发布到 npm 后)
|
|
537
|
-
dsh plugin --profile web add dsh-vscode-mode@0.23.
|
|
538
|
+
dsh plugin --profile web add dsh-vscode-mode@0.23.1
|
|
538
539
|
|
|
539
540
|
# ③ GitHub Release tgz 直装(Release asset 可用后)
|
|
540
|
-
dsh plugin --profile web add https://github.com/Lenonss/DSH_VsCodeMode/releases/download/v0.23.
|
|
541
|
+
dsh plugin --profile web add https://github.com/Lenonss/DSH_VsCodeMode/releases/download/v0.23.1/dsh-vscode-mode-0.23.1.tgz
|
|
541
542
|
```
|
|
542
543
|
|
|
543
544
|
> **DSH 版本政策(0.17.0 起)**:六项 DSH peer 仍统一声明为 `*`,另以
|
|
@@ -878,6 +879,7 @@ Keep All / Undo All 却是亮的。修复:单文件 Keep / Undo 覆盖冲突
|
|
|
878
879
|
完整变更见 [GitHub Releases](https://github.com/Lenonss/DSH_VsCodeMode/releases)。
|
|
879
880
|
近期关键版本:
|
|
880
881
|
|
|
882
|
+
- **v0.23.1**:修复 Keep All / Undo All 在待审超过一页时必定中止——批量按钮原先复用分页接口并把每页的展示用计数当全量总数校验,官方待审 150 条时先报「待审记录在分页期间变化」或最终报「待审记录数量不完整」,实际 0 项被决策。现改为一次性完整快照(`edrv.review.list` 新增 `all: true`,服务端循环取全并与历史改动投影去重,`nextCursor: null`、`pending` 为真实总数),客户端单次取快照、校验唯一且仍待审后逐项决策;超过 2000 条明确拒绝并提示分批,途中变化仍整批中止不部分写入。差异栏浏览仍走原分页接口。本版未在重启后的 GUI 点按验证,缺口保留;发布不自动部署,升级后重启 DSH 并刷新页面。见 [发布说明](docs/release-0.23.1.md)。
|
|
881
883
|
- **v0.23.0**:新增快捷菜单——可拖动悬浮按钮 + 自定义菜单树(组/按钮,最多 5 层),按钮携带提示词并「直接发送给 AI」或「只填入输入框」;配置存 `<DSH_HOME>/dsh-vscode-mode/data/quick-menu.json`,带 `revision` 乐观锁、冲突重拉不覆盖、损坏降级。节点可限定工作区(默认全部、子节点继承),按钮可绑定技能与规则,发送时按会话可见性校验后只拼装通过的绑定(规则支持引用/内联)。新增 `skills.list` 只读 RPC 枚举全局技能 + 当前工作区技能;配置界面工作区改下拉弹层、技能/规则改分组多选下拉并移除手输技能名,菜单设置重排四段、统一按钮盒模型并修掉「导入 JSON」下移不居中。本版 GUI 未真机验收(pnpm store 损坏、插件未部署),缺口已获用户接受;发布不自动部署,升级后重启 DSH 并刷新页面。见 [发布说明](docs/release-0.23.0.md)。
|
|
882
884
|
- **v0.22.0**:新增累计基线待审——同文件多次编辑折叠成一条、基线保留最早内容(A→B→C 显示 A→C、A→B→A 归零);Keep 只推进基线不改磁盘,Revert 带版本守卫写回并读回,撤销/重做游标模型跨重启保留;补 `str_replace_editor` 预像配对、外部改动吸收与缺失生命周期、git/svn/Perforce 基线导入、旧入口服务端拒绝。差异仍在编辑器内行内展示,详情面板与批注(含「让 AI 应答」)移除。p4 仅假 shell 单测(本机无 Perforce 客户端),GUI 全流程未重启验收;发布不自动部署,升级后重启 DSH 并刷新页面。见 [发布说明](docs/release-0.22.0.md)。
|
|
883
885
|
- **v0.21.4**:区分任务明确受理、拒绝、不明、仅提交与取消;只有 accepted 开始等待,unknown/submitted/cancelled 不另填草稿、重试或轮询。安全降级只填实际当前会话草稿并提示手动发送,缺详细 API 明确本次未自动发送;旧 boolean 兼容但 true 不等于受理。真实开发客户端公开按钮→目标受理已验,完整 SVN 分析/方案投递因 Win32 5 未验,用户仅本批接受;Host 未重启,不自动部署。见 [发布说明](docs/release-0.21.4.md)。
|
package/lib/client.js
CHANGED
|
@@ -3555,29 +3555,23 @@ window.__ModuleLoader__.load({
|
|
|
3555
3555
|
}
|
|
3556
3556
|
//#endregion
|
|
3557
3557
|
//#region src/client/reviewBatch.ts
|
|
3558
|
-
/**
|
|
3558
|
+
/**
|
|
3559
|
+
* @public
|
|
3560
|
+
* @author ddj 2026年10月31号
|
|
3561
|
+
* @description: 取一次完整待审快照。分页计数只用于展示,批量写入必须一次取全,避免把页内数字当成总数。
|
|
3562
|
+
* @param port 已鉴权的 RPC 适配器
|
|
3563
|
+
* @returns 冻结的完整待审集;任何不一致都在首个写入前中止
|
|
3564
|
+
* @throws 快照重复、版本已变或数量不完整
|
|
3565
|
+
*/
|
|
3559
3566
|
async function loadPending(port) {
|
|
3560
|
-
const
|
|
3567
|
+
const page = await port.snapshot();
|
|
3561
3568
|
const seen = /* @__PURE__ */ new Set();
|
|
3562
|
-
const
|
|
3563
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
if (page.pending !== expected) throw new Error("待审记录在分页期间变化,请刷新后重试");
|
|
3569
|
-
for (const item of page.items) {
|
|
3570
|
-
if (seen.has(item.id) || !item.current || item.decision !== "pending") throw new Error("待审分页发生重复或版本变化,请刷新后重试");
|
|
3571
|
-
seen.add(item.id);
|
|
3572
|
-
items.push(item);
|
|
3573
|
-
}
|
|
3574
|
-
if (page.nextCursor === null) break;
|
|
3575
|
-
if (cursors.has(page.nextCursor) || page.items.length === 0) throw new Error("待审分页未完整返回,请刷新后重试");
|
|
3576
|
-
cursor = page.nextCursor;
|
|
3577
|
-
cursors.add(cursor);
|
|
3578
|
-
} while (true);
|
|
3579
|
-
if (items.length !== expected) throw new Error("待审记录数量不完整,未执行批量操作");
|
|
3580
|
-
return items;
|
|
3569
|
+
for (const item of page.items) {
|
|
3570
|
+
if (seen.has(item.id) || !item.current || item.decision !== "pending") throw new Error("待审快照发生重复或版本变化,请刷新后重试");
|
|
3571
|
+
seen.add(item.id);
|
|
3572
|
+
}
|
|
3573
|
+
if (page.nextCursor !== null || page.items.length !== page.pending) throw new Error("待审记录数量不完整,未执行批量操作");
|
|
3574
|
+
return page.items;
|
|
3581
3575
|
}
|
|
3582
3576
|
/** @public @author ddj 2026年10月27号 @param port Guarded existing per-file decision adapter. @param reject Undo instead of Keep. @returns Precise partial result; Undo stops at first conflict, never claims atomic multi-file rollback. */
|
|
3583
3577
|
async function runReviewBatch(port, reject) {
|
|
@@ -397066,10 +397060,10 @@ td.UniverTableCell, th.UniverTableCell{mso-padding-alt:0cm 5.4pt 0cm 5.4pt;}
|
|
|
397066
397060
|
setStatus(reject ? "正在检查并 Undo 全部待审记录…" : "正在 Keep 全部待审记录…");
|
|
397067
397061
|
try {
|
|
397068
397062
|
const result = await runReviewBatch({
|
|
397069
|
-
|
|
397063
|
+
snapshot: async () => {
|
|
397070
397064
|
const res = await rpc("edrv.review.list", {
|
|
397071
397065
|
sessionId,
|
|
397072
|
-
|
|
397066
|
+
all: true
|
|
397073
397067
|
});
|
|
397074
397068
|
if (!res.ok) throw new Error(res.error);
|
|
397075
397069
|
return res.page;
|
package/lib/client.js.map
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/lib/client.js.map
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 35662220 bytes
|
|
4
|
+
sha256: 0204857e50fdc9778b1c9c5e5b128880ec0af54eb8d94edbd9d2b38cb2a63d3d
|
package/lib/index.js
CHANGED
|
@@ -15969,6 +15969,47 @@ function finishUndo(cwd, request) {
|
|
|
15969
15969
|
}
|
|
15970
15970
|
//#endregion
|
|
15971
15971
|
//#region src/reviewRpc.ts
|
|
15972
|
+
/** 批量写入快照的硬上限:待审积压超过它说明状态异常,宁可拒绝也不做无界写循环。 */
|
|
15973
|
+
const BATCH_LIMIT = 2e3;
|
|
15974
|
+
/**
|
|
15975
|
+
* @private
|
|
15976
|
+
* @author ddj 2026年10月31号
|
|
15977
|
+
* @description: 批量写入用的一次性完整快照。合并口径与列表一致(待审投影优先、同路径官方旧行让位),
|
|
15978
|
+
* 但一次取全,且 items 与 pending 同源,客户端才能把它当成写前不变式。
|
|
15979
|
+
* @param cwd 工作区
|
|
15980
|
+
* @param pending 该会话可见的待审页
|
|
15981
|
+
* @returns 完整快照;待审积压超过上限或分页期间数量漂移时返回错误
|
|
15982
|
+
*/
|
|
15983
|
+
function batchSnapshot(cwd, pending) {
|
|
15984
|
+
const first = reviewPage(cwd);
|
|
15985
|
+
if (first.pending > BATCH_LIMIT) return {
|
|
15986
|
+
ok: false,
|
|
15987
|
+
error: `待审记录过多(${first.pending} 条,上限 ${BATCH_LIMIT}),请先分批处理后重试`
|
|
15988
|
+
};
|
|
15989
|
+
const official = [];
|
|
15990
|
+
let page = first;
|
|
15991
|
+
while (page) {
|
|
15992
|
+
for (const item of page.items) if (item.current && item.decision === "pending") official.push(item);
|
|
15993
|
+
page = page.nextCursor === null ? void 0 : reviewPage(cwd, page.nextCursor);
|
|
15994
|
+
}
|
|
15995
|
+
if (official.length !== first.pending) return {
|
|
15996
|
+
ok: false,
|
|
15997
|
+
error: "待审记录数量不完整,未执行批量操作"
|
|
15998
|
+
};
|
|
15999
|
+
const live = pending.items.filter((item) => !item.settled);
|
|
16000
|
+
const kept = official.filter((row) => !live.some((entry) => pendingSamePath(entry.path, row.currentPath) || pendingSamePath(entry.path, row.path)));
|
|
16001
|
+
const items = [...live.map((entry) => pendingItemOf(entry, cwd)), ...kept];
|
|
16002
|
+
return {
|
|
16003
|
+
ok: true,
|
|
16004
|
+
page: {
|
|
16005
|
+
items,
|
|
16006
|
+
pending: items.length,
|
|
16007
|
+
nextCursor: null,
|
|
16008
|
+
gaps: first.gaps,
|
|
16009
|
+
...first.overview ? { overview: first.overview } : {}
|
|
16010
|
+
}
|
|
16011
|
+
};
|
|
16012
|
+
}
|
|
15972
16013
|
/**
|
|
15973
16014
|
* @public
|
|
15974
16015
|
* @author ddj 2026年10月26号 / 2026年10月28号
|
|
@@ -16017,6 +16058,7 @@ function reviewHandlers(ctx, registry) {
|
|
|
16017
16058
|
return {
|
|
16018
16059
|
"edrv.review.list": async (args) => {
|
|
16019
16060
|
const cwd = await workspace(args.sessionId);
|
|
16061
|
+
if (args.all && !args.history && args.path === void 0) return batchSnapshot(cwd, pendingPageOf(cwd, args.sessionId));
|
|
16020
16062
|
const official = reviewPage(cwd, args.cursor, args.history, args.path);
|
|
16021
16063
|
const pending = pendingPageOf(cwd, args.sessionId);
|
|
16022
16064
|
if (args.history) return {
|