From 58956c1a8a3643677fe2820a8a40f3aee5612b39 Mon Sep 17 00:00:00 2001
From: Tianyi Cui <53024+tianyicui@users.noreply.github.com>
Date: Wed, 9 Sep 2026 22:01:10 +0800
Subject: [PATCH 01/19] Revert "feat(web): preview Mermaid, Graphviz, SVG, and
HTML code fences"
---
...9-content-sized-diagram-previews.i18n.yaml | 6 -
...26-09-09-content-sized-diagram-previews.md | 25 -
...09-09-content-sized-diagram-previews.zh.md | 25 -
...6-09-09-markdown-static-previews.i18n.yaml | 6 -
.../2026-09-09-markdown-static-previews.md | 43 --
.../2026-09-09-markdown-static-previews.zh.md | 43 --
THIRD_PARTY_NOTICES.md | 6 +-
.../expected/markdown-mermaid/ui.expected.md | 24 -
.../expected/markdown-mermaid/zh.expected.md | 23 -
apps/web/tests/markdown-mermaid.e2e.ts | 320 --------
apps/web/tsconfig.json | 1 -
apps/web/vite.config.ts | 16 +-
packages/client/locale/src/locales/en.ts | 10 -
packages/client/locale/src/locales/zh.ts | 10 -
packages/client/ui-chat/README.i18n.yaml | 4 +-
packages/client/ui-chat/README.md | 8 -
packages/client/ui-chat/README.zh.md | 8 -
.../ui-chat/src/client/markdown-labels.ts | 13 -
.../client/ui-primitives/README.i18n.yaml | 4 +-
packages/client/ui-primitives/README.md | 10 -
packages/client/ui-primitives/README.zh.md | 10 -
.../THIRD_PARTY_PREVIEW_NOTICES.txt | 688 ------------------
packages/client/ui-primitives/package.json | 6 +-
.../src/markdown/CodeBlock.module.css | 84 ---
.../ui-primitives/src/markdown/CodeBlock.tsx | 53 +-
.../src/markdown/SourcePreview.module.css | 35 -
.../src/markdown/SourcePreview.tsx | 71 --
.../ui-primitives/src/markdown/graphviz.ts | 37 -
.../ui-primitives/src/markdown/mermaid.ts | 97 ---
.../src/markdown/preview-document.ts | 44 --
.../src/markdown/preview-theme.ts | 27 -
.../ui-primitives/src/markdown/render.tsx | 30 -
.../tests/code-block.client.spec.tsx | 2 +-
.../tests/fence-previews.client.spec.tsx | 126 ----
.../tests/graphviz-runtime.client.spec.ts | 67 --
.../tests/mermaid-runtime.client.spec.ts | 133 ----
.../tests/source-preview.client.spec.tsx | 162 -----
pnpm-lock.yaml | 14 -
scripts/check-workspace-constraints.spec.ts | 14 -
scripts/check-workspace-constraints.ts | 2 +-
scripts/gen-third-party-notices.spec.ts | 24 -
scripts/gen-third-party-notices.ts | 34 -
tsconfig.host.json | 1 -
43 files changed, 20 insertions(+), 2346 deletions(-)
delete mode 100644 .agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.i18n.yaml
delete mode 100644 .agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.md
delete mode 100644 .agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.zh.md
delete mode 100644 .agents/notes/implemented/feature/2026-09-09-markdown-static-previews.i18n.yaml
delete mode 100644 .agents/notes/implemented/feature/2026-09-09-markdown-static-previews.md
delete mode 100644 .agents/notes/implemented/feature/2026-09-09-markdown-static-previews.zh.md
delete mode 100644 apps/web/tests/expected/markdown-mermaid/ui.expected.md
delete mode 100644 apps/web/tests/expected/markdown-mermaid/zh.expected.md
delete mode 100644 apps/web/tests/markdown-mermaid.e2e.ts
delete mode 100644 packages/client/ui-primitives/THIRD_PARTY_PREVIEW_NOTICES.txt
delete mode 100644 packages/client/ui-primitives/src/markdown/SourcePreview.module.css
delete mode 100644 packages/client/ui-primitives/src/markdown/SourcePreview.tsx
delete mode 100644 packages/client/ui-primitives/src/markdown/graphviz.ts
delete mode 100644 packages/client/ui-primitives/src/markdown/mermaid.ts
delete mode 100644 packages/client/ui-primitives/src/markdown/preview-document.ts
delete mode 100644 packages/client/ui-primitives/src/markdown/preview-theme.ts
delete mode 100644 packages/client/ui-primitives/tests/fence-previews.client.spec.tsx
delete mode 100644 packages/client/ui-primitives/tests/graphviz-runtime.client.spec.ts
delete mode 100644 packages/client/ui-primitives/tests/mermaid-runtime.client.spec.ts
delete mode 100644 packages/client/ui-primitives/tests/source-preview.client.spec.tsx
diff --git a/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.i18n.yaml
deleted file mode 100644
index be4173fd02..0000000000
--- a/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.i18n.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
-# side as of the last confirmed-consistent state. Both languages carry equal authority;
-# after editing either side, bring the other along and re-record with:
-# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.md
-2026-09-09-content-sized-diagram-previews.md: ceb29238eec09f2dde312835dbf376855998a507
-2026-09-09-content-sized-diagram-previews.zh.md: 2689602bfe3469f53e532367877f7e49d52d3d5d
diff --git a/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.md b/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.md
deleted file mode 100644
index ceb29238ee..0000000000
--- a/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Agent Note: Content-sized diagram previews
-
-Status: implemented
-
-English | [中文](2026-09-09-content-sized-diagram-previews.zh.md)
-
-## Problem
-
-Short Graphviz and SVG images leave large empty regions when displayed inside 400px frames. A 59px Graphviz diagram occupies a 400px preview even though its rendered dimensions are already available to the browser.
-
-## Decision
-
-Mermaid, Graphviz, and SVG share the inert image canvas in `SourcePreview`. The browser derives its height from the image, preserves aspect ratio when shrinking to the available width, and adds 16px padding. Source switching retains the image and copying reads the original code. Theme changes regenerate Graphviz colors without introducing a separate sizing observer.
-
-This replaces the diagram-frame choice in [Static Markdown fence previews](../feature/2026-09-09-markdown-static-previews.md); that note continues to own HTML isolation, rendering lifecycle, and license obligations. HTML retains its opaque, script-free, 400px frame. SVG image mode disables scripts, link interaction, and external resource loading without inserting source-controlled markup into the application document.
-
-## Alternatives considered
-
-**Set iframe height to auto.** An iframe does not derive its outer height from its inner document. This still reserves an unrelated viewport.
-
-**Add a frame measurement script or same-origin access.** A diagram already has image dimensions. Extra execution or origin permissions and resize messaging are unnecessary for that content.
-
-## Consequences
-
-Short diagrams occupy only their rendered height and canvas padding. The browser geometry regression compares image and container height in light and dark modes, then verifies proportional scaling in a narrow viewport. Browser security checks include SVG scripts, event handlers, nested HTML, and external images; copy and source toggling remain covered. HTML automatic height remains outside this change because arbitrary document layout has different measurement and isolation requirements.
diff --git a/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.zh.md b/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.zh.md
deleted file mode 100644
index 2689602bfe..0000000000
--- a/.agents/notes/implemented/bug-fix/2026-09-09-content-sized-diagram-previews.zh.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Agent Note: 按内容定高的图表预览
-
-Status: implemented
-
-[English](2026-09-09-content-sized-diagram-previews.md) | 中文
-
-## Problem
-
-较矮的 Graphviz 与 SVG 图片显示在 400px iframe 中时,会留下大块空白。浏览器已经知道图片的渲染尺寸,但一张 59px 高的 Graphviz 图表仍占据 400px 的预览区域。
-
-## Decision
-
-Mermaid、Graphviz 与 SVG 共享 `SourcePreview` 的不可执行图片画布。浏览器根据图片决定高度,在可用宽度不足时按比例缩小,并添加 16px 内边距。源码切换保留图片,复制读取原始代码。主题变化重新生成 Graphviz 配色,无需单独的尺寸观察器。
-
-这替代了[静态 Markdown fence 预览](../feature/2026-09-09-markdown-static-previews.zh.md)中的图表 iframe 选择;该记录继续维护 HTML 隔离、渲染生命周期与许可证义务。HTML 保留不透明来源、禁用脚本的 400px iframe。SVG 图片模式禁用脚本、链接交互与外部资源加载,无需把源码控制的标记插入应用文档。
-
-## Alternatives considered
-
-**把 iframe 高度设为 auto。** iframe 不会根据内部文档决定外部高度,仍然会保留与内容无关的视口。
-
-**添加 iframe 测量脚本或同源访问。** 图表已经具备图片尺寸,不需要额外执行权限、来源权限或尺寸消息协议。
-
-## Consequences
-
-较矮图表只占据渲染高度与画布内边距。浏览器几何回归用例在浅色和深色下比较图片与容器高度,再验证窄视口中的等比例缩放。浏览器安全检查包含 SVG 脚本、事件处理器、嵌套 HTML 与外部图片,并保留复制和源码切换覆盖。HTML 自动高度不属于本次改动,因为任意文档布局具有不同的测量与隔离要求。
diff --git a/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.i18n.yaml b/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.i18n.yaml
deleted file mode 100644
index 8a24afcd59..0000000000
--- a/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.i18n.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
-# side as of the last confirmed-consistent state. Both languages carry equal authority;
-# after editing either side, bring the other along and re-record with:
-# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-09-09-markdown-static-previews.md
-2026-09-09-markdown-static-previews.md: f3a0363e3d7c4cb19ca67dfc5011e936f7c024cf
-2026-09-09-markdown-static-previews.zh.md: 24f87cd73504c1fbd274e1420a3692b3ca55ed5e
diff --git a/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.md b/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.md
deleted file mode 100644
index f3a0363e3d..0000000000
--- a/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Agent Note: Static Markdown fence previews
-
-Status: implemented
-
-English | [中文](2026-09-09-markdown-static-previews.zh.md)
-
-## Problem
-
-Readers need to see Mermaid and DOT diagrams, SVG artwork, and HTML examples directly in Assistant replies without interpreting source or copying it to another renderer. These sources are untrusted, and a renderer's npm license field may omit compiled components with separate distribution obligations.
-
-## Decision
-
-The shared Markdown renderer enables settled `mermaid`, `graphviz`/`dot`, `svg`, and `html` fences through localized `MarkdownLabels.preview` and the parsed fence language. The [UI primitives package](../../../../packages/client/ui-primitives/README.md) owns `SourcePreview`, which accepts a renderer, source, and labels without Session, file, or Cordis dependencies. Mermaid and Graphviz each supply a `.ts` renderer to that same component. Consumers without preview labels and streaming messages retain code.
-
-`CodeBlock.preview` owns default visualization, source switching, and verbatim copying. Previews omit the language banner and expose compact icon actions on hover or keyboard focus; devices with any touch input keep actions visible below the diagram. Switching to source hides the mounted preview, preserving completed rendering and pending work. Both views use the same focused toggle button, and copying always reads the source prop.
-
-`SourcePreview` owns loading, failure, and cancellation of stale result publication. Source replacement and unmounting cancel publication; cancellation before runtime loading completes skips layout. Failures show a localized error and the original source, and replacing invalid source with valid input recovers the preview.
-
-Mermaid loads on demand. A shared queue serializes theme initialization with diagram work, and each call removes its temporary measurement DOM in `finally`. Strict security, disabled HTML labels, the application palette, and error-rendering policy cannot be overridden by diagram configuration. Generated SVG is displayed as an image without installing links or scripts. Intrinsic dimensions come from the SVG viewBox; large diagrams shrink to fit, and the canvas follows the code-block background. Mounted previews observe document theme attributes and regenerate only when resolved colors change; obsolete renders cannot publish. Graphviz default colors follow the same palette, while authored DOT, SVG, and HTML colors remain intact.
-
-HTML uses DOMPurify with navigation attributes and document-loading elements forbidden, followed by an opaque `sandbox=""` iframe. A trusted CSP precedes source markup and permits only inline CSS, data images, and data fonts. Scripts, external resources, child frames, form submission, and same-origin access are unavailable. SVG is parsed as XML and displayed with Graphviz output as inert images in a [content-sized canvas](../bug-fix/2026-09-09-content-sized-diagram-previews.md), so SVG scripts and links never become active. HTML frames have a fixed scrollable viewport: measuring their content would require additional origin access or trusted frame scripts.
-
-Graphviz uses the pinned, unmodified `@viz-js/viz` 3.30.0 WebAssembly distribution with the `dot` layout engine. Its npm MIT declaration covers the wrapper; its build provenance identifies Graphviz 16.0.0 (EPL-2.0), Expat 2.8.4 (MIT), and Emscripten 5.0.7 (MIT/NCSA). Distribution retains these component terms and the exact Graphviz source download under EPL-2.0 section 3.1. [Full preview notices](../../../../packages/client/ui-primitives/THIRD_PARTY_PREVIEW_NOTICES.txt) also retain Mermaid's MIT text and select Apache-2.0 for DOMPurify. The UI primitives package ships the notices and the Web build emits the same bytes alongside its assets. License review covers embedded payloads separately from the general permissive npm-metadata policy.
-
-## Alternatives considered
-
-**Keep the code banner above diagrams.** A language label and permanent text controls distract from the diagram. Overlay actions retain source access without reserving a title row.
-
-**Render each streamed chunk.** Incomplete diagrams are frequently invalid, and repeated layout work competes with text streaming. Message settlement provides complete source.
-
-**Put rendering inside Chat or add a general preview registry.** A shared primitive with plain props satisfies reuse without another registry or feature-plugin dependency. This follows the [shared-control rule](../architecture/2026-09-05-shared-client-control-primitives.md).
-
-**Execute HTML scripts in a frame.** Static chat examples do not need script execution. An empty sandbox plus sanitization and CSP gives the preview fewer capabilities and avoids introducing a frame messaging protocol.
-
-**Insert rendered markup into Chat.** The requested preview needs diagram display and source access; HTML styles and executable SVG would share the application document. Iframes isolate layout and origin; SVG image mode additionally disables SVG behavior.
-
-**Treat Viz.js as MIT-only or use a remote Graphviz service.** The compiled Graphviz license still applies locally; a remote renderer would send conversation content off-device. The bundled renderer retains source availability and legal notices without network rendering.
-
-## Consequences
-
-The feature changes presentation without changing persisted messages, provider requests, tools, or Host APIs. Inline HTML styles work, while interactive scripts, external assets, and links do not. Mermaid and Graphviz add lazy browser assets and run layout on the browser thread. Cancellation cannot preempt active layout; Mermaid finishes and releases its measurement DOM even when its result cannot be published. The previews have no editing, export, zoom controls, or interactive diagram links.
-
-Component tests cover source copying, default preview, delayed completion, stale success and failure, unmounting, fallback, cancellation, runtime loading failure, and recovery. The keyless [browser scenario](../../../../apps/web/tests/markdown-mermaid.e2e.ts) verifies Chinese Mermaid flowcharts, sequence diagrams, malformed source, configuration overrides, opaque frames, real image decoding, source toggling, blocked script/navigation/resource attempts, English/Chinese UI snapshots, and served license text. Notices checks pin the reviewed wrapper and native provenance so upgrades require renewed review.
diff --git a/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.zh.md b/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.zh.md
deleted file mode 100644
index 24f87cd735..0000000000
--- a/.agents/notes/implemented/feature/2026-09-09-markdown-static-previews.zh.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Agent Note: 静态 Markdown fence 预览
-
-Status: implemented
-
-[English](2026-09-09-markdown-static-previews.md) | 中文
-
-## Problem
-
-读者需要直接在 Assistant 回复中查看 Mermaid 和 DOT 图表、SVG 图像和 HTML 示例,而不必解读源码或复制到其他渲染器。这些源码不可信,而渲染器的 npm 许可证字段可能遗漏编译组件各自的分发义务。
-
-## Decision
-
-共享 Markdown 渲染器通过本地化的 `MarkdownLabels.preview` 和解析后的 fence 语言启用定稿后的 `mermaid`、`graphviz`/`dot`、`svg` 和 `html` fence。[UI primitives 包](../../../../packages/client/ui-primitives/README.zh.md)拥有 `SourcePreview`,它接收渲染器、源码和文案,不依赖 Session、文件或 Cordis。Mermaid 与 Graphviz 各自向同一组件提供 `.ts` 渲染器。未提供预览文案的调用方与流式消息保留代码显示。
-
-`CodeBlock.preview` 负责默认可视化、源码切换与原样复制。预览省略语言横幅,在悬停或键盘聚焦时显示紧凑的图标操作;具有任何触控输入的设备始终在图表下方显示操作。切换到源码会隐藏已挂载的预览,保留完成的渲染和待完成的工作。两种视图使用同一个保持焦点的切换按钮,复制始终读取源码属性。
-
-`SourcePreview` 负责加载、失败和取消过期结果发布。替换源码和卸载组件会取消结果发布;在运行时加载完成前取消会跳过布局。失败时显示本地化错误与原始源码,用有效输入替换无效源码后可以恢复预览。
-
-Mermaid 按需加载。共享队列将主题初始化与图表渲染一起串行执行,每次调用都在 `finally` 中删除临时测量 DOM。图表配置无法覆盖严格安全模式、禁用 HTML 标签、应用配色和错误渲染策略。生成的 SVG 作为图片显示,不安装链接或脚本。固有尺寸来自 SVG viewBox;大图缩小以适应宽度,画布使用代码块背景。已挂载的预览观察文档主题属性,仅在解析后的配色变化时重新生成;过期渲染不能发布结果。Graphviz 的默认颜色采用同一配色,DOT、SVG 和 HTML 中明确指定的颜色保持原样。
-
-HTML 先由 DOMPurify 清理,禁止导航属性与文档加载元素,再进入不透明来源的 `sandbox=""` iframe。可信 CSP 位于源码标记之前,仅允许内联 CSS、data 图片与 data 字体。脚本、外部资源、子 iframe、表单提交与同源访问均不可用。SVG 按 XML 解析后,与 Graphviz 输出一同作为不可执行图片显示在[按内容定高的画布](../bug-fix/2026-09-09-content-sized-diagram-previews.zh.md)中,因此 SVG 脚本与链接不会激活。HTML iframe 使用固定的可滚动视口:测量内容需要额外的来源访问权限或可信 iframe 脚本。
-
-Graphviz 使用固定且未修改的 `@viz-js/viz` 3.30.0 WebAssembly 发布包,布局引擎为 `dot`。其 npm MIT 声明覆盖包装层;构建来源记录标明 Graphviz 16.0.0(EPL-2.0)、Expat 2.8.4(MIT)与 Emscripten 5.0.7(MIT/NCSA)。分发保留各组件条款,并按 EPL-2.0 第 3.1 节提供准确的 Graphviz 源码下载地址。[完整预览声明](../../../../packages/client/ui-primitives/THIRD_PARTY_PREVIEW_NOTICES.txt)还保留 Mermaid 的 MIT 文本,并为 DOMPurify 选择 Apache-2.0。UI primitives 包携带该声明,Web 构建在资源旁输出相同字节。内嵌产物的许可证检查独立于通用的宽松 npm 元数据策略。
-
-## Alternatives considered
-
-**在图表上方保留代码横幅。** 语言标签和常驻文字控件会分散对图表的注意力。浮层操作保留源码访问,不占用标题行。
-
-**渲染每个流式片段。** 未完成的图表通常无效,反复布局会与文本流式输出争用资源。消息定稿可提供完整源码。
-
-**在 Chat 内部渲染,或添加通用预览注册表。** 使用普通属性的共享基础组件即可满足复用,无需另加注册表或功能插件依赖。这遵循[共享控件规则](../architecture/2026-09-05-shared-client-control-primitives.zh.md)。
-
-**在 iframe 内执行 HTML 脚本。** 静态聊天示例不需要脚本执行。空 sandbox、清理与 CSP 降低预览权限,也避免引入 iframe 消息协议。
-
-**把渲染标记插入 Chat。** 所需预览只需显示图表和访问源码;HTML 样式和可执行 SVG 会与应用共享文档。iframe 隔离布局与来源,SVG 图片模式额外禁用 SVG 行为。
-
-**将 Viz.js 视为仅使用 MIT,或使用远程 Graphviz 服务。** 本地编译的 Graphviz 仍受其许可证约束;远程渲染会把对话内容发送到设备之外。内置渲染器保留源码可获取性与法律声明,无需网络渲染。
-
-## Consequences
-
-该功能改变呈现,不改变持久化消息、provider 请求、工具或 Host API。HTML 内联样式可用,交互脚本、外部资源和链接不可用。Mermaid 和 Graphviz 增加按需加载的浏览器资源,并在浏览器线程上执行布局。取消无法抢占进行中的布局;即使结果无法发布,Mermaid 仍会完成并释放测量 DOM。预览不提供编辑、导出、缩放控件或交互式图表链接。
-
-组件测试覆盖源码复制、默认预览、延迟完成、过期成功与失败、卸载、回退、取消、运行时加载失败与恢复。无密钥[浏览器场景](../../../../apps/web/tests/markdown-mermaid.e2e.ts)验证中文 Mermaid 流程图、时序图、无效源码、配置覆盖、不透明来源 iframe、真实图片解码、源码切换、脚本/导航/资源请求被阻止、中英文 UI 快照和已提供的许可证文本。声明检查固定已审查的包装层与原生构建来源,升级时须重新审查。
diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md
index 2452325d62..31eebdab8d 100644
--- a/THIRD_PARTY_NOTICES.md
+++ b/THIRD_PARTY_NOTICES.md
@@ -55,7 +55,6 @@ External packages installed for runtime use or distributed inside the prebuilt b
| [`@shikijs/langs`](https://github.com/shikijs/shiki) | MIT |
| [`@standard-schema/spec`](https://github.com/standard-schema/standard-schema) | MIT |
| [`@tanstack/react-virtual`](https://github.com/TanStack/virtual) | MIT |
-| [`@viz-js/viz`](https://github.com/mdaines/viz-js) | MIT |
| [`@vscode/ripgrep`](https://github.com/microsoft/vscode-ripgrep) | MIT |
| [`@xterm/headless`](https://github.com/xtermjs/xterm.js) | MIT |
| [`@yarnpkg/parsers`](https://github.com/yarnpkg/berry) | BSD-2-Clause |
@@ -67,7 +66,6 @@ External packages installed for runtime use or distributed inside the prebuilt b
| [`commander`](https://github.com/tj/commander.js) | MIT |
| [`compression`](https://github.com/expressjs/compression) | MIT |
| [`diff`](https://github.com/kpdecker/jsdiff) | BSD-3-Clause |
-| [`dompurify`](https://github.com/cure53/DOMPurify) | (MPL-2.0 OR Apache-2.0) |
| [`e2b`](https://github.com/e2b-dev/e2b) | MIT |
| [`electron-updater`](https://github.com/electron-userland/electron-builder) | MIT |
| [`eventsource-parser`](https://github.com/rexxars/eventsource-parser) | MIT |
@@ -81,7 +79,6 @@ External packages installed for runtime use or distributed inside the prebuilt b
| [`mdast-util-from-markdown`](https://github.com/syntax-tree/mdast-util-from-markdown) | MIT |
| [`mdast-util-gfm`](https://github.com/syntax-tree/mdast-util-gfm) | MIT |
| [`mdast-util-math`](https://github.com/syntax-tree/mdast-util-math) | MIT |
-| [`mermaid`](https://github.com/mermaid-js/mermaid) | MIT |
| [`micromark-core-commonmark`](https://github.com/micromark/micromark/tree/main/packages/micromark-core-commonmark) | MIT |
| [`micromark-extension-gfm`](https://github.com/micromark/micromark-extension-gfm) | MIT |
| [`micromark-extension-math`](https://github.com/micromark/micromark-extension-math) | MIT |
@@ -115,8 +112,6 @@ External packages installed for runtime use or distributed inside the prebuilt b
| [`zod`](https://github.com/colinhacks/zod) | MIT |
| [`zustand`](https://github.com/pmndrs/zustand) | MIT |
-The Markdown preview distribution also contains Graphviz 16.0.0 (EPL-2.0), Expat 2.8.4 (MIT), and Emscripten 5.0.7 runtime code (MIT/NCSA) inside `@viz-js/viz` 3.30.0. The wrapper's MIT metadata does not relicense these components. [Preview notices](packages/client/ui-primitives/THIRD_PARTY_PREVIEW_NOTICES.txt) preserve their full license texts and Graphviz source availability, together with Mermaid's MIT and DOMPurify's selected Apache-2.0 terms. The UI primitives npm package includes this file; the Web build emits it as `preview-third-party-notices.txt`.
-
pnpm applies local patches to the following packages at install time, so shipped artifacts carry modified copies; each patch file is the complete record of the modification:
- `@yao-pkg/pkg@6.21.0` — [`patches/@yao-pkg__pkg@6.21.0.patch`](patches/@yao-pkg__pkg@6.21.0.patch)
@@ -194,6 +189,7 @@ External packages **directly declared** for development, tests, types, or toolin
| [`jsdom`](https://github.com/jsdom/jsdom) | MIT |
| [`lefthook`](https://github.com/evilmartians/lefthook) | MIT |
| [`lightningcss`](https://github.com/parcel-bundler/lightningcss) | MPL-2.0 |
+| [`mermaid`](https://github.com/mermaid-js/mermaid) | MIT |
| [`micromark-util-types`](https://github.com/micromark/micromark/tree/main/packages/micromark-util-types) | MIT |
| [`msgpackr`](http://github.com/kriszyp/msgpackr) | MIT |
| [`oxlint`](https://github.com/oxc-project/oxc) | MIT |
diff --git a/apps/web/tests/expected/markdown-mermaid/ui.expected.md b/apps/web/tests/expected/markdown-mermaid/ui.expected.md
deleted file mode 100644
index 985f68fee0..0000000000
--- a/apps/web/tests/expected/markdown-mermaid/ui.expected.md
+++ /dev/null
@@ -1,24 +0,0 @@
-- heading "Mermaid previews" [level=1]
-- button "Source"
-- button "Copy"
-- tooltip "Copy"
-- img "Mermaid diagram"
-- button "Source"
-- button "Copy"
-- img "Mermaid diagram"
-- button "Source"
-- button "Copy"
-- status: Unable to render this diagram. The source is shown below.
-- code: flowchart LR A[unfinished
-- button "Source"
-- button "Copy"
-- img "Mermaid diagram"
-- button "Source"
-- button "Copy"
-- img "Graphviz diagram"
-- button "Source"
-- button "Copy"
-- img "SVG preview"
-- button "Source"
-- button "Copy"
-- iframe
diff --git a/apps/web/tests/expected/markdown-mermaid/zh.expected.md b/apps/web/tests/expected/markdown-mermaid/zh.expected.md
deleted file mode 100644
index 52d7053ded..0000000000
--- a/apps/web/tests/expected/markdown-mermaid/zh.expected.md
+++ /dev/null
@@ -1,23 +0,0 @@
-- heading "Mermaid previews" [level=1]
-- button "源码"
-- button "复制"
-- img "Mermaid 图表"
-- button "源码"
-- button "复制"
-- img "Mermaid 图表"
-- button "源码"
-- button "复制"
-- status: 无法渲染此图表,源码如下。
-- code: flowchart LR A[unfinished
-- button "源码"
-- button "复制"
-- img "Mermaid 图表"
-- button "源码"
-- button "复制"
-- img "Graphviz 图表"
-- button "源码"
-- button "复制"
-- img "SVG 预览"
-- button "源码"
-- button "复制"
-- iframe
diff --git a/apps/web/tests/markdown-mermaid.e2e.ts b/apps/web/tests/markdown-mermaid.e2e.ts
deleted file mode 100644
index 95249740bf..0000000000
--- a/apps/web/tests/markdown-mermaid.e2e.ts
+++ /dev/null
@@ -1,320 +0,0 @@
-import { fileURLToPath } from 'node:url'
-import { join } from 'node:path'
-import type { Browser, Page } from 'playwright'
-import { chromium } from 'playwright'
-import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest'
-import { createMessage, createUserMessage } from '@deepseek-ai/dsh-llm'
-import { SESSION_FORMAT_VERSION, Session, SessionId } from '@deepseek-ai/dsh-session'
-import type {} from '@deepseek-ai/dsh-session-title'
-import {
- assertFixtureInventory, captureStableAria, compareOrRefreshGolden, launchWebScaffold,
- seedSession, watchConsole, webSnapshotMode, type WebScaffold,
-} from './scaffold.ts'
-import { newEnglishPage, saveFailureShot } from './support.ts'
-
-const SNAPSHOT_DIR = fileURLToPath(new URL('./expected/markdown-mermaid', import.meta.url))
-const MODE = webSnapshotMode()
-const SEED_ID = 'markdown-mermaid-web-e2e'
-const DIAGRAM_MESSAGE = '[class*="markdown"]:has(.md-code-block)'
-const FLOW = 'flowchart LR\n A[输入] --> B[共享渲染器] --> C[图形预览]'
-const SEQUENCE = 'sequenceDiagram\n participant U as User\n participant R as Renderer\n U->>R: Mermaid source\n R-->>U: Diagram'
-const INVALID = 'flowchart LR\n A[unfinished'
-const UNTRUSTED = [
- '%%{init: {"securityLevel":"loose","htmlLabels":true,"themeCSS":"body {display:none!important}"}}%%',
- 'flowchart LR',
- ' A[""] --> B[Safe]',
- ' click B "javascript:alert(1)"',
-].join('\n')
-
-const DOT = 'digraph { rankdir=LR; Input -> Preview }'
-const SVG = ``
-const HTML = `
; trimmed is the
+ typed fallback if the DOM shape ever diverges. */
+ const text = rootRef.current?.querySelector('pre')?.textContent ?? trimmed
+ void writeClipboard(text).then((ok) => {
if (!ok) return
setCopied(true)
window.setTimeout(() => { setCopied(false) }, 1000)
@@ -175,22 +171,8 @@ export function CodeBlock({ code, lang, streaming, className, lineNumbers = fals
)
- const copyActionLabel = copied ? copiedLabel : copyLabel
- const copyAction = (
-
- )
-
return (
-
{/* The attribute carries no style here; owner stylesheets use it to pin the banner (sidebar code preview, horizontal scroll). */}
- {!previewAvailable && {lang ?? ''}}
+ {lang ?? ''}
- {previewAvailable && (
-
-
-
- )}
- {previewAvailable
- ? {copyAction}
- : copyAction}
+
- {previewAvailable && {preview.content}}
- {!showingPreview && body}
+ {body}
)
}
diff --git a/packages/client/ui-primitives/src/markdown/SourcePreview.module.css b/packages/client/ui-primitives/src/markdown/SourcePreview.module.css
deleted file mode 100644
index 46a674ed0a..0000000000
--- a/packages/client/ui-primitives/src/markdown/SourcePreview.module.css
+++ /dev/null
@@ -1,35 +0,0 @@
-.canvas {
- overflow: auto;
- padding: 16px;
- background: var(--dsw-alias-markdown-code-block);
- border-radius: 12px;
-}
-
-.diagram {
- display: block;
- max-width: 100%;
- height: auto;
- margin: 0 auto;
-}
-
-.status {
- padding: 16px;
- color: var(--dsw-alias-label-secondary);
-}
-
-.staging {
- position: fixed;
- top: 0;
- left: -100000px;
- visibility: hidden;
- pointer-events: none;
-}
-
-.frame {
- display: block;
- width: 100%;
- height: 400px;
- border: 0;
- border-radius: 12px;
- background: var(--dsw-alias-markdown-code-block);
-}
diff --git a/packages/client/ui-primitives/src/markdown/SourcePreview.tsx b/packages/client/ui-primitives/src/markdown/SourcePreview.tsx
deleted file mode 100644
index 3ce07fb34d..0000000000
--- a/packages/client/ui-primitives/src/markdown/SourcePreview.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-/** Read-only diagram preview with source fallback and per-source async ownership. */
-
-import { useEffect, useState } from 'react'
-import css from './SourcePreview.module.css'
-import { readPreviewTheme } from './preview-theme.ts'
-
-/** Localized preview states; the diagram source remains verbatim. */
-export interface PreviewLabels {
- diagram: string
- loading: string
- error: string
-}
-
-type Result = { kind: 'ok'; code: string; src: string } | { kind: 'error'; code: string }
-
-/* v8 ignore next 3 -- closed-union backstop; only reached if a result is forged */
-function assertNever(value: never): never {
- throw new Error(`unreachable preview result: ${String(value)}`)
-}
-
-/**
- * Display a complete document or diagram, retaining the source when rendering fails.
- * @param props - Source and complete localized labels. Source and document theme changes cancel obsolete renders.
- * @returns A loading status, an inert image or sandboxed document, or an error with the original source.
- */
-export function SourcePreview({ code, labels, render, document: isDocument = false }: {
- code: string
- labels: PreviewLabels
- render: (code: string, signal: AbortSignal) => string | Promise
- document?: boolean
-}) {
- const [result, setResult] = useState(null)
- useEffect(() => {
- let controller: AbortController | undefined
- let palette: string | undefined
- const update = () => {
- const next = JSON.stringify(readPreviewTheme())
- if (next === palette) return
- palette = next
- controller?.abort()
- const current = new AbortController()
- controller = current
- void (async () => await render(code, current.signal))().then(
- (src) => { if (!current.signal.aborted) setResult({ kind: 'ok', code, src }) },
- () => { if (!current.signal.aborted) setResult({ kind: 'error', code }) },
- )
- }
- // Isolated image/frame documents cannot inherit the host's CSS variables.
- const observer = new MutationObserver(update)
- observer.observe(document.documentElement, { attributes: true, attributeFilter: ['style'] })
- observer.observe(document.body, { attributes: true, attributeFilter: ['style', 'data-ds-dark-theme'] })
- update()
- return () => { observer.disconnect(); controller?.abort() }
- }, [code, render])
-
- if (result?.code !== code) return {labels.loading}
- switch (result.kind) {
- case 'ok':
- if (isDocument) return
- return
- case 'error':
- return (
-
- {labels.error}
- {code}
-
- )
- /* v8 ignore next -- closed-union backstop; only reached if a result is forged */
- default: return assertNever(result)
- }
-}
diff --git a/packages/client/ui-primitives/src/markdown/graphviz.ts b/packages/client/ui-primitives/src/markdown/graphviz.ts
deleted file mode 100644
index 766fe0633c..0000000000
--- a/packages/client/ui-primitives/src/markdown/graphviz.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/** Lazy Graphviz WebAssembly layout; generated SVG is displayed only as an inert image. */
-
-import type { instance, RenderOptions } from '@viz-js/viz'
-import { renderSvg } from './preview-document.ts'
-import { readPreviewTheme } from './preview-theme.ts'
-
-let runtime: ReturnType | undefined
-
-/**
- * Render Graphviz DOT with document-theme defaults; authored attributes override those defaults.
- * @param code - Complete Graphviz DOT source.
- * @param signal - Cancels work waiting for the runtime; synchronous layout cannot be interrupted.
- * @param options - Native overrides; attribute maps merge over theme defaults and output remains SVG regardless of format.
- * @returns An SVG image data URL. Import, layout, invalid source, and cancellation failures reject.
- */
-export async function renderGraphviz(code: string, signal: AbortSignal, options?: RenderOptions): Promise {
- runtime ??= import('@viz-js/viz').then(module => module.instance()).catch((error: unknown) => {
- runtime = undefined
- throw error
- })
- const viz = await runtime
- signal.throwIfAborted()
- const palette = readPreviewTheme()
- const color = (value: string): string => value.replace(
- /^rgb\(\s*(\d+)[, ]+\s*(\d+)[, ]+\s*(\d+)\s*\)$/,
- (_match, r: string, g: string, b: string) => `#${[r, g, b].map(channel => Number(channel).toString(16).padStart(2, '0')).join('')}`,
- )
- return renderSvg(viz.renderString(code, {
- engine: 'dot', ...options, format: 'svg',
- graphAttributes: { bgcolor: 'transparent', fontcolor: color(palette.text), ...options?.graphAttributes },
- nodeAttributes: {
- color: color(palette.border), fontcolor: color(palette.text), fillcolor: color(palette.surface), style: 'filled',
- ...options?.nodeAttributes,
- },
- edgeAttributes: { color: color(palette.line), fontcolor: color(palette.text), ...options?.edgeAttributes },
- }), signal)
-}
diff --git a/packages/client/ui-primitives/src/markdown/mermaid.ts b/packages/client/ui-primitives/src/markdown/mermaid.ts
deleted file mode 100644
index 9d7b8c721e..0000000000
--- a/packages/client/ui-primitives/src/markdown/mermaid.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-/** Lazy Mermaid runtime; each render owns and removes its temporary measurement DOM. */
-
-import type { Mermaid, MermaidConfig } from 'mermaid'
-import clsx from 'clsx'
-import css from './SourcePreview.module.css'
-import { readPreviewTheme } from './preview-theme.ts'
-
-let runtime: Promise | undefined
-let nextDiagramId = 0
-let pending: Promise = Promise.resolve()
-
-function loadMermaid(): Promise {
- runtime ??= import('mermaid').then(({ default: mermaid }) => mermaid).catch((error: unknown) => {
- runtime = undefined
- throw error
- })
- return runtime
-}
-
-function initialize(mermaid: Mermaid, config: MermaidConfig | undefined): void {
- const palette = readPreviewTheme()
- mermaid.initialize({
- theme: 'base',
- ...config,
- startOnLoad: false,
- securityLevel: 'strict',
- suppressErrorRendering: true,
- themeVariables: {
- darkMode: palette.dark,
- background: palette.background,
- primaryColor: palette.surface,
- primaryTextColor: palette.text,
- primaryBorderColor: palette.border,
- secondaryColor: palette.surface,
- tertiaryColor: palette.surface,
- lineColor: palette.line,
- textColor: palette.text,
- actorBkg: palette.surface,
- actorBorder: palette.border,
- actorTextColor: palette.text,
- actorLineColor: palette.border,
- signalColor: palette.line,
- signalTextColor: palette.text,
- labelBoxBkgColor: palette.surface,
- labelTextColor: palette.text,
- edgeLabelBackground: palette.background,
- ...config?.themeVariables as Record | undefined,
- },
- htmlLabels: false,
- // Mermaid still accepts this legacy override alongside the global HTML-label setting.
- // oxlint-disable-next-line typescript/no-deprecated
- flowchart: { ...config?.flowchart, htmlLabels: false },
- secure: [
- 'secure', 'securityLevel', 'startOnLoad', 'maxTextSize', 'maxEdges',
- 'suppressErrorRendering', 'theme', 'themeVariables', 'themeCSS', 'htmlLabels', 'flowchart',
- ...(config?.secure ?? []),
- ],
- })
-}
-
-/**
- * Render untrusted diagram source using the document palette, without installing SVG or link handlers in the UI.
- * @param code - Complete Mermaid source.
- * @param signal - Cancels work waiting for the runtime; an active Mermaid render finishes before cleanup.
- * @param config - Native overrides of theme defaults; strict security, manual rendering, and disabled HTML labels remain fixed.
- * @returns An SVG data URL. Import, parse, rendering, and cancellation failures reject.
- */
-export async function renderMermaid(code: string, signal: AbortSignal, config?: MermaidConfig): Promise {
- const task = pending.then(() => renderOne(code, signal, config))
- pending = task.catch(() => { /* The caller owns rejection; subsequent diagrams still render. */ })
- return task
-}
-
-async function renderOne(code: string, signal: AbortSignal, config: MermaidConfig | undefined): Promise {
- const mermaid = await loadMermaid()
- signal.throwIfAborted()
- initialize(mermaid, config)
- const stage = document.createElement('div')
- stage.className = clsx(css.staging)
- stage.setAttribute('aria-hidden', 'true')
- document.body.append(stage)
- try {
- // Initialization and rendering share the queue because Mermaid owns global configuration.
- const { svg } = await mermaid.render(`dsh-mermaid-${nextDiagramId++}`, code, stage)
- const root = new DOMParser().parseFromString(svg, 'image/svg+xml').documentElement
- const viewBox = root.getAttribute('viewBox')
- if (viewBox !== null) {
- // An SVG image needs intrinsic dimensions; Mermaid's percentage width is for inline SVG.
- const [, , width, height] = viewBox.split(/\s+/) as [string, string, string, string]
- root.setAttribute('width', width)
- root.setAttribute('height', height)
- }
- return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(new XMLSerializer().serializeToString(root))}`
- } finally {
- stage.remove()
- }
-}
diff --git a/packages/client/ui-primitives/src/markdown/preview-document.ts b/packages/client/ui-primitives/src/markdown/preview-document.ts
deleted file mode 100644
index f62e227f44..0000000000
--- a/packages/client/ui-primitives/src/markdown/preview-document.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/** Static HTML documents and SVG image URLs without executable source markup. */
-
-import DOMPurify from 'dompurify'
-import { readPreviewTheme } from './preview-theme.ts'
-
-// This policy belongs to the preview document, before any source-controlled markup.
-const CSP = "default-src 'none'; script-src 'none'; style-src 'unsafe-inline'; img-src data:; font-src data:; base-uri 'none'; form-action 'none'"
-
-function documentOf(body: string): string {
- const scheme = readPreviewTheme().dark ? 'dark' : 'light'
- return `${body}`
-}
-
-/**
- * Prepare static HTML for an iframe without scripts, same-origin access, or navigation.
- * @param code - Untrusted HTML document or fragment; inline styles and embedded images are retained.
- * @param signal - Prevents preparation after the preview owner is cancelled.
- * @returns A sanitized srcdoc document. Copying uses the original source, not this document.
- */
-export function renderHtml(code: string, signal: AbortSignal): string {
- signal.throwIfAborted()
- const body = DOMPurify.sanitize(code, {
- WHOLE_DOCUMENT: true,
- FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'base', 'meta', 'link'],
- FORBID_ATTR: ['href', 'xlink:href', 'action', 'formaction', 'target'],
- })
- return documentOf(body)
-}
-
-/**
- * Prepare an SVG image URL without activating SVG scripts, links, or external resources.
- * @param code - Complete SVG XML; malformed XML or a non-SVG root throws.
- * @param signal - Prevents preparation after the preview owner is cancelled.
- * @returns A data URL for an image whose intrinsic dimensions determine the preview height.
- */
-export function renderSvg(code: string, signal: AbortSignal): string {
- signal.throwIfAborted()
- const parsed = new DOMParser().parseFromString(code, 'image/svg+xml')
- if (parsed.querySelector('parsererror') !== null || parsed.documentElement.localName !== 'svg'
- || parsed.documentElement.namespaceURI !== 'http://www.w3.org/2000/svg') {
- throw new Error('Invalid SVG document')
- }
- return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(code)}`
-}
diff --git a/packages/client/ui-primitives/src/markdown/preview-theme.ts b/packages/client/ui-primitives/src/markdown/preview-theme.ts
deleted file mode 100644
index e497e10a80..0000000000
--- a/packages/client/ui-primitives/src/markdown/preview-theme.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-/** Resolved document colors used by isolated diagram renderers. */
-
-interface PreviewTheme {
- dark: boolean
- background: string
- surface: string
- text: string
- line: string
- border: string
-}
-
-/**
- * Read the palette after the application's theme presenter updates the DOM.
- * @returns Semantic preview colors and the resolved browser color scheme.
- */
-export function readPreviewTheme(): PreviewTheme {
- const style = getComputedStyle(document.body)
- const color = (name: string): string => style.getPropertyValue(`--dsw-alias-${name}`).trim()
- return {
- dark: getComputedStyle(document.documentElement).colorScheme === 'dark',
- background: color('markdown-code-block'),
- surface: color('bg-layer-2'),
- text: color('label-primary'),
- line: color('label-secondary'),
- border: color('label-tertiary'),
- }
-}
diff --git a/packages/client/ui-primitives/src/markdown/render.tsx b/packages/client/ui-primitives/src/markdown/render.tsx
index 0f67ce6a7d..4d7805553b 100644
--- a/packages/client/ui-primitives/src/markdown/render.tsx
+++ b/packages/client/ui-primitives/src/markdown/render.tsx
@@ -23,11 +23,6 @@ import type * as Md from 'mdast'
import type {} from 'mdast-util-math'
import { normalizeUri } from 'micromark-util-sanitize-uri'
import { CodeBlock } from './CodeBlock.tsx'
-import { SourcePreview } from './SourcePreview.tsx'
-import { renderGraphviz } from './graphviz.ts'
-import { renderHtml, renderSvg } from './preview-document.ts'
-import { renderMermaid } from './mermaid.ts'
-import type { PreviewLabels } from './SourcePreview.tsx'
import { renderTexToReact } from './katex.tsx'
import { LinkIcon, classifyLinkPath } from '../LinkIcon.tsx'
import type { PositionedBlock } from './incremental.ts'
@@ -45,15 +40,6 @@ export interface MarkdownCodeLabels {
export interface MarkdownLabels {
code: MarkdownCodeLabels
footnotes: string
- /** Opt into settled Mermaid, Graphviz, SVG, and static HTML previews with complete localized labels. */
- preview?: {
- mermaid: PreviewLabels
- graphviz: PreviewLabels
- svg: PreviewLabels
- html: PreviewLabels
- preview: string
- source: string
- }
}
function sanitizeUrl(url: string): string {
@@ -408,26 +394,10 @@ function renderCode(node: Md.Code, key: Key, context: MarkdownRenderContext): Re
streaming={context.streaming}
copyLabel={context.labels.code.copyLabel}
copiedLabel={context.labels.code.copiedLabel}
- preview={context.streaming ? undefined : fencePreview(lang, node.value, context.labels)}
/>
)
}
-/** Resolve the supported fence language without treating arbitrary HTML in Markdown as a preview. */
-function fencePreview(lang: string | undefined, code: string, labels: MarkdownLabels) {
- if (labels.preview === undefined) return undefined
- const kind = lang === 'dot' ? 'graphviz' : lang
- if (kind !== 'mermaid' && kind !== 'graphviz' && kind !== 'svg' && kind !== 'html') return undefined
- const render = { mermaid: renderMermaid, graphviz: renderGraphviz, svg: renderSvg, html: renderHtml }[kind]
- return {
- content: (
-
- ),
- previewLabel: labels.preview.preview,
- sourceLabel: labels.preview.source,
- }
-}
-
/** A list is loose when it or any of its items is spread; every item then keeps its paragraphs. */
function listLoose(list: Md.List): boolean {
return (list.spread ?? false) || list.children.some(listItemLoose)
diff --git a/packages/client/ui-primitives/tests/code-block.client.spec.tsx b/packages/client/ui-primitives/tests/code-block.client.spec.tsx
index 83c016c8f0..4413cf46d2 100644
--- a/packages/client/ui-primitives/tests/code-block.client.spec.tsx
+++ b/packages/client/ui-primitives/tests/code-block.client.spec.tsx
@@ -122,7 +122,7 @@ describe('CodeBlock', () => {
expect(view.getByText('plain text')).toBeTruthy()
})
- it('shows the language banner and copies the displayed source text', async () => {
+ it('shows the language banner and copies the pre textContent', async () => {
vi.useFakeTimers()
const writeText = vi.fn().mockResolvedValue(undefined)
Object.defineProperty(navigator, 'clipboard', {
diff --git a/packages/client/ui-primitives/tests/fence-previews.client.spec.tsx b/packages/client/ui-primitives/tests/fence-previews.client.spec.tsx
deleted file mode 100644
index cc240f75c1..0000000000
--- a/packages/client/ui-primitives/tests/fence-previews.client.spec.tsx
+++ /dev/null
@@ -1,126 +0,0 @@
-// @vitest-environment jsdom
-
-import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'
-import { afterEach, describe, expect, it, vi } from 'vitest'
-import { MarkdownText } from '../src/markdown/MarkdownText.tsx'
-import { renderGraphviz } from '../src/markdown/graphviz.ts'
-import { renderHtml, renderSvg } from '../src/markdown/preview-document.ts'
-import { markdownLabels } from './labels.client.ts'
-
-const status = { loading: 'Loading', error: 'Cannot preview' }
-const preview = {
- mermaid: { ...status, diagram: 'Mermaid diagram' },
- graphviz: { ...status, diagram: 'Graphviz diagram' },
- svg: { ...status, diagram: 'SVG preview' },
- html: { ...status, diagram: 'HTML preview' },
- preview: 'Preview', source: 'Source',
-}
-const svg = ''
-const cases = [
- ['graphviz', 'digraph { Input -> Preview }', preview.graphviz.diagram],
- ['dot', 'digraph { Input -> Preview }', preview.graphviz.diagram],
- ['svg', svg, preview.svg.diagram],
- ['html', 'Example
', preview.html.diagram],
-] as const
-
-afterEach(() => { cleanup(); vi.unstubAllGlobals() })
-
-describe('Markdown fence previews', () => {
- it('renders real DOT', async () => { await renderGraphviz('digraph { Input -> Preview }', new AbortController().signal) })
- it.each(cases)('settles %s into an isolated default preview and copies original source in both views', async (lang, code, title) => {
- const writeText = vi.fn().mockResolvedValue(undefined)
- vi.stubGlobal('navigator', Object.create(navigator, { clipboard: { value: { writeText } } }))
- const props = { text: `\`\`\`${lang}\n${code}\n\`\`\``, labels: { ...markdownLabels, preview } }
- const view = render( )
- expect(view.container.querySelector('iframe')).toBeNull()
- expect(view.container.querySelector('pre code')?.textContent).toBe(code)
- view.rerender( )
- const findPreview = async () => lang === 'html' ? await screen.findByTitle(title) : await screen.findByRole('img', { name: title })
- const element = await findPreview()
- if (lang === 'html') {
- expect(element.getAttribute('sandbox')).toBe('')
- expect(element.getAttribute('referrerpolicy')).toBe('no-referrer')
- expect(element.getAttribute('srcdoc')).toContain('Content-Security-Policy')
- } else {
- expect(element.getAttribute('src')).toMatch(/^data:image\/svg\+xml/)
- expect(view.container.querySelector('iframe')).toBeNull()
- expect(element.parentElement!.querySelector('svg')).toBeNull()
- }
- expect(view.container.querySelector('pre code')).toBeNull()
- fireEvent.click(screen.getByRole('button', { name: 'Source' }))
- expect(view.container.querySelector('pre code')?.textContent).toBe(code)
- expect(element.closest('[hidden]')).not.toBeNull()
- fireEvent.click(screen.getByRole('button', { name: markdownLabels.code.copyLabel }))
- await waitFor(() => { expect(writeText).toHaveBeenCalledWith(code) })
- fireEvent.click(screen.getByRole('button', { name: 'Preview' }))
- expect(await findPreview()).toBe(element)
- expect(element.closest('[hidden]')).toBeNull()
- view.unmount()
- render( )
- await findPreview()
- fireEvent.click(screen.getByRole('button', { name: markdownLabels.code.copyLabel }))
- await waitFor(() => { expect(writeText).toHaveBeenCalledTimes(2) })
- })
-
- it.each(['svg', 'graphviz'])('retains invalid %s source and recovers after replacement', async (lang) => {
- const view = render( )
- await screen.findByText(status.error)
- expect(view.container.querySelector('pre code')?.textContent).toBe('broken')
- view.rerender( )
- await screen.findByRole('img', { name: preview.svg.diagram })
- expect(screen.queryByText(status.error)).toBeNull()
- })
-
- it('requires an opted-in code fence and leaves raw HTML and other languages unrendered', () => {
- const view = render(Example\n```'} labels={markdownLabels} />)
- expect(view.container.querySelector('pre code')?.textContent).toBe('Example
')
- view.rerender(Example\n\n```xml\n \n```'} labels={{ ...markdownLabels, preview }} />)
- expect(view.container.querySelector('iframe')).toBeNull()
- expect(view.container.querySelector('h1')).toBeNull()
- })
-})
-
-describe('static preview documents', () => {
- it.each(['light', 'dark'])('uses the document %s color scheme for HTML previews', (scheme) => {
- const previous = document.documentElement.style.colorScheme
- try {
- document.documentElement.style.colorScheme = scheme
- const doc = renderHtml('Example
', new AbortController().signal)
- const parsed = new DOMParser().parseFromString(doc, 'text/html')
- expect(parsed.documentElement.style.colorScheme).toBe(scheme)
- } finally {
- document.documentElement.style.colorScheme = previous
- }
- })
-
- it('preserves HTML styling while removing scripts, navigation, and nested documents', () => {
- const doc = renderHtml(`
-
- Example
- Link
- `, new AbortController().signal)
- const parsed = new DOMParser().parseFromString(doc, 'text/html')
- expect(parsed.querySelector('h1')?.textContent).toBe('Example')
- expect(parsed.querySelector('style')?.textContent).toBe('h1 { color: green }')
- expect(parsed.querySelector('script, iframe, base, [href], [action], [formaction], [onload]')).toBeNull()
- expect(parsed.querySelectorAll('meta[http-equiv]').length).toBe(1)
- expect(parsed.querySelector('meta[http-equiv]')?.getAttribute('content')).toContain("default-src 'none'")
- })
-
- it('encodes SVG as an image rather than executable document markup', () => {
- const code = ''
- const url = renderSvg(code, new AbortController().signal)
- expect(url).toMatch(/^data:image\/svg\+xml;charset=utf-8,/)
- expect(decodeURIComponent(url.slice(url.indexOf(',') + 1))).toBe(code)
- })
-
- it.each([' ', '', ''])('rejects non-SVG or malformed XML: %s', (code) => {
- expect(() => renderSvg(code, new AbortController().signal)).toThrow('Invalid SVG document')
- })
-
- it.each([renderHtml, renderSvg])('does not prepare a cancelled document', (renderDocument) => {
- const controller = new AbortController()
- controller.abort()
- expect(() => renderDocument(svg, controller.signal)).toThrow(controller.signal.reason)
- })
-})
diff --git a/packages/client/ui-primitives/tests/graphviz-runtime.client.spec.ts b/packages/client/ui-primitives/tests/graphviz-runtime.client.spec.ts
deleted file mode 100644
index 1a7b170516..0000000000
--- a/packages/client/ui-primitives/tests/graphviz-runtime.client.spec.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-// @vitest-environment jsdom
-
-import { afterEach, beforeEach, expect, it, vi } from 'vitest'
-
-const instance = vi.fn()
-beforeEach(() => {
- vi.resetModules()
- instance.mockReset()
- vi.doMock('@viz-js/viz', () => ({ instance }))
-})
-afterEach(() => { vi.doUnmock('@viz-js/viz') })
-
-it('retries failed initialization and reuses the loaded runtime', async () => {
- const renderString = vi.fn().mockReturnValue('')
- instance.mockRejectedValueOnce(new Error('WASM unavailable')).mockResolvedValue({ renderString })
- const { renderGraphviz } = await import('../src/markdown/graphviz.ts')
- await expect(renderGraphviz('digraph {}', new AbortController().signal)).rejects.toThrow('WASM unavailable')
- await expect(renderGraphviz('digraph {}', new AbortController().signal)).resolves.toContain('data:image/svg+xml')
- await renderGraphviz('digraph {}', new AbortController().signal)
- expect(instance).toHaveBeenCalledTimes(2)
-})
-
-it('skips layout after cancellation during runtime loading', async () => {
- const pending = Promise.withResolvers<{ renderString: ReturnType }>()
- instance.mockReturnValue(pending.promise)
- const { renderGraphviz } = await import('../src/markdown/graphviz.ts')
- const controller = new AbortController()
- const result = renderGraphviz('digraph {}', controller.signal)
- const rejection = expect(result).rejects.toMatchObject({ name: 'AbortError' })
- controller.abort()
- const renderString = vi.fn()
- pending.resolve({ renderString })
- await rejection
- expect(renderString).not.toHaveBeenCalled()
-})
-
-it('uses theme defaults without rewriting authored DOT attributes', async () => {
- const previous = document.body.getAttribute('style')
- try {
- document.body.style.setProperty('--dsw-alias-label-primary', 'rgb(230, 231, 232)')
- document.body.style.setProperty('--dsw-alias-label-secondary', '#aabbcc')
- document.body.style.setProperty('--dsw-alias-label-tertiary', '#8899aa')
- document.body.style.setProperty('--dsw-alias-bg-layer-2', '#222222')
- const renderString = vi.fn().mockReturnValue('')
- instance.mockResolvedValue({ renderString })
- const { renderGraphviz } = await import('../src/markdown/graphviz.ts')
- const code = 'digraph { a [color="red"]; a -> b }'
- await renderGraphviz(code, new AbortController().signal)
- expect(renderString).toHaveBeenCalledWith(code, expect.objectContaining({
- nodeAttributes: { color: '#8899aa', fontcolor: '#e6e7e8', fillcolor: '#222222', style: 'filled' },
- edgeAttributes: { color: '#aabbcc', fontcolor: '#e6e7e8' },
- }))
- await renderGraphviz(code, new AbortController().signal, {
- engine: 'neato', format: 'plain', yInvert: true,
- graphAttributes: { ranksep: 1 }, nodeAttributes: { shape: 'box' }, edgeAttributes: { color: 'red' },
- })
- expect(renderString).toHaveBeenLastCalledWith(code, {
- engine: 'neato', format: 'svg', yInvert: true,
- graphAttributes: { bgcolor: 'transparent', fontcolor: '#e6e7e8', ranksep: 1 },
- nodeAttributes: { color: '#8899aa', fontcolor: '#e6e7e8', fillcolor: '#222222', style: 'filled', shape: 'box' },
- edgeAttributes: { color: 'red', fontcolor: '#e6e7e8' },
- })
- } finally {
- if (previous === null) document.body.removeAttribute('style')
- else document.body.setAttribute('style', previous)
- }
-})
diff --git a/packages/client/ui-primitives/tests/mermaid-runtime.client.spec.ts b/packages/client/ui-primitives/tests/mermaid-runtime.client.spec.ts
deleted file mode 100644
index c5a4ccd6d3..0000000000
--- a/packages/client/ui-primitives/tests/mermaid-runtime.client.spec.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-// @vitest-environment jsdom
-
-import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-
-const initialize = vi.fn()
-const renderDiagram = vi.fn()
-
-beforeEach(() => {
- vi.resetModules()
- vi.resetAllMocks()
- vi.doMock('mermaid', () => ({ default: { initialize, render: renderDiagram } }))
-})
-afterEach(() => { vi.doUnmock('mermaid') })
-
-describe('Mermaid runtime', () => {
- it('allows another attempt after the runtime import fails', async () => {
- vi.doMock('mermaid', () => { throw new Error('runtime unavailable') })
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- await expect(renderMermaid('first', new AbortController().signal)).rejects.toThrow()
- expect(initialize).not.toHaveBeenCalled()
- vi.doMock('mermaid', () => ({ default: { initialize, render: renderDiagram } }))
- renderDiagram.mockResolvedValue({ svg: '' })
- await expect(renderMermaid('retry', new AbortController().signal)).resolves.toContain('data:image/svg+xml')
- expect(renderDiagram).toHaveBeenCalledOnce()
- })
-
- it('accepts native configuration without weakening preview restrictions', async () => {
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- renderDiagram.mockResolvedValue({ svg: '' })
- await renderMermaid('flowchart LR', new AbortController().signal, {
- // oxlint-disable-next-line typescript/no-deprecated
- layout: 'dagre', flowchart: { nodeSpacing: 40, htmlLabels: true },
- themeVariables: { primaryColor: '#123456' },
- securityLevel: 'loose', startOnLoad: true, suppressErrorRendering: false, htmlLabels: true, secure: [],
- })
- expect(initialize.mock.calls[0]![0]).toMatchObject({
- layout: 'dagre', flowchart: { nodeSpacing: 40, htmlLabels: false },
- themeVariables: { primaryColor: '#123456', darkMode: false },
- securityLevel: 'strict', startOnLoad: false, suppressErrorRendering: true, htmlLabels: false,
- })
- expect(initialize.mock.calls[0]![0]).toHaveProperty('secure', expect.arrayContaining(['securityLevel']))
- })
-
- it('reuses the runtime and removes each measurement container after rendering', async () => {
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- expect(initialize).not.toHaveBeenCalled()
- const stages: HTMLElement[] = []
- const ids: string[] = []
- renderDiagram.mockImplementation(async (id: string, code: string, stage: HTMLElement) => {
- expect(stage.isConnected).toBe(true)
- expect(stage.getAttribute('aria-hidden')).toBe('true')
- stages.push(stage)
- ids.push(id)
- return { svg: `` }
- })
- const results = await Promise.all([
- renderMermaid('中文', new AbortController().signal),
- renderMermaid('second', new AbortController().signal),
- ])
- expect(initialize).toHaveBeenCalledTimes(2)
- expect(initialize).toHaveBeenCalledWith(expect.objectContaining({
- startOnLoad: false, securityLevel: 'strict', suppressErrorRendering: true, htmlLabels: false,
- secure: [
- 'secure', 'securityLevel', 'startOnLoad', 'maxTextSize', 'maxEdges',
- 'suppressErrorRendering', 'theme', 'themeVariables', 'themeCSS', 'htmlLabels', 'flowchart',
- ],
- }))
- expect(results.map(url => decodeURIComponent(url.split(',')[1]!))).toEqual(['', ''])
- expect(new Set(ids).size).toBe(2)
- expect(stages.every(stage => !stage.isConnected)).toBe(true)
- })
-
- it('keeps theme initialization with its render and recovers the queue after failure', async () => {
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- const first = Promise.withResolvers<{ svg: string }>()
- renderDiagram.mockReturnValueOnce(first.promise).mockResolvedValue({ svg: '' })
- const light = renderMermaid('first', new AbortController().signal)
- const failure = expect(light).rejects.toThrow('invalid')
- await vi.waitFor(() => { expect(renderDiagram).toHaveBeenCalledOnce() })
- const previous = document.documentElement.style.colorScheme
- try {
- document.documentElement.style.colorScheme = 'dark'
- const dark = renderMermaid('second', new AbortController().signal)
- await Promise.resolve()
- expect(initialize).toHaveBeenCalledOnce()
- first.reject(new Error('invalid'))
- await failure
- await dark
- expect(initialize.mock.calls[1]![0]).toMatchObject({ themeVariables: { darkMode: true } })
- } finally {
- document.documentElement.style.colorScheme = previous
- }
- })
-
- it('removes measurement DOM even when Mermaid rejects', async () => {
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- let stage: HTMLElement | undefined
- const error = new Error('bad diagram')
- renderDiagram.mockImplementation(async (_id: string, _code: string, target: HTMLElement) => {
- stage = target
- target.innerHTML = ''
- throw error
- })
- await expect(renderMermaid('bad', new AbortController().signal)).rejects.toBe(error)
- expect(stage?.isConnected).toBe(false)
- })
-
- it('preserves intrinsic diagram size instead of stretching percentage-width SVG images', async () => {
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- renderDiagram.mockResolvedValue({ svg: '' })
- const url = await renderMermaid('flowchart LR', new AbortController().signal)
- const svg = new DOMParser().parseFromString(decodeURIComponent(url.split(',')[1]!), 'image/svg+xml').documentElement
- expect(svg.getAttribute('width')).toBe('420')
- expect(svg.getAttribute('height')).toBe('180')
- })
-
- it('does not start cancelled work after loading the runtime', async () => {
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- const controller = new AbortController()
- controller.abort()
- await expect(renderMermaid('unused', controller.signal)).rejects.toMatchObject({ name: 'AbortError' })
- expect(renderDiagram).not.toHaveBeenCalled()
- })
-
- it('allows another attempt after runtime initialization fails', async () => {
- const { renderMermaid } = await import('../src/markdown/mermaid.ts')
- initialize.mockImplementationOnce(() => { throw new Error('initialization failed') })
- await expect(renderMermaid('first', new AbortController().signal)).rejects.toThrow('initialization failed')
- renderDiagram.mockResolvedValue({ svg: '' })
- await expect(renderMermaid('retry', new AbortController().signal)).resolves.toContain('data:image/svg+xml')
- expect(initialize).toHaveBeenCalledTimes(2)
- })
-})
diff --git a/packages/client/ui-primitives/tests/source-preview.client.spec.tsx b/packages/client/ui-primitives/tests/source-preview.client.spec.tsx
deleted file mode 100644
index 7e63f06929..0000000000
--- a/packages/client/ui-primitives/tests/source-preview.client.spec.tsx
+++ /dev/null
@@ -1,162 +0,0 @@
-// @vitest-environment jsdom
-
-import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
-import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-import { SourcePreview } from '../src/markdown/SourcePreview.tsx'
-import { CodeBlock } from '../src/markdown/CodeBlock.tsx'
-import { renderMermaid } from '../src/markdown/mermaid.ts'
-import { MarkdownText } from '../src/markdown/MarkdownText.tsx'
-import { markdownLabels } from './labels.client.ts'
-
-vi.mock('../src/markdown/mermaid.ts', () => ({ renderMermaid: vi.fn() }))
-
-const labels = {
- diagram: 'Mermaid diagram', loading: 'Rendering diagram…', error: 'Unable to render this diagram.',
- preview: 'Preview', source: 'Source',
-}
-const preview = {
- preview: labels.preview, source: labels.source,
- mermaid: labels, graphviz: labels, svg: labels, html: labels,
-}
-const source = 'flowchart LR\n A[Input] --> B[Preview]'
-const imageUrl = 'data:image/svg+xml;charset=utf-8,%3Csvg%2F%3E'
-
-afterEach(() => { cleanup(); vi.unstubAllGlobals() })
-beforeEach(() => { vi.resetAllMocks() })
-
-describe('SourcePreview', () => {
- it('updates mounted previews on theme changes and ignores obsolete completions', async () => {
- const previous = document.documentElement.style.colorScheme
- const old = Promise.withResolvers()
- vi.mocked(renderMermaid).mockReturnValueOnce(old.promise).mockResolvedValue(imageUrl)
- const view = render( )
- try {
- const oldSignal = vi.mocked(renderMermaid).mock.calls[0]![1]
- await act(async () => { document.documentElement.style.colorScheme = 'dark' })
- expect(oldSignal.aborted).toBe(true)
- const image = await screen.findByRole('img')
- await act(async () => { old.resolve('obsolete') })
- expect(image.getAttribute('src')).toBe(imageUrl)
- await act(async () => { document.body.style.setProperty('--unrelated', '1') })
- expect(renderMermaid).toHaveBeenCalledTimes(2)
- await act(async () => { document.documentElement.style.colorScheme = 'light' })
- expect(renderMermaid).toHaveBeenCalledTimes(3)
- view.unmount()
- await act(async () => { document.documentElement.style.colorScheme = 'dark' })
- expect(renderMermaid).toHaveBeenCalledTimes(3)
- } finally {
- view.unmount()
- document.documentElement.style.colorScheme = previous
- document.body.style.removeProperty('--unrelated')
- }
- })
- it('shows loading until rendering completes, then displays an image without inserting SVG', async () => {
- const pending = Promise.withResolvers()
- vi.mocked(renderMermaid).mockReturnValue(pending.promise)
- const view = render( )
- expect(screen.getByRole('status').textContent).toBe(labels.loading)
- expect(screen.queryByRole('img')).toBeNull()
- await act(async () => { pending.resolve(imageUrl) })
- expect(screen.getByRole('img', { name: labels.diagram }).getAttribute('src')).toBe(imageUrl)
- expect(view.container.querySelector('svg')).toBeNull()
- expect(screen.queryByRole('status')).toBeNull()
- })
-
- it('retains invalid source and recovers when the source changes', async () => {
- vi.mocked(renderMermaid).mockRejectedValueOnce(new Error('Parse error'))
- const view = render( )
- expect((await screen.findByText(labels.error)).getAttribute('role')).toBe('status')
- expect(view.container.querySelector('pre code')?.textContent).toBe('invalid')
- const next = Promise.withResolvers()
- vi.mocked(renderMermaid).mockReturnValue(next.promise)
- view.rerender( )
- expect(screen.getByRole('status').textContent).toBe(labels.loading)
- expect(view.container.querySelector('pre')).toBeNull()
- await act(async () => { next.resolve(imageUrl) })
- expect(screen.getByRole('img').getAttribute('src')).toBe(imageUrl)
- })
-
- it.each(['resolve', 'reject'] as const)('ignores a stale %s after a newer source finishes', async (outcome) => {
- const old = Promise.withResolvers()
- const next = Promise.withResolvers()
- vi.mocked(renderMermaid).mockReturnValueOnce(old.promise).mockReturnValueOnce(next.promise)
- const view = render( )
- const oldSignal = vi.mocked(renderMermaid).mock.calls[0]![1]
- view.rerender( )
- expect(oldSignal.aborted).toBe(true)
- await act(async () => { next.resolve(imageUrl) })
- await act(async () => {
- if (outcome === 'resolve') old.resolve('obsolete-image')
- else old.reject(new Error('obsolete-error'))
- })
- expect(screen.getByRole('img').getAttribute('src')).toBe(imageUrl)
- expect(screen.queryByRole('status')).toBeNull()
- })
-
- it('cancels the owner when unmounted while loading', async () => {
- const pending = Promise.withResolvers()
- vi.mocked(renderMermaid).mockReturnValue(pending.promise)
- const view = render( )
- const signal = vi.mocked(renderMermaid).mock.calls[0]![1]
- view.unmount()
- expect(signal.aborted).toBe(true)
- await act(async () => { pending.reject(new Error('cancelled')) })
- expect(screen.queryByRole('img')).toBeNull()
- })
-})
-
-describe('Markdown Mermaid fences', () => {
- it('retains a preview when switching to numbered source', async () => {
- vi.mocked(renderMermaid).mockResolvedValue(imageUrl)
- const view = render( ,
- previewLabel: labels.preview, sourceLabel: labels.source,
- }} />)
- const diagram = await screen.findByRole('img', { name: labels.diagram })
- expect(view.container.querySelector('[data-line-numbers]')).not.toBeNull()
- fireEvent.click(screen.getByRole('button', { name: labels.source }))
- expect([...view.container.querySelectorAll('code > .line')].map(line => line.textContent)).toEqual(source.split('\n'))
- expect(diagram.isConnected).toBe(true)
- expect(screen.queryByRole('img')).toBeNull()
- fireEvent.click(screen.getByRole('button', { name: labels.preview }))
- expect(screen.getByRole('img', { name: labels.diagram })).toBe(diagram)
- expect(renderMermaid).toHaveBeenCalledOnce()
- })
-
- it('keeps streaming source literal, then offers preview, source and source copying', async () => {
- const writeText = vi.fn().mockResolvedValue(undefined)
- vi.stubGlobal('navigator', Object.create(navigator, { clipboard: { value: { writeText } } }))
- vi.mocked(renderMermaid).mockResolvedValue(imageUrl)
- const props = { text: `\`\`\`mermaid\n${source}\n\`\`\``, labels: { ...markdownLabels, preview } }
- const view = render( )
- expect(view.container.querySelector('pre code')?.textContent).toBe(source)
- expect(renderMermaid).not.toHaveBeenCalled()
- expect(screen.queryByRole('button', { name: labels.source })).toBeNull()
- view.rerender( )
- const diagram = await screen.findByRole('img', { name: labels.diagram })
- expect(screen.queryByText('mermaid')).toBeNull()
- expect(screen.getByRole('button', { name: labels.source }).textContent).toBe('')
- expect(screen.getByRole('button', { name: markdownLabels.code.copyLabel }).textContent).toBe('')
- fireEvent.click(screen.getByRole('button', { name: markdownLabels.code.copyLabel }))
- await screen.findByRole('button', { name: markdownLabels.code.copiedLabel })
- expect(writeText).toHaveBeenCalledWith(source)
- fireEvent.click(screen.getByRole('button', { name: labels.source }))
- expect(view.container.querySelector('pre code')?.textContent).toBe(source)
- expect(screen.queryByRole('img')).toBeNull()
- expect(diagram.isConnected).toBe(true)
- expect(screen.queryByText('mermaid')).toBeNull()
- fireEvent.click(screen.getByRole('button', { name: labels.preview }))
- expect(screen.getByRole('img', { name: labels.diagram })).toBe(diagram)
- expect(screen.queryByRole('status')).toBeNull()
- expect(renderMermaid).toHaveBeenCalledOnce()
- })
-
- it('leaves other languages and consumers without preview labels as code', () => {
- const view = render( )
- expect(view.container.querySelector('pre code')?.textContent).toBe(source)
- view.rerender( )
- expect(view.container.querySelector('pre code')?.textContent).toBe('flowchart LR')
- expect(renderMermaid).not.toHaveBeenCalled()
- })
-})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 90df336c0a..04b7a7e33a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -3327,18 +3327,12 @@ importers:
'@types/react-dom':
specifier: ~18.3.0
version: 18.3.7(@types/react@18.3.31)
- '@viz-js/viz':
- specifier: 3.30.0
- version: 3.30.0
anser:
specifier: ^2.3.5
version: 2.3.5
clsx:
specifier: ^2.0.0
version: 2.1.1
- dompurify:
- specifier: 3.4.11
- version: 3.4.11
katex:
specifier: ^0.16.47
version: 0.16.47
@@ -3351,9 +3345,6 @@ importers:
mdast-util-math:
specifier: ^3.0.0
version: 3.0.0
- mermaid:
- specifier: 11.16.0
- version: 11.16.0
micromark-core-commonmark:
specifier: ^2.0.3
version: 2.0.3
@@ -14295,9 +14286,6 @@ packages:
'@vitest/utils@4.1.8':
resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==}
- '@viz-js/viz@3.30.0':
- resolution: {integrity: sha512-2zmcP55QY44uQfZ+GvgNHmGd8S6KUD+2eMur9AbYybSzrOd/m8nMUg0ZircJNiJRKGgVBKAE8kh0hAwpUFUFQQ==}
-
'@vscode/ripgrep-darwin-arm64@1.18.0':
resolution: {integrity: sha512-r3ktHSvbFycQNF6sl7sNDPocpsI7J+mEzh1IaZFkY0spm3k2Z9t8hPAeOK7+p0l6p6/swkQC14XWX01low+94Q==}
cpu: [arm64]
@@ -20907,8 +20895,6 @@ snapshots:
convert-source-map: 2.0.0
tinyrainbow: 3.1.0
- '@viz-js/viz@3.30.0': {}
-
'@vscode/ripgrep-darwin-arm64@1.18.0':
optional: true
diff --git a/scripts/check-workspace-constraints.spec.ts b/scripts/check-workspace-constraints.spec.ts
index 7d0177eb45..2042754128 100644
--- a/scripts/check-workspace-constraints.spec.ts
+++ b/scripts/check-workspace-constraints.spec.ts
@@ -3,7 +3,6 @@
import { describe, expect, it } from 'vitest'
import {
checkDshFamilyVersion,
- checkWorkspaceManifest,
checkExperimentalDependencyIsolation,
checkExperimentalManifest,
expectedDshPackageFiles,
@@ -144,16 +143,3 @@ describe('package payload constraints', () => {
])
})
})
-
-it('requires preview license notices in the published UI primitives payload', () => {
- const name = '@deepseek-ai/dsh-client-ui-primitives'
- const files = expectedDshPackageFiles({ name })
- expect(files).toContain('THIRD_PARTY_PREVIEW_NOTICES.txt')
- const check = (entries: readonly string[]) => checkWorkspaceManifest({
- dir: 'packages/client/ui-primitives', manifest: { name, files: [...entries] },
- }).filter(message => message.includes('package.json files'))
- expect(check(files)).toEqual([])
- expect(check(files.filter(file => file !== 'THIRD_PARTY_PREVIEW_NOTICES.txt'))).toEqual([
- expect.stringContaining('package.json files must be'),
- ])
-})
diff --git a/scripts/check-workspace-constraints.ts b/scripts/check-workspace-constraints.ts
index 744b5be9ca..95a8835eeb 100644
--- a/scripts/check-workspace-constraints.ts
+++ b/scripts/check-workspace-constraints.ts
@@ -155,7 +155,7 @@ const packageFileExtras: Readonly> = {
// them through its own CSS pipeline, so the sheets are published artifacts.
// The glob covers whichever sheets a package emits; sourcemaps stay
// unpublished, as everywhere else in the repository.
- '@deepseek-ai/dsh-client-ui-primitives': ['lib/**/*.css', 'THIRD_PARTY_PREVIEW_NOTICES.txt'],
+ '@deepseek-ai/dsh-client-ui-primitives': ['lib/**/*.css'],
'@deepseek-ai/dsh-client-ui-dockkit': ['lib/**/*.css'],
'@deepseek-ai/dsh-client-web': ['lib/**/*.css'],
'@deepseek-ai/dsh-client-ui-theme': ['lib/styles'],
diff --git a/scripts/gen-third-party-notices.spec.ts b/scripts/gen-third-party-notices.spec.ts
index 46b1b35d11..fabce6e8c9 100644
--- a/scripts/gen-third-party-notices.spec.ts
+++ b/scripts/gen-third-party-notices.spec.ts
@@ -4,7 +4,6 @@ import { tmpdir } from 'node:os'
import { describe, expect, it } from 'vitest'
import {
CLAUDE_AGENT_SDK_PACKAGE,
- assertPreviewDistribution,
assertRuntimeLicenses,
claudeDistributionFromManifest,
collectPythonDependencies,
@@ -396,26 +395,3 @@ describe('manifestPatterns', () => {
])
})
})
-
-describe('preview distribution licenses', () => {
- const dependencies = { mermaid: '11.16.0', '@viz-js/viz': '3.30.0', dompurify: '3.4.11' }
- const sources = [
- 'pkg:docker/emscripten/emsdk@5.0.7?platform=linux%2Famd64',
- 'https://github.com/libexpat/libexpat/releases/download/R_2_8_4/expat-2.8.4.tar.gz',
- 'https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/16.0.0/graphviz-16.0.0.tar.gz',
- ]
- it('accepts the reviewed wrapper and native sources', () => {
- expect(() => { assertPreviewDistribution(dependencies, sources) }).not.toThrow()
- const notices = readFileSync(resolve(root, 'packages/client/ui-primitives/THIRD_PARTY_PREVIEW_NOTICES.txt'), 'utf8')
- expect(notices).toContain('Eclipse Public License - v 2.0')
- expect(notices).toContain(sources[2])
- expect(notices).toContain(readFileSync(resolve(root, 'packages/client/ui-primitives/node_modules/mermaid/LICENSE'), 'utf8').trim())
- expect(notices).toContain(readFileSync(resolve(root, 'packages/client/ui-primitives/node_modules/dompurify/LICENSE'), 'utf8').trim())
- })
- it.each(Object.keys(dependencies))('rejects an unreviewed %s upgrade', (name) => {
- expect(() => { assertPreviewDistribution({ ...dependencies, [name]: '99.0.0' }, sources) }).toThrow('preview notices: review')
- })
- it.each([sources.slice(1), [...sources, 'https://example.com/new-library'], [...sources.slice(0, 2), 'graphviz-next']])('rejects changed embedded sources', (...uris) => {
- expect(() => { assertPreviewDistribution(dependencies, uris) }).toThrow('native sources')
- })
-})
diff --git a/scripts/gen-third-party-notices.ts b/scripts/gen-third-party-notices.ts
index 2130723202..9e83956e5e 100644
--- a/scripts/gen-third-party-notices.ts
+++ b/scripts/gen-third-party-notices.ts
@@ -685,28 +685,6 @@ ${rows.join('\n')}
`
}
-/**
- * Require renewed license review when a preview dependency or embedded source changes.
- * @param dependencies - UI primitives' browser build dependencies.
- * @param sources - Native source URIs from the installed Viz.js build provenance.
- * @returns Nothing; throws when a version or native source differs from the reviewed distribution.
- */
-export function assertPreviewDistribution(dependencies: Record, sources: readonly string[]): void {
- for (const [name, version] of Object.entries({ mermaid: '11.16.0', '@viz-js/viz': '3.30.0', dompurify: '3.4.11' })) {
- if (dependencies[name] !== version) {
- throw new Error(`preview notices: review ${name} ${String(dependencies[name])} licenses and update THIRD_PARTY_PREVIEW_NOTICES.txt`)
- }
- }
- const expected = [
- 'pkg:docker/emscripten/emsdk@5.0.7?platform=linux%2Famd64',
- 'https://github.com/libexpat/libexpat/releases/download/R_2_8_4/expat-2.8.4.tar.gz',
- 'https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/16.0.0/graphviz-16.0.0.tar.gz',
- ]
- if (sources.length !== expected.length || expected.some(uri => !sources.includes(uri))) {
- throw new Error('preview notices: review the changed Viz.js native sources and their distribution licenses')
- }
-}
-
/**
* Render the complete notices document.
* @returns The exact bytes THIRD_PARTY_NOTICES.md must hold after resolving browser inputs.
@@ -717,16 +695,6 @@ export async function render(): Promise {
// the manifests map it was resolved from; render() owns that single load.
workspaceLinkedManifestCache.clear()
const { manifests, names } = loadWorkspaceManifests()
- const previewPackage = 'packages/client/ui-primitives'
- const provenance = JSON.parse(readFileSync(resolve(root, previewPackage, 'node_modules/@viz-js/viz/lib/provenance.json'), 'utf8')) as {
- predicate: { buildDefinition: { resolvedDependencies: { uri: string }[] } }
- }
- const previewDependencies = manifests.get(`${previewPackage}/package.json`)?.devDependencies
- if (previewDependencies === undefined) throw new Error('preview notices: missing UI primitives browser dependencies')
- assertPreviewDistribution(
- previewDependencies,
- provenance.predicate.buildDefinition.resolvedDependencies.map(source => source.uri),
- )
const npm = collectNpmDeps(manifests, names, browser)
const runtimeDeps = npm.filter(dep => dep.runtime)
const devDeps = npm.filter(dep => !dep.runtime)
@@ -767,8 +735,6 @@ External packages installed for runtime use or distributed inside the prebuilt b
${renderNpmTable(runtimeDeps)}
-The Markdown preview distribution also contains Graphviz 16.0.0 (EPL-2.0), Expat 2.8.4 (MIT), and Emscripten 5.0.7 runtime code (MIT/NCSA) inside \`@viz-js/viz\` 3.30.0. The wrapper's MIT metadata does not relicense these components. [Preview notices](packages/client/ui-primitives/THIRD_PARTY_PREVIEW_NOTICES.txt) preserve their full license texts and Graphviz source availability, together with Mermaid's MIT and DOMPurify's selected Apache-2.0 terms. The UI primitives npm package includes this file; the Web build emits it as \`preview-third-party-notices.txt\`.
-
pnpm applies local patches to the following packages at install time, so shipped artifacts carry modified copies; each patch file is the complete record of the modification:
${patchedLines.join('\n')}
diff --git a/tsconfig.host.json b/tsconfig.host.json
index e7abea1600..c5a3f118b3 100644
--- a/tsconfig.host.json
+++ b/tsconfig.host.json
@@ -67,7 +67,6 @@
"apps/web/tests/math-rendering.e2e.ts",
"apps/web/tests/markdown-cjk-strong.e2e.ts",
"apps/web/tests/markdown-inline-code-links.e2e.ts",
- "apps/web/tests/markdown-mermaid.e2e.ts",
"apps/web/tests/clickable-links-gallery.e2e.ts",
"apps/web/tests/queue-actions.e2e.ts",
"apps/web/tests/queue-image.e2e.ts",
From dd393c18202b25f9734d51cb61aac8fa8b2c5ecf Mon Sep 17 00:00:00 2001
From: imccyu <276526105+imccyu@users.noreply.github.com>
Date: Wed, 9 Sep 2026 20:18:50 +0800
Subject: [PATCH 02/19] release(dsh): 0.1.5-alpha.2
---
apps/cli/package.json | 2 +-
apps/desktop-host/package.json | 2 +-
apps/desktop/package.json | 2 +-
apps/web/package.json | 2 +-
package.json | 2 +-
packages/acp/acp/package.json | 2 +-
packages/api/gateway/package.json | 2 +-
packages/api/remotes/package.json | 2 +-
packages/api/session-controller/package.json | 2 +-
packages/api/settings-controller/package.json | 2 +-
packages/api/workspace-controller/package.json | 2 +-
packages/api/workspace-files/package.json | 2 +-
packages/attachment/attachment-local/package.json | 2 +-
packages/attachment/attachment/package.json | 2 +-
packages/boot/app-boot/package.json | 2 +-
packages/boot/cmdline/package.json | 2 +-
packages/bundle/acp-app/package.json | 2 +-
packages/bundle/base/package.json | 2 +-
packages/bundle/headless/package.json | 2 +-
packages/bundle/sdk-app/package.json | 2 +-
packages/bundle/sdk-minimal/package.json | 2 +-
packages/bundle/web-app/package.json | 2 +-
packages/client/connection/package.json | 2 +-
packages/client/file-upload/package.json | 2 +-
packages/client/hmr/package.json | 2 +-
packages/client/locale/package.json | 2 +-
packages/client/modules/package.json | 2 +-
packages/client/resources/package.json | 2 +-
packages/client/store/package.json | 2 +-
packages/client/ui-agent-preset/package.json | 2 +-
packages/client/ui-approval/package.json | 2 +-
packages/client/ui-attachment/package.json | 2 +-
packages/client/ui-brand-official/package.json | 2 +-
packages/client/ui-chat/package.json | 2 +-
packages/client/ui-commands/package.json | 2 +-
packages/client/ui-conversation/package.json | 2 +-
packages/client/ui-deliverables/package.json | 2 +-
packages/client/ui-directory-picker-browse/package.json | 2 +-
packages/client/ui-directory-picker-native/package.json | 2 +-
packages/client/ui-dockkit/package.json | 2 +-
packages/client/ui-goal/package.json | 2 +-
packages/client/ui-input-trigger/package.json | 2 +-
packages/client/ui-jobs/package.json | 2 +-
packages/client/ui-layout/package.json | 2 +-
packages/client/ui-message-feedback/package.json | 2 +-
packages/client/ui-model-selection/package.json | 2 +-
packages/client/ui-open-in-app/package.json | 2 +-
packages/client/ui-permission-presets/package.json | 2 +-
packages/client/ui-plan/package.json | 2 +-
packages/client/ui-primitives/package.json | 2 +-
packages/client/ui-reference/package.json | 2 +-
packages/client/ui-renderer/package.json | 2 +-
packages/client/ui-schedule/package.json | 2 +-
packages/client/ui-session/package.json | 2 +-
packages/client/ui-settings-general/package.json | 2 +-
packages/client/ui-settings-models/package.json | 2 +-
packages/client/ui-settings-plugin-inventory/package.json | 2 +-
packages/client/ui-settings-plugins/package.json | 2 +-
packages/client/ui-settings/package.json | 2 +-
packages/client/ui-sidebar-documentpreview/package.json | 2 +-
packages/client/ui-sidebar-files/package.json | 2 +-
packages/client/ui-sidebar-right/package.json | 2 +-
packages/client/ui-sidebar/package.json | 2 +-
packages/client/ui-skill/package.json | 2 +-
packages/client/ui-slots/package.json | 2 +-
packages/client/ui-subagent/package.json | 2 +-
packages/client/ui-theme/package.json | 2 +-
packages/client/ui-tool/package.json | 2 +-
packages/client/ui-trajectory/package.json | 2 +-
packages/client/ui-user-questions/package.json | 2 +-
packages/client/ui-workflow-run/package.json | 2 +-
packages/client/ui-workspace/package.json | 2 +-
packages/client/web/package.json | 2 +-
packages/code-runtime/code-runtime-worker-thread/package.json | 2 +-
packages/code-runtime/code-runtime/package.json | 2 +-
packages/compaction/command-compact/package.json | 2 +-
packages/compaction/compaction-basic/package.json | 2 +-
packages/compaction/compaction-tool-result-pruner/package.json | 2 +-
packages/compaction/compaction/package.json | 2 +-
packages/context/agent-instructions/package.json | 2 +-
packages/context/file-reference-local/package.json | 2 +-
packages/context/file-reference/package.json | 2 +-
packages/context/session-reference/package.json | 2 +-
packages/context/time-context/package.json | 2 +-
packages/context/tmux-context/package.json | 2 +-
packages/core/agent-default-model/package.json | 2 +-
packages/core/agent-loop/package.json | 2 +-
packages/core/agent-tool-presentation/package.json | 2 +-
packages/core/agent/package.json | 2 +-
packages/core/scope/package.json | 2 +-
packages/core/session/package.json | 2 +-
packages/core/system-prompt/package.json | 2 +-
packages/core/tools/package.json | 2 +-
packages/credentials/authorization/package.json | 2 +-
packages/credentials/credentials-local/package.json | 2 +-
packages/credentials/credentials/package.json | 2 +-
packages/e2b/e2b/package.json | 2 +-
packages/e2b/fs-e2b/package.json | 2 +-
packages/e2b/subprocess-e2b/package.json | 2 +-
packages/experimental/agent-team-profile/package.json | 2 +-
packages/experimental/agent-team-web-profile/package.json | 2 +-
packages/experimental/agent-team/package.json | 2 +-
packages/experimental/client-ui-agent-team/package.json | 2 +-
packages/experimental/code-runtime-python/package.json | 2 +-
packages/experimental/inspector/package.json | 2 +-
packages/experimental/tool-agent-team/package.json | 2 +-
packages/experimental/webworker-packer/package.json | 2 +-
packages/experimental/webworker-runtime/package.json | 2 +-
packages/extensions/cordis-client-runner/package.json | 2 +-
packages/extensions/cordis-host-runner/package.json | 2 +-
packages/extensions/tool-cordis/package.json | 2 +-
packages/extensions/ui-cordis/package.json | 2 +-
packages/feedback/command-feedback/package.json | 2 +-
packages/feedback/message-feedback/package.json | 2 +-
packages/fs/fs-local/package.json | 2 +-
packages/fs/fs-observation-policy/package.json | 2 +-
packages/fs/fs-sandbox/package.json | 2 +-
packages/fs/fs/package.json | 2 +-
packages/fs/tool-fs-search/package.json | 2 +-
packages/fs/tool-fs/package.json | 2 +-
packages/fs/tool-present/package.json | 2 +-
packages/fs/tool-str-replace-editor/package.json | 2 +-
packages/goal/command-goal/package.json | 2 +-
packages/goal/goal-round-driver/package.json | 2 +-
packages/goal/goal/package.json | 2 +-
packages/goal/tool-goal/package.json | 2 +-
packages/guard/repeat-tool-reminder/package.json | 2 +-
packages/guard/timeout-policy/package.json | 2 +-
packages/hooks/hook-protocol/package.json | 2 +-
packages/hooks/hooks-claude-code/package.json | 2 +-
packages/hooks/hooks-codex/package.json | 2 +-
packages/host/directory-picker-auto/package.json | 2 +-
packages/host/directory-picker-browse/package.json | 2 +-
packages/host/directory-picker-native/package.json | 2 +-
packages/host/directory-picker/package.json | 2 +-
packages/host/frontend-static/package.json | 2 +-
packages/host/open-in-app/package.json | 2 +-
packages/host/plugin-inventory/package.json | 2 +-
packages/host/webserver/package.json | 2 +-
packages/identity/anonymous-user-id/package.json | 2 +-
packages/interaction/commands/package.json | 2 +-
packages/interaction/permission-presets/package.json | 2 +-
packages/interaction/tool-ask-user/package.json | 2 +-
packages/interaction/user-approval/package.json | 2 +-
packages/interaction/user-questions/package.json | 2 +-
packages/jobs/jobs-local/package.json | 2 +-
packages/jobs/jobs/package.json | 2 +-
packages/jobs/tool-jobs/package.json | 2 +-
packages/llm/deepseek-llm-api-extensions/package.json | 2 +-
packages/llm/llm-deepseek/package.json | 2 +-
packages/llm/llm-pi-ai/package.json | 2 +-
packages/llm/llm-retry/package.json | 2 +-
packages/llm/llm/package.json | 2 +-
packages/llm/plugin-package-inventory-deepseek/package.json | 2 +-
packages/llm/token-meter/package.json | 2 +-
packages/lsp/lsp-stdio/package.json | 2 +-
packages/lsp/lsp/package.json | 2 +-
packages/lsp/tool-lsp/package.json | 2 +-
packages/mcp/mcp-client/package.json | 2 +-
packages/plan/plan-mode/package.json | 2 +-
packages/preset/agent-presets/package.json | 2 +-
packages/preset/persona/package.json | 2 +-
packages/runtime-diagnostics/invariants/package.json | 2 +-
packages/sandbox/sandbox-local/package.json | 2 +-
packages/sandbox/sandbox-policy/package.json | 2 +-
packages/sandbox/sandbox-windows-acl/package.json | 2 +-
packages/sandbox/sandbox/package.json | 2 +-
packages/schedule/schedule/package.json | 2 +-
packages/sdk/client/package.json | 2 +-
packages/sdk/protocol/package.json | 2 +-
packages/sdk/server/package.json | 2 +-
packages/session-query/session-log-export/package.json | 2 +-
packages/session-query/session-query-sqlite/package.json | 2 +-
packages/session-query/session-query/package.json | 2 +-
packages/session-query/tool-session-query/package.json | 2 +-
packages/session/session-checkpoint-policy/package.json | 2 +-
packages/session/session-format-catalog/package.json | 2 +-
packages/session/session-format-v0-to-v1/package.json | 2 +-
packages/session/session-format-v1-to-v2/package.json | 2 +-
packages/session/session-format-v2-to-v3/package.json | 2 +-
packages/session/session-format/package.json | 2 +-
packages/session/session-log-deepseek/package.json | 2 +-
packages/session/session-persistence-jsonl/package.json | 2 +-
packages/session/session-persistence/package.json | 2 +-
packages/session/session-projection-cache/package.json | 2 +-
packages/session/session-projection/package.json | 2 +-
packages/session/session-stats/package.json | 2 +-
packages/session/session-telemetry-otel/package.json | 2 +-
packages/session/session-telemetry/package.json | 2 +-
packages/session/session-title-all-prompts-llm/package.json | 2 +-
packages/session/session-title-first-prompt-llm/package.json | 2 +-
packages/session/session-title-llm/package.json | 2 +-
packages/session/session-title/package.json | 2 +-
packages/session/session-turn-outline/package.json | 2 +-
packages/settings/settings-file/package.json | 2 +-
packages/settings/settings/package.json | 2 +-
packages/shell/bash-local/package.json | 2 +-
packages/shell/bash-sandbox/package.json | 2 +-
packages/shell/pwsh-local/package.json | 2 +-
packages/shell/pwsh-sandbox/package.json | 2 +-
packages/shell/shell-env/package.json | 2 +-
packages/shell/shell/package.json | 2 +-
packages/shell/tool-bash-persistent/package.json | 2 +-
packages/shell/tool-bash/package.json | 2 +-
packages/shell/tool-pwsh-persistent/package.json | 2 +-
packages/shell/tool-pwsh/package.json | 2 +-
packages/skill/skill-badge/package.json | 2 +-
packages/skill/skill-filesystem/package.json | 2 +-
packages/skill/skill/package.json | 2 +-
packages/skill/tool-skill/package.json | 2 +-
packages/spill/spill-local/package.json | 2 +-
packages/spill/spill-policy/package.json | 2 +-
packages/spill/spill/package.json | 2 +-
packages/storage/storage-domain/package.json | 2 +-
packages/storage/storage-json/package.json | 2 +-
packages/storage/storage-sqlite/package.json | 2 +-
packages/storage/storage/package.json | 2 +-
packages/subagent/subagent-acp/package.json | 2 +-
packages/subagent/subagent-claude-code/package.json | 2 +-
packages/subagent/subagent-codex/package.json | 2 +-
packages/subagent/subagent-dsh-sdk/package.json | 2 +-
packages/subagent/subagent-fork-in-process/package.json | 2 +-
packages/subagent/subagent-in-process-driver/package.json | 2 +-
packages/subagent/subagent-spawn-in-process/package.json | 2 +-
packages/subagent/subagent/package.json | 2 +-
packages/subagent/tool-subagent-control/package.json | 2 +-
packages/subagent/tool-subagent/package.json | 2 +-
packages/subprocess/subprocess-local/package.json | 2 +-
packages/subprocess/subprocess/package.json | 2 +-
packages/subprocess/win32-process/package.json | 2 +-
packages/terminal/terminal-bash/package.json | 2 +-
packages/terminal/terminal/package.json | 2 +-
packages/terminal/tool-terminal/package.json | 2 +-
packages/test-support/agent-loop-testkit/package.json | 2 +-
packages/test-support/client-runtime/package.json | 2 +-
packages/test-support/llm-mock-server/package.json | 2 +-
packages/test-support/llm-replay/package.json | 2 +-
packages/test-support/loader-smoke/package.json | 2 +-
packages/test-support/session-snapshot/package.json | 2 +-
packages/todo/tool-todo/package.json | 2 +-
packages/typert/generator/package.json | 2 +-
packages/typert/loader/package.json | 2 +-
packages/typert/protocol/package.json | 2 +-
packages/typert/registry/package.json | 2 +-
packages/util/atomic-write/package.json | 2 +-
packages/util/brand/package.json | 2 +-
packages/util/chunked-list/package.json | 2 +-
packages/util/crypto/package.json | 2 +-
packages/util/deque/package.json | 2 +-
packages/util/home-paths/package.json | 2 +-
packages/util/http-proxy/package.json | 2 +-
packages/util/launch-environment/package.json | 2 +-
packages/util/native-command/package.json | 2 +-
packages/util/output-retention/package.json | 2 +-
packages/util/package-manifest/package.json | 2 +-
packages/util/time/package.json | 2 +-
packages/util/timeout/package.json | 2 +-
packages/util/values/package.json | 2 +-
packages/util/workspace-path/package.json | 2 +-
packages/web/tool-web/package.json | 2 +-
packages/web/web-fetch-http/package.json | 2 +-
packages/web/web-search-deepseek/package.json | 2 +-
packages/web/web-search-exa/package.json | 2 +-
packages/web/web-search-perplexity/package.json | 2 +-
packages/web/web/package.json | 2 +-
packages/webhook/webhook-github/package.json | 2 +-
packages/webhook/webhook/package.json | 2 +-
packages/workflow/tool-ralph/package.json | 2 +-
packages/workflow/tool-workflow/package.json | 2 +-
packages/workflow/workflow-worker-thread/package.json | 2 +-
packages/workflow/workflow/package.json | 2 +-
packages/workspace/workspace/package.json | 2 +-
272 files changed, 272 insertions(+), 272 deletions(-)
diff --git a/apps/cli/package.json b/apps/cli/package.json
index 57084f2ac5..430451a4d4 100644
--- a/apps/cli/package.json
+++ b/apps/cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh",
"description": "dsh CLI: profile boot, plugin management, and the browser UI alias",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/apps/desktop-host/package.json b/apps/desktop-host/package.json
index fc44413c3d..68996a4894 100644
--- a/apps/desktop-host/package.json
+++ b/apps/desktop-host/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-desktop-host",
"description": "Private upstream-Node host process for the Electron desktop application",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"private": true,
"license": "MIT",
"type": "module",
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index d4a8146a1c..b428a0550c 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-desktop",
"description": "Electron desktop shell for an isolated pnpm-installed dsh runtime",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"private": true,
"license": "MIT",
"type": "module",
diff --git a/apps/web/package.json b/apps/web/package.json
index 6c6dbc31aa..439036b0db 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-web-frontend",
"description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/package.json b/package.json
index a09fa3f997..09627ea0d6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@deepseek-ai/dsh-root",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"license": "MIT",
"private": true,
"type": "module",
diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json
index c7a821c5d5..a5cf5a2d64 100644
--- a/packages/acp/acp/package.json
+++ b/packages/acp/acp/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-acp",
"description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json
index 8530dfd990..8228fefce4 100644
--- a/packages/api/gateway/package.json
+++ b/packages/api/gateway/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-api-gateway",
"description": "Typert Remote Host dispatcher and Client API endpoint",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json
index 0d7280d631..fafd62f2e3 100644
--- a/packages/api/remotes/package.json
+++ b/packages/api/remotes/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-api-remotes",
"description": "Remote BFF assembly for application-selected Host capabilities",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/api/session-controller/package.json b/packages/api/session-controller/package.json
index 3603490bf4..0376282f77 100644
--- a/packages/api/session-controller/package.json
+++ b/packages/api/session-controller/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-api-session-controller",
"description": "Session Remote commands, cold reads, and live control transport",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/api/settings-controller/package.json b/packages/api/settings-controller/package.json
index 2cfeb1e89a..91da932736 100644
--- a/packages/api/settings-controller/package.json
+++ b/packages/api/settings-controller/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-api-settings-controller",
"description": "Remote owner for the configuration surfaces over the settings-domain seams",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/api/workspace-controller/package.json b/packages/api/workspace-controller/package.json
index fcfd014594..ffdc9e2080 100644
--- a/packages/api/workspace-controller/package.json
+++ b/packages/api/workspace-controller/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-api-workspace-controller",
"description": "Workspace Remote commands and reconnect-safe state transport",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/api/workspace-files/package.json b/packages/api/workspace-files/package.json
index f867c86a1e..5ee4f54e67 100644
--- a/packages/api/workspace-files/package.json
+++ b/packages/api/workspace-files/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-api-workspace-files",
"description": "Workspace file service and Client resource provider: bounded reads, directory listing, and live metadata over the workspaceFiles Remote namespace",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json
index 71034eb684..afa52d914f 100644
--- a/packages/attachment/attachment-local/package.json
+++ b/packages/attachment/attachment-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-attachment-local",
"description": "Private content-addressed DSH_HOME attachment storage",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json
index 48cde83037..d98db07b61 100644
--- a/packages/attachment/attachment/package.json
+++ b/packages/attachment/attachment/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-attachment",
"description": "Durable immutable attachment storage seam for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json
index 2e49da08de..64eedc7ae1 100644
--- a/packages/boot/app-boot/package.json
+++ b/packages/boot/app-boot/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-app-boot",
"description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json
index 6a4a9679d9..ea10cc6960 100644
--- a/packages/boot/cmdline/package.json
+++ b/packages/boot/cmdline/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-cmdline",
"description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/bundle/acp-app/package.json b/packages/bundle/acp-app/package.json
index 3fb7dfaa3b..085b7341e5 100644
--- a/packages/bundle/acp-app/package.json
+++ b/packages/bundle/acp-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-acp-app",
"description": "The dsh ACP profile bundle: automation-only JSON-RPC stdio and process lifecycle over dsh-base",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json
index 4f3407903a..64e33f55b1 100644
--- a/packages/bundle/base/package.json
+++ b/packages/bundle/base/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-base",
"description": "The shared dsh core as a profile bundle: the first patch layer of base-backed profiles, inserting core rows over the empty profile root",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json
index b8f809ebf3..1b9e611457 100644
--- a/packages/bundle/headless/package.json
+++ b/packages/bundle/headless/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-headless",
"description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/bundle/sdk-app/package.json b/packages/bundle/sdk-app/package.json
index 1f39ae000b..4fc726caa8 100644
--- a/packages/bundle/sdk-app/package.json
+++ b/packages/bundle/sdk-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sdk-app",
"description": "The dsh SDK profile bundle: stdio JSON-RPC serving and process lifecycle over dsh-base",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/bundle/sdk-minimal/package.json b/packages/bundle/sdk-minimal/package.json
index d95375faed..630f448daf 100644
--- a/packages/bundle/sdk-minimal/package.json
+++ b/packages/bundle/sdk-minimal/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sdk-minimal",
"description": "The standalone minimal SDK profile bundle: JSON-RPC, one DeepSeek adapter, persistent shell, and JSONL sessions",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json
index 692a6be952..6782a6e444 100644
--- a/packages/bundle/web-app/package.json
+++ b/packages/bundle/web-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-web-app",
"description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json
index 9c999a025b..16dceff71f 100644
--- a/packages/client/connection/package.json
+++ b/packages/client/connection/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-connection",
"description": "Authenticated RPC transport, generation lifecycle, and browser fixture",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/file-upload/package.json b/packages/client/file-upload/package.json
index 015a125351..fce7fd086d 100644
--- a/packages/client/file-upload/package.json
+++ b/packages/client/file-upload/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-file-upload",
"description": "Agent-scoped browser file upload, streaming intake, and staged receipt service",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json
index 6295fa479f..a3df146d0f 100644
--- a/packages/client/hmr/package.json
+++ b/packages/client/hmr/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-hmr",
"description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json
index 10177f91e2..49928c9321 100644
--- a/packages/client/locale/package.json
+++ b/packages/client/locale/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-locale",
"description": "Locale plugin: Host-backed preference, extensible language catalog, browser fallback, and typed built-in dictionaries",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json
index 1c09baf8a6..fadb06d13e 100644
--- a/packages/client/modules/package.json
+++ b/packages/client/modules/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-modules",
"description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/resources/package.json b/packages/client/resources/package.json
index cdcd4eed2d..21a47b7544 100644
--- a/packages/client/resources/package.json
+++ b/packages/client/resources/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-resources",
"description": "Unified client resource model: protocol-registered providers turn URL addresses into live values, consumed through the useResource global standard hook",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/store/package.json b/packages/client/store/package.json
index 6bb0c0a212..fe71ce96ce 100644
--- a/packages/client/store/package.json
+++ b/packages/client/store/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-store",
"description": "React-free observable and snapshot-store contracts with the shared Zustand/Immer engine",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json
index 9984d47613..857bc9c906 100644
--- a/packages/client/ui-agent-preset/package.json
+++ b/packages/client/ui-agent-preset/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-agent-preset",
"description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-approval/package.json b/packages/client/ui-approval/package.json
index b4cecaa31d..00138c179e 100644
--- a/packages/client/ui-approval/package.json
+++ b/packages/client/ui-approval/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-approval",
"description": "Approval composer takeover over the scoped Remote Event waterfall",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json
index 9adf41af13..429f1955b3 100644
--- a/packages/client/ui-attachment/package.json
+++ b/packages/client/ui-attachment/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-attachment",
"description": "Dynamic attachment presentation plugin for conversation input, message-image, and trajectory image slots",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-brand-official/package.json b/packages/client/ui-brand-official/package.json
index 0db54ad4f0..62ddf9c91e 100644
--- a/packages/client/ui-brand-official/package.json
+++ b/packages/client/ui-brand-official/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-brand-official",
"description": "Official DeepSeek Harness brand occupants for the Web client's sidebar slots",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-chat/package.json b/packages/client/ui-chat/package.json
index 7a5cb18771..ea9e994e91 100644
--- a/packages/client/ui-chat/package.json
+++ b/packages/client/ui-chat/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-chat",
"description": "Chat Conversation target, node definitions, renderers, and details surface",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json
index 40ce5a3bff..4dc37a8261 100644
--- a/packages/client/ui-commands/package.json
+++ b/packages/client/ui-commands/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-commands",
"description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json
index 987aa9574f..c1e62e4100 100644
--- a/packages/client/ui-conversation/package.json
+++ b/packages/client/ui-conversation/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-conversation",
"description": "Target-neutral Conversation assembly, shell, composer, queue, and view navigation",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json
index 16534d6f8d..dcac6ce807 100644
--- a/packages/client/ui-deliverables/package.json
+++ b/packages/client/ui-deliverables/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-deliverables",
"description": "Produced-files turn tail and clickable final-response file references for Web",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json
index ec0a9d8ed0..f6544117ae 100644
--- a/packages/client/ui-directory-picker-browse/package.json
+++ b/packages/client/ui-directory-picker-browse/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-directory-picker-browse",
"description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json
index 9b370e32bb..1b81a714a8 100644
--- a/packages/client/ui-directory-picker-native/package.json
+++ b/packages/client/ui-directory-picker-native/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-directory-picker-native",
"description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-dockkit/package.json b/packages/client/ui-dockkit/package.json
index d4ce40915b..df264e82f8 100644
--- a/packages/client/ui-dockkit/package.json
+++ b/packages/client/ui-dockkit/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-dockkit",
"description": "Docking layout kit: split-tree engine with invertible operations, and the React components that render and drive it (zero cordis)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json
index 5d516249f9..49f1105462 100644
--- a/packages/client/ui-goal/package.json
+++ b/packages/client/ui-goal/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-goal",
"description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json
index 65e30abb16..d6f3bd7fb6 100644
--- a/packages/client/ui-input-trigger/package.json
+++ b/packages/client/ui-input-trigger/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-input-trigger",
"description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json
index cd0ea7ebe9..196567bb7a 100644
--- a/packages/client/ui-jobs/package.json
+++ b/packages/client/ui-jobs/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-jobs",
"description": "Session-header background-job list: live registry state mirrored from session/jobs frames",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"type": "module",
"main": "lib/index.js",
"types": "lib/types/index.d.ts",
diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json
index a2c025f39d..1beae6f3b0 100644
--- a/packages/client/ui-layout/package.json
+++ b/packages/client/ui-layout/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-layout",
"description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json
index d5fd7aed7e..343f289faa 100644
--- a/packages/client/ui-message-feedback/package.json
+++ b/packages/client/ui-message-feedback/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-message-feedback",
"description": "The Web feedback surface: per-message Like/Dislike in the assistant-message action strip and the feedback dialog behind Dislike and /feedback, backed by the messageFeedback and sessionFeedback Host Remotes",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json
index d3c89480e8..d0951c3d7c 100644
--- a/packages/client/ui-model-selection/package.json
+++ b/packages/client/ui-model-selection/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-model-selection",
"description": "Model selection over the shared model catalog, Session projection, and session.selectModel",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-open-in-app/package.json b/packages/client/ui-open-in-app/package.json
index 3b39d1e5d8..97c063097d 100644
--- a/packages/client/ui-open-in-app/package.json
+++ b/packages/client/ui-open-in-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-open-in-app",
"description": "Web Session-header \"Open In...\" split button opening the session workspace directory in a locally installed application",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json
index e065186bcd..708f3fba3f 100644
--- a/packages/client/ui-permission-presets/package.json
+++ b/packages/client/ui-permission-presets/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-permission-presets",
"description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json
index 7080b89644..6fa0ddcc2f 100644
--- a/packages/client/ui-plan/package.json
+++ b/packages/client/ui-plan/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-plan",
"description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json
index 2613c3aa98..ca37e9b16f 100644
--- a/packages/client/ui-primitives/package.json
+++ b/packages/client/ui-primitives/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-primitives",
"description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-reference/package.json b/packages/client/ui-reference/package.json
index 2e57deca88..7bfe165621 100644
--- a/packages/client/ui-reference/package.json
+++ b/packages/client/ui-reference/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-reference",
"description": "Unified Web @file and @session reference source",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-renderer/package.json b/packages/client/ui-renderer/package.json
index 2aefdb4b1e..f1f6d4721d 100644
--- a/packages/client/ui-renderer/package.json
+++ b/packages/client/ui-renderer/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-renderer",
"description": "Browser UI renderer: React slot bindings, ctx.uiRenderer, and the assembled application root",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-schedule/package.json b/packages/client/ui-schedule/package.json
index e47d9ad54a..a2a6536d3d 100644
--- a/packages/client/ui-schedule/package.json
+++ b/packages/client/ui-schedule/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-schedule",
"description": "Read-only active Schedule catalog in the Web Session header",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"type": "module",
"main": "lib/index.js",
"types": "lib/types/index.d.ts",
diff --git a/packages/client/ui-session/package.json b/packages/client/ui-session/package.json
index 9996019293..3e09735e19 100644
--- a/packages/client/ui-session/package.json
+++ b/packages/client/ui-session/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-session",
"description": "Session Controller adapter for React and session-scoped slots",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json
index 2d33e995f4..8327d2ca1e 100644
--- a/packages/client/ui-settings-general/package.json
+++ b/packages/client/ui-settings-general/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-settings-general",
"description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json
index da707bee60..a3d882b2e8 100644
--- a/packages/client/ui-settings-models/package.json
+++ b/packages/client/ui-settings-models/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-settings-models",
"description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json
index 84d0b26e40..0755e07977 100644
--- a/packages/client/ui-settings-plugin-inventory/package.json
+++ b/packages/client/ui-settings-plugin-inventory/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory",
"description": "Read-only Cordis Loader inventory tab in Web Plugins settings",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json
index c4b27fae88..acc7a836dd 100644
--- a/packages/client/ui-settings-plugins/package.json
+++ b/packages/client/ui-settings-plugins/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-settings-plugins",
"description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json
index 305ecef2fa..dffc545328 100644
--- a/packages/client/ui-settings/package.json
+++ b/packages/client/ui-settings/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-settings",
"description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-sidebar-documentpreview/package.json b/packages/client/ui-sidebar-documentpreview/package.json
index 8d592decc0..af3d91613f 100644
--- a/packages/client/ui-sidebar-documentpreview/package.json
+++ b/packages/client/ui-sidebar-documentpreview/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-sidebar-documentpreview",
"description": "Extensible document previews for Sidebar files: Markdown, highlighted code, images, PDF, HTML, and plain text",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-sidebar-files/package.json b/packages/client/ui-sidebar-files/package.json
index ce97ee1ffc..619884d036 100644
--- a/packages/client/ui-sidebar-files/package.json
+++ b/packages/client/ui-sidebar-files/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-sidebar-files",
"description": "Workspace file tree tab type for the right Sidebar: lazy directory listing over the workspaceFiles Remote namespace, opening files into the Sidebar",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-sidebar-right/package.json b/packages/client/ui-sidebar-right/package.json
index c8fad0215c..31b8055429 100644
--- a/packages/client/ui-sidebar-right/package.json
+++ b/packages/client/ui-sidebar-right/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-sidebar-right",
"description": "Right Sidebar: the docking surface's session-bound state, its panel and header expand control, and the navigation service over it",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json
index 3fb78453b2..6fda5a97db 100644
--- a/packages/client/ui-sidebar/package.json
+++ b/packages/client/ui-sidebar/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-sidebar",
"description": "Sidebar plugin: session multi-level tree, search, grouping, state dots",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json
index cefa0086f2..9db4e24efd 100644
--- a/packages/client/ui-skill/package.json
+++ b/packages/client/ui-skill/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-skill",
"description": "Web skill references and the dedicated skill tool row",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json
index fce80c249e..f01270278e 100644
--- a/packages/client/ui-slots/package.json
+++ b/packages/client/ui-slots/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-slots",
"description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json
index fe75323062..1835c7f7a2 100644
--- a/packages/client/ui-subagent/package.json
+++ b/packages/client/ui-subagent/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-subagent",
"description": "Subagent conversation catalog, continuation routing UI, and '@' reference source",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json
index 5f9dd4940c..610bd399ab 100644
--- a/packages/client/ui-theme/package.json
+++ b/packages/client/ui-theme/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-theme",
"description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json
index 3a3722d64d..14030de47a 100644
--- a/packages/client/ui-tool/package.json
+++ b/packages/client/ui-tool/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-tool",
"description": "Client Tool call-tree renderer and keyed per-tool presentation slot",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json
index 7f9752a6a8..417c8a47e3 100644
--- a/packages/client/ui-trajectory/package.json
+++ b/packages/client/ui-trajectory/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-trajectory",
"description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-user-questions/package.json b/packages/client/ui-user-questions/package.json
index b32352c522..16883d3686 100644
--- a/packages/client/ui-user-questions/package.json
+++ b/packages/client/ui-user-questions/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-user-questions",
"description": "Web ask_user_question composer takeover and plan-review presentation UI",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-workflow-run/package.json b/packages/client/ui-workflow-run/package.json
index 15ca5a0d2d..a44c93a427 100644
--- a/packages/client/ui-workflow-run/package.json
+++ b/packages/client/ui-workflow-run/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-workflow-run",
"description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/ui-workspace/package.json b/packages/client/ui-workspace/package.json
index 3a35cae4d4..72b3b8ff33 100644
--- a/packages/client/ui-workspace/package.json
+++ b/packages/client/ui-workspace/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-workspace",
"description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/client/web/package.json b/packages/client/web/package.json
index 64b36efc5c..6a9a8364c0 100644
--- a/packages/client/web/package.json
+++ b/packages/client/web/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-web",
"description": "Web boot kernel: static module table, Cordis loader, framework-free boot page, and UI-renderer handoff",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/code-runtime/code-runtime-worker-thread/package.json b/packages/code-runtime/code-runtime-worker-thread/package.json
index e69ccc2f52..a31e670376 100644
--- a/packages/code-runtime/code-runtime-worker-thread/package.json
+++ b/packages/code-runtime/code-runtime-worker-thread/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-code-runtime-worker-thread",
"description": "Worker-thread implementation of the DeepSeek Harness code-execution seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/code-runtime/code-runtime/package.json b/packages/code-runtime/code-runtime/package.json
index a49f2cf0a9..4321c52d38 100644
--- a/packages/code-runtime/code-runtime/package.json
+++ b/packages/code-runtime/code-runtime/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-code-runtime",
"description": "Abstract code-execution seam (ctx.codeRuntime) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/compaction/command-compact/package.json b/packages/compaction/command-compact/package.json
index faffbe4943..a18140fa85 100644
--- a/packages/compaction/command-compact/package.json
+++ b/packages/compaction/command-compact/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-command-compact",
"description": "Human-facing slash command for explicit session compaction",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/compaction/compaction-basic/package.json b/packages/compaction/compaction-basic/package.json
index 69de3038dd..8de83e4f12 100644
--- a/packages/compaction/compaction-basic/package.json
+++ b/packages/compaction/compaction-basic/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-compaction-basic",
"description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/compaction/compaction-tool-result-pruner/package.json b/packages/compaction/compaction-tool-result-pruner/package.json
index 3cf8b5d169..57dd414347 100644
--- a/packages/compaction/compaction-tool-result-pruner/package.json
+++ b/packages/compaction/compaction-tool-result-pruner/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-compaction-tool-result-pruner",
"description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/compaction/compaction/package.json b/packages/compaction/compaction/package.json
index 54ad37fdd1..110298ffbf 100644
--- a/packages/compaction/compaction/package.json
+++ b/packages/compaction/compaction/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-compaction",
"description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/context/agent-instructions/package.json b/packages/context/agent-instructions/package.json
index 6c94153e57..a9b57dc9c0 100644
--- a/packages/context/agent-instructions/package.json
+++ b/packages/context/agent-instructions/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent-instructions",
"description": "Workspace context loader for AGENTS.md/CLAUDE.md instruction files",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/context/file-reference-local/package.json b/packages/context/file-reference-local/package.json
index 8f419495dd..cb46191bc6 100644
--- a/packages/context/file-reference-local/package.json
+++ b/packages/context/file-reference-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-file-reference-local",
"description": "Local-filesystem ctx.fileReferences provider with bounded fuzzy indexes",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/context/file-reference/package.json b/packages/context/file-reference/package.json
index c33a4cfece..890676082d 100644
--- a/packages/context/file-reference/package.json
+++ b/packages/context/file-reference/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-file-reference",
"description": "File-reference discovery contract and shared @file grammar",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/context/session-reference/package.json b/packages/context/session-reference/package.json
index 444f4f5d7e..c5899f1094 100644
--- a/packages/context/session-reference/package.json
+++ b/packages/context/session-reference/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-reference",
"description": "Cross-session snapshot references and durable untrusted model context (ctx.sessionReferenceResolver)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/context/time-context/package.json b/packages/context/time-context/package.json
index 1d6e5a374c..634bfc2058 100644
--- a/packages/context/time-context/package.json
+++ b/packages/context/time-context/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-time-context",
"description": "Opt-in durable per-step context with the current time and elapsed time",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/context/tmux-context/package.json b/packages/context/tmux-context/package.json
index 113aa345c3..9a3696c994 100644
--- a/packages/context/tmux-context/package.json
+++ b/packages/context/tmux-context/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tmux-context",
"description": "Opt-in durable per-step context with this agent's tmux pane and window location",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/agent-default-model/package.json b/packages/core/agent-default-model/package.json
index 409b297f35..02f25d90b0 100644
--- a/packages/core/agent-default-model/package.json
+++ b/packages/core/agent-default-model/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent-default-model",
"description": "Default model selection shared by Agent entry points",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/agent-loop/package.json b/packages/core/agent-loop/package.json
index d73c8085ea..627c46ff44 100644
--- a/packages/core/agent-loop/package.json
+++ b/packages/core/agent-loop/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent-loop",
"description": "The concrete agent loop plugin for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/agent-tool-presentation/package.json b/packages/core/agent-tool-presentation/package.json
index 55f24b532e..b1069260d4 100644
--- a/packages/core/agent-tool-presentation/package.json
+++ b/packages/core/agent-tool-presentation/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent-tool-presentation",
"description": "Agent-plane presentation selector: composes one agent's tools as PTC mode, native, or both",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/agent/package.json b/packages/core/agent/package.json
index 2df9571f97..e654ac0d2f 100644
--- a/packages/core/agent/package.json
+++ b/packages/core/agent/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent",
"description": "Agent interface, registry, initiator scope, and event vocabulary for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/scope/package.json b/packages/core/scope/package.json
index 2922794f45..bb0d51aa0e 100644
--- a/packages/core/scope/package.json
+++ b/packages/core/scope/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-scope",
"description": "Scoped-context registration primitive (scope tags, scope-filtered event dispatch) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/session/package.json b/packages/core/session/package.json
index 65db598136..7b7858cb3d 100644
--- a/packages/core/session/package.json
+++ b/packages/core/session/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session",
"description": "Event-sourced session store for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/system-prompt/package.json b/packages/core/system-prompt/package.json
index 7ca95e44c7..cb431d3fbd 100644
--- a/packages/core/system-prompt/package.json
+++ b/packages/core/system-prompt/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-system-prompt",
"description": "System prompt assembly registry for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/core/tools/package.json b/packages/core/tools/package.json
index ebb966cb43..174d6f6902 100644
--- a/packages/core/tools/package.json
+++ b/packages/core/tools/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tools",
"description": "Tool registry and execution pipeline for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/credentials/authorization/package.json b/packages/credentials/authorization/package.json
index 728f091539..2bfb81078c 100644
--- a/packages/credentials/authorization/package.json
+++ b/packages/credentials/authorization/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-authorization",
"description": "Authorization seam (ctx.authorization): plugin-owned flows that obtain a credential through a conversation with the human",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/credentials/credentials-local/package.json b/packages/credentials/credentials-local/package.json
index 4bd2a9daa0..5e0a6ce461 100644
--- a/packages/credentials/credentials-local/package.json
+++ b/packages/credentials/credentials-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-credentials-local",
"description": "File-backed credentials provider ($DSH_HOME/.env under the live process environment) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/credentials/credentials/package.json b/packages/credentials/credentials/package.json
index 0ccc71df24..d41f37d3ec 100644
--- a/packages/credentials/credentials/package.json
+++ b/packages/credentials/credentials/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-credentials",
"description": "Abstract credential seam (ctx.credentials): settings carry references to secrets, providers own the values",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/e2b/e2b/package.json b/packages/e2b/e2b/package.json
index efcaa3d50c..373e619db7 100644
--- a/packages/e2b/e2b/package.json
+++ b/packages/e2b/e2b/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-e2b",
"description": "Shared E2B sandbox lifecycle for DeepSeek Harness provider adapters",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/e2b/fs-e2b/package.json b/packages/e2b/fs-e2b/package.json
index c646180f50..e63f687f60 100644
--- a/packages/e2b/fs-e2b/package.json
+++ b/packages/e2b/fs-e2b/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-fs-e2b",
"description": "E2B filesystem implementation for DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/e2b/subprocess-e2b/package.json b/packages/e2b/subprocess-e2b/package.json
index e75003e983..a5f999e7d5 100644
--- a/packages/e2b/subprocess-e2b/package.json
+++ b/packages/e2b/subprocess-e2b/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subprocess-e2b",
"description": "E2B subprocess implementation for DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/experimental/agent-team-profile/package.json b/packages/experimental/agent-team-profile/package.json
index 699ebc29ec..219b268ddd 100644
--- a/packages/experimental/agent-team-profile/package.json
+++ b/packages/experimental/agent-team-profile/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-agent-team-profile",
"description": "Experimental profile bundle enabling Agent Teams over dsh-base",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/experimental/agent-team-web-profile/package.json b/packages/experimental/agent-team-web-profile/package.json
index 4ca780b18c..48ea6d71ba 100644
--- a/packages/experimental/agent-team-web-profile/package.json
+++ b/packages/experimental/agent-team-web-profile/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-agent-team-web-profile",
"description": "Experimental Web profile layer for Agent Teams Remote and UI plugins",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/experimental/agent-team/package.json b/packages/experimental/agent-team/package.json
index dee4fc8756..5f04d02601 100644
--- a/packages/experimental/agent-team/package.json
+++ b/packages/experimental/agent-team/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-agent-team",
"description": "Implicit-root Agent Teams roster, durable peer mailbox, and shared task DAG",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/experimental/client-ui-agent-team/package.json b/packages/experimental/client-ui-agent-team/package.json
index 12fa3b7275..3584f6493c 100644
--- a/packages/experimental/client-ui-agent-team/package.json
+++ b/packages/experimental/client-ui-agent-team/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-client-ui-agent-team",
"description": "Web Agent Teams roster, task board, and teammate navigation",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/experimental/code-runtime-python/package.json b/packages/experimental/code-runtime-python/package.json
index b179c1a16b..7db8fe5dfe 100644
--- a/packages/experimental/code-runtime-python/package.json
+++ b/packages/experimental/code-runtime-python/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-code-runtime-python",
"description": "CPython subprocess implementation of the DeepSeek Harness code-execution seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"repository": {
"type": "git",
"url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
diff --git a/packages/experimental/inspector/package.json b/packages/experimental/inspector/package.json
index e195c6f09a..a9c1e10725 100644
--- a/packages/experimental/inspector/package.json
+++ b/packages/experimental/inspector/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-inspector",
"description": "Experimental cross-realm CDP hub for Host debugging and Client Runtime inspection",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"private": true,
"repository": {
"type": "git",
diff --git a/packages/experimental/tool-agent-team/package.json b/packages/experimental/tool-agent-team/package.json
index eb41e65d5f..fb5779f90c 100644
--- a/packages/experimental/tool-agent-team/package.json
+++ b/packages/experimental/tool-agent-team/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-tool-agent-team",
"description": "Scoped model-facing Agent Teams tools over ctx.agentTeams",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/experimental/webworker-packer/package.json b/packages/experimental/webworker-packer/package.json
index ba52e9e94e..264e8edea7 100644
--- a/packages/experimental/webworker-packer/package.json
+++ b/packages/experimental/webworker-packer/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-webworker-packer",
"description": "Build-time packer for the browser runtime's base VFS image and ordered data-overlay archives",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"private": true,
"repository": {
"type": "git",
diff --git a/packages/experimental/webworker-runtime/package.json b/packages/experimental/webworker-runtime/package.json
index a1a54e1e0f..a0d088ce71 100644
--- a/packages/experimental/webworker-runtime/package.json
+++ b/packages/experimental/webworker-runtime/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-experimental-webworker-runtime",
"description": "Browser-only harness runtime: in-memory VFS, module transform and loader, postMessage tunnel, and the dedicated Web Worker assembly, with the Node-compatibility layer that lets the host tree run unchanged",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"private": true,
"repository": {
"type": "git",
diff --git a/packages/extensions/cordis-client-runner/package.json b/packages/extensions/cordis-client-runner/package.json
index b6b0e3c9ac..c57e78e8ab 100644
--- a/packages/extensions/cordis-client-runner/package.json
+++ b/packages/extensions/cordis-client-runner/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-cordis-client-runner",
"description": "Browser half of dynamic dual-half plugin packages: event subscription, closure evaluation, guard facade, and loader entries",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/extensions/cordis-host-runner/package.json b/packages/extensions/cordis-host-runner/package.json
index c673c2faaf..53e27100c2 100644
--- a/packages/extensions/cordis-host-runner/package.json
+++ b/packages/extensions/cordis-host-runner/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-cordis-host-runner",
"description": "Dynamic package definition registry, host-half sandbox lifecycle, and invoke handler table for model-mounted dual-half packages",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/extensions/tool-cordis/package.json b/packages/extensions/tool-cordis/package.json
index 1499e1db10..da941bf469 100644
--- a/packages/extensions/tool-cordis/package.json
+++ b/packages/extensions/tool-cordis/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-cordis",
"description": "Self-referential cordis toolset: inspect the live runtime, mount and dispose model-written plugins",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/extensions/ui-cordis/package.json b/packages/extensions/ui-cordis/package.json
index 20b473f2f6..07b34e3d7b 100644
--- a/packages/extensions/ui-cordis/package.json
+++ b/packages/extensions/ui-cordis/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-ui-cordis",
"description": "Cordis dynamic-plugin definition card: the keyed cordis_define tool row with its run/stop switch",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/feedback/command-feedback/package.json b/packages/feedback/command-feedback/package.json
index 39e700ddae..357e06639c 100644
--- a/packages/feedback/command-feedback/package.json
+++ b/packages/feedback/command-feedback/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-command-feedback",
"description": "Log-only session feedback: the record event, the sessionFeedback Host Remote, and the human-facing slash command",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/feedback/message-feedback/package.json b/packages/feedback/message-feedback/package.json
index 456800ba92..7b0031ab1f 100644
--- a/packages/feedback/message-feedback/package.json
+++ b/packages/feedback/message-feedback/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-message-feedback",
"description": "Canonical Session-log ratings and notes for finalized assistant messages",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/fs-local/package.json b/packages/fs/fs-local/package.json
index ea0ba6695b..3b7492c05b 100644
--- a/packages/fs/fs-local/package.json
+++ b/packages/fs/fs-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-fs-local",
"description": "Local-filesystem implementation of the DeepSeek Harness filesystem seam (ctx.fs)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/fs-observation-policy/package.json b/packages/fs/fs-observation-policy/package.json
index 4e59ada1ac..bb2f3d986f 100644
--- a/packages/fs/fs-observation-policy/package.json
+++ b/packages/fs/fs-observation-policy/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-fs-observation-policy",
"description": "File-context policy plugin for the DeepSeek Harness — observed-state, read-before-edit, and version-guarded write/edit added over the ctx.fs provider seam through the fs/* event gate (no service API)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/fs-sandbox/package.json b/packages/fs/fs-sandbox/package.json
index 841e8ca041..f1eda99e86 100644
--- a/packages/fs/fs-sandbox/package.json
+++ b/packages/fs/fs-sandbox/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-fs-sandbox",
"description": "Sandbox-enforcing implementation of the DeepSeek Harness filesystem seam: fences write/edit by the per-call sandbox mode (read-only denies mutation, workspace-write contains it to the workspace + temp roots) while reads pass through",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/fs/package.json b/packages/fs/fs/package.json
index 6d4a55441d..4944f3f7db 100644
--- a/packages/fs/fs/package.json
+++ b/packages/fs/fs/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-fs",
"description": "Abstract filesystem capability seam (ctx.fs) for the DeepSeek Harness — vocabulary types, the FileSystem service (text IO + optional version-guarded atomic mutations), and the fs/* policy event vocabulary",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/tool-fs-search/package.json b/packages/fs/tool-fs-search/package.json
index 5d9842a174..db3715b502 100644
--- a/packages/fs/tool-fs-search/package.json
+++ b/packages/fs/tool-fs-search/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-fs-search",
"description": "Model-facing filesystem discovery tools (glob, grep) backed by the packaged ripgrep binary (@vscode/ripgrep)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/tool-fs/package.json b/packages/fs/tool-fs/package.json
index e44c7a7f07..062a553050 100644
--- a/packages/fs/tool-fs/package.json
+++ b/packages/fs/tool-fs/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-fs",
"description": "Model-facing filesystem tools (read, write, edit) over the DeepSeek Harness filesystem seam (ctx.fs)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/tool-present/package.json b/packages/fs/tool-present/package.json
index d1847ded9d..0baffa2345 100644
--- a/packages/fs/tool-present/package.json
+++ b/packages/fs/tool-present/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-present",
"description": "Explicit workspace file delivery declarations for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/fs/tool-str-replace-editor/package.json b/packages/fs/tool-str-replace-editor/package.json
index 9eb68b3a95..669f8da8a5 100644
--- a/packages/fs/tool-str-replace-editor/package.json
+++ b/packages/fs/tool-str-replace-editor/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-str-replace-editor",
"description": "Model-facing view, create, literal replace, and line insert tool over the Harness filesystem service",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/goal/command-goal/package.json b/packages/goal/command-goal/package.json
index 238a65e732..c279129914 100644
--- a/packages/goal/command-goal/package.json
+++ b/packages/goal/command-goal/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-command-goal",
"description": "Human-facing slash command for persisted same-session goals",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/goal/goal-round-driver/package.json b/packages/goal/goal-round-driver/package.json
index 7fe8fb72ff..43704663e2 100644
--- a/packages/goal/goal-round-driver/package.json
+++ b/packages/goal/goal-round-driver/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-goal-round-driver",
"description": "Race-fenced same-session goal-round driver",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/goal/goal/package.json b/packages/goal/goal/package.json
index 4558efc896..013acc8c31 100644
--- a/packages/goal/goal/package.json
+++ b/packages/goal/goal/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-goal",
"description": "Event-sourced same-session goal state and lifecycle service for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/goal/tool-goal/package.json b/packages/goal/tool-goal/package.json
index 1204bbee09..c6836cf722 100644
--- a/packages/goal/tool-goal/package.json
+++ b/packages/goal/tool-goal/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-goal",
"description": "Model-facing same-session goal tools with execution-time authority checks",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/guard/repeat-tool-reminder/package.json b/packages/guard/repeat-tool-reminder/package.json
index 9f4876b47c..76a61f7a6d 100644
--- a/packages/guard/repeat-tool-reminder/package.json
+++ b/packages/guard/repeat-tool-reminder/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-repeat-tool-reminder",
"description": "Repeat-tool-call guard plugin: advisory reminders when an agent loops on identical tool calls",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/guard/timeout-policy/package.json b/packages/guard/timeout-policy/package.json
index 59f19a67ad..50c9064807 100644
--- a/packages/guard/timeout-policy/package.json
+++ b/packages/guard/timeout-policy/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-call-timeout-policy",
"description": "Tool-call timeout policy: a tools/execute wrapper that arms a per-tool deadline on exec.signal and returns TOOL_TIMEOUT when it wins",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/hooks/hook-protocol/package.json b/packages/hooks/hook-protocol/package.json
index 90fa06db8d..953ff92fce 100644
--- a/packages/hooks/hook-protocol/package.json
+++ b/packages/hooks/hook-protocol/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-hook-protocol",
"description": "Shared Claude Code / Codex hook wire protocol: matcher engine, stdin/exit-code/stdout codec, multi-hook merge, and hook/* session events",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/hooks/hooks-claude-code/package.json b/packages/hooks/hooks-claude-code/package.json
index 6b7cd0594b..8e77285198 100644
--- a/packages/hooks/hooks-claude-code/package.json
+++ b/packages/hooks/hooks-claude-code/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-hooks-claude-code",
"description": "Bridge plugin: run a Claude Code hooks.json / settings hook config on the DeepSeek Harness interception seams",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/hooks/hooks-codex/package.json b/packages/hooks/hooks-codex/package.json
index 4da41ec1da..846f035e97 100644
--- a/packages/hooks/hooks-codex/package.json
+++ b/packages/hooks/hooks-codex/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-hooks-codex",
"description": "Bridge plugin: run a Codex hooks.json hook config on the DeepSeek Harness interception seams",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/directory-picker-auto/package.json b/packages/host/directory-picker-auto/package.json
index 68d31835d3..32278ecaba 100644
--- a/packages/host/directory-picker-auto/package.json
+++ b/packages/host/directory-picker-auto/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-directory-picker-auto",
"description": "Adaptive chooser of the directory-picker seam: resolves the host situation at boot and mounts the native or browse backend for the DeepSeek Harness web GUI host",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/directory-picker-browse/package.json b/packages/host/directory-picker-browse/package.json
index 66198388ae..8ea96e6341 100644
--- a/packages/host/directory-picker-browse/package.json
+++ b/packages/host/directory-picker-browse/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-directory-picker-browse",
"description": "In-app browsing backend of the directory-picker seam (listing/creation primitives over the host filesystem)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/directory-picker-native/package.json b/packages/host/directory-picker-native/package.json
index 9e1547073c..b6bb6d9110 100644
--- a/packages/host/directory-picker-native/package.json
+++ b/packages/host/directory-picker-native/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-directory-picker-native",
"description": "Native-OS-chooser backend of the directory-picker seam for the DeepSeek Harness web GUI host",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/directory-picker/package.json b/packages/host/directory-picker/package.json
index 10d3b4e2a0..ef0e68372d 100644
--- a/packages/host/directory-picker/package.json
+++ b/packages/host/directory-picker/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-directory-picker",
"description": "Abstract workspace-directory picking seam (ctx.directoryPicker) for the DeepSeek Harness web GUI host",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/frontend-static/package.json b/packages/host/frontend-static/package.json
index f1413302a0..e348e08d2a 100644
--- a/packages/host/frontend-static/package.json
+++ b/packages/host/frontend-static/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-frontend-static",
"description": "SPA dist server for the Web shell: owns the webserver fallback seat, serving explicit index entries and static assets with traversal rejection and 404 misses",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/open-in-app/package.json b/packages/host/open-in-app/package.json
index ceb0c74b33..c88582a6fd 100644
--- a/packages/host/open-in-app/package.json
+++ b/packages/host/open-in-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-open-in-app",
"description": "Host half of open-in-app: resolved application catalog, icons, and the launch endpoint as three webServer routes",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/plugin-inventory/package.json b/packages/host/plugin-inventory/package.json
index a3bdbe1e8f..65ed93c1d9 100644
--- a/packages/host/plugin-inventory/package.json
+++ b/packages/host/plugin-inventory/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-plugin-inventory",
"description": "Read-only Remote projection of current Cordis Loader plugin state",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/host/webserver/package.json b/packages/host/webserver/package.json
index 01c1dd58aa..96ab1c4704 100644
--- a/packages/host/webserver/package.json
+++ b/packages/host/webserver/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-host-webserver",
"description": "Web route-registration plugin: HTTP and upgrade routes, index transform taps, and static dist fallback; knows no harness concepts",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/identity/anonymous-user-id/package.json b/packages/identity/anonymous-user-id/package.json
index 1873a8dbb7..2d9d2d82b4 100644
--- a/packages/identity/anonymous-user-id/package.json
+++ b/packages/identity/anonymous-user-id/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-anonymous-user-id",
"description": "Shared anonymous user identity for DeepSeek Harness telemetry and feedback correlation",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/interaction/commands/package.json b/packages/interaction/commands/package.json
index c29b99c7f0..1fe03def46 100644
--- a/packages/interaction/commands/package.json
+++ b/packages/interaction/commands/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-commands",
"description": "Plugin-owned human command registry for DeepSeek Harness UIs",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/interaction/permission-presets/package.json b/packages/interaction/permission-presets/package.json
index fb5c7cd1aa..ef46950a5b 100644
--- a/packages/interaction/permission-presets/package.json
+++ b/packages/interaction/permission-presets/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-permission-presets",
"description": "User-facing permission presets (ctx.permissionPresets) for the DeepSeek Harness: one product-level Permissions select bundling the sandbox-mode and approval-policy knobs, written through to their own session events",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/interaction/tool-ask-user/package.json b/packages/interaction/tool-ask-user/package.json
index bcc4d7c002..91b43a476d 100644
--- a/packages/interaction/tool-ask-user/package.json
+++ b/packages/interaction/tool-ask-user/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-ask-user",
"description": "Model-facing ask_user_question tool over the ctx.userQuestions seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/interaction/user-approval/package.json b/packages/interaction/user-approval/package.json
index 786ac6f456..30ac058e29 100644
--- a/packages/interaction/user-approval/package.json
+++ b/packages/interaction/user-approval/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-user-approval",
"description": "User-approval seam (ctx.approval) for the DeepSeek Harness: one-shot permission decisions dispatched to composed answerers over the approval/request waterfall, fail-closed by default",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/interaction/user-questions/package.json b/packages/interaction/user-questions/package.json
index c65c17c91d..c9936649b9 100644
--- a/packages/interaction/user-questions/package.json
+++ b/packages/interaction/user-questions/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-user-questions",
"description": "Abstract user-questions seam (ctx.userQuestions) for asking the human during agent runs",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/jobs/jobs-local/package.json b/packages/jobs/jobs-local/package.json
index 208bb4f66e..5a262665d7 100644
--- a/packages/jobs/jobs-local/package.json
+++ b/packages/jobs/jobs-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-jobs-local",
"description": "Process-local implementation of the DeepSeek Harness background job registry seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/jobs/jobs/package.json b/packages/jobs/jobs/package.json
index 94744c6a2a..b567121e03 100644
--- a/packages/jobs/jobs/package.json
+++ b/packages/jobs/jobs/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-jobs",
"description": "Background job registry (ctx.jobs) for the DeepSeek Harness — shared ids, owner isolation, polling, cancellation, and completion listeners for long-running tool work",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/jobs/tool-jobs/package.json b/packages/jobs/tool-jobs/package.json
index d908add0a6..03615aea99 100644
--- a/packages/jobs/tool-jobs/package.json
+++ b/packages/jobs/tool-jobs/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-jobs",
"description": "Model-facing background job control tools (job_output, job_list, job_kill) over the ctx.jobs registry",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/llm/deepseek-llm-api-extensions/package.json b/packages/llm/deepseek-llm-api-extensions/package.json
index 24804f96db..411cd64bba 100644
--- a/packages/llm/deepseek-llm-api-extensions/package.json
+++ b/packages/llm/deepseek-llm-api-extensions/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-deepseek-llm-api-extensions",
"description": "Additive request-field registry for the official DeepSeek LLM API adapter",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/llm/llm-deepseek/package.json b/packages/llm/llm-deepseek/package.json
index b10ec1ff14..f9a8d5c09a 100644
--- a/packages/llm/llm-deepseek/package.json
+++ b/packages/llm/llm-deepseek/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-llm-deepseek",
"description": "DeepSeek chat-completions adapter for the DeepSeek Harness LLM seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json
index 28652bf860..2c7d5ca5c6 100644
--- a/packages/llm/llm-pi-ai/package.json
+++ b/packages/llm/llm-pi-ai/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-llm-pi-ai",
"description": "pi-ai-backed DeepSeek adapter for the DeepSeek Harness LLM seam (design-verification twin of dsh-llm-deepseek)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/llm/llm-retry/package.json b/packages/llm/llm-retry/package.json
index 5e3fef8315..b0033c09a7 100644
--- a/packages/llm/llm-retry/package.json
+++ b/packages/llm/llm-retry/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-llm-retry",
"description": "Provider-routed LLM request retry policy for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/llm/llm/package.json b/packages/llm/llm/package.json
index 73235b3521..9e4a322e0b 100644
--- a/packages/llm/llm/package.json
+++ b/packages/llm/llm/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-llm",
"description": "Provider-neutral LLM service interface for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/llm/plugin-package-inventory-deepseek/package.json b/packages/llm/plugin-package-inventory-deepseek/package.json
index 16cd26163a..46193fec94 100644
--- a/packages/llm/plugin-package-inventory-deepseek/package.json
+++ b/packages/llm/plugin-package-inventory-deepseek/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-plugin-package-inventory-deepseek",
"description": "Active Loader-backed plugin package inventory for official DeepSeek LLM API requests",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/llm/token-meter/package.json b/packages/llm/token-meter/package.json
index 5a19084762..983f61a42f 100644
--- a/packages/llm/token-meter/package.json
+++ b/packages/llm/token-meter/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-token-meter",
"description": "Replay-aware token measurement service (ctx.tokenMeter) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/lsp/lsp-stdio/package.json b/packages/lsp/lsp-stdio/package.json
index 99f8f79231..5ede6bd195 100644
--- a/packages/lsp/lsp-stdio/package.json
+++ b/packages/lsp/lsp-stdio/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-lsp-stdio",
"description": "Generic stdio language-server provider for the DeepSeek Harness LSP capability seam (ctx.lsp) — spawns configured servers, translates JSON-RPC, and serves transient-open goToDefinition/findReferences/goToImplementation/hover queries in the host filesystem namespace",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/lsp/lsp/package.json b/packages/lsp/lsp/package.json
index 175508a801..71a7be6754 100644
--- a/packages/lsp/lsp/package.json
+++ b/packages/lsp/lsp/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-lsp",
"description": "Abstract LSP capability seam (ctx.lsp) for the DeepSeek Harness — language-server provider registry keyed by branded id and extension mapping, order-independent per-query selection, normalized definition/references/implementation/hover requests and results, and the LspError taxonomy",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/lsp/tool-lsp/package.json b/packages/lsp/tool-lsp/package.json
index aef7b01bc8..2cb4805bc0 100644
--- a/packages/lsp/tool-lsp/package.json
+++ b/packages/lsp/tool-lsp/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-lsp",
"description": "Model-facing lsp tool over the DeepSeek Harness LSP capability seam (ctx.lsp) — one read-only tool with goToDefinition/findReferences/goToImplementation/hover operations, one-based UTF-16 cursor coordinates, bounded location rendering, and hover normalization",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/mcp/mcp-client/package.json b/packages/mcp/mcp-client/package.json
index 3cc384ca25..b4d921a813 100644
--- a/packages/mcp/mcp-client/package.json
+++ b/packages/mcp/mcp-client/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-mcp-client",
"description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/plan/plan-mode/package.json b/packages/plan/plan-mode/package.json
index cab618dccd..759f290dda 100644
--- a/packages/plan/plan-mode/package.json
+++ b/packages/plan/plan-mode/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-plan-mode",
"description": "Logged per-agent plan mode with deployment guidance, a direct slash command, and a user-reviewed exit",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/preset/agent-presets/package.json b/packages/preset/agent-presets/package.json
index a632b21ee0..e6a026225a 100644
--- a/packages/preset/agent-presets/package.json
+++ b/packages/preset/agent-presets/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent-presets",
"description": "Per-session agent composition from preset cordis.yml files for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/preset/persona/package.json b/packages/preset/persona/package.json
index ec81978b55..ac69830a75 100644
--- a/packages/preset/persona/package.json
+++ b/packages/preset/persona/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-persona",
"description": "Composition-authored deployment persona section for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/runtime-diagnostics/invariants/package.json b/packages/runtime-diagnostics/invariants/package.json
index 4666c078d5..6dcf6f5517 100644
--- a/packages/runtime-diagnostics/invariants/package.json
+++ b/packages/runtime-diagnostics/invariants/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-invariants",
"description": "Registry service for package-owned DeepSeek Harness runtime invariants",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/sandbox/sandbox-local/package.json b/packages/sandbox/sandbox-local/package.json
index c9a5618507..02200c0e13 100644
--- a/packages/sandbox/sandbox-local/package.json
+++ b/packages/sandbox/sandbox-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sandbox-local",
"description": "Local process-sandbox backends for the DeepSeek Harness sandbox seam: bwrap, the npm-distributed landlock-run launcher, macOS Seatbelt, or the Windows ACL restricted-token runner — functionally probed, fail-closed",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/sandbox/sandbox-policy/package.json b/packages/sandbox/sandbox-policy/package.json
index 7a21457c90..3f59b340c6 100644
--- a/packages/sandbox/sandbox-policy/package.json
+++ b/packages/sandbox/sandbox-policy/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sandbox-policy",
"description": "Per-call sandbox policy resolver and current model context: deployment fallbacks plus each session's mode and workspace root, shared by every enforcing capability family",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/sandbox/sandbox-windows-acl/package.json b/packages/sandbox/sandbox-windows-acl/package.json
index 27ca514db8..5de9c52edf 100644
--- a/packages/sandbox/sandbox-windows-acl/package.json
+++ b/packages/sandbox/sandbox-windows-acl/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sandbox-windows-acl",
"description": "Windows ACL write-restriction sandbox backend (restricted-token spawn with capability-SID write allowlist) for the DeepSeek Harness sandbox seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/sandbox/sandbox/package.json b/packages/sandbox/sandbox/package.json
index 02c4e0eee8..f817a85049 100644
--- a/packages/sandbox/sandbox/package.json
+++ b/packages/sandbox/sandbox/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sandbox",
"description": "Abstract process-sandbox seam (ctx.sandbox) for the DeepSeek Harness: same-world confinement vocabulary and the SandboxProvider contract",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/schedule/schedule/package.json b/packages/schedule/schedule/package.json
index 78fac782ec..37fa4589c9 100644
--- a/packages/schedule/schedule/package.json
+++ b/packages/schedule/schedule/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-schedule",
"description": "Agent-scoped durable after, at, and fixed-rate reminders over the session event log",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/sdk/client/package.json b/packages/sdk/client/package.json
index 5534f7028e..f3f9321ca3 100644
--- a/packages/sdk/client/package.json
+++ b/packages/sdk/client/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sdk-client",
"description": "TypeScript client SDK for driving a DeepSeek Harness runtime subprocess over stdio JSON-RPC: the DeepSeekHarness high-level turns API and the lower-level HarnessClient",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/sdk/protocol/package.json b/packages/sdk/protocol/package.json
index 145a79d7a7..753fa4ac1e 100644
--- a/packages/sdk/protocol/package.json
+++ b/packages/sdk/protocol/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sdk-protocol",
"description": "Shared wire protocol for the DeepSeek Harness SDK runtime: the newline-delimited JSON-RPC stdio transport and the named request, result, and notification types spoken between the runtime server and SDK clients",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/sdk/server/package.json b/packages/sdk/server/package.json
index 58920ce23b..aaf98612ea 100644
--- a/packages/sdk/server/package.json
+++ b/packages/sdk/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-sdk-jsonrpc-server",
"description": "Stdio JSON-RPC server plugin for out-of-process DeepSeek Harness SDK clients",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session-query/session-log-export/package.json b/packages/session-query/session-log-export/package.json
index e107281710..91966f3773 100644
--- a/packages/session-query/session-log-export/package.json
+++ b/packages/session-query/session-log-export/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-log-export",
"description": "Web Session-log export command and shared download dialog",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session-query/session-query-sqlite/package.json b/packages/session-query/session-query-sqlite/package.json
index 560e1056cf..01d3178e31 100644
--- a/packages/session-query/session-query-sqlite/package.json
+++ b/packages/session-query/session-query-sqlite/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-query-sqlite",
"description": "Concrete ctx.sessionQuery backend with SQLite FTS5 search",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session-query/session-query/package.json b/packages/session-query/session-query/package.json
index 80e928341b..6141578ea4 100644
--- a/packages/session-query/session-query/package.json
+++ b/packages/session-query/session-query/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-query",
"description": "Combined session query service contract with concrete reads, traces, and filters",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session-query/tool-session-query/package.json b/packages/session-query/tool-session-query/package.json
index b54d4eae26..e3244c2e76 100644
--- a/packages/session-query/tool-session-query/package.json
+++ b/packages/session-query/tool-session-query/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-session-query",
"description": "Workspace-authorized model-facing session history search, trace, and event read tools",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-checkpoint-policy/package.json b/packages/session/session-checkpoint-policy/package.json
index f59985e5b3..796e177b29 100644
--- a/packages/session/session-checkpoint-policy/package.json
+++ b/packages/session/session-checkpoint-policy/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-checkpoint-policy",
"description": "Semantic session durability checkpoints before model requests and tool side effects",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-format-catalog/package.json b/packages/session/session-format-catalog/package.json
index b2f197c13c..56406e219b 100644
--- a/packages/session/session-format-catalog/package.json
+++ b/packages/session/session-format-catalog/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-format-catalog",
"description": "Build-static first-party Session format codec and migration catalog",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-format-v0-to-v1/package.json b/packages/session/session-format-v0-to-v1/package.json
index 58e4b3f677..42f7f1c4a9 100644
--- a/packages/session/session-format-v0-to-v1/package.json
+++ b/packages/session/session-format-v0-to-v1/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-format-v0-to-v1",
"description": "Frozen released-v0 Session codec and identity migration to v1",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-format-v1-to-v2/package.json b/packages/session/session-format-v1-to-v2/package.json
index b44f957bfd..11955848ea 100644
--- a/packages/session/session-format-v1-to-v2/package.json
+++ b/packages/session/session-format-v1-to-v2/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-format-v1-to-v2",
"description": "Frozen released-v1 Session codec and assistant-stream migration to v2",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-format-v2-to-v3/package.json b/packages/session/session-format-v2-to-v3/package.json
index 99b1ca46d8..4c0c17815e 100644
--- a/packages/session/session-format-v2-to-v3/package.json
+++ b/packages/session/session-format-v2-to-v3/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-format-v2-to-v3",
"description": "Streaming system-prompt, canonical-envelope and PTC migration into V3",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-format/package.json b/packages/session/session-format/package.json
index 069a8c2e95..cc55b09ce3 100644
--- a/packages/session/session-format/package.json
+++ b/packages/session/session-format/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-format",
"description": "Streaming adjacent Session format migration machinery",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-log-deepseek/package.json b/packages/session/session-log-deepseek/package.json
index 9dfdf7e6dd..3c7f0e65fc 100644
--- a/packages/session/session-log-deepseek/package.json
+++ b/packages/session/session-log-deepseek/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-log-deepseek",
"description": "Incremental lossless session-log request extension for the official DeepSeek LLM API",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-persistence-jsonl/package.json b/packages/session/session-persistence-jsonl/package.json
index 0233f1c4e5..11f50ba97a 100644
--- a/packages/session/session-persistence-jsonl/package.json
+++ b/packages/session/session-persistence-jsonl/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-persistence-jsonl",
"description": "JSONL durable session persistence backend for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-persistence/package.json b/packages/session/session-persistence/package.json
index 00c06bd87b..36f7009ebd 100644
--- a/packages/session/session-persistence/package.json
+++ b/packages/session/session-persistence/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-persistence",
"description": "Abstract durable session persistence seam (ctx.sessionPersistence) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-projection-cache/package.json b/packages/session/session-projection-cache/package.json
index 4572668791..7d9cd2587e 100644
--- a/packages/session/session-projection-cache/package.json
+++ b/packages/session/session-projection-cache/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-projection-cache",
"description": "Persisted projection cache (ctx.sessionProjectionCache): durable per-session checkpoint records on the session_projcache storage domain (per-record layout), throttled write-behind, and the cached listing read",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-projection/package.json b/packages/session/session-projection/package.json
index 0820666165..e36e2dc4a8 100644
--- a/packages/session/session-projection/package.json
+++ b/packages/session/session-projection/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-projection",
"description": "Session-projection seam: the merge-extensible projection type table, the provider contract, and the ctx.sessionProjections registry serving whole current values of log-derived per-session state",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-stats/package.json b/packages/session/session-stats/package.json
index 507f87a96b..cfaf57382b 100644
--- a/packages/session/session-stats/package.json
+++ b/packages/session/session-stats/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-stats",
"description": "Whole-log conversation counts and wall times projection (sessionStats) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-telemetry-otel/package.json b/packages/session/session-telemetry-otel/package.json
index 707e536ad4..51bb035943 100644
--- a/packages/session/session-telemetry-otel/package.json
+++ b/packages/session/session-telemetry-otel/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-telemetry-otel",
"description": "OpenTelemetry backend for the DeepSeek Harness telemetry seam: hands captured session records to the OTel JS SDK's log pipeline",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-telemetry/package.json b/packages/session/session-telemetry/package.json
index a7e1b7c31a..7927c46409 100644
--- a/packages/session/session-telemetry/package.json
+++ b/packages/session/session-telemetry/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-telemetry",
"description": "SessionTelemetryBackend seam for the DeepSeek Harness: session-event capture, projection, redaction, and handoff to a reporting backend",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-title-all-prompts-llm/package.json b/packages/session/session-title-all-prompts-llm/package.json
index 730c1d46de..c51f74eed9 100644
--- a/packages/session/session-title-all-prompts-llm/package.json
+++ b/packages/session/session-title-all-prompts-llm/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-title-all-prompts-llm",
"description": "All-user-messages LLM provider plugin for DeepSeek Harness session titles",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-title-first-prompt-llm/package.json b/packages/session/session-title-first-prompt-llm/package.json
index 14343665f7..3a3717fcc7 100644
--- a/packages/session/session-title-first-prompt-llm/package.json
+++ b/packages/session/session-title-first-prompt-llm/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-title-first-prompt-llm",
"description": "First-message LLM provider plugin for DeepSeek Harness session titles",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-title-llm/package.json b/packages/session/session-title-llm/package.json
index 2a13d395ca..89cd217004 100644
--- a/packages/session/session-title-llm/package.json
+++ b/packages/session/session-title-llm/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-title-llm",
"description": "Shared LLM generation policy for DeepSeek Harness session-title providers",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-title/package.json b/packages/session/session-title/package.json
index 4f244531e9..79170df18d 100644
--- a/packages/session/session-title/package.json
+++ b/packages/session/session-title/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-title",
"description": "Log-backed session title service and provider registry for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/session/session-turn-outline/package.json b/packages/session/session-turn-outline/package.json
index 711e009430..892bd66c9b 100644
--- a/packages/session/session-turn-outline/package.json
+++ b/packages/session/session-turn-outline/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-turn-outline",
"description": "Whole-log turn outline projection (turnOutline) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/settings/settings-file/package.json b/packages/settings/settings-file/package.json
index f0eb2ddb46..5a91ea8a02 100644
--- a/packages/settings/settings-file/package.json
+++ b/packages/settings/settings-file/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-settings-file",
"description": "File-backed settings provider (settings.yaml) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/settings/settings/package.json b/packages/settings/settings/package.json
index c7a2fbec40..55343abb6c 100644
--- a/packages/settings/settings/package.json
+++ b/packages/settings/settings/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-settings",
"description": "Abstract user-settings seam (ctx.settings) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/bash-local/package.json b/packages/shell/bash-local/package.json
index 9359c2de1b..0f1b558a61 100644
--- a/packages/shell/bash-local/package.json
+++ b/packages/shell/bash-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-bash-local",
"description": "Local-subprocess implementation of the DeepSeek Harness bash executor seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/bash-sandbox/package.json b/packages/shell/bash-sandbox/package.json
index 7ea041a1a5..d7405f3cc4 100644
--- a/packages/shell/bash-sandbox/package.json
+++ b/packages/shell/bash-sandbox/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-bash-sandbox",
"description": "Sandbox-consuming implementation of the DeepSeek Harness bash executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/pwsh-local/package.json b/packages/shell/pwsh-local/package.json
index ebea606ae7..7b102e4c30 100644
--- a/packages/shell/pwsh-local/package.json
+++ b/packages/shell/pwsh-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-pwsh-local",
"description": "Local PowerShell implementation of the DeepSeek Harness bash executor seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/pwsh-sandbox/package.json b/packages/shell/pwsh-sandbox/package.json
index bc911347ea..6d5185ef9b 100644
--- a/packages/shell/pwsh-sandbox/package.json
+++ b/packages/shell/pwsh-sandbox/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-pwsh-sandbox",
"description": "Sandbox-consuming implementation of the DeepSeek Harness PowerShell executor seam (confines every command via ctx.sandbox, reports denial/enforcement result facts)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/shell-env/package.json b/packages/shell/shell-env/package.json
index 3558307a0c..e0b4fb2368 100644
--- a/packages/shell/shell-env/package.json
+++ b/packages/shell/shell-env/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-shell-env",
"description": "Tool-independent managed DSH_* shell environment registry",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/shell/package.json b/packages/shell/shell/package.json
index 6fce0fb257..88503f4385 100644
--- a/packages/shell/shell/package.json
+++ b/packages/shell/shell/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-shell",
"description": "Abstract bash executor seam (ctx.shell) for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/tool-bash-persistent/package.json b/packages/shell/tool-bash-persistent/package.json
index 7b817703b5..a8c99b3c5c 100644
--- a/packages/shell/tool-bash-persistent/package.json
+++ b/packages/shell/tool-bash-persistent/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-bash-persistent",
"description": "Model-facing owner-scoped persistent Bash tool backed by the Harness PTY service",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/tool-bash/package.json b/packages/shell/tool-bash/package.json
index 3ed1a01a9f..c8648afd57 100644
--- a/packages/shell/tool-bash/package.json
+++ b/packages/shell/tool-bash/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-bash",
"description": "Model-facing bash tool with optional generic background-job and sandbox-escalation support",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/tool-pwsh-persistent/package.json b/packages/shell/tool-pwsh-persistent/package.json
index 780948e7a0..c42a4bde52 100644
--- a/packages/shell/tool-pwsh-persistent/package.json
+++ b/packages/shell/tool-pwsh-persistent/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-pwsh-persistent",
"description": "Model-facing owner-scoped persistent PowerShell tool backed by the Harness PTY service",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/shell/tool-pwsh/package.json b/packages/shell/tool-pwsh/package.json
index 7c003409c2..b01b2e3cd9 100644
--- a/packages/shell/tool-pwsh/package.json
+++ b/packages/shell/tool-pwsh/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-pwsh",
"description": "Model-facing pwsh tool over the bash executor seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/skill/skill-badge/package.json b/packages/skill/skill-badge/package.json
index c5db5bbec3..1fd637dabb 100644
--- a/packages/skill/skill-badge/package.json
+++ b/packages/skill/skill-badge/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-skill-badge",
"description": "Bundled dsh badge skill provider for DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/skill/skill-filesystem/package.json b/packages/skill/skill-filesystem/package.json
index 09dc51f2dd..484c7ea0e1 100644
--- a/packages/skill/skill-filesystem/package.json
+++ b/packages/skill/skill-filesystem/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-skill-filesystem",
"description": "Local filesystem skill provider for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/skill/skill/package.json b/packages/skill/skill/package.json
index 8705f3481f..56154b531d 100644
--- a/packages/skill/skill/package.json
+++ b/packages/skill/skill/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-skill",
"description": "Agent skill provider registry for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/skill/tool-skill/package.json b/packages/skill/tool-skill/package.json
index 633473717e..120876880c 100644
--- a/packages/skill/tool-skill/package.json
+++ b/packages/skill/tool-skill/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-skill",
"description": "Model-facing skill loading tool for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/spill/spill-local/package.json b/packages/spill/spill-local/package.json
index 7cc5eda514..089535ff13 100644
--- a/packages/spill/spill-local/package.json
+++ b/packages/spill/spill-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-spill-local",
"description": "Local-filesystem implementation of the DeepSeek Harness spill storage seam (private session-scoped files)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/spill/spill-policy/package.json b/packages/spill/spill-policy/package.json
index 9990cdf288..d3a0ed5eb6 100644
--- a/packages/spill/spill-policy/package.json
+++ b/packages/spill/spill-policy/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-spill-policy",
"description": "Tool-result spill policy for the DeepSeek Harness — replaces oversized plain-text tool results with a retained preview plus a spill-file path (no service API)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/spill/spill/package.json b/packages/spill/spill/package.json
index eeedb76373..651531bf82 100644
--- a/packages/spill/spill/package.json
+++ b/packages/spill/spill/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-spill",
"description": "Abstract spill storage seam (ctx.spillStore) for the DeepSeek Harness — save oversized tool text and return a retrieval locator",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/storage/storage-domain/package.json b/packages/storage/storage-domain/package.json
index ab2bc8c205..dbbd79571c 100644
--- a/packages/storage/storage-domain/package.json
+++ b/packages/storage/storage-domain/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-storage-domain",
"description": "Domain data form (ctx.storage.domain): schema-validated, event-emitting KV domains over storage backends for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/storage/storage-json/package.json b/packages/storage/storage-json/package.json
index f35b45d72f..4e79b26fc0 100644
--- a/packages/storage/storage-json/package.json
+++ b/packages/storage/storage-json/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-storage-json",
"description": "JSON file KV storage backend for the DeepSeek Harness storage hub",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/storage/storage-sqlite/package.json b/packages/storage/storage-sqlite/package.json
index 00797f7c07..638ad2e283 100644
--- a/packages/storage/storage-sqlite/package.json
+++ b/packages/storage/storage-sqlite/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-storage-sqlite",
"description": "SQLite storage backend (kv facet) for the DeepSeek Harness storage hub",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/storage/storage/package.json b/packages/storage/storage/package.json
index 471ac26288..c45cc74a11 100644
--- a/packages/storage/storage/package.json
+++ b/packages/storage/storage/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-storage",
"description": "Storage hub (ctx.storage): named backend registry plus mounted data-form facilities for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent-acp/package.json b/packages/subagent/subagent-acp/package.json
index 4c6faca8b0..6e42076bc3 100644
--- a/packages/subagent/subagent-acp/package.json
+++ b/packages/subagent/subagent-acp/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent-acp",
"description": "Out-of-process ACP subagent backend: drives a child agent in a spawned subprocess over the Agent Client Protocol",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent-claude-code/package.json b/packages/subagent/subagent-claude-code/package.json
index f4f1daea88..b4e328eff0 100644
--- a/packages/subagent/subagent-claude-code/package.json
+++ b/packages/subagent/subagent-claude-code/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent-claude-code",
"description": "One-shot Claude Code subagent provider over the official Agent SDK",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent-codex/package.json b/packages/subagent/subagent-codex/package.json
index e25cfd69f8..79bda26eec 100644
--- a/packages/subagent/subagent-codex/package.json
+++ b/packages/subagent/subagent-codex/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent-codex",
"description": "One-shot Codex subagent provider over the official app-server protocol",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent-dsh-sdk/package.json b/packages/subagent/subagent-dsh-sdk/package.json
index 43fbea39e5..505ee00c38 100644
--- a/packages/subagent/subagent-dsh-sdk/package.json
+++ b/packages/subagent/subagent-dsh-sdk/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent-dsh-sdk",
"description": "Out-of-process SDK subagent backend: drives a child DeepSeek Harness runtime subprocess over stdio JSON-RPC through the TypeScript SDK client",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent-fork-in-process/package.json b/packages/subagent/subagent-fork-in-process/package.json
index 6c4c040b9b..2deb14834d 100644
--- a/packages/subagent/subagent-fork-in-process/package.json
+++ b/packages/subagent/subagent-fork-in-process/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent-fork-in-process",
"description": "In-process fork subagent backend: runs a child agent seeded with a prefix of the parent's log",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent-in-process-driver/package.json b/packages/subagent/subagent-in-process-driver/package.json
index 51c6b2240b..ee7d0febc4 100644
--- a/packages/subagent/subagent-in-process-driver/package.json
+++ b/packages/subagent/subagent-in-process-driver/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent-in-process-driver",
"description": "Shared in-process subagent run driver: drives a child agent on ctx.agents (used by the spawn and fork backends)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent-spawn-in-process/package.json b/packages/subagent/subagent-spawn-in-process/package.json
index 7f0b7f2dba..73fd12c1fc 100644
--- a/packages/subagent/subagent-spawn-in-process/package.json
+++ b/packages/subagent/subagent-spawn-in-process/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent-spawn-in-process",
"description": "In-process spawn subagent backend: runs a fresh child agent on ctx.agents",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/subagent/package.json b/packages/subagent/subagent/package.json
index 22e000973f..319d9ecbe5 100644
--- a/packages/subagent/subagent/package.json
+++ b/packages/subagent/subagent/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subagent",
"description": "Abstract subagent seam (ctx.subagents): named-provider registry for delegating to child agents",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/tool-subagent-control/package.json b/packages/subagent/tool-subagent-control/package.json
index 71d256c372..667f86351b 100644
--- a/packages/subagent/tool-subagent-control/package.json
+++ b/packages/subagent/tool-subagent-control/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-subagent-control",
"description": "Globally named send_message, interrupt_agent, and list_agents tools over ctx.subagents continuations",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subagent/tool-subagent/package.json b/packages/subagent/tool-subagent/package.json
index 119d39ad1b..284c093f12 100644
--- a/packages/subagent/tool-subagent/package.json
+++ b/packages/subagent/tool-subagent/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-subagent",
"description": "Model-facing subagent delegation tool over the ctx.subagents seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subprocess/subprocess-local/package.json b/packages/subprocess/subprocess-local/package.json
index 5b19229c75..7465d787f9 100644
--- a/packages/subprocess/subprocess-local/package.json
+++ b/packages/subprocess/subprocess-local/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subprocess-local",
"description": "Local-subprocess implementation of the DeepSeek Harness subprocess seam",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subprocess/subprocess/package.json b/packages/subprocess/subprocess/package.json
index 627077a52a..2f20d3a6f9 100644
--- a/packages/subprocess/subprocess/package.json
+++ b/packages/subprocess/subprocess/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-subprocess",
"description": "Subprocess seam (ctx.subprocess) for the DeepSeek Harness — managed process groups, bounded spill-backed output, and escalated kills behind one abstract service",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/subprocess/win32-process/package.json b/packages/subprocess/win32-process/package.json
index a7b3a2fbb1..28fc6c2685 100644
--- a/packages/subprocess/win32-process/package.json
+++ b/packages/subprocess/win32-process/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-win32-process",
"description": "Shared low-level Win32 process, stdio, and Job Object primitives",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/terminal/terminal-bash/package.json b/packages/terminal/terminal-bash/package.json
index 92f346a595..c433ad9375 100644
--- a/packages/terminal/terminal-bash/package.json
+++ b/packages/terminal/terminal-bash/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-terminal-bash",
"description": "Persistent shell PTY backend over the DeepSeek Harness subprocess terminal primitive",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/terminal/terminal/package.json b/packages/terminal/terminal/package.json
index 4a65ed9e29..ec2fc7c719 100644
--- a/packages/terminal/terminal/package.json
+++ b/packages/terminal/terminal/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-terminal",
"description": "Persistent PTY session seam for the DeepSeek Harness — owner-scoped ids, backend registry, interactive sends, reads, signals, and awaited cleanup",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/terminal/tool-terminal/package.json b/packages/terminal/tool-terminal/package.json
index c0e1707fc6..bfcbeddef1 100644
--- a/packages/terminal/tool-terminal/package.json
+++ b/packages/terminal/tool-terminal/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-terminal",
"description": "Six model-facing persistent PTY tools with owner isolation and generic background-job integration",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-support/agent-loop-testkit/package.json b/packages/test-support/agent-loop-testkit/package.json
index 7bc3890fec..1e2eb18ee4 100644
--- a/packages/test-support/agent-loop-testkit/package.json
+++ b/packages/test-support/agent-loop-testkit/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-agent-loop-testkit",
"description": "Prerequisite mounting, production AgentLoop drivers, and Inbox stubs for tests",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-support/client-runtime/package.json b/packages/test-support/client-runtime/package.json
index 88298cd72b..326a78083a 100644
--- a/packages/test-support/client-runtime/package.json
+++ b/packages/test-support/client-runtime/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-client-test-runtime",
"description": "jsdom slot test runtime: real Cordis Context + SlotRegistry + UI renderer with test-owned session/workspace doubles for feature specs",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-support/llm-mock-server/package.json b/packages/test-support/llm-mock-server/package.json
index 09076a4f03..70538bbbad 100644
--- a/packages/test-support/llm-mock-server/package.json
+++ b/packages/test-support/llm-mock-server/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-llm-mock-server",
"description": "Scriptable OpenAI-compatible HTTP/SSE fault server for LLM recovery tests",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-support/llm-replay/package.json b/packages/test-support/llm-replay/package.json
index f5281eb4f5..54e9d293b0 100644
--- a/packages/test-support/llm-replay/package.json
+++ b/packages/test-support/llm-replay/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-llm-replay",
"description": "Replay LLM plugin: short-circuits llm/stream with model chunks reconstructed from a recorded session JSONL (keyless snapshot tests)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-support/loader-smoke/package.json b/packages/test-support/loader-smoke/package.json
index f158d852c0..2d435c9d9e 100644
--- a/packages/test-support/loader-smoke/package.json
+++ b/packages/test-support/loader-smoke/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-loader-smoke",
"description": "Shared subprocess and direct-agent harness for keyless real-Loader example smoke tests",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-support/session-snapshot/package.json b/packages/test-support/session-snapshot/package.json
index 8bf4945353..1b4576dccc 100644
--- a/packages/test-support/session-snapshot/package.json
+++ b/packages/test-support/session-snapshot/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-session-snapshot",
"description": "Session-log snapshot core with an ACP protocol adapter, expected-output normalization, and fixture invariants",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/todo/tool-todo/package.json b/packages/todo/tool-todo/package.json
index d539bfd420..863345c42a 100644
--- a/packages/todo/tool-todo/package.json
+++ b/packages/todo/tool-todo/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-todo",
"description": "Model-facing todo_write tool over the DeepSeek Harness event-sourced session log",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/typert/generator/package.json b/packages/typert/generator/package.json
index 8f4052432c..8ef779b90c 100644
--- a/packages/typert/generator/package.json
+++ b/packages/typert/generator/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-typert-generator",
"description": "TypeScript project analyzer and model-driven Typert artifact generator",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/typert/loader/package.json b/packages/typert/loader/package.json
index 99873e3c8c..1e58aa5723 100644
--- a/packages/typert/loader/package.json
+++ b/packages/typert/loader/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-typert-loader",
"description": "Loader integration for generated Typert package contributions",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/typert/protocol/package.json b/packages/typert/protocol/package.json
index 128a91015b..67b30c4377 100644
--- a/packages/typert/protocol/package.json
+++ b/packages/typert/protocol/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-typert-protocol",
"description": "Compiler-independent Remote metadata and Typert provider protocols",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/typert/registry/package.json b/packages/typert/registry/package.json
index 57cc0269b7..2392b2f0c4 100644
--- a/packages/typert/registry/package.json
+++ b/packages/typert/registry/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-typert-registry",
"description": "Runtime registry for generated package reflection and Zod schemas",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/atomic-write/package.json b/packages/util/atomic-write/package.json
index debc1821e2..c18e75ac26 100644
--- a/packages/util/atomic-write/package.json
+++ b/packages/util/atomic-write/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-atomic-write",
"description": "Zero-dependency atomic file replacement: exclusive-create random-suffix temp + rename carrying the caller-stated permissions (writeFileAtomic)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/brand/package.json b/packages/util/brand/package.json
index eb8f05ad2b..a7c8974297 100644
--- a/packages/util/brand/package.json
+++ b/packages/util/brand/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-brand",
"description": "Stateless branded primitive types for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/chunked-list/package.json b/packages/util/chunked-list/package.json
index 2a3fc316da..f27dee18f1 100644
--- a/packages/util/chunked-list/package.json
+++ b/packages/util/chunked-list/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-chunked-list",
"description": "Persistent append-only chunked lists with bounded copying and JSON checkpoint validation",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/crypto/package.json b/packages/util/crypto/package.json
index 29c97db176..3e54890d57 100644
--- a/packages/util/crypto/package.json
+++ b/packages/util/crypto/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-util-crypto",
"description": "Zero-dependency browser-safe UUID and byte-encoding helpers",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/deque/package.json b/packages/util/deque/package.json
index 9e770c6ebc..bdea147fb7 100644
--- a/packages/util/deque/package.json
+++ b/packages/util/deque/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-deque",
"description": "Zero-dependency circular deque with amortized constant-time end operations and bounded vacant storage",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/home-paths/package.json b/packages/util/home-paths/package.json
index e2248ef6d4..34291f69ba 100644
--- a/packages/util/home-paths/package.json
+++ b/packages/util/home-paths/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-home-paths",
"description": "Shared filesystem path helpers for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/http-proxy/package.json b/packages/util/http-proxy/package.json
index 557ff05008..4091676849 100644
--- a/packages/util/http-proxy/package.json
+++ b/packages/util/http-proxy/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-http-proxy",
"description": "Process-wide outbound HTTP proxy policy for DeepSeek Harness: resolve it from the launch environment and install it as undici's global dispatcher",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/launch-environment/package.json b/packages/util/launch-environment/package.json
index 05721e99de..69c88ef587 100644
--- a/packages/util/launch-environment/package.json
+++ b/packages/util/launch-environment/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-launch-environment",
"description": "Immutable DeepSeek Harness launch environment that records which layer supplied each value",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/native-command/package.json b/packages/util/native-command/package.json
index ff25cef7b4..32b2562fd5 100644
--- a/packages/util/native-command/package.json
+++ b/packages/util/native-command/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-native-command",
"description": "Host-native command and path-opening utilities with shell-free execution, cancellation, desktop detection, and WSL handoff",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/output-retention/package.json b/packages/util/output-retention/package.json
index 60f35e488c..ab3f8c5143 100644
--- a/packages/util/output-retention/package.json
+++ b/packages/util/output-retention/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-output-retention",
"description": "Zero-dependency bounded-retention primitive: ItemRetainer/TextRetainer + neutral notice helpers (what did we keep, what did we omit)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/package-manifest/package.json b/packages/util/package-manifest/package.json
index d5ac0e87bc..57e6beceda 100644
--- a/packages/util/package-manifest/package.json
+++ b/packages/util/package-manifest/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-package-manifest",
"description": "Shared type declarations for package.json.dsh configuration fields",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/time/package.json b/packages/util/time/package.json
index 396b587e04..20b7468982 100644
--- a/packages/util/time/package.json
+++ b/packages/util/time/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-util-time",
"description": "Zero-dependency time vocabulary shared by wire boundaries: canonicalClientTimeZone (IANA zone validation and canonicalization only, no formatting)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/timeout/package.json b/packages/util/timeout/package.json
index 52601ba8e9..35500070eb 100644
--- a/packages/util/timeout/package.json
+++ b/packages/util/timeout/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-timeout",
"description": "Zero-dependency timeout/deadline primitive: clampTimeout, deadline, timeoutOf, TimeoutReason (timing + classification only, no termination)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/values/package.json b/packages/util/values/package.json
index 0caecde0da..8b08968d19 100644
--- a/packages/util/values/package.json
+++ b/packages/util/values/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-util-values",
"description": "Duplicate-install-safe value primitives for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/util/workspace-path/package.json b/packages/util/workspace-path/package.json
index 52831afa03..2d9f7d4cb7 100644
--- a/packages/util/workspace-path/package.json
+++ b/packages/util/workspace-path/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-util-workspace-path",
"description": "Browser-safe Workspace path and display helpers",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/web/tool-web/package.json b/packages/web/tool-web/package.json
index 00029269e1..463248c787 100644
--- a/packages/web/tool-web/package.json
+++ b/packages/web/tool-web/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-web",
"description": "Model-facing web tools (web_search, web_fetch) over the DeepSeek Harness web capability seam (ctx.web)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/web/web-fetch-http/package.json b/packages/web/web-fetch-http/package.json
index 69deb08084..2c52a4b0f7 100644
--- a/packages/web/web-fetch-http/package.json
+++ b/packages/web/web-fetch-http/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-web-fetch-http",
"description": "Anonymous public HTTP(S) fetch provider for the DeepSeek Harness web capability seam (ctx.web)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/web/web-search-deepseek/package.json b/packages/web/web-search-deepseek/package.json
index 01ac736fcc..6e7ef73ca2 100644
--- a/packages/web/web-search-deepseek/package.json
+++ b/packages/web/web-search-deepseek/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-web-search-deepseek",
"description": "DeepSeek-backed search provider (native web_search via the Anthropic-compatible API) for the DeepSeek Harness web capability seam (ctx.web)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/web/web-search-exa/package.json b/packages/web/web-search-exa/package.json
index e50850670a..daefc8d2d3 100644
--- a/packages/web/web-search-exa/package.json
+++ b/packages/web/web-search-exa/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-web-search-exa",
"description": "Exa-backed search provider for the DeepSeek Harness web capability seam (ctx.web)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/web/web-search-perplexity/package.json b/packages/web/web-search-perplexity/package.json
index 8d58b9d76c..819966ac3a 100644
--- a/packages/web/web-search-perplexity/package.json
+++ b/packages/web/web-search-perplexity/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-web-search-perplexity",
"description": "Perplexity-backed search provider for the DeepSeek Harness web capability seam (ctx.web)",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/web/web/package.json b/packages/web/web/package.json
index 7afab4d2bb..75b51cae79 100644
--- a/packages/web/web/package.json
+++ b/packages/web/web/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-web",
"description": "Abstract web access capability seam (ctx.web) for the DeepSeek Harness — search/fetch provider registry, registration-order-independent selection, request/result vocabulary, and the WebError taxonomy",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/webhook/webhook-github/package.json b/packages/webhook/webhook-github/package.json
index 8ad3788e28..81b8c9cdeb 100644
--- a/packages/webhook/webhook-github/package.json
+++ b/packages/webhook/webhook-github/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-webhook-github",
"description": "Signed GitHub HTTP webhook adapter for the DeepSeek Harness webhook runtime",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/webhook/webhook/package.json b/packages/webhook/webhook/package.json
index 27baa443ce..ee8416fe68 100644
--- a/packages/webhook/webhook/package.json
+++ b/packages/webhook/webhook/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-webhook",
"description": "Fire-and-forget webhook rule runtime that creates Workspace-backed DeepSeek Harness Sessions",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/workflow/tool-ralph/package.json b/packages/workflow/tool-ralph/package.json
index 23921d85c6..a1b6609049 100644
--- a/packages/workflow/tool-ralph/package.json
+++ b/packages/workflow/tool-ralph/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-ralph",
"description": "Model-facing fresh-agent Ralph loop over the workflow and subagent seams",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/workflow/tool-workflow/package.json b/packages/workflow/tool-workflow/package.json
index 71f9830317..06cb66d839 100644
--- a/packages/workflow/tool-workflow/package.json
+++ b/packages/workflow/tool-workflow/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-tool-workflow",
"description": "Model-facing workflow tool: run a JavaScript orchestration script over ctx.workflowEngine",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/workflow/workflow-worker-thread/package.json b/packages/workflow/workflow-worker-thread/package.json
index 030baacd98..2a91e2d2dc 100644
--- a/packages/workflow/workflow-worker-thread/package.json
+++ b/packages/workflow/workflow-worker-thread/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-workflow-worker-thread",
"description": "worker-thread workflow engine: executes model-written orchestration scripts off the host event loop, bridging agent() calls back to ctx.subagents",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/workflow/workflow/package.json b/packages/workflow/workflow/package.json
index c5f414941c..8e03f25a7c 100644
--- a/packages/workflow/workflow/package.json
+++ b/packages/workflow/workflow/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-workflow",
"description": "Workflow capability seam: ctx.workflowEngine service, run vocabulary, and workflow/* events",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
diff --git a/packages/workspace/workspace/package.json b/packages/workspace/workspace/package.json
index 4a30eea728..bf1ad56f88 100644
--- a/packages/workspace/workspace/package.json
+++ b/packages/workspace/workspace/package.json
@@ -1,7 +1,7 @@
{
"name": "@deepseek-ai/dsh-workspace",
"description": "Workspace entity registry (ctx.workspaceRegistry): durable workspace records with validated session attachment over the domain data form for the DeepSeek Harness",
- "version": "0.1.5-alpha.1",
+ "version": "0.1.5-alpha.2",
"publishConfig": {
"access": "public"
},
From 8e8fb2fc6216c8acbadd83d20a99ff305c59775b Mon Sep 17 00:00:00 2001
From: j-xiang
Date: Thu, 10 Sep 2026 00:21:32 +0800
Subject: [PATCH 03/19] docs(i18n): proofread bilingual README corpus
---
apps/cli/README.i18n.yaml | 2 +-
apps/cli/README.zh.md | 16 +++----
apps/cli/reference/README.i18n.yaml | 4 +-
apps/cli/reference/README.md | 6 +--
apps/cli/reference/README.zh.md | 20 ++++----
apps/desktop/README.i18n.yaml | 2 +-
apps/desktop/README.zh.md | 42 ++++++++--------
apps/web/tests/README.i18n.yaml | 4 +-
apps/web/tests/README.md | 34 ++-----------
apps/web/tests/README.zh.md | 26 ++--------
.../active-stream-reconnect/README.i18n.yaml | 2 +-
.../active-stream-reconnect/README.zh.md | 4 +-
.../agent-continuation/README.i18n.yaml | 2 +-
benchmarks/agent-continuation/README.zh.md | 12 ++---
.../long-session-browser/README.i18n.yaml | 2 +-
benchmarks/long-session-browser/README.zh.md | 8 ++--
docs/i18n/README.i18n.yaml | 2 +-
docs/i18n/README.zh.md | 2 +-
docs/subsystems/README.i18n.yaml | 2 +-
docs/subsystems/README.zh.md | 26 +++++-----
native/system/README.i18n.yaml | 2 +-
native/system/README.zh.md | 10 ++--
.../packages/darwin-x64/README.i18n.yaml | 2 +-
.../system/packages/darwin-x64/README.zh.md | 2 +-
native/system/packages/entry/README.i18n.yaml | 2 +-
native/system/packages/entry/README.zh.md | 4 +-
.../packages/linux-arm64/README.i18n.yaml | 2 +-
.../system/packages/linux-arm64/README.zh.md | 4 +-
.../packages/linux-x64/README.i18n.yaml | 2 +-
native/system/packages/linux-x64/README.zh.md | 4 +-
packages/README.i18n.yaml | 2 +-
packages/README.zh.md | 32 ++++++-------
packages/acp/README.i18n.yaml | 2 +-
packages/acp/README.zh.md | 8 ++--
packages/acp/acp/README.i18n.yaml | 4 +-
packages/acp/acp/README.md | 6 +--
packages/acp/acp/README.zh.md | 22 ++++-----
packages/api/README.i18n.yaml | 2 +-
packages/api/README.zh.md | 12 ++---
packages/api/gateway/README.i18n.yaml | 2 +-
packages/api/gateway/README.zh.md | 24 +++++-----
packages/api/remotes/README.i18n.yaml | 4 +-
packages/api/remotes/README.md | 4 +-
packages/api/remotes/README.zh.md | 18 +++----
.../api/session-controller/README.i18n.yaml | 2 +-
packages/api/session-controller/README.zh.md | 20 ++++----
.../api/settings-controller/README.i18n.yaml | 2 +-
packages/api/settings-controller/README.zh.md | 12 ++---
.../api/workspace-controller/README.i18n.yaml | 2 +-
.../api/workspace-controller/README.zh.md | 12 ++---
packages/api/workspace-files/README.i18n.yaml | 2 +-
packages/api/workspace-files/README.zh.md | 8 ++--
packages/attachment/README.i18n.yaml | 4 +-
packages/attachment/README.md | 2 +-
packages/attachment/README.zh.md | 2 +-
.../attachment-local/README.i18n.yaml | 4 +-
.../attachment/attachment-local/README.md | 2 +-
.../attachment/attachment-local/README.zh.md | 18 +++----
.../attachment/attachment/README.i18n.yaml | 4 +-
packages/attachment/attachment/README.md | 4 +-
packages/attachment/attachment/README.zh.md | 16 +++----
packages/boot/README.i18n.yaml | 2 +-
packages/boot/README.zh.md | 2 +-
packages/boot/app-boot/README.i18n.yaml | 2 +-
packages/boot/app-boot/README.zh.md | 20 ++++----
packages/boot/cmdline/README.i18n.yaml | 2 +-
packages/boot/cmdline/README.zh.md | 16 +++----
packages/bundle/README.i18n.yaml | 2 +-
packages/bundle/README.zh.md | 14 +++---
packages/bundle/acp-app/README.i18n.yaml | 2 +-
packages/bundle/acp-app/README.zh.md | 12 ++---
packages/bundle/base/README.i18n.yaml | 2 +-
packages/bundle/base/README.zh.md | 14 +++---
packages/bundle/headless/README.i18n.yaml | 2 +-
packages/bundle/headless/README.zh.md | 28 +++++------
packages/bundle/sdk-app/README.i18n.yaml | 2 +-
packages/bundle/sdk-app/README.zh.md | 8 ++--
packages/bundle/sdk-minimal/README.i18n.yaml | 2 +-
packages/bundle/sdk-minimal/README.zh.md | 16 +++----
packages/bundle/web-app/README.i18n.yaml | 2 +-
packages/bundle/web-app/README.zh.md | 24 +++++-----
packages/client/README.i18n.yaml | 2 +-
packages/client/README.zh.md | 18 +++----
packages/client/connection/README.i18n.yaml | 2 +-
packages/client/connection/README.zh.md | 14 +++---
packages/client/hmr/README.i18n.yaml | 4 +-
packages/client/hmr/README.md | 4 +-
packages/client/hmr/README.zh.md | 18 +++----
packages/client/locale/README.i18n.yaml | 2 +-
packages/client/locale/README.zh.md | 34 ++++++-------
packages/client/modules/README.i18n.yaml | 4 +-
packages/client/modules/README.md | 6 +--
packages/client/modules/README.zh.md | 22 ++++-----
packages/client/resources/README.i18n.yaml | 2 +-
packages/client/resources/README.zh.md | 16 +++----
packages/client/store/README.i18n.yaml | 2 +-
packages/client/store/README.zh.md | 12 ++---
.../client/ui-agent-preset/README.i18n.yaml | 2 +-
packages/client/ui-agent-preset/README.zh.md | 20 ++++----
packages/client/ui-approval/README.i18n.yaml | 2 +-
packages/client/ui-approval/README.zh.md | 2 +-
.../client/ui-attachment/README.i18n.yaml | 4 +-
packages/client/ui-attachment/README.md | 2 +-
packages/client/ui-attachment/README.zh.md | 20 ++++----
.../client/ui-brand-official/README.i18n.yaml | 2 +-
.../client/ui-brand-official/README.zh.md | 14 +++---
packages/client/ui-chat/README.i18n.yaml | 2 +-
packages/client/ui-chat/README.zh.md | 20 ++++----
packages/client/ui-commands/README.i18n.yaml | 4 +-
packages/client/ui-commands/README.md | 6 +--
packages/client/ui-commands/README.zh.md | 16 +++----
.../client/ui-conversation/README.i18n.yaml | 2 +-
packages/client/ui-conversation/README.zh.md | 28 +++++------
.../client/ui-deliverables/README.i18n.yaml | 2 +-
packages/client/ui-deliverables/README.zh.md | 26 +++++-----
.../README.i18n.yaml | 2 +-
.../ui-directory-picker-browse/README.zh.md | 4 +-
.../README.i18n.yaml | 4 +-
.../ui-directory-picker-native/README.md | 4 +-
.../ui-directory-picker-native/README.zh.md | 24 +++++-----
packages/client/ui-dockkit/README.i18n.yaml | 2 +-
packages/client/ui-dockkit/README.zh.md | 20 ++++----
packages/client/ui-goal/README.i18n.yaml | 4 +-
packages/client/ui-goal/README.md | 2 +-
packages/client/ui-goal/README.zh.md | 16 +++----
.../client/ui-input-trigger/README.i18n.yaml | 2 +-
packages/client/ui-input-trigger/README.zh.md | 18 +++----
packages/client/ui-jobs/README.i18n.yaml | 4 +-
packages/client/ui-jobs/README.md | 4 +-
packages/client/ui-jobs/README.zh.md | 22 ++++-----
packages/client/ui-layout/README.i18n.yaml | 4 +-
packages/client/ui-layout/README.md | 2 +-
packages/client/ui-layout/README.zh.md | 18 +++----
.../ui-message-feedback/README.i18n.yaml | 2 +-
.../client/ui-message-feedback/README.zh.md | 2 +-
.../ui-model-selection/README.i18n.yaml | 4 +-
packages/client/ui-model-selection/README.md | 4 +-
.../client/ui-model-selection/README.zh.md | 18 +++----
.../client/ui-open-in-app/README.i18n.yaml | 2 +-
packages/client/ui-open-in-app/README.zh.md | 12 ++---
.../ui-permission-presets/README.i18n.yaml | 4 +-
.../client/ui-permission-presets/README.md | 6 +--
.../client/ui-permission-presets/README.zh.md | 18 +++----
packages/client/ui-plan/README.i18n.yaml | 2 +-
packages/client/ui-plan/README.zh.md | 12 ++---
.../client/ui-primitives/README.i18n.yaml | 4 +-
packages/client/ui-primitives/README.md | 4 +-
packages/client/ui-primitives/README.zh.md | 26 +++++-----
packages/client/ui-renderer/README.i18n.yaml | 2 +-
packages/client/ui-renderer/README.zh.md | 10 ++--
packages/client/ui-schedule/README.i18n.yaml | 2 +-
packages/client/ui-schedule/README.zh.md | 26 +++++-----
packages/client/ui-session/README.i18n.yaml | 2 +-
packages/client/ui-session/README.zh.md | 6 +--
.../ui-settings-general/README.i18n.yaml | 2 +-
.../client/ui-settings-general/README.zh.md | 2 +-
.../ui-settings-models/README.i18n.yaml | 2 +-
.../client/ui-settings-models/README.zh.md | 2 +-
.../README.i18n.yaml | 2 +-
.../ui-settings-plugin-inventory/README.zh.md | 8 ++--
.../ui-settings-plugins/README.i18n.yaml | 2 +-
.../client/ui-settings-plugins/README.zh.md | 10 ++--
.../README.i18n.yaml | 2 +-
.../ui-sidebar-documentpreview/README.zh.md | 10 ++--
.../client/ui-sidebar-files/README.i18n.yaml | 2 +-
packages/client/ui-sidebar-files/README.zh.md | 12 ++---
.../client/ui-sidebar-right/README.i18n.yaml | 2 +-
packages/client/ui-sidebar-right/README.zh.md | 16 +++----
packages/client/ui-sidebar/README.i18n.yaml | 2 +-
packages/client/ui-sidebar/README.zh.md | 10 ++--
packages/client/ui-skill/README.i18n.yaml | 4 +-
packages/client/ui-skill/README.md | 2 +-
packages/client/ui-skill/README.zh.md | 10 ++--
packages/client/ui-slots/README.i18n.yaml | 4 +-
packages/client/ui-slots/README.md | 2 +-
packages/client/ui-slots/README.zh.md | 14 +++---
packages/client/ui-subagent/README.i18n.yaml | 4 +-
packages/client/ui-subagent/README.md | 4 +-
packages/client/ui-subagent/README.zh.md | 4 +-
packages/client/ui-theme/README.i18n.yaml | 2 +-
packages/client/ui-theme/README.zh.md | 14 +++---
packages/client/ui-tool/README.i18n.yaml | 2 +-
packages/client/ui-tool/README.zh.md | 16 +++----
.../client/ui-trajectory/README.i18n.yaml | 4 +-
packages/client/ui-trajectory/README.md | 2 +-
packages/client/ui-trajectory/README.zh.md | 14 +++---
.../client/ui-user-questions/README.i18n.yaml | 2 +-
.../client/ui-user-questions/README.zh.md | 14 +++---
.../client/ui-workflow-run/README.i18n.yaml | 2 +-
packages/client/ui-workflow-run/README.zh.md | 16 +++----
packages/client/ui-workspace/README.i18n.yaml | 4 +-
packages/client/ui-workspace/README.md | 2 +-
packages/client/ui-workspace/README.zh.md | 14 +++---
packages/client/web/README.i18n.yaml | 4 +-
packages/client/web/README.md | 2 +-
packages/client/web/README.zh.md | 12 ++---
packages/code-runtime/README.i18n.yaml | 4 +-
packages/code-runtime/README.md | 2 +-
packages/code-runtime/README.zh.md | 6 +--
.../README.i18n.yaml | 2 +-
.../code-runtime-worker-thread/README.zh.md | 20 ++++----
.../code-runtime/README.i18n.yaml | 2 +-
.../code-runtime/code-runtime/README.zh.md | 2 +-
packages/compaction/README.i18n.yaml | 2 +-
packages/compaction/README.zh.md | 4 +-
.../command-compact/README.i18n.yaml | 2 +-
.../compaction/command-compact/README.zh.md | 10 ++--
.../compaction-basic/README.i18n.yaml | 4 +-
.../compaction/compaction-basic/README.md | 4 +-
.../compaction/compaction-basic/README.zh.md | 14 +++---
.../README.i18n.yaml | 2 +-
.../README.zh.md | 16 +++----
.../compaction/compaction/README.i18n.yaml | 4 +-
packages/compaction/compaction/README.md | 8 ++--
packages/compaction/compaction/README.zh.md | 16 +++----
packages/context/README.i18n.yaml | 2 +-
packages/context/README.zh.md | 16 +++----
.../agent-instructions/README.i18n.yaml | 4 +-
packages/context/agent-instructions/README.md | 4 +-
.../context/agent-instructions/README.zh.md | 16 +++----
.../file-reference-local/README.i18n.yaml | 2 +-
.../context/file-reference-local/README.zh.md | 12 ++---
.../context/file-reference/README.i18n.yaml | 2 +-
packages/context/file-reference/README.zh.md | 12 ++---
.../session-reference/README.i18n.yaml | 2 +-
.../context/session-reference/README.zh.md | 26 +++++-----
.../context/time-context/README.i18n.yaml | 4 +-
packages/context/time-context/README.md | 4 +-
packages/context/time-context/README.zh.md | 4 +-
.../context/tmux-context/README.i18n.yaml | 4 +-
packages/context/tmux-context/README.md | 6 +--
packages/context/tmux-context/README.zh.md | 16 +++----
packages/core/README.i18n.yaml | 2 +-
packages/core/README.zh.md | 12 ++---
.../core/agent-default-model/README.i18n.yaml | 2 +-
.../core/agent-default-model/README.zh.md | 12 ++---
packages/core/agent-loop/README.i18n.yaml | 4 +-
packages/core/agent-loop/README.md | 4 +-
packages/core/agent-loop/README.zh.md | 22 ++++-----
.../agent-tool-presentation/README.i18n.yaml | 4 +-
.../core/agent-tool-presentation/README.md | 2 +-
.../core/agent-tool-presentation/README.zh.md | 8 ++--
packages/core/agent/README.i18n.yaml | 2 +-
packages/core/agent/README.zh.md | 16 +++----
packages/core/scope/README.i18n.yaml | 2 +-
packages/core/scope/README.zh.md | 10 ++--
packages/core/session/README.i18n.yaml | 4 +-
packages/core/session/README.md | 4 +-
packages/core/session/README.zh.md | 26 +++++-----
packages/core/system-prompt/README.i18n.yaml | 2 +-
packages/core/system-prompt/README.zh.md | 32 ++++++-------
packages/core/tools/README.i18n.yaml | 4 +-
packages/core/tools/README.md | 6 +--
packages/core/tools/README.zh.md | 6 +--
packages/credentials/README.i18n.yaml | 4 +-
packages/credentials/README.md | 2 +-
packages/credentials/README.zh.md | 6 +--
.../authorization/README.i18n.yaml | 2 +-
.../credentials/authorization/README.zh.md | 14 +++---
.../credentials-local/README.i18n.yaml | 4 +-
.../credentials/credentials-local/README.md | 4 +-
.../credentials-local/README.zh.md | 16 +++----
.../credentials/credentials/README.i18n.yaml | 4 +-
packages/credentials/credentials/README.md | 2 +-
packages/credentials/credentials/README.zh.md | 16 +++----
packages/e2b/README.i18n.yaml | 2 +-
packages/e2b/README.zh.md | 8 ++--
packages/e2b/e2b/README.i18n.yaml | 2 +-
packages/e2b/e2b/README.zh.md | 16 +++----
packages/e2b/fs-e2b/README.i18n.yaml | 4 +-
packages/e2b/fs-e2b/README.md | 2 +-
packages/e2b/fs-e2b/README.zh.md | 16 +++----
packages/e2b/subprocess-e2b/README.i18n.yaml | 4 +-
packages/e2b/subprocess-e2b/README.md | 2 +-
packages/e2b/subprocess-e2b/README.zh.md | 10 ++--
packages/experimental/README.i18n.yaml | 2 +-
packages/experimental/README.zh.md | 4 +-
.../agent-team-profile/README.i18n.yaml | 2 +-
.../agent-team-profile/README.zh.md | 12 ++---
.../agent-team-web-profile/README.i18n.yaml | 2 +-
.../agent-team-web-profile/README.zh.md | 2 +-
.../experimental/agent-team/README.i18n.yaml | 2 +-
packages/experimental/agent-team/README.zh.md | 24 +++++-----
.../client-ui-agent-team/README.i18n.yaml | 2 +-
.../client-ui-agent-team/README.zh.md | 16 +++----
.../code-runtime-python/README.i18n.yaml | 2 +-
.../code-runtime-python/README.zh.md | 11 +++--
.../experimental/inspector/README.i18n.yaml | 2 +-
packages/experimental/inspector/README.zh.md | 38 +++++++--------
.../tool-agent-team/README.i18n.yaml | 2 +-
.../experimental/tool-agent-team/README.zh.md | 22 ++++-----
.../webworker-packer/README.i18n.yaml | 2 +-
.../webworker-packer/README.zh.md | 22 ++++-----
.../webworker-runtime/README.i18n.yaml | 2 +-
.../webworker-runtime/README.zh.md | 10 ++--
packages/extensions/README.i18n.yaml | 4 +-
packages/extensions/README.md | 2 +-
packages/extensions/README.zh.md | 8 ++--
.../cordis-client-runner/README.i18n.yaml | 2 +-
.../cordis-client-runner/README.zh.md | 4 +-
.../cordis-host-runner/README.i18n.yaml | 2 +-
.../cordis-host-runner/README.zh.md | 18 +++----
.../extensions/tool-cordis/README.i18n.yaml | 4 +-
packages/extensions/tool-cordis/README.md | 2 +-
packages/extensions/tool-cordis/README.zh.md | 22 ++++-----
.../extensions/ui-cordis/README.i18n.yaml | 2 +-
packages/extensions/ui-cordis/README.zh.md | 16 +++----
packages/feedback/README.i18n.yaml | 2 +-
packages/feedback/README.zh.md | 8 ++--
.../command-feedback/README.i18n.yaml | 2 +-
.../feedback/command-feedback/README.zh.md | 12 ++---
.../message-feedback/README.i18n.yaml | 4 +-
packages/feedback/message-feedback/README.md | 4 +-
.../feedback/message-feedback/README.zh.md | 20 ++++----
packages/fs/README.i18n.yaml | 2 +-
packages/fs/README.zh.md | 4 +-
packages/fs/fs-local/README.i18n.yaml | 4 +-
packages/fs/fs-local/README.md | 4 +-
packages/fs/fs-local/README.zh.md | 10 ++--
.../fs/fs-observation-policy/README.i18n.yaml | 4 +-
packages/fs/fs-observation-policy/README.md | 6 +--
.../fs/fs-observation-policy/README.zh.md | 14 +++---
packages/fs/fs-sandbox/README.i18n.yaml | 4 +-
packages/fs/fs-sandbox/README.md | 2 +-
packages/fs/fs-sandbox/README.zh.md | 4 +-
packages/fs/tool-fs-search/README.i18n.yaml | 2 +-
packages/fs/tool-fs-search/README.zh.md | 8 ++--
packages/fs/tool-present/README.i18n.yaml | 2 +-
packages/fs/tool-present/README.zh.md | 4 +-
.../tool-str-replace-editor/README.i18n.yaml | 2 +-
.../fs/tool-str-replace-editor/README.zh.md | 6 +--
packages/goal/README.i18n.yaml | 4 +-
packages/goal/README.md | 4 +-
packages/goal/README.zh.md | 14 +++---
packages/goal/command-goal/README.i18n.yaml | 2 +-
packages/goal/command-goal/README.zh.md | 4 +-
.../goal/goal-round-driver/README.i18n.yaml | 2 +-
packages/goal/goal-round-driver/README.zh.md | 4 +-
packages/goal/goal/README.i18n.yaml | 2 +-
packages/goal/goal/README.zh.md | 14 +++---
packages/goal/tool-goal/README.i18n.yaml | 2 +-
packages/goal/tool-goal/README.zh.md | 8 ++--
packages/guard/README.i18n.yaml | 4 +-
packages/guard/README.md | 2 +-
packages/guard/README.zh.md | 4 +-
.../repeat-tool-reminder/README.i18n.yaml | 2 +-
.../guard/repeat-tool-reminder/README.zh.md | 10 ++--
.../guard/timeout-policy/README.i18n.yaml | 4 +-
packages/guard/timeout-policy/README.md | 2 +-
packages/guard/timeout-policy/README.zh.md | 8 ++--
packages/hooks/README.i18n.yaml | 2 +-
packages/hooks/README.zh.md | 6 +--
packages/hooks/hook-protocol/README.i18n.yaml | 2 +-
packages/hooks/hook-protocol/README.zh.md | 10 ++--
.../hooks/hooks-claude-code/README.i18n.yaml | 4 +-
packages/hooks/hooks-claude-code/README.md | 4 +-
packages/hooks/hooks-claude-code/README.zh.md | 12 ++---
packages/hooks/hooks-codex/README.i18n.yaml | 2 +-
packages/hooks/hooks-codex/README.zh.md | 4 +-
packages/host/README.i18n.yaml | 4 +-
packages/host/README.md | 2 +-
packages/host/README.zh.md | 2 +-
.../directory-picker-auto/README.i18n.yaml | 4 +-
packages/host/directory-picker-auto/README.md | 2 +-
.../host/directory-picker-auto/README.zh.md | 4 +-
.../directory-picker-browse/README.i18n.yaml | 2 +-
.../host/directory-picker-browse/README.zh.md | 10 ++--
.../directory-picker-native/README.i18n.yaml | 2 +-
.../host/directory-picker-native/README.zh.md | 14 +++---
.../host/directory-picker/README.i18n.yaml | 4 +-
packages/host/directory-picker/README.md | 2 +-
packages/host/directory-picker/README.zh.md | 10 ++--
.../host/frontend-static/README.i18n.yaml | 2 +-
packages/host/frontend-static/README.zh.md | 8 ++--
packages/host/open-in-app/README.i18n.yaml | 2 +-
packages/host/open-in-app/README.zh.md | 12 ++---
.../host/plugin-inventory/README.i18n.yaml | 2 +-
packages/host/plugin-inventory/README.zh.md | 14 +++---
packages/host/webserver/README.i18n.yaml | 2 +-
packages/host/webserver/README.zh.md | 8 ++--
packages/identity/README.i18n.yaml | 2 +-
packages/identity/README.zh.md | 4 +-
.../anonymous-user-id/README.i18n.yaml | 4 +-
packages/identity/anonymous-user-id/README.md | 6 +--
.../identity/anonymous-user-id/README.zh.md | 20 ++++----
packages/interaction/README.i18n.yaml | 4 +-
packages/interaction/README.md | 2 +-
packages/interaction/README.zh.md | 12 ++---
.../interaction/commands/README.i18n.yaml | 4 +-
packages/interaction/commands/README.md | 2 +-
packages/interaction/commands/README.zh.md | 20 ++++----
.../permission-presets/README.i18n.yaml | 2 +-
.../permission-presets/README.zh.md | 10 ++--
.../tool-ask-user/README.i18n.yaml | 4 +-
packages/interaction/tool-ask-user/README.md | 2 +-
.../interaction/tool-ask-user/README.zh.md | 8 ++--
.../user-approval/README.i18n.yaml | 4 +-
packages/interaction/user-approval/README.md | 2 +-
.../interaction/user-approval/README.zh.md | 20 ++++----
.../user-questions/README.i18n.yaml | 4 +-
packages/interaction/user-questions/README.md | 2 +-
.../interaction/user-questions/README.zh.md | 4 +-
packages/jobs/README.i18n.yaml | 2 +-
packages/jobs/README.zh.md | 2 +-
packages/jobs/jobs-local/README.i18n.yaml | 4 +-
packages/jobs/jobs-local/README.md | 2 +-
packages/jobs/jobs-local/README.zh.md | 6 +--
packages/jobs/jobs/README.i18n.yaml | 4 +-
packages/jobs/jobs/README.md | 4 +-
packages/jobs/jobs/README.zh.md | 14 +++---
packages/jobs/tool-jobs/README.i18n.yaml | 4 +-
packages/jobs/tool-jobs/README.md | 4 +-
packages/jobs/tool-jobs/README.zh.md | 16 +++----
packages/llm/README.i18n.yaml | 4 +-
packages/llm/README.md | 2 +-
packages/llm/README.zh.md | 8 ++--
.../README.i18n.yaml | 2 +-
.../deepseek-llm-api-extensions/README.zh.md | 6 +--
packages/llm/llm-deepseek/README.i18n.yaml | 2 +-
packages/llm/llm-deepseek/README.zh.md | 16 +++----
packages/llm/llm-pi-ai/README.i18n.yaml | 2 +-
packages/llm/llm-pi-ai/README.zh.md | 18 +++----
packages/llm/llm-retry/README.i18n.yaml | 2 +-
packages/llm/llm-retry/README.zh.md | 14 +++---
packages/llm/llm/README.i18n.yaml | 2 +-
packages/llm/llm/README.zh.md | 16 +++----
.../README.i18n.yaml | 2 +-
.../README.zh.md | 4 +-
packages/llm/token-meter/README.i18n.yaml | 4 +-
packages/llm/token-meter/README.md | 4 +-
packages/llm/token-meter/README.zh.md | 16 +++----
packages/lsp/README.i18n.yaml | 2 +-
packages/lsp/README.zh.md | 4 +-
packages/lsp/lsp-stdio/README.i18n.yaml | 2 +-
packages/lsp/lsp-stdio/README.zh.md | 6 +--
packages/lsp/lsp/README.i18n.yaml | 2 +-
packages/lsp/lsp/README.zh.md | 6 +--
packages/lsp/tool-lsp/README.i18n.yaml | 2 +-
packages/lsp/tool-lsp/README.zh.md | 10 ++--
packages/mcp/README.i18n.yaml | 2 +-
packages/mcp/README.zh.md | 4 +-
packages/mcp/mcp-client/README.i18n.yaml | 2 +-
packages/mcp/mcp-client/README.zh.md | 22 ++++-----
packages/plan/README.i18n.yaml | 2 +-
packages/plan/README.zh.md | 8 ++--
packages/plan/plan-mode/README.i18n.yaml | 2 +-
packages/plan/plan-mode/README.zh.md | 18 +++----
packages/preset/README.i18n.yaml | 2 +-
packages/preset/README.zh.md | 6 +--
.../preset/agent-presets/README.i18n.yaml | 4 +-
packages/preset/agent-presets/README.md | 2 +-
packages/preset/agent-presets/README.zh.md | 12 ++---
packages/preset/persona/README.i18n.yaml | 2 +-
packages/preset/persona/README.zh.md | 2 +-
packages/runtime-diagnostics/README.i18n.yaml | 2 +-
packages/runtime-diagnostics/README.zh.md | 6 +--
.../invariants/README.i18n.yaml | 2 +-
.../invariants/README.zh.md | 24 +++++-----
packages/sandbox/README.i18n.yaml | 2 +-
packages/sandbox/README.zh.md | 8 ++--
.../sandbox/sandbox-local/README.i18n.yaml | 2 +-
packages/sandbox/sandbox-local/README.zh.md | 8 ++--
.../sandbox/sandbox-policy/README.i18n.yaml | 2 +-
packages/sandbox/sandbox-policy/README.zh.md | 16 +++----
.../sandbox-windows-acl/README.i18n.yaml | 2 +-
.../sandbox/sandbox-windows-acl/README.zh.md | 6 +--
packages/sandbox/sandbox/README.i18n.yaml | 4 +-
packages/sandbox/sandbox/README.md | 2 +-
packages/sandbox/sandbox/README.zh.md | 16 +++----
packages/schedule/README.i18n.yaml | 2 +-
packages/schedule/README.zh.md | 4 +-
packages/schedule/schedule/README.i18n.yaml | 2 +-
packages/schedule/schedule/README.zh.md | 14 +++---
packages/sdk/README.i18n.yaml | 2 +-
packages/sdk/README.zh.md | 14 +++---
packages/sdk/client/README.i18n.yaml | 2 +-
packages/sdk/client/README.zh.md | 14 +++---
packages/sdk/protocol/README.i18n.yaml | 2 +-
packages/sdk/protocol/README.zh.md | 14 +++---
packages/sdk/server/README.i18n.yaml | 4 +-
packages/sdk/server/README.md | 2 +-
packages/sdk/server/README.zh.md | 16 +++----
packages/session-query/README.i18n.yaml | 2 +-
packages/session-query/README.zh.md | 4 +-
.../session-log-export/README.i18n.yaml | 2 +-
.../session-log-export/README.zh.md | 24 +++++-----
.../session-query-sqlite/README.i18n.yaml | 2 +-
.../session-query-sqlite/README.zh.md | 8 ++--
.../session-query/README.i18n.yaml | 4 +-
.../session-query/session-query/README.md | 2 +-
.../session-query/session-query/README.zh.md | 16 +++----
.../tool-session-query/README.i18n.yaml | 2 +-
.../tool-session-query/README.zh.md | 10 ++--
packages/session/README.i18n.yaml | 2 +-
packages/session/README.zh.md | 8 ++--
.../README.i18n.yaml | 4 +-
.../session-checkpoint-policy/README.md | 2 +-
.../session-checkpoint-policy/README.zh.md | 6 +--
.../session-format-catalog/README.i18n.yaml | 2 +-
.../session-format-catalog/README.zh.md | 8 ++--
.../session-format-v0-to-v1/README.i18n.yaml | 2 +-
.../session-format-v0-to-v1/README.zh.md | 14 +++---
.../session-format-v2-to-v3/README.i18n.yaml | 2 +-
.../session-format-v2-to-v3/README.zh.md | 16 +++----
.../session/session-format/README.i18n.yaml | 2 +-
packages/session/session-format/README.zh.md | 14 +++---
.../session-log-deepseek/README.i18n.yaml | 2 +-
.../session/session-log-deepseek/README.zh.md | 14 +++---
.../README.i18n.yaml | 2 +-
.../session-persistence-jsonl/README.zh.md | 12 ++---
.../session-persistence/README.i18n.yaml | 2 +-
.../session/session-persistence/README.zh.md | 30 ++++++------
.../session-projection-cache/README.i18n.yaml | 4 +-
.../session-projection-cache/README.md | 4 +-
.../session-projection-cache/README.zh.md | 16 +++----
.../session-projection/README.i18n.yaml | 2 +-
.../session/session-projection/README.zh.md | 4 +-
.../session/session-stats/README.i18n.yaml | 2 +-
packages/session/session-stats/README.zh.md | 2 +-
.../session-telemetry-otel/README.i18n.yaml | 2 +-
.../session-telemetry-otel/README.zh.md | 6 +--
.../session-telemetry/README.i18n.yaml | 2 +-
.../session/session-telemetry/README.zh.md | 10 ++--
.../README.i18n.yaml | 2 +-
.../README.zh.md | 8 ++--
.../README.i18n.yaml | 2 +-
.../README.zh.md | 8 ++--
.../session/session-title/README.i18n.yaml | 2 +-
packages/session/session-title/README.zh.md | 8 ++--
.../session-turn-outline/README.i18n.yaml | 2 +-
.../session/session-turn-outline/README.zh.md | 10 ++--
packages/settings/README.i18n.yaml | 4 +-
packages/settings/README.md | 4 +-
packages/settings/README.zh.md | 4 +-
.../settings/settings-file/README.i18n.yaml | 2 +-
packages/settings/settings-file/README.zh.md | 6 +--
packages/settings/settings/README.i18n.yaml | 2 +-
packages/settings/settings/README.zh.md | 6 +--
packages/shell/README.i18n.yaml | 4 +-
packages/shell/README.md | 4 +-
packages/shell/README.zh.md | 6 +--
packages/shell/bash-local/README.i18n.yaml | 2 +-
packages/shell/bash-local/README.zh.md | 16 +++----
packages/shell/bash-sandbox/README.i18n.yaml | 4 +-
packages/shell/bash-sandbox/README.md | 2 +-
packages/shell/bash-sandbox/README.zh.md | 14 +++---
packages/shell/pwsh-local/README.i18n.yaml | 2 +-
packages/shell/pwsh-local/README.zh.md | 14 +++---
packages/shell/pwsh-sandbox/README.i18n.yaml | 4 +-
packages/shell/pwsh-sandbox/README.md | 2 +-
packages/shell/pwsh-sandbox/README.zh.md | 20 ++++----
packages/shell/shell-env/README.i18n.yaml | 2 +-
packages/shell/shell-env/README.zh.md | 12 ++---
packages/shell/shell/README.i18n.yaml | 4 +-
packages/shell/shell/README.md | 2 +-
packages/shell/shell/README.zh.md | 12 ++---
.../tool-bash-persistent/README.i18n.yaml | 4 +-
packages/shell/tool-bash-persistent/README.md | 6 +--
.../shell/tool-bash-persistent/README.zh.md | 12 ++---
packages/shell/tool-bash/README.i18n.yaml | 2 +-
packages/shell/tool-bash/README.zh.md | 18 +++----
.../tool-pwsh-persistent/README.i18n.yaml | 2 +-
.../shell/tool-pwsh-persistent/README.zh.md | 14 +++---
packages/shell/tool-pwsh/README.i18n.yaml | 2 +-
packages/shell/tool-pwsh/README.zh.md | 16 +++----
packages/skill/README.i18n.yaml | 2 +-
packages/skill/README.zh.md | 6 +--
packages/skill/skill-badge/README.i18n.yaml | 4 +-
packages/skill/skill-badge/README.md | 4 +-
packages/skill/skill-badge/README.zh.md | 10 ++--
.../skill/skill-filesystem/README.i18n.yaml | 2 +-
packages/skill/skill-filesystem/README.zh.md | 12 ++---
packages/skill/skill/README.i18n.yaml | 4 +-
packages/skill/skill/README.md | 2 +-
packages/skill/skill/README.zh.md | 8 ++--
packages/skill/tool-skill/README.i18n.yaml | 4 +-
packages/skill/tool-skill/README.md | 4 +-
packages/skill/tool-skill/README.zh.md | 10 ++--
packages/spill/README.i18n.yaml | 2 +-
packages/spill/README.zh.md | 4 +-
packages/spill/spill-local/README.i18n.yaml | 2 +-
packages/spill/spill-local/README.zh.md | 8 ++--
packages/spill/spill-policy/README.i18n.yaml | 2 +-
packages/spill/spill-policy/README.zh.md | 2 +-
packages/spill/spill/README.i18n.yaml | 2 +-
packages/spill/spill/README.zh.md | 18 +++----
.../storage/storage-domain/README.i18n.yaml | 4 +-
packages/storage/storage-domain/README.md | 6 +--
packages/storage/storage-domain/README.zh.md | 14 +++---
.../storage/storage-json/README.i18n.yaml | 2 +-
packages/storage/storage-json/README.zh.md | 4 +-
.../storage/storage-sqlite/README.i18n.yaml | 2 +-
packages/storage/storage-sqlite/README.zh.md | 8 ++--
packages/storage/storage/README.i18n.yaml | 2 +-
packages/storage/storage/README.zh.md | 6 +--
packages/subagent/README.i18n.yaml | 4 +-
packages/subagent/README.md | 2 +-
packages/subagent/README.zh.md | 6 +--
.../subagent/subagent-acp/README.i18n.yaml | 2 +-
packages/subagent/subagent-acp/README.zh.md | 12 ++---
.../subagent-claude-code/README.i18n.yaml | 4 +-
.../subagent/subagent-claude-code/README.md | 6 +--
.../subagent-claude-code/README.zh.md | 18 +++----
.../subagent/subagent-codex/README.i18n.yaml | 2 +-
packages/subagent/subagent-codex/README.zh.md | 6 +--
.../subagent-dsh-sdk/README.i18n.yaml | 4 +-
packages/subagent/subagent-dsh-sdk/README.md | 4 +-
.../subagent/subagent-dsh-sdk/README.zh.md | 24 +++++-----
.../subagent-fork-in-process/README.i18n.yaml | 2 +-
.../subagent-fork-in-process/README.zh.md | 16 +++----
.../README.i18n.yaml | 4 +-
.../subagent-in-process-driver/README.md | 2 +-
.../subagent-in-process-driver/README.zh.md | 10 ++--
.../README.i18n.yaml | 2 +-
.../subagent-spawn-in-process/README.zh.md | 14 +++---
packages/subagent/subagent/README.i18n.yaml | 2 +-
packages/subagent/subagent/README.zh.md | 22 ++++-----
.../tool-subagent-control/README.i18n.yaml | 2 +-
.../tool-subagent-control/README.zh.md | 24 +++++-----
.../subagent/tool-subagent/README.i18n.yaml | 2 +-
packages/subagent/tool-subagent/README.zh.md | 2 +-
packages/subprocess/README.i18n.yaml | 4 +-
packages/subprocess/README.md | 2 +-
packages/subprocess/README.zh.md | 2 +-
.../subprocess-local/README.i18n.yaml | 2 +-
.../subprocess/subprocess-local/README.zh.md | 16 +++----
.../subprocess/subprocess/README.i18n.yaml | 4 +-
packages/subprocess/subprocess/README.md | 6 +--
packages/subprocess/subprocess/README.zh.md | 16 +++----
.../subprocess/win32-process/README.i18n.yaml | 2 +-
.../subprocess/win32-process/README.zh.md | 42 ++++++++--------
packages/terminal/README.i18n.yaml | 2 +-
packages/terminal/README.zh.md | 2 +-
.../terminal/terminal-bash/README.i18n.yaml | 2 +-
packages/terminal/terminal-bash/README.zh.md | 14 +++---
packages/terminal/terminal/README.i18n.yaml | 2 +-
packages/terminal/terminal/README.zh.md | 10 ++--
.../terminal/tool-terminal/README.i18n.yaml | 2 +-
packages/terminal/tool-terminal/README.zh.md | 10 ++--
packages/test-support/README.i18n.yaml | 4 +-
packages/test-support/README.md | 2 +-
packages/test-support/README.zh.md | 10 ++--
.../agent-loop-testkit/README.i18n.yaml | 2 +-
.../agent-loop-testkit/README.zh.md | 8 ++--
.../client-runtime/README.i18n.yaml | 2 +-
.../test-support/client-runtime/README.zh.md | 24 +++++-----
.../llm-mock-server/README.i18n.yaml | 2 +-
.../test-support/llm-mock-server/README.zh.md | 16 +++----
.../test-support/llm-replay/README.i18n.yaml | 2 +-
packages/test-support/llm-replay/README.zh.md | 10 ++--
.../loader-smoke/README.i18n.yaml | 2 +-
.../test-support/loader-smoke/README.zh.md | 18 +++----
.../session-snapshot/README.i18n.yaml | 2 +-
.../session-snapshot/README.zh.md | 14 +++---
packages/todo/README.i18n.yaml | 2 +-
packages/todo/README.zh.md | 2 +-
packages/todo/tool-todo/README.i18n.yaml | 2 +-
packages/todo/tool-todo/README.zh.md | 18 +++----
packages/typert/README.i18n.yaml | 4 +-
packages/typert/README.md | 4 +-
packages/typert/README.zh.md | 8 ++--
packages/typert/generator/README.i18n.yaml | 4 +-
packages/typert/generator/README.md | 4 +-
packages/typert/generator/README.zh.md | 16 +++----
packages/typert/loader/README.i18n.yaml | 4 +-
packages/typert/loader/README.md | 2 +-
packages/typert/loader/README.zh.md | 16 +++----
packages/typert/protocol/README.i18n.yaml | 2 +-
packages/typert/protocol/README.zh.md | 6 +--
packages/util/README.i18n.yaml | 2 +-
packages/util/README.zh.md | 6 +--
packages/util/atomic-write/README.i18n.yaml | 2 +-
packages/util/atomic-write/README.zh.md | 14 +++---
packages/util/brand/README.i18n.yaml | 2 +-
packages/util/brand/README.zh.md | 8 ++--
packages/util/chunked-list/README.i18n.yaml | 2 +-
packages/util/chunked-list/README.zh.md | 10 ++--
packages/util/crypto/README.i18n.yaml | 2 +-
packages/util/crypto/README.zh.md | 10 ++--
packages/util/deque/README.i18n.yaml | 2 +-
packages/util/deque/README.zh.md | 6 +--
packages/util/home-paths/README.i18n.yaml | 4 +-
packages/util/home-paths/README.md | 2 +-
packages/util/home-paths/README.zh.md | 2 +-
packages/util/http-proxy/README.i18n.yaml | 2 +-
packages/util/http-proxy/README.zh.md | 20 ++++----
.../util/launch-environment/README.i18n.yaml | 2 +-
packages/util/launch-environment/README.zh.md | 4 +-
packages/util/native-command/README.i18n.yaml | 4 +-
packages/util/native-command/README.md | 2 +-
packages/util/native-command/README.zh.md | 4 +-
.../util/output-retention/README.i18n.yaml | 2 +-
packages/util/output-retention/README.zh.md | 2 +-
packages/util/time/README.i18n.yaml | 2 +-
packages/util/time/README.zh.md | 14 +++---
packages/util/timeout/README.i18n.yaml | 2 +-
packages/util/timeout/README.zh.md | 8 ++--
packages/util/values/README.i18n.yaml | 2 +-
packages/util/values/README.zh.md | 6 +--
packages/web/README.i18n.yaml | 2 +-
packages/web/README.zh.md | 10 ++--
packages/web/tool-web/README.i18n.yaml | 2 +-
packages/web/tool-web/README.zh.md | 6 +--
packages/web/web-fetch-http/README.i18n.yaml | 2 +-
packages/web/web-fetch-http/README.zh.md | 8 ++--
.../web/web-search-deepseek/README.i18n.yaml | 4 +-
packages/web/web-search-deepseek/README.md | 2 +-
packages/web/web-search-deepseek/README.zh.md | 6 +--
packages/web/web-search-exa/README.i18n.yaml | 2 +-
packages/web/web-search-exa/README.zh.md | 8 ++--
.../web-search-perplexity/README.i18n.yaml | 2 +-
.../web/web-search-perplexity/README.zh.md | 6 +--
packages/web/web/README.i18n.yaml | 2 +-
packages/web/web/README.zh.md | 6 +--
packages/webhook/README.i18n.yaml | 2 +-
packages/webhook/README.zh.md | 12 ++---
.../webhook/webhook-github/README.i18n.yaml | 2 +-
packages/webhook/webhook-github/README.zh.md | 28 +++++------
packages/webhook/webhook/README.i18n.yaml | 2 +-
packages/webhook/webhook/README.zh.md | 48 +++++++++----------
packages/workflow/README.i18n.yaml | 2 +-
packages/workflow/README.zh.md | 2 +-
packages/workflow/tool-ralph/README.i18n.yaml | 4 +-
packages/workflow/tool-ralph/README.md | 2 +-
packages/workflow/tool-ralph/README.zh.md | 14 +++---
.../workflow/tool-workflow/README.i18n.yaml | 2 +-
packages/workflow/tool-workflow/README.zh.md | 18 +++----
.../workflow-worker-thread/README.i18n.yaml | 2 +-
.../workflow-worker-thread/README.zh.md | 14 +++---
packages/workflow/workflow/README.i18n.yaml | 4 +-
packages/workflow/workflow/README.md | 4 +-
packages/workflow/workflow/README.zh.md | 10 ++--
packages/workspace/README.i18n.yaml | 2 +-
packages/workspace/README.zh.md | 6 +--
packages/workspace/workspace/README.i18n.yaml | 2 +-
packages/workspace/workspace/README.zh.md | 12 ++---
python/README.i18n.yaml | 2 +-
python/README.zh.md | 4 +-
python/sdk-runtime/README.i18n.yaml | 2 +-
python/sdk-runtime/README.zh.md | 16 +++----
python/sdk/README.i18n.yaml | 2 +-
python/sdk/README.zh.md | 20 ++++----
python/sdk/examples/README.i18n.yaml | 2 +-
python/sdk/examples/README.zh.md | 16 +++----
744 files changed, 2592 insertions(+), 2631 deletions(-)
diff --git a/apps/cli/README.i18n.yaml b/apps/cli/README.i18n.yaml
index aa5c385a7e..cfded686cf 100644
--- a/apps/cli/README.i18n.yaml
+++ b/apps/cli/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write apps/cli/README.md
README.md: 2e74ef68cf0b8487083a2e2af0f5175c78ec5212
-README.zh.md: 85a75f4c025e1bfe1461b9ffdaca533d308318ba
+README.zh.md: 553f28f3af78b18658701449678de80b086dbb15
diff --git a/apps/cli/README.zh.md b/apps/cli/README.zh.md
index 85a75f4c02..553f28f3af 100644
--- a/apps/cli/README.zh.md
+++ b/apps/cli/README.zh.md
@@ -2,7 +2,7 @@
[English](README.md) | 中文
-`dsh` 是唯一受支持的 Node 应用启动器;profile 由多个插件组合包 patch 层按顺序叠加而成,其上再应用用户自己的覆盖配置。SDK 与 ACP 都是 profile,而不是独立的公开 bin。Python 运行时 wheel 会打包同一个命令;SDK 默认使用 `sdk`,极简示例选择 `sdk-minimal`。[`src/args.ts`](src/args.ts) 负责命令语法,[`src/bin.ts`](src/bin.ts) 只加载选中的运行器。无效命令、来自其他模式的选项、配置错误和启动失败都会以非零状态退出。
+`dsh` 是唯一受支持的 Node 应用启动器;profile 由多个插件组合包 patch 层按顺序叠加而成,其上再应用用户自己的覆盖配置。SDK 与 ACP(Agent Client Protocol)都是 profile,而不是独立的公开可执行命令。Python 运行时 wheel 包中也包含同一个命令;SDK 默认使用 `sdk`,极简示例选择 `sdk-minimal`。[`src/args.ts`](src/args.ts) 负责命令语法,[`src/bin.ts`](src/bin.ts) 只加载选中的运行器。无效命令、来自其他模式的选项、配置错误和启动失败都会以非零状态退出。
## 入口模式
@@ -10,14 +10,14 @@
|---|---|
| `dsh --profile ` | 启动位于 `$DSH_HOME/profiles/` 的指定 profile。 |
| `dsh --profile --from-default-profile ` | 从随附模板创建新的自定义 profile,然后启动它。 |
-| `dsh --profile acp` | 通过 ACP stdio 为自动化 client 提供服务,直至断开连接。 |
+| `dsh --profile acp` | 通过 ACP stdio 为自动化客户端提供服务,直至断开连接。 |
| `dsh --profile headless "job"` | 运行一个全新的持久化会话,打印最终答案并退出。 |
-| `dsh --profile sdk` | 通过 JSON-RPC stdio 为 SDK client 提供服务,直至关闭或断开连接。 |
-| `dsh --profile sdk-minimal` | 以独立极简 agent 配置树为 SDK client 提供服务。 |
+| `dsh --profile sdk` | 通过 JSON-RPC stdio 为 SDK 客户端提供服务,直至关闭或断开连接。 |
+| `dsh --profile sdk-minimal` | 以独立极简 agent(智能体)配置树为 SDK 客户端提供服务。 |
| `dsh web` | `--profile web` 的别名。 |
| `dsh plugin --profile ` | 通过在 profile 目录中转发给 pnpm 来管理该 profile 的插件。 |
-运行命令时所在的目录将作为默认 workspace 根目录。`web`、`headless`、`sdk`、`sdk-minimal` 和 `acp` profile 在首次使用时会从随附模板自动初始化。使用 `--from-default-profile` 可以基于这些模板之一,在尚未使用的非内置名称处创建其他 profile;通过 `dsh plugin` 则可以初始化一个以 base 为基础的 profile。`desktop` 名称保留给 Electron 持有的 profile,因此 CLI 会拒绝针对它的启动、配置 dump 和插件管理请求。
+运行命令时所在的目录将作为默认 workspace 根目录。`web`、`headless`、`sdk`、`sdk-minimal` 和 `acp` profile 在首次使用时会从随附模板自动初始化。使用 `--from-default-profile` 可以基于这些模板之一,在尚未使用的非内置名称处创建其他 profile;通过 `dsh plugin` 则可以初始化一个以 base 为基础的 profile。`desktop` 名称保留给 Electron 持有的 profile,因此 CLI(命令行界面)会拒绝针对它的启动、配置 dump 和插件管理请求。
## 应用参数
@@ -45,11 +45,11 @@ profile 目录包含一个 `package.json`,其中记录树外插件依赖,以
使用 `--dump-default-config` 和 `--dump-config` 可在不启动的情况下检查组合后的配置树。
-层的确切优先级、flag、关闭行为、部署默认值和源码执行方式,以 [CLI(命令行界面)行为参考](reference/README.zh.md)为准。
+层的确切优先级、flag、关闭行为、部署默认值和源码执行方式,以 [CLI 行为参考](reference/README.zh.md)为准。
-## 可选 Overlay
+## 可选覆盖层
-`config/examples/` 交付 GitHub 评审 webhook、会话内 Schedule、记忆 MCP 服务与运行时 Cordis 工具的可选 overlay。它们绝不属于默认 profile;安装与安全说明由[用户指南](../../docs/user/guide/index.zh.md)和[开发实战指南](../../docs/user/develop/practice/index.zh.md)负责。
+`config/examples/` 交付 GitHub 评审 webhook、会话内 Schedule、记忆 MCP 服务器与运行时 Cordis 工具的可选覆盖层。它们绝不属于默认 profile;设置与安全说明由[用户指南](../../docs/user/guide/index.zh.md)和[开发实战指南](../../docs/user/develop/practice/index.zh.md)负责。
## 开发
diff --git a/apps/cli/reference/README.i18n.yaml b/apps/cli/reference/README.i18n.yaml
index ae963e570a..eac40e104e 100644
--- a/apps/cli/reference/README.i18n.yaml
+++ b/apps/cli/reference/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write apps/cli/reference/README.md
-README.md: 99ef8310cd1316e9ee4ade55fcac00766ae1e821
-README.zh.md: aa446d539a5b666e7745f459b5a014b22e72f90e
+README.md: 5a92052eb24c8af432c2ede371a2ff2bc84f57c0
+README.zh.md: 31acba47307dd30ba494bffdc8c493a550deda63
diff --git a/apps/cli/reference/README.md b/apps/cli/reference/README.md
index 99ef8310cd..5a92052eb2 100644
--- a/apps/cli/reference/README.md
+++ b/apps/cli/reference/README.md
@@ -10,7 +10,7 @@ This reference defines the profile, web-alias, plugin-management, and config-dum
Bundle names resolve from the dsh installation first, then from the profile directory. In-box bundles (`@deepseek-ai/dsh-base`, `@deepseek-ai/dsh-web-app`, `@deepseek-ai/dsh-headless`, `@deepseek-ai/dsh-sdk-app`, `@deepseek-ai/dsh-sdk-minimal`, `@deepseek-ai/dsh-acp-app`) therefore always come from the same installation as the running `dsh`; out-of-tree bundles come from the profile's pnpm-managed `node_modules`. A bare plugin `name` in any patch row resolves through the profile directory's Node parent walk, which reaches the maintained installation fallback `$DSH_HOME/profiles/node_modules`. Plain Node installations place one healed symlink there per dependency-closure package. A pkg executable instead places a real ESM proxy that mirrors explicit exports and re-exports the virtual package URL, because operating-system symlinks cannot enter pkg's `/snapshot` filesystem. Every launch also links packages carried only by selected external bundles through a dsh-owned directory into the current profile's `node_modules`; existing pnpm entries win, and each profile owns its links independently.
-The `web`, `headless`, `sdk`, `sdk-minimal`, and `acp` profiles auto-initialize from shipped templates on first use (`web`: base + web-app with live patches; `headless`: base + headless with startup-only patches; `sdk`: base + sdk-app with startup-only patches; `sdk-minimal`: its standalone bundle with startup-only patches; `acp`: base + acp-app with startup-only patches). Any other missing profile fails loud with a hint to run `dsh plugin --profile add `.
+The `web`, `headless`, `sdk`, `sdk-minimal`, and `acp` profiles auto-initialize from shipped templates on first use (`web`: base + web-app with live patches; `headless`: base + headless with startup-only patches; `sdk`: base + sdk-app with startup-only patches; `sdk-minimal`: its standalone bundle with startup-only patches; `acp`: base + acp-app with startup-only patches). Any other missing profile fails loudly with a hint to run `dsh plugin --profile add `.
`dsh --profile --from-default-profile ` initializes a new custom target from one of those five shipped templates before boot. The target name cannot be a shipped profile name, and its complete profile directory must not exist. The launcher claims that directory exclusively, so residual files and another concurrent creator are rejected without modification. It copies the template's current bundle list and `patchReload` value into a new manifest with empty dependencies and an empty user patch. It does not read the local profile named by ``, copy its dependencies or patch, or persist an inheritance field; later template-list changes do not rewrite the new profile. The in-box bundles named by that copied list still resolve from the current dsh installation. A successful initialization adds no launcher output.
@@ -37,7 +37,7 @@ The shipped apps own these command lines:
| `headless` | the task text, as the positional argument |
| `sdk` | no options; stdio carries the JSON-RPC protocol |
| `sdk-minimal` | no options; stdio carries the same JSON-RPC protocol |
-| `acp` | no options; stdio carries Agent Client Protocol |
+| `acp` | no options; stdio carries ACP (Agent Client Protocol) |
A one-shot task (`dsh --profile headless "run the tests"`) creates one fresh persisted Agent through the core registry, submits the task, waits for quiescence, and flushes the Session before deriving the last non-empty assistant text and final `turn/end` reason from its durable interval. It streams non-empty provider reasoning deltas to stderr under a `dsh: reasoning:` heading, prints only the final text on stdout, and exits 0 for `completed`, else 1; a successful response with no reasoning leaves stderr empty. An invocation with no task is a usage error from that app. The shipped headless profile mounts no browser Connection, HTTP server, Web runtime, or browser client, and opens no listening port.
@@ -100,7 +100,7 @@ New sessions in base-backed profiles default to the `workspace-write` permission
The base bundle mounts the native DeepSeek adapter, settings and credential providers, stable `web_search` and `web_fetch`, the public-only HTTP fetch provider, opt-in DeepSeek session-log upload, and feedback-gated OTel upload for all users. Provider credentials resolve from the inherited environment, `$DSH_HOME/.credentials.yaml`, the invoking directory's `.env`, then `$DSH_HOME/.env`; the managed document is never materialized into `process.env`, while both `.env` files are ordinary launch environment layers. Search uses `DEEPSEEK_API_KEY` and accepts `DEEPSEEK_SEARCH_BASE_URL`. Enabled fetch calls run in every sandbox and approval mode without per-call confirmation; the provider rejects non-public destinations before connecting. The Web app disables the base tool row and exposes the same tools through its `cordis`, `ptc`, and `standard` agent presets.
-Feedback is recorded in the Session log without starting model work. Enable the [DeepSeek session-log contributor](../../../packages/session/session-log-deepseek/README.md) to send complete unaccepted log suffixes with subsequent DeepSeek requests, including configured gateways. [OTel session upload](../../../packages/session/session-telemetry-otel/README.md) applies to all users and providers, including `deepseek-official`, without requiring a request header. The base defaults to `FEEDBACK_ONLY`: new own text feedback, message ratings, edits, and withdrawals release the complete canonical prefix through that event, including stored context; later records wait for the next explicit feedback. Inherited parent feedback does not authorize a fork. Requests, restoration, mount, and HMR do not trigger capture. SDK batching may finish an authorized upload without further interaction or model work. `DSH_TELEMETRY_MODE=DISABLED` disables OTel delivery; `FULL` is rejected, and any non-empty `DSH_TELEMETRY_DISABLED` disables its row. `DSH_TELEMETRY_OTLP_URL` selects the collector. Handoff is best-effort, not collector acceptance; no durable outbox or retry guarantee is provided. These OTel settings do not enable or disable the DeepSeek contribution. Neither path changes model input, but exports can include message text, tool arguments and results, and workspace paths.
+Feedback is recorded in the Session log without starting model work. Enable the [DeepSeek session-log contributor](../../../packages/session/session-log-deepseek/README.md) to send complete unaccepted log suffixes with subsequent DeepSeek requests, including requests sent through configured gateways. [OTel session upload](../../../packages/session/session-telemetry-otel/README.md) applies to all users and providers, including `deepseek-official`, without requiring a request header. The base defaults to `FEEDBACK_ONLY`: new own text feedback, message ratings, edits, and withdrawals release the complete canonical prefix through that event, including stored context; later records wait for the next explicit feedback. Inherited parent feedback does not authorize a fork. Requests, restoration, mount, and HMR do not trigger capture. SDK batching may finish an authorized upload without further interaction or model work. `DSH_TELEMETRY_MODE=DISABLED` disables OTel delivery; `FULL` is rejected, and any non-empty `DSH_TELEMETRY_DISABLED` disables its row. `DSH_TELEMETRY_OTLP_URL` selects the collector. Handoff is best-effort, not collector acceptance; no durable outbox or retry guarantee is provided. These OTel settings do not enable or disable the DeepSeek contribution. Neither path changes model input, but exports can include message text, tool arguments and results, and workspace paths.
Install external plugin bundles through `dsh plugin --profile add `. The installed package owns its dependencies and contributes its declared `cordis.patch.yml` layer. The CLI also ships `@deepseek-ai/dsh-mcp-client` as a dependency for patch layers, but no MCP server is enabled by default because each server command is trusted executable code outside the agent sandbox.
diff --git a/apps/cli/reference/README.zh.md b/apps/cli/reference/README.zh.md
index aa446d539a..31acba4730 100644
--- a/apps/cli/reference/README.zh.md
+++ b/apps/cli/reference/README.zh.md
@@ -10,13 +10,13 @@
`dsh --profile ` 启动位于 `$DSH_HOME/profiles/` 的 profile。生效配置树以空根节点为起点,依次叠加 profile manifest(元数据清单)的 `dsh.profile.bundles` 列表中指定的各组合包 patch、profile 自身的 `cordis.patch.yml`、home 级的 `$DSH_HOME/cordis.patch.yml`(这是各 profile 共享的机器本地偏好,因此优先于逐 profile 配置层),以及按 argv 顺序指定的各个 `--patch ` 覆盖层。对同一配置行,后应用的层优先。patch 会替换目标行的整个 `config` 值,而不是深度合并其中的键;patch 也可以插入新行。`dsh.profile.patchReload` 可选择 `live` patch 文件监视或 `startup` 单次加载;自定义 profile 省略该值时默认使用 `live`。配置解析、schema 校验、模块解析或插件启动失败时,系统会报告错误并以非零状态退出。收到 SIGINT 或 SIGTERM 时,挂载的根节点会先 dispose(资源释放)再退出。
-组合包名称先从 dsh 安装目录解析,再从 profile 目录解析。因此,内置组合包(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`、`@deepseek-ai/dsh-sdk-app`、`@deepseek-ai/dsh-sdk-minimal`、`@deepseek-ai/dsh-acp-app`)始终来自当前运行的 `dsh` 所属的安装;树外组合包则来自 profile 中由 pnpm 管理的 `node_modules`。patch 行中的裸插件 `name` 会从 profile 目录开始,按照 Node 的模块解析规则逐级向父目录查找,直至由 dsh 维护的安装后备目录 `$DSH_HOME/profiles/node_modules`。普通 Node 安装会为依赖闭包中的每个包放置并修复一个符号链接。pkg 可执行程序则放置真实 ESM 代理,镜像显式 exports 并重新导出虚拟包 URL,因为操作系统符号链接无法进入 pkg 的 `/snapshot` 文件系统。每次启动还会把仅由所选外部 bundle 携带的包经 dsh 自有目录链接到当前 profile 的 `node_modules`;已有 pnpm 条目优先,且每个 profile 独立拥有自己的链接。
+组合包名称先从 dsh 安装目录解析,再从 profile 目录解析。因此,内置组合包(`@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app`、`@deepseek-ai/dsh-headless`、`@deepseek-ai/dsh-sdk-app`、`@deepseek-ai/dsh-sdk-minimal`、`@deepseek-ai/dsh-acp-app`)始终来自当前运行的 `dsh` 所属的安装;树外组合包则来自 profile 中由 pnpm 管理的 `node_modules`。patch 行中的裸插件 `name` 会从 profile 目录开始,按照 Node 的模块解析规则逐级向父目录查找,直至由 dsh 维护的安装后备目录 `$DSH_HOME/profiles/node_modules`。普通 Node 安装会为依赖闭包中的每个包放置并修复一个符号链接。pkg 可执行程序则放置真实 ESM 代理,镜像显式 exports 并重新导出虚拟包 URL,因为操作系统符号链接无法进入 pkg 的 `/snapshot` 文件系统。每次启动还会把仅由所选外部组合包携带的包经 dsh 自有目录链接到当前 profile 的 `node_modules`;已有 pnpm 条目优先,且每个 profile 独立拥有自己的链接。
`web`、`headless`、`sdk`、`sdk-minimal` 和 `acp` profile 首次使用时会从随附模板自动初始化(`web`:base + web-app,实时应用 patch;`headless`:base + headless,只在启动时应用 patch;`sdk`:base + sdk-app,只在启动时应用 patch;`sdk-minimal`:独立组合包,只在启动时应用 patch;`acp`:base + acp-app,只在启动时应用 patch)。其他缺失的 profile 会显式报错,并提示运行 `dsh plugin --profile add `。
-`dsh --profile --from-default-profile ` 会在启动前,从上述五个随附模板之一初始化新的自定义目标。目标名称不能是随附 profile 名称,并且完整的目标 profile 目录必须不存在。launcher 会以独占方式领取该目录,因此残留文件和另一个并发创建者都会在不作修改的情况下被拒绝。它把模板当前的 bundle 列表和 `patchReload` 值复制进一份依赖为空、用户 patch 为空的新 manifest。它不会读取 `` 指定的本地同名 profile,不会复制其依赖或 patch,也不会持久化继承字段;模板列表之后的变化不会改写新 profile。复制列表中指名的内置 bundle 仍从当前 dsh 安装目录解析。初始化成功不会增加 launcher 输出。
+`dsh --profile --from-default-profile ` 会在启动前,从上述五个随附模板之一初始化新的自定义目标。目标名称不能是随附 profile 名称,并且完整的目标 profile 目录必须不存在。launcher 会以独占方式领取该目录,因此残留文件和另一个并发创建者都会在不作修改的情况下被拒绝。它把模板当前的组合包列表和 `patchReload` 值复制进一份依赖为空、用户 patch 为空的新 manifest。它不会读取 `` 指定的本地同名 profile,不会复制其依赖或 patch,也不会持久化继承字段;模板列表之后的变化不会改写新 profile。复制列表中指名的内置组合包仍从当前 dsh 安装目录解析。初始化成功不会增加 launcher 输出。
-profile 已经存在时,`--from-default-profile` 会被拒绝,且不会修改或启动它;去掉该选项即可使用它。残留的目标目录同样会被原样保留,此时必须改用另一个 profile 名称。未知模板或随附目标名称会在创建目标之前失败;未知模板的诊断会列出有效模板。初始化在 bundle 解析和应用启动之前提交,因此后续失败仍会把新 profile 留在磁盘上,重试时需要去掉创建选项。`--dump-config` 和 `--dump-default-config` 接受该选项:它们初始化目标并打印所请求的配置树,但不启动应用。
+profile 已经存在时,`--from-default-profile` 会被拒绝,且不会修改或启动它;去掉该选项即可使用它。残留的目标目录同样会被原样保留,此时必须改用另一个 profile 名称。未知模板或随附目标名称会在创建目标之前失败;未知模板的诊断会列出有效模板。初始化在组合包解析和应用启动之前提交,因此后续失败仍会把新 profile 留在磁盘上,重试时需要去掉创建选项。`--dump-config` 和 `--dump-default-config` 接受该选项:它们初始化目标并打印所请求的配置树,但不启动应用。
```sh
dsh --profile rescue --from-default-profile web
@@ -39,9 +39,9 @@ dsh --profile rescue
| `headless` | 任务文本,作为位置参数 |
| `sdk` | 无选项;stdio 携带 JSON-RPC 协议 |
| `sdk-minimal` | 无选项;stdio 携带相同的 JSON-RPC 协议 |
-| `acp` | 无选项;stdio 携带 Agent Client Protocol |
+| `acp` | 无选项;stdio 携带 ACP(Agent Client Protocol) |
-一次性任务(`dsh --profile headless "run the tests"`)通过核心注册表创建一个全新的持久化 Agent(智能体),提交任务、等待完全停稳并对会话执行 flush,再从其持久化事件区间中推导最后一个非空 assistant 文本与最终 `turn/end` 原因。它在 `dsh: reasoning:` 标题下将非空的提供方推理分片流式写入 stderr,只在 stdout 打印最终文本,并在原因为 `completed` 时以 0 退出,否则以 1 退出;没有推理内容的成功响应会保持 stderr 为空。没有任务的调用是该应用的用法错误。随附 headless profile 不挂载浏览器 Connection、HTTP 服务器、Web 运行时或浏览器客户端,也不会打开监听端口。
+一次性任务(`dsh --profile headless "run the tests"`)通过核心注册表创建一个全新的持久化 Agent(智能体),提交任务、等待完全停稳并对会话执行 flush,再从其持久化事件区间中推导最后一个非空 assistant 文本与最终 `turn/end` 原因。它在 `dsh: reasoning:` 标题下将非空的提供方推理(reasoning)增量流式写入 stderr,只在 stdout 打印最终文本,并在原因为 `completed` 时以 0 退出,否则以 1 退出;没有推理内容的成功响应会保持 stderr 为空。没有任务的调用是该应用的用法错误。随附 headless profile 不挂载浏览器 Connection、HTTP 服务器、Web 运行时或浏览器客户端,也不会打开监听端口。
可在不启动的情况下检查组合出的配置树:
@@ -56,7 +56,7 @@ dsh --profile web --patch ./extra.yml --dump-config
`dsh plugin --profile ` 在 profile 缺失时先初始化它(有随附模板的用模板,其他名称只装 `@deepseek-ai/dsh-base`),然后以 profile 目录为工作目录,把 `` 转发给 `pnpm`:`add`、`remove`、`why`、`update` 及其他所有 pnpm 子命令都照常可用;pnpm 必须在 PATH 上。相对路径 spec(`.`、`../plugin` 及其 `file:`/`link:` 形式)会先锚定到调用目录,因此在插件 checkout 中执行 `add .` 安装的是该 checkout,而不是 profile。每次成功运行后,系统都会根据当前安装状态更新 `dsh.profile.bundles`:如果某项依赖解析到的包在 manifest 中声明了 `"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }`,该依赖就会加入配置层栈;如果某项依赖在 `update` 后获得该声明,也会随即激活。没有组合包声明的依赖仍作为普通依赖保留,并显示一次性警告;已移除的依赖则从配置层栈中删除。
-Codex 与 Claude Code subagent provider 是两个彼此独立的可选 Bundle。可以只添加一个包、在同一命令中添加两个包,或独立移除任一包:
+Codex 与 Claude Code subagent 提供方是两个彼此独立的可选组合包。可以只添加一个包、在同一命令中添加两个包,或独立移除任一包:
```sh
dsh plugin --profile add @deepseek-ai/dsh-subagent-codex
@@ -66,7 +66,7 @@ dsh plugin --profile remove @deepseek-ai/dsh-subagent-codex
dsh plugin --profile remove @deepseek-ai/dsh-subagent-claude-code
```
-pnpm 操作成功后只会改变磁盘上的 Profile manifest 与 Bundle 列表;正在运行的 Profile 会保留本次启动时的 Bundle 集合。添加、移除或更新 Bundle 后须重启该 Profile。这个启动边界只适用于 Bundle 成员变化,Profile 或 home 中普通 `cordis.patch.yml` 的编辑通过热重载生效。下一次启动时,每个已安装 Bundle 只注册自己的休眠 Host provider;还须在复制出的 Preset 中单独启用对应工具行,新 Agent 才能看到该工具。[Codex provider README](../../../packages/subagent/subagent-codex/README.zh.md)与 [Claude Code provider README](../../../packages/subagent/subagent-claude-code/README.zh.md)负责可执行文件、身份验证、载荷与失败细节;[base Bundle 参考](../../../packages/bundle/base/README.zh.md)负责默认依赖闭包。
+pnpm 操作成功后会改变磁盘上的 Profile manifest 与组合包列表;正在运行的 Profile 会保留本次启动时的组合包集合。添加、移除或更新组合包后须重启该 Profile。这个启动边界只适用于组合包成员变化,Profile 或 home 中普通 `cordis.patch.yml` 的编辑通过热重载生效。下一次启动时,每个已安装组合包只注册自己的休眠 Host 提供方;还须在复制出的 Preset 中单独启用对应工具行,新 Agent 才能看到该工具。[Codex provider README](../../../packages/subagent/subagent-codex/README.zh.md) 与 [Claude Code provider README](../../../packages/subagent/subagent-claude-code/README.zh.md) 负责可执行文件、身份验证、载荷与失败细节;[base 组合包参考](../../../packages/bundle/base/README.zh.md) 负责默认依赖闭包。
```sh
dsh plugin --profile tui add github:deepseek-harness/turtle-ui
@@ -92,7 +92,7 @@ dsh web --help
进程关闭时,插件树最多有 5 秒完成 dispose。首次收到 `SIGINT` 或 `SIGTERM` 时会开始优雅排空:`SIGTERM` 是监督进程发出的常规停止请求,在所有运行模式下都以 0 退出;`SIGINT` 则报告 130。第二次收到信号时会立即强制退出。如果一次性运行在正常结束时已经卡在 dispose 阶段,第一次按下 `Ctrl+C` 就会直接升级为强制退出,而不会被忽略。
-基于 base 的模式都将运行命令时所在的目录作为默认 workspace 根目录,以 65,536 字节渲染预算加载适用的 `AGENTS.md` 或 `CLAUDE.md` 指令,并使用内存 SQLite 会话内容索引。独立的 `sdk-minimal` profile 把运行命令时所在的目录作为沙箱策略根目录,但刻意省略文件系统工具、指令发现与 SQLite。`patchReload: live` profile 会监视 profile 与 home 两个 `cordis.patch.yml` 配置层的有效变更,并以事务方式重新应用;`startup` profile 则只应用一次。一次性运行模式通过有界关闭流程退出,该流程会 dispose(资源释放)所有实时监视器。
+基于 base 的模式都将运行命令时所在的目录作为默认 workspace 根目录,以 65,536 字节渲染预算加载适用的 `AGENTS.md` 或 `CLAUDE.md` 指令,并使用内存 SQLite 会话内容索引。独立的 `sdk-minimal` profile 把运行命令时所在的目录作为沙箱策略根目录,但刻意省略文件系统工具、指令发现与 SQLite。`patchReload: live` profile 会监视 profile 与 home 两个 `cordis.patch.yml` 配置层的有效变更,并以事务方式重新应用;`startup` profile 则只应用一次。一次性运行模式通过有界关闭流程退出,该流程会 dispose 所有实时监视器。
基于 base 的 profile 中,新会话默认使用 `workspace-write` 权限预设。Bash 和文件系统修改仅限于会话 workspace 与平台临时根目录;读取和网络访问不受限制,进程可见性则取决于所选沙箱后端——bwrap 在私有 PID 命名空间中运行命令并隐藏宿主进程,Landlock 与 Seatbelt 保持宿主进程可见性不变。`DSH_PERMISSION_MODE` 更改进程后备值。General settings 中存储的权限影响后续 Web 会话,不改变已打开的会话。独立的 `sdk-minimal` 配置树则固定为 `danger-full-access`,且不挂载 approval 或权限 settings 服务。
@@ -102,9 +102,9 @@ dsh web --help
基础组合包挂载原生 DeepSeek 适配器、settings 与凭据提供方、稳定的 `web_search` 和 `web_fetch`、仅限公网的 HTTP fetch 提供方,需主动开启的 DeepSeek 会话日志上传,以及面向所有用户的反馈门控 OTel 上传。提供方凭据依次从继承环境、`$DSH_HOME/.credentials.yaml`、调用目录的 `.env` 和 `$DSH_HOME/.env` 解析;受管文档从不物化进 `process.env`,而两个 `.env` 文件都是普通启动环境层。搜索使用 `DEEPSEEK_API_KEY` 并接受 `DEEPSEEK_SEARCH_BASE_URL`。已启用的抓取调用会在所有 sandbox 与审批模式下执行,无需逐次确认;提供方会在连接前拒绝非公开目的地址。Web app 会禁用 base 工具配置项,再通过 `cordis`、`ptc` 与 `standard` agent preset 暴露相同工具。
-反馈记录在会话日志中,不会启动模型工作。开启 [DeepSeek 会话日志贡献器](../../../packages/session/session-log-deepseek/README.zh.md)后,后续 DeepSeek 请求会发送尚未确认的完整日志后缀,包括发往配置网关的请求。[OTel 会话上传](../../../packages/session/session-telemetry-otel/README.zh.md)适用于所有用户和提供方,包括 `deepseek-official`,无需请求头。基础配置默认使用 `FEEDBACK_ONLY`:新的自身文本反馈、消息评分、编辑与撤回会释放截至该事件的完整权威日志前缀,包含存储的上下文;后续记录等待下一次显式反馈。继承的父级反馈不构成 fork 的授权。请求、恢复、挂载和 HMR 不触发捕获。SDK 批处理可完成已授权上传,无需进一步交互或模型工作。`DSH_TELEMETRY_MODE=DISABLED` 禁止 OTel 投递;`FULL` 被拒绝,任何非空的 `DSH_TELEMETRY_DISABLED` 都会禁用其配置行。`DSH_TELEMETRY_OTLP_URL` 选择采集端。交接尽力而为,不代表采集端接受;不提供持久化 outbox 或重试保证。这些 OTel 设置不会开启或关闭 DeepSeek 贡献。两条路径都不改变模型输入,但导出可能包含消息文本、工具参数和结果,以及工作区路径。
+反馈记录在会话日志中,不会启动模型工作。开启 [DeepSeek 会话日志贡献器](../../../packages/session/session-log-deepseek/README.zh.md)后,后续 DeepSeek 请求会发送尚未被接受的完整日志后缀,包括经已配置网关发送的请求。[OTel 会话上传](../../../packages/session/session-telemetry-otel/README.zh.md)适用于所有用户和提供方,包括 `deepseek-official`,无需请求头。基础配置默认使用 `FEEDBACK_ONLY`:新的自身文本反馈、消息评分、编辑与撤回会释放截至该事件的完整规范日志前缀,包含存储的上下文;后续记录等待下一次显式反馈。继承的父级反馈不构成 fork 的授权。请求、恢复、挂载和 HMR 不触发捕获。SDK 批处理可完成已授权上传,无需进一步交互或模型工作。`DSH_TELEMETRY_MODE=DISABLED` 禁止 OTel 投递;`FULL` 被拒绝,任何非空的 `DSH_TELEMETRY_DISABLED` 都会禁用其配置行。`DSH_TELEMETRY_OTLP_URL` 选择采集端。交接尽力而为,不代表采集端接受;不提供持久化 outbox 或重试保证。这些 OTel 设置不会开启或关闭 DeepSeek 贡献。两条路径都不改变模型输入,但导出可能包含消息文本、工具参数和结果,以及工作区路径。
-通过 `dsh plugin --profile add ` 安装外部插件组合包。安装的包拥有其依赖,并贡献其声明的 `cordis.patch.yml` 层。CLI 还随附 `@deepseek-ai/dsh-mcp-client` 作为供 patch 层使用的依赖,但默认不启用 MCP 服务器,因为每条服务器命令都是 agent(智能体)沙箱之外的受信任可执行代码。
+通过 `dsh plugin --profile add ` 安装外部插件组合包。安装的包拥有其依赖,并贡献其声明的 `cordis.patch.yml` 层。CLI 还随附 `@deepseek-ai/dsh-mcp-client` 作为供 patch 层使用的依赖,但默认不启用 MCP 服务器,因为每条服务器命令都是 agent 沙箱之外的受信任可执行代码。
## 源码执行
diff --git a/apps/desktop/README.i18n.yaml b/apps/desktop/README.i18n.yaml
index de168b99dd..1e9d5902e6 100644
--- a/apps/desktop/README.i18n.yaml
+++ b/apps/desktop/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write apps/desktop/README.md
README.md: cf350a9d5e9577f5cf52c4371b32f16e278133f9
-README.zh.md: df48eb5903e21cae9ff041626c28d41d12e5c632
+README.zh.md: 80f1f56e59c691dd11684420879be02f8813bacf
diff --git a/apps/desktop/README.zh.md b/apps/desktop/README.zh.md
index df48eb5903..80f1f56e59 100644
--- a/apps/desktop/README.zh.md
+++ b/apps/desktop/README.zh.md
@@ -9,32 +9,32 @@
| 决策 | 原因 | 直接结果 |
|---|---|---|
| 发布身份 | 桌面壳 API、Web 客户端、后端与插件依赖图作为一个组合完成验证;独立版本会产生未经验证的组合,并让更新可用性含糊不清。 | Electron 与 `@deepseek-ai/dsh` 始终使用同一精确版本。即使桌面壳代码不变,升级 dsh 也必须发布新 Desktop 版本。 |
-| 运行时 | Electron 的 Node.js 带有 Electron 补丁、fuse、ABI 与生命周期约束,而系统运行时和用户包管理器状态不可控。 | dsh 通过内置的上游 Node.js 运行,所有包操作都使用内置 pnpm。Electron 的 Node.js、系统 Node.js、系统 pnpm 与用户的包管理器配置都不进入执行路径。 |
-| 包来源 | 必须能在发布到 npm 之前从同一次源码构建打包精确的 dsh,并支持离线安装;插件则需要保留为用户选择的普通 npm 包。 | 已签名应用携带本地打包的第一方 dsh 包与离线 seed store。桌面插件仍是从固定 Desktop registry 解析的普通 npm 依赖。 |
-| Seed 传输 | Apple 公证会检查归档内的代码;把 pnpm store 的每个文件分别放入应用,还会让应用签名记录数万个缓存条目,而单个压缩归档会放大小幅包变更。 | macOS 打包先签署每个 Mach-O CAS 对象、重写其 pnpm 哈希并再次证明离线安装,再把 store 文件分配到 16 个确定性的未压缩 tar 分片。外层安装包负责压缩,差分更新可以复用未变化的分片。 |
-| 状态归属 | 共享可执行依赖图会让 CLI 与 Desktop 相互改变 dsh、Cordis、插件或原生模块版本,而两个桌面进程还可能争用同一个 profile。 | Electron 在访问任何 profile 前获取进程生命周期单实例锁,并独占 `$DSH_HOME/profiles/desktop` 及其包管理器状态。CLI 与 Desktop 共享 `$DSH_HOME` 下受支持的产品数据,但绝不共享可执行包、插件激活、锁文件或 `node_modules`。 |
+| 运行时 | Electron 的 Node.js 带有 Electron 补丁、fuse、ABI 与生命周期约束,而系统运行时和包管理器状态不可控。 | dsh 通过内置的上游 Node.js 运行,所有包操作都使用内置 pnpm。Electron 的 Node.js、系统 Node.js、系统 pnpm 与用户的包管理器配置都不进入执行路径。 |
+| 包来源 | 必须能在发布到 npm 之前从同一次源码构建打包精确的 dsh,并支持离线安装;插件则需要保留为用户选择的普通 npm 包。 | 已签名应用携带本地打包的第一方 dsh 包与离线 seed 存储。桌面插件仍是从固定 Desktop 注册表解析的普通 npm 依赖。 |
+| Seed 传输 | Apple 公证会检查归档内的代码;把 pnpm 存储的每个文件分别放入应用,还会让应用签名记录数万个缓存条目,而单个压缩归档会放大小幅包变更。 | macOS 打包先签署每个 Mach-O CAS 对象、重写其 pnpm 哈希并再次证明离线安装,再把存储文件分配到 16 个确定性的未压缩 tar 分片。外层安装包负责压缩,差分更新可以复用未变化的分片。 |
+| 状态归属 | 共享可执行依赖图会让 CLI(命令行界面)与 Desktop 相互改变 dsh、Cordis、插件或原生模块版本,而两个桌面进程还可能争用同一个 profile。 | Electron 在访问任何 profile 前获取进程生命周期单实例锁,并独占 `$DSH_HOME/profiles/desktop` 及其包管理器状态。CLI 与 Desktop 共享 `$DSH_HOME` 下受支持的产品数据,但绝不共享可执行包、插件激活、锁文件或 `node_modules`。 |
| 通信 | 监听 Web 服务会引入端口归属、认证、CORS 与暴露风险;Electron 与上游 Node.js 之间也需要明确的跨进程协议。 | 应用不打开 Web 端口。`dsh-app://` 承载 Web 资源和 Fetch 流量;分帧字节管道以背压传输有界请求与响应分块,Node IPC 只承载子进程生命周期控制。 |
| 激活 | 依赖解析、生命周期脚本、原生模块与插件启动都可能失败,目录替换期间进程也可能中断。 | 发布与插件变更先安装到 staging,并启动完整后端执行健康检查;只有成功后才替换活跃 profile,中断替换由事务日志和一个 rollback profile 恢复。 |
| 更新 | 桌面壳与 dsh 独立更新会重新产生版本分裂,而桌面壳未变化的数据块不应强制完整传输。 | Electron 壳、匹配的 dsh seed、Node.js 与 pnpm 组成一个已签名更新单元。平台更新产物可以复用未变化的数据块,但运行时版本选择绝不脱离 Desktop 发布。 |
-[Electron 打包与更新 Agent Note](../../.agents/notes/implemented/architecture/2026-08-25-electron-desktop-packaging-and-updates.zh.md)记录了这些决策背后的理由、替代方案、安全约束和发布验证要求。
+[Electron 打包与更新 Agent Note](../../.agents/notes/implemented/architecture/2026-08-25-electron-desktop-packaging-and-updates.zh.md) 记录了这些决策背后的理由、替代方案、安全约束和发布验证要求。
## 安装归属
-Electron 拥有保留 profile `$DSH_HOME/profiles/desktop`。其 manifest 通过 `dsh.profile.bundles` 列出内置与已安装插件 bundle,`node_modules` 则同时包含精确版本的 `@deepseek-ai/dsh`、与之匹配的私有 `@deepseek-ai/dsh-desktop-host` 和所有桌面插件。把 Electron 专用进程入口与 overlay 放入私有应用包,可以避免 Desktop 实现成为公共 CLI 包的一部分。CLI 不能启动或修改该 profile。Electron 始终调用自身内置的 Node.js 与 pnpm,并把 store 固定在 `$DSH_HOME/desktop/pnpm/store`;它绝不使用系统 pnpm 或调用方的 npm/pnpm 配置。
+Electron 拥有保留 profile `$DSH_HOME/profiles/desktop`。其 manifest(元数据清单)通过 `dsh.profile.bundles` 列出内置与已安装插件 bundle,`node_modules` 则同时包含精确版本的 `@deepseek-ai/dsh`、与之匹配的私有 `@deepseek-ai/dsh-desktop-host` 和所有桌面插件。把 Electron 专用进程入口与 overlay 放入私有应用包,可以避免 Desktop 实现成为公共 CLI 包的一部分。CLI 不能启动或修改该 profile。Electron 始终调用自身内置的 Node.js 与 pnpm,并把存储固定在 `$DSH_HOME/desktop/pnpm/store`;它绝不使用系统 pnpm 或调用方的 npm/pnpm 配置。
dsh 主渲染进程只获得桌面协议标记。独立插件窗口获得结构化的列出、安装、移除、更新和更新检查操作;两个渲染进程都拿不到文件系统、原始 Electron IPC、shell 或任意 pnpm 参数。
-Electron 根据应用 locale 选择类型化的中英文字典,并以英文作为 fallback。菜单、原生对话框与插件管理渲染进程使用同一 locale 数据;仓库的 Client UI i18n gate 会检查这些桌面源文件。
+Electron 根据应用 locale 选择类型化的英文或中文桌面壳文案,并以英文作为 fallback。菜单、原生对话框与插件管理渲染进程使用同一 locale 数据;仓库的 Client UI i18n gate 会检查这些桌面源文件。
### Seed 安装
-安装包内的 seed 是安装工具包,不是可以直接运行的 `node_modules` 目录。打包过程会生成锁文件,在禁用生命周期脚本的情况下在线物化生产依赖图,删除 `node_modules` 以及所有临时 pnpm cache、config 和 state 目录,然后只使用最终 store 完成一次完整离线安装,并验证私有 Desktop Host 的入口与 overlay 均存在。macOS 构建随后从 pnpm 内容寻址 store staging 每个 Mach-O 对象,最多并发四个 Developer ID 签名进程,并且只在所有签名成功后才更新受影响的 SHA-512 索引记录。再一次离线安装会在分片前证明重写后的 store;准备过程随后解包最终归档,并验证每个内嵌签名。签名 seed 保留发布身份、本地第一方 tarball 及其描述文件、项目元数据、锁文件、完整性清单,以及在用户机器上重复该安装所需的 pnpm store 内容。
+安装包内的 seed 是安装工具包,不是可以直接运行的 `node_modules` 目录。打包过程会生成锁文件,在禁用生命周期脚本的情况下在线物化生产依赖图,删除 `node_modules` 以及所有临时 pnpm cache、配置和 state 目录,然后只使用最终存储完成一次完整离线安装,并验证私有 Desktop Host 的入口与 overlay 均存在。macOS 构建随后暂存 pnpm 内容寻址存储中的每个 Mach-O 对象,最多并发签署四个独立副本,并且只在所有签名成功后才更新受影响的 SHA-512 索引记录。再一次离线安装会在分片前证明重写后的存储;准备过程随后解包最终归档,并验证每个内嵌签名。签名 seed 保留发布身份、本地第一方 tarball 及其描述文件、项目元数据、锁文件、完整性清单,以及在用户机器上重复该安装所需的 pnpm 存储内容。
| Seed 内容 | 可写目标或用途 |
|---|---|
| `integrity.json` 与 `desktop-packages.json` | 在修改包状态前验证清单记录的每个 seed 文件、本地 tarball 哈希以及绑定的 dsh 与 Desktop Host 版本。 |
-| `store-archives.json` 与 `store-archives/*.tar` | 验证确定性的未压缩分片,把它们解包到唯一的 Desktop staging 目录,替换匹配的不可变 store 文件,并以事务方式把 pnpm 的版本化 SQLite 包索引合并进 `$DSH_HOME/desktop/pnpm/store`,且不移除已经为 Desktop 插件下载的包。 |
+| `store-archives.json` 与 `store-archives/*.tar` | 验证确定性的未压缩分片,把它们解包到唯一的 Desktop staging 目录,替换匹配的不可变存储文件,并以事务方式把 pnpm 的版本化 SQLite 包索引合并进 `$DSH_HOME/desktop/pnpm/store`,且不移除已经为 Desktop 插件下载的包。 |
| 项目元数据与 `desktop-packages/` | 复制到唯一的 `$DSH_HOME/desktop/staging//profile` 项目。 |
| 锁文件与本地包映射 | 驱动内置 pnpm 完成安装,且不会从 npm 解析已打包的核心包名。 |
@@ -42,12 +42,12 @@ Electron 根据应用 locale 选择类型化的中英文字典,并以英文作
1. 恢复中断的激活事务日志,验证完整 seed 清单与本地包集,并要求 seed 版本等于 Electron 应用版本。
2. 如果活跃 profile 已包含该发布及匹配的 dsh 与 Desktop Host 版本,则验证其中的本地包集并直接复用,不重新安装。
-3. 否则验证每个归档条目,把全部 store 分片解包到 Desktop 拥有的临时 staging 目录,将包文件与 SQLite 包索引记录合并进私有 store,再创建 staging profile,并通过内置 Node.js 与 pnpm 执行 `pnpm install --offline --frozen-lockfile --trust-lockfile`。Seed 记录替换匹配的索引键,插件专属记录继续保留。
+3. 否则验证每个归档条目,把全部存储分片解包到 Desktop 拥有的临时 staging 目录,将包文件与 SQLite 包索引记录合并进私有存储,再创建 staging profile,并通过内置 Node.js 与 pnpm 执行 `pnpm install --offline --frozen-lockfile --trust-lockfile`。Seed 记录替换匹配的索引键,插件专属记录继续保留。
4. Electron 升级时,从旧活跃 profile 读取每个插件的名称和精确版本,再通过现有 Desktop pnpm 状态以 `--offline` 把这些版本加入 staging。首次安装不执行插件恢复。
5. 停止活跃后端,启动并停止完整的 staging 后端执行健康检查,再在激活前重新启动活跃后端。这种串行方式避免两个桌面后端共享 `$DSH_HOME`;安装错误或插件不兼容会删除 staging,并保持活跃 profile 不变。
-6. 在每次目录移动前先持久化下一个激活阶段,把活跃 profile 移到 `$DSH_HOME/desktop/rollback/profile`,再把 staging 移到 `$DSH_HOME/profiles/desktop`。恢复过程同时检查日志与真实的 profile、rollback 和 staging 目录,因此在任一个写入与移动间隙中断后仍会恢复或保留一个完整 profile。
+6. 在每次目录移动前先持久化下一个激活阶段,把活跃 profile 移到 `$DSH_HOME/desktop/rollback/profile`,再把 staging 移到 `$DSH_HOME/profiles/desktop`。恢复过程同时检查日志与真实的 profile、rollback 和 staging 目录,因此在写入后、移动前的任一间隙中断后仍会恢复或保留一个完整 profile。
-GUI 插件修改会在把 registry 包安装到共享 Desktop pnpm store 后,使用相同的 staging、健康检查、激活与 rollback 路径。
+GUI 插件修改会在把注册表包安装到共享 Desktop pnpm 存储后,使用相同的 staging、健康检查、激活与 rollback 路径。
进程生命周期 Electron 锁是桌面端的主要 owner。事务锁用于纵深防御:准备本地状态时记录 Electron,在 pnpm worker 仍可能写入时记录该 worker,worker 退出后再把 owner 交还 Electron。后续进程不会把仍然存活的孤儿 worker 误判为陈旧事务。
@@ -67,11 +67,11 @@ pnpm run dev:desktop
pnpm run start:desktop
```
-Workspace 开发使用调用命令的 Node.js 运行当前 CLI 与私有 Desktop Host 包,并禁用桌面包修改;只有该模式明确链接的一次性 profile 可以从自身目录外解析 bundle。需要验证内置 Node.js、内置 pnpm、发布 seed、插件安装、staging 和 rollback 时,应运行未封装安装器的应用目录。
+Workspace 开发使用调用命令的 Node.js 运行当前 CLI 与私有 Desktop Host 包,并禁用桌面包修改;只有该模式明确链接的一次性 profile 可以从自身目录外解析 bundle。需要验证内置 Node.js、内置 pnpm、发布 seed、插件安装、staging 和 rollback 时,应运行未打包应用。
## 打包
-正常打包只需执行一条完整命令。该命令会先准备发布资源,再生成宿主平台的安装包与更新元数据。所有目标都要求通过 `DSH_DESKTOP_APP_ID` 提供反向域名形式的应用 ID。macOS 目标还要求通过 `DSH_DESKTOP_MACOS_SIGNING_IDENTITY` 提供 electron-builder 证书限定名,通过 `DSH_DESKTOP_MACOS_TEAM_ID` 提供对应的 10 字符 Apple Team ID,并提供一套完整的 notarytool 凭据。App Store Connect API Key 方式使用以下变量:
+正常打包只需执行一条完整命令。该命令会先准备发布资源,再生成宿主平台的安装包与更新元数据。所有目标都要求通过 `DSH_DESKTOP_APP_ID` 提供反向域名形式的应用 ID。macOS 目标还要求通过 `DSH_DESKTOP_MACOS_SIGNING_IDENTITY` 提供 electron-builder 证书限定名,通过 `DSH_DESKTOP_MACOS_TEAM_ID` 提供对应的 10 字符 Apple Team ID,并提供一套完整的 notarytool 凭据方案。App Store Connect API Key 方式使用以下变量:
```sh
export DSH_DESKTOP_APP_ID=''
@@ -96,7 +96,7 @@ pnpm run package:desktop:mac:x64
pnpm run package:desktop:win:x64
```
-macOS arm64 命令要求 Apple Silicon。macOS x64 命令可以在 Intel macOS 或带 Rosetta 的 Apple Silicon 上运行。Windows x64 命令要求 Windows x64。Desktop 尚不支持 Linux 发布目标。
+macOS arm64 命令要求 Apple Silicon。macOS x64 命令可以在 Intel macOS 或带 Rosetta 的 Apple Silicon 上运行。Windows x64 命令要求 Windows x64。Linux 不是受支持的 Desktop 发布目标。
每个目标都在 `apps/desktop/.desktop-build/targets//` 下持有自己的打包输入、已准备运行时、包集合、seed、pnpm 准备状态、未打包应用、更新元数据和最终产物。Node.js 归档缓存继续由 `.desktop-build/downloads` 共享,因为每个归档文件名都包含版本、平台和架构,并且在解包前经过验证。目标构建绝不读取其他目标的可变准备状态。
@@ -123,9 +123,9 @@ export DOWNLOAD_TEST_COS_SECRET_KEY=''
pnpm run upload:mac:arm64
```
-生产发布需在打包前设置 `DSH_DESKTOP_AUTO_UPDATE_ENV=production`,再在执行 `upload:mac:arm64`、`upload:mac:x64` 或 `upload:win:x64` 前提供 `DOWNLOAD_PROD_COS_BUCKET` 与生产凭据对。打包不要求 COS bucket 或凭据。它会明确禁止 electron-builder 发布,从其子进程中删除全部四个 COS 凭据字段,并且只有在 electron-builder 以及全部签名或公证 hook 成功后才写入目标完成记录。上传会先要求该记录与所选环境、目标、公开 URL 和当前 dsh 版本一致,再要求根 dsh 版本、Desktop 版本、频道元数据版本、产物名称、大小与 SHA-512 全部一致,之后才读取所选 COS 凭据对。它只上传该目标不可变且带版本的产物,最后以 `no-cache` 上传根据版本得出的频道元数据,并且不会删除历史对象。稳定版本使用 `latest-mac.yml` 或 `latest.yml`;`alpha` 等预发布版本则使用 `alpha-mac.yml` 或 `alpha.yml`,与 electron-builder 生成的文件名一致。
+生产发布需在打包前设置 `DSH_DESKTOP_AUTO_UPDATE_ENV=production`,再在执行 `upload:mac:arm64`、`upload:mac:x64` 或 `upload:win:x64` 前提供 `DOWNLOAD_PROD_COS_BUCKET` 与生产凭据对。打包不要求 COS bucket 或凭据。它会明确禁止 electron-builder 发布,从其子进程中删除全部四个 COS 凭据字段,并且只有在 electron-builder 以及全部签名或公证钩子成功后才写入目标完成记录。上传会先要求该记录与所选环境、目标、公开 URL 和当前 dsh 版本一致,再要求根 dsh 版本、Desktop 版本、频道元数据版本、产物名称、大小与 SHA-512 全部一致,之后才读取所选 COS 凭据对。它只上传该目标不可变且带版本的产物,最后以 `no-cache` 上传根据版本得出的频道元数据,并且不会删除历史对象。稳定版本使用 `latest-mac.yml` 或 `latest.yml`;`alpha` 等预发布版本则使用 `alpha-mac.yml` 或 `alpha.yml`,与 electron-builder 生成的文件名一致。
-macOS 配置使用必填发布环境,不会接受钥匙串中最先发现的证书。空值、格式错误的 Team ID、包含 electron-builder 不支持的 `Developer ID Application:` 前缀的签名身份,以及不完整的公证凭据都会被拒绝。macOS 打包要求已配置的身份及其私钥可用。Seed 准备会把该身份、安全时间戳与 hardened runtime 应用到每个内嵌 Mach-O 文件;应用签名完成后,深度严格检查会拒绝其他叶证书 Authority 或 Team ID,验证通过才生成发布产物。Electron-builder 会在封装前公证应用并钉票,然后签署 DMG。DMG 的 artifact-completion hook 随后会公证它并钉票,再要求其身份、票据与 Gatekeeper 验证全部通过;只有 hook 成功,electron-builder 才能发布该文件。私钥可以来自登录钥匙串或 electron-builder 的标准 `CSC_LINK` 输入;环境中的 `CSC_NAME` 与证书发现顺序都不能选择发布所有者。公证凭据也可以使用 electron-builder 支持的完整 Apple ID 或钥匙串 profile 方式。手动执行 `pnpm --dir apps/desktop run verify:mac-signature -- ` 重复应用检查时,也必须提供两个 macOS 身份变量。
+macOS 配置使用必填发布环境,不会接受钥匙串中最先发现的证书。空值、格式错误的 Team ID、包含 electron-builder 不支持的 `Developer ID Application:` 前缀的签名身份,以及不完整的公证凭据都会被拒绝。macOS 打包要求已配置的身份及其私钥可用。Seed 准备会把该身份、安全时间戳与 hardened runtime 应用到每个内嵌 Mach-O 文件;应用签名完成后,深度严格检查会拒绝其他叶证书 Authority 或 Team ID,验证通过才生成发布产物。Electron-builder 会在封装前公证应用并钉票,然后签署 DMG。DMG 的 artifact-completion 钩子随后会公证它并钉票,再要求其身份、票据与 Gatekeeper 验证全部通过;只有钩子成功,electron-builder 才能发布该文件。私钥可以来自登录钥匙串或 electron-builder 的标准 `CSC_LINK` 输入;环境中的 `CSC_NAME` 与证书发现顺序都不能选择发布所有者。公证凭据也可以使用 electron-builder 支持的完整 Apple ID 或钥匙串 profile 方式。手动执行 `pnpm --dir apps/desktop run verify:mac-signature -- ` 重复应用检查时,也必须提供两个 macOS 身份变量。
### Windows EV 签名
@@ -139,7 +139,7 @@ $env:DSH_DESKTOP_WINDOWS_TOKEN_PIN = ''
pnpm run package:desktop:win:x64
```
-打包前插入并解锁 Token。electron-builder hook 把每个产物交给采用 CRLF 的 `scripts/windows-sign.cmd`;该 CMD 只调用一次已配置的 SignTool,并指定 `/f`、SafeNet `/kc "[{{PIN}}]=容器"`、`/csp "eToken Base Cryptographic Provider"`、SHA-256 文件摘要和 DigiCert SHA-256 RFC 3161 时间戳。hook 不会改用 electron-builder 内置的 SignTool,也不会重试失败的签名请求。SignTool、证书、容器、PIN、Token 或签名不可用时,Windows 打包会失败,不会生成未签名产物。
+打包前插入并解锁 Token。electron-builder 钩子把每个产物交给采用 CRLF 的 `scripts/windows-sign.cmd`;该 CMD 只调用一次已配置的 SignTool,并指定 `/f`、SafeNet `/kc "[{{PIN}}]=容器"`、`/csp "eToken Base Cryptographic Provider"`、SHA-256 文件摘要和 DigiCert SHA-256 RFC 3161 时间戳。钩子不会改用 electron-builder 内置的 SignTool,也不会重试失败的签名请求。SignTool、证书、容器、PIN、Token 或签名不可用时,Windows 打包会失败,不会生成未签名产物。
PIN 不能包含 `]`、引号或换行,因为这些字符用于分隔 SafeNet `/kc` 值或对应的 CMD 参数。CMD 会禁用延迟展开,因此包含 `!` 的 PIN 可以原样到达 SafeNet。打包流程不会把任何 `DSH_DESKTOP_WINDOWS_*` 字段传给构建与 seed 准备子进程;它只向 electron-builder 提供四个配置输入,在其他字段已经清理的环境中只向签名 CMD 提供经过校验的签名字段,在 SignTool 启动前清除这些字段,并遮盖 SignTool 诊断。SafeNet 仍要求 PIN 出现在 SignTool 进程命令行中。只能在连接了物理 Token 的受控 self-hosted Windows runner 上把它注入为临时 secret;绝不能提交该值、把它写进 `.env`,或持久保存为 Windows 用户或系统环境变量。
@@ -158,9 +158,9 @@ pnpm run prepare:desktop
这条诊断命令是另一种停止位置,并非两条命令构建流程的前半段。之后执行 `package:desktop*` 时仍会重新完成正式构建与准备,避免使用陈旧的 dsh 包、运行时文件或 seed 内容。
-每条打包命令都会先执行仓库的正式构建,打包 dsh 与 vendored 包族,在本地打包私有 Desktop Host 包,并打包 Landlock 入口,然后再准备发布资源。`prepare:packages` 选择分别以 `@deepseek-ai/dsh` 和 `@deepseek-ai/dsh-desktop-host` 为根的第一方生产依赖闭包之并集,验证私有 Host tarball 同时包含 `lib/index.js` 与 `config/desktop.cordis.patch.yml`,把选中的 tarball 复制到 seed 输入,并记录其大小与 SHA-512 完整性。Host 包不会发布到 npm;它的 `files` manifest 只包含该运行入口与 overlay。公共包 tarball 仍是由各包发布 manifest 控制的正式 `pnpm pack` 输出,因此 Desktop 不增加第二套过滤规则,会保留 `lib/types` 等已发布声明,也不会独立删除或增加 source map。Registry 包同样在 pnpm 内容寻址 store 中保留其发布的包字节。dsh 发布版本更新会同步更新两个私有 Desktop manifest、仓库根与可发布 workspace;打包还会要求根 dsh 包、Desktop Host 包与 Electron 包使用同一版本。构建 Desktop 应用前不要求 dsh 或私有 Host 已发布到 npm。`prepare:runtime` 从 Node.js 官方发行服务下载 Node.js 24.17.0,在解压前验证其 SHA-256 条目,并在兼容的构建宿主上执行准备完成的目标二进制文件以验证其报告版本。它复制桌面包声明的 pnpm 版本,并把两个运行时版本记录进发布 seed。`prepare:seed` 运行该目标 Node.js 与内置 pnpm,因此按平台和 CPU 过滤的可选依赖会使 pnpm store 与 seed 成为目标专用内容。它生成本地核心包映射、禁用全局 virtual store、从 npm 物化外部生产依赖并禁用生命周期脚本、删除 `node_modules` 以及所有临时 pnpm cache、config 和 state,证明完整依赖图可以离线安装并包含私有 Host 的入口与 overlay,在适用时执行 macOS 重写,再通过一次离线安装证明重写后的 store,删除临时 pnpm 项目注册,然后把松散 store 替换为 16 个确定性的未压缩 tar 分片。它会解包这些最终分片,并在生成清单前验证每个内嵌 macOS 签名。后续 GUI 插件操作保留本地核心包映射,同时从固定的 Desktop npm registry 解析插件包及其外部依赖。`electron-builder` 把各目标的平台产物写到 `apps/desktop/.desktop-build/targets//artifacts`;后续版本会保留不同名称的不可变安装包与 blockmap,但会替换该目标的未打包应用、诊断文件、完成记录与频道元数据。
+每条打包命令都会先执行仓库的正式构建,打包 dsh 与 vendored 包族,在本地打包私有 Desktop Host 包,并打包 Landlock 入口,然后再准备发布资源。`prepare:packages` 选择分别以 `@deepseek-ai/dsh` 和 `@deepseek-ai/dsh-desktop-host` 为根的第一方生产依赖闭包之并集,验证私有 Host tarball 同时包含 `lib/index.js` 与 `config/desktop.cordis.patch.yml`,把选中的 tarball 复制到 seed 输入,并记录其大小与 SHA-512 完整性。Host 包不会发布到 npm;它的 `files` manifest 只包含该运行入口与 overlay。公共包 tarball 仍是由各包发布 manifest 控制的正式 `pnpm pack` 输出,因此 Desktop 不增加第二套过滤规则,会保留 `lib/types` 等已发布声明,也不会独立删除或增加 source map。注册表包同样在 pnpm 内容寻址存储中保留其发布的包字节。dsh 发布版本更新会同步更新两个私有 Desktop manifest、仓库根与可发布 workspace;打包还会要求根 dsh 包、Desktop Host 包与 Electron 包使用同一版本。构建 Desktop 应用前不要求 dsh 或私有 Host 已发布到 npm。`prepare:runtime` 从 Node.js 官方发行服务下载 Node.js 24.17.0,在解压前验证其 SHA-256 条目,并在兼容的构建宿主上执行准备完成的目标二进制文件以验证其报告版本。它复制桌面包声明的 pnpm 版本,并把两个运行时版本记录进发布 seed。`prepare:seed` 运行该目标 Node.js 与内置 pnpm,因此按平台和 CPU 过滤的可选依赖会使 pnpm 存储与 seed 成为目标专用内容。它生成本地核心包映射、禁用全局 virtual 存储、从 npm 物化外部生产依赖并禁用生命周期脚本、删除 `node_modules` 以及所有临时 pnpm cache、配置和 state,证明完整依赖图可以离线安装并包含私有 Host 的入口与 overlay,在适用时执行 macOS 重写,再通过一次离线安装证明重写后的存储,删除临时 pnpm 项目注册,然后把松散存储替换为 16 个确定性的未压缩 tar 分片。它会解包这些最终分片,并在生成清单前验证每个内嵌 macOS 签名。后续 GUI 插件操作保留本地核心包映射,同时从固定的 Desktop npm 注册表 解析插件包及其外部依赖。`electron-builder` 把各目标的平台产物写到 `apps/desktop/.desktop-build/targets//artifacts`;后续版本会保留不同名称的不可变安装包与 blockmap,但会替换该目标的未打包应用、诊断文件、完成记录与频道元数据。
-未压缩产物包含四块相互独立的体积:Electron、离线 seed store 分片与本地 dsh tarball、上游 Node.js 与 pnpm 运行时,以及很小的桌面壳应用。分片不压缩,使外层 DMG、ZIP 或 NSIS 压缩器与差分更新器可以处理稳定的数据区间。文件系统占用不等于安装包下载大小,因此必须分别测量。打包应用首次启动时还会先把 seed store 解包到 `$DSH_HOME/desktop/pnpm/store`,再安装可写 profile,因此发布验证必须同时测量应用与 Harness home 的磁盘占用。
+未打包产物包含四块相互独立的体积:Electron、离线 seed 存储分片与本地 dsh tarball、上游 Node.js 与 pnpm 运行时,以及很小的桌面壳应用。分片不压缩,使外层 DMG、ZIP 或 NSIS 压缩器与差分更新器可以处理稳定的数据区间。文件系统占用不等于安装包下载大小,因此必须分别测量。打包应用首次启动时还会先把 seed 存储解包到 `$DSH_HOME/desktop/pnpm/store`,再安装可写 profile,因此发布验证必须同时测量应用与 Harness home 的磁盘占用。
## 更新
@@ -174,7 +174,7 @@ Electron-builder 始终为 `DSH_DESKTOP_AUTO_UPDATE_ENV` 选择的部署生成 g
## 已知限制
-- Desktop 禁用 Web 的“在本地应用中打开”操作,因为其 Host 插件依赖 HTTP 路由,而 Desktop 不提供 `webServer`。
+- Desktop 禁用 Web 的「在本地应用中打开…」操作,因为其 Host 插件依赖 HTTP 路由,而 Desktop 不提供 `webServer`。
- 发布签名、公证、更新托管和跨上一版本的已安装产物验证需要生产发布环境。
- 依赖包含 lifecycle script 的桌面插件,只有其包名进入桌面项目经过评审的 `allowBuilds` 策略后才能安装。
- 桌面壳与 CLI dsh 共享 `$DSH_HOME` 下的会话、设置、凭据、工作区和存储,但可执行包、插件激活、锁文件与包管理器状态彼此隔离。
diff --git a/apps/web/tests/README.i18n.yaml b/apps/web/tests/README.i18n.yaml
index ef09bb3c70..ae7b0d6022 100644
--- a/apps/web/tests/README.i18n.yaml
+++ b/apps/web/tests/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write apps/web/tests/README.md
-README.md: e5b97f0b7527da01ce7c926360145fee49e168f0
-README.zh.md: f360c2b487bbf5b1a1c81492e5b4c2d4eaa8d749
+README.md: 2361ed9840859bb7e8c5472afb6bf79a77ae1daf
+README.zh.md: ec20030fda5d491b097e8fbcca4d5d651fb6af86
diff --git a/apps/web/tests/README.md b/apps/web/tests/README.md
index e5b97f0b75..2361ed9840 100644
--- a/apps/web/tests/README.md
+++ b/apps/web/tests/README.md
@@ -2,42 +2,18 @@
English | [中文](README.zh.md)
-These tests boot the real web composition in-process and drive it with a real
-Chromium over real HTTP. The lane's mechanics — modes, fixtures, goldens, and
-the deliberate composition divergences from `dsh web` — are documented in
-[`scaffold.ts`](scaffold.ts) and the
-[browser e2e Agent Note](../../../.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.md).
+These tests boot the real web composition in-process and drive it with a real Chromium over real HTTP. The lane's mechanics — modes, fixtures, goldens, and the deliberate composition divergences from `dsh web` — are documented in [`scaffold.ts`](scaffold.ts) and the [browser e2e Agent Note](../../../.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.md).
## These are Host-face tests
-They type-check in the root `tsconfig.host.json`, not in the Client aggregate,
-because they read Host services directly: `ctx.connection`, the Host
-`SessionStore`, and `ctx.sessionProjectionCache`. Driving a browser at runtime does
-not make a file part of the Client program — the two faces merge cordis
-`Context` under the same keys with different services, so one program cannot see
-both. Moving these files into the Client aggregate makes every Host-service
-access fail to compile.
+They type-check in the root `tsconfig.host.json`, not in the Client aggregate, because they read Host services directly: `ctx.connection`, the Host `SessionStore`, and `ctx.sessionProjectionCache`. Driving a browser at runtime does not make a file part of the Client program — the two faces merge Cordis `Context` under the same keys with different services, so one program cannot see both. Moving these files into the Client aggregate makes every Host-service access fail to compile.
## Do not import `@deepseek-ai/dsh-client-*` here
-Importing a Client package — a value or a type — pulls its whole TypeScript
-project, and every project it references, into the **Host build graph**. That has
-bitten this lane once already: four Client consumer packages reference
-`api/remotes`' Client face, which cannot compile until Host tsdown has generated
-`@deepseek-ai/dsh-goal/remote`, so the Host build phase ended up waiting on an
-artifact it produces itself.
+Importing a Client package — a value or a type — pulls its whole TypeScript project, and every project it references, into the **Host build graph**. That has bitten this lane once already: four Client consumer packages reference `api/remotes`' Client face, which cannot compile until Host tsdown has generated `@deepseek-ai/dsh-goal/remote`, so the Host build phase ended up waiting on an artifact it produces itself.
-When a scenario needs a Client-owned constant or pure function, mirror it here
-instead, next to the commented-out import that names the source module. A drift
-then surfaces as a missed selector or a stale mirrored value — a loud failure,
-never a silent pass. `scaffold.ts` follows this rule for the welcome-notice
-namespace, acknowledgement field, version, and asserted Chinese copy.
+When a scenario needs a Client-owned constant or pure function, mirror it here instead, next to the commented-out import that names the source module. A drift then surfaces as a missed selector or a stale mirrored value — a loud failure, never a silent pass. `scaffold.ts` follows this rule for the welcome-notice namespace, acknowledgement field, version, and asserted Chinese copy.
-One kind of Client import stands. `assembled-boot.ts` drives the shell itself, so
-it imports `AppWebEntry` from `@deepseek-ai/dsh-client-web` and the boot-manifest
-type from `@deepseek-ai/dsh-client-modules/client`: booting the real shell is what
-that harness is for, and both packages are already in the Host graph. The chat
-scenarios mirror `conversationContextKey` in `support.ts` instead of importing
-its Client owner.
+One kind of Client import stands. `assembled-boot.ts` drives the shell itself, so it imports `AppWebEntry` from `@deepseek-ai/dsh-client-web` and the boot-manifest type from `@deepseek-ai/dsh-client-modules/client`: booting the real shell is what that harness is for, and both packages are already in the Host graph. The chat scenarios mirror `conversationContextKey` in `support.ts` instead of importing its Client owner.
Nothing mechanically enforces this rule; keep it in review.
diff --git a/apps/web/tests/README.zh.md b/apps/web/tests/README.zh.md
index f360c2b487..ec20030fda 100644
--- a/apps/web/tests/README.zh.md
+++ b/apps/web/tests/README.zh.md
@@ -2,34 +2,18 @@
[English](README.md) | 中文
-这些测试在进程内启动真实的 web 组合,并用真实 Chromium 通过真实 HTTP 驱动它。该 lane
-的运行机制——模式、fixture、golden,以及与 `dsh web` 之间刻意保留的组合差异——记录在
-[`scaffold.ts`](scaffold.ts) 和
-[浏览器 e2e Agent Note](../../../.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.zh.md)中。
+这些测试在进程内启动真实的 web 组合,并用真实 Chromium 通过真实 HTTP 驱动它。该 lane 的运行机制——模式、fixture(测试前置数据)、golden,以及与 `dsh web` 之间刻意保留的组合差异——记录在 [`scaffold.ts`](scaffold.ts) 和 [浏览器 e2e Agent Note](../../../.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.zh.md) 中。
## 这些是 Host 面的测试
-它们在根 `tsconfig.host.json` 中做类型检查,而不在 Client aggregate 中,因为它们直接读取
-Host 服务:`ctx.connection`、Host 侧 `SessionStore` 与 `ctx.sessionProjectionCache`。运行时驱动
-浏览器并不使一个文件成为 Client 程序的一部分——两个 face 在相同的键上以不同服务合并 cordis
-`Context`,因此单个程序无法同时看见两者。把这些文件挪进 Client aggregate 会让每一处
-Host 服务访问都无法编译。
+它们在根 `tsconfig.host.json` 中做类型检查,而不在 Client aggregate 中,因为它们直接读取 Host 服务:`ctx.connection`、Host 侧 `SessionStore` 与 `ctx.sessionProjectionCache`。运行时驱动浏览器并不使一个文件成为 Client 程序的一部分——两个 face 在相同的键上以不同服务合并 Cordis `Context`,因此单个程序无法同时看见两者。把这些文件挪进 Client aggregate 会让每一处 Host 服务访问都无法编译。
## 不要在此 import `@deepseek-ai/dsh-client-*`
-import 一个 Client 包——无论值还是类型——都会把它整个 TypeScript 工程、以及它引用的每个工程
-拉进 **Host 构建图**。这已经坑过本 lane 一次:四个 Client 消费方包引用了 `api/remotes` 的
-Client face,而该 face 必须等 Host tsdown 生成 `@deepseek-ai/dsh-goal/remote` 之后才能编译,
-于是 Host 构建阶段变成在等一个由它自己产出的产物。
+import 一个 Client 包——无论值还是类型——都会把它整个 TypeScript 工程、以及它引用的每个工程拉进 **Host 构建图**。这已经坑过本 lane 一次:四个 Client 消费方包引用了 `api/remotes` 的 Client face,而该 face 必须等 Host tsdown 生成 `@deepseek-ai/dsh-goal/remote` 之后才能编译,于是 Host 构建阶段变成在等一个由它自己产出的产物。
-当某个场景需要 Client 持有的常量或纯函数时,改为在此处镜像一份,并紧挨着一条注释掉的
-import 点明源模块。这样漂移会表现为选择器未命中或镜像值过期——是响亮的失败,绝不会是静默
-通过。`scaffold.ts` 按此规则镜像欢迎声明的 namespace、确认字段、版本和被断言的中文文案。
+当某个场景需要 Client 持有的常量或纯函数时,改为在此处镜像一份,并紧挨着一条注释掉的 import 点明源模块。这样漂移会表现为选择器未命中或镜像值陈旧——是响亮的失败,绝不会是静默通过。`scaffold.ts` 按此规则镜像 welcome-notice 的 namespace、确认字段、版本和被断言的中文文案。
-有一类 Client import 是长期成立的。`assembled-boot.ts` 驱动 shell 本身,因此它从
-`@deepseek-ai/dsh-client-web` import `AppWebEntry`、从
-`@deepseek-ai/dsh-client-modules/client` import boot manifest 类型:启动真实 shell 正是该
-harness 的用途,且这两个包本来就在 Host 图中。chat 场景则在 `support.ts` 中镜像
-`conversationContextKey`,而不 import 其 Client owner。
+有一类 Client import 是长期成立的。`assembled-boot.ts` 驱动 shell 本身,因此它从 `@deepseek-ai/dsh-client-web` import `AppWebEntry`、从 `@deepseek-ai/dsh-client-modules/client` import boot manifest(元数据清单)类型:启动真实 shell 正是该 harness 的用途,且这两个包本来就在 Host 图中。chat 场景则在 `support.ts` 中镜像 `conversationContextKey`,而不 import 其 Client owner。
没有任何机制强制这条规则;靠 review 守住它。
diff --git a/benchmarks/active-stream-reconnect/README.i18n.yaml b/benchmarks/active-stream-reconnect/README.i18n.yaml
index 107b140b68..2480afa39a 100644
--- a/benchmarks/active-stream-reconnect/README.i18n.yaml
+++ b/benchmarks/active-stream-reconnect/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write benchmarks/active-stream-reconnect/README.md
README.md: e75a41eba3952bb4db343c2018e217e6f5e88f96
-README.zh.md: acf0260f53855f9f4e643b2e72c67aa7a8afd6bb
+README.zh.md: 3d831208144e3810d353fb64fc5ae4adae766bdd
diff --git a/benchmarks/active-stream-reconnect/README.zh.md b/benchmarks/active-stream-reconnect/README.zh.md
index acf0260f53..3d83120814 100644
--- a/benchmarks/active-stream-reconnect/README.zh.md
+++ b/benchmarks/active-stream-reconnect/README.zh.md
@@ -2,6 +2,6 @@
[English](README.md) | 中文
-[reconnect.bench.client.ts](reconnect.bench.client.ts) 测量重连携带未完成的 100,000 个 reasoning delta 前缀时,生产 Client 的折叠成本。编译后的私有适配器调用 `ClientAssistantStream.replace()`,不增加产品导出。三个全新纯 Node worker 在计时前合成紧凑 baseline;替换时间与强制 GC 后的保留 heap 分别执行中位数预算检查。下一个稠密序号的实时 frame 仍须被接受。标准托管 CI 使用 50 ms 替换预期及共享的 1.25× 余量(向上取整为 63 ms);保留 heap 预算仍为 30 MiB。记录样本和合成回归对照使用与 worker 判定相同的时间断言。
+[reconnect.bench.client.ts](reconnect.bench.client.ts) 测量重连携带一个包含 100,000 个 delta、尚未完成的 reasoning 前缀时,生产 Client 的折叠成本。编译后的私有适配器调用 `ClientAssistantStream.replace()`,不增加产品导出。三个全新的纯 Node worker 在计时前合成紧凑基线;替换时间与强制 GC 后的保留堆分别执行中位数预算检查。下一个稠密序号的实时 frame 仍须被接受。标准托管 CI 使用 50 ms 替换预期及共享的 1.25× 余量(上限为 63 ms);保留 heap 预算仍为 30 MiB。实测样本和合成回归对照使用与 worker 判定相同的时间断言。
-通过 `pnpm run build:bench` 构建,再在 `vitest.bench.config.ts` 中选择 `benchmarks/active-stream-reconnect`。该聚焦 Node workload 既不构建也不测量浏览器渲染。[前端性能预算](../../.agents/notes/implemented/testing/2026-09-06-frontend-performance-budgets.zh.md)记录校准与排除项。
+通过 `pnpm run build:bench` 构建,再在 `vitest.bench.config.ts` 中选择 `benchmarks/active-stream-reconnect`。这项针对 Node 的工作负载既不构建也不测量浏览器渲染。[前端性能预算](../../.agents/notes/implemented/testing/2026-09-06-frontend-performance-budgets.zh.md)记录校准与排除项。
diff --git a/benchmarks/agent-continuation/README.i18n.yaml b/benchmarks/agent-continuation/README.i18n.yaml
index 096dc4d9fc..b14490baa1 100644
--- a/benchmarks/agent-continuation/README.i18n.yaml
+++ b/benchmarks/agent-continuation/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write benchmarks/agent-continuation/README.md
README.md: 3d38f008c4ee95c794e4e7fbd3d874d1d668b1ce
-README.zh.md: 189dcae8eea8716dbcb24b1fe2b08f1113caf36d
+README.zh.md: 04c6e9bc8c66202b7800f4931b2226f420c428fb
diff --git a/benchmarks/agent-continuation/README.zh.md b/benchmarks/agent-continuation/README.zh.md
index 189dcae8ee..04c6e9bc8c 100644
--- a/benchmarks/agent-continuation/README.zh.md
+++ b/benchmarks/agent-continuation/README.zh.md
@@ -2,15 +2,15 @@
[English](README.md) | 中文
-## Summary
+## 概述
-在不使用网络服务或录制用户数据的情况下,测量长历史请求处理、冷工具密集续聊和重复发现非活动 fork 子会话。SDK 变体通过已发布 sdk-minimal profile 和显式 editor patch 执行 100 个轮次和 800 次真实文件读取;其他用例隔离后端服务成本。所有用例均不渲染浏览器。
+在不使用网络服务或所记录的用户数据的情况下,测量长历史请求处理、冷启动的工具密集型续聊和重复发现非活动 fork 子会话。SDK 变体通过已发布 sdk-minimal profile 和显式 editor patch 执行 100 个轮次和 800 次真实文件读取;其他用例隔离后端服务成本。所有用例均不渲染浏览器。
-## Table of Contents
+## 目录
- [运行](#run)
- [测量](#measurements)
-- [Dev Note](#dev-note)
+- [开发备注](#dev-note)
@@ -24,8 +24,8 @@
## 测量
-[workload.ts](workload.ts)拥有合成维度。其当前代历史在首个 step 的用户输入之前保留空 system 头节点,因此续聊提示会替换该头节点而不移动历史消息。[Agent Note](../../.agents/notes/implemented/testing/2026-09-06-backend-continuation-performance.zh.md)拥有计时终点、校准证据、内存解释和排除项。模型适配器不执行服务商序列化或网络调用;集成用例通过真实工具执行管线运行合成工具体,SDK profile 变体则执行真实文件读取。
+[workload.ts](workload.ts) 负责定义合成维度。其当前代历史在首个步骤的用户输入之前保留空 system 头节点,因此续聊提示词会替换该头节点而不移动历史消息。[Agent Note](../../.agents/notes/implemented/testing/2026-09-06-backend-continuation-performance.zh.md) 负责说明计时终点、校准证据、内存解释和排除项。模型适配器不执行提供方序列化或网络调用;集成用例通过真实工具执行流水线运行合成工具体,SDK profile 变体则执行真实文件读取。
-## Dev Note
+## 开发备注
无。
diff --git a/benchmarks/long-session-browser/README.i18n.yaml b/benchmarks/long-session-browser/README.i18n.yaml
index 2a5f750328..004876c403 100644
--- a/benchmarks/long-session-browser/README.i18n.yaml
+++ b/benchmarks/long-session-browser/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write benchmarks/long-session-browser/README.md
README.md: 009a7a61d9a1a0d4b198ae017def5d3126b713a2
-README.zh.md: 2dd0c52b0f1cc04aac8a78d847401067201afa13
+README.zh.md: df1da8fd76c2f4fa926b6348fa631530fb98181a
diff --git a/benchmarks/long-session-browser/README.zh.md b/benchmarks/long-session-browser/README.zh.md
index 2dd0c52b0f..df1da8fd76 100644
--- a/benchmarks/long-session-browser/README.zh.md
+++ b/benchmarks/long-session-browser/README.zh.md
@@ -1,8 +1,8 @@
-# 长 Session 浏览器基准
+# 长会话浏览器基准
[English](README.md) | 中文
-[long-session.bench.ts](long-session.bench.ts) 中必需的 Chromium 工作流测量打开合成的 240 轮 Session、加载所有更早的分页、访问 Trajectory,以及在有节奏的流式回复期间输入下一条草稿。随产品维护的 Web scaffold 拥有隔离的主目录、持久化、重放适配器和回环监听器;Chromium 加载构建后的 Web 产物,而非替代开发服务器。
+[long-session.bench.ts](long-session.bench.ts) 中必需的 Chromium 工作流测量打开包含 240 个轮次的合成会话、加载所有较早页面、访问 Trajectory,以及在有节奏的流式回复期间输入下一条草稿。随产品维护的 Web scaffold 拥有隔离的主目录、持久化、回放适配器和回环监听器;Chromium 加载构建后的 Web 产物,而非替代开发服务器。
## 运行
@@ -10,8 +10,8 @@
## 测量
-三个全新浏览器进程与 scaffold 环境产生原始样本及中位数判定。打开和分页在预期对话状态出现且经过两次动画帧后结束;这包含一次渲染机会,而非硬件显示时间戳。分页报告每一页,并对各样本最慢分页时间的中位数执行预算检查。流式报告首段可见回复、真实草稿键入、完整回复壁钟时间和 Chromium 主线程任务时间。Enter 从已聚焦的输入框提交;草稿键入保留该焦点,不执行鼠标点击。回复标记查找与输入事件文本证据仅读取最新 Assistant step,避免重复扫描全部历史文本与无障碍属性。输入观察器在提交前安装,首个标记可见后立即开始草稿键入,不额外等待输入前动画帧。诊断报告首段可见等待后的标记状态与焦点,以及首个输入事件的浏览器时钟时间戳与焦点。诊断不会暂停重放;首段观察或输入延迟仍可能导致重叠失败。实际首个输入事件必须观察到未完成的回复;完成测量在 Host 结算后等待新 turn-tail 渲染。测量后,在 DONE 之后发送的真实按键必须无法通过同一个重叠断言。打开、最慢更早分页和首次 Trajectory 使用标准托管预期 900/700/500 ms。共享的 1.25× 余量分别产生 1125/875/625 ms 上限;流式终点的额外开销预算不变。强制 GC 后的 heap 与 DOM 数量仅供诊断,不作为泄漏预算。
+三个全新浏览器进程与 scaffold 环境产生原始样本及中位数判定。打开和分页在预期 transcript(文本记录)状态出现且经过两次动画帧后结束;这包含一次渲染机会,而非硬件显示时间戳。分页报告每一页,并对各样本最慢分页时间的中位数执行预算检查。流式报告首次可见回复、受信任的草稿键入、完整回复壁钟时间和 Chromium 主线程任务时间。Enter 从已聚焦的输入框提交;草稿键入保留该焦点,不执行鼠标点击。回复标记查找与输入事件文本观察器仅读取最新 Assistant 步骤,避免重复进行全量历史文本扫描和无障碍扫描。输入事件文本观察器在提交前安装,首个标记可见后立即开始草稿键入,不额外等待输入前动画帧。诊断报告等待首次可见回复后的标记状态与焦点,以及首个输入事件的浏览器时钟时间戳与焦点。诊断不会暂停回放;首次观察或输入延迟仍可能导致重叠失败。实际首个输入事件必须观察到未完成的回复;完整回复的测量会在 Host 结算后等待新 turn-tail 渲染完成。测量后,在 DONE 之后发送的受信任按键必须无法通过同一个重叠断言。打开、最慢的较早页面和首次 Trajectory 使用标准托管预期 900/700/500 ms。共享的 1.25× 余量分别产生 1125/875/625 ms 上限;流式终点的额外开销预算不变。强制 GC 后的 heap 与 DOM 数量仅供诊断,不作为泄漏预算。
-fixture(测试前置数据)在首条用户消息前保留空 system 头节点,每条用户消息都位于其 step 内。它包含混合语言提示、正文、推理、20 个代码块和 40 个合成工具结果。每条历史 Assistant 都含紧凑 stream,由生产 accumulator 从匹配的推理、文本、工具参数、usage 和 finish chunk 构建。其内容不来自模型、工具、外部网络、录制 Session 或私有 Harness 主目录。流式回复以 16 ms 重放间隔发送 120 个文本 delta,经过真实输入框、agent loop(智能体循环)、传输与持久化。
+fixture(测试前置数据)在首条用户消息前保留空 system 头节点,每条用户消息都位于其步骤内。它包含混合语言提示词、正文、推理(reasoning)、20 个围栏代码块和 40 个合成工具结果。每条历史 Assistant 都含紧凑流,由生产 accumulator 从匹配的推理、文本、工具参数、usage 和 finish 分片构建。其内容不来自模型、工具、外部网络、录制会话或私有 Harness 主目录。流式回复以 16 ms 回放间隔发送 120 个文本 delta,经过真实输入框、agent loop(智能体循环)、传输与持久化。
[决策记录](../../.agents/notes/implemented/testing/2026-09-06-frontend-performance-budgets.zh.md)拥有校准、排除项与替代方案。更大规模的[手动诊断](../../apps/web/tests/complex-history.perf.ts)保持独立。
diff --git a/docs/i18n/README.i18n.yaml b/docs/i18n/README.i18n.yaml
index 2ffdac7b4e..ed910c8e0d 100644
--- a/docs/i18n/README.i18n.yaml
+++ b/docs/i18n/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/i18n/README.md
README.md: 55ae07c18e09fde141ecf5344f715dfa25658325
-README.zh.md: 674edeb9da4bf0083c607216a3c992a98f61897a
+README.zh.md: 172fe063df3e5875d64fb02c09381ca9e76136f7
diff --git a/docs/i18n/README.zh.md b/docs/i18n/README.zh.md
index 674edeb9da..172fe063df 100644
--- a/docs/i18n/README.zh.md
+++ b/docs/i18n/README.zh.md
@@ -33,7 +33,7 @@
面向源码的代码门禁会把精确的 `.zh.md` 围栏序列视为其无后缀兄弟文件的派生内容,而不会再次编译相同代码或在 manifest(元数据清单)中重复登记。该序列必须在长度、顺序、围栏类型和按字节精确的正文上一致;否则两份副本仍会独立受检,配对门禁也会报告结构不匹配。
-`pnpm run verify-translation-pairing --list` 打印范围内每篇文档的当前配对状态(missing、out-of-sync 或 ok)。它从不失败;其中 missing 与 out-of-sync 行指出普通检查会拒绝的违规。
+`pnpm run verify-translation-pairing --list` 打印范围内每篇文档的当前配对状态(missing、out-of-sync 或 ok)。它从不失败;其中 `missing` 与 `out-of-sync` 行指出普通检查会拒绝的违规。
`pnpm run verify-translation-pairing ` 只检查被点名的配对——配对的三个文件中的任意一个(或其裸词干)都能点名它——因此更新循环几秒内就能验证自己的配对,而不必重新扫描全语料。`doc-sync` 与 CI 运行的是无参数的全语料形式;限定范围的绿灯在 PR 层面永远不能替代它。
diff --git a/docs/subsystems/README.i18n.yaml b/docs/subsystems/README.i18n.yaml
index a39cbcf162..f10d160edd 100644
--- a/docs/subsystems/README.i18n.yaml
+++ b/docs/subsystems/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write docs/subsystems/README.md
README.md: 9afbdda338ed797279b719eaf577be45a84349e2
-README.zh.md: ee3c89830a76bc1cddb83e0a50507f3e4439800d
+README.zh.md: 78f799d99221d8458ad1639dffbdda69b6783ef6
diff --git a/docs/subsystems/README.zh.md b/docs/subsystems/README.zh.md
index ee3c89830a..78f799d992 100644
--- a/docs/subsystems/README.zh.md
+++ b/docs/subsystems/README.zh.md
@@ -6,21 +6,21 @@
| 页面 | 负责内容 |
|---|---|
-| [core.md](core.zh.md) | `packages/core` 如何控制 agent loop(智能体循环):逐包的循环说明、agent 创建与所有权(`AgentHandle`)、`Agent` 句柄的投递/取消/拦截约定,以及全仓通用类型模式(`…Map → 派生联合`、品牌化 id) |
+| [core.md](core.zh.md) | `packages/core` 如何控制 agent loop(智能体循环):逐包的循环说明、agent 创建与所有权(`AgentHandle`)、`Agent` 句柄的投递/取消/拦截约定,以及全仓通用类型模式(`…Map → derived-union`、品牌化 id) |
| [llm-streaming.md](llm-streaming.zh.md) | `packages/llm` 的对话类型——`Message`/`ContentBlock`、组装完成的模型请求、`StreamChunk` wire protocol 和适配器约定(adapter contract)、`BlockAssembler`,以及 `LlmAdapter` 提供方约定 |
| [token-meter.md](token-meter.zh.md) | 不可变的标量与位置回放度量,附带已消费日志修订号 |
| [scope.md](scope.zh.md) | 作用域注册标识、dispatch 载体,以及拥有的 `Scope` 上下文 |
| [typert.md](typert.zh.md) | 远程调用描述符、lookup/Context 声明、Typert 注册表,以及 Host Gateway/Client API 边界 |
| [goal.md](goal.zh.md) | 持久 goal 标识、生命周期快照、激活、变更记录与 Round 归属 |
-| [schedule.md](schedule.zh.md) | 仅限 Session 内的提醒记录、持久转换、活动视图与普通对话交付 |
-| [todo.md](todo.zh.md) | todo 包的整列表条目类型、持久事件所有权、投影和开放轮次不变量 |
+| [schedule.md](schedule.zh.md) | 仅限会话内的提醒记录、持久转换、活动视图与普通对话交付 |
+| [todo.md](todo.zh.md) | todo 包的整列表条目类型、持久事件所有权、投影和未结束轮次不变式 |
| [commands.md](commands.zh.md) | 人类命令注册表服务:定义、适配器发现、直接调用、结果与解析视图 |
| [session.md](session.zh.md) | 完整的 `SessionEventMap` 变体目录、`TurnEndReason`、`deriveMessages()`、执行封闭与独立事件 |
-| [persistence.md](persistence.zh.md) | 持久性 seam:`SessionPersistence`、JSONL provider、`session/flush`、崩溃恢复、`SessionHeader` |
+| [persistence.md](persistence.zh.md) | 持久性 seam:`SessionPersistence`、JSONL 提供方、`session/flush`、崩溃恢复、`SessionHeader` |
| [settings.md](settings.zh.md) | 用户设置 seam:`SettingsNamespace` 注册、分层解析(默认值 → 组合 `base` → 用户文档)、owner scope、热提交 |
| [credentials.md](credentials.zh.md) | 凭据 seam:配置中的 `CredentialRef` 引用(绝不含值)、按操作解析、对 UI 安全的 `CredentialInfo`、提供方来源层 |
| [session-query.md](session-query.zh.md) | 逻辑记录、有界精确事件读取、关系追踪、语义筛选器/文档与全文检索结果页 |
-| [feedback.md](feedback.zh.md) | 绑定生命周期的逐消息反馈记录、乐观版本、伴随记录持久化与 Host Remote 契约 |
+| [feedback.md](feedback.zh.md) | 绑定生命周期的逐消息反馈记录、乐观版本、伴随记录持久化与 Host Remote 约定 |
| [session-title.md](session-title.zh.md) | 持久标题快照、被引用的来源消息 seq 与异步提供方约定 |
| [session-reference.md](session-reference.zh.md) | 结构化跨会话引用:`SessionReferenceInput`/`Candidate`、prepared 消息上下文、稳定错误分类 |
| [system-prompt.md](system-prompt.zh.md) | 逐次组装的上下文、工具提供方结果、提示词段落与协作式组装 |
@@ -33,7 +33,7 @@
| [terminal.md](terminal.zh.md) | 持久化终端 ID、后端/会话约定、发送就绪状态、有界读取与 owner 可见快照 |
| [sandbox.md](sandbox.zh.md) | 每会话策略解析与进程约束 seam:文件效果模式、执行/提供方策略、`ConfinedArgv`、强制执行与故障关闭错误 |
| [code-runtime.md](code-runtime.zh.md) | 代码执行 seam:`CodeRunRequest`/`Result`、绑定命名空间、捕获日志、`CodeRunFailure` 分类体系 |
-| [extensions.md](extensions.zh.md) | 带版本的动态 Cordis Plugin 与 Package、Host/Client 激活、审批、运行时检查和生命周期撤销 |
+| [extensions.md](extensions.zh.md) | 带版本的动态 Cordis 插件与包、Host/Client 激活、审批、运行时检查和生命周期清理 |
| [filesystem.md](filesystem.zh.md) | 文件系统 seam:`FsTarget`、读/写/编辑结果、观测到的文件状态、`FsErrorCode` |
| [lsp.md](lsp.zh.md) | LSP 导航 seam:`LspQueryRequest`/`Result`、`LspProvider`/`Service`、四种操作、`LspError` |
| [skills.md](skills.zh.md) | skill(技能)服务:发现优先级、`SkillSummary`/`SkillDefinition`、会话前缀目录、面向模型的 `skill` 加载 |
@@ -48,16 +48,16 @@
| [plan.md](plan.zh.md) | 计划模式:仅记日志的 `plan/mode` 状态、待定选择的冲刷、`PlanModeConfig`、`exit_plan_mode` 审阅流程 |
| [invariants.md](invariants.zh.md) | 运行时不变式注册表:选择配置 `Config`、`InvariantInstaller`/`InvariantFailure`、空配套插件约定 |
| [web-server.md](web-server.zh.md) | HTTP 载体:`WebRouteKind`/`WebRoute`、匹配顺序、可认领的回退席位、index 渲染挂接点 |
-| [webhook.md](webhook.zh.md) | 通过身份验证的提供方交付、任意程序化规则,以及 fire-and-forget 的 Workspace Session 创建 |
+| [webhook.md](webhook.zh.md) | 通过身份验证的提供方交付、任意程序化规则,以及发起 Workspace 会话创建后不等待结果 |
| [storage.md](storage.zh.md) | 存储子系统:后端约定(`StorageBackend`)、`StorageForms`、`DomainSpec`/`Domain`、`domain/changed` |
| [workspace.md](workspace.zh.md) | 工作区注册表:`Workspace`/`WorkspaceId`、注册与解析、与会话 `cwd` 的关系 |
-| [web-client.md](web-client.zh.md) | 浏览器架构:启动、Remote 通信、配对的 Client model、UI adapter、Conversation 组装、Slots 与重连语义 |
-| [client-modules.md](client-modules.zh.md) | Web 插件表:`dsh.client` 声明、`WebBootGraph` 线上组合、bundle 路由与 index 转换 |
-| [slots.md](slots.zh.md) | 类型化 Web UI 组合:声明所有权、cardinality 与 scope、框架与功能注入、props 推导及当前层级 |
-| [client-resources.md](client-resources.zh.md) | 客户端资源模型:`dsh-resource:///…` 地址、协议提供方与 `ResourceProtocolMap`、`useResource` 全局 hook 及其状态、钉住与释放 |
+| [web-client.md](web-client.zh.md) | 浏览器架构:启动、Remote 通信、配对的 Client model、UI 适配器、Conversation 组装、slot 与重连语义 |
+| [client-modules.md](client-modules.zh.md) | Web 插件表:`dsh.client` 声明、`WebBootGraph` 协议格式组合、bundle 路由与 index 挂接点 |
+| [slots.md](slots.zh.md) | 类型化 Web UI 组合:声明所有权、cardinality 与 scope、框架与功能注入、props 推导及已交付的层级结构 |
+| [client-resources.md](client-resources.zh.md) | 客户端资源模型:`dsh-resource:///…` 地址、协议提供方与 `ResourceProtocolMap`、`useResource` 全局钩子及其状态、钉住与释放 |
| [sidebar-right.md](sidebar-right.zh.md) | 右侧 Sidebar:资源地址与导航地址、tab 类型注册与路由、`ctx.sidebarRight` 导航服务、pane-tab slot 与 owner props、资源模型及 Workspace Files 服务 |
-| [conversation.md](conversation.zh.md) | target-neutral Session event 组装:Context identity、Location data、replay 路径、view builder 与 target 自有 render node |
+| [conversation.md](conversation.zh.md) | 目标无关的会话事件组装:上下文标识、位置数据、回放路径、视图构建器与目标自有的渲染节点 |
| [session-projection.md](session-projection.zh.md) | 投影 seam:`SessionProjectionMap`、纯函数 `ProjectionDefinition` 单元、`ProjectionSnapshot` 的一致切面、变更馈送 |
-| [session-telemetry.md](session-telemetry.zh.md) | 对外会话上报能力 seam:`SessionTelemetryRecord`/`SessionTelemetrySeverity`、`SessionTelemetrySink` 约定和 `session-telemetry/record` 脱敏 waterfall |
+| [session-telemetry.md](session-telemetry.zh.md) | 对外会话上报能力 seam:`SessionTelemetryRecord`/`SessionTelemetrySeverity`、`SessionTelemetrySink` 约定和 `session-telemetry/record` 脱敏 waterfall(瀑布式事件) |
> 这些页面上的类型声明及其 JSDoc 与源码等价,并由 `pnpm run verify-type-equiv` 检查漂移(见 [development.md](../development.zh.md#documenting-types-verbatim-ts-type-equiv))。普通块保留完整声明;`public-api` 块保留去除实现体的公开 class 声明。Cordis 服务与事件使用每页生成的 **Cordis API** 小节。
diff --git a/native/system/README.i18n.yaml b/native/system/README.i18n.yaml
index 1e1eb1cd92..cf29dcd62d 100644
--- a/native/system/README.i18n.yaml
+++ b/native/system/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write native/system/README.md
README.md: 5a01754cb96fabbdfd2dbf4f068f19addd7a2347
-README.zh.md: dabd00cecd05ded13a50d2efd000985afed713d4
+README.zh.md: 27d0ca70e28e68e46cb121b8e6b63c56ba5c99d3
diff --git a/native/system/README.zh.md b/native/system/README.zh.md
index dabd00cecd..27d0ca70e2 100644
--- a/native/system/README.zh.md
+++ b/native/system/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "为 Linux 进程隔离与 POSIX Session 写锁提供预编译系统原语。"
+description: "为 Linux 进程隔离与 POSIX 会话写锁提供预编译系统原语。"
kind: "package-library"
---
# @deepseek-ai/node-addon-system
@@ -8,7 +8,7 @@ kind: "package-library"
## Summary
-使用 Linux `landlock-run` 可执行文件限制子进程,或通过 `./flock` 入口获取 POSIX 写锁。平台包包含预编译二进制;用户安装时不会构建原生代码。Landlock 策略与 Session 生命周期仍由调用方负责。
+使用 Linux `landlock-run` 可执行文件限制子进程,或通过 `./flock` 入口获取 POSIX 写锁。平台包包含预编译二进制;消费方安装时不会构建原生代码。Landlock 策略与会话生命周期仍由调用方负责。
## Table of Contents
@@ -22,9 +22,9 @@ kind: "package-library"
[flock 行为约定](docs/flock-contract.md) 将描述符、进程和咨询式锁语义对应到独立原生测试。
-`@deepseek-ai/node-addon-system/flock` 导出 `tryLockExclusive(fd): Promise`。在调用完成前保持描述符打开。获取操作使用非阻塞独占 flock;竞争以 `EAGAIN` 或 `EWOULDBLOCK` 拒绝,关闭该打开文件描述的最后一个描述符即释放锁。参见[入口 README](packages/entry/README.zh.md)。
+`@deepseek-ai/node-addon-system/flock` 导出 `tryLockExclusive(fd): Promise`。在调用完成前保持描述符打开。获取操作使用非阻塞独占 flock;发生竞争时,返回的 Promise 会以 `EAGAIN` 或 `EWOULDBLOCK` 拒绝,关闭该打开文件描述的最后一个描述符即释放锁。参见[入口 README](packages/entry/README.zh.md)。
-导入任一入口都不会加载 addon。Landlock 可执行文件缺失时探测为不可用;flock 绑定缺失时拒绝获取。两条路径都不会编译或静默授予不受支持的行为。
+导入任一入口都不会加载 addon。Landlock 可执行文件缺失时探测为不可用;flock 绑定缺失时拒绝获取。两条路径都不会进行编译,也不会静默允许不受支持的行为。
## Support
@@ -32,7 +32,7 @@ Linux x64/arm64 包包含静态 Landlock 可执行文件,以及分别用于 gl
## Development
-在本目录运行 `pnpm build:ts` 构建入口、`pnpm build:native` 构建当前宿主声明的原生产物、`pnpm build:test-oracle` 构建独立的 flock 系统调用 fixture。随后用 `pnpm test` 验证入口、锁、打包及可用的内核行为。Linux 完整构建需要 musl-gcc;macOS 使用 cc。根目录 `pnpm run build:native-system` 只构建源码测试所需的当前宿主 addon。
+在本目录运行 `pnpm build:ts` 构建入口、`pnpm build:native` 构建当前宿主声明的原生产物、`pnpm build:test-oracle` 构建独立的 flock 系统调用 fixture(测试前置数据)。随后用 `pnpm test` 验证入口、锁、打包及可用的内核行为。Linux 完整构建需要 musl-gcc;macOS 使用 cc。根目录 `pnpm run build:native-system` 只构建源码测试所需的当前宿主 addon。
[架构](docs/architecture.md)、[打包](docs/packaging.md)和[发布流程](docs/release.md)分别负责实现与发布细节。
diff --git a/native/system/packages/darwin-x64/README.i18n.yaml b/native/system/packages/darwin-x64/README.i18n.yaml
index ff5479220b..0927bffcd1 100644
--- a/native/system/packages/darwin-x64/README.i18n.yaml
+++ b/native/system/packages/darwin-x64/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write native/system/packages/darwin-x64/README.md
README.md: 1740788eef943373591a895baeb7207635972a46
-README.zh.md: 644165743486a29e48bee7af33429ebf4f5d8fe2
+README.zh.md: 88053b85150c94048a4ffc32b506d365ff13c15f
diff --git a/native/system/packages/darwin-x64/README.zh.md b/native/system/packages/darwin-x64/README.zh.md
index 6441657434..88053b8515 100644
--- a/native/system/packages/darwin-x64/README.zh.md
+++ b/native/system/packages/darwin-x64/README.zh.md
@@ -6,4 +6,4 @@ kind: "package-library"
[English](README.md) | 中文
-此平台包提供 `bin/system.node`,供 `@deepseek-ai/node-addon-system/flock` 使用的稳定 Node-API v8 addon。它不包含 Landlock 可执行文件、JavaScript 加载器或安装构建脚本。Native 工作流在 macOS x64 上构建它,并负责验证安装后的产物。
+此平台包提供 `bin/system.node`,这是一个供 `@deepseek-ai/node-addon-system/flock` 使用的稳定 Node-API v8 addon。它不包含 Landlock 可执行文件、JavaScript 加载器或安装构建脚本。Native 工作流在 macOS x64 上构建它,并负责验证安装后的产物。
diff --git a/native/system/packages/entry/README.i18n.yaml b/native/system/packages/entry/README.i18n.yaml
index 6c10cabb1c..c9b522958b 100644
--- a/native/system/packages/entry/README.i18n.yaml
+++ b/native/system/packages/entry/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write native/system/packages/entry/README.md
README.md: 8f6a4d341c8f9e4c104e5706e08d9a7d45c065e1
-README.zh.md: 152257916df0cf40511b9743d389ae753ab6c85c
+README.zh.md: e401fc2ec71b1afb664d8e73bf3e9372054957a7
diff --git a/native/system/packages/entry/README.zh.md b/native/system/packages/entry/README.zh.md
index 152257916d..e401fc2ec7 100644
--- a/native/system/packages/entry/README.zh.md
+++ b/native/system/packages/entry/README.zh.md
@@ -8,8 +8,8 @@ kind: "package-library"
`./landlock-run` 入口导出 Landlock 启动器路径、强制执行探测、授权参数和协议常量。独立的 `./flock` 入口导出 `tryLockExclusive(fd): Promise`;导入任一入口都不会加载 `system.node`。包不提供根导出。
-锁操作异步尝试 `LOCK_EX | LOCK_NB`。在完成前保持调用方拥有的描述符打开;竞争以 `EAGAIN`/`EWOULDBLOCK` 拒绝,其他系统调用失败也会拒绝,错误携带 code、正 errno 和 `syscall: 'flock'`。原生调用准备阶段的错误也会拒绝同一个 promise。关闭该打开文件描述的最后一个描述符即释放锁。绑定不打开、复制、关闭或显式解锁描述符。
+锁操作异步尝试 `LOCK_EX | LOCK_NB`。在完成前保持调用方拥有的描述符打开;竞争以 `EAGAIN`/`EWOULDBLOCK` 拒绝,其他系统调用失败也会拒绝,错误携带 code、值为正数的 errno 和 `syscall: 'flock'`。原生调用准备阶段的错误也会拒绝同一个 promise。关闭指向该打开文件描述的最后一个描述符即释放锁。绑定不打开、复制、关闭或显式解锁描述符。
-可选操作系统/CPU 平台包携带二进制。Linux 包含 `bin/landlock-run` 和分别用于两种 libc 的 `bin/glibc/system.node` / `bin/musl/system.node`;macOS 包含 `bin/system.node`。flock 绑定缺失或无法加载时拒绝获取,不在安装时编译。Landlock 仍是遵循既有失败关闭协议的独立可执行文件;不支持的内核或平台探测为不可用。
+可选操作系统/CPU 平台包携带二进制。Linux 包含 `bin/landlock-run` 和分别用于两种 libc 的 `bin/glibc/system.node` / `bin/musl/system.node`;macOS 包含 `bin/system.node`。flock 绑定缺失或无法加载时,锁获取请求会被拒绝,不在安装时编译。Landlock 仍是遵循既有失败关闭协议的独立可执行文件;不支持的内核或平台探测结果为不可用。
两个 C 源文件随包分发以供审计。参见工作区[架构](../../docs/architecture.md)、[支持矩阵](../../docs/support-matrix.md)和 [CLI 约定](../../docs/cli-contract.md)。
diff --git a/native/system/packages/linux-arm64/README.i18n.yaml b/native/system/packages/linux-arm64/README.i18n.yaml
index 881c7ebaf3..2ffb6691d6 100644
--- a/native/system/packages/linux-arm64/README.i18n.yaml
+++ b/native/system/packages/linux-arm64/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write native/system/packages/linux-arm64/README.md
README.md: b1e97481a3f59b5b7cf85e6565cd3d078e42cd7f
-README.zh.md: 79f3b75e16570c4dff8d7249bcd75481f11cc85c
+README.zh.md: 68efb95c60f41b2b95d1e963d9b4f0c8c130a80c
diff --git a/native/system/packages/linux-arm64/README.zh.md b/native/system/packages/linux-arm64/README.zh.md
index 79f3b75e16..68efb95c60 100644
--- a/native/system/packages/linux-arm64/README.zh.md
+++ b/native/system/packages/linux-arm64/README.zh.md
@@ -6,6 +6,6 @@ kind: "package-library"
[English](README.md) | 中文
-此平台包包含静态 musl 可执行文件 `bin/landlock-run`,以及 Node-API v8 addon `bin/glibc/system.node` 和 `bin/musl/system.node`。入口包按运行 Node 进程的 libc 选择 addon;Landlock 可执行文件在两种 libc 系统上共用。
+此平台包包含静态 musl 可执行文件 `bin/landlock-run`,以及 Node-API v8 addon `bin/glibc/system.node` 和 `bin/musl/system.node`。入口会选择与正在运行的 Node 进程所用 libc 匹配的 addon;Landlock 可执行文件在两种 libc 系统上共用。
-包中没有 JavaScript 或安装编译脚本。平台 prepack 检查完整产物、ELF 架构、Node-API 导出和启动器可执行权限;安装演练核对字节并执行原生行为。参见工作区[支持矩阵](../../docs/support-matrix.md)。
+包中没有 JavaScript 或安装编译脚本。平台 prepack 检查产物完整性、ELF 架构、Node-API 导出和启动器可执行权限;已安装产物演练核对字节并执行原生行为。参见工作区的[支持矩阵](../../docs/support-matrix.md)。
diff --git a/native/system/packages/linux-x64/README.i18n.yaml b/native/system/packages/linux-x64/README.i18n.yaml
index 631328590a..f9c7d17176 100644
--- a/native/system/packages/linux-x64/README.i18n.yaml
+++ b/native/system/packages/linux-x64/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write native/system/packages/linux-x64/README.md
README.md: caebb5d8a888a69a952fc89afb3edfb8ece489fc
-README.zh.md: 6ad1dcf6fe26007f76cdeb98936a94262ece4d7c
+README.zh.md: bf5edf59222a5675dbaa63d02fcac115bec7b58d
diff --git a/native/system/packages/linux-x64/README.zh.md b/native/system/packages/linux-x64/README.zh.md
index 6ad1dcf6fe..bf5edf5922 100644
--- a/native/system/packages/linux-x64/README.zh.md
+++ b/native/system/packages/linux-x64/README.zh.md
@@ -6,6 +6,6 @@ kind: "package-library"
[English](README.md) | 中文
-此平台包包含静态 musl 可执行文件 `bin/landlock-run`,以及 Node-API v8 addon `bin/glibc/system.node` 和 `bin/musl/system.node`。入口包按运行 Node 进程的 libc 选择 addon;Landlock 可执行文件在两种 libc 系统上共用。
+此平台包包含静态 musl 可执行文件 `bin/landlock-run`,以及 Node-API v8 addon `bin/glibc/system.node` 和 `bin/musl/system.node`。入口按运行 Node 进程的 libc 选择 addon;Landlock 可执行文件在两种 libc 系统上共用。
-包中没有 JavaScript 或安装编译脚本。平台 prepack 检查完整产物、ELF 架构、Node-API 导出和启动器可执行权限;安装演练核对字节并执行原生行为。参见工作区[支持矩阵](../../docs/support-matrix.md)。
+包中没有 JavaScript 或安装编译脚本。平台 prepack 检查完整产物、ELF 架构、Node-API 导出和启动器可执行权限;已安装产物演练核对字节并执行原生行为。参见工作区[支持矩阵](../../docs/support-matrix.md)。
diff --git a/packages/README.i18n.yaml b/packages/README.i18n.yaml
index e974e49ade..f4b9b5b2e6 100644
--- a/packages/README.i18n.yaml
+++ b/packages/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/README.md
README.md: 9c298d3f2426bab92a6d602495d836ef8ee9fb44
-README.zh.md: 309a0e678968927b79d527991447847d0fa45f83
+README.zh.md: db8977a279713ac7a2f86144323a54125743a46a
diff --git a/packages/README.zh.md b/packages/README.zh.md
index 309a0e6789..db8977a279 100644
--- a/packages/README.zh.md
+++ b/packages/README.zh.md
@@ -9,7 +9,7 @@ kind: "package-group"
## 概述
-harness 由 `packages/` 下的 npm 包组装而成,按能力系列分组:会话与 agent 循环、面向模型的工具、shell 与文件系统执行、Web 访问、subagent 等等。把本页当作顶层地图使用:先找到拥有某能力的组,再打开其 README 查看包列表。每个包都以 `@deepseek-ai/dsh-*` 为作用域、只属于一个组;每个组的 README 都是该能力系列的权威包映射。
+harness 由 `packages/` 下的 npm 包组装而成,按能力系列分组:会话与 agent loop(智能体循环)、面向模型的工具、shell 与文件系统执行、Web 访问、subagent 等等。把本页当作顶层地图使用:先找到拥有某能力的组,再打开其 README 查看包列表。每个包都以 `@deepseek-ai/dsh-*` 为作用域、只属于一个组;每个组的 README 都是该能力系列的权威包映射。
## 目录
@@ -35,24 +35,24 @@ harness 由 `packages/` 下的 npm 包组装而成,按能力系列分组:会
| [`schedule/`](schedule/README.zh.md) | 仅限会话内的定时后续操作 |
| [`feedback/`](feedback/README.zh.md) | 人类反馈的采集与命令 |
| [`identity/`](identity/README.zh.md) | 共享匿名身份 |
-| [`llm/`](llm/README.zh.md) | LLM 能力系列:抽象服务 + 提供方适配器 |
+| [`llm/`](llm/README.zh.md) | LLM(大语言模型)能力系列:抽象服务 + 提供方适配器 |
| [`e2b/`](e2b/README.zh.md) | E2B 远程运行时提供方 |
| [`subprocess/`](subprocess/README.zh.md) | 子进程能力系列:Service Definition + 本地进程树提供方 |
| [`shell/`](shell/README.zh.md) | Bash 能力系列:执行器 seam、本地实现、面向模型的工具 |
| [`terminal/`](terminal/README.zh.md) | 持久 PTY 能力系列:限定所有者范围的会话、本地实现、面向模型的工具 |
| [`code-runtime/`](code-runtime/README.zh.md) | 代码执行能力系列:Service Definition + worker 线程提供方 + PTC mode Consumer |
-| [`sandbox/`](sandbox/README.zh.md) | 进程限制 seam;bwrap/Landlock/Seatbelt 后端 |
+| [`sandbox/`](sandbox/README.zh.md) | 进程限制 seam;bwrap、Landlock、Seatbelt 后端 |
| [`fs/`](fs/README.zh.md) | 文件系统能力系列:seam、本地实现、面向模型的文件工具、发现工具 |
| [`lsp/`](lsp/README.zh.md) | LSP 能力系列:seam、通用 stdio 提供方和 `lsp` 工具 |
-| [`skill/`](skill/README.zh.md) | skill 能力系列:提供方注册表、本地提供方、面向模型的目录/loader |
-| [`compaction/`](compaction/README.zh.md) | 压缩能力系列:Service Definition + 基础提供方 + 命令 Consumer |
+| [`skill/`](skill/README.zh.md) | skill(技能)能力系列:提供方注册表、本地提供方、面向模型的目录/loader |
+| [`compaction/`](compaction/README.zh.md) | 压缩(compaction)能力系列:Service Definition + 基础提供方 + 命令 Consumer |
| [`context/`](context/README.zh.md) | 模型可见请求上下文:workspace 指令、时间上下文、引用 |
| [`subagent/`](subagent/README.zh.md) | subagent 能力系列:提供方注册表约定和面向模型的委托工具 |
| [`jobs/`](jobs/README.zh.md) | 通用后台任务运行时和面向模型的作业控制工具 |
| [`experimental/`](experimental/README.zh.md) | 私有原型与内部专用插件 |
-| [`workflow/`](workflow/README.zh.md) | 工作流 seam、worker 线程引擎、面向模型的 `workflow`/`ralph` 工具 |
-| [`webhook/`](webhook/README.zh.md) | 已验证外部事件、受信规则与即发即弃 Workspace Session |
-| [`web/`](web/README.zh.md) | Web 能力系列:seam、搜索/获取提供方、面向模型的 Web 工具 |
+| [`workflow/`](workflow/README.zh.md) | 工作流 seam、worker 线程引擎、面向模型的 `workflow`/`ralph` 工具 |
+| [`webhook/`](webhook/README.zh.md) | 已验证外部事件、受信规则与即发即弃 Workspace 会话 |
+| [`web/`](web/README.zh.md) | Web 能力系列:seam、搜索/获取提供方、面向模型的 Web 工具 |
| [`attachment/`](attachment/README.zh.md) | 持久附件标识、校验、本地内容寻址存储 |
| [`spill/`](spill/README.zh.md) | spill 能力系列:存储 seam、本地实现、工具结果 spill 策略 |
| [`todo/`](todo/README.zh.md) | 面向模型的 `todo_write` 工具 |
@@ -60,30 +60,30 @@ harness 由 `packages/` 下的 npm 包组装而成,按能力系列分组:会
| [`preset/`](preset/README.zh.md) | 由 preset `cordis.yml` 按会话组装 agent |
| [`guard/`](guard/README.zh.md) | 循环卫生守卫:建议性重复调用提醒 + `tools/execute` 截止时间强制执行器 |
| [`bundle/`](bundle/README.zh.md) | 可安装的 `dsh --profile` 补丁层 |
-| [`extensions/`](extensions/README.zh.md) | agent 运行时自修改:实时插件/服务检查与模型所写挂载/卸载 |
-| [`hooks/`](hooks/README.zh.md) | 钩子桥接 + 共享的 Claude Code / Codex 线协议库 |
+| [`extensions/`](extensions/README.zh.md) | agent 运行时自修改:实时插件/服务检查与模型所写挂载/卸载 |
+| [`hooks/`](hooks/README.zh.md) | 钩子桥接 + 共享的 Claude Code/Codex 线协议库 |
| [`session/`](session/README.zh.md) | 持久会话数据平面:持久化 seam + 后端、投影 seam、基于日志的标题、会话上报 |
| [`session-query/`](session-query/README.zh.md) | 会话检索系列:逻辑语料库、有界读取、血缘、语义过滤、SQLite 全文搜索 |
| [`settings/`](settings/README.zh.md) | 用户设置 seam + 基于文件的提供方 |
-| [`credentials/`](credentials/README.zh.md) | 凭据引用/记录 seam + 环境变量优先于 `.env` 的提供方 + 询问人类的授权 flow |
+| [`credentials/`](credentials/README.zh.md) | 凭据引用与凭据记录 seam + 环境变量优先于 `.env` 的提供方 + 需要向人询问的授权流程 |
| [`storage/`](storage/README.zh.md) | 非会话存储中枢 + 后端 + 领域形式 |
| [`workspace/`](workspace/README.zh.md) | Workspace 实体 |
| [`sdk/`](sdk/README.zh.md) | 进程外 SDK:JSON-RPC 协议与 TypeScript 客户端/服务器 |
-| [`acp/`](acp/README.zh.md) | 仅面向自动化的 Agent Client Protocol 服务器 |
-| [`interaction/`](interaction/README.zh.md) | 人机协作平面:批准/交互 seam、权限预设、命令、询问用户的工具 |
+| [`acp/`](acp/README.zh.md) | 仅面向自动化的 ACP(Agent Client Protocol)服务器 |
+| [`interaction/`](interaction/README.zh.md) | 人机协作平面:批准/交互 seam、权限预设、命令、询问用户的工具 |
| [`boot/`](boot/README.zh.md) | 共享的 app bin 启动粘合层 |
| [`host/`](host/README.zh.md) | web GUI 宿主半侧:API 网关 + HTTP 路由服务器 |
| [`client/`](client/README.zh.md) | web GUI 浏览器半侧:shell、协议层、对象服务、slot、`ui-*` 插件 |
| [`test-support/`](test-support/README.zh.md) | 支持基础设施(testkit、不变式、回放、Loader 冒烟测试) |
| [`runtime-diagnostics/`](runtime-diagnostics/README.zh.md) | 运行时诊断:按包归属的运行时不变式检查与报告 |
-| [`util/`](util/README.zh.md) | 组间共享的低层零依赖工具(`Branded`、home/路径辅助函数、超时、留存) |
+| [`util/`](util/README.zh.md) | 组间共享的低层零依赖工具(`Branded`、home/路径辅助函数、超时、留存) |
-----
## 发布预期
-大多数组是产品——稳定 API。例外:`e2b/` 是 POC,`experimental/` 不发布,`test-support/`、`runtime-diagnostics/` 与 `util/` 是兼容性预期较低的支持组。
+大多数组属于产品组,提供稳定 API。例外:`e2b/` 是 POC,`experimental/` 不发布,`test-support/`、`runtime-diagnostics/` 与 `util/` 是兼容性预期较低的支持组。
-----
@@ -92,7 +92,7 @@ harness 由 `packages/` 下的 npm 包组装而成,按能力系列分组:会
依赖图由工具生成:[docs/module-graph.md](../docs/module-graph.zh.md)(`pnpm run gen-module-graph`,CI 中有新鲜度门禁)。
-**扩展插件依赖 Service Definition,绝不依赖具体提供方。** `dsh-agent-loop` 可替换;UI、钩子和工具插件使用 `dsh-agent`。组合包可以依赖主干插件。能力在需要独立演进时分离 Service Definition / Service Provider / Consumer 角色;详见[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md)。
+**扩展插件依赖 Service Definition,绝不依赖具体提供方。** `dsh-agent-loop` 可替换;UI、钩子和工具插件使用 `dsh-agent`。组合包可以依赖主干插件。能力在需要独立演进时分离 Service Definition/Service Provider/Consumer 角色;详见[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md)。
-----
diff --git a/packages/acp/README.i18n.yaml b/packages/acp/README.i18n.yaml
index 1f7c82b81b..97256a76bf 100644
--- a/packages/acp/README.i18n.yaml
+++ b/packages/acp/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/acp/README.md
README.md: 710a77335eec233c6fdef36091742fb61e95f30a
-README.zh.md: eb2e6847aeb5926d276e2c77d7a0482f55217287
+README.zh.md: a40fb43ef64a92a1467faf2cfeb9fd884e8890a1
diff --git a/packages/acp/README.zh.md b/packages/acp/README.zh.md
index eb2e6847ae..a40fb43ef6 100644
--- a/packages/acp/README.zh.md
+++ b/packages/acp/README.zh.md
@@ -1,15 +1,15 @@
---
-description: "ACP(Agent Client Protocol)包组:通过 JSON-RPC stdio 将全新 harness agent 暴露给程序化客户端的仅自动化服务器。"
+description: "ACP(Agent Client Protocol)包组:通过 JSON-RPC stdio 将全新 harness agent(智能体)暴露给程序化客户端的仅面向自动化的服务器。"
kind: "package-group"
---
-# acp/ — Agent Client Protocol 自动化
+# acp/:Agent Client Protocol 自动化
[English](README.md) | 中文
## 概述
-acp 组提供一个包:一台服务器,让程序与自动化可以通过标准 Agent Client Protocol 运行持久 DeepSeek Harness agent。客户端可以创建、列出、恢复与关闭会话,挂载标准 MCP 服务器,选择模型选项,发送文本与图片提示词,接收语义更新,响应权限提示并取消工作——无需人类参与。从另一个 harness 启动这种服务器的配套客户端位于 `subagent/subagent-acp`。本页是组的映射;包 README 负责各自的包级约定。
+acp 组提供一个包:一个服务器,让程序与自动化流程可以通过标准 Agent Client Protocol 运行持久 DeepSeek Harness agent。客户端可以创建、列出、恢复与关闭会话,挂载标准 MCP 服务器,选择模型选项,发送文本与图片提示词,接收语义更新,响应权限提示并取消工作——无需人类参与。从另一个 harness 启动这种服务器的配套客户端位于 `subagent/subagent-acp`。本页概述该包组;各包的具体约定由其 README 规定。
## 目录
@@ -24,7 +24,7 @@ acp 组提供一个包:一台服务器,让程序与自动化可以通过标
| 包 | 职责 |
|---|---|
-| [`acp/`](acp/README.zh.md) | 让程序通过 ACP 管理持久 agent、挂载 MCP 服务器、选择模型选项、发送或取消工作并接收语义更新 |
+| [`acp/`](acp/README.zh.md) | 让程序通过 ACP 管理持久 agent、挂载 MCP 服务器、选择模型选项、发送提示词、取消工作并接收语义更新 |
-----
diff --git a/packages/acp/acp/README.i18n.yaml b/packages/acp/acp/README.i18n.yaml
index 4be563b5f5..4cdb2df1ac 100644
--- a/packages/acp/acp/README.i18n.yaml
+++ b/packages/acp/acp/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/acp/acp/README.md
-README.md: 635e0e6993a65f403a5cc89f2c9d147b48308a04
-README.zh.md: 65d7d3b2f9f66701c801c910048a501f565b0a46
+README.md: a30396733026108fdeaff67713fbe7aefb8c5101
+README.zh.md: 7f7f2f43ac6fa3059a6d5400e6c2c8d7227197d9
diff --git a/packages/acp/acp/README.md b/packages/acp/acp/README.md
index 635e0e6993..a303967330 100644
--- a/packages/acp/acp/README.md
+++ b/packages/acp/acp/README.md
@@ -1,5 +1,5 @@
---
-description: "Automation-only Agent Client Protocol server for programmatic clients and maintainers driving DeepSeek Harness agents over JSON-RPC stdio."
+description: "Automation-only ACP (Agent Client Protocol) server for programmatic clients and maintainers driving DeepSeek Harness agents over JSON-RPC stdio."
kind: "package-reference"
---
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
## Summary
-`dsh-acp` lets trusted programs automate persistent DeepSeek Harness agents through the standard [Agent Client Protocol](https://agentclientprotocol.com): create or resume sessions, select a model and reasoning effort, attach MCP servers, submit or cancel work, receive semantic updates, and close sessions independently. Choose it for out-of-process subagents, test runners, and scripted controllers; it intentionally omits DSH-specific presentation data and interactive UI features. Persistence supports listing, resuming, and closing sessions across process restarts, but deletion, forks, transcript replay, and additional directories are unsupported. Run `pnpm dsh --profile acp` to start the server; use `dsh-subagent-acp` as the repository client.
+`dsh-acp` lets trusted programs automate persistent DeepSeek Harness agents through the standard [ACP](https://agentclientprotocol.com): create or resume sessions, select a model and reasoning effort, attach MCP servers, submit or cancel work, receive semantic updates, and close sessions independently. Choose it for out-of-process subagents, test runners, and scripted controllers; it intentionally omits DSH-specific presentation data and interactive UI features. Persistence supports listing, resuming, and closing sessions across process restarts, but deletion, forks, transcript replay, and additional directories are unsupported. Run `pnpm dsh --profile acp` to start the server; use `dsh-subagent-acp` as the repository client.
## Table of Contents
@@ -73,7 +73,7 @@ One connection can run several sessions at once, each independent. The calls a c
| `session/update` | Committed assistant messages and thoughts, generic tool lifecycle, configuration changes, and context usage, serialized per session. |
| `session/request_permission` | A permission prompt with one-shot allow/reject choices; your client can answer automatically. |
-Session configuration offers opaque provider/model choices from the live LLM service catalog and a `reasoning_effort` selector when the exact model declares one. A prompt snapshots that selection before asynchronous image admission and pins it across every model step in that turn; a concurrent option change applies to the next turn. ACP clients are trusted controllers: stdio MCP entries authorize their absolute commands and environment, HTTP entries authorize their absolute HTTP(S) URLs and headers, and any initial connection or discovery failure rolls back the unpublished Agent. Unsupported surfaces are omitted or reject: `session/load`, deletion, fork, additional directories, SSE or ACP-transport MCP, modes, commands, plans, terminals, client filesystem operations, and elicitation.
+Session configuration offers opaque provider/model choices from the live LLM service catalog and a `reasoning_effort` selector when the exact model declares one. A prompt snapshots that selection before asynchronous image admission and pins it across every model step in that turn; a concurrent option change applies to the next turn. ACP clients are trusted controllers: stdio MCP entries authorize their absolute commands and environment, HTTP entries authorize their absolute HTTP(S) URLs and headers, and any initial connection or discovery failure rolls back the unpublished Agent. Unsupported surfaces are omitted or rejected: `session/load`, deletion, fork, additional directories, SSE or ACP-transport MCP, modes, commands, plans, terminals, client filesystem operations, and elicitation.
-----
diff --git a/packages/acp/acp/README.zh.md b/packages/acp/acp/README.zh.md
index 65d7d3b2f9..7f7f2f43ac 100644
--- a/packages/acp/acp/README.zh.md
+++ b/packages/acp/acp/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "面向程序化客户端与维护者的仅自动化 Agent Client Protocol 服务器,用于通过 JSON-RPC stdio 驱动 DeepSeek Harness agent。"
+description: "面向程序化客户端与维护者的仅自动化 ACP(Agent Client Protocol)服务器,用于通过 JSON-RPC stdio 驱动 DeepSeek Harness agent(智能体)。"
kind: "package-reference"
---
@@ -9,7 +9,7 @@ kind: "package-reference"
## 概述
-`dsh-acp` 让受信程序通过标准 [Agent Client Protocol(ACP)](https://agentclientprotocol.com) 自动操作持久 DeepSeek Harness agent:创建或恢复会话、选择模型与推理强度、挂载 MCP 服务器、提交或取消工作、接收语义更新,并独立关闭会话。进程外 subagent、测试运行器与脚本化控制器适合选择它;它刻意不提供 DSH 专用呈现数据与交互式 UI 功能。持久化支持跨进程重启列出、恢复与关闭会话,但不支持删除、fork、转录回放与附加目录。运行 `pnpm dsh --profile acp` 可启动服务器;仓库客户端使用 `dsh-subagent-acp`。
+`dsh-acp` 让受信程序通过标准 [ACP](https://agentclientprotocol.com) 自动操作持久 DeepSeek Harness agent:创建或恢复会话、选择模型与推理强度、挂载 MCP 服务器、提交或取消工作、接收语义更新,并独立关闭会话。进程外 subagent、测试运行器与脚本化控制器适合选择它;它刻意不提供 DSH 专用呈现数据与交互式 UI 功能。持久化支持跨进程重启列出、恢复与关闭会话,但不支持删除、fork、transcript(文本记录)回放与附加目录。运行 `pnpm dsh --profile acp` 可启动服务器;仓库客户端使用 `dsh-subagent-acp`。
## 目录
@@ -64,8 +64,8 @@ kind: "package-reference"
| `initialize` | 稳定 ACP v1,以及 `session/list`、`session/resume`、`session/close` 与 Streamable HTTP MCP 支持;图片提示词只在持久附件存储和配置的确切路由支持时公布。 |
| `authenticate` | 立即成功;服务器不需要身份验证。 |
| `session/new` | 全新持久 agent;其绝对工作区与 stdio 或 HTTP MCP 服务器会在发布前通过校验,并返回完整配置选项状态。 |
-| `session/list` | 按确定的新到旧顺序分页返回已持久、可恢复的根会话;可选绝对 `cwd` 筛选会尽可能使用物理目录标识。 |
-| `session/resume` | 恢复一个已持久且非活跃的会话;组合前校验其规范工作区,并恢复日志但不回放旧更新。 |
+| `session/list` | 按确定的新到旧顺序分页返回已持久化、可恢复的根会话;可选绝对 `cwd` 筛选会尽可能使用物理目录标识。 |
+| `session/resume` | 恢复一个已持久化且非活跃的会话;组合前校验其规范工作区,并恢复日志但不回放旧更新。 |
| `session/close` | 停稳式取消、更新 drain、后代释放、持久化 flush,并且只释放指定 Agent 作用域。 |
| `session/set_config_option` | 串行更新公布的 `model` 或 `reasoning_effort`,并返回完整结果状态。 |
| `session/prompt` | 有序文本、资源链接与受支持图片,每个会话一次一个提示词;Agent 空闲且有序更新交付后才结算。 |
@@ -73,7 +73,7 @@ kind: "package-reference"
| `session/update` | 已提交 assistant 消息与 thought、通用工具生命周期、配置变化与上下文用量,按会话串行交付。 |
| `session/request_permission` | 带一次性允许/拒绝选项的权限提示;你的客户端可以自动回答。 |
-会话配置从实时 LLM 服务目录提供不透明的提供方/模型选项,并在确切模型声明推理选项时提供 `reasoning_effort`。提示词会在异步图片准入前快照该选择,并在该轮的每个模型步骤中固定它;并发选项变更从下一轮开始生效。ACP 客户端是受信控制器:stdio MCP 条目授权其绝对命令与环境,HTTP 条目授权其绝对 HTTP(S) URL 与 header;初始连接或发现失败会回滚尚未发布的 Agent。不支持的界面会被省略或拒绝:`session/load`、删除、fork、附加目录、SSE 或 ACP 传输 MCP、mode、命令、计划、终端、客户端文件系统操作与 elicitation。
+会话配置从实时 LLM(大语言模型)服务目录提供不透明的提供方/模型选项,并在确切模型声明推理选项时提供 `reasoning_effort`。提示词会在异步图片准入前快照该选择,并在该轮次的每个模型步骤中固定它;并发选项变更从下一轮次开始生效。ACP 客户端是受信控制器:stdio MCP 条目授权其绝对命令与环境,HTTP 条目授权其绝对 HTTP(S) URL 与 header;初始连接或发现失败会回滚尚未发布的 Agent。不支持的界面会被省略或拒绝:`session/load`、删除、fork、附加目录、SSE(Server-Sent Events)或 ACP 传输 MCP、mode、命令、计划、终端、客户端文件系统操作与 elicitation。
-----
@@ -102,15 +102,15 @@ kind: "package-reference"
| [`src/index.ts`](src/index.ts) | 插件入口:`Config` schema、`AgentSideConnection` 接线、按会话记录、准入与结算、清理 |
| [`src/content.ts`](src/content.ts) | 协议内容准入与投影:图片校验、路由重查、提示词重建、assistant 块转换 |
| [`src/codec.ts`](src/codec.ts) | 轮次结束到 ACP `stopReason` 的纯映射 |
-| — | 不发布运行时不变式伴生入口;本传输不拥有持久包内事件流。 |
+| — | 不发布运行时不变式伴生入口;本传输不拥有持久包内事件流;协议与生命周期测试覆盖其映射。 |
### 准入与提示词结算
-每个会话只允许一个正在处理的提示词。准入先校验整个提示词批次、快照所选路由、重新检查 Agent 是否为同一对象与图片能力、持久化图片附件,然后才把用户消息入队——赢得准入的取消绝不会入队迟到的轮次。入队后,会话模块把该快照与 inbox 消息关联到认领时刻,并在提示词变量与该轮的每个模型步骤中固定相同的提供方、模型与推理强度。按会话更新会串行交付;已提交图片会重新读取并验证完整性,因此图片缺失或损坏会让关联提示词失败,而不是发出占位符。结算优先级依次为显式取消、已提交输出失败、区间内 Agent 失败、关联轮次结束。
+每个会话只允许一个正在处理的提示词。准入先校验整个提示词批次、快照所选路由、重新检查 Agent 是否为同一对象与图片能力、持久化图片附件,然后才把用户消息入队——先于准入完成的取消绝不会让迟到的轮次入队。入队后,会话模块会将该快照与 inbox 消息关联起来,直至该消息被认领,并在提示词变量与该轮次的每个模型步骤中固定相同的提供方、模型与推理强度。按会话更新会串行交付;已提交图片会重新读取并验证完整性,因此图片缺失或损坏会让关联提示词失败,而不是发出占位符。结算优先级依次为显式取消、已提交输出失败、区间内 Agent 失败、关联轮次结束。
### 清理与连接归属
-每个会话模块拥有其 Agent 句柄、MCP 挂载、未来与轮次固定的模型选择、提示词槽位、更新链和记忆化关闭操作。显式关闭、客户端断开与 Cordis 释放使用同一停稳式清理流程:停止新工作、取消提示词准入与 Agent 活动、drain 已提交更新、按子优先顺序释放可继续后代、flush 持久化并释放所拥有的 Agent 作用域。会话关闭后,持久状态仍可供列出与恢复;共享上下文的其他会话或前端不受影响。
+每个会话模块拥有其 Agent 句柄、MCP 挂载、未来与轮次固定的模型选择、提示词槽位、更新链和记忆化关闭操作。显式关闭、客户端断开与 Cordis 释放使用同一停稳式清理流程:停止新工作、取消提示词准入与 Agent 活动、drain 已提交更新、按子优先顺序释放可继续后代、flush 持久化并释放所拥有的 Agent 作用域。会话关闭后,已持久化的状态仍可供列出与恢复;共享上下文的其他会话或前端不受影响。
@@ -139,11 +139,11 @@ kind: "package-reference"
#### Token 影响
-提示词内容、工具调用/结果和持久图片引用会保留在该会话中直到 compaction。并发会话保留独立上下文。
+提示词内容、工具调用/结果和持久图片引用会保留在该会话中直到上下文压缩(context compaction)。并发会话保留独立上下文。
#### KV Cache 影响
-仅追加;新用户消息位于可复用请求前缀之后,不会使先前缓存条目失效。
+只要所选路由与组装后的前缀保持不变,就仅追加。模型变更会使下一个 ACP 轮次改用新路由。
### 权限决策
@@ -169,7 +169,7 @@ kind: "package-reference"
- **仅一个主 workspace**——附加目录仍不支持。
- **仅光栅提示词图片**——PNG、JPEG、WebP 与 GIF 要求持久附件存储及确切的图片能力路由。
- **仅 MCP 工具**——MCP resource 与 prompt 没有 DSH 消费方。
-- **没有转录回放或交互式扩展**——会话删除、fork、`session/load`、mode、命令、计划、终端、客户端文件系统操作与 elicitation 仍不属于此自动化界面。
+- **没有 transcript 回放或交互式扩展**——会话删除、fork、`session/load`、mode、命令、计划、终端、客户端文件系统操作与 elicitation 仍不属于此自动化界面。
### 开发备注
diff --git a/packages/api/README.i18n.yaml b/packages/api/README.i18n.yaml
index ce98751e3d..5575e88512 100644
--- a/packages/api/README.i18n.yaml
+++ b/packages/api/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/api/README.md
README.md: 20455e6b5622ffd6e826b1d4b427838f96f6610f
-README.zh.md: 0294b1823e6a09cae4591b4c6081a546d8d60494
+README.zh.md: 37d6737628781ed4ba51135010302d4edf566282
diff --git a/packages/api/README.zh.md b/packages/api/README.zh.md
index 0294b1823e..37d6737628 100644
--- a/packages/api/README.zh.md
+++ b/packages/api/README.zh.md
@@ -9,7 +9,7 @@ kind: "package-group"
## 概述
-`api/` 组提供应用的 Remote 层:Client 环境可以调用运行在 Host 上的业务能力——管理目标、运行命令、查看插件清单、发现文件与会话引用——调用方式是类型化方法,并接收结果或转发的 Host 事件。`remotes` 决定暴露哪些能力、以及每次调用如何到达正确会话的 agent;`gateway` 在 Client 与 Host 之间承载调用及其结果。技术栈运行在应用共享的 Connection 之上;流式会话数据刻意不在其中。
+`api/` 组提供应用的 Remote 层:Client 环境可以通过类型化方法调用运行在 Host 上的业务能力——管理目标、运行命令、查看插件清单、发现文件与会话引用——并接收结果或转发的 Host 事件。`remotes` 决定暴露哪些能力,以及每次调用如何到达正确会话的 agent(智能体);`gateway` 在 Client 与 Host 之间承载调用及其结果。技术栈运行在应用共享的 Connection 之上;流式会话数据刻意不在其中。
## 目录
@@ -22,18 +22,18 @@ kind: "package-group"
## 包
-下面这些包共同提供 Remote 层;穷尽式约定以各包 README 为准。
+下面这些包共同提供 Remote 层;完整约定以各包 README 为准。
| 包 | 职责 | ctx key |
|---|---|---|
| [`remotes/`](remotes/README.zh.md) | 决定 Client 可以消费哪些 Host 能力与事件。 | — |
-| [`gateway/`](gateway/README.zh.md) | 承载带类型的单次调用、多路复用 stream 与转发的 Host 事件。 | `ctx.typertGateway` / `ctx.remote` |
-| [`session-controller/`](session-controller/README.zh.md) | 拥有 Session 命令、历史 stream、实时控制状态与 Agent/Session 身份策略。 | `ctx.sessionController` / `ctx.remote.session` |
+| [`gateway/`](gateway/README.zh.md) | 承载类型化一元调用、多路复用流与转发的 Host 事件。 | `ctx.typertGateway` / `ctx.remote` |
+| [`session-controller/`](session-controller/README.zh.md) | 拥有会话命令、历史记录流、实时控制状态与 agent 与会话身份策略。 | `ctx.sessionController` / `ctx.remote.session` |
| [`settings-controller/`](settings-controller/README.zh.md) | 拥有 settings 域各 seam 之上的配置界面读写。 | `ctx.settingsController`、`ctx.credentialsController` / `ctx.remote.settings`、`ctx.remote.credentials` |
| [`workspace-controller/`](workspace-controller/README.zh.md) | 拥有 Workspace 变更与完整 Client Workspace 投影。 | `ctx.workspaceController` / `ctx.remote.workspace` |
-| [`workspace-files/`](workspace-files/README.zh.md) | 拥有有界的工作区文件访问——`stat`、分页 `read`、`list` 与 agent 写入的 `changes` 流——以及其上的 Client `file` 资源提供者。 | `ctx.workspaceFiles` / `ctx.remote.workspaceFiles` |
+| [`workspace-files/`](workspace-files/README.zh.md) | 拥有有界的工作区文件访问——`stat`、分页 `read`、`list` 与 agent 写入的 `changes` 流——以及其上的 Client `file` 资源提供方。 | `ctx.workspaceFiles` / `ctx.remote.workspaceFiles` |
-Remote 调用沿 Client → Host 方向运行在应用共享的 Connection 之上。API Gateway 拥有 Remote 传输,各 controller 包分别拥有 Session、配置界面与 Workspace 行为。流式下载等不适合 Remote 调用的响应由功能包注册精确的 Connection Fetch 路由。
+Remote 调用沿 Client → Host 方向运行在应用共享的 Connection 之上。API Gateway 拥有 Remote 传输,各控制器包分别拥有会话、配置界面与 Workspace 行为。流式下载等不适合 Remote 调用的响应由功能包注册精确的 Connection Fetch 路由。
-----
diff --git a/packages/api/gateway/README.i18n.yaml b/packages/api/gateway/README.i18n.yaml
index 6e013ff43d..ab767193d1 100644
--- a/packages/api/gateway/README.i18n.yaml
+++ b/packages/api/gateway/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/api/gateway/README.md
README.md: a234189cfff09bae894de14dada607a357b398fd
-README.zh.md: 067adbdbe06db8fb4caec323db0361d13f6309a7
+README.zh.md: 7a6e66724724efd83173835095a409c527faccef
diff --git a/packages/api/gateway/README.zh.md b/packages/api/gateway/README.zh.md
index 067adbdbe0..7a6e667247 100644
--- a/packages/api/gateway/README.zh.md
+++ b/packages/api/gateway/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "带类型的 Client 到 Host 调用与 stream:分派、校验、取消、重连与转发的 Host 事件。"
+description: "带类型的 Client 到 Host 调用与流:分派、校验、取消、重连与转发的 Host 事件。"
kind: "package-reference"
---
@@ -26,15 +26,15 @@ kind: "package-reference"
每次调用时,`ctx.typertGateway.invoke()` 都会解析当前的描述符和 Cordis 服务,校验具名参数是否完全匹配,解析已注册的对象或 Context 身份标识,调用公开的业务方法,并校验其结果。业务服务继承 [`dsh-typert-protocol`](../../typert/protocol/README.zh.md) 的 `TypertRemoteService`,并用 `@Remote` 或 `@RemoteScope` 标记方法;已有其他基类时仍可改用 `bindTypertRemote()`。
-严格模式从 `ctx.typert.local` 读取生成的调用描述符。查找参数使用 `ctx.typert.lookups` 中当前有效的 resolver:业务包注册稳定声明与默认策略,Host 组合可用 effect-scoped `configure()` 覆盖解析行为;`@RemoteScope` 则通过已注册的 Host Context adapter 解析其接收者。SRC 模式是开发阶段的回退路径,适用于从未具备严格定义的端点;它解析简单参数名,并且只允许非查找参数使用可安全表示为 JSON 的值。已观测到的严格定义一旦撤回,系统会直接报错,而不会降低校验强度。
+严格模式从 `ctx.typert.local` 读取生成的调用描述符。查找参数使用 `ctx.typert.lookups` 中当前有效的解析器:业务包注册稳定声明与默认策略,Host 组合可用 effect-scoped `configure()` 覆盖解析行为;`@RemoteScope` 则通过已注册的 Host Context 适配器解析其接收者。SRC 模式是开发阶段的回退路径,适用于从未具备严格定义的端点;它解析简单参数名,并且只允许非查找参数使用可安全表示为 JSON 的值。已观测到的严格定义一旦撤回,系统会直接报错,而不会降低校验强度。
-Connection 可用时,Host 入口会在 Connection 共享的 `/api` FetchHandler 上注册 trusted-host interceptor。Connection 把这个复合 handler 交给 HTTP bridge;handler 将已认领 endpoint 分发给 Gateway,未认领且没有精确 Fetch 路由负责的请求返回 404。直接调用 `invoke()` 会保留业务错误;`TypertGatewayError` 是 `RemoteError` 的子类,其 `gateway/*` 码命名了分发、绑定、提供方、查找、Context、参数和编解码器各自负责的故障。因策略而拒绝的 resolver——冷恢复失败或 ownership fence——抛出自己的 `RemoteError`,它选定的码原样到达调用方。
+Connection 可用时,Host 入口会在 Connection 共享的 `/api` FetchHandler 上注册 trusted-host interceptor。Connection 把这个复合 handler 交给 HTTP bridge;handler 将已认领 endpoint 分发给 Gateway,未认领且没有精确 Fetch 路由负责的请求返回 404。直接调用 `invoke()` 会保留业务错误;`TypertGatewayError` 是 `RemoteError` 的子类,其 `gateway/*` 码命名了分发、绑定、提供方、查找、Context、参数和编解码器各自负责的故障。因策略而拒绝的解析器——冷恢复失败或 ownership fence——抛出自己的 `RemoteError`,它选定的码原样到达调用方。
支持取消的 Remote 方法会把 `signal: AbortSignal` 声明为最后一个 Host 参数。signal 是 descriptor 元数据,而不是 wire 参数:Connection 将它提供给 Gateway,Gateway 则在已解码的业务参数之后注入它。SRC 识别这个保留的末位参数名,严格生成还要求它具有全局 `AbortSignal` 类型。
-流式 Remote 使用 `@Remote({ mode: 'stream' })` 并返回 `Iterable` 或 `AsyncIterable`。`ctx.typertGateway.stream()` 执行与一元调用相同的 endpoint、参数、lookup 和取消校验,再用生成的 result codec 校验每个产出项。Client 插件激活时打开 Gateway 自有的 `/api/remote.mux` WebSocket,并让它在空闲时保持连接。Connection 拥有重试调度;每次 retry 前,它要求 mux 取消候选或活动 socket,并且只做一次全新的物理连接尝试。Host 按配置的 `websocketHeartbeatIntervalMs` 间隔(默认 2 秒)发送 Ping 控制帧,浏览器在 WebSocket 协议层自动回复 Pong,使空闲网络中间层持续看到流量,而不新增 Remote stream frame。若 socket 尚未回复上一次 Ping,Host 会在下一间隔终止它。可独立取消的逻辑流共享这条连接;进程内 Connection 载体直接提供等价的流,不打开该 WebSocket。
+流式 Remote 使用 `@Remote({ mode: 'stream' })` 并返回 `Iterable` 或 `AsyncIterable`。`ctx.typertGateway.stream()` 执行与一元调用相同的 endpoint、参数、lookup 和取消校验,再用生成的 result codec 校验每个产出项。Client 插件激活时打开 Gateway 自有的 `/api/remote.mux` WebSocket,并让它在空闲时保持连接。Connection 拥有重试调度;每次 retry 前,它要求 mux 取消候选或活动 socket,并且只做一次全新的物理连接尝试。Host 按配置的 `websocketHeartbeatIntervalMs` 间隔(默认 2 秒)发送 Ping 控制帧,浏览器在 WebSocket 协议层自动回复 Pong,使空闲网络中间层持续看到流量,而不新增 Remote 流帧。若 socket 尚未回复上一次 Ping,Host 会在下一间隔终止它。可独立取消的逻辑流共享这条连接;进程内 Connection 载体直接提供等价的流,不打开该 WebSocket。
-Host 组合可通过 `registerRemoteEvents()` 注册唯一的应用事件 source。Gateway 为它保留内部 `$events` logical endpoint,只接受空 `args`,并在 source 撤回时中止该注册打开的 stream。事件名单、参数校验、每 Client 队列及 opening `{ type: 'ready', clientId, host: { home } }` frame 中的 Host home 由 API Remotes 拥有。source factory 在返回 iterable 前同步挂好增量 listener,因此 Client 只在增量投递就绪后发布 generation 并开始 baseline 读取。
+Host 组合可通过 `registerRemoteEvents()` 注册唯一的应用事件 source。Gateway 为它保留内部 `$events` logical endpoint,只接受空 `args`,并在 source 撤回时中止该注册打开的流。事件名单、参数校验、每个 Client 的队列及 opening `{ type: 'ready', clientId, host: { home } }` frame 中的 Host home 由 API Remotes 拥有。source factory 在返回 iterable 前同步挂好增量 listener,因此 Client 只在增量投递就绪后发布 generation 并开始 baseline 读取。
## Client 服务:`ClientRemote`(ctx key:`remote`)
@@ -43,13 +43,13 @@ Host 组合可通过 `registerRemoteEvents()` 注册唯一的应用事件 source
每次一元调用都会校验位置参数,构造与描述符完全匹配的具名 `args`,再通过 `ctx.connection.rpc.call('/api', endpoint, ...)` 发送。生成的流方法返回 `AsyncIterable`,并在进程内 Connection 载体可用时通过它打开逻辑流,否则通过共享的 Gateway WebSocket 打开。生成的支持取消的方法接受最后一个可选 `AbortSignal`;Client 会在调用载体前将它与贡献项的挂载生命周期合并。一元结果和每个流项都经过校验后才会交给应用代码。撤回贡献项会同时移除其描述符和方法、中止正在进行的调用与流,并使外部仍持有的方法句柄在调用时返回拒绝。
-每次一元调用都解析为 `RemoteResult`——`{ ok: true, value }` 或 `{ ok: false, error }`——且绝不因载体问题 reject:本面把断线载体折入错误分支,调用方 signal 中止时答以 `gateway/cancelled`,因此没有消费方需要包一层来兜载体失败。只有装配故障仍会 reject:参数个数不符、方法未挂载、贡献已撤下、缺少 Context adapter。`error` 是活的 `RemoteError` 实例,所以 `throw result.error` 保持 throw 语义;而 `isRemoteFailure(value)` 是消费方唯一需要的谓词——它认下的捕获值带着 Host 码,它拒绝的一律是本地故障,调用方应当让其崩掉。
+每次一元调用都解析为 `RemoteResult`——`{ ok: true, value }` 或 `{ ok: false, error }`——且绝不因载体问题 reject:本面把断线载体折入错误分支,调用方 signal 中止时答以 `gateway/cancelled`,因此没有消费方需要包一层来兜载体失败。只有装配故障仍会 reject:参数个数不符、方法未挂载、贡献已撤下、缺少 Context 适配器。`error` 是活的 `RemoteError` 实例,所以 `throw result.error` 保持 throw 语义;而 `isRemoteFailure(value)` 是消费方唯一需要的谓词——它认下的捕获值带着 Host 码,它拒绝的一律是本地故障,调用方应当让其崩掉。
-`ctx.remote.$host` 以普通值读取固定的 Host 事实:`home`(首个 ready 帧之前为 undefined)与 `isLoopback`。它不是 store——没有订阅、没有代次计数——所以需要响应重连的消费方去监听 `connection/reset`,而不是轮询它。
+`ctx.remote.$host` 以普通值读取固定的 Host 事实:`home`(首个 ready 帧之前为 undefined)与 `isLoopback`。它不是存储——没有订阅、没有代次计数——所以需要响应重连的消费方去监听 `connection/reset`,而不是轮询它。
-`ctx.remote.$stream()` 返回跨越多个物理载体代次的单消费方 `RemoteStream`。Host 仍在线时,它允许一次立即重试;Host 离线时,它等待下一代连接,并为每个流项标注物理代次。领域消费方校验并接受各代次的 opening value;业务与协议错误仍然终止流。一切终态失败离开本面时都是 `RemoteError`,包括重试耗尽和在 opening value 之前就结束的代次,因此流消费方与一元调用方用同一种方式判别。`RemoteStreamCarrierError` 命名的是可重试的物理丢失,它只作为 `carrierFailed` 回调参数到达领域,绝不作为终态结果。`RemoteSnapshotStream` 在此之上规定每代由一个 opening snapshot 和后续 delta 组成。`RemoteJournalStream` 基于领域提供的 entry 闭区间提供 follow-before-page、分页、重连追赶与缺口修复;它丢弃完整重复项,并拒绝缺口、倒置区间和部分重叠。领域还可以携带无 cursor 的通知:通知绝不推进或修复持久 cursor,在缺口修复期间收到的通知只会在 replacement page 提交后发布。若更新代次取代该修复,旧代次 held notification 会与其 page 一同丢弃。dispose 任一种 stream 都会取消其请求,并在活动 iterator 完全停止后完成。
+`ctx.remote.$stream()` 返回跨越多个物理载体代次的单消费方 `RemoteStream`。Host 仍在线时,它允许一次立即重试;Host 离线时,它等待下一代连接,并为每个流项标注物理代次。领域消费方校验并接受各代次的 opening value;业务与协议错误仍然终止流。一切终态失败离开本面时都是 `RemoteError`,包括重试耗尽和在 opening value 之前就结束的代次,因此流消费方与一元调用方用同一种方式判别。`RemoteStreamCarrierError` 命名的是可重试的物理丢失,它只作为 `carrierFailed` 回调参数到达领域,绝不作为终态结果。`RemoteSnapshotStream` 在此之上规定每代由一个初始快照和后续 delta 组成。`RemoteJournalStream` 基于领域提供的 entry 闭区间提供 follow-before-page、分页、重连追赶与缺口修复;它丢弃完整重复项,并拒绝缺口、倒置区间和部分重叠。领域还可以携带无 cursor 的通知:通知绝不推进或修复持久 cursor,在缺口修复期间收到的通知只会在 replacement page 提交后发布。若更新代次取代该修复,旧代次 held notification 会与其 page 一同丢弃。对任一种流执行 dispose(资源释放)时,系统会取消该流的请求,并在活动 iterator 完全停止后完成资源释放。
-`ctx.remote.$on()` 订阅一条被转发的 Host 事件。它的合法键恰好等于 Host 装配声明的转发选择,listener 类型就是事件所属包自己的 Cordis `Events` 声明,因此不存在会与之漂移的第二份签名。每个订阅归属调用方 fiber,并随该 fiber 一起消失。Client Remote 服务激活时就把 `$events` pump 注册为 Connection generation source,因此即使当前无 `$on` 订阅,它也会在 Connection 循环启动时打开。浏览器使用 Remote mux,进程内组合使用 `connection.rpc.open`;opening `ready` 项建立 Connection generation 并提供 Host 信息。物理 carrier 失败、Remote stream error、意外正常结束、非 ready 首项或畸形事件项都会终止该 generation,由 Connection 按持续且间隔封顶的带抖动指数退避重开。普通通知按注册顺序运行并隔离 listener 失败;Agent-scoped waterfall 允许 listener 返回结果、调用 `next()` 或拒绝,Gateway 再通过现有 HTTP 一元载体回送该结果。
+`ctx.remote.$on()` 订阅一条被转发的 Host 事件。它的合法键恰好等于 Host 装配声明的转发选择,listener 类型就是事件所属包自己的 Cordis `Events` 声明,因此不存在会与之漂移的第二份签名。每个订阅归属调用方 fiber,并随该 fiber 一起消失。Client Remote 服务激活时就把 `$events` pump 注册为 Connection generation source,无论当前是否存在 `$on` listener。浏览器使用 Remote mux,进程内组合使用 `connection.rpc.open`;opening `ready` 项建立 Connection generation 并提供 Host 信息。物理 carrier 失败、Remote 流故障、意外正常结束、非 ready 首项或畸形事件项都会终止该 generation,由 Connection 按持续且间隔封顶的带抖动指数退避重开。普通通知按注册顺序运行并隔离 listener 失败;Agent-scoped waterfall(瀑布式事件)允许 listener 返回结果、调用 `next()` 或拒绝,Gateway 再通过现有 HTTP 一元载体回送该结果。
`ctx.remote` 不暴露 Connection 生命周期控制。只有职责包含恢复的消费方才直接读取 `ctx.connection.state` 并调用 `ctx.connection.reconnect()`;普通 Remote 消费方仍只使用生成的 namespace 与 `$stream()`。
@@ -71,8 +71,8 @@ Host 组合可通过 `registerRemoteEvents()` 注册唯一的应用事件 source
- Connection 适配器对分发故障与未归类异常答以 `gateway/internal`,且不附带详细信息;拥有方或 Gateway 自己抛出的 `RemoteError` 带着自有码、message 与 details 过线。其 `cause` 链与 `TypertGatewayError` 子类身份只对同进程调用方留存。
- SRC 模式仅支持名称唯一的标识符参数,不支持解构、默认值或剩余参数。它只校验值能否安全表示为 JSON,不校验生成的业务类型,也绝不会推断可选字段。
- Client 侧只能挂载严格模式生成的贡献项。SRC 标记不具备 Client 编解码器或类型投影。
-- `$stream()` 监督载体替换,但不推断回放语义;各领域自行拥有恢复 cursor 或替换 baseline 的校验,以及正常结束的分类。Connection generation 会重开内部 `$events`;单向通知不会重放,仍处于 pending 的 scoped waterfall 则沿用同一个 event id 重放。
-- lookup resolver 按 key 配置;当前无法让单个 Remote 参数或 endpoint 在同一 `agent`/`session` key 下选择 live-only 策略。
+- `$stream()` 监督载体替换,但不推断回放语义;各领域自行拥有恢复 cursor 或替换 baseline 的校验,以及正常结束的分类。Connection generation 会重开内部 `$events` 流;单向通知不会重放,仍处于 pending 的 scoped waterfall 则沿用同一个 event id 重放。
+- lookup 解析器按 key 配置;当前无法让单个 Remote 参数或 endpoint 在同一 `agent`/`session` key 下选择 live-only 策略。
- 被转发的事件到达 `$on` 时不做业务载荷投影或脱敏。普通通知在重连后不重放;Agent-scoped waterfall 只投影选择 Client Context 所需的顶层 Agent 身份,并自行携带 pending 生命周期。
- `websocketHeartbeatIntervalMs` 同时是 Ping 周期和 Pong 截止时间。对端未在下一周期前回复时,Host 会终止连接;如果部署的事件循环或网络可能停顿超过该间隔,必须调大此配置。
@@ -87,4 +87,4 @@ Host 组合可通过 `registerRemoteEvents()` 注册唯一的应用事件 source
-**运行时不变式:** 不发布伴生入口。Host 调用会重新读取权威的 Cordis 与 Typert 状态,Client 方法、描述与 `$on` 订阅则在同一个 effect 中完成变更。
+**运行时不变式:** 不发布伴生入口。Host 调用会重新读取权威的 Cordis 与 Typert 状态,Client 方法、描述符与 `$on` 订阅的变更则统一归属同一个 effect。
diff --git a/packages/api/remotes/README.i18n.yaml b/packages/api/remotes/README.i18n.yaml
index e4d442d64f..7c77a3bb28 100644
--- a/packages/api/remotes/README.i18n.yaml
+++ b/packages/api/remotes/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/api/remotes/README.md
-README.md: 52ef6223f4d7770224df1b1c5d783962c55f73f6
-README.zh.md: eab5d2c6642a7899fac60d8c666ee55057eaea05
+README.md: 88b7b0fd023049be1169122f0f613aa740ccbc37
+README.zh.md: 9bfdc0a05920363ac523657e71ca02f728d7ee03
diff --git a/packages/api/remotes/README.md b/packages/api/remotes/README.md
index 52ef6223f4..88b7b0fd02 100644
--- a/packages/api/remotes/README.md
+++ b/packages/api/remotes/README.md
@@ -29,7 +29,7 @@ Two-sided BFF for Host Remote capabilities selected by this application. The Hos
The Client assembly mounts Commands, credentials, settings, Goal, dynamic Cordis, file and Session references, read-only Host plugin inventory, message feedback, Session Controller, and Workspace Controller contributions. Cordis effect ownership withdraws every contribution when this assembly unloads, while `@deepseek-ai/dsh-api-gateway/client` owns descriptor validation, traced namespace Services, direct and scoped methods, invocation, streams, and cancellation. The Client entry consumes the shared `TypertClientRemote` interface through Cordis and does not import the concrete Gateway. It re-exports the Gateway Client face's declaration merges type-only, so a consumer reaching the forwarded-event vocabulary through this facade gains no runtime edge to the Gateway implementation.
-This facade is also the front door for the wire type vocabulary a Client package names. It re-exports, type-only, the Remote failure vocabulary (`RemoteResult`, `RemoteFailure`, `RemoteErrorCode`, `RemoteErrorDetailsMap`), the Host facts (`RemoteHostFacts`), and each selected domain's client-safe payload types, so a Client feature package imports one specifier instead of reaching into `dsh-typert-protocol`, the Gateway, or an owner's Host entry. Two kinds of package deliberately skip this door: the api-layer packages this assembly itself selects — importing it back would close a dependency cycle — and their tests, which take the failure vocabulary from `dsh-typert-protocol` directly. A UI package's tests instead take the `RemoteError` constructor from [`dsh-client-test-runtime`](../../test-support/client-runtime/README.md).
+This facade is also the front door for the wire type vocabulary a Client package names. It re-exports, type-only, the Remote failure vocabulary (`RemoteResult`, `RemoteFailure`, `RemoteErrorCode`, `RemoteErrorDetailsMap`), the Host facts (`RemoteHostFacts`), and each selected domain's client-safe payload types, so a Client feature package imports one specifier instead of reaching into `dsh-typert-protocol`, the Gateway, or an owner's Host entry. Two kinds of package deliberately skip this door: the API-layer packages this assembly itself selects — importing it back would close a dependency cycle — and their tests, which take the failure vocabulary from `dsh-typert-protocol` directly. A UI package's tests instead take the `RemoteError` constructor from [`dsh-client-test-runtime`](../../test-support/client-runtime/README.md).
This package owns no physical transport or Host service discovery. It projects the application selection into generated Remote contributions and an independent Host event source per Client; API Gateway owns endpoints, carriers, cancellation, and reconnection. Its Client face can be reused by Web or a future TUI that provides the same React-free `ctx.remote` contract.
@@ -70,7 +70,7 @@ No direct effect; mounted Host capabilities own any model-visible behavior they
- The capability set is fixed by explicit build-time value imports; the Client does not discover the Host's active Services or Remote definitions at runtime.
- Additional capabilities require an explicit `/remote` value import and mount in this assembly.
-- Ordinary forwarded events are not replayed; state that requires reliable recovery needs an owner-provided query, cursor, or opening baseline.
+- Only scoped waterfalls that are still pending are replayed after reconnection; ordinary one-way notifications remain isolated best-effort deliveries and are not replayed. State that requires reliable recovery needs an owner-provided query, cursor, or opening baseline.
diff --git a/packages/api/remotes/README.zh.md b/packages/api/remotes/README.zh.md
index eab5d2c664..9bfdc0a059 100644
--- a/packages/api/remotes/README.zh.md
+++ b/packages/api/remotes/README.zh.md
@@ -25,24 +25,24 @@ kind: "package-reference"
## 使用本包
-[`@deepseek-ai/dsh-api-session-controller`](../session-controller/README.zh.md) 拥有 Agent 与 Session 身份策略,包括供其他 namespace 使用的 Typert lookup resolver。本包只选择并挂载生成的 Session contribution,不复制激活策略。
+[`@deepseek-ai/dsh-api-session-controller`](../session-controller/README.zh.md) 拥有 agent(智能体)与会话身份策略,包括供其他 namespace 使用的 Typert lookup 解析器。本包只选择并挂载生成的会话 contribution,不复制激活策略。
-Client 组合挂载 Commands、凭据、settings、Goal、动态 Cordis、文件与 Session 引用、只读 Host 插件清单、消息反馈、Session Controller 和 Workspace Controller contribution。该组合卸载时,Cordis effect 的所有权机制会撤回所有贡献;`@deepseek-ai/dsh-api-gateway/client` 负责描述符校验、可追踪 namespace Service、直接与作用域方法、调用、流与取消。Client 入口通过 Cordis 消费共享的 `TypertClientRemote` 接口,不导入具体 Gateway;它只以 type-only 形式重新导出 Gateway Client face 的声明合并,因此消费端经由本外观取到转发事件词汇时,运行时不会多出一条通往 Gateway 实现的边。
+Client 组合挂载 Commands、凭据、settings、Goal、动态 Cordis、文件与会话引用、只读 Host 插件清单、消息反馈、会话控制器和 Workspace 控制器 contribution。该组合卸载时,Cordis effect 的所有权机制会撤回所有贡献;`@deepseek-ai/dsh-api-gateway/client` 负责描述符校验、可追踪的 namespace 服务、直接与作用域方法、调用、流与取消。Client 入口通过 Cordis 消费共享的 `TypertClientRemote` 接口,不导入具体 Gateway;它只以 type-only 形式重新导出 Gateway Client face 的声明合并,因此消费端经由本外观取到转发事件词汇时,运行时不会多出一条通往 Gateway 实现的边。
-本 facade 同时是 Client 包指称 wire 类型词汇的正门。它以 type-only 方式转出 Remote 失败词汇(`RemoteResult`、`RemoteFailure`、`RemoteErrorCode`、`RemoteErrorDetailsMap`)、Host 事实(`RemoteHostFacts`),以及各已选领域的浏览器安全载荷类型,因此 Client 功能包只 import 一个 specifier,不必伸手进 `dsh-typert-protocol`、Gateway 或某个拥有方的 Host 入口。有两类包刻意不走这道门:本装配自己选中的 api 层包——反向 import 会形成依赖环——以及它们的测试,后者直接从 `dsh-typert-protocol` 取失败词汇。UI 包的测试则从 [`dsh-client-test-runtime`](../../test-support/client-runtime/README.zh.md) 取 `RemoteError` 构造器。
+本 facade 同时是 Client 包指称 wire 类型词汇的正门。它以 type-only 方式转出 Remote 失败词汇(`RemoteResult`、`RemoteFailure`、`RemoteErrorCode`、`RemoteErrorDetailsMap`)、Host 事实(`RemoteHostFacts`),以及各已选领域对 Client 安全的载荷类型,因此 Client 功能包只 import 一个 specifier,不必伸手进 `dsh-typert-protocol`、Gateway 或某个拥有方的 Host 入口。有两类包刻意不走这道门:本装配自己选中的 API 层包——反向 import 会形成依赖环——以及它们的测试,后者直接从 `dsh-typert-protocol` 取失败词汇。UI 包的测试则从 [`dsh-client-test-runtime`](../../test-support/client-runtime/README.zh.md) 取 `RemoteError` 构造器。
-本包不拥有物理传输或 Host 服务发现。它只把应用选择投影为生成的 Remote contribution 和唯一的 Host Cordis event source;API Gateway 负责 endpoint、carrier、取消与重连。Web 或未来的 TUI 只要提供同一份不依赖 React 的 `ctx.remote` 约定,均可复用其 Client face。
+本包不拥有物理传输或 Host 服务发现。它只把应用选择投影为生成的 Remote contribution,以及每个 Client 各自独立的 Host 事件源;API Gateway 负责 endpoint、carrier、取消与重连。Web 或未来的 TUI 只要提供同一份不依赖 React 的 `ctx.remote` 约定,均可复用其 Client face。
-----
## 转发的 Host 事件
-`src/remote-events.ts` 持有 `API_REMOTE_FORWARDED_EVENTS`,即本应用不改名转发给消费端的 Host Cordis 事件名单;每个条目还会选择普通发送或 Agent-scoped waterfall 投递。该名单同时就是 `ctx.remote.$on` 的合法键集,只含类型的 `src/types.ts` 派生其选择面。多转发一个事件只需在该数组里加一项:类型投影、消费端键面与 Host 转发循环全部由它派生。
+`src/remote-events.ts` 持有 `API_REMOTE_FORWARDED_EVENTS`,即本应用不改名转发给消费端的 Host Cordis 事件名单;每个条目还会选择普通发送或 agent-scoped waterfall(瀑布式事件)投递。该名单同时就是 `ctx.remote.$on` 的合法键集,只含类型的 `src/types.ts` 派生其选择面。多转发一个事件只需在该数组里加一项:类型投影、消费端键面与 Host 转发循环全部由它派生。
-监听器签名不在此处重写。名单内每条事件的 Cordis `Events` 声明都住在其 owner 包 client-safe 的 `./types` 出口,本包两个 face 都把那些声明纳入编译面。Host face 还会把每个条目断言给 `TypertForwardableEventEntry`:`emit` 条目必须是已声明的单向事件,`waterfall` 条目则必须是已声明的 Agent-scoped waterfall,且其最后一个参数是返回相同结果类型的 `next()` 回调。
+监听器签名不在此处重写。名单内每条事件的 Cordis `Events` 声明都住在其 owner 包 client-safe 的 `./types` 导出,本包两个 face 都把那些声明纳入编译面。Host face 还会把每个条目断言给 `TypertForwardableEventEntry`:`emit` 条目必须是已声明的单向事件,`waterfall` 条目则必须是已声明的 agent-scoped waterfall,且其最后一个参数是返回相同结果类型的 `next()` 回调。
-Host entry 为每条 Client stream 独立注册 allowlist listener 和队列,并在普通事件入队前拒绝非 JSON 参数。对于 waterfall,它只投影顶层 Agent 身份与 JSON 请求字段;Client 结果也必须能无损表示为 JSON,而 `next()` 会委托给后续 Host listener。每个作用域 waterfall 请求都必须以 `request.agent` 直接携带路由所用的 Agent;Host 会在转发前拒绝缺失或不匹配的身份。该 source 在 `ctx.typertGateway.registerRemoteEvents()` 暴露 Gateway 内部的 `$events` logical stream 前同步挂好所有 listener,因此首个 `ready` 项既能证明增量投递已就绪,也会携带供 Client 显示路径的 Host home。撤回注册会中止活动 stream。
+Host entry 为每条 Client 流独立注册一组 allowlist listener 和一个队列,并在普通事件入队前拒绝非 JSON 参数。对于 waterfall,它只投影顶层 agent 身份与 JSON 请求字段;Client 结果也必须能无损表示为 JSON,而 `next()` 会委托给后续 Host listener。每个作用域 waterfall 请求都必须以 `request.agent` 直接携带路由所用的 agent;Host 会在转发前拒绝缺失或不匹配的身份。该 source 在 `ctx.typertGateway.registerRemoteEvents()` 暴露 Gateway 内部的 `$events` 逻辑流前同步挂好所有 listener,因此首个 `ready` 项既能证明增量投递已就绪,也会携带供 Client 显示路径的 Host home。撤回注册会中止活动流。
## 构建边界
@@ -70,7 +70,7 @@ Host entry 为每条 Client stream 独立注册 allowlist listener 和队列,
- 能力集合由构建时显式导入的值固定确定;Client 不会在运行时发现 Host 中已启用的服务或 Remote 定义。
- 若要增加能力,必须显式导入相应的 `/remote` 值并在此组合中挂载。
-- 只有仍在等待的作用域 waterfall 会在重连后重放;单向通知仍是相互隔离的 best-effort 投递。
+- 只有仍在等待的作用域 waterfall 会在重连后回放;单向通知仍是相互隔离的 best-effort 投递,不会回放。需要可靠恢复的状态必须由拥有方提供查询、游标或初始基线。
@@ -83,4 +83,4 @@ Host entry 为每条 Client stream 独立注册 allowlist listener 和队列,
-**运行时不变式:** 不发布伴生入口。被观察的关系由 Typert 以及 Agent、Session 注册表负责。
+**运行时不变式:** 不发布伴生入口。被观察的关系由 Typert、agent 注册表和会话注册表负责。
diff --git a/packages/api/session-controller/README.i18n.yaml b/packages/api/session-controller/README.i18n.yaml
index 91888af26a..6a69e68585 100644
--- a/packages/api/session-controller/README.i18n.yaml
+++ b/packages/api/session-controller/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/api/session-controller/README.md
README.md: ef6ffb35636f9f1a87c3b30832f68540d5dcd0ea
-README.zh.md: 97949e01379446e6171debb9fb1250e8088413f8
+README.zh.md: e01b309e184280849cffbcdc8f4ea0a8b6bc9c96
diff --git a/packages/api/session-controller/README.zh.md b/packages/api/session-controller/README.zh.md
index 97949e0137..e01b309e18 100644
--- a/packages/api/session-controller/README.zh.md
+++ b/packages/api/session-controller/README.zh.md
@@ -8,7 +8,7 @@ kind: "package-reference"
## 概述
-`@deepseek-ai/dsh-api-session-controller` 拥有 Host 的 `ctx.sessionController` 服务,以及生成的 Client `session`、`skills` 和 `fileReferences` Remote namespace。它提供 Session 生命周期与历史、Host generation 模型目录、工作区路径打开、用户可调用 skill 发现和面向 Agent 的文件引用。当 Client 需要按 Session 寻址的操作时,请通过 API Gateway 使用它。
+`@deepseek-ai/dsh-api-session-controller` 拥有 Host 的 `ctx.sessionController` 服务,以及生成的 Client `session`、`skills` 和 `fileReferences` Remote namespace。它提供 Session 生命周期与历史、Host generation 模型目录、工作区路径打开、用户可调用 skill(技能)发现和 Agent(智能体)范围的文件引用。当 Client 需要按 Session 寻址的操作时,请通过 API Gateway 使用它。
## 目录
@@ -24,21 +24,21 @@ kind: "package-reference"
## 使用本包
-历史页与 follow opening snapshot 为每个持久 Session event 携带一条 `{ type: 'event', event: SessionWireEvent }` record。Client 把每条已接受 record 保留为一个持久 `SessionEventLikeEntry`;Assistant token 边界保留在 `assistant/message` 或 `assistant/attempt` 的紧凑 stream 内。工具参数、结果内容、失败信息和 `tool/result.data.meta` 原样通过;controller 不解析 Tool definition、不运行 presenter,也不附加 UI 数据。
+历史页与 follow opening 快照为每个持久 Session 事件携带一条 `{ type: 'event', event: SessionWireEvent }` record。Client 把每条已接受 record 保留为一个持久 `SessionEventLikeEntry`;Assistant token 边界保留在 `assistant/message` 或 `assistant/attempt` 的紧凑流内。工具参数、结果内容、失败信息和 `tool/result.data.meta` 原样通过;控制器不解析工具定义、不运行展示转换器,也不附加 UI 数据。
-Client journal 在发布 follow snapshot、live entry 或历史页之前验证精确的 V3 event envelope。它复用浏览器安全的 Session validator,检查必需的 surface marker、精确的 replacement endpoint、更早且唯一的 source seq、内嵌 Assistant 来源、request header 可选字段的省略规则以及 tool error 一致性。无效 record 直接失败,不删除字段或归一化;范围成员与来源存在性仍由 Host 的持久日志检查。
+Client journal 在发布 follow 快照、live entry 或历史页之前验证精确的 V3 事件 envelope。它复用浏览器安全的 Session validator,检查必需的 surface marker、精确的 replacement endpoint、更早且唯一的 source seq、内嵌 Assistant 来源、request header 省略规则以及工具错误一致性。无效 record 直接失败,不删除字段或归一化;范围成员与来源存在性仍由 Host 的持久日志检查。
-每个 endpoint 都声明自己的激活策略。列表只读取持久化 header 与 projection cache row,绝不调用逐 Session stat 或打开冷 Session body。当前格式 cache identity 可以提供全部列表 hint;生命周期匹配的 predecessor cache 只能提供版本兼容的 title,作为可能过时的展示事实,绝不能作为权威 fold seed。搜索、附件、历史页、日志跟随、skill 发现和工作区路径打开可以在不激活 Agent 的情况下检查 persistence;`canOpenWorkspacePath()` 无需指定 Session 即可报告原生打开能力。queue 变更与取消要求 live 状态;模型、重命名、prompt 和文件引用操作可以解析或恢复普通 Session。prompt 会在解析 Agent 或追加 Session event 前,拒绝既没有非空白文本也没有附件的 content;queue edit 只接受非空文本 content。prompt 准入从注入的 [`fileUploads`](../../client/file-upload/README.zh.md) Host 服务取得不透明凭证,在把完整有序内容列表交给 `ctx.attachments` 前解析每个属于同一 Agent 的凭证。`requestId` 已进入 queue 或日志时,prompt 重试直接返回原来的接受结果,不会重复插入消息。只有 create 与 fork 会直接创建新 Agent。该服务把同一套感知 preset 的恢复策略和 subagent ownership fence 同时用于自身方法,以及其他 Remote namespace 使用的 Typert Agent 与 Session lookup。Queue 变更只有一个狭窄例外:当前 projection identity 为 continuable 且来自自身非 seed suffix 的在线 child,可以在两个 inbox 目标上使用普通 Edit、Remove 与 QueueDock Steer action。One-shot、缺失、未知、损坏、仅含 seed identity 或冷 child 继续被拒绝,且不会恢复。skill 目录优先使用已有 live Agent,否则使用所记录 preset 的常驻 scope,因此列表查询绝不会启动 Agent。
+每个 endpoint 都声明自己的激活策略。列表只读取持久化 header 与 projection cache row,绝不调用逐 Session stat 或打开冷 Session body。当前格式 cache identity 可以提供全部列表 hint;生命周期匹配的 predecessor cache 只能提供版本兼容的 title,作为可能过时的展示事实,绝不能作为权威 fold seed。搜索、附件、历史页、日志跟随、skill 发现和工作区路径打开可以在不激活 Agent 的情况下检查持久化数据;`canOpenWorkspacePath()` 无需指定 Session 即可报告原生打开能力。queue 变更与取消要求 live 状态;模型、重命名、提示词和文件引用操作可以解析或恢复普通 Session。提示词会在解析 Agent 或追加 Session 事件前,拒绝既没有非空白文本也没有附件的 content;queue edit 只接受非空文本 content。提示词准入从注入的 [`fileUploads`](../../client/file-upload/README.zh.md) Host 服务取得不透明凭证,在把完整有序内容列表交给 `ctx.attachments` 前解析每个属于同一 Agent 的凭证。`requestId` 已进入 queue 或日志时,提示词重试直接返回原来的接受结果,不会重复插入消息。只有 create 与 fork 会直接创建新 Agent。该服务把同一套感知 preset 的恢复策略和 subagent ownership fence 同时用于自身方法,以及其他 Remote namespace 使用的 Typert Agent 与 Session lookup。Queue 变更只有一个狭窄例外:当前 projection identity 为 continuable 且来自自身非 seed suffix 的在线 child,可以在两个 inbox 目标上使用普通 Edit、Remove 与 QueueDock Steer action。One-shot、缺失、未知、损坏、仅含 seed identity 或冷 child 继续被拒绝,且不会恢复。skill 目录优先使用已有 live Agent,否则使用所记录 preset 的常驻 scope,因此列表查询绝不会启动 Agent。
-Client adapter 提供 `SessionEventStream`,即绑定到一个普通 Session 或 direct subagent address 的 Gateway `RemoteJournalStream`。它在读取首个 page 前打开 follow,只发布连续的 `replace`、`prepend`、`append` 与 `settle-assistant` 变更,并通过 tail page 修复重连或 seq 缺口。向后分页有两个动词:`loadOlder()` 拉一页 50 条 message,而 `loadThrough(seq)`——轮次跳转加载器——按 200 条 message 一页循环拉取直到窗口覆盖目标 seq,重复调用会下调共享目标,遇到无进展的页即停止,忙碌状态复用同一个 `loadingOlder` 快照位。Web adapter 显式选择接收无 cursor 的 Assistant frame:每个 opening 携带活跃 attempt 的 `startedAfterSeq`、`nextIndex` 与紧凑 stream,每个 stream member 都成为排在持久 cursor 之间的 Client-only `assistant/live-chunk` 条目。Host 会随该 baseline 捕获 follower 本地到达序号,并抑制该 cut 及之前的 buffered frame;replacement Agent 可以从 revision 一重新开始。活跃 opening 之后到达的持久 `assistant/message` 或 `assistant/attempt` 只有在其 seq 晚于 `startedAfterSeq` 且 Turn 与 Step 匹配时才会保持暂存;匹配的 end type、seq 与 index 会发布一个具名 settlement delta,删除该 attempt 的瞬态 row、加入持久条目,并保留同一步骤中更早的 retry。已知 attempt 的 revision、密集 index 或 settlement 缺口会重新打开 follow;若 controller 错过 start,则忽略 unknown-attempt frame,并正常发布其持久 settlement。Abandoned end 会发布不含持久条目的 settlement delta,使瞬态 row 立即退出。持久缺口修复 page 不携带 Assistant baseline,因此 held notification 会重新打开 follow 一次,以取得配对的 page 与 baseline。每条历史 record 只覆盖自身的 event seq。业务、persistence 或无法恢复的连续性错误会终止 stream,只有物理载体断开才触发自动恢复。`SessionControlStream` 是 Gateway `RemoteSnapshotStream`;每代都以完整的进程本地 baseline 开始,因此重连会替换 queue、jobs 和 projection 状态,而不会把瞬态值当作 durable event。每次 inbox 变更时,Host 会先发布 projection frame,再从同一份已校验的折叠后值派生 queue replacement,因此监听器注册顺序不会产生陈旧的 queue frame。Client Agent context 提供独立 [`fileUpload`](../../client/file-upload/README.zh.md) 服务使用的身份;Session 对象提供生命周期、prompt、queue 与历史操作,不提供文件传输。
+Client 适配器提供 `SessionEventStream`,即绑定到一个普通 Session 或 direct subagent address 的 Gateway `RemoteJournalStream`。它在读取首个 page 前打开 follow,只发布连续的 `replace`、`prepend`、`append` 与 `settle-assistant` 变更,并通过 tail page 修复重连或 seq 缺口。向后分页有两个动词:`loadOlder()` 拉一页 50 条消息,而 `loadThrough(seq)`——轮次跳转加载器——按每页 200 条消息循环拉取直到窗口覆盖目标 seq,重复调用会降低共享目标 seq,遇到无进展的页即停止,忙碌状态复用同一个 `loadingOlder` 快照位。Web 适配器显式选择接收无 cursor 的 Assistant frame:每个 opening 携带活跃 attempt 的 `startedAfterSeq`、`nextIndex` 与紧凑流,每个流成员都成为排在持久 cursor 之间的 Client-only `assistant/live-chunk` 条目。Host 会随该 baseline 捕获 follower 本地到达序号,并抑制该 cut 及之前的 buffered frame;replacement Agent 可以从 revision 一重新开始。活跃 opening 之后到达的持久 `assistant/message` 或 `assistant/attempt` 只有在其 seq 晚于 `startedAfterSeq` 且轮次与步骤匹配时才会保持暂存;匹配的 end type、seq 与 index 会发布一个具名 settlement delta,删除该 attempt 的瞬态 row、加入持久条目,并保留同一步骤中更早的 retry。已知 attempt 的 revision、密集 index 或 settlement 缺口会重新打开 follow;若控制器错过 start,则忽略 unknown-attempt frame,并正常发布其持久 settlement。Abandoned end 会发布不含持久条目的 settlement delta,使瞬态 row 立即退出。持久缺口修复 page 不携带 Assistant baseline,因此 held notification 会重新打开 follow 一次,以取得配对的 page 与 baseline。每条历史 record 只覆盖自身的事件 seq。业务、持久化或未解决的连续性故障会终止流,只有物理载体断开才触发自动恢复。`SessionControlStream` 是 Gateway `RemoteSnapshotStream`;每代都以完整的进程本地 baseline 开始,因此重连会替换 queue、jobs 和 projection 状态,而不会把瞬态值当作持久事件。每次 inbox 变更时,Host 会先发布 projection frame,再从同一份已校验的折叠后值派生 queue replacement,因此监听器注册顺序不会产生陈旧的 queue frame。Client Agent 上下文提供独立 [`fileUpload`](../../client/file-upload/README.zh.md) 服务使用的身份;Session 对象提供生命周期、提示词、queue 与历史操作,不提供文件传输。
-Session 对象还承载本地提交回显:`session.beginSubmission` 在调用方序列化与 prompt 之前,同步把一条回显写入 `SessionSnapshot.pendingSubmissions`,会话 UI 因此能在点击提交的当帧显示消息。回显按顺序存放图片预览与持久文件引用。Session 根据当前运行状态与请求的投递模式推导其 `transcript`、`queued` 或 `steering` 位置,并在序列化期间保留该位置。prompt 的 `requestId` 是关联标识:Host 把它回显为 durable user source 的 `rpcId`,queue occurrence 也把它投影为 `SessionQueuedItem.rpcId`。回显在观察到其 durable event 或 queue occurrence 后延迟一个动画帧退休,带标识的 prompt 失败或被放弃时立即退休,销毁时按 failed 退休。每次退休恰好触发一次 `onRetire`;observed 退休还会携带有序的持久附件引用,让 composer 释放成功卡片并保留失败草稿。回显只存在于 Client 内存;刷新与重连只从 durable event 重建会话。
+Session 对象还承载本地提交回显:`session.beginSubmission` 在调用方序列化与提示词之前,同步把一条回显写入 `SessionSnapshot.pendingSubmissions`,会话 UI 因此能在点击提交的当帧显示消息。回显按顺序存放图片预览与持久文件引用。Session 根据当前运行状态与请求的投递模式推导其 `transcript`、`queued` 或 `steering` 位置,并在序列化期间保留该位置。提示词的 `requestId` 是关联标识:Host 把它回显为 durable user source 的 `rpcId`,queue occurrence 也把它投影为 `SessionQueuedItem.rpcId`。回显在观察到其持久事件或 queue occurrence 后延迟一个动画帧退休,带标识的提示词失败或被放弃时立即退休,销毁时按 failed 退休。每次退休恰好触发一次 `onRetire`;因观察到对应项而退休时,还会携带有序的持久附件引用,让 composer 释放成功卡片并保留失败草稿。回显只存在于 Client 内存;刷新与重连只从持久事件重建会话。
## 会话媒体引用
-当 `connection`、`fs` 与 `attachments` 均被组合时,`SessionMediaReferences` 在鉴权 `connection.fetch` 通道上挂载 `GET|HEAD /api/file?path=<绝对路径>`。它通过 `ctx.fs` 读取普通文件,包括已注册工作区之外的临时路径与远程提供方中的文件。目录包含关系与 MIME 类别均不限制访问;`mime-types` 提供响应类型,未知扩展名使用 `application/octet-stream`。GET 复用 `readBytes` 执行读取前及读取中的字节限制;HEAD 只读取元数据。所有文件均使用 `ctx.attachments.imageLimits.maxImageBytes`(通常为 20 MiB);超过此上限返回 413。响应包含完整文件,忽略 Range,并携带 `private, no-store`、`nosniff` 与 sandbox CSP,使直接打开的 HTML/SVG 无法以 API 源身份执行脚本。客户端重写位于 `ui-chat`(`AssistantMarkdown`);音视频文件响应已可用,Markdown 音视频播放器节点仍是独立工作。
+当 `connection`、`fs` 与 `attachments` 均被组合时,`SessionMediaReferences` 在鉴权 `connection.fetch` 通道上挂载 `GET|HEAD /api/file?path=<绝对路径>`。它通过 `ctx.fs` 读取普通文件,包括已注册工作区之外的临时路径与远程提供方中的文件。目录包含关系与 MIME 类别均不限制访问;`mime-types` 提供响应类型,未知扩展名使用 `application/octet-stream`。GET 复用 `readBytes` 执行读取前及读取中的字节限制;HEAD 只读取元数据。所有文件均使用 `ctx.attachments.imageLimits.maxImageBytes`(通常为 20 MiB);超过此上限返回 413。响应包含完整文件,忽略 Range,并携带 `private, no-store`、`nosniff` 与沙箱 CSP,使直接打开的 HTML/SVG 无法以 API 源身份执行脚本。客户端重写位于 `ui-chat`(`AssistantMarkdown`);音视频文件响应已可用,Markdown 音视频播放器节点仍是独立工作。
-----
@@ -56,11 +56,11 @@ Session 对象还承载本地提交回显:`session.beginSubmission` 在调用
## 模型体验
-无,因为被调用的 Agent 命令拥有任何模型可见效果。
+无;任何模型可见效果都由被调用的 Agent 命令负责。
#### KV Cache 影响
-无直接影响;模型请求仍由 Agent 和 LLM 包拥有。
+无直接影响;模型请求仍由 Agent 和 LLM(大语言模型)包拥有。
## 已知限制与延期工作
@@ -69,7 +69,7 @@ Session 对象还承载本地提交回显:`session.beginSubmission` 在调用
- 图片字节上限不校验解码后的尺寸或像素数。
- Control baseline 表示进程本地状态,因此 Host 重启后无法重建 jobs。
- follow 恢复失败会对调用方可见,而不会无限重试。
-- 浏览器原始字节上传使用一次不带断点续传偏移的流式 HTTP 请求;重试会从第一个字节重新传输整个文件。
+- 浏览器原始字节上传使用一次不带断点续传偏移的流式 HTTP 请求;重试会从第零字节重新传输整个文件。
- 文件引用补全使用共享 Agent lookup,因此可能恢复冷 Session;`skills/list` 目录是不激活 Agent 的 skill 元数据读取路径。
diff --git a/packages/api/settings-controller/README.i18n.yaml b/packages/api/settings-controller/README.i18n.yaml
index 045d7b8753..91bfea6d7f 100644
--- a/packages/api/settings-controller/README.i18n.yaml
+++ b/packages/api/settings-controller/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/api/settings-controller/README.md
README.md: 761e4c43751675eec141a2efcf85caf52cc91590
-README.zh.md: 541c9deb3dbc35914e4e95abdda2af5cdce2bbd0
+README.zh.md: c5a59f3eebfd1e6702c2abcd2407bc2ef4e725bd
diff --git a/packages/api/settings-controller/README.zh.md b/packages/api/settings-controller/README.zh.md
index 541c9deb3d..c5a59f3eeb 100644
--- a/packages/api/settings-controller/README.zh.md
+++ b/packages/api/settings-controller/README.zh.md
@@ -8,7 +8,7 @@ kind: "package-reference"
## 概述
-`@deepseek-ai/dsh-api-settings-controller` 为浏览器配置界面提供生成的 `ctx.remote.settings` 与 `ctx.remote.credentials` namespace。它返回脱敏的 settings 与凭据元数据,支持 settings 与凭据写入而不返回密钥值,并在 Host 桌面打开由 provider 持有的 settings 或 Agent preset 位置。provider 缺失时,namespace 仍会注册,并返回可操作的配置错误。
+`@deepseek-ai/dsh-api-settings-controller` 为浏览器配置界面提供生成的 `ctx.remote.settings` 与 `ctx.remote.credentials` namespace。它返回脱敏的 settings 与凭据元数据,支持 settings 与凭据写入而不返回机密值,并在 Host 桌面打开由提供方持有的 settings 或 Agent preset 位置。提供方缺失时,namespace 仍会注册,并返回可操作的配置错误。
## 目录
@@ -23,13 +23,13 @@ kind: "package-reference"
## 使用本包
-请把本包作为 Loader entry 挂载到提供浏览器配置的 profile 中。本 entry 不依赖 provider 是否存在而注册两个 namespace,因此缺少 provider 会在调用时产生具名配置错误。它生成的 descriptor 进入严格 Typert registry,而 settings 与凭据 Definition 仍是普通 Cordis Service,自身不承担任何 wire 义务。
+请把本包作为 Loader entry 挂载到提供浏览器配置的 profile 中。本 entry 不依赖提供方是否存在而注册两个 namespace,因此缺少提供方会在调用时产生具名配置错误。它生成的 descriptor 进入严格 Typert 注册表,而 settings 与凭据 Definition 仍是普通 Cordis 服务,自身不承担任何 wire 义务。
-`describe(refs)` 以请求的名字为键返回一份 map,因此设置页描述其各行携带的全部引用时,这些行会一起落定。单次调用最多接受 64 个名字,无效名字或空写入值报告为 `bad-request`,并逐字段复制每个答案——provider 返回超出 `CredentialInfo` 声明的内容也无法扩大跨越 wire 的字段。有效的 `set(ref, value)` 与 `unset(ref)` 调用把 provider 拒绝报告为 `credential-rejected`,携带 provider 的消息,details 中只有该引用。密钥值只在这个方向跨越 wire:这里没有任何方法会返回它。
+`describe(refs)` 以请求的名字为键返回一份 map,因此设置页描述其各行携带的全部引用时,这些行会一起落定。单次调用最多接受 64 个名字,无效名字或空写入值报告为 `bad-request`,并逐字段复制每个答案——提供方返回超出 `CredentialInfo` 声明的内容也无法扩大跨越 wire 的字段。有效的 `set(ref, value)` 与 `unset(ref)` 调用把提供方拒绝报告为 `credential-rejected`,携带提供方的消息,details 中只有该引用。机密值只在这个方向跨越 wire:这里没有任何方法会返回它。
-`settings.describe()` 返回部署信息,以及在 `redactSecrets: true` 下读取的所有 namespace。`settings.update`、`settings.replace` 与 `settings.mutate` 暴露 settings service 的三种写入操作,并返回该 namespace 的新脱敏视图;过期写入使用 `settings-conflict`,其他 provider 拒绝使用 `settings-rejected`。
+`settings.describe()` 返回部署信息,以及在 `redactSecrets: true` 下读取的所有 namespace。`settings.update`、`settings.replace` 与 `settings.mutate` 暴露 settings 服务的三种写入操作,并返回该 namespace 的新脱敏视图;陈旧写入使用 `settings-conflict`,其他提供方拒绝使用 `settings-rejected`。
-`settings.openSettingsDocument()` 准备 provider 持有的文档,并用原生文本编辑器意图将其打开。`settings.canOpenAgentPresetDirectory()` 在 preset 页面显示时报告原生打开能力。`settings.openAgentPresetDirectory(id)` 只解析用户创作的 preset,并在原生打开不可用时返回目录路径;两个打开方法都不接受浏览器提供的文件系统目标。
+`settings.openSettingsDocument()` 准备提供方持有的文档,并用原生文本编辑器意图将其打开。`settings.canOpenAgentPresetDirectory()` 在 preset 页面显示时报告原生打开能力。`settings.openAgentPresetDirectory(id)` 只解析用户创作的 preset,并打开其目录,或在原生打开不可用时返回目录路径;两个打开方法都不接受浏览器提供的文件系统目标。
-----
@@ -69,4 +69,4 @@ kind: "package-reference"
-**运行时不变式:** 不发布伴生入口。settings 与 credential seam 负责存储和更新事件,本包只把它们的方法投影到 wire。
+**运行时不变式:** 不发布伴生入口。settings 与凭据 seam 负责存储和更新事件,本包只把它们的方法投影到 wire。
diff --git a/packages/api/workspace-controller/README.i18n.yaml b/packages/api/workspace-controller/README.i18n.yaml
index 7f875abbfc..17f4b90e17 100644
--- a/packages/api/workspace-controller/README.i18n.yaml
+++ b/packages/api/workspace-controller/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/api/workspace-controller/README.md
README.md: d4bff38e8bc412dcdc81acab6bd3febc3a9be448
-README.zh.md: 71cba35be30a7e8afa1da42f948624618d8fb5f2
+README.zh.md: 4bc9c92ebafcedefec345616df726a8498c9ad1b
diff --git a/packages/api/workspace-controller/README.zh.md b/packages/api/workspace-controller/README.zh.md
index 71cba35be3..4bc9c92eba 100644
--- a/packages/api/workspace-controller/README.zh.md
+++ b/packages/api/workspace-controller/README.zh.md
@@ -8,7 +8,7 @@ kind: "package-reference"
## 概述
-`@deepseek-ai/dsh-api-workspace-controller` 拥有 Host 的 `ctx.workspaceController` 服务和生成的 Client `ctx.remote.workspace` namespace。它的 Remote 方法负责创建、重命名、移除和重排 Workspace,在 Workspace 内重排 Session,从 Workspace 导航中归档 Session,以及跟随完整的 Workspace 投影。当 Client 必须修改或跟随 Workspace 导航时,请通过 API Gateway 使用它。本包同时拥有 `ctx.directoryPickerController` 与生成的 `ctx.remote.directoryPicker` namespace,因为它承载的选目录 seam 是抽象的,自身从不作为 Loader entry。
+`@deepseek-ai/dsh-api-workspace-controller` 拥有 Host 的 `ctx.workspaceController` 服务和生成的 Client `ctx.remote.workspace` namespace。它的 Remote 方法负责创建、重命名、移除和重排 Workspace,在 Workspace 内重排 Session,从 Workspace 导航中归档 Session,以及跟随完整的 Workspace 投影。当 Client 必须修改或跟随 Workspace 导航时,请通过 API 网关 使用它。本包同时拥有 `ctx.directoryPickerController` 与生成的 `ctx.remote.directoryPicker` namespace,因为它承载的选目录 seam 是抽象的,自身从不作为 Loader entry。
## 目录
@@ -22,16 +22,16 @@ kind: "package-reference"
## 使用本包
-Host 控制器会串行执行正确性取决于当前 registry 状态的变更,并为预期失败抛出带稳定 `workspace/*` 或 `directory-picker/*` 码的 `RemoteError`。它的 `follow()` 流会同步订阅持久 Workspace 变更,先发出一份完整 baseline,再按顺序发出 `upsert`、`remove`、`order` 和 `archived` 增量。重连会以替换 baseline 开始新一代,因此消费方不依赖收到断线期间的每个增量。
+Host 控制器会串行执行正确性取决于当前注册表状态的变更,并为预期失败抛出带有稳定 `workspace/*` 或 `directory-picker/*` 错误码的 `RemoteError`。它的 `follow()` 流会同步订阅持久 Workspace 变更,先发出一份完整 baseline,再按顺序发出 `upsert`、`remove`、`order` 和 `archived` 增量。重连会以替换 baseline 开始新一代,因此消费方不依赖收到断线期间的每个增量。
-Client 入口提供 `ClientWorkspaceModel` 和 `createWorkspaceStateStream()`。该模型拥有 Workspace 行、registry 顺序、已归档 Session id、一元变更回声,以及流与一元调用的竞态处理。较新的 Host 行按 `updatedAt` 获胜;已提交的流顺序优先于较旧的一元响应;已经移除的 Workspace id 不会被延迟数据复活。该包公开与框架无关的快照和订阅,把导航策略与 React hook 留给 UI owner。
+Client 入口提供 `ClientWorkspaceModel` 和 `createWorkspaceStateStream()`。该模型拥有 Workspace 行、registry 顺序、已归档 Session id、一元变更回显,以及流与一元调用的竞态处理。较新的 Host 行按 `updatedAt` 获胜;已提交的流顺序优先于较旧的一元响应;已经移除的 Workspace id 不会被延迟数据复活。该包公开与框架无关的快照和订阅,把导航策略与 React 钩子 留给 UI owner。
-----
## 模型体验
-无,因为 Workspace 组织属于浏览器与 Host 控制状态,并且不注册提示词、工具或会话事件。
+无,因为 Workspace 组织属于浏览器和 Host 的控制状态,并且不注册提示词、工具或会话事件。
#### KV Cache 影响
@@ -42,7 +42,7 @@ Client 入口提供 `ClientWorkspaceModel` 和 `createWorkspaceStateStream()`。
- `follow()` 在重连后替换完整投影,不提供持久 cursor 或增量追赶协议。
-- 进程本地删除标记只会在 Client 模型生命周期内阻止延迟数据复活已移除的 Workspace。
+- 进程内删除标记只会在 Client 模型生命周期内阻止延迟数据复活已移除的 Workspace。
@@ -55,4 +55,4 @@ Client 入口提供 `ClientWorkspaceModel` 和 `createWorkspaceStateStream()`。
-**运行时不变式:** 不发布伴生入口。Workspace Registry 负责持久化,每次流生成都是完整投影。
+**运行时不变式:** 不发布伴生入口。Workspace 注册表负责持久化,每次流生成都是完整投影。
diff --git a/packages/api/workspace-files/README.i18n.yaml b/packages/api/workspace-files/README.i18n.yaml
index 3846553f32..bb29de04ce 100644
--- a/packages/api/workspace-files/README.i18n.yaml
+++ b/packages/api/workspace-files/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/api/workspace-files/README.md
README.md: e49f5bef7291233eb688bc9aeab44e56efb3d7fa
-README.zh.md: 1d3808969ac377408801a7516978bbebd6860b62
+README.zh.md: 0b588e23f8d0849cad656fd00ae848f8696666ce
diff --git a/packages/api/workspace-files/README.zh.md b/packages/api/workspace-files/README.zh.md
index 1d3808969a..0b588e23f8 100644
--- a/packages/api/workspace-files/README.zh.md
+++ b/packages/api/workspace-files/README.zh.md
@@ -25,7 +25,7 @@ kind: "package-reference"
## 使用本包
-把本包与 `dsh-fs`、`dsh-sandbox-policy` 和 Typert Gateway 一起挂载;bundle 把它紧随 Session Controller 之后挂载。每个方法都在线路上携带 Session 身份,Client 调用 `remote.workspaceFiles.read(agent, path, range, signal)`、`stat(agent, path, signal)`、`list(agent, path, signal)` 或 `changes(agent, signal)`,从不自己指定根。
+把本包与 `dsh-fs`、`dsh-sandbox-policy` 和 Typert Gateway 一起挂载;bundle 把它紧随 Session Controller 之后挂载。每个方法都在线路上携带 Session 身份,Client 调用 `remote.workspaceFiles.read(agent, path, range, signal)`、`stat(agent, path, signal)`、`readBytes(agent, path, range, signal)`、`list(agent, path, signal)` 或 `changes(agent, signal)`,从不自己指定根。
| 方法 | 返回 | 用途 |
|---|---|---|
@@ -78,9 +78,9 @@ kind: "package-reference"
`session//` 地址携带授权 Session,以及相对或绝对路径;前导斜杠保留,例如 `dsh-resource://file/session/s//etc/hosts`。Host 原样接收路径,负责解析与权限检查;Client 不需要 Session `cwd`。`absolute/` 仍可解析,但没有授权 Session,以 `workspace-file/unknown-workspace` 失败,不借用当前或 Tab Session。不支持的地址以 `workspace-file/unsupported-address` 失败。语法由 [workspace-path](../../util/workspace-path/README.zh.md) 定义;Resource 泛型层只认地址和 `signal`。
-提供者等到 Host 的 `ready` 帧后才发首次 `stat`,读取期间将变更排队,随后将跟随者绑定到 `stat.absolutePath`。排队与实时变更都按该 Host 返回路径匹配。新的写入版本更新元数据并保留最近的字节大小;重复版本被忽略。消失通知会重新 stat 文件。stat 失败后仍跟随地址,后续写入可使其恢复;首次成功绑定路径前,Session 内任何写入都可触发重试。帧是 `RemoteResult` 值,编程异常不被捕获。
+提供方等到 Host 的 `ready` 帧后才发首次 `stat`,读取期间将变更排队,随后将跟随者绑定到 `stat.absolutePath`。排队与实时变更都按该 Host 返回路径匹配。新的写入版本更新元数据并保留最近的字节大小;重复版本被忽略。消失通知会重新 stat 文件。stat 失败后仍跟随地址,后续写入可使其恢复;首次成功绑定路径前,Session 内任何写入都可触发重试。帧是 `RemoteResult` 值,编程异常不被捕获。
-每个 Session 的所有被跟随文件共用一条受监督的 `changes` 流。跟随者按反斜杠归一为斜杠的绝对路径匹配。载体掉线由 Gateway 监督器重连;Host 结束或终态失败的流会结束其跟随者,最后的元数据仍可读取,直到重新打开。最后一个跟随者离开时释放流,后继流等待该释放完成,插件拆除等待所有在途关闭。提供者声明 `ResourceProtocolMap.file`;文本预览声明其 Sidebar 行号导航参数。
+每个 Session 的所有被跟随文件共用一条受监督的 `changes` 流。跟随者按反斜杠归一为斜杠的绝对路径匹配。载体掉线由 Gateway 监督器重连;Host 结束或终态失败的流会结束其跟随者,最后的元数据仍可读取,直到重新打开。最后一个跟随者离开时释放流,后继流等待该释放完成,插件拆除等待所有在途关闭。提供方声明 `ResourceProtocolMap.file`;文本预览声明其 Sidebar 行号导航参数。
-----
@@ -114,7 +114,7 @@ Typert 生成 `./typert` 与 `./remote` 暴露的 Host 与 Client Remote 产物
## 进一步探索
-- [文件系统能力](../../fs/fs/README.zh.md)——本服务经由读取的 `ctx.fs` 契约,含 `fs/observed` 与 `readByteRange`。
+- [文件系统能力](../../fs/fs/README.zh.md)——本服务经由读取的 `ctx.fs` 约定,含 `fs/observed` 与 `readByteRange`。
- [沙箱策略](../../sandbox/sandbox-policy/README.zh.md)——Session 工作区根的来源。
- [Remote 装配](../../api/remotes/README.zh.md)——Client 包如何触达 `workspaceFiles` 命名空间。
- [Client 资源](../../client/resources/README.zh.md)——资源模型、`useResource`、pin 与提供者生命周期。
diff --git a/packages/attachment/README.i18n.yaml b/packages/attachment/README.i18n.yaml
index 1c6b007c86..908d76705b 100644
--- a/packages/attachment/README.i18n.yaml
+++ b/packages/attachment/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/attachment/README.md
-README.md: c1afde5f4bd44371fdc5417ad087456dfaa4f054
-README.zh.md: 568d9dc93b7a60d9c346fc8d9cd931d92bdecf35
+README.md: 924482b79052ba9e26bb49aac0d05121e78ac083
+README.zh.md: d42d085914030cff32c2937af4bf573b7578cc35
diff --git a/packages/attachment/README.md b/packages/attachment/README.md
index c1afde5f4b..924482b790 100644
--- a/packages/attachment/README.md
+++ b/packages/attachment/README.md
@@ -36,7 +36,7 @@ These two packages provide durable image attachments; each README describes what
Start with the subsystem reference for the service contract, then the capability-seam table and the configuration surface of the local backend.
-- [Attachment subsystem reference](../../docs/subsystems/attachment.md) — service contract, payload types, and the `ctx.attachments` cordis surface.
+- [Attachment subsystem reference](../../docs/subsystems/attachment.md) — service contract, payload types, and the `ctx.attachments` Cordis surface.
- [Capability seams](../../docs/capability-seams.md) — the Service Definition / Service Provider / Consumer split this family follows.
- [Generated configuration catalog](../../docs/config-catalog.md#deepseek-aidsh-attachment-local) — every accepted field of the local backend.
diff --git a/packages/attachment/README.zh.md b/packages/attachment/README.zh.md
index 568d9dc93b..d42d085914 100644
--- a/packages/attachment/README.zh.md
+++ b/packages/attachment/README.zh.md
@@ -36,7 +36,7 @@ kind: "package-group"
先从子系统参考了解服务约定,再看能力 seam 表与本地后端的配置面。
-- [附件子系统参考](../../docs/subsystems/attachment.zh.md)——服务约定、载荷类型与 `ctx.attachments` 的 cordis 接口面。
+- [附件子系统参考](../../docs/subsystems/attachment.zh.md)——服务约定、载荷类型与 `ctx.attachments` 的 Cordis 接口面。
- [能力 seam](../../docs/capability-seams.zh.md)——本家族遵循的 Service Definition / Service Provider / Consumer 拆分。
- [生成配置目录](../../docs/config-catalog.zh.md#deepseek-aidsh-attachment-local)——本地后端的每个受支持字段。
diff --git a/packages/attachment/attachment-local/README.i18n.yaml b/packages/attachment/attachment-local/README.i18n.yaml
index f6a61238ee..ebacfdd1df 100644
--- a/packages/attachment/attachment-local/README.i18n.yaml
+++ b/packages/attachment/attachment-local/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/attachment/attachment-local/README.md
-README.md: d4b8037c5e5cdcd9cd39302422d74ef854fb0890
-README.zh.md: 37d03f5edda1311f51968fe66f928cb19886514c
+README.md: a14490f855268cdaa65bc0d3d8968ece56d25bf3
+README.zh.md: 44e8205dfdc7debd625c1ad4819f56bcfbe94728
diff --git a/packages/attachment/attachment-local/README.md b/packages/attachment/attachment-local/README.md
index d4b8037c5e..a14490f855 100644
--- a/packages/attachment/attachment-local/README.md
+++ b/packages/attachment/attachment-local/README.md
@@ -110,7 +110,7 @@ Generic-file bytes have one canonical object at `/attachments/v1/file-
For the full service contract and payload types, read the subsystem reference; for the capability this storage backs, read the seam package.
-- [Attachment subsystem reference](../../../docs/subsystems/attachment.md) — service contract, payload types, and the `ctx.attachments` cordis surface.
+- [Attachment subsystem reference](../../../docs/subsystems/attachment.md) — service contract, payload types, and the `ctx.attachments` Cordis surface.
- [Attachment seam package](../attachment/README.md) — the image attachment capability this storage backs.
- [Generated configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-attachment-local) — every accepted config field and its source declaration.
- [Home paths resolution](../../util/home-paths/README.md) — how `DSH_HOME` resolves from explicit config, environment, and the user home.
diff --git a/packages/attachment/attachment-local/README.zh.md b/packages/attachment/attachment-local/README.zh.md
index 37d03f5edd..44e8205dfd 100644
--- a/packages/attachment/attachment-local/README.zh.md
+++ b/packages/attachment/attachment-local/README.zh.md
@@ -29,7 +29,7 @@ kind: "package-reference"
### 最小配置
-挂载插件,无需任何必填配置。下表默认值定义你可以附加什么;生成的配置目录是每个字段的穷尽式真源。
+挂载插件,无需任何必填配置。下列默认值规定了可以附加的内容;生成的配置目录完整列出了所有字段。
```yaml
- name: '@deepseek-ai/dsh-attachment-local'
@@ -41,14 +41,14 @@ kind: "package-reference"
| `maxImageBytes` | `20 MiB` | 单张图片接受的最大编码源字节数 |
| `maxImagesPerMessage` | `20` | 单条提交消息接受的最大图片数量 |
| `maxMessageImageBytes` | `200 MiB` | 单条提交消息接受的最大编码源图字节总数 |
-| `maxImagePixels` | `64,000,000` | 源图接受的最大宽度乘以高度 |
+| `maxImagePixels` | `64,000,000` | 源图宽度与高度乘积的最大值 |
| `maxImageDimension` | `8192` | 源图接受的最大宽度或高度 |
| `normalizedImageMaxPixels` | `2048 × 2048` | 已存规范化图片的总像素预算 |
| `normalizedImageMaxDimension` | `8192` | 应用总像素预算后的最大长边 |
| `normalizedImageMaxBytes` | `4 MiB` | 编码字节目标;没有候选满足时保留质量阶梯中的最小输出 |
| `imageCompressionConcurrency` | `2` | 并发规范化与请求变换的 FIFO 上限 |
-生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-attachment-local)是每个受支持字段及其 JSDoc 的穷尽式真源。
+生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-attachment-local)完整列出了所有受支持的字段及其 JSDoc。
### 图片存储在哪里、会保留多久
@@ -81,11 +81,11 @@ kind: "package-reference"
### 写入与读取路径
-对象存放在 `/attachments/v1/objects//`;相同字节会去重为同一个对象和同一个 `sha256:` 标识符。首次写入前,进程会把 home 的每个祖先目录逐级同步到文件系统根目录,因此绝不会把另一个进程已创建但尚未同步的目录误认为安全边界。随后,写入过程把字节暂存到 `v1/tmp`、同步临时文件、以原子且排他的硬链接发布,并同步发布目录——在 Windows 上,文件系统元数据日志负责目录项持久性。保存成功后,已报告的引用即持久。
+对象存放在 `/attachments/v1/objects//`;相同字节会去重为同一个对象和同一个 `sha256:` 标识符。首次写入前,进程会把 home 的每个祖先目录逐级同步到文件系统根目录,因此绝不会把另一个进程已创建但尚未同步的目录误认为安全边界。随后,写入过程把字节暂存到 `v1/tmp`、同步临时文件、以原子且排他的硬链接发布,并同步发布目录——在 Windows 上,文件系统元数据日志负责目录项持久性。保存操作完成后,返回的引用已具备持久性。
-准入允许每条消息最多 20 张图片与 200 MiB 源字节;单个源图最多 20 MiB、6400 万像素与单边 8192 像素。系统应用方向、移除元数据与色彩配置,并把规范化结果限制在 2048×2048 总像素预算、8192 像素长边和 4 MiB 编码字节目标内,因此极端宽高比会保留短边分辨率。已经满足限制的干净、单帧、8-bit sRGB/sRGBA PNG、JPEG 或 WebP 会逐字节直通;GIF、动画、元数据、方向、16-bit PNG 与不兼容色彩空间会触发转换。
+准入允许每条消息最多 20 张图片与 200 MiB 源字节;单个源图最多 20 MiB、6400 万像素与单边 8192 像素。系统应用方向、移除元数据与色彩配置,并把规范化结果限制在 2048×2048 总像素预算、8192 像素长边和 4 MiB 编码字节目标内,因此,即使宽高比极端,图片也会保留短边分辨率。已经满足限制的干净、单帧、8-bit sRGB/sRGBA PNG、JPEG 或 WebP 会逐字节直通;GIF、动画、元数据、方向、16-bit PNG 与不兼容色彩空间会触发转换。
-请求版本位于 `/attachments/v1/request-images/`。`readImageRequest` 在不放大的前提下缩放到路由像素预算,再通过相同的 alpha 路由与质量阶梯应用独立编码字节目标。缓存身份包含附件 id、变换版本、预算与固定编码参数;缓存字节会先探测格式、8-bit sRGB/sRGBA、尺寸与 alpha 信息,不匹配时重新生成。并发调用方共享一次变换与缓存写入,且只在没有等待方时由取消停止共享工作。`imageHostPath` 派生规范化对象的宿主路径,挂载的文件系统可以把该路径映射进执行世界,而不会写入持久历史。
+请求版本位于 `/attachments/v1/request-images/`。`readImageRequest` 在不放大的前提下缩放到路由像素预算,再通过相同的 alpha 路由与质量阶梯应用独立编码字节目标。缓存身份包含附件 id、变换版本、预算与固定编码参数;缓存字节会先通过文件头探测格式、8-bit sRGB/sRGBA、尺寸与 alpha 信息,不匹配时重新生成。并发调用方共享一次变换与缓存写入,且只在没有等待方时由取消停止共享工作。`imageHostPath` 派生规范化对象的宿主路径,挂载的文件系统可以把该路径映射进执行世界,而不会写入持久历史。
通用文件字节的唯一规范对象位于 `/attachments/v1/file-objects//`。每条引用路径 `/attachments/v1/files///` 都是只读硬链接,所以名称不同但字节相同的文件不会重复占用磁盘。`readFileStream` 以有界分块读取引用路径,并在消费方成功结束前校验完整摘要与记录的字节数。对象缺失、被改写或截断时,消费方会失败,不会得到字节已经变化的完整导出。
@@ -110,7 +110,7 @@ kind: "package-reference"
完整的服务约定与载荷类型请看子系统参考;这份存储所支撑的能力请看 seam 包。
-- [附件子系统参考](../../../docs/subsystems/attachment.zh.md)——服务约定、载荷类型与 `ctx.attachments` 的 cordis 接口面。
+- [附件子系统参考](../../../docs/subsystems/attachment.zh.md)——服务约定、载荷类型与 `ctx.attachments` 的 Cordis 接口面。
- [附件 seam 包](../attachment/README.zh.md)——本存储支撑的图片附件能力。
- [生成配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-attachment-local)——每个受支持配置字段及其源声明。
- [Home 路径解析](../../util/home-paths/README.zh.md)——`DSH_HOME` 如何从显式配置、环境变量与用户主目录解析。
@@ -135,8 +135,8 @@ kind: "package-reference"
- **图片会永久保留**——已存储的图片永远不会被自动删除,也没有任何机制回收未被引用的对象。
- **仅限本机**——图片存放在运行 harness 的机器上;其他主机无法读取。
-- **动态 GIF 变为静态**——规范化只保留第一帧;动画不属于版本一图片约定。
-- **编码器输出带版本**——已安装的 Sharp/libvips 构建钉定规范化与请求字节;编码器或变换版本升级会让未来变体产生新地址,已有对象继续有效。
+- **动态 GIF 变为静态**——规范化只保留第一帧;动画不属于第一版图片约定。
+- **编码器输出带版本**——已安装的 Sharp/libvips 构建会固定规范化结果与请求字节;编码器或变换版本升级会让未来变体产生新地址,已有对象继续有效。
### 开发备注
diff --git a/packages/attachment/attachment/README.i18n.yaml b/packages/attachment/attachment/README.i18n.yaml
index 9924b1e0d2..6a5e2093df 100644
--- a/packages/attachment/attachment/README.i18n.yaml
+++ b/packages/attachment/attachment/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/attachment/attachment/README.md
-README.md: fc3903cb1ab4ed4a1249ad2ec62c0df633f4a7c4
-README.zh.md: 9e84a5ed8889d541b3cb87fb5e5d5560d36a2bb5
+README.md: 35fde71833fa13b26662244cfa68cec17b90b663
+README.zh.md: b0e98d1e4a0c35082a8eef23f69659f47916d3f7
diff --git a/packages/attachment/attachment/README.md b/packages/attachment/attachment/README.md
index fc3903cb1a..35fde71833 100644
--- a/packages/attachment/attachment/README.md
+++ b/packages/attachment/attachment/README.md
@@ -94,7 +94,7 @@ The service family runs one admission-and-storage flow: every entry point enforc
For the full service contract and payload types, read the subsystem reference; for the storage that backs this capability, read the local backend.
-- [Attachment subsystem reference](../../../docs/subsystems/attachment.md) — service contract, payload types, and the `ctx.attachments` cordis surface.
+- [Attachment subsystem reference](../../../docs/subsystems/attachment.md) — service contract, payload types, and the `ctx.attachments` Cordis surface.
- [Local filesystem backend](../attachment-local/README.md) — where your attached images are stored on this machine.
- [Capability seams](../../../docs/capability-seams.md) — how this capability family is split into roles.
@@ -114,7 +114,7 @@ Adding an image changes the provider request and therefore invalidates the affec
-These limits describe what image attachments can and cannot do; they are current package constraints, not a task backlog.
+These limits describe what attachments can and cannot do; they are current package constraints, not a task backlog.
- **Raster image limits apply to images only** — PNG, JPEG, WebP, and GIF are accepted as images under deployment limits; every other file is stored verbatim with no type or size limit, and audio and video have no dedicated handling yet.
- **Attachments are never deleted** — stored images and files are retained indefinitely; nothing removes them automatically.
diff --git a/packages/attachment/attachment/README.zh.md b/packages/attachment/attachment/README.zh.md
index 9e84a5ed88..b0e98d1e4a 100644
--- a/packages/attachment/attachment/README.zh.md
+++ b/packages/attachment/attachment/README.zh.md
@@ -41,7 +41,7 @@ kind: "package-reference"
### 把附件传给命令
-声明接受附件的命令会按选择顺序接收图片与通用文件。不接受附件的命令会返回错误,并保留 composer 的草稿与附件卡。
+声明接受附件的命令会按选择顺序接收图片与通用文件。不接受附件的命令会返回错误,并保留输入区的草稿与附件卡。
### 在整个会话中复用图片
@@ -65,14 +65,14 @@ kind: "package-reference"
- **事件前完成规范化与持久化。** 每个源图都会在批次按序发布前完成准备与校验,因此会话日志绝不会引用部分完成或规范化失败的对象。
- **不可变且保留策略中立。** 对象一经发布即不可变;恢复和 fork 后的会话可能共享它们,因此引用感知的垃圾回收被推迟,而不是与任何单个会话的删除绑定。
-- **读取时校验。** 读取在返回前把字节和元数据与记录的引用比对,请求投影还会完整解码缓存字节,因此缺失、损坏或被替换的对象都会失败关闭。
+- **读取时校验。** 读取在返回前把字节和元数据与记录的引用比对,请求投影还会完整解码缓存字节,因此缺失、损坏或被替换的对象不会通过校验。
- **角色无关的图片块。** `dsh-llm` 中的 `ImageBlock` 内容块携带 `ImageAttachmentRef`;提供方适配器以显式像素与字节预算把引用解析为确定性请求版本,执行文件系统则可以把不可变宿主对象映射为模型可读的进程路径。
- **按错误码路由。** `AttachmentError` 重新实现 `HarnessError` 的结构而不是继承它,因为基类位于 `dsh-llm`,而后者依赖本包;消费方用 `isAttachmentError` 识别错误并按 `code` 路由,绝不依赖原型链。
-- **文件原样,图片规范化。**`saveFile` 提交已有字节数组,`saveFileStream` 以背压和取消语义提交有界分块,`readFileStream` 校验并返回有界分块,`fileHostPath` 定位存储对象供按需读取投影;两种文件写入路径都不设准入限制。图片路径保留其独立的规范化、限额与请求版本流水线。`dsh-llm` 中的 `FileBlock` 内容块承载 `FileAttachmentRef`,请求组装把它对每条路由都投影成确定性 handle 文本。
+- **文件原样,图片规范化。**`saveFile` 提交已有字节数组,`saveFileStream` 以背压和取消语义提交有界分块,`readFileStream` 校验并返回有界分块,`fileHostPath` 定位存储对象供按需读取投影;两种文件写入路径都不设准入限制。图片路径保留其独立的规范化、限额与请求版本流水线。`dsh-llm` 中的 `FileBlock` 内容块承载 `FileAttachmentRef`,请求组装会为每条路由将其投影为确定性的句柄文本。
### 服务操作
-服务族运行同一条准入与存储流程:每个入口都强制执行源批次限制与规范 base64,在发布任何成员前准备提供方无关的规范化附件,再按输入顺序持久提交而不产生部分结果。Host prompt 消费方把有序文本、编码图片和已经解析的文件引用交给 `ctx.attachments.admitPromptContent()`;该方法持久化图片,并让文件引用原样通过。编码协议适配器调用 `ctx.attachments.admitEncodedFile()`,由该方法检查规范 base64 后委托给 `saveFile`;适配器通过 `ctx.attachments.isAttachmentError()` 识别附件错误。通用文件调用方可以用 `saveFile` 提交已有字节,或用 `saveFileStream` 提交有界异步字节源;两者返回相同的持久引用,`readFileStream` 则在有界读取过程中校验摘要与长度。`readImageRequest` 派生确定性的路由尺寸变体,其身份包含附件 id、变换版本、像素与字节预算及编码参数。纯函数导出 `requestImageDimensions` 会按总像素预算计算每个投影保持宽高比的尺寸,使提供方与请求定价共享同一套几何计算。`imageHostPath` 只向需要执行世界映射的受信任同进程消费方暴露实现拥有的宿主位置。调用方组合有序批次,而实现拥有压缩并发、缓存与 singleflight。读取、流式写入和投影保留调用方的取消语义。失败带有稳定且机器可读的错误码,运行时即可识别可由调用方修正的准入子集,让每个协议适配器映射自己的词汇;各操作的确切约定见 [`src/index.ts`](src/index.ts) 与 [`src/error.ts`](src/error.ts)。
+服务族运行同一条准入与存储流程:每个入口都强制执行源批次限制与规范 base64,在发布任何成员前准备提供方无关的规范化附件,再按输入顺序持久提交而不产生部分结果。Host 提示词消费方把有序文本、编码图片和已经解析的文件引用交给 `ctx.attachments.admitPromptContent()`;该方法持久化图片,并让文件引用原样通过。编码协议适配器调用 `ctx.attachments.admitEncodedFile()`,由该方法检查规范 base64 后委托给 `saveFile`;适配器通过 `ctx.attachments.isAttachmentError()` 识别附件错误。通用文件调用方可以用 `saveFile` 提交已有字节,或用 `saveFileStream` 提交有界异步字节源;两者返回相同的持久引用,`readFileStream` 则在有界读取过程中校验摘要与长度。`readImageRequest` 派生确定性的路由尺寸变体,其身份包含附件 id、变换版本、像素与字节预算及编码参数。纯函数导出 `requestImageDimensions` 会按总像素预算计算每个投影保持宽高比的尺寸,使提供方与请求定价共享同一套几何计算。`imageHostPath` 只向需要把该位置映射到执行环境的受信任同进程消费方暴露实现拥有的宿主位置。调用方组合有序批次,而实现负责管理压缩并发、缓存与 singleflight。读取、流式写入和投影保留调用方的取消语义。失败带有稳定且机器可读的错误码,运行时即可识别可由调用方修正的准入子集,让每个协议适配器映射自己的词汇;各操作的确切约定见 [`src/index.ts`](src/index.ts) 与 [`src/error.ts`](src/error.ts)。
### 源码地图
@@ -83,7 +83,7 @@ kind: "package-reference"
| [`src/admission.ts`](src/admission.ts) | 对编码图片和文件上传强制执行规范 base64 并委托存储 |
| [`src/error.ts`](src/error.ts) | `AttachmentError` 类与 `isImageAdmissionError` 运行时子集 |
| [`src/brand.ts`](src/brand.ts) | `AttachmentId` 带类型标记的不透明标识符 |
-| — | 不发布运行时不变式伴生入口;实现负责强制不可变存储检查。 |
+| — | 不发布运行时不变式伴生入口;这个无状态 seam 承载类型,实现则负责强制执行不可变存储检查。 |
@@ -94,7 +94,7 @@ kind: "package-reference"
完整的服务约定与载荷类型请看子系统参考;支撑这一能力的存储请看本地后端。
-- [附件子系统参考](../../../docs/subsystems/attachment.zh.md)——服务约定、载荷类型与 `ctx.attachments` 的 cordis 接口面。
+- [附件子系统参考](../../../docs/subsystems/attachment.zh.md)——服务约定、载荷类型与 `ctx.attachments` 的 Cordis 接口面。
- [本地文件系统后端](../attachment-local/README.zh.md)——你的附加图片在本机上的存储位置。
- [能力 seam](../../../docs/capability-seams.zh.md)——本能力家族如何拆分为多个角色。
@@ -103,7 +103,7 @@ kind: "package-reference"
## 模型体验
-该包通过提供方适配器间接影响模型;适配器会把每个持久图片引用解析为确切请求版本,并在图片旁发送稳定附件 id 与实际尺寸。执行文件系统可以映射已存对象时,描述符还会包含只读进程路径,以及可写副本使用的匹配扩展名。通用文件的字节永远不会到达提供方:每条路由都收到一行确定性 handle 文本,指出文件名、字节数、摘要前缀,以及供文件工具读取的只读保存路径。
+该包通过提供方适配器间接影响模型;适配器会把每个持久图片引用解析为确切请求版本,并在图片旁发送稳定附件 id 与实际尺寸。执行文件系统可以映射已存对象时,描述符还会包含只读进程路径,以及可写副本使用的匹配扩展名。通用文件的字节永远不会到达提供方:每条路由都收到一行确定性的句柄文本,指出文件名、字节数、摘要前缀,以及供文件工具读取的只读保存路径。
#### KV Cache 影响
@@ -134,6 +134,6 @@ kind: "package-reference"
#### 未来:音频、视频与助手侧输出
-音频与视频需要原样文件路径之外的专门生命周期与提供方契约;角色无关的 `ImageBlock` 也把助手侧图片输出留作前瞻兼容——当前生产适配器声明只输出文本,因此只有用户内容携带图片。两个方向都尚未决定。
+音频与视频需要原样文件路径之外的专门生命周期与提供方约定;角色无关的 `ImageBlock` 也为助手侧图片输出保留向前兼容空间——当前生产适配器声明只输出文本,因此只有用户内容携带图片。两个方向都尚未决定。
diff --git a/packages/boot/README.i18n.yaml b/packages/boot/README.i18n.yaml
index d7350a09a7..e00d4c7d2e 100644
--- a/packages/boot/README.i18n.yaml
+++ b/packages/boot/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/boot/README.md
README.md: 64a118a4a243d21508407ea28686fba4fd0772bd
-README.zh.md: a092a5840cd0fd26543a2221d1aa5ca13ea5d352
+README.zh.md: 43ad77dd7e25f437d0170d029be1ec60374c4546
diff --git a/packages/boot/README.zh.md b/packages/boot/README.zh.md
index a092a5840c..43ad77dd7e 100644
--- a/packages/boot/README.zh.md
+++ b/packages/boot/README.zh.md
@@ -9,7 +9,7 @@ kind: "package-group"
## 概述
-boot 组提供每个 dsh app bin 启动所需的全部能力:`app-boot` 把 `cordis.yml` 连同你的环境与 patch 层变成运行中的应用,并给出清晰的失败信息;`cmdline` 让应用持有自己的命令行 flag 与 `--help`。借助这些包,你可以运行 `dsh`,也可以编写以同样方式启动的新应用或测试 fixture。两者都是 `apps/cli` 与测试专用 Loader fixture 导入的库,绝不是组合加载的插件。本页是组的映射;各包 README 负责各自的包级约定。
+boot 组提供每个 dsh app bin 启动所需的全部能力:`app-boot` 把 `cordis.yml` 连同你的环境与 patch 层变成运行中的应用,并给出清晰的失败信息;`cmdline` 让应用持有自己的命令行 flag 与 `--help`。借助这些包,你可以运行 `dsh`,也可以编写以同样方式启动的新应用或测试用 fixture(测试前置数据)。两者都是 `apps/cli` 与测试专用 Loader fixture 导入的库,绝不是组合加载的插件。本页列出该包组的构成;各包 README 负责各自的包级约定。
## 目录
diff --git a/packages/boot/app-boot/README.i18n.yaml b/packages/boot/app-boot/README.i18n.yaml
index 3d4666ea0d..ad7e723d4c 100644
--- a/packages/boot/app-boot/README.i18n.yaml
+++ b/packages/boot/app-boot/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/boot/app-boot/README.md
README.md: df386b64089f962960b09538381e9d4b4905feb0
-README.zh.md: 5a7246c52ea5bcc8d5322d9fac4a87ec2e2ef4cc
+README.zh.md: 2698aa248e97db0aac53fd4a2e8bea1adaa3179a
diff --git a/packages/boot/app-boot/README.zh.md b/packages/boot/app-boot/README.zh.md
index 5a7246c52e..2698aa248e 100644
--- a/packages/boot/app-boot/README.zh.md
+++ b/packages/boot/app-boot/README.zh.md
@@ -9,7 +9,7 @@ kind: "package-library"
## 概述
-`dsh-app-boot` 是 `dsh` profile(包括 Python 运行时 wheel 所打包的 CLI)背后的共享 Loader 启动库。它加载环境层、组合 profile bundle 与 patch、启动每个插件,再返回运行中的应用,或指出失败插件与原因。产品应用使用 `dsh` launcher 而不发布单独 bin;直接配置 helper 只保留给低层嵌入方与测试。你还可以在启动前预览生效配置,按 profile 选择实时或仅启动时应用 patch,并让持有终端的应用在致命退出前恢复终端。
+`dsh-app-boot` 是 `dsh` profile(包括 Python 运行时 wheel 包所含的 CLI(命令行界面))背后的共享 Loader 启动库。它加载环境层、组合 profile 组合包与 patch、启动每个插件,再返回运行中的应用,或指出失败插件与原因。产品应用使用 `dsh` launcher 而不发布单独 bin;直接配置 helper 只保留给低层嵌入方与测试。你还可以在启动前预览生效配置,按 profile 选择实时或仅启动时应用 patch,并让持有终端的应用在致命退出前恢复终端。
## 目录
@@ -29,7 +29,7 @@ kind: "package-library"
### 何时使用
-在实现共享 `dsh` launcher 或嵌入其低层启动 helper 时使用它。产品功能应放入 profile bundle,而不是新增应用 bin;只向已运行应用添加插件的代码直接挂载插件即可。
+在实现共享 `dsh` launcher 或嵌入其低层启动 helper 时使用它。产品功能应放入 profile 组合包,而不是新增应用 bin;只向已运行应用添加插件的代码直接挂载插件即可。
### 启动应用
@@ -45,16 +45,16 @@ const ctx = await boot('dsh', resolveConfigPath(argv[2], process.env.DSH_SNAPSHO
### Profile
-Profile 与 bundle 的声明类型从 [`@deepseek-ai/dsh-package-manifest`](../../util/package-manifest/README.zh.md) 导入。App-boot 负责 profile 加载、JSON 校验和解析后的运行时数据。
+Profile 与组合包的声明类型从 [`@deepseek-ai/dsh-package-manifest`](../../util/package-manifest/README.zh.md) 导入。App-boot 负责 profile 加载、JSON 校验和解析后的运行时数据。
-profile 是同一套 dsh 安装提供不同应用界面的方式:`web`、`headless`、`acp`、`sdk` 与 `sdk-minimal` 从同一 launcher 启动不同组合。profile 位于 `$DSH_HOME/profiles/`,由可安装 bundle、自身 `cordis.patch.yml` 与 `patchReload: live | startup` 组成;自定义 profile 省略 reload 策略时保留历史 `live` 默认值。随产品交付的 `web` 模板实时重载,其他随附模板只在启动时应用 patch。`sdk-minimal` 只列出自身的独立 bundle,其他模板保留 base 加模式 bundle 的栈。`dsh --profile --from-default-profile ` 从一个随附模板,在新的非内置名称处创建自定义 profile;`dsh plugin` 则初始化以 base 为基础的 profile,并管理其中安装的 bundle。缺失 bundle 或未声明 patch 的 bundle 会让启动明确失败。由应用持有的 npm 项目(例如 Electron 保留的 Desktop profile)通过 `loadProfileDirectory` 加载已经初始化的目录,而不会将它暴露给 CLI profile 查找。
+profile 是同一套 dsh 安装提供不同应用界面的方式:`web`、`headless`、`acp`、`sdk` 与 `sdk-minimal` 从同一 launcher 启动不同组合。profile 位于 `$DSH_HOME/profiles/`,由可安装组合包、自身 `cordis.patch.yml` 与 `patchReload: live | startup` 组成;自定义 profile 省略 reload 策略时保留历史 `live` 默认值。随产品交付的 `web` 模板实时重载,其他随附模板只在启动时应用 patch。`sdk-minimal` 只列出自身的独立组合包,其他模板保留 base 加模式的组合包栈。`dsh --profile --from-default-profile ` 从一个随附模板,在新的非内置名称处创建自定义 profile;`dsh plugin` 则初始化以 base 为基础的 profile,并管理其中安装的组合包。缺失组合包或未声明 patch 的组合包会让启动明确失败。由应用持有的 npm 项目(例如 Electron 保留的 Desktop profile)通过 `loadProfileDirectory` 加载已经初始化的目录,而不会将它暴露给 CLI profile 查找。
你的机器本地偏好同样位于 harness home 中:
-- **`.env`**——你的普通环境层:调用目录的文件优先于 harness home 的文件,两者都低于继承环境。决定进程如何启动的变量(`PATH`、`DSH_*`、`XDG_*` 等)会被文件拒绝:请改为导出。四个代理名(`HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY`、`NO_PROXY`)只从 harness home 的文件接受,绝不从调用目录的文件接受——后者随 clone 一起到来。对于只想加载某个目录 `.env` 的非产品 bin,文件缺失不影响启动,文件无法加载时输出一行带标签的警告。
-- **`cordis.patch.yml`**——你的 tweak 层,应用在所有组合包层之后(先应用逐 profile 的文件,再应用 home 级文件,因此后者优先级更高):替换某个条目的整个 config(重述你要保留的字段)、插入新条目,或在启动时插值 `!!js` 表达式。patch 指定的条目不存在时输出 stderr 警告;空文件或仅含注释的文件会导致启动失败——如需禁用该层,请改用 `[]`。
+- **`.env`**——你的普通环境层:调用目录的文件优先于 harness home 的文件,两者都低于继承环境。在文件中设置的进程启动变量(如 `PATH`、`DSH_*`、`XDG_*`)会被拒绝:请改为导出这些变量。四个代理名(`HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY`、`NO_PROXY`)只从 harness home 的文件接受,绝不从调用目录的文件接受——后者随 clone 一起到来。对于只想加载某个目录 `.env` 的非产品 bin,文件缺失不影响启动,文件无法加载时输出一行带标签的警告。
+- **`cordis.patch.yml`**——你的 tweak 层,应用在所有组合包层之后(先应用逐 profile 的文件,再应用 home 级文件,因此后者优先级更高):替换某个条目的整个配置(重述你要保留的字段)、插入新条目,或在启动时插值 `!!js` 表达式。patch 指定的条目不存在时输出 stderr 警告;空文件或仅含注释的文件会导致启动失败——如需禁用该层,请改用 `[]`。
-带 `patchReload: live` 的 profile 会监视两份用户 patch 文件:有效编辑无需重启即可重新组合,被拒绝的编辑则让最后一个可用应用继续运行。`startup` profile 既不安装这些监视器,也不安装 launcher 的仅监视 HMR 回退。
+带 `patchReload: live` 的 profile 会监视两份用户 patch 文件:有效编辑无需重启即可重新组合,被拒绝的编辑则让最后一个可用应用继续运行。`startup` profile 既不安装这些监视器,也不安装 launcher 的仅监视 HMR(热模块替换)回退。
插入条目的插件名可以是绝对文件系统路径、文件 URL 或包标识符。patch 加载会把 `insert` 条目及其嵌套分组中的绝对路径以及相对于 patch 文件的 `./` 或 `../` 路径转换为文件 URL;对已有条目名称的断言及替换用的 `config` 值保持原样。
@@ -64,11 +64,11 @@ profile 是同一套 dsh 安装提供不同应用界面的方式:`web`、`head
### 启动失败时你会看到什么
-启动失败是一行带标签的信息加非零退出码——绝不是静默卡死或原始堆栈倾倒。信息会点名失败的插件;抛错的插件保留原始错误,从未启动的条目会连同它等待的服务一起报告。
+启动失败是一行带标签的信息加非零退出码——绝不是静默卡死或原始堆栈转储。信息会点名失败的插件;抛错的插件保留原始错误,从未启动的条目会连同它等待的服务一起报告。
如果你的应用持有终端,它可以在进程退出前把终端交还,你的 shell 绝不会残留在 raw 模式。交还过程有界:卡住的清理只会延迟致命退出,而不会取消它。
-### 告诉 agent harness 所在位置
+### 告诉 agent(智能体)harness 所在位置
当你的应用启动模型驱动的 agent 时,你可以告诉 agent DSH 实现代码 checkout 的位置:它得知该路径,也知道不得据此推断工作目录——它应使用 `pwd`。这条指示在系统提示词靠前位置出现一次。没有系统提示词服务的应用会跳过;开发环境中,重新加载系统提示词后它会消失,直至下次启动。
@@ -86,7 +86,7 @@ profile 是同一套 dsh 安装提供不同应用界面的方式:`web`、`head
- **与渠道无关的库。** 此包不包含 loader 钩子,也不提供开发模式接口;[`dsh` 应用](../../../apps/cli/README.zh.md) 持有自己的 Node 源码启动钩子,并在启动序列中使用这些 helper,构建后的消费方则使用普通 Node 包解析。
- **两个 Loader builtin。** `mountRootInclude` 把 `cordis:include` 与 `cordis:group` 注册为 Loader builtin:group 行能把一个提供方与它的消费方放进同一个 `isolate` realm,而位于本工作区之外的 agent preset 无法按名称解析 `@deepseek-ai/cordis-plugin-group`。两者都通过宿主的模块管线加载,而非被包含树自身的说明符解析。
-- **Profile 模块后备机制。** 裸插件 specifier 由 Loader 从配置目录解析。普通 Node 会为安装依赖闭包中的每个包维护一个符号链接。打包可执行文件无法让操作系统符号链接进入 pkg 的 `/snapshot` 树,因此会按 Node ESM 条件读取已安装包的 export map,并写入重新导出虚拟模块 URL 的真实代理包。缺失 export 保持不可用,错误 export map 会让启动失败,跨进程 writer lock 则会在不暴露部分代理的情况下替换陈旧条目。所选外部 bundle 若不在安装闭包中,则会获得 profile 本地的 `.dsh-module-fallback` 链接;已有 pnpm 条目优先,后续闭包发现会排除投影链接,清理也只删除 dsh 自有链接。
+- **Profile 模块后备机制。** 裸插件 specifier 由 Loader 从配置目录解析。普通 Node 会为安装依赖闭包中的每个包维护一个符号链接。打包可执行文件无法让操作系统符号链接进入 pkg 的 `/snapshot` 树,因此会按 Node ESM 条件读取已安装包的 export map,并写入重新导出虚拟模块 URL 的真实代理包。缺失 export 保持不可用,错误 export map 会让启动失败,跨进程 writer lock 则会在不暴露部分代理的情况下替换陈旧条目。所选外部组合包若不在安装闭包中,则会获得 profile 本地的 `.dsh-module-fallback` 链接;已有 pnpm 条目优先,后续闭包发现会排除投影链接,清理也只删除 dsh 自有链接。
- **单一 rejection 检查点。** `assertEntriesActivated` 把折入启动诊断的确切原因保持到下一个进程级 rejection 检查点可见,使 `installFailLoud` 能合并 Loader 的重复通知,而所有无关的未处理 rejection 仍然致命。
- **两阶段失败标签。** `boot()` 区分 `host preparation failed`(`prepare` 在任何配置树条目挂载前抛出)与 `plugin tree failed to load`(此后的一切失败),并追加最深层插件错误的堆栈,使启动诊断保留原始激活错误,而不只是包装链。
diff --git a/packages/boot/cmdline/README.i18n.yaml b/packages/boot/cmdline/README.i18n.yaml
index e119e03f59..3124c7daa7 100644
--- a/packages/boot/cmdline/README.i18n.yaml
+++ b/packages/boot/cmdline/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/boot/cmdline/README.md
README.md: f0c6636b342d856b44c9d5eaffbbd4657f3e88ae
-README.zh.md: 31246ada165bad830bf2f5808fe9c6e1ad91d7cb
+README.zh.md: b852c59ee42824c17af2cb429c71e7ca7cd0055b
diff --git a/packages/boot/cmdline/README.zh.md b/packages/boot/cmdline/README.zh.md
index 31246ada16..b852c59ee4 100644
--- a/packages/boot/cmdline/README.zh.md
+++ b/packages/boot/cmdline/README.zh.md
@@ -33,11 +33,11 @@ kind: "package-library"
- `ctx.cmdlineArgs`——本次调用的内层参数。读取它返回一份不可变快照,且绝不会消费或修改它们:`dsh --profile tui --resume abc` 给你的应用 `['--resume', 'abc']`。
- `ctx.appExit`——在整棵树关闭后请求进程退出的方式,接到启动器的关停控制器上。
-- `ctx.appReady`——成功启动信号,只在 Loader 树与 launcher 自有设置成功后提交。
+- `ctx.appReady`——成功启动信号,只在 Loader 树与启动器自有设置成功后提交。
没有参数的启动会看到空列表——这是诚实的答案,而不是缺失的值。
-`exitOnStdinEnd(ctx, label)` 把已成功启动的 stdio 应用 EOF 绑定到 `ctx.appExit(0)`。它绝不读取或恢复 stdin,因此协议传输会收到挂载前已缓冲的字节;启动拒绝优先于竞态 EOF,拥有它的 fiber 会移除两项待处理监听。
+`exitOnStdinEnd(ctx, label)` 把已成功启动的 stdio 应用 EOF 绑定到 `ctx.appExit(0)`。它绝不读取或恢复 stdin,因此协议传输会收到挂载前已缓冲的字节;启动拒绝优先于竞态 EOF,所属 fiber 会移除两个待处理的监听器。
### 解析你的 flag
@@ -63,7 +63,7 @@ kind: "package-library"
### flag 如何胜过配置值
-写在 `!!js` 表达式旁的值是后备:flag 存在时 flag 优先,否则使用写下的值。解析在启动时、你的解析器运行之后发生一次,因此 flag 绝不会被之后的配置重载悄悄重置。
+写在 `!!js` 表达式旁的值是后备:flag 存在时 flag 优先,否则使用写下的值。配置求值在启动时、你的解析器运行之后执行一次,因此 flag 绝不会被之后的配置重载悄悄重置。
### 多个插件读取同一份参数
@@ -90,14 +90,14 @@ kind: "package-library"
### 解析约定
-解析路径是一个只有两个所有者的小家族:`provideCmdline` 冻结宿主参数,并在任何配置树条目挂载前提供 `cmdlineArgs` 与 `appExit`;`parseCmdline` 针对不可变参数运行你的 commander program,把每个命令的 help、version 与错误输出都接到启动器上。被拒绝的值、`--help` 或 `--version` 会打印 commander 文本并请求 `ctx.appExit`,且不发布任何内容,因此依赖行绝不会激活;Loader 会把每行的 `!!js` 插值推迟到该行声明的注入全部激活之后。各导出的约定在代码中,不在本 README——见 [`src/index.ts`](src/index.ts)。
+解析流程由两部分负责:`provideCmdline` 冻结宿主参数,并在任何配置树条目挂载前提供 `cmdlineArgs` 与 `appExit`;`parseCmdline` 针对不可变参数运行你的 commander program,把每个命令的 help、version 与错误输出都接到启动器上。被拒绝的值、`--help` 或 `--version` 会打印 commander 文本并请求 `ctx.appExit`,且不发布任何内容,因此依赖行绝不会激活;Loader 会把每行的 `!!js` 插值推迟到该行声明的注入全部激活之后。各导出的约定在代码中,不在本 README——见 [`src/index.ts`](src/index.ts)。
### 源码地图
| 文件 | 职责 |
|---|---|
| [`src/index.ts`](src/index.ts) | `CmdlineArgs`/`AppExit` 类型、`provideCmdline`、`parseCmdline`、commander 退出/输出路由 |
-| — | 不发布运行时不变式伴生入口;Loader 结算会报告缺失的服务。 |
+| — | 不发布运行时不变式配套条目;`cmdlineArgs` 是不可变的启动器事实,任意数量的普通插件都可以读取它。应用自有提供方与消费方使用普通 Cordis 服务注入;Loader 结算已会报告缺失的依赖。 |
@@ -117,7 +117,7 @@ kind: "package-library"
## 模型体验
-无。本包在任何会话存在之前解析进程自身的命令行;配置行持有每一个模型可见的后果。
+无。本包在任何会话存在之前解析进程自身的命令行;所有模型可见的影响都由配置行产生。
#### KV Cache 影响
@@ -130,8 +130,8 @@ kind: "package-library"
这些限制说明应用自有命令行在何时不合适,或何时需要特别注意。它们是当前包约束,不是任务积压。
-- **启动器的 flag 必须写在应用参数之前**——切分按位置进行:启动器不认识的第一个 token 就是内层参数的起点,因此写在某个应用 flag 之后的 `--patch` 属于应用。启动器的解析器会消耗掉一个 `--`,因此必须以字面量 `--` 存活到应用的参数需要写成 `-- --`。
-- **应用自有服务没有静态声明的提供方**——消费行通过普通注入点名它;缺少提供方的组合包会在结算时失败,由待处理条目点名该服务,而不是在加载时失败。
+- **启动器的 flag 必须写在应用参数之前**——切分按位置进行:启动器不认识的第一个 token 就是内层参数的起点,因此写在某个应用 flag 之后的 `--patch` 属于应用。启动器的解析器会消耗掉一个 `--`,因此需要以字面量 `--` 传给应用的参数必须写成 `-- --`。
+- **应用自有服务没有静态声明的提供方**——消费方行通过普通注入点名它;缺少提供方的组合包会在结算时失败,由待处理条目点名该服务,而不是在加载时失败。
- **用户 patch 若整体替换某行的 `config`,会连同其中的表达式一起丢掉**——flag 胜过的是表达式旁写着的那个值,而不是用户用字面量替换掉表达式之后的结果;保留表达式才能保留 flag 的优先级。
diff --git a/packages/bundle/README.i18n.yaml b/packages/bundle/README.i18n.yaml
index a7ba321f44..dc41a79bb0 100644
--- a/packages/bundle/README.i18n.yaml
+++ b/packages/bundle/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/bundle/README.md
README.md: 6311b61d5e20a13d1f1ac67729ab5bc24f3ec902
-README.zh.md: cb7e27a47a708193198c4dc0c15f95cb7f907a1e
+README.zh.md: 829408f1e1356fc582813816b792ad1ee11f5734
diff --git a/packages/bundle/README.zh.md b/packages/bundle/README.zh.md
index cb7e27a47a..829408f1e1 100644
--- a/packages/bundle/README.zh.md
+++ b/packages/bundle/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "共享核心、浏览器 GUI、一次性任务、ACP 与 SDK 应用表层的现成 dsh profile bundle。"
+description: "共享核心、浏览器 GUI、一次性任务、ACP(Agent Client Protocol)与 SDK 应用表层的现成 dsh profile 组合包。"
kind: "package-group"
---
@@ -9,7 +9,7 @@ kind: "package-group"
## 概述
-本组列出 `dsh --profile` 使用的可安装 patch 层。每个包都声明 `dsh.bundle.patch`;启动器会叠放这些 patch 文档来组装具名 profile。`web`、`headless`、`acp` 与 `sdk` profile 以 `dsh-base` 为基础,`sdk-minimal` 则由一个 bundle 提供完整配置树。领域包也可以在本目录之外声明附加层。
+本组列出 `dsh --profile` 使用的可安装 patch 层。每个包都声明 `dsh.bundle.patch`;启动器会叠放这些 patch 文档来组装具名 profile。`web`、`headless`、`acp` 与 `sdk` profile 以 `dsh-base` 为基础,`sdk-minimal` 则由一个组合包提供完整配置树。领域包也可以在本目录之外声明附加层。
## 目录
@@ -23,10 +23,10 @@ kind: "package-group"
| 包 | 职责 | ctx key |
|---|---|---|
| [`base`](base/README.zh.md) | 基于 base 的 profile 共享核心 | —(仅 patch) |
-| [`acp-app`](acp-app/README.zh.md) | 基于 base 的纯自动化 ACP stdio 应用 | 挂载 ACP bridge |
-| [`web-app`](web-app/README.zh.md) | 基于 base 的浏览器应用层 | 挂载 Web 配置项 |
+| [`acp-app`](acp-app/README.zh.md) | 基于 base、仅用于自动化的 ACP stdio 应用 | 挂载 ACP bridge |
+| [`web-app`](web-app/README.zh.md) | 基于 base 的浏览器应用层 | 挂载多条 Web 配置行 |
| [`headless`](headless/README.zh.md) | 基于 base 的一次性命令行任务应用 | `headless-runner` |
-| [`sdk-app`](sdk-app/README.zh.md) | 基于 base 的 SDK JSON-RPC stdio 应用 | 挂载 SDK server |
+| [`sdk-app`](sdk-app/README.zh.md) | 基于 base 的 SDK JSON-RPC stdio 应用 | 挂载 SDK 服务器 |
| [`sdk-minimal`](sdk-minimal/README.zh.md) | 不使用 base 或 Web 的独立极简 SDK 应用 | —(完整 patch 树) |
内置组合包从 dsh 安装目录解析;树外(out-of-tree)组合包通过 `dsh plugin --profile add ` 安装进 profile。
@@ -36,8 +36,8 @@ kind: "package-group"
- [dsh 应用](../../apps/cli/README.zh.md)——启动 profile 的 `dsh` 命令。
- [app-boot](../boot/app-boot/README.zh.md)——profile 如何解析、分层与定制。
-- [Profile 组合包设计笔记](../../.agents/notes/implemented/architecture/2026-08-05-profile-plugin-bundles.zh.md)——profile 与组合包的组合设计。
-- [生成组合图](../../apps/cli/composition.md)——每个已发布 profile 使用的确切组合。
+- [Profile 插件组合包设计笔记](../../.agents/notes/implemented/architecture/2026-08-05-profile-plugin-bundles.zh.md)——profile 与组合包的组合设计。
+- [生成组合图](../../apps/cli/composition.md)——每个随发行版交付的 profile 使用的确切组合。
## 开发备注
diff --git a/packages/bundle/acp-app/README.i18n.yaml b/packages/bundle/acp-app/README.i18n.yaml
index 0bd6515975..03a1997a2c 100644
--- a/packages/bundle/acp-app/README.i18n.yaml
+++ b/packages/bundle/acp-app/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/bundle/acp-app/README.md
README.md: 25e51402af8f522a65ea0e9f0a402f29e6d73bc2
-README.zh.md: 4ecf61c43c55c62fdcaebe307b3331a6c60fc15d
+README.zh.md: 55fab63d45b1e938586a4c075b8567eb5332aa67
diff --git a/packages/bundle/acp-app/README.zh.md b/packages/bundle/acp-app/README.zh.md
index 4ecf61c43c..55fab63d45 100644
--- a/packages/bundle/acp-app/README.zh.md
+++ b/packages/bundle/acp-app/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "面向启动持久 harness agent 的用户与维护者,说明纯自动化 ACP stdio 应用 profile。"
+description: "面向启动持久 harness agent(智能体)的用户与维护者,说明纯自动化 ACP(Agent Client Protocol)stdio 应用 profile。"
kind: "package-bundle"
---
@@ -9,7 +9,7 @@ kind: "package-bundle"
## 概述
-以 [`dsh-base`](../base/README.zh.md) 为基础的 automation-only ACP stdio 应用 `dsh` profile 组合包。它继承 base 默认禁用模块 HMR(热模块替换)的策略;其 patch 设置 coding agent(编程智能体)persona 与默认模型路由、挂载应用自有的零选项命令提供方,并且只在该提供方接受调用后启动 [`dsh-acp`](../../acp/acp/README.zh.md)。因此,`dsh --profile acp --help` 会写出 help 并退出,不会占用 stdin 或 stdout。
+以 [`dsh-base`](../base/README.zh.md) 为基础的纯自动化 ACP stdio 应用 `dsh` profile 组合包。它继承 base 禁用模块 HMR(热模块替换)的策略;其 patch 设置 coding agent(编程智能体)persona 与默认模型路由、挂载应用自有的零选项命令提供方,并且只在该提供方接受调用后启动 [`dsh-acp`](../../acp/acp/README.zh.md)。因此,`dsh --profile acp --help` 会写出 help 并退出,不会占用 stdin 或 stdout。
## 目录
@@ -24,16 +24,16 @@ kind: "package-bundle"
## 使用本包
-启动提供方把 stdin EOF 绑定到启动器的有界成功关闭。ACP 连接关闭、SIGINT 与 SIGTERM 会在退出前排空 bridge 自有 agent 以及根 profile 树。Stdout 仅保留给换行分隔的 ACP JSON-RPC frame。ACP 不提供 title 表层,因此本组合包禁用模型生成的 session title;确定性的 fallback title 仍会持久化,但不发起辅助模型请求。继承的投影缓存会为 ACP 创建的会话写入检查点,供后续消费方使用;其持久性屏障会在发布缓存行前 flush 所覆盖的日志前缀,因此可能拆分原本会合并的 JSONL 行。部署方通过 profile 组合包与 patch 文件选择另一套完整组合,而不是使用另一个 app bin。
+启动提供方把 stdin EOF 绑定到启动器的有界成功关闭。ACP 连接关闭、SIGINT 与 SIGTERM 会在退出前排空 bridge 自有 agent 以及根 profile 树。Stdout 仅保留给换行分隔的 ACP JSON-RPC 帧。ACP 不提供标题呈现能力,因此本组合包禁用模型生成的会话 title;确定性的 fallback title 仍会持久化,但不发起辅助模型请求。继承的投影缓存会为 ACP 创建的会话写入检查点,供后续消费方使用;其持久性屏障会在发布缓存行前 flush 所覆盖的日志前缀,因此可能拆分原本会合并的 JSONL 连续段。部署方通过 profile 组合包与 patch 文件选择另一套完整组合,而不是使用另一个 app bin。
-随附配置项使用 `deepseek-official` 与 `deepseek-v4-flash` 创建 session;后续 patch 可以替换该配置项的完整 config。base profile 负责适配器、工具、持久化、策略、settings 与 credentials;ACP client 为每个 session 提供工作区。
+随附配置项使用 `deepseek-official` 与 `deepseek-v4-flash` 创建会话;后续 patch 可以替换该配置项的完整配置。base profile 负责适配器、工具、持久化、策略、设置、凭据,以及 ACP client 为每个会话提供的工作区。
-----
## 标准自动化工作流
-ACP v1 SDK 客户端先初始化 `dsh --profile acp`,再用绝对 `cwd` 与可选的标准 stdio/HTTP MCP 声明创建 session,选择公开的 `model` 或 `reasoning_effort`,在观察标准语义更新的同时提交提示词,最后调用 `session/close`。另一个进程可以针对同一个 profile 持久化根目录使用 `session/list` 与 `session/resume`;resume 会重新连接该请求提供的 MCP 声明,但不会重放历史。
+ACP v1 SDK 客户端先初始化 `dsh --profile acp`,再用绝对 `cwd` 与可选的标准 stdio/HTTP MCP 声明创建会话,选择公开的 `model` 或 `reasoning_effort`,在观察标准语义更新的同时提交提示词,最后调用 `session/close`。另一个进程可以针对同一个 profile 持久化根目录使用 `session/list` 与 `session/resume`;恢复会重新连接该请求提供的 MCP 声明,但不会回放历史。
完整的受支持方法矩阵、MCP 信任模型、更新映射与停止原因见 [`dsh-acp` 协议约定](../../acp/acp/README.zh.md#standard-acp-v1-surface)。该 profile 不增加私有方法、能力、`_meta`、环境变量或传输字段。免密钥控制面一致性测试通过公开 ACP SDK 驱动真实 profile。
@@ -48,7 +48,7 @@ profile 在第一方指导之前提供 `You are a coding agent powered by the {{
#### Token 影响
-一段简短稳定的 persona,加上随数据变化的 base prompt section 与已选工具 schema。
+一段简短稳定的 persona,加上 base 提示词中随数据变化的部分与已选工具 schema。
#### KV Cache 影响
diff --git a/packages/bundle/base/README.i18n.yaml b/packages/bundle/base/README.i18n.yaml
index 54dd7ed873..6608cc7c0d 100644
--- a/packages/bundle/base/README.i18n.yaml
+++ b/packages/bundle/base/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/bundle/base/README.md
README.md: 186d3184b344789187e0096b49dd93c191c2fde4
-README.zh.md: fcc42c39c4489afa484844a036a5f85ef72d1e7e
+README.zh.md: 411a8a995be7a0f4d956a82b16a15aa43bb5171d
diff --git a/packages/bundle/base/README.zh.md b/packages/bundle/base/README.zh.md
index fcc42c39c4..411a8a995b 100644
--- a/packages/bundle/base/README.zh.md
+++ b/packages/bundle/base/README.zh.md
@@ -9,7 +9,7 @@ kind: "package-bundle"
## 概述
-每个基于 base 的 `dsh --profile` 表层都运行在 `dsh-base` 上,因此这些表层共享模型连接、完整工具集、持久会话历史和 workspace 安全默认值。随附的 `sdk-minimal` profile 刻意改用完整的独立配置树。你通常不直接操作本 bundle——随附的 base-backed profile 已经包含它,自定义 base-backed profile 则把它放在第一位。需要其他默认值时,应修改自己的 profile patch 或添加后续 bundle;本包不是供导入的库。
+每个基于 base 的 `dsh --profile` 表层都运行在 `dsh-base` 上,因此这些表层共享模型连接、完整工具集、持久会话历史和 workspace 安全默认值。随附的 `sdk-minimal` profile 刻意改用完整的独立配置树。你通常不直接操作本组合包——随发行版交付的基于 base 的 profile 已经包含它,自定义的基于 base 的 profile 则把它放在第一位。需要其他默认值时,应修改自己的 profile patch 或添加后续组合包;本包不是供导入的库。
## 目录
@@ -47,7 +47,7 @@ kind: "package-bundle"
### 你得到什么
-开箱即用,基于本核心构建的每个 profile 都提供:DeepSeek 模型连接(provider 与模型可配置,你还可以在设置中启用额外 provider)、完整工具集——文件编辑、shell 命令、web 搜索、公开 HTTP(S) 抓取、subagent、任务与目标跟踪——可跨重启存活的持久会话,以及默认权限策略:把文件写入限制在工作区内,危险操作前征询许可。Web 抓取无需逐次审批,其提供方会拒绝非公开目的地址。反馈保存在会话日志中。[OTel 会话上传](../../session/session-telemetry-otel/README.zh.md)对所有用户默认使用 `FEEDBACK_ONLY`,包括 `deepseek-official`:新的文本反馈、消息评分、编辑与撤回会释放截至该事件的完整权威日志前缀,包含上下文。后续记录等待下一次显式反馈;发送已授权批次无需进一步交互或模型调用。`DISABLED` 阻止 OTel 捕获。需主动开启的 [DeepSeek 会话日志贡献器](../../session/session-log-deepseek/README.zh.md)仍是独立的请求路径。
+开箱即用,基于本核心构建的每个 profile 都提供:DeepSeek 模型连接(提供方与模型可配置,你还可以在设置中启用额外提供方)、完整工具集——文件编辑、shell 命令、web 搜索、公开 HTTP(S) 抓取、subagent、任务与目标跟踪——可跨重启存活的持久会话,以及默认权限策略:把文件写入限制在工作区内,危险操作前征询许可。Web 抓取无需逐次审批,其提供方会拒绝非公开目的地址。反馈保存在会话日志中。[OTel 会话上传](../../session/session-telemetry-otel/README.zh.md)对所有用户默认使用 `FEEDBACK_ONLY`,包括 `deepseek-official`:新的文本反馈、消息评分、编辑与撤回会释放截至该事件的完整规范会话日志前缀,包含上下文。后续记录等待下一次显式反馈;发送已授权批次无需进一步交互或模型调用。`DISABLED` 阻止 OTel 捕获。需主动开启的 [DeepSeek 会话日志贡献器](../../session/session-log-deepseek/README.zh.md)仍是独立的请求路径。
默认文件编辑使用 `read`、`write` 和 `edit`。`str_replace_editor` 工具仍可显式启用。要将它加入基于 base 的 profile,请在 profile、home 或逐次调用 patch 中添加以下条目:
@@ -91,8 +91,8 @@ patch 在自身上按平台门控两个 shell 栈:`bash-sandbox` 与 `tool-bas
|---|---|
| [`cordis.patch.yml`](cordis.patch.yml) | 组合包的实体:基础插件行,附以行内注释说明各行依据 |
| [`src/index.ts`](src/index.ts) | 包入口;不携带任何运行时 API |
-| — | 不发布运行时不变式伴生入口;本包只持有静态 patch 列表,插入的各行分别负责自己的不变式。 |
-| [`tests/base.spec.ts`](tests/base.spec.ts) | manifest 声明与平台门控检查 |
+| — | 不发布运行时不变式伴生入口;本包是静态 patch 列表载体(由其他包拥有的 loader 行构成的 YAML 文档);它不挂载任何服务、不发出任何事件,也没有任何可检查的可变关系。每条插入行所属的包负责该行的不变式。 |
+| [`tests/base.spec.ts`](tests/base.spec.ts) | manifest(元数据清单)声明与平台门控检查 |
### 不变式归属
@@ -108,10 +108,10 @@ patch 在自身上按平台门控两个 shell 栈:`bash-sandbox` 与 `tool-bas
当你想深入了解 profile、基于本核心构建的表层或确切组合时,阅读以下页面。
- [app-boot 的 profile 章节](../../boot/app-boot/README.zh.md)——profile 如何解析、分层与定制。
-- [组合包包映射](../README.zh.md)——基于本核心构建的表层。
-- [生成组合图](../../../apps/cli/composition.md)——每个已发布 profile 使用的确切插件集合。
+- [组合包索引](../README.zh.md)——基于本核心构建的表层。
+- [生成组合图](../../../apps/cli/composition.md)——随发行版交付的每个 profile 使用的确切插件集合。
- [Profile 组合包设计笔记](../../../.agents/notes/implemented/architecture/2026-08-05-profile-plugin-bundles.zh.md)——profile 与组合包的组合设计。
-- [Codex 与 Claude Code provider 组合包](../../subagent/README.zh.md)——可叠加安装的可选 provider 组合包。
+- [Codex 与 Claude Code 提供方组合包](../../subagent/README.zh.md)——可叠加安装的可选提供方组合包。
-----
diff --git a/packages/bundle/headless/README.i18n.yaml b/packages/bundle/headless/README.i18n.yaml
index cae5d08de7..db1d6102b1 100644
--- a/packages/bundle/headless/README.i18n.yaml
+++ b/packages/bundle/headless/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/bundle/headless/README.md
README.md: 98a9cb2294d8b05a40287c990b3ff53f755747cf
-README.zh.md: 0f4721d856357a85964a13433c3bbc701f8fb299
+README.zh.md: 99bf90845bed1a7601ca8a70cfff98567ea364f8
diff --git a/packages/bundle/headless/README.zh.md b/packages/bundle/headless/README.zh.md
index 0f4721d856..99bf90845b 100644
--- a/packages/bundle/headless/README.zh.md
+++ b/packages/bundle/headless/README.zh.md
@@ -9,7 +9,7 @@ kind: "package-bundle"
## 概述
-`dsh-headless` 从命令行运行一个 dsh 任务并打印最终答案,然后退出——没有 GUI、没有服务器、没有浏览器。输入 `dsh --profile headless "run the tests"`,agent(智能体)会以与其他表层相同的模型、工具与安全默认值完成该任务。它非常适合脚本、CI 与一次性任务:进程不打开任何端口,也不会留下任何后台运行的东西。退出码告诉你结果——任务完成时为 0,中止或出错时为 1。主要边界:每次调用只运行一个任务,没有交互式后续。
+`dsh-headless` 从命令行运行一个 dsh 任务并打印最终答案,然后退出——没有 GUI、没有服务器、没有浏览器。输入 `dsh --profile headless "run the tests"`,agent(智能体)会以与所有其他表层相同的模型、工具与安全默认值完成该任务。它非常适合脚本、CI 与一次性任务:进程不打开任何端口,也不会留下任何后台运行的东西。退出码告诉你结果——任务完成时为 0,中止或出错时为 1。主要边界:每次调用只运行一个任务,没有交互式后续。
## 目录
@@ -33,13 +33,13 @@ kind: "package-bundle"
dsh --profile headless "run the tests"
```
-agent(智能体)会完成该任务,把提供方的每个非空推理增量流式写入 stderr 的 `dsh: reasoning:` 段,然后把最终答案写入 stdout 并退出。连续推理增量保持在同一段中;提供方未给尾换行时,runner 会在后续输出前结束该段。没有推理内容的成功运行保持 stderr 为空;失败时退出码为 1,并以 `dsh: : ` 向 stderr 写入错误。缺失或空白任务会在任何内容运行前被拒绝。任务文本通过唯一的 `task` 设置提供:
+agent 会完成该任务,把提供方的每个非空推理(reasoning)增量流式写入 stderr 的 `dsh: reasoning:` 段,然后把最终答案写入 stdout 并退出。连续推理增量保持在同一段中;提供方未给尾换行时,runner 会在后续输出前结束该段。没有推理内容的成功运行保持 stderr 为空;失败时退出码为 1,并以 `dsh: : ` 向 stderr 写入错误。缺失或空白任务会在任何执行开始之前被拒绝。任务文本通过唯一的 `task` 设置提供:
| 字段 | 默认值 | 含义 |
|---|---|---|
| `task` | 必填 | 单次运行的任务文本 |
-生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-headless)是每个受支持字段及其 JSDoc 的穷尽式真源。
+生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-headless)是所有受支持字段及其 JSDoc 的完整真源。
### 何时使用
@@ -57,15 +57,15 @@ agent(智能体)会完成该任务,把提供方的每个非空推理增量
实现细节——点击展开
-runner 是核心 API 载体之上的直接驱动器:它通过注册表创建一个全新的 Agent(智能体),并把所属的持久化事件区间折叠成一个进程级结果。
+runner 是核心 API 载体之上的直接驱动器:它通过注册表创建一个全新的 Agent,并把所属的持久化事件区间折叠成一个进程级结果。
### 运行流程
-runner 等待整个应用结算(`ctx.get('loader')?.await()`),确保已组合的工具与适配器不会半挂载,读取共享的 [`agentDefaultModel`](../../core/agent-default-model/README.zh.md) 选择,用该 provider 与模型创建一个全新的持久化 Agent(智能体),并把任务作为普通用户消息提交。它把该 Agent 的非空推理增量流式写入 stderr、等待完全停稳,然后 flush Session,并把所属区间(从 `firstSeq` 起)折叠为最后一条非空 `assistant/message` 文本与最终 `turn/end` 原因。最后,它把最终文本写入 stdout 并请求退出。
+runner 等待整个应用结算(`ctx.get('loader')?.await()`),确保已组合的工具与适配器不会半挂载,读取共享的 [`agentDefaultModel`](../../core/agent-default-model/README.zh.md) 选择,用该提供方与模型创建一个全新的持久化 Agent,并把任务作为普通用户消息提交。它把该 Agent 的非空推理增量流式写入 stderr、等待完全停稳,然后对会话执行 flush,并把所属区间(从 `firstSeq` 起)折叠为最后一条非空 `assistant/message` 文本与最终 `turn/end` 原因。最后,它把最终文本写入 stdout 并请求退出。
-### 叠加在 base 之上的 patch 表层
+### 基于 base 的 patch 内容
-patch 叠加在 `dsh-base` 之上:继承投影缓存,在基础 `system-prompt` 行上设置编码 persona 前缀与独立的 cwd 后缀,保留与 Web 表层相同的临时进程级 PTC mode 开关(`DSH_TOOLS_MODE`),禁用共享的 HMR 行,把 PTC mode 的 worker 作为核心执行能力插入,并挂载启动提供方与 runner。缓存为每个已持久化的一次性会话写入检查点,供后续消费方使用;其持久性屏障会在发布缓存行前 flush 所覆盖的日志前缀,因此可能拆分原本会合并的 JSONL 行。启动提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.zh.md)),读取位置参数、打印应用自己的 `--help`,并提供 `headlessStartup`;runner 注入该服务,再从惰性配置中读取任务。
+patch 叠加在 `dsh-base` 之上:继承投影缓存,在基础 `system-prompt` 行上设置编码 persona 前缀与独立的 cwd 后缀,保留与 Web 表层相同的临时进程级 PTC mode 开关(`DSH_TOOLS_MODE`),禁用共享的 HMR(热模块替换)行,把 PTC mode 的 worker 作为核心执行能力插入,并挂载启动提供方与 runner。缓存为每个已持久化的一次性会话写入检查点,供后续消费方使用;其持久性屏障会在发布缓存行前 flush 所覆盖的日志前缀,因此可能拆分原本会合并的 JSONL 连续段。启动提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.zh.md)),读取位置参数、打印应用自己的 `--help`,并提供 `headlessStartup`;runner 注入该服务,再从惰性配置中读取任务。
### 退出映射
@@ -78,7 +78,7 @@ patch 叠加在 `dsh-base` 之上:继承投影缓存,在基础 `system-promp
| [`src/index.ts`](src/index.ts) | `headless-runner` 插件:运行流程、输出约定、退出映射 |
| [`src/startup.ts`](src/startup.ts) | `headless-startup` 提供方:任务位置参数与 `--help` |
| [`cordis.patch.yml`](cordis.patch.yml) | 叠加在 `dsh-base` 之上的一次性 patch |
-| — | 不发布运行时不变式伴生入口;可观察的行为属于进程级组合,本包只持有静态 patch 列表。 |
+| — | 不发布运行时不变式伴生入口;runner 的可观察约定(stderr 中的提供方推理、stdout 中的最终文本、按轮次结束原因决定的退出码)属于进程级,并由启动器 e2e 负责;runner 不注册任何内容,树内也没有任何可变关系可审计。 |
| [`tests/headless.spec.ts`](tests/headless.spec.ts) | 运行流程、汇总、flush 与退出映射 |
| [`tests/startup.spec.ts`](tests/startup.spec.ts) | 在真实 Loader 树上的命令行解析 |
@@ -93,11 +93,11 @@ patch 叠加在 `dsh-base` 之上:继承投影缓存,在基础 `system-promp
## 进一步探索
-当你想深入了解共享核心、兄弟 GUI 或命令行交接时,阅读以下页面。
+当你想深入了解共享核心、同级 GUI 或命令行交接时,阅读以下页面。
-- [组合包包映射](../README.zh.md)——基于同一核心构建的表层。
+- [组合包索引](../README.zh.md)——基于同一核心构建的表层。
- [dsh-base](../base/README.zh.md)——headless 运行其上的共享核心。
-- [dsh-web-app](../web-app/README.zh.md)——用于多轮工作的交互式浏览器兄弟表层。
+- [dsh-web-app](../web-app/README.zh.md)——用于多轮工作的同级交互式浏览器入口。
- [dsh-cmdline](../../boot/cmdline/README.zh.md)——启动器如何把命令行交给应用。
- [生成配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-headless)——每个受支持配置字段及其源声明。
@@ -110,19 +110,19 @@ patch 叠加在 `dsh-base` 之上:继承投影缓存,在基础 `system-promp
#### KV Cache 影响
-runner 不向请求前缀添加任何内容;它只是把一条用户消息驱动经过组合出的配置树。
+runner 不向请求前缀添加任何内容;它只是驱动组合出的配置树处理一条用户消息。
## 已知限制与延期工作
-这些限制告诉你 headless 何时不适用、它需要 `dsh` 启动器提供什么。它们是当前包约束,不是通用的 CLI 对比或任务积压。
+这些限制告诉你 headless 何时不适用、它需要 `dsh` 启动器提供什么。它们是当前包约束,不是通用的 CLI(命令行界面)对比或任务积压。
- **每次运行一个任务**——任务得到回答后进程即退出;没有交互式后续,因此多步工作请拆成多次运行。
- **通过 `dsh` 启动器运行**——以其他方式启动 headless profile 会在启动时失败,因为只有启动器能请求进程退出。
- **首个 token 前没有心跳**——提供方发出第一个非空推理增量前,stderr 保持静默;延迟首个 token 的提供方不会更早给出进度信号。
-- **推理进入 stderr 日志**——重定向与监督进程可能保留更多且可能敏感的模型输出;需要时应把 stderr 路由到受控位置。
+- **推理进入 stderr 日志**——重定向与监督进程可能保留显著更多且可能敏感的模型输出;需要时应把 stderr 路由到受控位置。
- **只打印推理和最终答案**——没有 assistant 消息的运行向 stdout 打印空行并以 1 退出;中间工具输出不会打印。
diff --git a/packages/bundle/sdk-app/README.i18n.yaml b/packages/bundle/sdk-app/README.i18n.yaml
index a33b22aa51..056a80cd17 100644
--- a/packages/bundle/sdk-app/README.i18n.yaml
+++ b/packages/bundle/sdk-app/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/bundle/sdk-app/README.md
README.md: 538e695e017b823b93ca8696f9e3202f33274ce4
-README.zh.md: 50dfda2b4d5ccc8b7e2c2d67eb920a8e180d5d32
+README.zh.md: 132388c8c1f4e01c2688f65c4d7d9bf10af4abf0
diff --git a/packages/bundle/sdk-app/README.zh.md b/packages/bundle/sdk-app/README.zh.md
index 50dfda2b4d..132388c8c1 100644
--- a/packages/bundle/sdk-app/README.zh.md
+++ b/packages/bundle/sdk-app/README.zh.md
@@ -23,7 +23,7 @@ kind: "package-bundle"
## 使用本包
-启动提供方把 stdin EOF 接到启动器的有界成功关闭流程。SDK 协议 `shutdown`、SIGINT 与 SIGTERM 继续使用各自所属的 server 或启动器路径;dispose(资源释放)会排空根 profile 配置树与持久化。stdout 专用于按换行分隔的 JSON-RPC 帧。SDK 不提供 title 表层,因此本组合包禁用模型生成的 session title;确定性的 fallback title 仍会持久化,但不发起辅助模型请求。继承的投影缓存会为 SDK 创建的会话写入检查点,供后续消费方使用;其持久性屏障会在发布缓存行前 flush 所覆盖的日志前缀,因此可能拆分原本会合并的 JSONL 行。部署通过 profile 组合包与 patch 文件选择另一套完整组合,而不是使用另一个应用 bin。
+启动提供方把 stdin EOF 接到启动器的有界成功关闭流程。SDK 协议 `shutdown`、SIGINT 与 SIGTERM 继续使用各自所属的 server 或启动器路径;dispose(资源释放)会排空根 profile 配置树与持久化。stdout 专用于按换行分隔的 JSON-RPC 帧。SDK 不提供 title 表层,因此本组合包禁用模型生成的会话标题;确定性的 fallback title 仍会持久化,但不发起辅助模型请求。继承的投影缓存会为 SDK 创建的会话写入检查点,供后续消费方使用;其持久性屏障会在发布缓存行前 flush 所覆盖的日志前缀,因此可能拆分原本会合并的 JSONL 行。部署通过 profile 组合包与 patch 文件选择另一套完整组合,而不是使用另一个应用 bin。
| 配置 | 默认值 | 行为 |
|---|---|---|
@@ -56,9 +56,9 @@ profile 在第一方指导之前提供 `You are a coding agent powered by the {{
-- **profile 可以省略 SDK server**:TypeScript client 选择的自定义 profile 必须保留本组合包或另一个 `dsh-sdk-jsonrpc-server` 配置项;没有 peer 响应时,client 初始化会失败。
+- **profile 可能省略 SDK server**:TypeScript client 选择的自定义 profile 必须保留本组合包或另一个 `dsh-sdk-jsonrpc-server` 配置项;没有 peer 响应时,client 初始化会失败。
- **用户插件可以破坏 stdout 纯净性**:profile 与逐次启动 patch 属于受信任应用组合。随附组合包不会向 stdout 写入非协议内容,但无法约束任意插入插件。
-- **配置变化需要重启**:随附 `sdk` profile 使用 `patchReload: startup`,因此一个 stdio 连接不会观察到 server 或 Agent 依赖被替换。
+- **配置变化需要重启**:随附 `sdk` profile 使用 `patchReload: startup`,因此一个 stdio 连接不会观察到 server 或 agent 依赖被替换。
@@ -71,4 +71,4 @@ profile 在第一方指导之前提供 `You are a coding agent powered by the {{
-**运行时不变式:** 不发布伴生入口。该 bundle 只增加进程传输与启动 latch;帧纯度、help 排除和关闭行为由源码及构建产物的 stdio 测试负责。
+**运行时不变式:** 不发布伴生入口。该 bundle 增加进程传输与启动 latch;帧纯度、help 排除和关闭行为由源码及构建产物的 stdio 测试负责。
diff --git a/packages/bundle/sdk-minimal/README.i18n.yaml b/packages/bundle/sdk-minimal/README.i18n.yaml
index b4894c1932..8a69d75921 100644
--- a/packages/bundle/sdk-minimal/README.i18n.yaml
+++ b/packages/bundle/sdk-minimal/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/bundle/sdk-minimal/README.md
README.md: e67b1eb0637f870f47bd97ecff7133242e2f2210
-README.zh.md: 077d3ac0f603ce6781476b4850306d8f8486f82a
+README.zh.md: 9136d5de9f71306f060a99327b149145b01564a3
diff --git a/packages/bundle/sdk-minimal/README.zh.md b/packages/bundle/sdk-minimal/README.zh.md
index 077d3ac0f6..9136d5de9f 100644
--- a/packages/bundle/sdk-minimal/README.zh.md
+++ b/packages/bundle/sdk-minimal/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "供需要不含共享 base bundle 的极简跨平台 coding agent 的用户使用的独立单工具 SDK profile。"
+description: "供需要不含共享 base bundle 的极简跨平台 coding agent(编程智能体)的用户使用的独立单工具 SDK profile。"
kind: "package-bundle"
---
@@ -9,7 +9,7 @@ kind: "package-bundle"
## 概述
-当 SDK 客户端需要小型、显式的 coding agent 运行时时,请使用 `dsh --profile sdk-minimal`。该 profile 只公布按平台选择的持久 shell,把会话持久化为未压缩 JSONL,并从 SDK 初始化请求选择模型。它提供完整 Cordis 配置树,并刻意排除 `dsh-base`、Web、settings、托管凭据、遥测、compaction、文件系统工具、workspace 指令、skills、jobs 与 subagent。其 danger-full-access 策略允许 shell 修改进程可访问的任何路径,因此只能配合隔离 workspace 使用。
+当 SDK 客户端需要小型、显式的 coding agent 运行时时,请使用 `dsh --profile sdk-minimal`。该 profile 只公布按平台选择的持久 shell,把会话持久化为未压缩 JSONL,并从 SDK 初始化请求选择模型。它提供完整 Cordis 配置树,并刻意排除 `dsh-base`、Web、settings、托管凭据、遥测、压缩(compaction)、文件系统工具、workspace 指令、skill(技能)、jobs 与 subagent。其 danger-full-access 策略允许 shell 修改进程可访问的任何路径,因此只能配合隔离 workspace 使用。
## 目录
@@ -32,9 +32,9 @@ export DSH_HOME=/absolute/path/to/example-dsh-home
dsh --profile sdk-minimal
```
-`DSH_CONTEXT_WINDOW` 为不在适配器建议目录中的模型设置后备容量。`DSH_SYSTEM_PROMPT` 替换默认 persona。SDK 初始化请求是唯一模型选择,并覆盖环境默认值。
+`DSH_CONTEXT_WINDOW` 为不在适配器建议目录中的模型设置后备容量。`DSH_SYSTEM_PROMPT` 替换默认 persona。SDK 初始化请求是唯一的模型选择依据,并覆盖环境默认值。
-使用 `dsh plugin --profile sdk-minimal` 管理持久外部依赖。Profile、home 与有序 `--patch` 文件可以在完整默认配置树上替换配置项或插入 bundle。随附模板只在启动时应用 patch。
+使用 `dsh plugin --profile sdk-minimal` 管理持久外部依赖。Profile、home 与有序 `--patch` 文件可以替换完整默认配置树中的配置项,或在该配置树上方插入 bundle。随附模板只在启动时应用 patch。
该 profile 只挂载一套持久 shell:Linux 和 macOS 使用 Bash,Windows 使用 PowerShell。两套配置都使用 300 秒超时与一个 agent 自有终端;另一平台的配置项保持禁用。
@@ -54,7 +54,7 @@ dsh --profile sdk-minimal
|---|---|
| [`cordis.patch.yml`](cordis.patch.yml) | 完整独立 profile 配置树及其环境默认值 |
| [`src/index.ts`](src/index.ts) | Bundle 包入口 |
-| — | 不发布运行时不变式伴生入口;本包只是静态 patch 列表载体,插入的各行分别拥有自己的运行时关系和不变式。 |
+| — | 不发布运行时不变式伴生项;本包只是静态 patch 列表载体,插入的各行分别拥有自己的运行时关系和不变式伴生项。 |
| [`tests/sdk-minimal.spec.ts`](tests/sdk-minimal.spec.ts) | 精确组合、profile 名称与平台选择检查 |
@@ -64,7 +64,7 @@ dsh --profile sdk-minimal
## 进一步探索
-- [Python SDK 示例](../../../python/sdk/examples/README.zh.md)——从 Python 针对显式 Harness home 启动本 profile。
+- [Python SDK 示例](../../../python/sdk/examples/README.zh.md)——从 Python 启动本 profile,并使用明确指定的 Harness home。
- [SDK 应用 bundle](../sdk-app/README.zh.md)——完整与极简 SDK profile 复用的 JSON-RPC 应用层。
- [Base bundle](../base/README.zh.md)——本 profile 刻意省略的完整产品基础。
@@ -77,7 +77,7 @@ dsh --profile sdk-minimal
#### 模型看到的内容
-系统提示词取 `DSH_SYSTEM_PROMPT`,未设置时使用 `You are a helpful software engineer assistant.`。对外公布的唯一工具是 Linux/macOS 上 agent 所有的持久 `bash` 或 Windows 上的 `pwsh`;运行时上下文、文件系统工具、workspace 指令、skills、jobs 控制、compaction 与 Harness 身份均不存在。
+系统提示词取 `DSH_SYSTEM_PROMPT`,未设置时使用 `You are a helpful software engineer assistant.`。对外公布的唯一工具是 Linux/macOS 上 agent 所有的持久 `bash` 或 Windows 上的 `pwsh`;运行时上下文、文件系统工具、workspace 指令、skill、jobs 控制、压缩 与 Harness 身份均不存在。
#### Token 影响
@@ -91,7 +91,7 @@ dsh --profile sdk-minimal
-- **该组合刻意省略共享产品服务** — 需要 settings、托管凭据、权限策略预设、遥测、Web 工具或完整默认工具清单时,请选择 `dsh --profile sdk`。
+- **该组合刻意省略共享产品服务** — 需要 settings、托管凭据、策略预设、遥测、Web 工具或完整默认工具清单时,请选择 `dsh --profile sdk`。
- **用户 patch 可以扩展配置树并破坏 stdout** — profile 自定义属于受信任的应用组合;向 stdout 写入普通文本的插件会破坏 JSON-RPC 分帧。
diff --git a/packages/bundle/web-app/README.i18n.yaml b/packages/bundle/web-app/README.i18n.yaml
index e04aaa88d7..33aa79798d 100644
--- a/packages/bundle/web-app/README.i18n.yaml
+++ b/packages/bundle/web-app/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/bundle/web-app/README.md
README.md: aea694942173a856861d00a69f15b451cc930976
-README.zh.md: f1b402c985ec2c21afdd67f8cb5477196aafeb44
+README.zh.md: 4dab93ff03071bff6783ae89b0397216b86a8c05
diff --git a/packages/bundle/web-app/README.zh.md b/packages/bundle/web-app/README.zh.md
index f1b402c985..4dab93ff03 100644
--- a/packages/bundle/web-app/README.zh.md
+++ b/packages/bundle/web-app/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "dsh 的浏览器 GUI:交互式聊天、模型与设置管理、会话历史,供用户运行 dsh web 表层。"
+description: "dsh 的浏览器 GUI:交互式聊天、模型与设置管理、会话历史,供运行 dsh web 表层的用户使用。"
kind: "package-bundle"
---
@@ -9,7 +9,7 @@ kind: "package-bundle"
## 概述
-运行 `dsh --profile web`,打开提供聊天、模型与设置管理以及会话历史的交互式浏览器 GUI。它使用与其他 dsh 表层相同的模型访问、工具与安全默认值。启动时会打印经过认证的 URL,通常还会在默认浏览器中打开;SSH 会话和 `--no-open` 会保留该 URL,供你手动打开。你可以更改端口并允许额外主机,但不能绑定所有网络接口。需要在浏览器中交互式工作时选择本包;一次性的命令行任务应使用 `dsh-headless`。
+运行 `dsh --profile web`,打开提供聊天、模型与设置管理以及会话历史的交互式浏览器 GUI。它使用与其他 dsh 表层相同的模型访问、工具与安全默认值。启动时会打印带认证信息的 URL,通常还会在默认浏览器中打开;SSH 会话和 `--no-open` 会保留该 URL,供你手动打开。你可以更改端口并允许额外主机,但不能绑定所有网络接口。需要在浏览器中交互式工作时选择本包;一次性的命令行任务应使用 `dsh-headless`。
## 目录
@@ -34,7 +34,7 @@ dsh --profile web
dsh --profile web --no-open --port 8080
```
-启动后你会看到 `dsh web:` 行,其根 URL 携带新的进程 token。除非 `--no-open` 或 SSH 会话抑制,否则默认浏览器会打开该 URL、取得签名 cookie,再重定向到干净的根页面。页面加载且你可以与 agent(智能体)对话,就说明成功了。两种可预期的失败:前端未构建时,启动会以构建提示停止(checkout 中运行 `pnpm run build`);浏览器无法打开时,stderr 会打印不含凭据的诊断,但服务器会继续运行——请自行打开已打印的启动 URL。
+启动后你会看到 `dsh web:` 行,其根 URL 携带新的进程 token。除非 `--no-open` 或 SSH 会话抑制,否则默认浏览器会打开该 URL、取得签名 cookie,再重定向到不含认证参数的根页面。页面加载且你可以与 agent 对话,就说明成功了。两种可预期的失败:前端未构建时,启动会以构建提示停止(checkout 中运行 `pnpm run build`);浏览器无法打开时,stderr 会打印不含凭据的诊断,但服务器会继续运行——请自行打开已打印的启动 URL。
### 配置
@@ -44,14 +44,14 @@ dsh --profile web --no-open --port 8080
|---|---|---|
| `openBrowser` | `true` | 启动后用默认浏览器打开;SSH 启动会抑制它 |
| `printUrl` | `true` | 启动时打印 `dsh web:` URL 行 |
-| `surfaceContext` | `true` | 给 agent(智能体)提供 GUI 定位上下文,并把 `DSH_WEB_URL` 暴露给其 shell 命令 |
+| `surfaceContext` | `true` | 给 agent 提供 GUI 定位上下文,并把 `DSH_WEB_URL` 暴露给其 shell 命令 |
| `trustedHosts` | `[]` | 允许从网络访问 GUI 的额外主机 |
生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-web-app)是每个受支持字段及其 JSDoc 的穷尽式真源。
### LAN 访问与可信主机
-默认情况下 GUI 只接受本机的连接。绑定所有网络接口的部署也会允许 LAN 内的浏览器访问,此时打印的 URL 会附带一个 LAN 地址;`--trusted-host` 在两种情况下都能添加额外主机。Host 与 Origin 检查控制可达性,token 交换则认证每个 Host API 方法与 WebSocket stream。LAN 地址只在启动时采样一次,因此之后的网络变化不会被感知——重启 GUI 以重新公告。
+默认情况下 GUI 只接受本机的连接。绑定所有网络接口的部署也会允许 LAN 内的浏览器访问,此时打印的 URL 会附带一个 LAN 地址;`--trusted-host` 在两种情况下都能添加额外主机。Host 与 Origin 检查控制可达性,token 交换则认证每个 Host API 方法与 WebSocket 流。LAN 地址只在启动时采样一次,因此之后的网络变化不会被感知——重启 GUI 以重新公告。
### 通过 SSH 运行
@@ -59,7 +59,7 @@ dsh --profile web --no-open --port 8080
### 按会话的 agent 设置
-每个浏览器会话都从随发行版交付的 preset(默认 `standard`)组合自己的 agent(智能体),而不是共享一套进程级工具集。你可以更改默认 preset,或在 `$DSH_HOME/.agent-presets` 下添加自己的 preset。
+每个浏览器会话都从随发行版交付的 preset(默认 `standard`)组合自己的 agent,而不是共享一套进程级工具集。你可以更改默认 preset,或在 `$DSH_HOME/.agent-presets` 下添加自己的 preset。
-----
@@ -69,7 +69,7 @@ dsh --profile web --no-open --port 8080
实现细节——点击展开
-本组合包是一份 patch 加一个运行时粘合插件。patch 重述 base 刻意省略的表层专属值,插入仅 Web 使用的宿主行与浏览器名录,然后把 agent 层移到 preset 之后;粘合插件负责 dist 服务、信任采样、提示词段落、bash 变量与就绪宣告。
+本组合包是一份 patch 加一个运行时粘合插件。存储栈与投影缓存来自 `dsh-base`;Web 叠加层的 workspace 与 message-feedback 行使用共享的 `storageDomain` 服务。patch 重述 base 刻意省略的表层专属值,插入仅 Web 使用的宿主行与浏览器名录,然后把 agent 层改由 preset 承载;粘合插件负责 dist 服务、信任采样、提示词段落、bash 变量与就绪宣告。
### patch 语义
@@ -89,16 +89,16 @@ URL 行与浏览器交接都是就绪信号:监督方一观察到该行就发
|---|---|
| [`src/index.ts`](src/index.ts) | `web-app` 粘合插件:dist 解析、LAN 信任采样、提示词段落、bash 变量、URL 行、浏览器交接 |
| [`src/startup.ts`](src/startup.ts) | `web-startup` 提供方:`--host`、`--port`、`--trusted-host`、`--no-open`、`--help` |
-| [`cordis.patch.yml`](cordis.patch.yml) | Web patch:重述的基础值、Web 宿主行、浏览器名录、preset 之后的 agent 层 |
-| — | 不发布运行时不变式伴生入口;本包只持有静态 contribution 列表,每项 contribution 都由其 registry 释放。 |
-| [`tests/web-app.spec.ts`](tests/web-app.spec.ts) | dist 解析、fallback 席位、提示词段落、就绪宣告 |
+| [`cordis.patch.yml`](cordis.patch.yml) | Web patch:重述的基础值、Web 宿主行、浏览器名录、由 preset 承载的 agent 层 |
+| — | 不发布运行时不变式伴生入口;每项贡献(frontend-static 子插件、提示词段落、bashEnv 注册)都会随 fiber 由注册表释放,且每个所属注册表的包负责该关系的不变式;本包不持有需要审计的可变状态。 |
+| [`tests/web-app.spec.ts`](tests/web-app.spec.ts) | dist 解析、回退席位、提示词段落、就绪宣告 |
| [`tests/startup.spec.ts`](tests/startup.spec.ts) | 在真实 Loader 树上的命令行解析 |
| [`tests/trusted-hosts.spec.ts`](tests/trusted-hosts.spec.ts) | LAN 信任采样 |
| [`tests/browser-open.spec.ts`](tests/browser-open.spec.ts) | 页面可达后的默认浏览器交接 |
### 不变式归属
-不发布不变式伴生入口,因为每项贡献——frontend-static 子插件、提示词段落与 bash 变量注册——都会随 fiber 由 registry 释放,且每个所属 registry 的包负责该关系的不变式。
+不发布不变式伴生入口,因为每项贡献——frontend-static 子插件、提示词段落与 bash 变量注册——都会随 fiber 由注册表释放,且每个所属注册表的包负责该关系的不变式。
@@ -109,7 +109,7 @@ URL 行与浏览器交接都是就绪信号:监督方一观察到该行就发
当你想深入了解共享核心、浏览器重载流水线或已构建的前端时,阅读以下页面。
-- [组合包包映射](../README.zh.md)——基于同一核心构建的表层。
+- [组合包索引](../README.zh.md)——基于同一核心构建的表层。
- [dsh-base](../base/README.zh.md)——GUI 运行其上的共享核心。
- [dsh-client-hmr](../../client/hmr/README.zh.md)——开发期间客户端插件变更如何重载。
- [frontend-static](../../host/frontend-static/README.zh.md)——已构建的前端如何被服务。
diff --git a/packages/client/README.i18n.yaml b/packages/client/README.i18n.yaml
index c23797ba1f..d6d400b65c 100644
--- a/packages/client/README.i18n.yaml
+++ b/packages/client/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/client/README.md
README.md: 6bb433b8411fa9db3d6de981a24895e3c7b674c4
-README.zh.md: c04292b86becba404e5dbb58ca924833ee88f58b
+README.zh.md: 9d015d914b67ad677d6662c8d6c01ae95cb9dcbe
diff --git a/packages/client/README.zh.md b/packages/client/README.zh.md
index c04292b86b..9d015d914b 100644
--- a/packages/client/README.zh.md
+++ b/packages/client/README.zh.md
@@ -30,19 +30,19 @@ kind: "package-group"
| [`modules/`](modules/README.zh.md) | 加载浏览器侧客户端模块 | `ctx.clientModules` / `ctx.modules` |
| [`connection/`](connection/README.zh.md) | 维护浏览器与宿主之间的 RPC 通信与事件投递 | `ctx.connection` |
| [`file-upload/`](file-upload/README.zh.md) | 在页面线程之外发送原始 Blob 与字节流请求体 | `ctx.fileUpload` |
-| [`store/`](store/README.zh.md) | 提供不依赖 React 的 observable 与 snapshot-store 原语 | — |
+| [`store/`](store/README.zh.md) | 提供不依赖 React 的 observable 与快照存储原语 | — |
| [`hmr/`](hmr/README.zh.md) | 在开发期间刷新客户端插件 | — |
| [`locale/`](locale/README.zh.md) | 提供本地化偏好与消息词典 | `ctx.locale` |
| [`test-runtime/`](../test-support/client-runtime/README.zh.md) | 为客户端功能包提供共享的仓库测试支持 | — |
| [`ui-renderer/`](ui-renderer/README.zh.md) | 将 slot 数据绑定到 React,并挂载组装完成的应用 | `ctx.uiRenderer` |
| [`ui-slots/`](ui-slots/README.zh.md) | 定义 UI 功能注册与组合扩展 slot 的方式 | — |
-| [`ui-session/`](ui-session/README.zh.md) | 把 Session Controller 状态适配为标准 Slot source 与 hook | — |
+| [`ui-session/`](ui-session/README.zh.md) | 把会话控制器状态适配为标准 Slot source 与钩子 | — |
| [`ui-theme/`](ui-theme/README.zh.md) | 应用所选颜色主题 | — |
| [`ui-primitives/`](ui-primitives/README.zh.md) | 提供共享 React 控件、图标与内容渲染器 | — |
| [`ui-attachment/`](ui-attachment/README.zh.md) | 注册输入框与消息图片的附件呈现 | — |
| [`ui-layout/`](ui-layout/README.zh.md) | 排列应用的主要区域 | — |
| [`ui-sidebar/`](ui-sidebar/README.zh.md) | 展示工作区与会话导航 | — |
-| [`resources/`](resources/README.zh.md) | 统一资源模型:`useResource` 会话标准 hook 背后的协议提供者 | `ctx.resources` |
+| [`resources/`](resources/README.zh.md) | 统一资源模型:`useResource` 会话标准钩子背后的协议提供方 | `ctx.resources` |
| [`ui-sidebar-files/`](ui-sidebar-files/README.zh.md) | 右侧 Sidebar 的工作区文件树 tab 类型 | — |
| [`ui-brand-official/`](ui-brand-official/README.zh.md) | 用官方名称与标记填充通用浏览器品牌 slot | — |
| [`ui-workspace/`](ui-workspace/README.zh.md) | 提供工作区选择与创建界面 | — |
@@ -57,24 +57,24 @@ kind: "package-group"
| [`ui-input-trigger/`](ui-input-trigger/README.zh.md) | 协调内联命令与引用建议 | — |
| [`ui-skill/`](ui-skill/README.zh.md) | 向内联建议添加 skill(技能)引用 | — |
| [`ui-reference/`](ui-reference/README.zh.md) | 统一的 Web `@file` / `@session` 引用 source | — |
-| [`ui-subagent/`](ui-subagent/README.zh.md) | 提供 subagent(子智能体)导航、子级 transcript(文本记录)状态与内联引用 | — |
-| [`ui-schedule/`](ui-schedule/README.zh.md) | 在只读标题栏目录中列出当前 Session 的活动提醒 | — |
+| [`ui-subagent/`](ui-subagent/README.zh.md) | 提供 subagent 导航、子级 transcript(文本记录)状态与内联引用 | — |
+| [`ui-schedule/`](ui-schedule/README.zh.md) | 在只读标题栏目录中列出当前会话中生效的提醒 | — |
| [`ui-jobs/`](ui-jobs/README.zh.md) | 在会话标题栏列出当前会话的后台任务 | — |
| [`ui-model-selection/`](ui-model-selection/README.zh.md) | 在对话界面中提供模型选择 | — |
| [`ui-permission-presets/`](ui-permission-presets/README.zh.md) | 配置默认权限并切换当前会话的访问模式 | — |
| [`ui-plan/`](ui-plan/README.zh.md) | 展示生效中的 plan mode 状态及其退出控件 | — |
-| [`ui-settings-plugins/`](ui-settings-plugins/README.zh.md) | 拥有“插件”设置分区、其标签页扩展点与可配置的宿主平面插件卡片 | — |
+| [`ui-settings-plugins/`](ui-settings-plugins/README.zh.md) | 负责「插件」设置分区、其标签页扩展点与可配置的宿主平面插件卡片 | — |
| [`ui-user-questions/`](ui-user-questions/README.zh.md) | 展示 agent 请求的交互式问题 | — |
| [`ui-agent-preset/`](ui-agent-preset/README.zh.md) | 选择会话的 agent 预设并编写预设组合 | — |
| [`ui-settings/`](ui-settings/README.zh.md) | 承载设置界面及其扩展区域 | — |
| [`ui-settings-general/`](ui-settings-general/README.zh.md) | 提供常规设置分区 | — |
| [`ui-settings-models/`](ui-settings-models/README.zh.md) | 提供模型提供方配置与 DeepSeek 引导 | — |
-| [`ui-settings-plugin-inventory/`](ui-settings-plugin-inventory/README.zh.md) | 向“插件”设置贡献只读的 Host Loader 清单标签页 | — |
+| [`ui-settings-plugin-inventory/`](ui-settings-plugin-inventory/README.zh.md) | 向「插件」设置贡献只读的 Host Loader 清单标签页 | — |
| [`ui-deliverables/`](ui-deliverables/README.zh.md) | 生成已产出文件的轮次尾部与可点击的最终响应文件引用 | — |
| [`ui-message-feedback/`](ui-message-feedback/README.zh.md) | 向助手消息操作条贡献逐消息反馈控件 | — |
| [`ui-directory-picker-browse/`](ui-directory-picker-browse/README.zh.md) | 面向工作区目录流程的应用内目录浏览界面 | — |
| [`ui-directory-picker-native/`](ui-directory-picker-native/README.zh.md) | 驱动宿主 OS 选择器的原生目录选择界面 | — |
-| [`ui-open-in-app/`](ui-open-in-app/README.zh.md) | 在已安装应用中打开 workspace 目录的会话头部分体按钮 | — |
+| [`ui-open-in-app/`](ui-open-in-app/README.zh.md) | 在已安装应用中打开工作区目录的会话标题栏拆分按钮 | — |
-----
@@ -84,7 +84,7 @@ kind: "package-group"
先从子系统参考与两份拥有跨包组合决策的 Agent Note 读起,再看服务于本页的宿主半侧。
- [客户端模块子系统](../../docs/subsystems/client-modules.zh.md)——web 插件表:`dsh.client` 声明、启动图协议与 bundle 路由。
-- [slot 系统标准](../../.agents/notes/implemented/architecture/2026-07-22-slot-type-chain-implementation.zh.md)——权威 slot 模型:注册、props 份额与 store。
+- [slot 系统标准](../../.agents/notes/implemented/architecture/2026-07-22-slot-type-chain-implementation.zh.md)——权威 slot 模型:注册、props 份额与存储。
- [web 客户端架构 Agent Note](../../.agents/notes/implemented/architecture/2026-07-19-gui-web-client-architecture.zh.md)——加载链、对象层与客户端服务。
- [宿主组地图](../host/README.zh.md)——服务于本浏览器半侧的宿主半侧。
diff --git a/packages/client/connection/README.i18n.yaml b/packages/client/connection/README.i18n.yaml
index 27b847754e..8ed7cbac92 100644
--- a/packages/client/connection/README.i18n.yaml
+++ b/packages/client/connection/README.i18n.yaml
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/client/connection/README.md
README.md: 865c894403d2177e15085d0616289cf8950b555d
-README.zh.md: 3d299a4be7b3490298554982eed6d99fbba9718c
+README.zh.md: d3d0a62035b1770ecc1b9f81aa775dad0c86cb11
diff --git a/packages/client/connection/README.zh.md b/packages/client/connection/README.zh.md
index 3d299a4be7..d3d0a62035 100644
--- a/packages/client/connection/README.zh.md
+++ b/packages/client/connection/README.zh.md
@@ -1,5 +1,5 @@
---
-description: "Web GUI 的浏览器-Host 线层:Remote RPC、带重连的事件流投递、精确 Fetch 路由、/api HTTP 桥与浏览器信任栅栏。"
+description: "Web GUI 的浏览器与 Host 之间的协议层:Remote RPC、带重连的事件流投递、精确 Fetch 路由、/api HTTP 桥与浏览器信任栅栏。"
kind: "package-reference"
---
@@ -32,7 +32,7 @@ kind: "package-reference"
## 浏览器认证与请求信任
-每个 Host RPC 方法和 WebSocket stream 都要求同一个浏览器会话,不存在按方法区分的 loopback 层。每个进程生成一个随机启动令牌。`dsh-web-app` 打印并打开带 `?token=...` 的普通根 URL;`frontend-static` 把根路径和 index 请求交给 `ctx.connection.authorizeIndex`,后者只在 `GET /` 接受该令牌,写入绑定 authority 的签名 cookie,再重定向到干净的 `/`。缺失、过期、畸形或 authority 不匹配的 cookie 会在 RPC 分发前得到 401。静态资源保持公开。HTTP 载体不在根路径交换之外接受 query token,也不接受 Authorization header token。
+每个 Host RPC 方法和 WebSocket 流都要求一个浏览器会话,不存在按方法区分的 loopback 层。每个进程生成一个随机启动令牌。`dsh-web-app` 打印并打开带 `?token=...` 的普通根 URL;`frontend-static` 把根路径和 index 请求交给 `ctx.connection.authorizeIndex`,后者只在 `GET /` 接受该令牌,写入绑定 authority 的签名 cookie,再重定向到干净的 `/`。缺失、过期、畸形或 authority 不匹配的 cookie 会在 RPC 分发前得到 401。静态资源保持公开。HTTP 载体不在根路径交换之外接受 query token,也不接受 Authorization header token。
cookie 签名密钥是 `ctx.credentials` 中由 `client-connection/browser-session` 拥有的 grant 记录。本地提供方把它持久化到 `$DSH_HOME/.credentials.yaml`;`BrowserAuth` 在 Connection 激活期间加载或创建该记录,并把密钥留在内存中,因此请求认证同步执行。删除或替换该记录会在下一次 Connection 激活时生效。cookie 携带绝对签发与过期区间,`cookieMaxAgeDays` 默认设为 30 天,并在确定性名称与签名 payload 中同时绑定规范化 hostname 和 port。它是 host-only、`Path=/`、`HttpOnly`、`SameSite=Strict`;随附服务器使用 loopback HTTP,因此刻意不设置 `Secure`。
@@ -41,13 +41,13 @@ cookie 签名密钥是 `ctx.credentials` 中由 `client-connection/browser-sessi
## Connection generation
-API Gateway Client 把内部 `$events` logical stream 注册为唯一 generation source,与有无 `$on` 订阅无关。Host 在 API Remotes source factory 同步挂好所有增量 listener 后,先发送唯一 `{ type: 'ready', clientId, host: { home } }` 项,再发送事件。`ConnectionController` 仅在收到该 ready 项后发布 generation 并调用 `onConnected`,因此 baseline 不会跑在增量 listener 前面。
+API Gateway Client 把内部 `$events` 逻辑流注册为唯一 generation source,与有无 `$on` 订阅无关。Host 在 API Remotes source factory 同步挂好所有增量 listener 后,先发送唯一 `{ type: 'ready', clientId, host: { home } }` 项,再发送事件。`ConnectionController` 仅在收到该 ready 项后发布 generation 并调用 `onConnected`,因此 baseline 不会跑在增量 listener 前面。
-`$events` 结束、返回 Remote stream error、收到非 ready 首项或畸形事件项,都会使当前 generation 失效。默认情况下,挂起的握手在 3 秒后记录 Host 响应缓慢告警,在 15 秒后记录就绪超时并中止,包含等待物理 socket 的时间。取消后,source 必须停止投递、释放资源并结束,替换 source 才能启动;已取消 source 迟到的 ready 不能发布 generation。浏览器报告网络可用时,Controller 发布 `connecting`,并在 500ms、1s、2s、4s、8s 与 10s 上限内采用 50%–100% 抖动重试,达到终档后继续尝试直到恢复。每次重试都要求 Gateway 替换一次物理 WebSocket,再重开 `$events`。[持续恢复决策](../../../.agents/notes/implemented/bug-fix/2026-09-05-continuous-client-recovery.zh.md)规定握手期限与重试策略。
+`$events` 结束、Remote 流报错、收到非 ready 首项或畸形事件项,都会使当前 generation 失效。默认情况下,挂起的握手在 3 秒后记录 Host 响应缓慢告警,在 15 秒后记录就绪超时并中止,包含等待物理 socket 的时间。取消后,source 必须停止投递、释放资源并结束,替换 source 才能启动;已取消 source 迟到的 ready 不能发布 generation。浏览器报告网络可用时,Controller 发布 `connecting`,并在 500ms、1s、2s、4s、8s 与 10s 上限内采用 50%–100% 抖动重试,达到终档后继续尝试直到恢复。每次重试都要求 Gateway 替换一次物理 WebSocket,再重开 `$events`。[持续恢复决策](../../../.agents/notes/implemented/bug-fix/2026-09-05-continuous-client-recovery.zh.md)规定握手期限与重试策略。
`ctx.connection.reconnect()` 会中断活动工作、重置序列,并立即开始 retry 1。浏览器 `offline` 会中断活动工作、发布 `disconnected` 并暂停自动尝试;下一次 `online` 转换会重置序列并从 500ms 档开始。只有 ready 项会发布 `connected`。Gateway mux 不拥有独立重试调度。
-可通过 Host Connection 行的 `config.recovery` 覆盖重试上限、增长因子或握手告警与取消时间;[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-client-connection)列出接受的字段。Host 校验这些值并注入每个已服务页面。Client 在提供 Connection 前校验启动数据,并在 Gateway 启动循环时采用这些默认值;显式传给 `start()` 的时序覆盖优先。增长因子必须是至少为一的有限数。若就绪、失败、取消或硬期限先于告警发生,该告警会被取消。修改 Host 恢复配置后需重新加载页面。
+可通过 Host Connection 行的 `config.recovery` 覆盖重试上限、增长因子或握手告警与取消时间;[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-client-connection)列出接受的字段。Host 校验这些值,并将其注入所提供的每个页面。Client 在提供 Connection 前校验启动数据,并在 Gateway 启动循环时采用这些默认值;显式传给 `start()` 的时序覆盖优先。增长因子必须是至少为一的有限数。若就绪、失败、取消或硬期限先于告警发生,该告警会被取消。修改 Host 恢复配置后需重新加载页面。
@@ -64,7 +64,7 @@ API Gateway Client 把内部 `$events` logical stream 注册为唯一 generation
- **缓冲型 `/api` 路由会把每个请求体保留在内存里**:`maxRequestBodyBytes`(默认 300 MiB,按默认 200 MiB 图片总量上限经 base64 膨胀加信封余量得出)限制普通图片与 RPC 信封。显式启用的流式路由接收带背压的分块并绕过总量上限;路由实现负责持久化、取消与存储配额。
-- **浏览器 cookie 不带 `Secure`**:随附载体是 loopback HTTP;若部署经明文网络暴露同一 authority,bearer cookie 可能在传输中泄露。
+- **浏览器 cookie 不带 `Secure`**:当前随产品提供的传输方式是 loopback HTTP;若部署经明文网络暴露同一 authority,bearer cookie 可能在传输中泄露。
- **没有 logout 操作**:清除浏览器 cookie 会结束单个浏览器会话;删除 owner 凭据记录并重启 `dsh` 会撤销全部会话。
@@ -78,4 +78,4 @@ API Gateway Client 把内部 `$events` logical stream 注册为唯一 generation
-**运行时不变式:** 不发布伴生入口。授权请求会异步读取 credential 权威记录,commit-event 生命周期由 credentials 伴生入口负责;流、重连、rpcId 与路由释放关系由行为测试及 webserver 不变式覆盖。
+**运行时不变式:** 不发布伴生入口。浏览器会话验证会在请求授权工作时异步读取凭据记录,而记录的 commit-event 生命周期由 credentials 伴生入口负责;流与重连的时序及 rpcId 往返约束由行为规范直接验证,路由注册与 dispose(资源释放)的对称性由 webserver 伴生入口审计。
diff --git a/packages/client/hmr/README.i18n.yaml b/packages/client/hmr/README.i18n.yaml
index 047249b5b7..49e7266545 100644
--- a/packages/client/hmr/README.i18n.yaml
+++ b/packages/client/hmr/README.i18n.yaml
@@ -2,5 +2,5 @@
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/client/hmr/README.md
-README.md: de420ef2c809ccc13feea320ae3ffda3720f82a3
-README.zh.md: c7066e369b38fa3ffda6888831bba7780c5da8af
+README.md: 26bc640c6cdd213fbc78de920e12444589901990
+README.zh.md: 72d941f678e7e29a56bca678a79c4740667e7e6b
diff --git a/packages/client/hmr/README.md b/packages/client/hmr/README.md
index de420ef2c8..26bc640c6c 100644
--- a/packages/client/hmr/README.md
+++ b/packages/client/hmr/README.md
@@ -63,11 +63,11 @@ The chain is two halves with one contract: the node half owns bundle detection a
### The browser swap
-On a `rebuilt` frame the revision makes `invalidate` select that plugin's immutable one-resource combo URL instead of its initial multi-resource URL. `prefetch` loads and registers the new factory while the old fiber still serves. The remaining order is registry-first teardown (`registry.delete` before the fiber's disposer emits `internal/plugin`, or the vendored Loader flags the entry disabled), drain the old fiber's unload, delete `entry.fiber`, remove owned `