@jayyuen66/dsh-ocr-review 0.1.8 → 0.1.9

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/CHANGELOG.md CHANGED
@@ -4,6 +4,42 @@
4
4
  [语义化版本](https://semver.org/lang/zh-CN/),最新版本在最上。条目自 0.1.0 起;更早的
5
5
  1.0.0 / 0.6.x 是作用域迁移前的历史编号,npm 已永久记录,不在本文件重建。
6
6
 
7
+ ## 0.1.9
8
+
9
+ 这一版把后台评审的作业归属钉到发起会话,并把设置卡与读面校验统一到 shared 组件和 zod;
10
+ 插件页展示面进包,宿主开发线抬到 0.2.2-alpha.2。对外工具与 Remote 方法面不变。
11
+
12
+ ### Changed
13
+
14
+ - **后台作业按会话归属**:能解析到活 Agent 时,`jobs.start` 带 `owner`;`job_list` / `job_output` /
15
+ `job_kill` 对该作业只在所属会话可见。会话销毁只回收它自己的作业(活的 kill、已落定的 remove),
16
+ 不再按 kind 全量回收别的会话的评审;解析不到活 Agent 的调用仍起无主作业,只在插件卸载时统一收。
17
+ - **作业台账**:新增 id → 发起会话的最小台账。注册表对没有 caller 的视图隐藏有主作业,卸载时靠它
18
+ 枚举;已落定记录的裁剪按 caller 可见面(无主桶 + 自己的)计算。
19
+ - **设置卡迁到 shared 组件与 zod**:`src/remote.ts` 的三个 strict codec 改由 zod schema 生成;
20
+ `src/client-entry.ts` 的枚举、计数与 providers 载荷改 zod 逐层校验,控件改用 shared 的
21
+ `CARD_UI_CSS` / `CardForm` / `Field` 等。`zod` 进 `dependencies`,client 产物按宿主
22
+ `PLATFORM_MODULES` 外置。
23
+ - **插件页展示面进包**:新增 `locale/en.json`、`locale/zh.json` 与 `docs/DETAIL.md`、
24
+ `docs/DETAIL.zh.md`;`exports` 增加 `./locale/*.json`,`files` 收进 locale 与 docs。
25
+ - **宿主开发线抬到 `0.2.2-alpha.2`**:devDependencies 与 catalog/overrides 同值;`engines.dsh`
26
+ 与 peer 仍写支持窗口 `^0.2.1-rc.3`,README 补滚动窗口说明。
27
+ - **正则常量提升**:argv-guard / config-store / mcp-config / output / parse / provider-projection
28
+ 的内联正则提取为命名常量,行为不变,满足 lint 的重复字面量门禁。
29
+
30
+ ### Fixed
31
+
32
+ - **脱敏不再误伤路径段**:独立 key 形态的匹配落在 `/` 或 `\` 两侧时按路径段保留,不再把带大写
33
+ 组件的仓库路径(例如 `Documents/...`)抹成 `***REDACTED***`。
34
+ - **会话销毁的回收范围**:`session/disposed` 过去按 kind 回收全部 OCR 作业,会把别的会话正在读的
35
+ 评审一并杀掉;现在只收 payload 那条会话的作业,认不出会话就什么都不做。
36
+
37
+ ### Docs
38
+
39
+ - README 双语补后台作业的归属、容量桶、清理与残留暴露面,改正 `ocrReview` 方法数与 peer 枚数;
40
+ DETAIL 改正无 key 的 provider(列出但禁用)与 `timeoutMinutes` 的取值口径;`THIRD_PARTY_NOTICES`
41
+ 同步 zod 依赖与 dsh 0.2.2-alpha.2 的核对基线。
42
+
7
43
  ## 0.1.8
8
44
 
9
45
  这一版把外部 OCR 契约从 1.13.0 抬到 **1.13.3**,并把模型工具面从「审查/扫描/委托/会话」扩到
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://www.npmjs.com/package/@jayyuen66/dsh-ocr-review"><img src="https://img.shields.io/npm/v/@jayyuen66/dsh-ocr-review?style=flat-square&logo=npm&logoColor=white" alt="npm version" /></a>
11
- <a href="https://www.npmjs.com/package/@jayyuen66/dsh-ocr-review"><img src="https://img.shields.io/npm/dm/@jayyuen66/dsh-ocr-review?style=flat-square" alt="npm downloads" /></a>
11
+ <a href="https://www.npmjs.com/package/@jayyuen66/dsh-ocr-review"><img src="https://img.shields.io/npm/d18m/@jayyuen66/dsh-ocr-review?style=flat-square" alt="npm downloads (total)" /></a>
12
12
  <a href="https://github.com/JayYuen666/dsh-ocr-review/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/JayYuen666/dsh-ocr-review/ci.yml?branch=main&style=flat-square&label=ci" alt="ci" /></a>
13
13
  <img src="https://img.shields.io/badge/license-MIT-4c1?style=flat-square" alt="MIT" />
14
14
  <img src="https://img.shields.io/badge/node-%3E%3D22.12-4c1?style=flat-square&logo=nodedotjs&logoColor=white" alt="node" />
@@ -67,7 +67,7 @@ dsh plugin --profile web add @jayyuen66/dsh-ocr-review
67
67
  Remove with `dsh plugin --profile web remove @jayyuen66/dsh-ocr-review`. The package is on the public npm registry, so installation needs no credentials.
68
68
 
69
69
  - **Upgrading an installed copy is remove-then-add.** On a profile running HMR (the shipped ones do), `add` on a package the profile already depends on refuses before pnpm runs (`already-installed`) — run `remove` first, then `add` the target version; the new one starts without a restart. Without HMR the same `add` runs pnpm and reports `restart-required`.
70
- - **Requires Node.js `>= 22.12` and host `dsh` on the `0.2.1-rc.3` line.** The host reads `engines.dsh` (`^0.2.1-rc.3`) and decides on it alone; prereleases participate in the comparison. An incompatible host needs the explicit risk grant `dsh plugin --profile <p> allow-version @jayyuen66/dsh-ocr-review@<version> --dsh-version <exact> --accept-risk`.
70
+ - **Requires Node.js `>= 22.12` and host `dsh` on the `0.2.1-rc.3` line.** The host reads `engines.dsh` (`^0.2.1-rc.3`) and decides on it alone; prereleases participate in the comparison. An incompatible host needs the explicit risk grant `dsh plugin --profile <p> allow-version @jayyuen66/dsh-ocr-review@<version> --dsh-version <exact> --accept-risk`. The support window rolls: this package is verified against the three most recently released host versions at publish time and re-verified once the window moves, so the version number in this bullet is not a standing promise.
71
71
  - **No `@deepseek-ai/*` under `dependencies`, by contract** (`test/publish-manifest.test.ts` enforces it). Consumer profiles install with `nodeLinker: hoisted` and `autoInstallPeers: false`, so a host package there is materialized as a real directory next to the copy the running host already loaded. `@deepseek-ai/dsh-tools` keys its scheduler with a plain `Symbol` (not `Symbol.for`), so symbol identity is per instance and **every native tool call in that profile throws** — while this package's build, typecheck and coverage gates stay green right up to that moment.
72
72
  - **The five host packages `host.js` imports as values are required peers**: `@deepseek-ai/schemastery` (the host fork — only it resolves `.volatile()` fields), `@deepseek-ai/dsh-credentials`, `@deepseek-ai/dsh-home-paths`, `@deepseek-ai/dsh-atomic-write` and `@deepseek-ai/dsh-typert-protocol` (the Remote service base). Each is repeated in `devDependencies` at the same pin so this repository's own typecheck resolves them; the build externalizes all manifest tables, keeping bare specifiers in the artifact.
73
73
  - **What ships**: `host.js`, `client.js`, `cordis.patch.yml`, `scripts/`, `icon.svg`, `CHANGELOG.md` and `THIRD_PARTY_NOTICES.md`. `prepack` rebuilds the bundles, so nothing stale is published.
@@ -111,7 +111,7 @@ npm i -g @alibaba-group/open-code-review@1.13.3 # pinned to the version thi
111
111
  ## <img src="https://api.iconify.design/lucide/plug.svg?color=%23658EFF&height=22" height="22" width="22" align="absmiddle" alt="" /> Enabling it in dsh
112
112
 
113
113
  - `dsh.bundle.patch` in `package.json` points at `cordis.patch.yml`, whose single registration line is `- id: ocr-review` with `name` set to the bare package name — the bare name is what makes the host scan the client half.
114
- - The card needs a web profile (`dsh.client.platform: web`, `immediately: true`). The five `ocrReview` methods are installed unconditionally on the apply fiber, so a host whose web layer never comes up (a TUI) still has the tools and settings.
114
+ - The card needs a web profile (`dsh.client.platform: web`, `immediately: true`). The nine `ocrReview` methods are installed unconditionally on the apply fiber, so a host whose web layer never comes up (a TUI) still has the tools and settings.
115
115
  - The gateway exposes the methods only to clients of this profile; this package adds nothing in front of it.
116
116
  - Deployment defaults go on the registration line's `config:` (cordis validates through the exported `Config` schema); precedence: settings-card runtime value > line config > built-in default.
117
117
 
@@ -149,7 +149,7 @@ The deployment keys below are deliberately **not** on the card — they are plai
149
149
  | --- | --- | --- |
150
150
  | `llmTestTimeoutMs` | `90000` | Wall clock for `ocr llm test`, shared by autoVerify and the card's test connection; raise it on slow machines |
151
151
  | `startupVerify` | `true` | Run the endpoint self-check (and one version measurement) at apply. The same switch governs both, because the criterion is "may a load spawn processes"; turn it off if loads must stay process-free |
152
- | `ocrBackgroundMaxMs` | `0` | Backstop window for background reviews (registry wait to the deadline, then kill); 0 = no window — a run ends only when the host exits, the session stops, the plugin unloads or the job is killed |
152
+ | `ocrBackgroundMaxMs` | `0` | Backstop window for background reviews (registry wait to the deadline, then kill); 0 = no window — an owned run also ends when its session stops, while an agentless one ends only when the host exits, the plugin unloads or the job is killed |
153
153
  | `stdoutMaxBytes` | `400000` | Shell executor stdout cap, shared by foreground and background runs (review results go through the `--output` temp file precisely to step outside it) |
154
154
  | `ocrNoAutoUpdate` | `false` | true puts `OCR_NO_UPDATE=1` on every command this package spawns, stopping upstream's mid-review `npm i -g` of a newer release; false keeps upstream behaviour. The version probe sets the variable regardless |
155
155
  | `ocrInstallHint` | `both` | Which install command to lead with when nothing is installed: `both` / `brew` / `npm`. A fallback, not an override — an existing copy is always described by its own source, because telling a formula user to run `npm i -g` leaves a second copy behind while PATH still resolves the old one. The npm command always carries the verified version; the brew one never can |
@@ -189,9 +189,10 @@ Refusals answer `{ok: false, error, status}` where `status` is a **retained sema
189
189
  | --- | --- |
190
190
  | What the model gains | `job_list` shows the review, `job_output` reads its stdout/stderr (non-consuming — it never steals bytes from the session reader), `job_kill` stops it. Results still come from the `ocr_session` record |
191
191
  | No registry, no background | A host without the jobs service makes `wait: false` throw an error naming the missing piece instead of starting a subprocess nobody can observe; foreground runs are unaffected |
192
- | The shared bucket | The unowned job slots are shared host-wide and overflow refuses new starts, so one hung CLI parks a slot forever. That is what the optional `ocrBackgroundMaxMs` backstop is for — it uses the registry's own wait + kill, not a host timer |
193
- | Cleanup | Settled records of this kind are pruned down to a fixed window before each start; live and stopping records are never pruned (the registry answers overflow by refusing, not by killing somebody's review). At unload, live jobs are killed through the registry and settled ones removed |
194
- | Exposure | Unowned means any caller can list / read / kill it. Known and accepted for this adoption; closing it would mean rolling the job registration back |
192
+ | Ownership | When the calling agent resolves to a live session, the job is started with that session as its `owner`; `job_list` / `job_output` / `job_kill` then only reach it from that session. A call with no live agent starts an agentless job |
193
+ | Capacity buckets | Owned jobs count against their owner's bucket; agentless jobs share the unowned bucket host-wide. Overflow refuses a new start, so one hung CLI can park a slot — the optional `ocrBackgroundMaxMs` backstop uses the registry's own wait + kill, not a host timer |
194
+ | Cleanup | Before each start, settled records of this kind visible to that caller (the shared unowned bucket plus the caller's own) are pruned to a fixed window; live and stopping records are never pruned (the registry answers overflow by refusing, not by killing somebody's review). A session disposal kills or removes only that session's jobs; unload reclaims everything, using a small id → owner ledger because the registry hides other owners' jobs |
195
+ | Exposure | An owned job is visible to, and killable by, its own session only. Agentless jobs remain visible to every caller — the residual exposure, present only when no live agent could be resolved |
195
196
  | Nothing may throw | An error raised inside a host event handler takes the whole host process down, and the official package does not cover producers either — the cancel chain catches at two layers, each pinned by its own test |
196
197
 
197
198
  ## <img src="https://api.iconify.design/lucide/lock.svg?color=%23658EFF&height=22" height="22" width="22" align="absmiddle" alt="" /> Data and privacy
@@ -209,7 +210,7 @@ Refusals answer `{ok: false, error, status}` where `status` is a **retained sema
209
210
  - **Version reads cost a spawn** and never happen on render; the card shows the last measurement or nothing — a page render cannot install, update or probe anything.
210
211
  - **The atomic-write lock timeout surfaces in English.** Contention past the official wait budget throws the official package's own timeout text — the one user-visible error here that bypasses the bilingual message table.
211
212
  - **`partial` is a terminal success state.** Some files failed but coverage stands and the comments are valid; it is neither upgraded to success nor folded into failure.
212
- - **Unowned background jobs are visible to every session** (see Background runs) — accepted with the adoption, and the only way to close it is to roll the registration back.
213
+ - **Agentless background jobs are visible to every session** (see Background runs). A call that cannot resolve a live agent starts one; owned jobs are fenced to their session.
213
214
 
214
215
  ## <img src="https://api.iconify.design/lucide/circle-help.svg?color=%23658EFF&height=22" height="22" width="22" align="absmiddle" alt="" /> FAQ
215
216
 
package/README.zh-CN.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://www.npmjs.com/package/@jayyuen66/dsh-ocr-review"><img src="https://img.shields.io/npm/v/@jayyuen66/dsh-ocr-review?style=flat-square&logo=npm&logoColor=white" alt="npm version" /></a>
11
- <a href="https://www.npmjs.com/package/@jayyuen66/dsh-ocr-review"><img src="https://img.shields.io/npm/dm/@jayyuen66/dsh-ocr-review?style=flat-square" alt="npm downloads" /></a>
11
+ <a href="https://www.npmjs.com/package/@jayyuen66/dsh-ocr-review"><img src="https://img.shields.io/npm/d18m/@jayyuen66/dsh-ocr-review?style=flat-square" alt="npm downloads (total)" /></a>
12
12
  <a href="https://github.com/JayYuen666/dsh-ocr-review/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/JayYuen666/dsh-ocr-review/ci.yml?branch=main&style=flat-square&label=ci" alt="ci" /></a>
13
13
  <img src="https://img.shields.io/badge/license-MIT-4c1?style=flat-square" alt="MIT" />
14
14
  <img src="https://img.shields.io/badge/node-%3E%3D22.12-4c1?style=flat-square&logo=nodedotjs&logoColor=white" alt="node" />
@@ -67,7 +67,7 @@ dsh plugin --profile web add @jayyuen66/dsh-ocr-review
67
67
  卸载用 `dsh plugin --profile web remove @jayyuen66/dsh-ocr-review`。包在公共 npm 上,安装不需要凭据。
68
68
 
69
69
  - **升级已装的那一份要「先 remove 再 add」。** profile 跑着 HMR(出厂那几个都跑)时,`add` 一个 profile 已经依赖着的包会在 pnpm 动手之前就被拒(`already-installed`)——先 `remove` 再 `add` 目标版本,新版不必重启就起跑。没跑 HMR 时同一个 `add` 照样走 pnpm,报 `restart-required`。
70
- - **要求 Node.js `>= 22.12`,宿主 dsh 在 `0.2.1-rc.3` 线上。** 宿主只读 `engines.dsh`(`^0.2.1-rc.3`)并独立裁决,预发布号参与比较。不合的宿主要显式登记风险豁免:`dsh plugin --profile <p> allow-version @jayyuen66/dsh-ocr-review@<版本> --dsh-version <确切运行版本> --accept-risk`。
70
+ - **要求 Node.js `>= 22.12`,宿主 dsh 在 `0.2.1-rc.3` 线上。** 宿主只读 `engines.dsh`(`^0.2.1-rc.3`)并独立裁决,预发布号参与比较。不合的宿主要显式登记风险豁免:`dsh plugin --profile <p> allow-version @jayyuen66/dsh-ocr-review@<版本> --dsh-version <确切运行版本> --accept-risk`。支持窗口是滚动的:本包在发布时最近的三个已发布宿主版本上逐版取证,窗口滚动后重新取证,不把这一句里的版本号当长期承诺。
71
71
  - **`dependencies` 里不放任何 `@deepseek-ai/*`,这是契约**(`test/publish-manifest.test.ts` 钉着)。消费方 profile 用 `nodeLinker: hoisted` 与 `autoInstallPeers: false` 安装,宿主包进了那张表就会落成真实目录,与宿主进程已加载的那份并存。`@deepseek-ai/dsh-tools` 的调度器键是普通 `Symbol`(不是 `Symbol.for`),符号身份按实例计算——那个 profile 里**每一次原生工具调用都抛**,而本包的构建、类型检查与覆盖率门在此前一路绿。
72
72
  - **`host.js` 以值导入的五枚宿主包是非 optional 的 peer**:`@deepseek-ai/schemastery`(宿主 fork——`.volatile()` 的解析只在它有实现)、`@deepseek-ai/dsh-credentials`、`@deepseek-ai/dsh-home-paths`、`@deepseek-ai/dsh-atomic-write` 与 `@deepseek-ai/dsh-typert-protocol`(Remote 的 Service 基类)。五枚同时以同一钉版另列进 `devDependencies`,本仓自己的类型检查才解析得到;构建对 manifest 三张表一律外部化,产物里保持裸说明符。
73
73
  - **发布面**:`host.js`、`client.js`、`cordis.patch.yml`、`scripts/`、`icon.svg`、`CHANGELOG.md` 与 `THIRD_PARTY_NOTICES.md`。`prepack` 重建两个 bundle,发出去的永远是当前源码的产物。
@@ -111,7 +111,7 @@ npm i -g @alibaba-group/open-code-review@1.13.3 # 钉在本包核对的那
111
111
  ## <img src="https://api.iconify.design/lucide/plug.svg?color=%23658EFF&height=22" height="22" width="22" align="absmiddle" alt="" /> 在 dsh 里启用
112
112
 
113
113
  - `package.json` 的 `dsh.bundle.patch` 指向 `cordis.patch.yml`,其唯一注册行是 `- id: ocr-review`、`name` 为裸包名——宿主只按裸包名扫描 client 半。
114
- - 卡片要 web profile(`dsh.client.platform: web`、`immediately: true`)。五个 `ocrReview` 方法由 apply fiber 无条件注册,宿主的 web 层从不起(如 TUI)时工具与设置照常在。
114
+ - 卡片要 web profile(`dsh.client.platform: web`、`immediately: true`)。九个 `ocrReview` 方法由 apply fiber 无条件注册,宿主的 web 层从不起(如 TUI)时工具与设置照常在。
115
115
  - 网关只把方法暴露给本 profile 的客户端;本包不在它前面再加一层。
116
116
  - 部署默认写在注册行的 `config:` 上(cordis 按导出的 `Config` schema 校验);优先级:设置卡运行时值 > 行 config > 内置默认。
117
117
 
@@ -149,7 +149,7 @@ npm i -g @alibaba-group/open-code-review@1.13.3 # 钉在本包核对的那
149
149
  | --- | --- | --- |
150
150
  | `llmTestTimeoutMs` | `90000` | `ocr llm test` 的墙钟,autoVerify 与卡片「测试连接」共用;评审机慢就调大 |
151
151
  | `startupVerify` | `true` | 装载期跑一次端点自检(顺带量一次版本)。两条归同一开关,因为判据同是「装载期允不允许起进程」;要求装载零进程的部署关掉它 |
152
- | `ocrBackgroundMaxMs` | `0` | 后台评审的兜底回收窗口(注册表等到 deadline 即 kill);0 = 不设窗口——只有宿主退出、会话停止、插件卸载或作业被杀才结束 |
152
+ | `ocrBackgroundMaxMs` | `0` | 后台评审的兜底回收窗口(注册表等到 deadline 即 kill);0 = 不设窗口——有主作业还会在所属会话停止时结束,无主作业则只在宿主退出、插件卸载或作业被杀时结束 |
153
153
  | `stdoutMaxBytes` | `400000` | shell 执行器的 stdout 缓冲上限,前台与后台共用(评审结果走 `--output` 临时文件,正是为了绕开它) |
154
154
  | `ocrNoAutoUpdate` | `false` | 置真时本包起的每条命令都带 `OCR_NO_UPDATE=1`,拦住上游在评审中途把新版 `npm i -g` 装上;置假保持上游行为。版本探测不受本开关影响,恒定带上该变量 |
155
155
  | `ocrInstallHint` | `both` | 还没装时先推哪条装法:`both` / `brew` / `npm`。只是兜底而非覆盖——机器上已有一份时按那份自己的来源说,因为对着 brew 用户端出 `npm i -g` 会多出第二份、PATH 上还是旧的。npm 那条恒带核对版本,brew 那条恒带不了 |
@@ -189,9 +189,10 @@ npm i -g @alibaba-group/open-code-review@1.13.3 # 钉在本包核对的那
189
189
  | --- | --- |
190
190
  | 模型多看到的 | `job_list` 列得出这场评审、`job_output` 读得到它的 stdout/stderr(非消费式——不会从会话读取器那里抢字节)、`job_kill` 停得掉它。评审结果仍以 `ocr_session` 会话记录为准 |
191
191
  | 没注册表就没后台 | 宿主没有 jobs 服务时,`wait: false` 直接抛错点名缺件,而不是起一个没人看得见的子进程;前台运行不受影响 |
192
- | 共用桶 | 未拥有的作业槽全宿主共用,满员直接拒绝新 start,一条挂死的 CLI 会永久占一格。`ocrBackgroundMaxMs` 那个可选兜底窗口就是为它设的——用注册表自己的 wait + kill,不用宿主 timer |
193
- | 清理 | 每次登记前把本 kind 的已落定记录剪到固定窗口;在跑与正在收的一条不剪(注册表对超额的答法是拒绝,不是替人杀评审)。卸载时,活着的经注册表 kill,已落定的 remove |
194
- | 暴露面 | 未拥有意味着任何 caller 都能 list / read / kill。这是本次换装已知并接受的暴露面;收回它的唯一方式是回滚作业登记 |
192
+ | 归属 | 调用方能解析到活会话时,作业以该会话为 `owner` 登记;此后只有那个会话能经 `job_list` / `job_output` / `job_kill` 碰到它。解析不到活 Agent 的调用起的是无主作业 |
193
+ | 容量桶 | 有主作业计入各自 owner 的桶;无主作业共用全宿主的未拥有桶。满员都直接拒绝新 start,一条挂死的 CLI 会占住一格——`ocrBackgroundMaxMs` 那个可选兜底窗口就是为它设的,用注册表自己的 wait + kill,不用宿主 timer |
194
+ | 清理 | 每次登记前,把该 caller 可见面(无主桶 + 自己的)里本 kind 的已落定记录剪到固定窗口;在跑与正在收的一条不剪(注册表对超额的答法是拒绝,不是替人杀评审)。会话销毁只回收该会话的作业;卸载时统一回收全部,有主作业的 id 靠一份最小的「id → owner」台账枚举,因为注册表对别的 owner 隐藏它们 |
195
+ | 暴露面 | 有主作业只对所属会话可见、也只由它可 kill。无主作业仍对所有 caller 可见——这是残留暴露面,只发生在解析不到活 Agent 的时候 |
195
196
  | 取消链里不许抛 | 宿主事件处理器里抛出的错误会把整个宿主进程带下来,官方件也不替生产者兜——取消链在两层各兜一次,每层各有一条用例钉着 |
196
197
 
197
198
  ## <img src="https://api.iconify.design/lucide/lock.svg?color=%23658EFF&height=22" height="22" width="22" align="absmiddle" alt="" /> 数据与隐私
@@ -209,7 +210,7 @@ npm i -g @alibaba-group/open-code-review@1.13.3 # 钉在本包核对的那
209
210
  - **读版本要起一次进程**,页面渲染绝不触发;卡片只显示最近一次测量或什么都不显示——渲染一页装不了、更不了、也探不了任何东西。
210
211
  - **原子写的锁超时以英文出现。** 争用超过官方等待上限时抛的是官方件自己的超时文本——这是本包唯一一条绕过双语消息表的用户可见错误。
211
212
  - **`partial` 是终态里的成功档。** 部分文件失败但覆盖仍成立、评论仍有效;既不被抬成成功,也不被折进失败。
212
- - **未拥有的后台作业对所有会话可见**(见「后台运行与官方作业」)——随本次换装一并接受,收回它的唯一方式是回滚登记。
213
+ - **无主的后台作业对所有会话可见**(见「后台运行与官方作业」)。解析不到活 Agent 的调用会起这种作业;有主作业则被围栏在自己的会话里。
213
214
 
214
215
  ## <img src="https://api.iconify.design/lucide/circle-help.svg?color=%23658EFF&height=22" height="22" width="22" align="absmiddle" alt="" /> 常见问题
215
216
 
@@ -57,5 +57,6 @@
57
57
  | --- | --- | --- | --- |
58
58
  | `@alibaba-group/open-code-review` | 1.13.3(核对版本,非依赖) | Apache-2.0(Alibaba) | **不在依赖表里**:用户自选 `brew install open-code-review` 或 `npm i -g @alibaba-group/open-code-review@<版本>`,本包只 spawn 它 |
59
59
  | `js-yaml` | ^5.4.3 | MIT | `scripts/get-cred.mjs` 读 dsh 托管凭据文档 |
60
+ | `zod` | catalog(伞根 4.6.7) | MIT | 设置卡 `src/remote.ts` 的 strict codec 形状校验;client 产物由宿主 `PLATFORM_MODULES` 提供 |
60
61
 
61
- dsh 宿主侧的包分两档:产物里以**值**导入、且列在 `peerDependencies` 的四枚(`@deepseek-ai/schemastery` 宿主 fork、`@deepseek-ai/dsh-credentials`、`@deepseek-ai/dsh-home-paths`、`@deepseek-ai/dsh-atomic-write`)由宿主在场提供、不随本包分发;其余 `@deepseek-ai/dsh-*` 与 `@deepseek-ai/cordis` 只在 `devDependencies` 里,用途是把类型绑到官方声明上(type-only 绑定),产物里不留说明符。本包按 dsh `0.2.1-rc.3` 逐条核对过(同版的 cordis `4.0.5` 与 schemastery `3.18.5` fork 一并核对)。
62
+ dsh 宿主侧的包分两档:产物里以**值**导入、且列在 `peerDependencies` 的五枚(`@deepseek-ai/schemastery` 宿主 fork、`@deepseek-ai/dsh-credentials`、`@deepseek-ai/dsh-home-paths`、`@deepseek-ai/dsh-atomic-write` 与 `@deepseek-ai/dsh-typert-protocol`)由宿主在场提供、不随本包分发;其余 `@deepseek-ai/dsh-*` 与 `@deepseek-ai/cordis` 只在 `devDependencies` 里,用途是把类型绑到官方声明上(type-only 绑定),产物里不留说明符。本包按 dsh `0.2.2-alpha.2` 逐条核对过(同版的 cordis `4.0.6-alpha.1` 与 schemastery `3.18.6-alpha.1` fork 一并核对)。