docs(i18n): proofread README translations 101-120

This commit is contained in:
j-xiang
2026-07-29 15:29:38 +08:00
parent 42840394c4
commit f6c8fe4dcb
20 changed files with 164 additions and 164 deletions

View File

@@ -1,19 +1,19 @@
# SDK 包
# SDK 包package
[English](README.md) | 中文
用于创建、编辑、构建和运行 DeepSeek Harness 项目的开发者工具,外加从另一进程驱动 harness 运行时的客户端 SDK 栈。
[功能 Agent Note](../../.agents/notes/proposed/feature/2026-07-14-sdk-developer-projects.md)负责开发者工作流;[架构 Agent Note](../../.agents/notes/proposed/architecture/2026-07-15-sdk-project-editing-architecture.md)负责包与项目编辑边界;[TypeScript SDK Agent Note](../../.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md)负责客户端 SDK 栈。
[功能 Agent Noteagent 决策记录)](../../.agents/notes/proposed/feature/2026-07-14-sdk-developer-projects.md)负责开发者工作流;[架构 Agent Note](../../.agents/notes/proposed/architecture/2026-07-15-sdk-project-editing-architecture.md)负责包与项目编辑边界;[TypeScript SDK Agent Note](../../.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md)负责客户端 SDK 栈。
| 包 | 职责 |
|---|---|
| [`helper`](helper/README.md) | 项目聚合、编辑会话、内置功能、项目文档、模板、包管理器与提示词抽象 |
| [`scripts`](scripts/README.md) | `dsh-sdk` 启动器:`start``dev``build` 和交互式 `config` |
| [`create-sdk`](create-sdk/README.md) | `npm create @deepseek-ai/sdk` 初始化器 |
| [`sdk-protocol`](sdk-protocol/README.md) | 共享的 SDK 运行时线协议:换行分帧的 JSON-RPC 传输 + 具名请求/通知类型 |
| [`sdk-client`](sdk-client/README.md) | TypeScript 客户端 SDK stdio JSON-RPC 驱动 harness 运行时子进程Python SDK 的设计孪生) |
| [`sdk-protocol`](sdk-protocol/README.md) | 共享的 SDK 运行时通信协议:换行符分隔的 JSON-RPC 传输 + 具名请求/通知类型 |
| [`sdk-client`](sdk-client/README.md) | TypeScript 客户端 SDK通过 stdio JSON-RPC 驱动 harness 运行时子进程Python SDK 的设计孪生) |
`@deepseek-ai/create-sdk` 是仓库 `@deepseek-ai/dsh-*` 命名规则的唯一例外npm 的 scoped initializer 约定要求使用该名称,才能支持 `npm create @deepseek-ai/sdk`
生成的项目始终以 `cordis.yml` 作为唯一运行时插件树。`dsh-sdk dev` 只是同一文件周围增加 TypeScript 与本地工作区解析,不会创建仅供开发环境使用的配置。
生成的项目始终以 `cordis.yml` 作为唯一运行时插件树。`dsh-sdk dev` 只是围绕同一文件增加 TypeScript 与本地工作区解析,不会创建仅供开发环境使用的配置。

View File

@@ -2,7 +2,7 @@
[English](README.md) | 中文
用于 `npm create @deepseek-ai/sdk [directory]` 的交互式初始化器。目录/名称/描述都提供可见且可编辑的默认值。树形选择器用于选择功能;选项通过 RightLeft 导航配置,只有选中相应选项后才会询问密钥文本。本地插件创建提供 noneplugintool 三选一。
用于 `npm create @deepseek-ai/sdk [directory]` 的交互式初始化器。目录/名称/描述都提供可见且可编辑的默认值。树形选择器用于选择功能;有限选项通过 RightLeft 导航配置,只有选中相应选项后才会询问密钥文本。本地插件创建提供 noneplugintool 三选一。
受支持的包接口是 `create-sdk` bin。包根不导出任何符号也不导出 workflow、bin、source 或 package-manifest 子路径。
@@ -10,7 +10,7 @@
公开标志包括 `[directory]``--description``--provider``--base-url``--api-key``--model``--interface``--pm``--install``--no-install`,以及无头模式标志 `--config <path>``--config-json <json>``--json`。交互式标志会预填对应问题;无头 spec`--config``--config-json`)会预先提供所有答案和功能方案,因此创建过程无需 TTY并通过 `HeadlessPromptPort` 驱动;若缺少任何必填答案,该端口会明确失败。`--json` 会发送 NDJSON 生命周期事件(`done``action-required``error`),使 agent智能体能够补充其中点名的缺失输入并重新运行。
提供方可以选择 DeepSeek也可以选择由 `llm-pi-ai` 支持的自定义端点。选择 DeepSeek 时只询问 API key并使用公共端点与 `deepseek-v4-flash`;自定义端点还会询问 base URL。密钥为空时必须确认系统会创建包含注释和空 `.env` 变量的文件,使提供方在填写变量前启动时明确失败。现有插件的默认值会被省略;必填 SDK 预设仍按所属包的 Config 保持类型约束。
提供方可以选择 DeepSeek也可以选择由 `llm-pi-ai` 支持的自定义端点。选择 DeepSeek 时只询问 API key并使用公共端点与 `deepseek-v4-flash`;自定义端点还会询问 base URL。密钥为空时必须确认系统会 `.env` 中创建一个被注释掉的空变量,从而使提供方在为该变量填入值之前启动时明确失败。现有插件的默认值会被省略;必填 SDK 预设仍按所属包的 Config 保持类型约束。
## 模型体验
@@ -18,7 +18,7 @@
#### KV Cache 影响
不会直接失效;由具名消费方负责请求前缀变更。
不会直接导致 KV Cache 失效;由具名消费方负责请求前缀变更。
## 已知限制与暂缓工作

View File

@@ -2,15 +2,15 @@
[English](README.md) | 中文
`create-sdk``dsh-sdk config` 共用的项目领域和基础设施。`SdkProject` 是只读快照;`ProjectEditSession` 是唯一的变更与提交边界。设计理由由 [SDK 架构 Agent Note](../../../.agents/notes/proposed/architecture/2026-07-15-sdk-project-editing-architecture.md)负责。
`create-sdk``dsh-sdk config` 共用的项目领域和基础设施。`SdkProject` 是只读快照;`ProjectEditSession` 是唯一的变更与提交边界。设计理由由 [SDK 架构 Agent Noteagent 决策记录)](../../../.agents/notes/proposed/architecture/2026-07-15-sdk-project-editing-architecture.md) 负责。
该包负责内置的类型化 spec 目录、提供方应用行为实体、结构化项目文件对象、helper 自有项目模板、共享的类型化 `TextTemplate` 渲染器、包管理器策略、本地插件蓝图、类型化问题,以及 clack 提示适配器。它绝不会启动 Cordis 应用。
该包package负责内置的类型化 spec 目录、提供方应用行为实体、结构化项目文件对象、helper 自有项目模板、共享的类型化 `TextTemplate` 渲染器、包管理器策略、本地插件蓝图、类型化问题,以及 clack 交互提示适配器。它绝不会启动 Cordis 应用。
所有业务验证与文档验证都会在提交写入任何受影响文件前完成。提交会检测编辑会话打开后发生的外部修改,但在开始写入后,有意不提供跨文件回滚。
内置功能包括 provider、bash、app、persistence、HMR、filesystem、todo、skill、web、subagent、workflow、compaction、hooks、repeat-tool guard、timeout policy 和 ask-user。目录负责功能选项、必和非默认 Cordis 插件配置、功能依赖、资源贡献与往返标记create 与 config 使用同一注册表和配置器。ACP 应用选项只贡献自动化桥;交互式服务属于 TUI 或 Web 组合。
内置功能包括提供方、bash、app、持久化、HMR热模块替换、filesystem、todo、skill(技能)、web、subagent、工作流、压缩(compaction)、钩子、repeat-tool guard、timeout policy 和 ask-user。目录负责功能选项、必和非默认 Cordis 插件配置、功能依赖、资源贡献与往返标记create 与 config 使用同一注册表和配置器。ACPAgent Client Protocol应用选项只贡献自动化桥;交互式服务属于 TUI 或 Web 组合。
`SdkProject.open()` 只要求根目录下的 `package.json``cordis.yml` 可读。Cordis 配置项用于锚定功能安装;如果某个包只存在于链接的 NPM 依赖闭包中,则该功能仍视为不存在。一旦所属的 Cordis 配置项存在,资源形状不完整就是 `inconsistent`,无法自动修改。
`SdkProject.open()` 只要求根目录下的 `package.json``cordis.yml` 可读。Cordis 配置项用于锚定功能安装;如果某个包只存在于链接的 NPM 依赖闭包中,则该功能仍视为不存在。一旦所属的 Cordis 配置项存在,资源结构不完整就是 `inconsistent`,无法自动修改。
`.env.example` 跟随当前所选功能。`.env` 仅追加helper 可以补充缺失且名称不同的变量,但绝不会更新或删除现有内容。
@@ -18,7 +18,7 @@
## 模型体验
无。项目领域只编辑文件,绝不会挂载活跃 agent模型请求。
无。项目领域只编辑文件,绝不会挂载运行中的 agent(智能体),也不会发起模型请求。
#### KV Cache 影响

View File

@@ -10,19 +10,19 @@
| `dsh-sdk dev [target] [-- args…]` | 注册 TypeScript 与本地工作区源代码解析,然后进入 start 路径 |
| `dsh-sdk build [args…]` | 使用项目参数调用项目已安装的 tsdown |
| `dsh-sdk config` | 打开一个交互式编辑会话审阅累计变更统一提交一次NPM 依赖变化时只安装一次 |
| `dsh-sdk create <source>` | 从原生包管理器来源(`pkg@version``github:owner/repo#ref`)添加外部 Cordis 插件:确认后执行 `<pm> add <source>`,再将解析出的依赖挂载到 `cordis.yml`。不使用 gigetpacote由包管理器解析并固定来源GitHub 依赖会在管理器策略下通过自身 `prepare` 构建) |
| `dsh-sdk create <source>` | 从包管理器原生支持的来源(`pkg@version``github:owner/repo#ref`)添加外部 Cordis 插件:确认后执行 `<pm> add <source>`,再将解析出的依赖挂载到 `cordis.yml`。不使用 gigetpacote由包管理器解析并固定来源GitHub 依赖会在管理器策略下通过自身 `prepare` 构建) |
`ProjectBuild(tsdownConfig)``PluginBuild(tsdownConfig)` 只从 `@deepseek-ai/dsh-scripts/dev/tsdown-config` 导出。开发环境与生产环境读取同一个 `cordis.yml`
生成项目的脚本通过 `dsh-sdk` 执行 dev、build、start 和 config类型检查直接运行 `tsc -b`。HMR 始终是显式的 `cordis.yml` 功能,并由 dev 与 start 同时加载。
生成项目的脚本通过 `dsh-sdk` 执行 dev、build、start 和 config类型检查直接运行 `tsc -b`。HMR(热模块替换)始终是显式的 `cordis.yml` 功能,并由 dev 与 start 同时加载。
运行时库导出 `startSDK(source)`,用于加载 `.env``cordis.yml` 并返回活跃上下文;还导出 `runSDK(target)`,用于导入项目模块并调用其 `main(bootContext)`(不带目标的 `runSDK()` 会委派给 `startSDK('./cordis.yml')`)。`SdkBootContext` 携带原样转发的 `argv`、通用 `args`、启动器的绝对 `cwd`,以及 `start``dev` 模式。启动器不声明项目选项Node `parseArgs()` 使用空 schema 运行,因此带值的标志写作 `--key=value`,裸标志变为布尔值,`--no-cache` 变为 `args.cache = false`,选项名称保留 Node 的拼写(`--max-depth=3``args['max-depth']`)。
`start` 绝不构建。`dev` 注册项目已安装的 tsx 转换,并建立从 `plugins/*/package.json` 中的精确包名到各自 `src/index.ts` 的映射,然后沿用相同的 start 路径。`build` 调用项目已安装的 tsdown 并转发其参数;缺少 tsdown 配置时视为成功且不执行操作。
`config` 要求 TTY。一个功能树用于选择期望的启用集合变更行会高亮Right 用于修改有限功能选项,必行无法取消选择,不一致行会显示诊断,自定义/手动 Cordis 配置项支持启用/禁用。工作流会将该目标协调到一个编辑会话中。Review & Apply 只提交一次;之后,如果 NPM 依赖有变更,则触发一次包管理器安装。安装失败不会撤销已提交文件。
`config` 要求 TTY。一个功能树用于选择期望的启用集合变更行会高亮Right 用于修改取值有限功能选项,必行无法取消选择,不一致行会显示诊断,自定义/手动 Cordis 配置项支持启用/禁用。工作流会在一个编辑会话中将配置协调至该目标状态。Review & Apply 只提交一次;之后,如果 NPM 依赖有变更,则触发一次包管理器安装。安装失败不会撤销已提交文件。
根库导出 `startSDK``runSDK` 以及 `SdkBootArgs``SdkBootContext` 类型;命令组合仍 bin 私有持有。不导出 `src/*`、bin 或 package-manifest 子路径。
根库导出 `startSDK``runSDK` 以及 `SdkBootArgs``SdkBootContext` 类型;命令组合仍 bin 私有实现。不导出 `src/*`、bin 或 package-manifest 子路径。
## 模型体验
@@ -30,7 +30,7 @@
#### KV Cache 影响
不会直接失效;由具名消费方负责请求前缀变更。
不会直接导致 KV Cache 失效;由具名消费方负责请求前缀变更。
## 已知限制与暂缓工作

View File

@@ -2,9 +2,9 @@
[English](README.md) | 中文
以子进程方式驱动 DeepSeek Harness 运行时、走 stdio JSON-RPC 的 TypeScript 客户端 SDK——[Python SDK](../../../python/README.md)`deepseek-harness`)的设计孪生,共享同一个运行时对端、协议与分层:`DeepSeekHarness` 是高层回合 API`HarnessClient` 是低层协议客户端。包package根枚举消费方接口两层客户端、面向调用方的类型和 `JsonRpcResponseError`;源模块、规范化辅助函数与订阅投递机制不供消费方导入。纯库:不在任何 Cordis 上下文注册;它所生成的运行时进程是一个完整 harness其组成由自己的 `cordis.yml` 决定。
以子进程方式驱动 DeepSeek Harness 运行时、走 stdio JSON-RPC 的 TypeScript 客户端 SDK——[Python SDK](../../../python/README.md)`deepseek-harness`)的设计孪生,共享同一个运行时对端、协议与分层:`DeepSeekHarness` 是高层轮次 API`HarnessClient` 是低层协议客户端。包package根枚举消费方接口两层客户端、面向调用方的类型和 `JsonRpcResponseError`;源模块、规范化辅助函数与订阅投递机制不供消费方导入。纯库:不在任何 Cordis 上下文注册;它所 spawn 的运行时进程是一个完整 harness其组成由自己的 `cordis.yml` 决定。
与 Python SDK 不同,启动规格完全显式(`command`/`args`):本包面向仓库近旁的 TypeScript 消费——[`dsh-subagent-dsh-sdk`](../../subagent/subagent-dsh-sdk/README.md) 后端、测试、自动化——它们知道自己要启动哪个运行时。捆绑运行时解析(寻找打包可执行文件)仍归 Python 发行版负责。
与 Python SDK 不同,启动规格完全显式(`command`/`args`):本包面向仓库近旁的 TypeScript 消费——[`dsh-subagent-dsh-sdk`](../../subagent/subagent-dsh-sdk/README.md) 后端、测试、自动化——它们知道自己要启动哪个运行时。捆绑运行时解析(寻找打包可执行文件)仍归 Python 发行版负责。
## DeepSeekHarness
@@ -21,31 +21,31 @@ const result = await harness.run('say hi')
console.log(result.status, result.finalResponse)
```
子进程在首次使用时惰性启动,并在多次 `run()` 之间持续归实例所有;必须 `close()`(或 `await using`),子进程才总能被收`start()` 记忆化 `initialize` 握手(工作区 cwd——在跨越线之前解析为绝对路径——加 provider/model 路由和可选的正整数 `maxTokens` 输出上限);握手失败会收运行时并换入全新客户端,后续调用用新子进程重试(直到终结性的 `close()`)。该上限作用于根 agent 的每次请求,并由进程内后代继承;压缩插件单独持有摘要上限。`session(id?)` 打开具名或全新的会话句柄;`run(input, { sessionId?, onNotification? })` 发送一个 prompt 回合,在配对的 `session.finished` 到达时尘埃落定,返回 `TurnResult``status`(按部署映射的 `ok`/`error`)、结构化 `reason``TurnEndReason`)、`finalResponse`(最后一条助手消息文本)、根会话的 `events`,以及该会话和通过 `subagent.started` 发现的后代的原始 `notifications`,均按线序排列。模型层失败 `status: 'error'` 的结果,绝不是拒绝;拒绝意味着传输丢失、超时或协议违例。
子进程在首次使用时惰性启动,并在多次 `run()` 之间持续归实例所有;必须 `close()`(或 `await using`),子进程才总能被收。`start()` 记忆化 `initialize` 握手(工作区 cwd——在通过协议传输之前解析为绝对路径——加 provider/model 路由和可选的正整数 `maxTokens` 输出上限);握手失败会收运行时并换入全新客户端,后续调用用新子进程重试(直到终结性的 `close()`)。该上限作用于根 agent(智能体)的每次请求,并由进程内后代继承;压缩compaction插件单独持有摘要上限。`session(id?)` 打开具名或全新的会话句柄;`run(input, { sessionId?, onNotification? })` 发送一个提示词轮次,在配对的 `session.finished` 到达时完成,并返回 `TurnResult``status`(按部署映射的 `ok`/`error`)、结构化 `reason``TurnEndReason`)、`finalResponse`(最后一条助手消息文本)、根会话的 `events`,以及该会话和通过 `subagent.started` 发现的后代的原始 `notifications`,均按协议传输顺序排列。模型层失败会返回 `status: 'error'` 的结果,绝不会导致 Promise 被拒绝Promise 被拒绝意味着传输丢失、超时或协议违例。
## HarnessClient
回合 API 之下的协议客户端:显式 `start()`/`initialize()`/`prompt()`/`request()`/`close()`,外加通知订阅。`subscribe(filter?)` 返回 `NotificationSubscription`(可等待的 `next()`、非阻塞 `tryNext()`、异步迭代);`subscribeSessionTree(id)` 把范围限定到一个会话及从 `subagent.started` 血缘边发现的后代——运行时对上下文内每个会话都发通知,范围限定在客户端完成,与 Python SDK 完全一致。错误表面有类型且由本包导出:`JsonRpcResponseError`线上错误响应,保留 code/data`RequestTimeoutError`(配置的时限已到;线上没有取消方法,请求在服务端继续运行直到 close`SdkProtocolError`(响应超出文档化协议)、`TransportClosedError`(运行时已消失——消息携带退出码与有界 stderr 尾部)。
轮次 API 之下的协议客户端:显式 `start()`/`initialize()`/`prompt()`/`request()`/`close()`,外加通知订阅。`subscribe(filter?)` 返回 `NotificationSubscription`(可等待的 `next()`、非阻塞 `tryNext()`、异步迭代);`subscribeSessionTree(id)` 把范围限定到一个会话及从 `subagent.started` 血缘边发现的后代——运行时对上下文内每个会话都发通知,范围限定在客户端完成,与 Python SDK 完全一致。本包导出有明确类型的错误`JsonRpcResponseError`协议错误响应,保留 code/data`RequestTimeoutError`(配置的时限已到;协议层没有取消机制,请求在服务端继续运行直到 close`SdkProtocolError`(响应超出文档化协议)、`TransportClosedError`(运行时已消失——消息携带退出码与有界 stderr 尾部)。
`close()` 先请求协议 `shutdown`(受 `shutdownTimeoutMs` 约束,默认 1000 毫秒),然后走 stdin-EOF → SIGTERM → SIGKILL 阶梯(`disposeEofGraceMs` 默认 6000`disposeGraceMs` 默认 3000直到进程真正退出。该阶梯为本客户端私有它运行在任何 harness 上下文之外,无法搭乘 [`dsh-subprocess`](../../subprocess/README.md) 服务——即该接缝记载的 SDK 托管传输例外。幂等,已关闭的客户端拒绝复用。
`close()` 先请求协议 `shutdown`(受 `shutdownTimeoutMs` 约束,默认 1000 毫秒),然后走 stdin-EOF → SIGTERM → SIGKILL 阶梯(`disposeEofGraceMs` 默认 6000`disposeGraceMs` 默认 3000直到进程真正退出。该阶梯为本客户端私有它运行在任何 harness 上下文之外,无法搭乘 [`dsh-subprocess`](../../subprocess/README.md) 服务——即该 seam 所记录的 SDK 托管传输例外。幂等,已关闭的客户端拒绝复用。
`HarnessClientOptions.env` 给定时整体替换子环境(`undefined` 原样继承父环境);凭据策略归调用方——`dsh-subprocess``scrubbedParentEnv` 是面向隔离启动的共享擦除基底。
`HarnessClientOptions.env` 给定时整体替换子进程环境(`undefined` 原样继承父进程环境);凭据策略归调用方——`dsh-subprocess``scrubbedParentEnv` 是面向隔离启动的共享擦除基底。
## 测试
免密钥单元测试通过真实 stdio 驱动一个脚本化伪运行时子进程(`tests/fake-runtime.ts`,纯协议、环境变量脚本化):回合循环、会话树范围限定、超时/死亡/畸形响应表面、处置阶梯。[SDK 快照套件](../../../examples/jsonrpc-agent/tests/sdk.snapshot.ts)经由 `llm-replay` 免密钥地通过本客户端驱动真实 `dsh-jsonrpc-agent` 运行时,钉住通知流、回合结果与持久化日志;`DSH_SNAPSHOT=record` 对真实 API 重录。
免密钥单元测试通过真实 stdio 驱动一个脚本化伪运行时子进程(`tests/fake-runtime.ts`,纯协议、环境变量脚本化):轮次循环、会话树范围限定、超时、进程死亡和响应畸形场景,以及 dispose资源释放阶梯。[SDK 快照套件](../../../examples/jsonrpc-agent/tests/sdk.snapshot.ts) 经由 `llm-replay` 免密钥地通过本客户端驱动真实 `dsh-jsonrpc-agent` 运行时,固定通知流、轮次结果与持久化日志;`DSH_SNAPSHOT=record` 对真实 API 重录。
## Model Experience
## 模型体验
None, as this is a client-process library; the model runs in the spawned runtime, whose experience is owned by the plugins its `cordis.yml` composes.
无,因为这是一个客户端进程库;模型运行在 spawn 出的运行时中,其体验由该运行时的 `cordis.yml` 所组合的插件决定。
#### KV Cache effect
#### KV Cache 影响
None; this package neither assembles nor sends a provider request.
无;本包既不组装也不发送提供方请求。
## Known Limitations and Deferred Work
## 已知限制与暂缓工作
- **无捆绑运行时解析** —— 调用方显式指定运行时可执行文件;打包可执行文件的发现留在 Python 侧,直到出现 TypeScript 发行版消费
- **无回合中取消** —— 线上没有 prompt 取消方法;放弃回合意味着关闭运行时(见协议的 [Known Limitations](../sdk-protocol/README.md))。
- **每会话同时只有一个在途 prompt** —— 服务端规则,本客户端将其呈现为 `JsonRpcResponseError`;相互独立的会话可在同一运行时上并发。
- **client→server 通知与 server→client 请求**在线两端都未实现;传输层为未来审批流保留了承载能力。
- **无捆绑运行时解析**——调用方显式指定运行时可执行文件;打包可执行文件的发现留在 Python 侧,直到出现 TypeScript 发行版消费
- **无轮次中取消**——协议层没有提示词取消方法;放弃轮次意味着关闭运行时(见协议的 [已知限制](../sdk-protocol/README.md))。
- **每会话同时只有一个在途提示词**——服务端规则,本客户端将其呈现为 `JsonRpcResponseError`;相互独立的会话可在同一运行时上并发。
- **客户端→服务端通知与服务端→客户端请求**在协议两端都未实现;传输层为未来审批流保留了承载能力。

View File

@@ -2,38 +2,38 @@
[English](README.md) | 中文
DeepSeek Harness SDK 运行时的共享线协议:一个按换行分帧的 JSON-RPC 2.0 传输类,加上线两端共同使用的具名请求、结果与通知类型。包package根枚举协议消费方接口源模块不深层导入形式导出。服务端是 [`dsh-jsonrpc`](../../ui/jsonrpc/README.md) 插件;客户端是 [`dsh-sdk-client`](../sdk-client/README.md)TypeScript与 [Python SDK](../../../python/README.md)(后者镜像这些形状但不导入它们)。纯库——无插件、无 Config、无注册。
DeepSeek Harness SDK 运行时的共享协议格式wire format:一个按换行分帧的 JSON-RPC 2.0 传输类,加上协议两端共同使用的具名请求、结果与通知类型。包package根枚举协议消费方接口源模块不支持深层导入。服务端是 [`dsh-jsonrpc`](../../ui/jsonrpc/README.md) 插件;客户端是 [`dsh-sdk-client`](../sdk-client/README.md)TypeScript与 [Python SDK](../../../python/README.md)(后者复现这些结构但不导入它们)。纯库——无插件、无 Config、无注册。
## 传输
`JsonRpcLineTransport` 在调用方持有的字节流上为 JSON-RPC 2.0 分帧,每行一个紧凑 JSON 帧、以 `\n` 结尾。带 `id``method` 的帧是请求,仅 `id` 是响应,仅 `method` 是通知;非法 JSON 行被忽略。`start()` 挂接流监听器,`close()` 除监听器并拒绝挂起请求但不销毁流。缺失请求处理器时应答 `-32601`;处理器拒绝则应答携带错误消息的 `-32603`。错误响应会以 `JsonRpcResponseError` 拒绝挂起的 `request()`,保留线上`code` 与可选 `data``JsonRpcTransportPeer` 是服务器类所依赖的出站表面request/notify
`JsonRpcLineTransport` 在调用方持有的字节流上为 JSON-RPC 2.0 分帧,每行一个紧凑 JSON 帧、以 `\n` 结尾。带 `id``method` 的帧是请求,仅 `id` 是响应,仅 `method` 是通知;非法 JSON 行被忽略。`start()` 挂接流监听器,`close()` 除监听器并拒绝挂起请求但不销毁流。缺失请求处理器时应答 `-32601`;处理器返回的 Promise 被拒绝时,则应答携带错误消息的 `-32603`。错误响应会以 `JsonRpcResponseError` 拒绝挂起的 `request()` Promise并保留协议格式中`code` 与可选 `data``JsonRpcTransportPeer` 是服务器类据以进行类型声明的出站接口request/notify
## 线类型
## 协议类型
`types.ts``HarnessSdkServer` 所服务协议的每个载荷命名:
| 方向 | 方法 | 类型 |
|---|---|---|
| client→server | `initialize` | `InitializeParams``InitializeResult` |
| client→server | `session/prompt` | `SessionPromptParams``SessionPromptResult`(仅在回合尘埃落定后应答) |
| client→server | `session/prompt` | `SessionPromptParams``SessionPromptResult`(仅在轮次结算完成后应答) |
| client→server | `shutdown` | 无参数 → `{}` |
| server→client | `session.event` | `SessionEventNotification`(运行时内每个会话,不过滤) |
| server→client | `session.finished` | `SessionFinishedNotification`(每个被接受的 prompt 一条) |
| server→client | `session.finished` | `SessionFinishedNotification`(每个获准的提示词请求一条) |
| server→client | `subagent.started` | `SubagentStartedNotification` |
| server→client | `subagent.finished` | `SubagentFinishedNotification`(仅进程内 run |
| server→client | `subagent.finished` | `SubagentFinishedNotification`(仅进程内运行 |
`HarnessSdkRequestMap``HarnessSdkNotificationMap` 按方法名索引这些类型。`InitializeParams.maxTokens` 是可选的正安全整数,用于限制 SDK 创建的 agent 及其进程内后代每次对话模型输出;省略时由提供方默认值控制。通知载荷类型依赖 `SessionEvent``dsh-session`)、`ContentBlock``dsh-llm`)与 `SubagentStopReason``dsh-subagent`)——协议以完整会话日志封套进行流式传输,因此会话词汇表是线契约的一部分。`serverInfo.name` 保持线上稳定值 `deepseek-harness-sdk-runtime`
`HarnessSdkRequestMap``HarnessSdkNotificationMap` 按方法名索引这些类型。`InitializeParams.maxTokens` 是可选的正安全整数,用于限制 SDK 创建的 agent(智能体)及其进程内后代每次对话模型输出;省略时由提供方默认值控制。通知载荷类型依赖 `SessionEvent``dsh-session`)、`ContentBlock``dsh-llm`)与 `SubagentStopReason``dsh-subagent`)——协议以完整会话日志封套进行流式传输,因此会话词汇是协议格式契约的一部分。`serverInfo.name` 的协议值固定为 `deepseek-harness-sdk-runtime`
## Model Experience
## 模型体验
None, as this package defines the client-facing wire protocol; the model-visible surfaces belong to the runtime plugins composed behind the serving [`dsh-jsonrpc`](../../ui/jsonrpc/README.md) entry.
无,因为此包定义面向客户端的协议格式;模型可见接口属于组合在对外服务入口 [`dsh-jsonrpc`](../../ui/jsonrpc/README.md) 后方的运行时插件。
#### KV Cache effect
#### KV Cache 影响
None; this package neither assembles nor sends a provider request.
无;此包既不组装也不发送提供方请求。
## Known Limitations and Deferred Work
## 已知限制与暂缓工作
- **无协议版本协商** —— 握手只携带 `serverInfo.version``0.0.1`,客户端不校验);预发布立场,无兼容承诺。
- **无取消与会话关闭方法** —— 客户端放弃回合的方式是关闭运行时进程;见 [`dsh-jsonrpc` README](../../ui/jsonrpc/README.md)。
- **server→client 请求是死能力** —— 传输层支持但服务器从不发送Python SDK 的应答表面为未来审批流预留。
- **无协议版本协商**——握手只携带 `serverInfo.version``0.0.1`,客户端不校验);处于预发布阶段,无兼容承诺。
- **无取消与会话关闭方法**——客户端放弃轮次的方式是关闭运行时进程;见 [`dsh-jsonrpc` README](../../ui/jsonrpc/README.md)。
- **server→client 请求是未使用的功能**——传输层支持但服务器从不发送Python SDK 的应答接口为未来审批流预留。

View File

@@ -2,15 +2,15 @@
[English](README.md) | 中文
用于 dsh-sdk 工具链的启动器侧 telemetry 原语。这是启动器在每个命令周围导入的普通库;它**不是** Cordis 插件,因为 `build` 与首次初始化的 `create` 从不启动 Cordis。将 reporter 接入启动器命令分发,并把 telemetry consent 功能加入 `dsh-helper` 目录,属于各自所属包的职责,而不是此包的职责。
用于 dsh-sdk 工具链的启动器侧 telemetry 原语。这是启动器在执行每个命令导入的普通库;它**不是** Cordis 插件,因为 `build` 与首次初始化的 `create` 从不启动 Cordis。将 reporter 接入启动器命令分发,并把 telemetry consent 功能加入 `dsh-helper` 目录,属于各自所属包package的职责,而不是此包的职责。
| 导出 | 职责 |
|---|---|
| `SecretRedactor` | 保守的安全后备:在已解析值(`redactValue`)与原始文本(`redactText`)中,将形似密钥的值(密钥键名、已知 token 形状、PEM 块、URL 凭据、高熵不透明 token替换为占位符。绝不删除字段或行。 |
| `ConsentResolver` | 解析项目 `cordis.yml`(绝不启动),读取 telemetry 配置项的启用/禁用状态作为 consent`DO_NOT_TRACK`CI 环境会强制彻底退出。 |
| `buildTelemetryPayload` | 组装 `{command, durationMs, success, cordisYmlContent, packageJsonContent}`,对完整的 `cordis.yml``package.json` 文本运行 redactor。绝不读取 `.env`;发送 `package.json` 的前提是同时存在 `cordis.yml`,因此在非 SDK 目录运行的命令不会上传该目录中无关的 manifest。 |
| `SecretRedactor` | 保守的安全后备:在已解析值(`redactValue`)与原始文本(`redactText`)中,将形似密钥的值(疑似密钥键名、已知 token 格式、PEM 块、URL 凭据、高熵不透明 token替换为占位符。绝不删除字段或行。 |
| `ConsentResolver` | 解析项目 `cordis.yml`(绝不启动),读取 telemetry 配置项的启用/禁用状态作为 consent`DO_NOT_TRACK`CI 环境会强制完全停止上报。 |
| `buildTelemetryPayload` | 组装 `{command, durationMs, success, cordisYmlContent, packageJsonContent}`,对完整的 `cordis.yml``package.json` 文本运行 redactor。绝不读取 `.env`;发送 `package.json` 的前提是同时存在 `cordis.yml`,因此在非 SDK 目录运行的命令不会上传该目录中无关的 manifest(元数据清单)。 |
| `getOrCreateAnonymousId` | 将随机 UUID 持久化到 [`@deepseek-ai/dsh-paths`](../../util/paths/README.md) 解析出的 harness home`$DSH_HOME` > `~/.dsh`);其范围限定为该 home而不是整台机器且绝不从 git 派生。 |
| `TelemetryReporter` | 即发即弃发送:`report()` 绝不阻塞或抛出;所有路径都会结算发送`flush()` 可以在上限内排空进行中的发送。 |
| `TelemetryReporter` | 即发即弃发送:`report()` 绝不阻塞或抛出;无论经过哪条路径,发送操作最终都会结束`flush()` 可以在上限内排空进行中的发送。 |
Consent 由 `cordis.yml` 中的 telemetry 配置项承载,因此禁用 telemetry 就是禁用该配置项。telemetry 默认上报,只有已经存在的 telemetry 配置项被显式设为 `disabled` 时才关闭:缺少 `cordis.yml`(首次 `create`)、配置项已启用,或 `cordis.yml` 中没有 telemetry 配置项时都会上报。`DO_NOT_TRACK`CI 始终拒绝。无配置与缺少配置项的默认值可以通过 `ConsentResolver` 配置。
@@ -26,5 +26,5 @@ Consent 由 `cordis.yml` 中的 telemetry 配置项承载,因此禁用 telemet
## 已知限制与暂缓工作
- **占位端点**`DSH_TELEMETRY_ENDPOINT` 指向 `.invalid`,直到置真实端点。
- **占位端点**`DSH_TELEMETRY_ENDPOINT` 指向 `.invalid`,直到置真实端点。
- **脱敏依赖启发式规则**:这只是保守后备,不是保证;密钥应存放于 `.env`,而该文件绝不会被读取或上报。