docs(i18n): proofread README translations 161-180

This commit is contained in:
j-xiang
2026-07-29 15:29:39 +08:00
parent a37097846b
commit bc7086a087
20 changed files with 189 additions and 189 deletions

View File

@@ -2,7 +2,7 @@
[English](README.md) | 中文
`Branded<B>` 名义类型原语:一个微小的**仅类型** 包(无运行时代码, harness 包依赖),由每个拥有跨边界 id 的包共享。
`Branded<B>` 名义类型原语:一个微小的**仅类型**包(package无运行时代码,也不依赖其他 harness 包;所有负责跨边界 id 的包都会共享
## `Branded` 是什么
@@ -19,10 +19,10 @@ export function SessionId(id: string): SessionId {
}
```
构造操作通过所属包中针对每个 id 的工厂完成。比较、日志记录、JSON 序列化和协议格式与普通字符串表现相同;品牌会在编译时被擦除。
构造操作通过所属包中 id 专用的工厂完成。比较、日志记录、JSON 序列化和协议格式wire format的行为与普通字符串相同;品牌信息会在编译时被擦除。
## 策略:为跨包边界的 id 添加品牌
包为自己拥有的 id 添加品牌:`CallId` 位于 `dsh-llm`,共享的 agent/会话 `SessionId` 位于 `dsh-session``TaskId` 位于 `dsh-tasks`。为可能被混淆的跨包 id 添加品牌,但无需为每个字符串都添加。
该包只负责原语。保持无依赖意味着,例如 `dsh-tasks` 可以为 `TaskId` 添加品牌,而无需仅为使用 `Branded` 而导入不相关的功能包。
该包只负责这一原语。保持无依赖意味着,例如 `dsh-tasks` 可以为 `TaskId` 使用品牌类型,而无需仅为使用 `Branded` 而导入不相关的功能包。

View File

@@ -16,9 +16,9 @@ DeepSeek Harness 用户数据的共享文件系统路径辅助工具。
`expandHomePath()` 使用操作系统主目录展开 `~``~/...` 和 Windows 风格的 `~\...` 前缀。它会保留非波浪号路径和 `~user/...` 原样不变。
该包刻意保持规模小且不依赖 harness以便产品包共享用户数据路径约定而不必彼此依赖。
该包package刻意保持规模小且不依赖 harness以便产品包共享用户数据路径约定而不必彼此依赖。
## 已知限制与待完成工作
## 已知限制与暂缓事项
- **展开范围刻意保持狭窄**:只有单独的 `~``~/...``~\...` 使用当前操作系统主目录;`~alice/...` 等指定用户的形式、环境变量和 shell 表达式保持不变。
- **辅助工具不会操作文件系统**:调用方仍负责目录创建、存在性检查、权限,以及对结果路径应用信任策略。

View File

@@ -2,11 +2,11 @@
[English](README.md) | 中文
一个轻依赖的**保留** 库:为必须限制返回上下文量的工具提供有界的面向模型输出。调用方将项或文本分片送入有界对象,然后取回保留的内容和精确的省略元数据。
一个轻依赖的**保留**库:为必须限制返回上下文量的工具提供有界的面向模型输出。调用方将项或文本分片送入有界对象,然后取回保留的内容和精确的省略元数据。
该库**只** 负责这个机制问题:*「我们保留了什么,又省略了什么?」*。工具专用代码保留其业务语义文件分组、行号、退出码、提供方错误状态、每行预览截断、spill 文件以及面向模型的文案。这就是 [Agent Note](../../../.agents/notes/implemented/architecture/2026-07-06-tool-result-retention-library.md) 划定的边界。
该库**只**负责这个机制问题:*「我们保留了什么,又省略了什么?」*。工具专用代码保留其业务语义文件分组、行号、退出码、提供方错误状态、每行预览截断、spill 文件以及面向模型的文案。这就是 [Agent Noteagent 决策记录)](../../../.agents/notes/implemented/architecture/2026-07-06-tool-result-retention-library.md) 划定的边界。
它是**库,而非服务或插件**:没有 `ctx`,不注册任何内容,不发出任何事件。状态只存在于每个 retainer一次累积绝不跨调用。工具包直接导入它。
它是**库,而非服务或插件**:没有 `ctx`,不注册任何内容,不发出任何事件。状态只存在于每个 retainer一次累积绝不跨调用。工具包package直接导入它。
## 对外接口
@@ -32,18 +32,18 @@ import type {
## 资源模式
两个 retainer 使用独立名称,而不是同一个通用收集器,因为它们的**资源模型** 不同。
两个 retainer 使用独立名称,而不是同一个通用收集器,因为它们的**资源模型**不同。
- **`ItemRetainer` 限制有序逻辑单元**。搜索工具可收集完整结果集用于 spill 文件恢复,同时只为面向模型的预览保留前 `maxItems` 项。因为调用方会继续送入每个已观察到的项,所以省略数量是精确的。
- **`TextRetainer` 限制面向字节的文本**。`head``tail``headTail``finish()` 时保留 UTF-8 边界;`headTail``dsh-spill-policy` 用于围绕 spill 文件通知构建有界预览的形态。
## `truncated` 是预算事实,绝不表示「不完整」
`truncated` 表示*因为预算限制retainer 省略了本可获得的内容*。它**不** 表示上游不完整。权限失败、跳过二进制文件、提供方部分失败、不可读候选项和无效 UTF-8 保留在工具领域字段中,绝不合并到 `truncated`。将两者混为一谈是该库命名最容易诱发的缺陷;务必保持分离。
`truncated` 表示*因为预算限制retainer 省略了本可获得的内容*。它**不**表示上游不完整。权限失败、跳过二进制文件、提供方部分失败、不可读候选项和无效 UTF-8 保留在工具领域字段中,绝不合并到 `truncated`。将两者混为一谈是该库命名最容易诱发的缺陷;务必保持分离。
## 字节,而非字符
文本上限和 `omittedBytes` 按**字节** 计数,以保证进程/正文安全(子进程 pipe 和 HTTP 正文都是字节流)。跨越码点的分片会被正确处理:`finish()` 会修剪每个切割位置的不完整码点,使返回文本绝不在边界引入替换字符;首尾两侧会分开解码,因此绝不会跨越被省略的中间部分重建码点。按字符或行限制的预览预算属于独立的工具职责。
文本上限和 `omittedBytes` 按**字节**计数,以保证进程/正文安全(子进程管道和 HTTP 正文都是字节流)。跨越码点的分片会被正确处理:`finish()` 会修剪每个切割位置的不完整码点,使返回文本绝不在边界引入替换字符;首尾两侧会分开解码,因此绝不会跨越被省略的中间部分重建码点。按字符或行限制的预览预算属于独立的工具职责。
## 工具映射
@@ -51,11 +51,11 @@ import type {
| 工具 | Retainer 与策略 | 说明 |
|---|---|---|
| `glob` | `ItemRetainer<FsGlobEntry>`, `head` | 收集完整的已排序路径列表用于 spill 文件,同时在内联位置保留第一页。路径映射、已跳过候选项和 `incomplete` 保留在外部。 |
| `grep` | `ItemRetainer<FlatGrepMatch>`, `head` | 收集匹配项用于 spill 文件,同时在内联位置保留第一页。每个匹配项的预览截断、分组、排序和 `incomplete` 保留在外部。 |
| `bash` | `TextRetainer`, `tail` or `headTail` | 执行器仍负责 spill 文件、退出状态、信号、超时和后台任务。 |
| `web_fetch` | `TextRetainer`, `head` or `headTail` | 提供方/资源上限保留为提供方事实retainer 只提供保留文本和省略元数据。 |
| `web_search` | `ItemRetainer<WebSearchSource>`, `head` | 当提供方返回的来源超过面向模型的结果应包含的数量时,标准化「来源已达上限」通知。 |
| `glob` | `ItemRetainer<FsGlobEntry>``head` | 收集完整的已排序路径列表用于 spill 文件,同时在内联位置保留第一页。路径映射、已跳过候选项和 `incomplete` 保留在外部。 |
| `grep` | `ItemRetainer<FlatGrepMatch>``head` | 收集匹配项用于 spill 文件,同时在内联位置保留第一页。每个匹配项的预览截断、分组、排序和 `incomplete` 保留在外部。 |
| `bash` | `TextRetainer``tail` `headTail` | 执行器仍负责 spill 文件、退出状态、信号、超时和后台任务。 |
| `web_fetch` | `TextRetainer``head` `headTail` | 提供方/资源上限保留为提供方事实retainer 只提供保留文本和省略元数据。 |
| `web_search` | `ItemRetainer<WebSearchSource>``head` | 当提供方返回的来源超过面向模型的结果应包含的数量时,标准化「来源已达上限」通知。 |
`read` **刻意不在 v1 范围内**。其 `read-render` 辅助工具负责文件专用的分页契约:`offset`/`limit`、行号、`totalLines`、偏移越界错误、每行预览截断、针对已选窗口的字节上限。这是行窗口渲染器,而非通用保留机制。单个 `Omitted` 数量无法表示行窗口两侧。
@@ -89,9 +89,9 @@ const footer = formatRetentionNotice(
#### KV 缓存影响
不直接导致失效;指定的消费方负责其引起的任何请求前缀变更
直接导致 KV Cache 失效;请求前缀变更由上述消费方负责
## 已知限制与待完成工作
## 已知限制与暂缓事项
- **项保留只支持 `head`**tail、head/tail、分页、分组和提供方完整性语义仍由工具负责。
- **文本保留面向字节**`read` 分页等行窗口和字符窗口需要单独的渲染器;切割可能会丢弃部分 UTF-8 边界字节,以保持返回文本有效。

View File

@@ -2,9 +2,9 @@
[English](README.md) | 中文
超时的**时序与分类** 部分:一个零依赖纯函数库(无运行时 harness 依赖),由每个需要限制调用方超时提示、启动 deadline并在之后区分「已超时」与「已取消」的功能共享。
超时的**时序与分类**部分:一个零依赖纯函数库(无运行时 harness 依赖),由每个需要限制调用方超时提示、启动 deadline并在之后区分「已超时」与「已取消」的功能共享。
它**不负责终止**。它发出的信号只会*通知*真正停止工作仍由各功能负责因为机制各不相同bash 对操作系统进程组发送 SIGKILLweb 拆除 `fetch` socket,没有任何共享层能够承担全部终止机制。[Agent Note](../../../.agents/notes/implemented/architecture/2026-07-06-timeout-deadline-library.md) 将边界划定为:共享时序/分类,将强制终止保留在本地。
它**不负责终止**。它发出的信号只会*通知*真正停止工作仍由各功能负责因为机制各不相同bash 对操作系统进程组发送 SIGKILLweb 关闭 `fetch` 套接字,没有任何共享层能够承担全部终止机制。[Agent Noteagent 决策记录)](../../../.agents/notes/implemented/architecture/2026-07-06-timeout-deadline-library.md) 将边界划定为:共享时序/分类,将强制终止保留在本地。
它是**库,而非服务或插件**:没有 `ctx`,不注册任何内容,不持有状态,也不发出事件。「超时服务」必须了解如何停止每项功能的工作,这正是微内核要排除在共享层之外的知识。
@@ -16,16 +16,16 @@ import { clampTimeout, deadline, idleWatchdog, MAX_TIMER_DELAY_MS, timeoutOf, Ti
| 导出项 | 职责 |
|---|---|
| `clampTimeout(requested, def, max, name?)` | 验证调用方可选的有限提示,从 `def` 填充,并限制在 `max` 以内。如果提示为正数或有限数,则抛出错误(包含 `name`)。 |
| `clampTimeout(requested, def, max, name?)` | 验证调用方可选的、值为正且有限提示,从 `def` 填充,并限制在 `max` 以内。如果提示为正数或有限数,则抛出错误(包含 `name`)。 |
| `deadline(upstream, timeoutMs, code)` | 将 `upstream` 取消与超时融合为一个 `AbortSignal``AbortSignal.any`);超时携带 `TimeoutReason``[Symbol.dispose]` 清除 timer。 |
| `idleWatchdog(upstream, timeoutMs, code)` | 保持一个稳定的融合信号,并且只在受保护的异步迭代器 `next()` 尚未完成时启动。解析后取消启动后续需求重新启动dispose 清除;并发需求被拒绝。 |
| `MAX_TIMER_DELAY_MS` | Node 在不将延迟限制为 1 毫秒时可调度的最大延迟(`2_147_483_647`)。拥有 timer 的配置不得超过该值。 |
| `idleWatchdog(upstream, timeoutMs, code)` | 保持一个稳定的融合信号,并且只在受保护的异步迭代器 `next()` 尚未完成时启动 timer。完成后停止 timer;后续需求重新启动 timerdispose(资源释放)时清除;并发需求被拒绝。 |
| `MAX_TIMER_DELAY_MS` | Node 在不将延迟限制为 1 毫秒时可调度的最大延迟(`2_147_483_647`)。负责 timer 的配置不得超过该值。 |
| `timeoutOf(signal \| { reason }, code?)` | 从已中止的信号/错误中恢复 `TimeoutReason`,否则返回 `undefined`,即超时与取消的分类器。传入 `code` 可仅匹配这个 deadline 的 timer见下文的嵌套。 |
| `TimeoutReason` | 在超时中止上的内部原因(`code` + `timeoutMs`)。它不是公开错误;提供方将其转换为自己的错误/字段。 |
| `TimeoutReason` | 标记在超时中止上的内部原因(`code` + `timeoutMs`)。它不是公开错误;提供方将其转换为自己的错误/字段。 |
## `timeoutMs <= 0` 哨兵值
`0` 是后端自有后台工作bash `start()`)使用的「无超时」值,其可见范围为:**内部**`deadline()` 不启动 timer只转发 `upstream`;如果也没有 upstream它将返回永不中止的信号和无操作 disposer因此每个调用方都能保持同一种调用形态。外部请求提示会通过 `clampTimeout` 验证为**正有限数**,之后才进入 `deadline`,因此 `0` 绝不是面向模型/插件的「禁用超时」值。
`0` 是后端自有后台工作bash `start()`)使用的**内部**「无超时」值。`deadline()` 不启动 timer只转发 `upstream`;如果也没有 upstream它将返回永不中止的信号和无操作 disposer因此每个调用方都能保持同一种调用形态。外部请求提示会通过 `clampTimeout` 验证为**正有限数**,之后才进入 `deadline`,因此 `0` 绝不是面向模型/插件的「禁用超时」值。
## 使用形态
@@ -44,15 +44,15 @@ export async function runWithDeadline(upstream: AbortSignal | undefined, timeout
}
```
该信号只会*通知*;调用方必须接自己的终止机制(`d.signal.addEventListener('abort', kill)`,或将 `d.signal` 传给 `fetch`)。让 promise 与 timer 竞速,会在子进程或 socket 泄漏的情况下就解析工具调用;发出信号则会强制要求存在真正的终止路径。
该信号只会*通知*;调用方必须接自己的终止机制(`d.signal.addEventListener('abort', kill)`,或将 `d.signal` 传给 `fetch`)。让 promise 与 timer 竞速,会在子进程或套接字仍在泄漏时就让工具调用完成;发出信号则会强制要求存在真正的终止路径。
将你自己的 `code` 传给 `timeoutOf`,以便分类可在嵌套中组合:当你收到的 `upstream` *本身*就是 deadline 信号时(未来启动每次调用 deadline 的 `tools/execute` 中间件),如果外层 timer 首先触发,`AbortSignal.any` 会保留外层 `TimeoutReason`。将范围限定为你的 `code`,可将外部超时视为普通 upstream 取消,这才是你所属功能视角下的正确分类,而不会在本地 timer 尚未到期时就声称自己超时。
对于流式传输,创建一个 `idleWatchdog`,将其稳定的 `signal`传输,并为每次提供方读取调用 `watchdog.next(iterator)`。间隔必须为正有限数,且不得超过 `MAX_TIMER_DELAY_MS`;否则 Node 会将其限制为 1 毫秒。它只测量尚未完成的需求因此当下游代码进行渲染或在请求下一个分片前以其他方式等待时timer 不会运行。该原语仍然只会通知因此传输必须观察稳定信号DeepSeek 和 pi-ai 适配器证明,超时会关闭它们的真实响应正文或 SDK 请求。
对于流式传输,创建一个 `idleWatchdog`,将其稳定的 `signal`传输,并为提供方的每次读取调用 `watchdog.next(iterator)`。间隔必须为正有限数,且不得超过 `MAX_TIMER_DELAY_MS`;否则 Node 会将其限制为 1 毫秒。它只尚未完成的读取请求计时因此当下游代码进行渲染或在请求下一个分片前以其他方式等待时timer 不会运行。该原语仍然只会通知,因此传输必须观察稳定信号DeepSeek 和 pi-ai 适配器证明,超时会关闭它们的真实响应正文或 SDK 请求。
## 哪些操作不设置超时
本地文件 `read`/`write`/`edit` 不接受 `timeoutMs`:系统调用多只能尽力中止,超时无法强制 `fsync`/`rename` 停止,而添加超时将成为违反显式优于隐式默认值。详见 [`fs/`](../../fs/README.md)。
本地文件 `read`/`write`/`edit` 不接受 `timeoutMs`中止系统调用多只能尽力而为,超时无法强制 `fsync`/`rename` 停止,而添加超时会引入一个违反显式优于隐式原则的隐式默认值。详见 [`fs/`](../../fs/README.md)。
## 模型体验
@@ -60,11 +60,11 @@ export async function runWithDeadline(upstream: AbortSignal | undefined, timeout
#### KV 缓存影响
不直接导致失效;指定的消费方负责其引起的任何请求前缀变更
直接导致 KV Cache 失效;请求前缀变更由上述消费方负责
## 已知限制与待完成工作
## 已知限制与暂缓事项
- **只发出通知**deadline 无法停止忽略其信号的工作;每项功能仍需要自己的 socket/进程/任务终止路径。
- **`timeoutMs <= 0` 是内部词汇**:只有在所属后端已解析策略后,它才会禁用本地 timer绝不会作为面向模型/插件的公开开关。
- **第一个中止原因决定分类**:当 upstream 取消早于本地 timer 发生时,即使自己的超时之后也会到期,该层也无法再报告。
- **空闲 watchdog 不是总 deadline**:它针对每个尚未完成的迭代器需求重新启动,并刻意排除消费方的思考时间。
- **空闲 watchdog 不是总 deadline**:它针对每个尚未完成的迭代器需求重新启动,并刻意排除消费方的处理时间。