dsh-grok-provider 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.11 - 2026-08-30
4
+
5
+ - Fix `INVALID_RESPONSE` failures when exact `grok-4.6` at High Effort continues after Web Search by accepting the observed one-time reuse of an already closed reasoning item ID as a new empty reasoning placeholder only after one completed Search, while rejecting open, cross-type, non-empty, or repeated reuse.
6
+ - Accept closed empty reasoning output items without weakening sequence, output-index, item-status, or encrypted-replay validation.
7
+ - Decode the official Responses raw-reasoning lifecycle (`reasoning_text` content parts plus `response.reasoning_text.delta` / `done`) and keep raw reasoning strictly mutually exclusive with the existing reasoning-summary lifecycle.
8
+ - Keep raw plaintext out of replay metadata: subsequent requests send only `encrypted_content` with `summary: []` and never replay or relabel raw plaintext as a summary; live raw reasoning deltas remain visible to Harness like summary reasoning deltas.
9
+ - Add focused regressions for valid empty/reused reasoning, raw reasoning streaming and replay, plus malformed reuse, mixed raw/summary, out-of-order, duplicate, and incomplete lifecycle rejection.
10
+ - Re-run a redacted real `grok-4.6` Web Search probe through the production decoder: one POST yielded 68 events, 34 summary deltas, zero raw-reasoning deltas, one accepted finish, and no saved prompt, response text, query, citation URL, or credential. This verifies the observed summary/Search path only; raw reasoning remains fixture-verified rather than live-probe verified.
11
+ - Keep authentication, settings, model routing, image input, Search descriptors, citations, fixed endpoints, and platform support unchanged.
12
+
3
13
  ## 0.1.10 - 2026-08-30
4
14
 
5
15
  - Register the `llm-grok` Host settings namespace through Harness's canonical settings module so the Web Search and X Search controls are writable instead of permanently `unavailable`.
package/README.en.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Use an already authenticated official Grok Build account from DeepSeek Harness, with dynamic model discovery, streaming reasoning, image input, optional Web/X Search, tool calls, and an account quota/model capability dashboard.
6
6
 
7
- > Unofficial community project; not affiliated with xAI or DeepSeek Harness. The current source candidate is `0.1.10`; the current stable release and npm Registry `latest` are both `0.1.9`. Published `0.1.9` completed unique-artifact, dual-platform CI, signature, and provenance verification, but omitted Host settings registration, so its Web/X Search controls remain unavailable; unpublished `0.1.10` is the focused repair. Version `0.1.8` was published and then withdrawn and cannot be reused. The project no longer publishes prereleases; stable defects are fixed in a new incremented stable version.
7
+ > Unofficial community project; not affiliated with xAI or DeepSeek Harness. The current source candidate is `0.1.11`; the current stable release and npm Registry `latest` are both `0.1.10`. Published `0.1.10` repaired Web/X Search settings registration, but real use later found that `grok-4.6` at High Effort can hit a generic invalid-response error while continuing after Web Search because of a reasoning-lifecycle compatibility gap; unpublished `0.1.11` is the focused protocol repair. Version `0.1.8` was published and then withdrawn and cannot be reused. The project no longer publishes prereleases; stable defects are fixed in a new incremented stable version.
8
8
 
9
9
  ## What it provides
10
10
 
@@ -15,7 +15,7 @@ Use an already authenticated official Grok Build account from DeepSeek Harness,
15
15
  | Models | Discovers every model visible to the account at runtime; no static model allowlist |
16
16
  | Conversations | Streaming Responses text, reasoning, encrypted reasoning replay, usage, and finish reasons |
17
17
  | Images | Only exact `grok-4.6` accepts bounded JPEG/PNG images from Harness attachments; `grok-4.5` and all other models remain text-only |
18
- | Search | `0.1.9` includes the protocol and settings page, but its controls are unavailable because Host registration for `llm-grok` is missing; the `0.1.10` candidate repairs registration so exact `grok-4.6` gets independent, default-off Web Search and X Search, while remote lifecycles are never misrepresented as local tools |
18
+ | Search | `0.1.10` provides independent, default-off Web Search and X Search for exact `grok-4.6`; the `0.1.11` candidate repairs the High Effort + Web Search reasoning-continuation lifecycle, while remote lifecycles are never misrepresented as local tools |
19
19
  | Tools | Returns function calls to the Harness permission layer; the provider never executes tools |
20
20
  | Account dashboard | Login status, weekly/monthly quota, reset time, dynamic model capabilities and reasoning efforts |
21
21
  | Surfaces | Bilingual Web settings and a closed `/grok` TUI command set |
@@ -40,10 +40,10 @@ When the network is reachable and OIDC discovery succeeds, the official CLI open
40
40
 
41
41
  ### 2. Install the provider
42
42
 
43
- `0.1.10` is not published yet. After it is published and read back from the Registry, install that exact version from npm:
43
+ `0.1.11` is not published yet. After it is published and read back from the Registry, install that exact version from npm:
44
44
 
45
45
  ```sh
46
- dsh plugin --profile web add dsh-grok-provider@0.1.10
46
+ dsh plugin --profile web add dsh-grok-provider@0.1.11
47
47
  dsh web
48
48
  ```
49
49
 
@@ -130,8 +130,8 @@ Uninstalling the provider does not remove the official Grok CLI or directly modi
130
130
 
131
131
  ## Sources and discovery
132
132
 
133
- - Current npm stable release: [dsh-grok-provider@0.1.9](https://www.npmjs.com/package/dsh-grok-provider/v/0.1.9) (release artifact verified; known Search settings-registration defect)
134
- - Most recent GitHub release and integrity values: [v0.1.9](https://github.com/yoshino-xiao7/dsh-grok-provider/releases/tag/v0.1.9)
133
+ - Current npm stable release: [dsh-grok-provider@0.1.10](https://www.npmjs.com/package/dsh-grok-provider/v/0.1.10) (unique artifact, dual-platform CI, signatures, and provenance verified; known High Effort + Web Search reasoning-compatibility defect)
134
+ - Most recent GitHub release and integrity values: [v0.1.10](https://github.com/yoshino-xiao7/dsh-grok-provider/releases/tag/v0.1.10)
135
135
  - GitHub community discovery: the repository carries the DeepSeek Harness-recommended `dsh-plugin` and `dsh` topics
136
136
  - YukiRyou managed source: [deepseek-yukiryou-plugin-catalog](https://github.com/yoshino-xiao7/deepseek-yukiryou-plugin-catalog), still pinned to the real-device-accepted `dsh-grok-provider@0.1.0` and marking only `darwin-arm64`
137
137
 
@@ -139,21 +139,21 @@ Directory inclusion is not an endorsement by xAI or DeepSeek Harness. [Listing P
139
139
 
140
140
  ## Compatibility and scope
141
141
 
142
- | Item | `0.1.9` stable / `0.1.10` candidate status |
142
+ | Item | `0.1.10` stable / `0.1.11` candidate status |
143
143
  | --- | --- |
144
144
  | DeepSeek Harness | Exact support for `0.1.1-rc.2` |
145
145
  | Node.js | `>=24.19.0` |
146
- | macOS arm64 | Image sending has real-Harness confirmation; the `0.1.10` Search repair passes real SettingsProvider/LLM tests, candidate-tarball isolated install, settings API, browser switch-write acceptance, and candidate macOS 14 CI |
147
- | Windows x64 | Code, slow fakes, and `0.1.10` candidate Windows 2022 CI pass. On a reachable network the official CLI generates the URL and opens the browser, and that path still lacks real-device Windows acceptance |
146
+ | macOS arm64 | Image sending has real-Harness confirmation; focused `0.1.11` regressions, the redacted summary/Search probe, and the code merge commit's macOS 14 CI pass; the release-evidence commit's final CI and unique artifact remain pending |
147
+ | Windows x64 | The `0.1.11` code merge commit's Windows 2022 CI and existing slow fakes pass; the release-evidence commit's final CI remains pending. On a reachable network the official CLI generates the URL and opens the browser, and that path still lacks real-device Windows acceptance |
148
148
  | macOS x64 / Linux | Unsupported |
149
149
  | Grok CLI | No full-version lock; official path, `login --oauth` capability, and production OIDC credential contract are enforced |
150
150
  | Models | Every account catalog model whose backend has a strict codec in this release |
151
151
 
152
- `0.1.10` preserves the published image boundary: image input is enabled only for exact `grok-4.6`, while `grok-4.5` and every other dynamically discovered model remain text-only. Image sending has been confirmed in a real Harness conversation. Images must be verified JPEG/PNG projections from the Harness attachment service. Ordinary user content and images nested one level inside a tool result are supported with fixed `detail:"high"`; URLs, filesystem paths, file IDs, and caller-supplied data URLs are rejected. Private reasoning in ordinary user/system history is omitted while adjacent visible text remains ordered.
152
+ `0.1.11` preserves the published image boundary: image input is enabled only for exact `grok-4.6`, while `grok-4.5` and every other dynamically discovered model remain text-only. Image sending has been confirmed in a real Harness conversation. Images must be verified JPEG/PNG projections from the Harness attachment service. Ordinary user content and images nested one level inside a tool result are supported with fixed `detail:"high"`; URLs, filesystem paths, file IDs, and caller-supplied data URLs are rejected. Private reasoning in ordinary user/system history is omitted while adjacent visible text remains ordered.
153
153
 
154
154
  Each projected image is limited to 4 MiB, 16,777,216 pixels, and 8192px per side. A request retains at most eight images and 8 MiB of projected image bytes. When a limit is exceeded, the globally oldest images are offloaded to Harness text placeholders; the final JSON remains capped at 16 MiB.
155
155
 
156
- Published `0.1.9` included the Search protocol and settings page but omitted the Host-side `llm-grok` namespace registration, leaving both controls unavailable. The `0.1.10` candidate registers and persists both settings through the canonical Harness settings module; each new call reads the latest value once before model discovery, while prepared and in-flight calls keep their original snapshot. Search remains default-off and limited to exact `grok-4.6`. Once enabled, ordinary conversation content and model-derived queries are sent to xAI and may incur additional usage. Web/X activity is already executed server-side and is not projected as a Harness-local tool call. Citation Markdown remains ordinary assistant text; bounded structured URL metadata is discarded, and the plugin never opens or downloads a citation. Search results are untrusted remote data, so verify sources before commands or file changes. Image generation, arbitrary downloads, API-key mode, multiple accounts, enterprise OIDC, ACP, and Headless agent wrapping remain out of scope; see the [capability roadmap](docs/11-capability-roadmap.md).
156
+ Published `0.1.10` registers and persists both Search settings through the canonical Harness settings module; each new call reads the latest value once before model discovery, while prepared and in-flight calls keep their original snapshot. Real use later found that exact `grok-4.6` at High Effort may close a reasoning item, complete Search, and then reuse the same ID once as an empty placeholder, which the old decoder rejected. The `0.1.11` candidate permits that strictly empty one-time reuse only when a completed Search lies between the two reasoning lifecycles and adds the official raw `reasoning_text` lifecycle. Raw and summary modes are mutually exclusive; replay metadata does not retain raw plaintext, later requests send only `encrypted_content` with an empty summary, and live raw deltas remain visible to Harness as reasoning output. A redacted real probe observed 34 summary deltas and zero raw deltas, so it verifies only the summary/Search path; raw reasoning remains fixture-verified. Search stays default-off and limited to exact `grok-4.6`; remote activity is not projected as a local tool, and citation URLs are never opened or downloaded. Search results are untrusted remote data, so verify sources before commands or file changes. Image generation, arbitrary downloads, API-key mode, multiple accounts, enterprise OIDC, ACP, and Headless agent wrapping remain out of scope; see the [capability roadmap](docs/11-capability-roadmap.md).
157
157
 
158
158
  ## How it works
159
159
 
@@ -256,7 +256,8 @@ Read the [contributing guide](CONTRIBUTING.md) before filing an issue or PR. Cha
256
256
  - [x] Publish `0.1.6`: image-history reasoning compatibility and per-stage official-CLI deadline repair for Windows; image sending is confirmed in a real Harness conversation
257
257
  - [x] Publish `0.1.7`: Provider/CLI version diagnostics, CLI installation recovery, redacted OIDC discovery-timeout settlement, and the `IconThinkOutline16` settings-navigation compatibility layer
258
258
  - [x] Publish `0.1.9`: added the Web/X Search protocol and settings page; the unique artifact, dual-platform CI, signatures, and SLSA provenance are verified; post-release verification found the missing Host settings namespace and unusable controls
259
- - [ ] Publish `0.1.10`: `llm-grok` registration, per-call capture, isolated install, the code PR, and main dual-platform CI are complete; merging release evidence, freezing the unique artifact, and exact release authorization remain
259
+ - [x] Publish `0.1.10`: `llm-grok` registration, per-call capture, unique artifact, dual-platform CI, signatures, and provenance are complete
260
+ - [ ] Publish `0.1.11`: repair High Effort + Web Search reasoning-lifecycle compatibility; the code PR and main dual-platform CI pass, while release-evidence final CI, the unique artifact, exact authorization, Registry, and provenance readback remain pending
260
261
  - [ ] A subsequent slice: opt-in image generation (inline results only, committed through Harness attachments)
261
262
  - [ ] Complete independent Windows x64 acceptance and publish a later stable fix if needed
262
263
 
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  让 DeepSeek Harness 使用你已登录的官方 Grok Build 账号:动态模型发现、流式推理、图片输入、可选 Web/X Search、工具调用,以及账号额度与模型能力面板。
6
6
 
7
- > 非官方社区项目,与 xAI 或 DeepSeek Harness 官方无隶属关系。当前源码候选版本为 `0.1.10`;当前稳定版及 npm Registry 的 `latest` 均为 `0.1.9`。已发布的 `0.1.9` 完成了唯一制品、双平台 CI、签名与 provenance 验证,但遗漏 Host 设置注册,因此 Web/X Search 开关会显示暂时不可用;尚未发布的 `0.1.10` 专门修复这条链路。`0.1.8` 曾发布后撤回且版本号不可复用。项目不再发行预发行版;正式版缺陷通过新的递增稳定版本修复。
7
+ > 非官方社区项目,与 xAI 或 DeepSeek Harness 官方无隶属关系。当前源码候选版本为 `0.1.11`;当前稳定版及 npm Registry 的 `latest` 均为 `0.1.10`。已发布的 `0.1.10` 修复了 Web/X Search 设置注册,但真实使用随后发现 `grok-4.6` 在 High Effort + Web Search 续跑时可能因 reasoning 生命周期兼容缺口返回通用非法响应;尚未发布的 `0.1.11` 专门修复该协议兼容问题。`0.1.8` 曾发布后撤回且版本号不可复用。项目不再发行预发行版;正式版缺陷通过新的递增稳定版本修复。
8
8
 
9
9
  ## 它解决什么问题
10
10
 
@@ -15,7 +15,7 @@
15
15
  | 模型 | 运行时读取账号可见的全部 Grok Build 模型,不维护静态模型白名单 |
16
16
  | 对话 | Responses 流式文本、reasoning、加密 reasoning replay、usage 与 finish reason |
17
17
  | 图片 | 仅精确 `grok-4.6` 接收 Harness attachment 中有界的 JPEG/PNG 图片;`grok-4.5` 与其他模型保持 text-only |
18
- | 搜索 | `0.1.9` 已包含协议与设置页,但开关因缺少 `llm-grok` Host 注册而不可用;`0.1.10` 候选修复注册,使精确 `grok-4.6` 的 Web Search / X Search 可默认关闭、分别开启,远端 lifecycle 不伪装成本地工具 |
18
+ | 搜索 | `0.1.10` 已让精确 `grok-4.6` 的 Web Search / X Search 可默认关闭、分别开启;`0.1.11` 候选修复 High Effort + Web Search 续跑的 reasoning 生命周期兼容,远端 lifecycle 仍不伪装成本地工具 |
19
19
  | 工具 | 将 function call 交回 Harness 权限层;Provider 本身不执行工具 |
20
20
  | 账户面板 | 登录状态、每周/月额度、重置时间、动态模型能力与 reasoning 档位 |
21
21
  | 界面 | Web 设置页中英文切换;TUI 提供闭合的 `/grok` 命令 |
@@ -40,10 +40,10 @@ grok models
40
40
 
41
41
  ### 2. 安装 Provider
42
42
 
43
- `0.1.10` 尚未发布;待它发布并完成 Registry 回读后,从 npm 安装该精确版本:
43
+ `0.1.11` 尚未发布;待它发布并完成 Registry 回读后,从 npm 安装该精确版本:
44
44
 
45
45
  ```sh
46
- dsh plugin --profile web add dsh-grok-provider@0.1.10
46
+ dsh plugin --profile web add dsh-grok-provider@0.1.11
47
47
  dsh web
48
48
  ```
49
49
 
@@ -130,8 +130,8 @@ dsh web
130
130
 
131
131
  ## 项目来源与发现
132
132
 
133
- - npm 当前稳定版:[dsh-grok-provider@0.1.9](https://www.npmjs.com/package/dsh-grok-provider/v/0.1.9)(发行制品已验证;Search 开关存在已知设置注册缺陷)
134
- - GitHub 最近发行版与校验值:[v0.1.9](https://github.com/yoshino-xiao7/dsh-grok-provider/releases/tag/v0.1.9)
133
+ - npm 当前稳定版:[dsh-grok-provider@0.1.10](https://www.npmjs.com/package/dsh-grok-provider/v/0.1.10)(唯一制品、双平台 CI、签名与 provenance 已验证;High Effort + Web Search 续跑存在已知 reasoning 兼容缺陷)
134
+ - GitHub 最近发行版与校验值:[v0.1.10](https://github.com/yoshino-xiao7/dsh-grok-provider/releases/tag/v0.1.10)
135
135
  - GitHub 社区发现:仓库已添加 DeepSeek Harness 官方推荐的 `dsh-plugin` 与 `dsh` Topics
136
136
  - YukiRyou 受管来源:[deepseek-yukiryou-plugin-catalog](https://github.com/yoshino-xiao7/deepseek-yukiryou-plugin-catalog),当前仍锁定已完成真机验收的 `dsh-grok-provider@0.1.0`,且只标记 `darwin-arm64`
137
137
 
@@ -139,21 +139,21 @@ dsh web
139
139
 
140
140
  ## 兼容性与范围
141
141
 
142
- | 项目 | `0.1.9` 稳定版 / `0.1.10` 候选状态 |
142
+ | 项目 | `0.1.10` 稳定版 / `0.1.11` 候选状态 |
143
143
  | --- | --- |
144
144
  | DeepSeek Harness | 精确支持 `0.1.1-rc.2` |
145
145
  | Node.js | `>=24.19.0` |
146
- | macOS arm64 | 图片发送已完成真实 Harness 验证;`0.1.10` Search 修复已通过真实 SettingsProvider/LLM 回归、候选 tarball 隔离安装、设置 API、浏览器开关写入与候选 macOS 14 CI |
147
- | Windows x64 | 代码、slow-fake 与 `0.1.10` 候选 Windows 2022 CI 已通过。网络可达时由官方 CLI 生成 URL 并打开浏览器,该路径仍未完成 Windows 真机验收 |
146
+ | macOS arm64 | 图片发送已完成真实 Harness 验证;`0.1.11` 聚焦回归、脱敏真实 summary/Search 探针及代码 merge commit 的 macOS 14 CI 通过;发布证据提交的 final CI 与唯一制品待关闭 |
147
+ | Windows x64 | `0.1.11` 代码 merge commit 的 Windows 2022 CI 与现有 slow-fake 通过;发布证据提交的 final CI 待关闭。网络可达时由官方 CLI 生成 URL 并打开浏览器,该路径仍未完成 Windows 真机验收 |
148
148
  | macOS x64 / Linux | 不支持 |
149
149
  | Grok CLI | 不锁完整版本;严格校验官方路径、`login --oauth` 能力与生产 OIDC 凭据契约 |
150
150
  | 模型 | 当前账号目录中 backend 已被严格 codec 支持的全部模型 |
151
151
 
152
- `0.1.10` 沿用已发布版本的图片边界:只为精确的 `grok-4.6` 开启图片输入;`grok-4.5` 与其他动态发现的模型继续按 text-only 处理。图片发送已在真实 Harness 对话中确认可用。图片只能来自 Harness attachment service 的已验证 JPEG/PNG 投影,支持普通用户内容和一层工具结果中的图片,并固定使用 `detail:"high"`;不接受 URL、文件路径、file ID 或调用方预制的 data URL。普通 user/system 历史中的私有 reasoning 会被省略并保留相邻可见文本。
152
+ `0.1.11` 沿用已发布版本的图片边界:只为精确的 `grok-4.6` 开启图片输入;`grok-4.5` 与其他动态发现的模型继续按 text-only 处理。图片发送已在真实 Harness 对话中确认可用。图片只能来自 Harness attachment service 的已验证 JPEG/PNG 投影,支持普通用户内容和一层工具结果中的图片,并固定使用 `detail:"high"`;不接受 URL、文件路径、file ID 或调用方预制的 data URL。普通 user/system 历史中的私有 reasoning 会被省略并保留相邻可见文本。
153
153
 
154
154
  每张投影图片最多 4 MiB、16,777,216 像素且任一边不超过 8192px;每次请求最多保留 8 张、投影字节合计最多 8 MiB。超限时按全局最旧优先移除图片并保留 Harness 的文本占位,最终 JSON 仍受 16 MiB 上限约束。
155
155
 
156
- 已发布的 `0.1.9` 包含 Search 协议实现和设置页面,但漏掉了 Host 侧 `llm-grok` namespace 注册,两个开关因此永久处于不可用状态。`0.1.10` 候选使用 Harness 官方 settings 模块注册并持久化这两个设置;每个新调用在模型发现前读取一次最新值,已准备和在途调用保持原快照。Search 仍只对精确 `grok-4.6` 开放并默认关闭。开启后,普通对话内容以及模型据此生成的检索词会交给 xAI,并可能产生额外用量。Web/X 是服务端已执行的检索过程,不会变成 Harness 本地工具调用;回答中的 citation Markdown 保留为普通文本,结构化 URL 元数据有界校验后丢弃,插件不会打开或下载引用。搜索结果属于不可信远端数据,执行命令或修改文件前应核实来源。图片生成、任意文件下载、API Key 模式、多账号、企业 OIDC、ACP 与 Headless agent 封装仍不在本版本范围内;后续切片见[能力路线图](docs/11-capability-roadmap.md)。
156
+ 已发布的 `0.1.10` 使用 Harness 官方 settings 模块注册并持久化两个 Search 设置;每个新调用在模型发现前读取一次最新值,已准备和在途调用保持原快照。真实使用随后发现精确 `grok-4.6` 在 High Effort + Web Search 续跑时,可能先关闭 reasoning 项,在一次 Search 完成后再把同一 ID 使用一次作为空占位,旧解码器会因此失败关闭。`0.1.11` 候选仅在已完成 Search 位于两段 reasoning 之间时允许该 ID 以严格空项再出现一次,并增加官方 raw `reasoning_text` 生命周期;raw 与 summary 互斥,replay 元数据不保存 raw 明文,后续请求只发送 `encrypted_content` 与空 summary,当前流中的 raw delta 仍会作为 Harness 可见 reasoning 输出。脱敏真实探针观察到 34 个 summary delta、0 个 raw delta,因此只验证 summary/Search 路径,raw reasoning 仍只有 fixture 回归。Search 继续只对精确 `grok-4.6` 默认关闭地开放;远端活动不变成本地工具,citation URL 不会被打开或下载。搜索结果属于不可信远端数据,执行命令或修改文件前应核实来源。图片生成、任意文件下载、API Key 模式、多账号、企业 OIDC、ACP 与 Headless agent 封装仍不在本版本范围内;后续切片见[能力路线图](docs/11-capability-roadmap.md)。
157
157
 
158
158
  ## 工作原理
159
159
 
@@ -256,7 +256,8 @@ npm run pack:check
256
256
  - [x] 发布 `0.1.6`:图片历史 reasoning 兼容与 Windows 官方 CLI 分阶段 deadline 修复版;图片发送已完成真实 Harness 验证
257
257
  - [x] 发布 `0.1.7`:Provider/CLI 双版本诊断、CLI 安装恢复、OIDC discovery 超时脱敏结算与 `IconThinkOutline16` 设置导航兼容层
258
258
  - [x] 发布 `0.1.9`:加入 Web/X Search 协议与设置页,唯一制品、双平台 CI、签名与 SLSA provenance 均已验证;发布后确认 Host 设置 namespace 遗漏,开关不可用
259
- - [ ] 发布 `0.1.10`:`llm-grok` 注册、按调用读取设置、隔离安装、代码 PR 与 main 双平台 CI 已完成;仍需合并发布证据、冻结唯一制品和精确发布授权
259
+ - [x] 发布 `0.1.10`:`llm-grok` 注册、按调用读取设置、唯一制品、双平台 CI、签名与 provenance 已完成
260
+ - [ ] 发布 `0.1.11`:修复 High Effort + Web Search reasoning 生命周期兼容;代码 PR 与 main 双平台 CI 已通过,发布证据 final CI、唯一制品、精确授权、Registry 与 provenance 回读待完成
260
261
  - [ ] 再后续独立切片:默认关闭的图片生成(只收内联结果,提交 Harness attachment)
261
262
  - [ ] 完成 Windows x64 独立真机验收并按需发布后续稳定修复版
262
263
 
package/SECURITY.md CHANGED
@@ -4,13 +4,13 @@
4
4
 
5
5
  ## 支持范围
6
6
 
7
- 本安全策略对应源码候选版本 `0.1.10`;当前稳定版及 npm Registry 的 `latest` 均为 `0.1.9`。`0.1.8` 曾发布后撤回且版本号不可复用。已发布的 `0.1.9` 完成了失败关闭 fixture 下的隔离 Web Harness `ctx.llm` 四场景验收以及 macOS 14 / Windows 2022 CI,但遗漏 `llm-grok` Host settings namespace,导致 Web/X Search 开关失败关闭为不可用。尚未发布的 `0.1.10` 只修复设置注册和调用快照链路;该链路已通过真实 SettingsProvider/LLM 回归、候选 tarball 隔离安装、设置 API 与浏览器开关写入验收,候选双平台 CI 仍待完成。DeepSeek Harness、Node.js 与操作系统按发布线明确维护;Grok CLI 不使用完整版本字符串作为信任门禁,而是严格校验官方默认路径、命令能力、生产 OIDC 凭据契约和固定服务端协议。图片发送已在真实 Harness 对话中确认可用;Search 协议仍只有失败关闭 fixture 及隔离自动化证据,不覆盖浏览器手工对话、OAuth、真实账号、真实 xAI Search 请求或网络可达 Windows 真机外部浏览器弹出。
7
+ 本安全策略对应源码候选版本 `0.1.11`;当前稳定版及 npm Registry 的 `latest` 均为 `0.1.10`。`0.1.8` 曾发布后撤回且版本号不可复用。已发布的 `0.1.10` 完成唯一制品、macOS 14 / Windows 2022 CI、Registry 字节、签名与 provenance 回读,并修复 Web/X Search 的 Host settings 注册;真实使用随后发现精确 `grok-4.6` 在 High Effort + Web Search 续跑时可能复用已关闭 reasoning ID 作为空占位,旧解码器会失败关闭为通用非法响应。尚未发布的 `0.1.11` 只修复该 reasoning 生命周期兼容并加入官方 raw reasoning 事件支持;代码 PR #25 与 main CI run `33302830043` 双平台已通过,发布证据提交的 final CI、唯一制品、精确授权和发布回读仍待完成。DeepSeek Harness、Node.js 与操作系统按发布线明确维护;Grok CLI 不使用完整版本字符串作为信任门禁,而是严格校验官方默认路径、命令能力、生产 OIDC 凭据契约和固定服务端协议。图片发送已在真实 Harness 对话中确认可用;脱敏真实 Search 探针不保存 prompt、回复、检索词、citation URL 或凭据,但也不覆盖浏览器手工对话、OAuth、完整真实会话或网络可达 Windows 真机外部浏览器弹出。
8
8
 
9
- `0.1.10` 沿用已发布版本的图片边界:只为精确 `grok-4.6` 提供有界图片输入;`grok-4.5` 与所有其他模型保持 text-only。普通 user/system 历史中的私有 reasoning 会被省略并保留相邻可见 text/image;只有有效的同 Provider assistant 历史可进入加密 reasoning replay,一层 tool-result 仍只接受公开 text/image。图片只能来自 Harness attachment service 的已验证 JPEG/PNG 投影,以 `detail:"high"` 发送,并受单图字节、像素、边长、数量、总字节与最终 JSON 上限约束;URL、路径、file ID 和调用方预制 data URL 都会被拒绝。
9
+ `0.1.11` 沿用已发布版本的图片边界:只为精确 `grok-4.6` 提供有界图片输入;`grok-4.5` 与所有其他模型保持 text-only。普通 user/system 历史中的私有 reasoning 会被省略并保留相邻可见 text/image;只有有效的同 Provider assistant 历史可进入加密 reasoning replay,一层 tool-result 仍只接受公开 text/image。图片只能来自 Harness attachment service 的已验证 JPEG/PNG 投影,以 `detail:"high"` 发送,并受单图字节、像素、边长、数量、总字节与最终 JSON 上限约束;URL、路径、file ID 和调用方预制 data URL 都会被拒绝。
10
10
 
11
11
  `0.1.7` 的闭合运行时诊断、CLI 安装恢复、OIDC timeout 脱敏结算和 `IconThinkOutline16` 兼容层在本版保持不变。官方 CLI 仍负责生成登录 URL 与打开外部浏览器;插件不修复系统 DNS、代理、防火墙、VPN 或 CLI 行为。
12
12
 
13
- `0.1.10` 通过 Harness 官方 settings module 注册 `llm-grok`,按 schema 默认值、组合配置、持久化用户层的顺序解析两个 Search 开关。设置提交只影响之后创建的调用;每个调用在模型发现前冻结一次策略,在途请求不会被后续设置写入改变。Search 仍只为精确 `grok-4.6` 默认关闭地开放。启用后,普通对话内容与模型生成的检索词会交给 xAI,并可能产生额外用量;结果和 citation 属于可能错误或含提示注入的不可信远端数据。Provider 只允许固定 Proxy 实测的 Web lifecycle 与四项 X custom-tool 名称,不把它们映射为 Harness 本地工具,不跟随或下载 citation URL,并在观察到 Search 后放弃该响应的 encrypted reasoning replay。后台 purpose、未验证模型、未启用类别、未知事件和未闭合 lifecycle 均失败关闭。固定路径/argv、最小环境、无 shell、输出上限、凭据、固定 origin 与 URL 拒绝边界不变;本版不新增生成、认证模式或 endpoint。
13
+ 已发布的 `0.1.10` 通过 Harness 官方 settings module 注册 `llm-grok`,按 schema 默认值、组合配置、持久化用户层的顺序解析两个 Search 开关;设置提交只影响之后创建的调用。`0.1.11` 不改变这条设置链路,只收窄地扩展响应 codec:已闭合的 reasoning ID 最多可再出现一次,且必须有一个已完成的 server Search 位于两段 reasoning 之间,第二段必须是严格空项;无 Search 间隔、未闭合、跨类型、非空或第二次复用继续失败关闭。空 reasoning 项仍须完整闭合。官方 raw `reasoning_text` 与 summary reasoning 采用互斥状态机,混用、乱序、重复、截断和内容不一致均被拒绝;replay 元数据只保存加密内容及类型标记,不保存 raw 明文,下一请求只发送 `encrypted_content` 与 `summary: []`,不会回传或伪装为 summary;当前流中的 raw delta 仍作为 Harness 可见 reasoning 输出。脱敏真实探针完成 1 次 POST、68 个事件、34 个 summary delta、0 个 raw delta、1 个 finish,因此只能证明当前 summary/Search 路径,raw reasoning 仍只有协议 fixture 证据。Search 继续只为精确 `grok-4.6` 默认关闭地开放;结果和 citation 仍是不可信远端数据,Provider 不把远端 lifecycle 映射为 Harness 本地工具,也不跟随或下载 citation URL。固定路径/argv、最小环境、无 shell、输出上限、凭据、固定 origin 与 URL 拒绝边界不变;本版不新增生成、认证模式或 endpoint。
14
14
 
15
15
  ## 私下报告漏洞
16
16
 
@@ -38,4 +38,4 @@
38
38
 
39
39
  ---
40
40
 
41
- English summary: GitHub Private vulnerability reporting is enabled and preferred. The current source candidate is `0.1.10`; the current stable release and npm Registry `latest` are both `0.1.9`. Version `0.1.8` was published and then withdrawn, and npm version numbers cannot be reused. Published `0.1.9` passed four isolated Web Harness `ctx.llm` cases and macOS 14 / Windows 2022 CI under fail-closed fixtures, but omitted the `llm-grok` Host settings namespace and therefore left both Search controls unavailable. The unpublished `0.1.10` repair registers that namespace through the canonical Harness settings module and snapshots the current policy once per call before model discovery, so committed changes affect only later calls. Its settings path has passed real SettingsProvider/LLM tests, candidate-tarball isolated install, settings API, and browser switch-write acceptance; candidate dual-platform CI remains pending. Bounded JPEG/PNG input, browser-sign-in diagnostics, credentials, endpoints, fixed-Proxy Search allowlists, citation handling, and platform support remain unchanged. Search stays default-off and limited to exact `grok-4.6`; prompts and model-derived queries reach xAI only when enabled and may incur additional usage. Results and citations are untrusted remote data. Automated fixtures do not cover manual browser conversations, OAuth, a real account, real xAI Search requests, or network-reachable Windows browser launch. Never send credentials, identity data, prompts, tool arguments, cookies, image bytes, Search contents, or unreviewed diagnostics.
41
+ English summary: GitHub Private vulnerability reporting is enabled and preferred. The current source candidate is `0.1.11`; the current stable release and npm Registry `latest` are both `0.1.10`. Version `0.1.8` was published and then withdrawn, and npm version numbers cannot be reused. Published `0.1.10` completed unique-artifact, macOS 14 / Windows 2022 CI, Registry-byte, signature, and provenance verification and repaired Host Search settings registration. Real use later found that exact `grok-4.6` at High Effort may close a reasoning ID, complete Search, and then reuse it once as an empty placeholder, which the old decoder rejected. Unpublished `0.1.11` permits that strictly empty reuse only when a completed server Search lies between the two reasoning lifecycles, accepts fully closed empty reasoning items, and adds a mutually exclusive official raw `reasoning_text` lifecycle. Replay metadata does not retain raw plaintext; later requests carry only `encrypted_content` plus `summary: []`, while live raw deltas remain visible to Harness. A redacted real probe produced one POST, 68 events, 34 summary deltas, zero raw deltas, and one finish, so it verifies only the summary/Search path; raw reasoning remains fixture-verified. Code PR #25 and main CI run `33302830043` passed on macOS 14 and Windows 2022; the release-evidence commit's final CI, the unique artifact, exact authorization, and release readback remain pending. Authentication, settings, image input, citations, endpoints, and platform support are unchanged. Search results and citations remain untrusted remote data. Never send credentials, identity data, prompts, tool arguments, cookies, image bytes, Search contents, or unreviewed diagnostics.
@@ -49,7 +49,7 @@ export function createResponsesEventDecoder(receipt) {
49
49
  const serverCalls = new Map()
50
50
  const completedServerCalls = []
51
51
  const outputIndexes = new Set()
52
- const itemIds = new Set()
52
+ const itemLifecycles = new Map()
53
53
  const callIds = new Set()
54
54
  const replayBlocks = []
55
55
  let nextOutputIndex = 0
@@ -100,7 +100,8 @@ export function createResponsesEventDecoder(receipt) {
100
100
  event,
101
101
  blocks,
102
102
  serverCalls,
103
- itemIds,
103
+ completedServerCalls,
104
+ itemLifecycles,
104
105
  callIds,
105
106
  replayBlocks,
106
107
  chunks,
@@ -114,15 +115,28 @@ export function createResponsesEventDecoder(receipt) {
114
115
 
115
116
  case "response.reasoning_summary_part.added": {
116
117
  const block = requireBlock(event, blocks, "reasoning")
117
- if (block.summaryStarted || block.summaryTextDone || block.summaryDone) fail()
118
+ if (
119
+ block.reusedReasoning ||
120
+ block.reasoningAddedStatus !== "in_progress" ||
121
+ block.reasoningMode !== undefined ||
122
+ block.summaryStarted ||
123
+ block.summaryTextDone ||
124
+ block.summaryDone
125
+ ) fail()
118
126
  if (!isPlainObject(event.part) || event.part.type !== "summary_text" || event.part.text !== "") fail()
127
+ block.reasoningMode = "summary"
119
128
  block.summaryStarted = true
120
129
  break
121
130
  }
122
131
 
123
132
  case "response.reasoning_summary_text.delta": {
124
133
  const block = requireBlock(event, blocks, "reasoning")
125
- if (!block.summaryStarted || block.summaryTextDone || block.summaryDone) fail()
134
+ if (
135
+ block.reasoningMode !== "summary" ||
136
+ !block.summaryStarted ||
137
+ block.summaryTextDone ||
138
+ block.summaryDone
139
+ ) fail()
126
140
  appendDelta(block, event.delta)
127
141
  sawVisibleOutput = true
128
142
  chunks.push({ type: "reasoning-delta", index: event.output_index, text: event.delta })
@@ -132,6 +146,7 @@ export function createResponsesEventDecoder(receipt) {
132
146
  case "response.reasoning_summary_text.done": {
133
147
  const block = requireBlock(event, blocks, "reasoning")
134
148
  if (
149
+ block.reasoningMode !== "summary" ||
135
150
  !block.summaryStarted ||
136
151
  block.summaryTextDone ||
137
152
  block.summaryDone ||
@@ -144,6 +159,7 @@ export function createResponsesEventDecoder(receipt) {
144
159
  case "response.reasoning_summary_part.done": {
145
160
  const block = requireBlock(event, blocks, "reasoning")
146
161
  if (
162
+ block.reasoningMode !== "summary" ||
147
163
  !block.summaryStarted ||
148
164
  !block.summaryTextDone ||
149
165
  block.summaryDone ||
@@ -156,14 +172,54 @@ export function createResponsesEventDecoder(receipt) {
156
172
  }
157
173
 
158
174
  case "response.content_part.added": {
159
- const block = requireBlock(event, blocks, "text")
175
+ const block = requireBlock(event, blocks)
160
176
  if (block.contentStarted) fail()
161
- validateTextPart(event.part, "", [])
177
+ if (block.type === "reasoning") {
178
+ if (
179
+ block.reusedReasoning ||
180
+ block.reasoningAddedStatus !== "in_progress" ||
181
+ block.reasoningMode !== undefined
182
+ ) fail()
183
+ requireRawContentLocation(event, block)
184
+ validateReasoningTextPart(event.part, "")
185
+ block.reasoningMode = "raw"
186
+ } else if (block.type === "text") {
187
+ validateTextPart(event.part, "", [])
188
+ } else fail()
162
189
  block.contentStarted = true
163
190
  block.contentIndex = parseOptionalIndex(event.content_index, 0)
164
191
  break
165
192
  }
166
193
 
194
+ case "response.reasoning_text.delta": {
195
+ const block = requireBlock(event, blocks, "reasoning")
196
+ if (
197
+ block.reasoningMode !== "raw" ||
198
+ !block.contentStarted ||
199
+ block.textDone ||
200
+ block.contentDone
201
+ ) fail()
202
+ requireRawContentLocation(event, block)
203
+ appendDelta(block, event.delta)
204
+ sawVisibleOutput = true
205
+ chunks.push({ type: "reasoning-delta", index: event.output_index, text: event.delta })
206
+ break
207
+ }
208
+
209
+ case "response.reasoning_text.done": {
210
+ const block = requireBlock(event, blocks, "reasoning")
211
+ if (
212
+ block.reasoningMode !== "raw" ||
213
+ !block.contentStarted ||
214
+ block.textDone ||
215
+ block.contentDone
216
+ ) fail()
217
+ requireRawContentLocation(event, block)
218
+ if (event.text !== block.text) fail()
219
+ block.textDone = true
220
+ break
221
+ }
222
+
167
223
  case "response.output_text.delta": {
168
224
  const block = requireBlock(event, blocks, "text")
169
225
  if (!block.contentStarted || block.textDone || block.contentDone) fail()
@@ -261,10 +317,16 @@ export function createResponsesEventDecoder(receipt) {
261
317
  break
262
318
 
263
319
  case "response.content_part.done": {
264
- const block = requireBlock(event, blocks, "text")
320
+ const block = requireBlock(event, blocks)
265
321
  if (!block.textDone || block.contentDone) fail()
266
322
  requireContentIndex(event, block)
267
- validateTextPart(event.part, block.text, block.annotations)
323
+ if (block.type === "reasoning") {
324
+ if (block.reasoningMode !== "raw") fail()
325
+ requireRawContentLocation(event, block)
326
+ validateReasoningTextPart(event.part, block.text)
327
+ } else if (block.type === "text") {
328
+ validateTextPart(event.part, block.text, block.annotations)
329
+ } else fail()
268
330
  block.contentDone = true
269
331
  break
270
332
  }
@@ -278,6 +340,7 @@ export function createResponsesEventDecoder(receipt) {
278
340
  replayBlocks,
279
341
  chunks,
280
342
  )
343
+ markOutputItemClosed(event, itemLifecycles)
281
344
  break
282
345
 
283
346
  case "response.completed":
@@ -378,7 +441,8 @@ function addOutputItem(
378
441
  event,
379
442
  blocks,
380
443
  serverCalls,
381
- itemIds,
444
+ completedServerCalls,
445
+ itemLifecycles,
382
446
  callIds,
383
447
  replayBlocks,
384
448
  chunks,
@@ -391,8 +455,12 @@ function addOutputItem(
391
455
  !isPlainObject(event.item) ||
392
456
  !isBoundedString(event.item.id, 256)
393
457
  ) fail()
394
- if (itemIds.has(event.item.id)) fail()
395
- itemIds.add(event.item.id)
458
+ const reusedReasoning = registerOutputItem(
459
+ event.item,
460
+ index,
461
+ itemLifecycles,
462
+ completedServerCalls,
463
+ )
396
464
 
397
465
  if (event.item.type === "web_search_call") {
398
466
  if (!responsePolicy.serverTools.has("web_search")) fail()
@@ -425,14 +493,22 @@ function addOutputItem(
425
493
  let type
426
494
  let block
427
495
  if (event.item.type === "reasoning") {
496
+ validateReasoningItemStart(event.item)
428
497
  type = "reasoning"
429
498
  block = {
430
499
  id: event.item.id,
431
500
  type,
501
+ reusedReasoning,
502
+ reasoningAddedStatus: event.item.status,
432
503
  text: "",
504
+ reasoningMode: undefined,
433
505
  summaryStarted: false,
434
506
  summaryTextDone: false,
435
507
  summaryDone: false,
508
+ contentStarted: false,
509
+ contentIndex: 0,
510
+ textDone: false,
511
+ contentDone: false,
436
512
  }
437
513
  } else if (event.item.type === "message" && event.item.role === "assistant") {
438
514
  type = "text"
@@ -476,6 +552,51 @@ function addOutputItem(
476
552
  return type
477
553
  }
478
554
 
555
+ function registerOutputItem(item, outputIndex, itemLifecycles, completedServerCalls) {
556
+ const previous = itemLifecycles.get(item.id)
557
+ if (previous === undefined) {
558
+ itemLifecycles.set(item.id, {
559
+ type: item.type,
560
+ outputIndex,
561
+ closed: false,
562
+ reused: false,
563
+ })
564
+ return false
565
+ }
566
+
567
+ // Output lifecycles may interleave, so bind this narrow exception to logical
568
+ // output order: a completed Search item must sit between the two reasoning items.
569
+ const completedSearchBetweenItems = completedServerCalls.some((call) => (
570
+ call.outputIndex > previous.outputIndex && call.outputIndex < outputIndex
571
+ ))
572
+ if (
573
+ previous.type !== "reasoning" ||
574
+ !previous.closed ||
575
+ previous.reused ||
576
+ !completedSearchBetweenItems ||
577
+ item.type !== "reasoning" ||
578
+ item.status !== "in_progress" ||
579
+ !Array.isArray(item.summary) ||
580
+ item.summary.length !== 0
581
+ ) fail()
582
+ requireExactDataKeys(item, ["id", "status", "summary", "type"])
583
+ itemLifecycles.set(item.id, {
584
+ type: "reasoning",
585
+ outputIndex,
586
+ closed: false,
587
+ reused: true,
588
+ })
589
+ return true
590
+ }
591
+
592
+ function markOutputItemClosed(event, itemLifecycles) {
593
+ const index = parseIndex(event.output_index)
594
+ if (!isPlainObject(event.item) || !isBoundedString(event.item.id, 256)) fail()
595
+ const lifecycle = itemLifecycles.get(event.item.id)
596
+ if (lifecycle === undefined || lifecycle.outputIndex !== index || lifecycle.closed) fail()
597
+ itemLifecycles.set(event.item.id, { ...lifecycle, closed: true })
598
+ }
599
+
479
600
  function closeOutputItem(
480
601
  event,
481
602
  blocks,
@@ -502,21 +623,28 @@ function closeOutputItem(
502
623
  event.item.status !== "completed"
503
624
  ) fail()
504
625
  if (block.type === "reasoning") {
505
- if (
506
- event.item.type !== "reasoning" ||
507
- !block.summaryDone ||
508
- !Array.isArray(event.item.summary) ||
509
- event.item.summary.length !== 1 ||
510
- !isPlainObject(event.item.summary[0]) ||
511
- event.item.summary[0].type !== "summary_text" ||
512
- event.item.summary[0].text !== block.text
513
- ) fail()
626
+ if (event.item.type !== "reasoning") fail()
627
+ if (block.reasoningMode === "summary") {
628
+ if (
629
+ !block.summaryDone ||
630
+ !Array.isArray(event.item.summary) ||
631
+ event.item.summary.length !== 1 ||
632
+ !isPlainObject(event.item.summary[0]) ||
633
+ event.item.summary[0].type !== "summary_text" ||
634
+ event.item.summary[0].text !== block.text
635
+ ) fail()
636
+ } else if (block.reasoningMode === "raw") {
637
+ validateCompletedReasoningContent(event.item, block)
638
+ } else if (block.reasoningMode === undefined) {
639
+ validateEmptyReasoningItem(event.item, block)
640
+ } else fail()
514
641
  if (event.item.encrypted_content !== undefined) {
515
642
  if (!isBoundedUtf8String(event.item.encrypted_content, MAX_ENCRYPTED_REASONING_BYTES)) fail()
516
643
  replayBlocks[block.replayPosition] = {
517
644
  type: "reasoning",
518
645
  id: block.id,
519
646
  encryptedContent: event.item.encrypted_content,
647
+ ...(block.reasoningMode === "raw" ? { textType: "reasoning_text" } : {}),
520
648
  }
521
649
  }
522
650
  }
@@ -675,6 +803,51 @@ function validateCompletedMessageContent(content, block) {
675
803
  validateTextPart(parts[0], block.text, block.annotations)
676
804
  }
677
805
 
806
+ function validateReasoningTextPart(part, text) {
807
+ if (!isPlainObject(part) || part.type !== "reasoning_text" || part.text !== text) fail()
808
+ }
809
+
810
+ function validateReasoningItemStart(item) {
811
+ if (item.status !== "in_progress" && item.status !== "completed") fail()
812
+ const summary = captureDataArray(item.summary, 0)
813
+ if (summary.length !== 0) fail()
814
+ if (item.content !== undefined) {
815
+ const content = captureDataArray(item.content, 0)
816
+ if (content.length !== 0) fail()
817
+ }
818
+ if (
819
+ item.encrypted_content !== undefined &&
820
+ !isBoundedUtf8String(item.encrypted_content, MAX_ENCRYPTED_REASONING_BYTES)
821
+ ) fail()
822
+ }
823
+
824
+ function validateCompletedReasoningContent(item, block) {
825
+ if (!block.contentDone) fail()
826
+ const summary = captureDataArray(item.summary, 0)
827
+ if (summary.length !== 0) fail()
828
+ const content = captureDataArray(item.content, 1)
829
+ if (content.length !== 1) fail()
830
+ validateReasoningTextPart(content[0], block.text)
831
+ }
832
+
833
+ function validateEmptyReasoningItem(item, block) {
834
+ if (
835
+ block.text !== "" ||
836
+ block.summaryStarted ||
837
+ block.summaryTextDone ||
838
+ block.summaryDone ||
839
+ block.contentStarted ||
840
+ block.textDone ||
841
+ block.contentDone
842
+ ) fail()
843
+ const summary = captureDataArray(item.summary, 0)
844
+ if (summary.length !== 0) fail()
845
+ if (item.content !== undefined) {
846
+ const content = captureDataArray(item.content, 0)
847
+ if (content.length !== 0) fail()
848
+ }
849
+ }
850
+
678
851
  function captureAnnotations(value) {
679
852
  const values = captureDataArray(value, MAX_ANNOTATIONS)
680
853
  return values.map(captureAnnotation)
@@ -897,6 +1070,13 @@ function requireContentIndex(event, block) {
897
1070
  if (parseOptionalIndex(event.content_index, block.contentIndex) !== block.contentIndex) fail()
898
1071
  }
899
1072
 
1073
+ function requireRawContentLocation(event, block) {
1074
+ if (
1075
+ event.item_id !== block.id ||
1076
+ parseIndex(event.content_index) !== block.contentIndex
1077
+ ) fail()
1078
+ }
1079
+
900
1080
  function appendDelta(block, delta) {
901
1081
  if (typeof delta !== "string" || delta.length === 0) fail()
902
1082
  block.text += delta
@@ -440,6 +440,7 @@ function snapshotReplayState(source, targetModel, contentLength) {
440
440
  type: block.type,
441
441
  id: block.id,
442
442
  encryptedContent: block.encryptedContent,
443
+ textType: block.textType,
443
444
  })
444
445
  }
445
446
  return Object.freeze({
@@ -181,11 +181,12 @@ function encodeOrdinaryMessage(message, content, input, targetModel, requestImag
181
181
  const replay = replayBlocks?.[position]
182
182
  if (isReasoningReplay(replay)) {
183
183
  flushText()
184
+ const rawReasoning = replay.textType === "reasoning_text"
184
185
  input.push({
185
186
  type: "reasoning",
186
187
  id: replay.id,
187
188
  encrypted_content: replay.encryptedContent,
188
- summary: reasoningText.length === 0
189
+ summary: rawReasoning || reasoningText.length === 0
189
190
  ? []
190
191
  : [{ type: "summary_text", text: reasoningText }],
191
192
  })
@@ -272,6 +273,11 @@ function isReasoningReplay(value) {
272
273
  return isPlainObject(value) &&
273
274
  value.type === "reasoning" &&
274
275
  isId(value.id) &&
276
+ (
277
+ value.textType === undefined ||
278
+ value.textType === "summary_text" ||
279
+ value.textType === "reasoning_text"
280
+ ) &&
275
281
  typeof value.encryptedContent === "string" &&
276
282
  value.encryptedContent.length > 0 &&
277
283
  Buffer.byteLength(value.encryptedContent, "utf8") <= MAX_TEXT_LENGTH
@@ -522,6 +528,7 @@ function captureReplayState(replayState, contentLength) {
522
528
  type: readOwnDataProperty(block, "type"),
523
529
  id: readOwnDataProperty(block, "id"),
524
530
  encryptedContent: readOwnDataProperty(block, "encryptedContent"),
531
+ textType: readOwnDataProperty(block, "textType"),
525
532
  })
526
533
  }
527
534
  return Object.freeze({
@@ -21,7 +21,7 @@
21
21
  - Web 设置页能区分官方 CLI 缺失、无效、检测不可用、OIDC discovery 网络超时与真人授权超时,并显示 Provider/已验证 CLI 版本;这些诊断不得暴露路径、stderr、代理配置或 OAuth URL。
22
22
  - 首版只接受与发布绑定 CLI 版本的 xAI 第一方 OIDC schema 相符的候选。CLI 有效配置若选择外部 auth provider、企业 OIDC、API key 或无法判定的凭据结构,插件必须显示“不受支持的认证配置”并拒绝由本插件把该 token 发给 xAI CLI Chat Proxy;这不把未签名 metadata 宣称成来源证明。
23
23
  - 支持多轮文本对话、reasoning 增量、流式文本、工具调用、usage 和明确 finish 原因。
24
- - `0.1.9` 引入精确 `grok-4.6` 的 Web/X Search 协议与页面,`0.1.10` 补齐可写 Host settings 集成:两个开关独立、默认关闭,后台/派生 purpose 不启用 Search,远端 server-tool lifecycle 不得投影为 Harness 本地工具。
24
+ - `0.1.9` 引入精确 `grok-4.6` 的 Web/X Search 协议与页面,`0.1.10` 补齐可写 Host settings 集成;`0.1.11` 修复 High Effort + Web Search 续跑的 reasoning lifecycle:两个开关独立、默认关闭,后台/派生 purpose 不启用 Search,远端 server-tool lifecycle 不得投影为 Harness 本地工具。
25
25
  - Harness 中止请求时,网络流和解析器都能及时终止。
26
26
  - 热更新设置或重新认证不会让同一调用混用两组路由或凭据。
27
27
  - 凭据不进入 renderer、RPC、settings、workspace、本插件日志、错误详情、诊断包或 npm tarball;官方 CLI 自身的日志、网络与遥测属于独立 vendor boundary。
@@ -71,7 +71,7 @@
71
71
  - Grok ACP 或 `grok -p` headless 代理。
72
72
  - 厂商侧 Web Search、X Search、远程抓取。
73
73
  - 图片生成、图片 URL 下载或文件落盘。
74
- - 图片输入(`0.1.0`–`0.1.3`);已发布 `0.1.4` 按[能力路线图](./11-capability-roadmap.md)与 [ADR-0008](./adr/0008-image-input-request-compiler.md)只为精确 `grok-4.6` 独立引入,`grok-4.5` 与所有其他模型继续 text-only;维护版 `0.1.5`–`0.1.7`、发布后撤回的 sidebar quota `0.1.8`、已发布 `0.1.9` 与当前 `0.1.10` 候选均不扩大该图片集合。
74
+ - 图片输入(`0.1.0`–`0.1.3`);已发布 `0.1.4` 按[能力路线图](./11-capability-roadmap.md)与 [ADR-0008](./adr/0008-image-input-request-compiler.md)只为精确 `grok-4.6` 独立引入,`grok-4.5` 与所有其他模型继续 text-only;维护版 `0.1.5`–`0.1.7`、发布后撤回的 sidebar quota `0.1.8`、已发布 `0.1.9`–`0.1.10` 与当前 `0.1.11` 候选均不扩大该图片集合。
75
75
  - 自定义 endpoint、企业 OIDC、自定义代理或多账号。
76
76
  - 自动安装或更新 Grok CLI。
77
77
  - 在远程 Web/headless 主机自动打开浏览器或无人值守登录的承诺。
@@ -117,7 +117,8 @@ Web 的“退出”或 TUI `/grok logout` 先中止本插件所有在途 Grok
117
117
  - canary secret 扫描确认日志、RPC、错误、临时文件和打包产物无泄漏。
118
118
  - 协议测试确认第二个测试 origin 永远收不到 Authorization。
119
119
  - `0.1.9` 的固定 Proxy 脱敏门禁分别覆盖 Web、X、Web+X、Web+Harness function;离线回归确认默认关闭 wire 不变、未支持 route 在 POST 前失败、Search 产生零本地 tool-call chunk,未知或未闭合 lifecycle 失败关闭。
120
- - `0.1.10` 的真实 SettingsProvider 与隔离 Web Harness 验收必须证明唯一可写 `llm-grok` namespace、两个开关默认关闭且可操作;设置更新只影响首次 await 之后尚未开始的新调用,已准备或在途调用保持原快照。
120
+ - `0.1.10` 的真实 SettingsProvider 与隔离 Web Harness 验收已证明唯一可写 `llm-grok` namespace、两个开关默认关闭且可操作;设置更新只影响首次 await 之后尚未开始的新调用,已准备或在途调用保持原快照。
121
+ - `0.1.11` 必须只在一个已完成 server Search 位于两段 reasoning 之间时允许已关闭 reasoning ID 一次性复用为严格空项;raw `reasoning_text` 与 summary lifecycle 必须互斥,replay 元数据不得保存 raw 明文,后续请求只发送 encrypted content 与空 summary,当前流中的 raw delta 仍作为 Harness 可见 reasoning 输出。
121
122
 
122
123
  ## 8. `0.1.0` 历史发布阻断项
123
124
 
@@ -143,7 +144,8 @@ Web 的“退出”或 TUI `/grok logout` 先中止本插件所有在途 Grok
143
144
  - `0.1.7`:已发布 Windows 官方 CLI 安装/版本诊断、登录失败可解释性与 Web 设置导航 `IconThinkOutline16` 维护;不改变官方 CLI 网络/代理或 OAuth 流程,不新增模型能力。
144
145
  - `0.1.8`:sidebar quota 维护版曾发布后撤回;npm Registry 已消耗该版本号,不能把 Search 重新标记或发布为 `0.1.8`。
145
146
  - `0.1.9`:已为精确 `grok-4.6` 发布默认关闭、设计为可独立开启的 Web Search / X Search 协议与页面,但遗漏 Host `llm-grok` namespace,真实页面开关不可用。
146
- - `0.1.10` 当前候选:补齐 canonical settings namespace 与按调用动态快照,使 `0.1.9` 的两个开关真正可写;不改变 Search wire、支持模型或认证边界。
147
+ - `0.1.10` 已发布:补齐 canonical settings namespace 与按调用动态快照,使 `0.1.9` 的两个开关真正可写。
148
+ - `0.1.11` 当前候选:修复 High Effort + Web Search reasoning 生命周期兼容并支持官方 raw reasoning 事件;不改变 Search descriptor、支持模型、认证或图片边界。
147
149
  - 再后续独立切片:默认关闭的图片生成(内联结果 → Harness attachment)。
148
150
 
149
151
  `prompt_cache_key` 不与图片输入捆绑;若以后排期,需独立分析会话标识隐私和 POST 不自动重放边界。任意 URL 下载、API Key、企业 OIDC、ACP、Headless 和 Linux 仍不在路线内。公开协议可驱动隔离原型,但每个切片在声明能力、合并发布基线前必须有独立 ADR 与固定 CLI Chat Proxy spike;`0.1.4` 的 `grok-4.6` user/tool-result 红蓝语义门禁已于 2026-08-28 通过,`grok-4.5` 因语义不可靠失败关闭,最终 Harness attachment 复验见[上游证据页](./12-upstream-image-input-evidence.md)。
@@ -9,7 +9,7 @@
9
9
 
10
10
  只有本文所有 P0 门禁和 [测试计划](./05-test-plan.md) 的安全用例通过,才允许发布。
11
11
 
12
- `0.1.9` 已从 release commit `a0af7b74882546dc3d9477b8f6c1494935e6bfb4` 正式发布;CI run `33295408650` 全绿。唯一 69 文件、190,049-byte 制品的 unpacked size 为 603,475 bytes,SHA-256 为 `78c73c95ea71d66cad6e6146fed41c281f1c8b29f60353e3f20247ec23833210`,npm SRI 为 `sha512-GeXQg3qedCGZz9D5MMaHd8Afe5Bn0nxjG+PQmKOB2AxB3m6IiGA07PMD77dEAOJVbAzKk0SnxAOKTZMTQFtuYg==`;Trusted Publisher run `33295761336` 完成,Registry、GitHub Release 与本地制品逐字节一致,npm `latest=0.1.9`。精确 Registry 安装的 Host/client import/export smoke 通过;精确安装审计图汇总 71 个已验证签名与 3 个 attestations,本包 attestations endpoint 返回 2 项,SLSA provenance 精确绑定 `v0.1.9` tag、release workflow、release commit 与 release run。sidebar quota 维护版 `0.1.8` 曾发布后撤回,npm Registry 已消耗该号码且不能复用;Search 从未作为 `0.1.8` 发布。`0.1.9` 只为精确 `grok-4.6` 增加默认关闭、设计为可独立启用的 Web/X Search 协议与页面,但遗漏 Host `llm-grok` namespace,真实页面开关不可用。当前 `0.1.10` 候选只修复可写设置链路和按调用快照,不改变推理 Bearer 的固定 origin、Search wire、支持模型、官方 CLI OAuth 所有权或系统网络/代理边界。
12
+ `0.1.10` 已从 release commit `fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028` 正式发布;main CI run `33299116564` 全绿。唯一 70 文件、197,620-byte 制品的 unpacked size 为 628,836 bytes,SHA-256 为 `f9fe1dea743e86e2799a1073a93a8af91ad5bd389e14f4d2f0528428ada93c62`,npm SRI 为 `sha512-OnfG4diVqJdzYSwJKERNnaplYFbOvFICZP58E0f2Cdh+t7orlTL1DWokvzEHdJrw6HA+UMoKDZgJ6AMEVv4aUg==`;Trusted Publisher run `33299599113` 完成,Registry、GitHub Release 与本地制品逐字节一致,npm `latest=0.1.10`,Registry signature 与 SLSA provenance 已回读。sidebar quota `0.1.8` 曾发布后撤回且不能复用。`0.1.9` 发布精确 `grok-4.6` 的默认关闭 Web/X Search 协议与页面,`0.1.10` 补齐 Host `llm-grok` namespace 与按调用快照。真实使用随后发现 High Effort + Web Search 续跑的 reasoning ID 空占位复用;当前 `0.1.11` 候选只修复该 Responses 生命周期并加入官方 raw reasoning 事件支持,不改变推理 Bearer 的固定 origin、Search descriptor、支持模型、官方 CLI OAuth 所有权或系统网络/代理边界。
13
13
 
14
14
  ## 2. 信任边界
15
15
 
@@ -242,7 +242,7 @@ TUI 通过 Harness 的 human-command registry 注册一个全局 `/grok`,只
242
242
  - 最终 JSON 超限继续逐张淘汰最旧图片;缺服务、projection unsupported、源图片位置/引用/MIME 不支持在 Responses POST 前以 `UNSUPPORTED_CONTENT` 拒绝。store 返回损坏或不自洽的投影、超过含图编译 block 预算、更深 tool-result,以及图片全部淘汰后剩余非图片请求仍不合法,都保持通用 `INVALID_RESPONSE`。
243
243
  - AbortSignal 在查询服务前检查并传给所有投影读取;编译失败时 Responses POST 调用必须为 0,但模型目录 GET 可能已发生。
244
244
 
245
- `0.1.9` 按 [ADR-0010](./adr/0010-default-off-web-x-search.md) 独立增加 Search 协议与页面;`0.1.10` 补齐真实 Host settings 集成,且不扩大图片或 origin 边界:
245
+ `0.1.9` 按 [ADR-0010](./adr/0010-default-off-web-x-search.md) 独立增加 Search 协议与页面;`0.1.10` 补齐真实 Host settings 集成;`0.1.11` 收窄地兼容 Search 之后的 reasoning lifecycle,且不扩大图片或 origin 边界:
246
246
 
247
247
  - Web Search 与 X Search 在唯一 `llm-grok` namespace 中默认关闭并独立持久化;无 settings service 时回退组合配置。每个调用在首次 await 前冻结一次 policy,热更新只影响后续调用;两项全关时不读取 `purpose`,最终 request wire 与 `0.1.7` 保持一致。
248
248
  - 只为固定 Proxy 已验证的精确 `grok-4.6` route 编译 `{type:"web_search"}` / `{type:"x_search"}`;不支持模型在 Responses POST 前返回 `UNSUPPORTED_CONTENT`。
@@ -250,8 +250,9 @@ TUI 通过 Harness 的 human-command registry 注册一个全局 `/grok`,只
250
250
  - Web 与 X 都是 xAI 已执行的 server tool,产生零个 Harness `tool-call` chunk;X 只接受四个实测 custom-tool 名称。未启用类别、未知、重复、乱序或未闭合生命周期全部失败关闭。
251
251
  - citation URL 不被打开、下载或重新请求;结构化 annotation/citations 只做有界验证后丢弃。观察到任何 Search 后不保存本响应的 encrypted reasoning replay。
252
252
  - Search 关闭不代表服务商内部绝不检索;开启后提示词与模型生成的检索词会到达 xAI,且结果可能错误、含提示注入并产生额外用量。
253
+ - reasoning ID 只有在旧段已闭合、一个已完成 server Search 位于两段 output index 之间、新段严格为空时才允许复用一次;无 Search 间隔、跨类型、非空、未闭合和再次复用继续失败关闭。raw `reasoning_text` 与 summary lifecycle 互斥;replay 元数据不保存 raw 明文,后续请求只发送 encrypted content 与空 summary,当前流 raw delta 仍作为 Harness 可见 reasoning 输出。
253
254
 
254
- 公开 xAI 文档、离线测试与真机验证继续作为三类独立证据。[图片证据页](./12-upstream-image-input-evidence.md)记录的固定 Proxy 门禁已对 `grok-4.6` 的普通 user 与一层 tool-result 分别发送红/蓝合成图:4 次均为 HTTP 200、`text/event-stream`、completed,规范化整段回复只含正确颜色词和可选句末标点。`grok-4.5` 的受控红图结果语义不可靠,因此即使公开模型页声明图片能力也不进入本插件图片集合。图片固定使用 `detail:"high"`。Harness `0.1.1-rc.2` attachment-local/LlmRuntime 已复验 `grok-4.6` image、`grok-4.5`/未知模型 text-only,候选门禁随后关闭并完成 `0.1.4` 发布。已发布 `0.1.6` 只允许普通 user/system 历史省略通过闭合字符串/长度校验的私有 reasoning 并保留相邻可见 text/image;畸形或超限 reasoning 仍在 attachment I/O 和 Responses POST 前失败。该修复不改变 assistant 加密 reasoning replay 或一层 tool-result 的公开内容边界。已发布 `0.1.7` 同样不改变图片集合、投影、Responses wire 或固定 origin。sidebar quota `0.1.8` 发布后已撤回,Search 的 Web、X、Web+X 与生产 function → `web_search` 顺序 Web+function 四组固定 Proxy 观察全部归属已发布 `0.1.9`,见 [Search 证据页](./13-upstream-search-evidence.md);`0.1.10` 只修复真实设置入口。隔离 Web Harness 与精确 Registry Host/client import/export smoke 不覆盖浏览器手工对话、Agent/session loop、OAuth、真实账号/真实 xAI 请求或 Windows 真机。任意 URL 下载与把 Authorization 带到第二个 origin 在所有版本仍永久禁止。
255
+ 公开 xAI 文档、离线测试与真机验证继续作为三类独立证据。[图片证据页](./12-upstream-image-input-evidence.md)记录的固定 Proxy 门禁已对 `grok-4.6` 的普通 user 与一层 tool-result 分别发送红/蓝合成图:4 次均为 HTTP 200、`text/event-stream`、completed,规范化整段回复只含正确颜色词和可选句末标点。`grok-4.5` 的受控红图结果语义不可靠,因此即使公开模型页声明图片能力也不进入本插件图片集合。图片固定使用 `detail:"high"`。Harness `0.1.1-rc.2` attachment-local/LlmRuntime 已复验 `grok-4.6` image、`grok-4.5`/未知模型 text-only,候选门禁随后关闭并完成 `0.1.4` 发布。已发布 `0.1.6` 只允许普通 user/system 历史省略通过闭合字符串/长度校验的私有 reasoning 并保留相邻可见 text/image。sidebar quota `0.1.8` 发布后已撤回,Search 的四组固定 Proxy 观察归属已发布 `0.1.9`,`0.1.10` 修复真实设置入口。`0.1.11` 的脱敏真实 probe 经生产 decoder 完成 1 次 POST、68 个事件、34 个 summary delta、0 个 raw delta与 1 个 finish,只验证 summary/Search 路径;raw reasoning 仍只有协议 fixture 证据。隔离验收与制品回读不覆盖浏览器手工对话、Agent/session loop、OAuth、完整真实账号会话或 Windows 真机。任意 URL 下载与把 Authorization 带到第二个 origin 在所有版本仍永久禁止。
255
256
 
256
257
  ## 9. 残余风险
257
258
 
@@ -7,7 +7,7 @@
7
7
  - 所有本地模拟服务使用随机 loopback 端口,不访问真实第三方。
8
8
  - 真实账号 smoke 只在发布候选上人工执行,记录脱敏结果。
9
9
  - `0.1.0` 发布前必须通过 macOS arm64 真机与 macOS/Windows 自动化矩阵;Windows x64 首次真机验证在发布后对 Registry 精确版本执行,验证前对外标注“代码支持、真机未验证”。
10
- - `0.1.1` 及后续版本不要求每次重复真机验证;自动化矩阵、契约测试、干净安装和 tarball 校验是常规发版门禁。认证流程、平台 subprocess seam 或安全契约发生变化的版本原则上仍须做对应平台的定向真机验证;若仓库所有者对精确版本明确批准发布后验证,发布前必须公开标注未验证范围、保留自动化门禁,并在失败时使用新的递增稳定版修复。`0.1.6` 采用该已记录特例并已发布;发布后图片已确认可用,Windows 官方 CLI 则在生成登录 URL 前复现 OIDC discovery timeout。已发布 `0.1.7` 负责解释并闭合这些状态,不把系统网络失败冒充成浏览器弹出修复;发布后撤回的 sidebar quota `0.1.8`、已发布的 Search `0.1.9` 与当前 `0.1.10` Search settings 集成候选均不改变认证流程。
10
+ - `0.1.1` 及后续版本不要求每次重复真机验证;自动化矩阵、契约测试、干净安装和 tarball 校验是常规发版门禁。认证流程、平台 subprocess seam 或安全契约发生变化的版本原则上仍须做对应平台的定向真机验证;若仓库所有者对精确版本明确批准发布后验证,发布前必须公开标注未验证范围、保留自动化门禁,并在失败时使用新的递增稳定版修复。`0.1.6` 采用该已记录特例并已发布;发布后图片已确认可用,Windows 官方 CLI 则在生成登录 URL 前复现 OIDC discovery timeout。已发布 `0.1.7` 负责解释并闭合这些状态,不把系统网络失败冒充成浏览器弹出修复;发布后撤回的 sidebar quota `0.1.8`、已发布的 Search `0.1.9`–`0.1.10` 与当前 `0.1.11` reasoning 兼容候选均不改变认证流程。
11
11
 
12
12
  ## 2. Gate 0:方案确认
13
13
 
@@ -146,7 +146,7 @@
146
146
  - 真实 `SettingsProvider` + `LlmRuntime` 必须描述唯一 `llm-grok` namespace,默认值为两项关闭且 `applies:"live"`;用户层更新进入后续请求,插件卸载清理 namespace,无 settings service 时回退组合配置。
147
147
  - Adapter 必须在每个调用开始且首次模型目录 await 前冻结 Search policy;用延迟目录证明等待期间的设置更新不改变该 prepared call,而下一调用读取新值。
148
148
  - 只有精确 `grok-4.6` route 可接收 Search descriptor;`grok-4.5`、未知模型、缺 capability 或 capability 顺序/值异常均在 POST 前失败。Harness functions → Web → X 的顺序、128 项共享上限和 16 MiB JSON 上限必须锁定。
149
- - Web lifecycle、四项 X custom-tool 名称、Web+X 交错与 Web+function 混合都必须闭合;未启用类别、未知 name/event/annotation、重复 output index、乱序、截断或未闭合状态失败关闭。结构化 citation 有界校验后丢弃,任一 Search 出现后 encrypted reasoning replay 为空。
149
+ - Web lifecycle、四项 X custom-tool 名称、Web+X 交错与 Web+function 混合都必须闭合;未启用类别、未知 name/event/annotation、重复 output index、乱序、截断或未闭合状态失败关闭。结构化 citation 有界校验后丢弃,任一 Search 出现后 encrypted reasoning replay 为空。`0.1.11` 另外锁定:reasoning ID 只有在旧段已闭合、一个 server Search 已完成且位于新旧 output index 之间、新段严格为空时才允许复用一次;raw `reasoning_text` 与 summary lifecycle 互斥;replay 元数据不保存 raw 明文,后续请求只发送 encrypted content 与空 summary,而当前流 raw delta 保持 Harness 可见。
150
150
 
151
151
  ### Web RPC 与 TUI
152
152
 
@@ -249,4 +249,4 @@ Web 与 TUI 分别验证:
249
249
  - Windows x64 自动化平台测试通过,且 README、release notes 和 marketplace 元数据在首次真机验证前明确披露“代码支持、真机未验证”。
250
250
  - npm 回读的 SHA-512 与本地发布 tarball 一致。
251
251
 
252
- `0.1.0` 发布后原计划完成一次 Windows x64 Registry 精确版本真机验收;仓库所有者随后明确决定该验收不再阻断稳定发布,且普通后续版本不重复要求真机验证。`0.1.1` 及后续版本以 CI、契约测试、隔离安装和制品校验为常规门禁。已发布 `0.1.6` 改变了认证预检 deadline 所有权并通过 Windows slow-fake 与 Windows CI;发布后图片已确认可用,但 Windows 官方 CLI 直接命令在固定 OIDC discovery 请求上超时,未生成登录 URL。已发布 `0.1.7` 准确区分 CLI 缺失、discovery 超时与 discovery 可访问状态,并确保前两类及时、脱敏结算;在第三类真实通过前不得把代码、CI 或错误可解释性表述为 Windows 浏览器弹出已修复或已验证。发布后撤回的 `0.1.8`、已发布 `0.1.9` Search 协议与当前 `0.1.10` settings 集成修复均不改变这一边界;`0.1.9` 的精确 Registry Host/client import/export smoke 也不构成 Windows 真机、OAuth、真实账号或真实 xAI 验收。
252
+ `0.1.0` 发布后原计划完成一次 Windows x64 Registry 精确版本真机验收;仓库所有者随后明确决定该验收不再阻断稳定发布,且普通后续版本不重复要求真机验证。`0.1.1` 及后续版本以 CI、契约测试、隔离安装和制品校验为常规门禁。已发布 `0.1.6` 改变了认证预检 deadline 所有权并通过 Windows slow-fake 与 Windows CI;发布后图片已确认可用,但 Windows 官方 CLI 直接命令在固定 OIDC discovery 请求上超时,未生成登录 URL。已发布 `0.1.7` 准确区分 CLI 缺失、discovery 超时与 discovery 可访问状态,并确保前两类及时、脱敏结算;在第三类真实通过前不得把代码、CI 或错误可解释性表述为 Windows 浏览器弹出已修复或已验证。发布后撤回的 `0.1.8`、已发布 `0.1.9`–`0.1.10` Search 与当前 `0.1.11` reasoning 兼容修复均不改变这一边界;Registry/制品回读也不构成 Windows 真机、OAuth 或完整真实账号验收。
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 0. 当前状态
4
4
 
5
- 当前可用 npm 稳定基线为 `dsh-grok-provider@0.1.9`;其 release commit 为 `a0af7b74882546dc3d9477b8f6c1494935e6bfb4`,不可变 tag 为 `v0.1.9`,CI run `33295408650` 全绿。唯一 tarball 含 69 个文件、190,049 bytes,unpacked size 为 603,475 bytes,SHA-256 为 `78c73c95ea71d66cad6e6146fed41c281f1c8b29f60353e3f20247ec23833210`,npm SRI 为 `sha512-GeXQg3qedCGZz9D5MMaHd8Afe5Bn0nxjG+PQmKOB2AxB3m6IiGA07PMD77dEAOJVbAzKk0SnxAOKTZMTQFtuYg==`;Trusted Publisher run `33295761336` 已完成,Registry、GitHub Release 与本地制品逐字节一致,npm `latest=0.1.9`。精确 Registry 安装的 Host/client import/export smoke 通过;精确安装审计图汇总 71 个已验证签名与 3 个 attestations,本包 attestations endpoint 返回 2 项,SLSA provenance 精确绑定 `v0.1.9` tag、release workflow、release commit 与 release run。sidebar quota 维护版 `0.1.8` 曾发布后撤回;npm Registry 已永久消耗该版本号,禁止把 Search 制品重新标记或发布为 `0.1.8`。`0.1.9` 的 Search 开关因 Host settings namespace 遗漏而不可用;`0.1.10` 修复已由代码 PR #23 合入 `yukiryou/main` merge commit `6c3c5bfff8de4e8bc46074434aad7682b3509db3`,main CI run `33298895342` 的 macOS 14 / Windows 2022 全绿。当前 `yukiryou/v0.1.10-release-evidence` 只记录发布证据;该版不覆盖或重发 `0.1.9`,也不改变 Search wire、支持模型或认证边界。
5
+ 当前可用 npm 稳定基线为 `dsh-grok-provider@0.1.10`;其 release commit 为 `fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028`,不可变 tag 为 `v0.1.10`,main CI run `33299116564` 全绿。唯一 tarball 含 70 个文件、197,620 bytes,unpacked size 为 628,836 bytes,SHA-256 为 `f9fe1dea743e86e2799a1073a93a8af91ad5bd389e14f4d2f0528428ada93c62`,npm SRI 为 `sha512-OnfG4diVqJdzYSwJKERNnaplYFbOvFICZP58E0f2Cdh+t7orlTL1DWokvzEHdJrw6HA+UMoKDZgJ6AMEVv4aUg==`;Trusted Publisher run `33299599113` 已完成,Registry、GitHub Release 与本地制品逐字节一致,npm `latest=0.1.10`,Registry signature 与 SLSA provenance 已回读。sidebar quota 维护版 `0.1.8` 曾发布后撤回且不能复用。真实使用随后发现精确 `grok-4.6` 在 High Effort + Web Search 续跑时,可能在一次已完成 Search 后复用已关闭 reasoning ID 作为空占位;`0.1.11` 只在已完成 server Search 位于两段 reasoning 之间时放行该严格空项,并加入官方 raw reasoning 支持,不改变认证、设置、Search descriptor、模型 route、图片或平台边界。代码 PR #25 已合入 `yukiryou/main@307ae3ac83526f388c6b4a0d1e1346353bd5f4aa`,main CI run `33302830043` 双平台全绿;当前 `yukiryou/v0.1.11-release-evidence` 正在冻结最终发布事实。
6
6
 
7
7
  首个 `dsh-grok-provider@0.1.0` 于 2026-08-26 从 GitHub Release 中唯一的候选 tarball 发布到 npm;Registry 回读的 SHA-512、重新下载文件的 SHA-256 和 GitHub Release 产物完全一致,并生成 npm provenance attestation。后续稳定版沿用由该流程建立的不可变制品与回读原则。
8
8
 
@@ -131,7 +131,7 @@ patch 路径必须为不含 `..`、绝对路径、反斜线或 NUL 的相对 `.y
131
131
 
132
132
  ## 7. Git 与版本
133
133
 
134
- - `0.1.0` 历史开发分支为 `yukiryou/v0.1.0`;`0.1.9` 代码分支 `yukiryou/v0.1.9-search` 与发布证据分支 `yukiryou/v0.1.9-release-evidence` 已分别经 PR #20、#21 合入受保护 `yukiryou/main`,最终 release commit 为 `a0af7b74882546dc3d9477b8f6c1494935e6bfb4`。`0.1.8` 已由撤回的 sidebar quota 发布消耗,不得复用;当前候选分支为 `yukiryou/v0.1.10-search-settings-fix`(目标版本 `0.1.10`),已发布 `0.1.9` 不可覆盖或重发。
134
+ - `0.1.0` 历史开发分支为 `yukiryou/v0.1.0`;`0.1.10` 代码分支 `yukiryou/v0.1.10-search-settings-fix` 与发布证据分支 `yukiryou/v0.1.10-release-evidence` 已分别经 PR #23、#24 合入受保护 `yukiryou/main`,最终 release commit 为 `fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028`。`0.1.8` 已由撤回的 sidebar quota 发布消耗,不得复用。`0.1.11` 代码分支 `yukiryou/v0.1.11-reasoning-stream` 已经 PR #25 合入,当前发布证据分支为 `yukiryou/v0.1.11-release-evidence`;已发布 `0.1.10` 不可覆盖或重发。
135
135
  - `package.json`、CHANGELOG、release notes、Git tag 和 tarball 必须使用同一个精确候选版本。
136
136
  - 发布提交必须干净且可复现。
137
137
  - tag 使用 `v<major>.<minor>.<patch>`,只在发布提交确定后创建。
@@ -194,9 +194,9 @@ scoped 包首次公开发布必须保留 `--access public`。
194
194
  npm 发布不会自动成为受管可安装项。当前发现状态:
195
195
 
196
196
  - GitHub 仓库已添加 DeepSeek Harness 官方推荐的 `dsh-plugin` 与 `dsh` Topics,可被 Topic 驱动来源发现。
197
- - YukiRyou curated catalog 当前仍是精确 `dsh-grok-provider@0.1.0`、verification `installed`、仅 `darwin-arm64`。`0.1.9` 已发布及其完整性/provenance 回读不等于从 catalog 安装该精确版本,因此不得据此升级条目或增加平台。
197
+ - YukiRyou curated catalog 当前仍是精确 `dsh-grok-provider@0.1.0`、verification `installed`、仅 `darwin-arm64`。`0.1.10` 已发布及其完整性/provenance 回读不等于从 catalog 安装该精确版本,因此不得据此升级条目或增加平台。
198
198
  - 公共 `awesome-dsh-plugin` 的收录 PR #3415 已合并,项目已进入 `model` 分类。该列表不记录精确 npm 版本或平台验证字段,因此收录只代表发现入口,不证明任一后续制品的受管安装或平台验收。
199
- - Windows x64 仍未完成一条闭合的 Registry 精确版本 production inspector、安装、重启、浏览器登录、聊天、工具调用和重新认证链路。`0.1.6` 发布后已确认图片可用,并确认官方 CLI 可在生成登录 URL 前因 OIDC discovery timeout 退出;`0.1.7` 只增加闭合诊断,不是浏览器弹出已修复或已验证的证据。`0.1.9` 精确 Registry 安装的 Host/client import/export smoke 已通过,但未覆盖上述真实链路、OAuth、真实账号或真实 xAI 请求。
199
+ - Windows x64 仍未完成一条闭合的 Registry 精确版本 production inspector、安装、重启、浏览器登录、聊天、工具调用和重新认证链路。`0.1.6` 发布后已确认图片可用,并确认官方 CLI 可在生成登录 URL 前因 OIDC discovery timeout 退出;`0.1.7` 只增加闭合诊断,不是浏览器弹出已修复或已验证的证据。`0.1.10` 的 Registry/制品回读也未覆盖上述真实链路、OAuth、完整真实账号会话或 Windows 浏览器弹出。
200
200
 
201
201
  catalog 条目只能记录实际验证完成的精确版本和平台。当前条目记录:
202
202
 
@@ -205,7 +205,7 @@ catalog 条目只能记录实际验证完成的精确版本和平台。当前条
205
205
  - verification `installed`。
206
206
  - 仅 `darwin-arm64`。
207
207
 
208
- 从 `0.1.1` 起,常规发版不再要求重复 macOS/Windows 真机 smoke。每次仍须通过两平台 CI、协议与安全测试、干净 profile 安装、确定性 tarball 和 Registry integrity/provenance 回读。涉及认证、官方 CLI、Harness subprocess seam、内容输入或平台安全策略的变更应安排定向真机复核;`0.1.4` 因新增图片输入,已完成精确 `grok-4.6` 的 Proxy 红蓝语义门禁和收窄后的 Harness modality 复验,但不能替代最终制品安装与双平台 CI。`0.1.9` 因新增 Search,必须保留四组固定 Proxy 脱敏协议证据,并完成默认关闭、独立开关、混合 function、citation/replay、双平台 CI 与隔离 Harness 验收。Windows discovery 可访问时由官方 CLI 弹出浏览器仍是独立未验证边界。
208
+ 从 `0.1.1` 起,常规发版不再要求重复 macOS/Windows 真机 smoke。每次仍须通过两平台 CI、协议与安全测试、干净 profile 安装、确定性 tarball 和 Registry integrity/provenance 回读。涉及认证、官方 CLI、Harness subprocess seam、内容输入或平台安全策略的变更应安排定向真机复核;`0.1.4` 因新增图片输入,已完成精确 `grok-4.6` 的 Proxy 红蓝语义门禁和收窄后的 Harness modality 复验。`0.1.9` 因新增 Search,保留四组固定 Proxy 脱敏协议证据、默认关闭、独立开关、混合 function、citation/replay、双平台 CI 与隔离 Harness 验收;`0.1.11` 的 reasoning 响应兼容还必须覆盖空项、一次性 ID 复用、raw/summary 互斥、encrypted replay 与截断失败关闭,并明确脱敏真实 probe 未观察 raw reasoning。Windows discovery 可访问时由官方 CLI 弹出浏览器仍是独立未验证边界。
209
209
 
210
210
  macOS x64 不在当前官方 Grok CLI 支持矩阵,不进入 `0.1.0` catalog 或发布承诺。npm SHA-512 作为 release evidence 保存;它不是当前 curated schema 字段,市场会从 Registry `dist.integrity` 自行验证 SHA-512。
211
211
 
@@ -1,13 +1,13 @@
1
1
  # 当前实现与发布状态
2
2
 
3
- `0.1.9` 已发布 Search 协议与设置页面,但遗漏 `llm-grok` Host settings 注册并过早冻结组合配置,导致真实页面开关始终不可用。当前 `0.1.10` 源码候选修复设置注册与按调用快照,不改变 Search wire。
3
+ `0.1.10` 已发布并修复 `llm-grok` Host settings 注册与按调用快照。真实 High Effort + Web Search 续跑随后暴露 reasoning item ID 空占位复用兼容缺口;当前 `0.1.11` 源码候选只修复该 Responses 生命周期并加入官方 raw reasoning 事件支持。
4
4
 
5
5
  状态日期:2026-08-30
6
- 当前 npm 发布线:`dsh-grok-provider@0.1.9`
7
- 当前源码候选:`dsh-grok-provider@0.1.10`
8
- 版本分支:`yukiryou/v0.1.10-search-settings-fix`
9
- 发布基线:`yukiryou/main@a0af7b74882546dc3d9477b8f6c1494935e6bfb4`
10
- 内容类型路线:已冻结于 [能力路线图](./11-capability-roadmap.md);`0.1.9` 单独加入 Web/X Search,`0.1.10` 是可用设置链路修复,不新增内容类型。
6
+ 当前 npm 发布线:`dsh-grok-provider@0.1.10`
7
+ 当前源码候选:`dsh-grok-provider@0.1.11`
8
+ 版本分支:`yukiryou/v0.1.11-release-evidence`
9
+ 发布基线:`yukiryou/main@307ae3ac83526f388c6b4a0d1e1346353bd5f4aa`
10
+ 内容类型路线:已冻结于 [能力路线图](./11-capability-roadmap.md);`0.1.11` 是 Search 续跑的 reasoning 协议兼容修复,不新增内容类型、模型或工具。
11
11
 
12
12
  ## 已实现
13
13
 
@@ -21,7 +21,8 @@
21
21
  - `0.1.4` 图片输入:异步 request compiler 惰性读取 Harness attachment,只为精确 `grok-4.6` 生成有序 jpeg/png data URL,并固定 `detail:"high"`;普通 user 与一层 tool-result 图片受格式、尺寸、像素、张数、总字节、content block 和最终 JSON 上限约束,`grok-4.5` 与未知模型继续 text-only。
22
22
  - `0.1.6` 历史兼容:普通 user/system 历史中的私有 reasoning 被省略并保留相邻可见 text/image;只有有效的同 Provider assistant 历史可以进入加密 reasoning replay,一层 tool-result 仍只接受公开 text/image。
23
23
  - `0.1.7` 维护:独立只读 diagnostics RPC 投影插件版本与官方 CLI 的 `ready|missing|invalid|unavailable` 闭合集合;登录失败只投影白名单 reason 并及时结束 spinner。设置导航在 Harness 当前无原生 icon slot 时,以精确标签匹配、冲突失败关闭和可回收 lifecycle 应用 MIT 许可的 `IconThinkOutline16` 几何。
24
- - 已发布 `0.1.9` Search 协议与页面:Web/X 默认关闭且可独立编译;request/receipt 同编译,精确 route、共享工具/字节预算、后台 purpose 关闭、Web 标准 lifecycle、四项 X custom-tool、function membership、citation 有界丢弃与 replay 抑制均失败关闭。真实 Host settings 集成由当前 `0.1.10` 候选补齐。
24
+ - 已发布 `0.1.10` Search 能力与可写设置链路:Web/X 默认关闭且可独立编译;request/receipt 同编译、调用级设置快照、精确 route、共享工具/字节预算、后台 purpose 关闭、Web 标准 lifecycle、四项 X custom-tool、function membership、citation 有界丢弃与 replay 抑制均失败关闭。
25
+ - `0.1.11` 候选 reasoning 兼容:允许已闭合 reasoning ID 以严格空项再出现一次,接受闭合空 reasoning,支持官方 raw `reasoning_text` 标准生命周期;raw 与 summary 互斥,raw replay 只携带 encrypted content 与空 summary。
25
26
 
26
27
  ## 已验证
27
28
 
@@ -154,12 +155,22 @@ Windows x64 真机不再是 `0.1.0` 预发布阻断项。首次发布后必须
154
155
  - 不可变 `v0.1.9`、GitHub Release 与 Trusted Publisher run `33295761336` 已完成;Registry、Release 与本地制品逐字节一致,npm `latest=0.1.9`。精确 Registry 安装的 Host/client import/export smoke 通过;精确安装审计图汇总 71 个已验证签名与 3 个 attestations,本包 attestations endpoint 返回 2 项,SLSA provenance 精确绑定 tag、workflow、commit 与 release run。
155
156
  - 上述候选与隔离协议测试向客户端注入了合成的 ready settings scope,只证明 startup Config → request,并未证明真实 Host namespace 存在。发布后真实页面确认功能集成缺口;它不代表制品损坏,也不会通过覆盖或重发 `0.1.9` 修复。
156
157
 
157
- ## `0.1.10` 候选状态
158
+ ## `0.1.10` 发布状态
158
159
 
159
160
  - 通过 `@deepseek-ai/dsh-settings@0.1.1-rc.2` 的 canonical `installSettingsSection` 注册 `llm-grok`,解析 schema 默认值、组合配置和持久化用户层;settings service 缺失或重载时回退组合配置。
160
161
  - Adapter 在每次调用开始且首次模型目录 await 前捕获一次 Search policy;后续设置提交影响下一调用,已准备或在途调用保持原策略。request compiler 与 receipt 继续只处理冻结调用,不承担动态状态。
161
162
  - 真实 SettingsProvider + LLM Runtime 回归覆盖唯一 namespace、安全默认值、`applies:"live"`、持久化更新、组合回退和插件生命周期清理;延迟目录回归证明快照早于首个 await。
162
163
  - 聚焦 Host/Adapter/client 38 项回归通过;精确 Node `24.19.0` 全量为 224 项、222 pass、0 fail、2 项 Windows-only skip,生产依赖审计为 0 漏洞。
163
- - 收尾后的预验收 dry-run pack 为 70 个文件;隔离安装使用的是代码等价、文档收尾前的候选包。所有预验收包都不会进入 Release,也不作为最终发布制品;最终字节数与摘要只从合并后的 release commit 冻结并记录。
164
+ - 最终 release commit `fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028` 的唯一 70 文件、197,620-byte tarball,unpacked size 为 628,836 bytes,SHA-256 为 `f9fe1dea743e86e2799a1073a93a8af91ad5bd389e14f4d2f0528428ada93c62`,SRI 为 `sha512-OnfG4diVqJdzYSwJKERNnaplYFbOvFICZP58E0f2Cdh+t7orlTL1DWokvzEHdJrw6HA+UMoKDZgJ6AMEVv4aUg==`。
164
165
  - 隔离 Web Harness 的真实 `settings.describe` 已返回可写、`applies:"live"` 的唯一 `llm-grok` namespace。页面两个开关均 enabled,“暂时不可用”提示消失;浏览器写入把 revision 从 1 推进到 4,最终已恢复 `{webSearch:false,xSearch:false}`。
165
- - 最终候选 head `1e5e875c6e55616f8d589ed56d4aa5fab643387a` 的 push CI run [33298844135](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33298844135) 与 PR CI run [33298846201](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33298846201) 均完成 macOS 14 / Windows 2022 全绿。代码 PR #23 已合入受保护 `yukiryou/main` merge commit `6c3c5bfff8de4e8bc46074434aad7682b3509db3`,main CI run [33298895342](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33298895342) 全绿。发布证据 PR 与最终 release commit 的唯一制品冻结仍需关闭;未向真实 xAI 发起额外请求。
166
+ - 最终候选 head `1e5e875c6e55616f8d589ed56d4aa5fab643387a` 的 push/PR CI、代码 PR #23、发布证据 PR #24 与 final main CI run [33299116564](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33299116564) 均完成 macOS 14 / Windows 2022 全绿。不可变 `v0.1.10`、唯一 GitHub Release asset 与 Trusted Publisher run [33299599113](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33299599113) 已完成;Registry、Release 与本地制品逐字节一致,npm `latest=0.1.10`,Registry signature 与 SLSA provenance 已回读。
167
+
168
+ ## `0.1.11` 候选状态
169
+
170
+ - 真实失败边界为精确 `grok-4.6`、High Effort、Web Search 续跑:上游可在一个已闭合 reasoning lifecycle 后,以新 output index 把同一 reasoning ID 再使用一次作为严格空占位;旧 codec 的全局 ID 唯一约束把整段响应映射为 `INVALID_RESPONSE`。
171
+ - 新状态机只在一个已完成 server Search 位于两段 reasoning 之间时,允许已闭合 reasoning ID 一次性复用为空项;无 Search 间隔、未闭合、跨类型、非空或第二次复用继续失败关闭。普通空 reasoning 同样必须完成 added/done 闭环。
172
+ - 新增官方 Responses raw reasoning lifecycle:`reasoning_text` content part、`response.reasoning_text.delta` / `done` 与最终 item content 必须一致;raw 与 summary 模式严格互斥,乱序、混用、重复与截断均拒绝。
173
+ - raw reasoning replay 元数据只记录 encrypted content 与 `reasoning_text` 类型标记,不保存 raw 明文;下一请求只发送 `encrypted_content` 与 `summary: []`,不会回传或把 raw 明文伪装为 summary。当前流中的 raw delta 仍作为 Harness 可见 reasoning 输出。
174
+ - 113/113 聚焦协议回归已覆盖成功与失败形状。脱敏真实 probe 只发出 1 次 POST,得到 68 个事件、34 个 summary delta、0 个 raw delta、decoder accepted 与 1 个 finish;因此它验证当前 summary/Search 续跑路径,但不能作为 raw reasoning 真机证据。
175
+ - Node `24.19.0` 本地全量测试已通过:238 项、236 pass、0 fail、2 项 Windows-only skip;生产依赖审计为 0 漏洞,dry-run pack 为 71 个文件,生成 bundle、diff 与秘密模式门禁均通过。当前尚未发布;双平台 CI、唯一最终 tarball、精确制品授权及 Registry/signature/provenance 回读仍等待后续门禁。
176
+ - 代码 PR #25 已合入受保护 `yukiryou/main`,merge commit 为 `307ae3ac83526f388c6b4a0d1e1346353bd5f4aa`;main CI run `33302830043` 的 macOS 14 / Windows 2022 均通过。发布证据 PR、最终 release commit CI 与唯一制品仍待关闭。
@@ -185,6 +185,20 @@ English summary: every release must close documentation, security, tests, determ
185
185
  - [x] 从预验收候选 tarball 完成隔离 profile 安装:实际 `settings.describe` 包含可写、`applies:"live"` 的唯一 `llm-grok`;浏览器页面两个开关 enabled 且 unavailable 提示消失。浏览器写入由服务端 revision 递增确认并恢复默认关闭;延迟目录与 Host/Adapter fixture 回归分别证明旧调用保持快照、后续请求工具随设置变化。该验收未访问真实 xAI。
186
186
  - [x] 最终候选 head `1e5e875c6e55616f8d589ed56d4aa5fab643387a` 的 push CI run [33298844135](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33298844135) 与 PR [#23](https://github.com/yoshino-xiao7/dsh-grok-provider/pull/23) CI run [33298846201](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33298846201) 均完成 macOS 14 / Windows 2022 全绿。
187
187
  - [x] 代码 PR #23 已合入受保护 `yukiryou/main`,merge commit 为 `6c3c5bfff8de4e8bc46074434aad7682b3509db3`;main CI run [33298895342](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33298895342) 的 macOS 14 / Windows 2022 全绿。
188
- - [ ] 版本分支合并后,从最终 release commit 唯一生成 `dsh-grok-provider-0.1.10.tgz`,记录文件数、大小、SHA-256 与 SRI;预验收 tarball 不得进入 Release。
189
- - [ ] 完整提交和唯一制品证据形成后,另行取得精确 `dsh-grok-provider@0.1.10` 发布授权。
190
- - [ ] 不可变 tag、唯一 GitHub Release asset、Trusted Publisher、npm `latest`、Registry 字节、签名与 provenance 回读全部关闭。
188
+ - [x] 发布证据 PR #24 合并后的最终 release commit 为 `fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028`;final main CI run `33299116564` 全绿。从该 commit 唯一生成的 `dsh-grok-provider-0.1.10.tgz` 含 70 个文件、197,620 bytes,unpacked size 为 628,836 bytes,SHA-256 为 `f9fe1dea743e86e2799a1073a93a8af91ad5bd389e14f4d2f0528428ada93c62`,SRI 为 `sha512-OnfG4diVqJdzYSwJKERNnaplYFbOvFICZP58E0f2Cdh+t7orlTL1DWokvzEHdJrw6HA+UMoKDZgJ6AMEVv4aUg==`。
189
+ - [x] 仓库所有者在完整提交和唯一制品证据形成后明确授权发布精确 `dsh-grok-provider@0.1.10`。
190
+ - [x] 不可变 `v0.1.10`、唯一 GitHub Release asset 与 Trusted Publisher run `33299599113` 已完成;npm `latest=0.1.10`,Registry、Release 与本地 tarball 逐字节一致,Registry signature 与 SLSA provenance 已回读。
191
+
192
+ ## `0.1.11` reasoning stream 兼容修复门禁
193
+
194
+ - [x] 从已发布 `origin/yukiryou/main@fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028` 创建隔离分支 `yukiryou/v0.1.11-reasoning-stream`;范围限制为 Responses reasoning 生命周期兼容,不改变认证、设置、模型 route、Search descriptor、citation、图片或平台边界。
195
+ - [x] 113/113 聚焦协议回归覆盖一次已完成 server Search 后的 reasoning ID 空占位复用、普通空 reasoning 项、官方 raw `reasoning_text` 标准生命周期和 raw encrypted replay;无 Search 间隔、未闭合、跨类型、非空、第二次复用、raw/summary 混用、乱序、重复和截断继续失败关闭。
196
+ - [x] replay 元数据不保存 raw 明文;后续请求只回传 `encrypted_content` 与 `summary: []`,不会回传或把 raw 明文伪装为 summary,当前流中的 raw delta 仍作为 Harness 可见 reasoning 输出。
197
+ - [x] 脱敏真实 `grok-4.6` Web Search probe 经生产 decoder 完成 1 次 POST:68 个事件、34 个 summary delta、0 个 raw delta、decoder accepted、1 个 finish。该结果只验证 summary/Search 续跑路径,不能描述为 raw reasoning 真机证据。
198
+ - [x] `package.json`、lockfile、CHANGELOG、中英文 README、`SECURITY.md`、产品/威胁/测试/发布/状态文档、ADR/证据与折叠英文的双语 `docs/releases/v0.1.11.md` 同步为尚未发布的候选事实。
199
+ - [x] 精确 Node `24.19.0` 全量测试通过:238 项、236 pass、0 fail、2 项 Windows-only skip;`npm audit --omit=dev` 为 0 漏洞,dry-run pack 为 71 个文件;生成 bundle 一致、`git diff --check` 通过,秘密模式扫描只命中既有测试 canary `Bearer fixture-access-token` 及记录该 canary 的历史检查表文本。最终制品字节与摘要等待 release commit 冻结。
200
+ - [x] 代码 PR #25 已合入受保护 `yukiryou/main`,merge commit 为 `307ae3ac83526f388c6b4a0d1e1346353bd5f4aa`;main CI run `33302830043` 的 macOS 14 / Windows 2022 均通过。
201
+ - [ ] 发布证据 PR 合入后形成最终 release commit,并由该提交的 macOS 14 / Windows 2022 final CI 关闭最后代码门禁。
202
+ - [ ] 从最终 release commit 只执行一次 `npm pack`,冻结唯一 `dsh-grok-provider-0.1.11.tgz`,完成清单、摘要、隔离安装与 Host/client export 验收。
203
+ - [ ] 完整提交与唯一制品证据形成后,另行取得精确 `dsh-grok-provider@0.1.11` 制品授权;当前开发指令不得冒充该固定制品授权。
204
+ - [ ] 不可变 tag、唯一 GitHub Release asset、Trusted Publisher、npm `latest`、Registry 字节、signature、attestation 与 provenance 回读全部关闭。
@@ -1,10 +1,10 @@
1
1
  # 能力路线图
2
2
 
3
- - 状态:**`0.1.9` Search 已发布但设置入口不可用;`0.1.10` 正在修复真实 Host settings 链路(2026-08-30)**
4
- - 当前 npm 稳定版:`0.1.9`
5
- - 最近发布:`0.1.9`
3
+ - 状态:**`0.1.10` Search 设置链路已发布;`0.1.11` 正在修复 High Effort + Web Search reasoning 生命周期兼容(2026-08-30)**
4
+ - 当前 npm 稳定版:`0.1.10`
5
+ - 最近发布:`0.1.10`
6
6
  - 最近撤回:`0.1.8`(npm 版本号不可复用)
7
- - 当前开发分支:`yukiryou/v0.1.10-search-settings-fix`
7
+ - 当前开发分支:`yukiryou/v0.1.11-release-evidence`
8
8
 
9
9
  本文是 `0.1.3` 之后内容类型迭代的单一事实来源。`0.1.0`–`0.1.3` 的历史范围仍以 [ADR-0002](./adr/0002-v0.1-scope.md) 和[产品需求](./01-product-requirements.md)为准。
10
10
 
@@ -30,7 +30,8 @@
30
30
  | `0.1.7` | Windows 运行时诊断、登录失败可解释性与 `IconThinkOutline16` 设置导航图标维护 | 闭合 DTO/reason、lifecycle、UI/图标回归与 Windows 三态真机证据 | [ADR-0009](./adr/0009-runtime-diagnostics-and-login-failures.md) |
31
31
  | `0.1.8`(已撤回) | sidebar quota 维护;不含 Search | 发布后撤回;npm 号码已消耗且不得复用 | 见 `0.1.8` 撤回说明 |
32
32
  | `0.1.9`(已发布) | 默认关闭的 Web Search / X Search 协议与页面;Host namespace 遗漏导致开关不可用 | 固定 Proxy、双平台 CI、隔离 Harness、唯一制品与 Registry 回读均已关闭;发布后确认功能集成缺口 | [ADR-0010](./adr/0010-default-off-web-x-search.md) 与固定 Proxy 证据 |
33
- | `0.1.10` 候选 | 修复 `llm-grok` 注册与按调用读取 Search 设置 | 真实 SettingsProvider/LLM 回归、隔离安装、双平台 CI、唯一制品 | [ADR-0010](./adr/0010-default-off-web-x-search.md) 的发布后修正 |
33
+ | `0.1.10`(已发布) | 修复 `llm-grok` 注册与按调用读取 Search 设置 | 真实 SettingsProvider/LLM 回归、隔离安装、双平台 CI、唯一制品与 Registry 回读均已关闭 | [ADR-0010](./adr/0010-default-off-web-x-search.md) 的发布后修正 |
34
+ | `0.1.11` 候选 | 修复 High Effort + Web Search reasoning ID 空占位复用,并支持官方 raw reasoning lifecycle | 闭合状态机回归、脱敏 summary/Search probe、双平台 CI、唯一制品 | [ADR-0010](./adr/0010-default-off-web-x-search.md) 的响应兼容修正 |
34
35
  | 再后续版本 | 默认关闭的图片生成 | Proxy 返回可有界提交到 Harness attachment 的内联结果 | ADR-0011 |
35
36
 
36
37
  版本号可因缺陷修复顺延。`prompt_cache_key` 与图片输入相互独立,不属于 `0.1.4`:它需要独立的会话标识隐私、路由稳定性和“不得自动重放已经发送的 POST”分析,不得作为图片请求失败后的重试/降级机制。
@@ -150,7 +151,15 @@ const request = await requestCompiler.compile(options, preparedRoute)
150
151
  - 使用 Harness canonical settings module 注册 `llm-grok`,默认值、组合配置和用户层按标准顺序解析;无 settings service 时仍使用组合配置。
151
152
  - Adapter 在调用开始且首次目录 await 前冻结策略;设置更新只影响后续调用,不改变已准备或在途请求。
152
153
  - 不改变 Search descriptor、响应 lifecycle、模型 allowlist、citation 或 replay 规则;本版不新增能力。
153
- - 真实 SettingsProvider/LLM 回归、真实页面可写 smoke、候选隔离安装、代码 PR 与 main 双平台 CI 已经完成;发布前仍需关闭发布证据 PR 与最终唯一制品门禁。
154
+ - 真实 SettingsProvider/LLM 回归、真实页面可写 smoke、隔离安装、双平台 CI、唯一制品、Registry signature 与 provenance 门禁均已完成;npm `latest=0.1.10`。
155
+
156
+ ### `0.1.11` 修复切片
157
+
158
+ - 只在一个已完成 server Search 位于两段 reasoning 之间时,允许已闭合 reasoning ID 以严格空 reasoning item 再出现一次;无 Search 间隔、未闭合、跨类型、非空或第二次复用保持失败关闭。
159
+ - 接受完整闭合的空 reasoning item;事件序号、output index、状态、内容与 encrypted replay 仍受闭合校验。
160
+ - 支持官方 raw `reasoning_text` content/delta/done 生命周期,并与 summary reasoning 严格互斥;replay 元数据不保存 raw 明文,后续请求只回传 `encrypted_content` 与 `summary: []`,当前流中的 raw delta 仍作为 Harness 可见 reasoning 输出。
161
+ - 脱敏真实 `grok-4.6` Web Search probe 经生产 decoder 完成 1 次 POST、68 个事件、34 个 summary delta、0 个 raw delta与 1 个 finish。它只证明 summary/Search 路径,raw reasoning 仍只有 fixture 证据。
162
+ - 不改变 Search descriptor、开关、模型 allowlist、citation、认证、图片或平台边界。代码 PR #25、merge commit `307ae3ac83526f388c6b4a0d1e1346353bd5f4aa` 与 main CI run `33302830043` 已通过;发布证据提交的 final CI、唯一制品与精确授权待完成。
154
163
 
155
164
  ## 8. 后续:默认关闭的图片生成
156
165
 
@@ -166,4 +175,4 @@ const request = await requestCompiler.compile(options, preparedRoute)
166
175
  - ACP、`grok -p` Headless、Linux / macOS x64 发布承诺。
167
176
  - 厂商 `code_execution`;Harness 已有本地工具权限层。
168
177
 
169
- English summary: `0.1.9` is the current stable npm release from commit `a0af7b74882546dc3d9477b8f6c1494935e6bfb4`; version `0.1.8` was briefly published for sidebar-quota maintenance and then withdrawn, and its npm version number remains unusable. The unique 69-file, 190,049-byte artifact has an unpacked size of 603,475 bytes, SHA-256 `78c73c95ea71d66cad6e6146fed41c281f1c8b29f60353e3f20247ec23833210`, and SRI `sha512-GeXQg3qedCGZz9D5MMaHd8Afe5Bn0nxjG+PQmKOB2AxB3m6IiGA07PMD77dEAOJVbAzKk0SnxAOKTZMTQFtuYg==`. Final CI run `33295408650` and Trusted Publisher run `33295761336` passed; npm `latest=0.1.9`, and the Registry, GitHub Release, and local artifacts are byte-identical. The exact Registry Host/client import/export smoke passed. Its exact-install audit graph reported 71 verified signatures and 3 attestations, while this package's attestations endpoint returned 2; SLSA provenance binds the tag, workflow, commit, and release run. The published Host omitted the `llm-grok` settings namespace, so the real controls remain unavailable. The `0.1.10` candidate is a focused integration repair: canonical namespace registration plus one policy snapshot per new call before model discovery. Its real SettingsProvider/LLM tests, writable-page smoke, candidate isolated install, code PR, and main macOS 14 / Windows 2022 CI passed; the release-evidence PR and final exact artifact remain pending. It does not change authentication, Search wire rules, image input, or platform support. Real xAI Search and network-reachable browser launch on a physical Windows device remain separate acceptance boundaries.
178
+ English summary: `0.1.10` is the current stable npm release from commit `fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028`; version `0.1.8` was briefly published for sidebar-quota maintenance and then withdrawn, and its npm version number remains unusable. The unique 70-file, 197,620-byte artifact has an unpacked size of 628,836 bytes, SHA-256 `f9fe1dea743e86e2799a1073a93a8af91ad5bd389e14f4d2f0528428ada93c62`, and SRI `sha512-OnfG4diVqJdzYSwJKERNnaplYFbOvFICZP58E0f2Cdh+t7orlTL1DWokvzEHdJrw6HA+UMoKDZgJ6AMEVv4aUg==`. Final main CI run `33299116564` and Trusted Publisher run `33299599113` passed; npm `latest=0.1.10`, Registry and Release bytes match, and the Registry signature plus SLSA provenance were read back. The `0.1.11` candidate is a focused reasoning-lifecycle repair for exact `grok-4.6` High Effort + Web Search continuation: one strictly empty reuse of a closed reasoning ID only across a completed server Search, closed empty items, and a mutually exclusive official raw `reasoning_text` lifecycle. Replay metadata does not retain raw plaintext; later requests send only encrypted content with an empty summary, while live raw deltas remain visible to Harness. A redacted real probe emitted 34 summary deltas and zero raw deltas, so raw reasoning remains fixture-verified rather than live-probe verified. Code PR #25 merged as `307ae3ac83526f388c6b4a0d1e1346353bd5f4aa`, and main CI run `33302830043` passed on macOS 14 and Windows 2022. The release-evidence commit's final CI, the unique artifact, exact authorization, and release readback remain pending. Authentication, Search descriptors, image input, and platform support are unchanged; network-reachable browser launch on a physical Windows device remains a separate acceptance boundary.
@@ -95,4 +95,4 @@ Node 24 协议测试使用内存 attachment store 和合成 jpeg/png 字节,
95
95
 
96
96
  `0.1.6` 已从 release commit `93519f77adc4ce2edfc1bbd27bce9e44d4805da6` 正式发布:唯一 tarball 为 60 个文件、145,620 bytes,SHA-256 `fd660d91216086496a4d189cb7e60b3445079913c97da41fccf805e3086c0347`,npm SRI `sha512-Vsmzm+8tgmHCuS8WKfzicjgauupY9FZ5B/V+55KbCTggBrThDDArjeS2bwHUVpjd92CvO47ya3SHELdWtTijAQ==`;Trusted Publisher run `33177647530` 完成,Registry 签名与 provenance 验证通过。发布后仓库所有者确认该精确版本的图片输入可用。
97
97
 
98
- 已发布 `0.1.7` 只增加 Windows 运行时诊断、登录失败可解释性与 `IconThinkOutline16` 设置导航图标维护。曾发布后撤回的 sidebar quota `0.1.8` 同样不修改图片边界;该 npm 版本号已消耗且不承载 Search。已发布 `0.1.9` 独立增加默认关闭的 Web/X Search 协议与页面,当前 `0.1.10` 候选只修复其 settings 集成;两者都不修改上述图片模型集合、attachment 投影、资源上限或图片 wire。
98
+ 已发布 `0.1.7` 只增加 Windows 运行时诊断、登录失败可解释性与 `IconThinkOutline16` 设置导航图标维护。曾发布后撤回的 sidebar quota `0.1.8` 同样不修改图片边界;该 npm 版本号已消耗且不承载 Search。已发布 `0.1.9` 独立增加默认关闭的 Web/X Search 协议与页面,已发布 `0.1.10` 修复其 settings 集成,当前 `0.1.11` 候选只修复 Search 续跑 reasoning lifecycle;三者都不修改上述图片模型集合、attachment 投影、资源上限或图片 wire。
@@ -1,10 +1,10 @@
1
1
  # `0.1.9` Web/X Search 上游与固定 Proxy 证据
2
2
 
3
- - 状态:`grok-4.6` 四组脱敏观察、生产顺序 mixed 复验、双平台 CI、隔离 Web Harness、最终制品与发布后回读门禁均已完成;`0.1.9` 已正式发布,发布后发现的 Host settings 集成缺口由 `0.1.10` 修复
3
+ - 状态:`grok-4.6` 四组脱敏观察、生产顺序 mixed 复验、双平台 CI、隔离 Web Harness、最终制品与发布后回读门禁均已完成;`0.1.9` 发布协议、`0.1.10` 修复 Host settings,`0.1.11` 候选修复 High Effort + Web Search reasoning lifecycle
4
4
  - 观察日期:2026-08-30
5
5
  - 固定 origin/path:`https://cli-chat-proxy.grok.com/v1/responses`
6
6
  - Provider client identity:`dsh-grok-provider/1.0.5`
7
- - 协议目标版本:`0.1.9`;设置链路修正:`0.1.10`
7
+ - 协议目标版本:`0.1.9`;设置链路修正:`0.1.10`;reasoning 响应兼容修正:`0.1.11`
8
8
 
9
9
  sidebar quota 维护版 `0.1.8` 曾发布后撤回,npm Registry 已消耗该版本号且不能复用;本页所有 Search 协议证据只属于已发布 `0.1.9`,不能据此把 Search 描述为 `0.1.8` 能力,也不能替代 `0.1.10` 的真实 settings 集成验收。
10
10
 
@@ -89,6 +89,10 @@ Web + X 观察共 68 个 SSE event、4 个 output item、8 个 citation annotati
89
89
  - [x] 发布证据 PR #21 合并后的最终 release commit 为 `a0af7b74882546dc3d9477b8f6c1494935e6bfb4`,CI run `33295408650` 全绿。唯一 `dsh-grok-provider-0.1.9.tgz` 含 69 个文件、190,049 bytes,unpacked size 为 603,475 bytes,SHA-256 为 `78c73c95ea71d66cad6e6146fed41c281f1c8b29f60353e3f20247ec23833210`,SRI 为 `sha512-GeXQg3qedCGZz9D5MMaHd8Afe5Bn0nxjG+PQmKOB2AxB3m6IiGA07PMD77dEAOJVbAzKk0SnxAOKTZMTQFtuYg==`。
90
90
  - [x] 不可变 `v0.1.9`、GitHub Release 与 Trusted Publisher run `33295761336` 已完成;npm `latest=0.1.9`,Registry、Release 与本地制品逐字节一致。精确 Registry 安装的 Host/client import/export smoke 通过;精确安装审计图汇总 71 个已验证签名与 3 个 attestations,本包 attestations endpoint 返回 2 项,SLSA provenance 精确绑定 tag、workflow、commit 与 release run。
91
91
 
92
- `0.1.9` 发布后的真实页面检查证明上述协议证据没有覆盖 Host namespace 注册:`settings.describe` 可写但不包含 `llm-grok`,客户端因此正确派生 `unavailable` 并禁用开关;Host 同时只在启动时读取一次组合配置。`0.1.10` 增加真实 SettingsProvider + LLM Runtime 回归和 Adapter 首次 await 前快照回归,只修复设置进入后续请求的链路,不改变本页任何固定 Proxy 结论。
92
+ `0.1.9` 发布后的真实页面检查证明上述协议证据没有覆盖 Host namespace 注册:`settings.describe` 可写但不包含 `llm-grok`,客户端因此正确派生 `unavailable` 并禁用开关;Host 同时只在启动时读取一次组合配置。`0.1.10` 增加真实 SettingsProvider + LLM Runtime 回归和 Adapter 首次 await 前快照回归,只修复设置进入后续请求的链路,并已正式发布。
93
93
 
94
- 这些自动化与脱敏证据仍不构成所有平台真实账户验收;真实 xAI Search、浏览器手工对话、OAuth 和网络可达 Windows 真机浏览器弹出保持独立边界。
94
+ `0.1.10` 发布后的真实 High Effort + Web Search 使用暴露另一条响应兼容边界:一次已完成 server Search 可以位于已关闭 reasoning item 与复用同一 ID 的严格空 reasoning 占位之间。`0.1.11` 只在这个精确顺序下允许一次复用;无已完成 Search 间隔、未闭合、跨类型、非空或再次复用仍失败关闭。它同时接受完整闭合的空 reasoning,并支持与 summary 严格互斥的官方 raw `reasoning_text` lifecycle。replay 元数据不保存 raw 明文,后续请求只发送 encrypted content 与空 summary;当前流中的 raw delta 仍作为 Harness 可见 reasoning 输出。
95
+
96
+ 脱敏真实 `grok-4.6` Web Search probe 经生产 decoder 只发出 1 次 POST,观察 68 个事件、34 个 summary delta、0 个 raw delta、decoder accepted 与 1 个 finish;没有保存 prompt、回复正文、检索词、citation URL 或凭据。该结果验证当前 summary/Search 路径,不得描述为 raw reasoning 真机证据;raw reasoning 当前只有协议 fixture 回归。
97
+
98
+ 这些自动化与脱敏证据仍不构成所有平台完整真实账户验收;浏览器手工对话、OAuth、长会话 Agent loop 和网络可达 Windows 真机浏览器弹出保持独立边界。
package/docs/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # Grok Build Provider 文档索引
2
2
 
3
- - 状态:**`0.1.9` 已发布但 Search 设置链路存在缺陷;`0.1.10` 正在修复 Host namespace 与按调用配置快照**
4
- - 当前 npm 稳定版本:`0.1.9`
5
- - 最近发布版本:`0.1.9`
6
- - 当前开发分支:`yukiryou/v0.1.10-release-evidence`
7
- - 发布路径:`0.1.10` 代码 PR #23 已合入受保护 `yukiryou/main`;当前分支记录 release evidence
8
- - 发布状态:不可变 `v0.1.9` 精确指向 release commit `a0af7b74882546dc3d9477b8f6c1494935e6bfb4`;CI run `33295408650` 全绿。唯一 69 文件、190,049-byte tarball 的 unpacked size 为 603,475 bytes,SHA-256 为 `78c73c95ea71d66cad6e6146fed41c281f1c8b29f60353e3f20247ec23833210`,npm SRI 为 `sha512-GeXQg3qedCGZz9D5MMaHd8Afe5Bn0nxjG+PQmKOB2AxB3m6IiGA07PMD77dEAOJVbAzKk0SnxAOKTZMTQFtuYg==`;Trusted Publisher run `33295761336` 已完成,Registry、GitHub Release 与本地制品逐字节一致,npm `latest=0.1.9`。精确 Registry 安装的 Host/client import/export smoke 通过;精确安装审计图汇总 71 个已验证签名与 3 个 attestations,本包 attestations endpoint 返回 2 项,SLSA provenance 精确绑定 tag、workflow、commit 与 release run。该制品遗漏 `llm-grok` Host settings 注册,不能通过重启或重装修复
3
+ - 状态:**`0.1.10` 已发布;`0.1.11` reasoning 修复已合入受保护主分支,正在关闭发布证据**
4
+ - 当前 npm 稳定版本:`0.1.10`
5
+ - 最近发布版本:`0.1.10`
6
+ - 当前开发分支:`yukiryou/v0.1.11-release-evidence`
7
+ - 发布路径:代码 PR #25 已合入 `yukiryou/main@307ae3ac83526f388c6b4a0d1e1346353bd5f4aa`,main CI run `33302830043` 的 macOS 14 / Windows 2022 均通过;发布证据 PR、最终 release commit CI、唯一制品和精确发布授权待完成
8
+ - 发布状态:不可变 `v0.1.10` 精确指向 release commit `fe1e5a7d82defb17ab5bcbb0d9979c43cb48c028`;main CI run `33299116564` 与 Trusted Publisher run `33299599113` 全绿。唯一 70 文件、197,620-byte tarball 的 unpacked size 为 628,836 bytes,SHA-256 为 `f9fe1dea743e86e2799a1073a93a8af91ad5bd389e14f4d2f0528428ada93c62`,npm SRI 为 `sha512-OnfG4diVqJdzYSwJKERNnaplYFbOvFICZP58E0f2Cdh+t7orlTL1DWokvzEHdJrw6HA+UMoKDZgJ6AMEVv4aUg==`;Registry、GitHub Release 与本地制品逐字节一致,npm `latest=0.1.10`,Registry signature 与 SLSA provenance 已回读。该版 Search 设置可写,但 High Effort + Web Search 续跑存在已知 reasoning lifecycle 兼容缺陷
9
9
  - 撤回状态:`0.1.8` 只对应 sidebar quota 维护发布,不包含 Search;撤回不会释放 npm semver,任何 Search 制品都不得复用 `0.1.8`
10
10
  - 兼容基线:DeepSeek Harness `0.1.1-rc.2`
11
11
  - 目标平台:macOS arm64、Windows x64
@@ -54,6 +54,7 @@
54
54
  - [v0.1.8 sidebar quota 撤回说明](./releases/v0.1.8.md)
55
55
  - [v0.1.9 中英双语发行说明](./releases/v0.1.9.md)
56
56
  - [v0.1.10 中英双语发行说明](./releases/v0.1.10.md)
57
+ - [v0.1.11 中英双语发行说明](./releases/v0.1.11.md)
57
58
  - [v0.1.2-rc.1 中英双语预发行说明](./releases/v0.1.2-rc.1.md)
58
59
  - [ADR-0001:认证与传输路线](./adr/0001-auth-and-transport-route.md)
59
60
  - [ADR-0002:首版能力边界](./adr/0002-v0.1-scope.md)
@@ -70,7 +71,7 @@
70
71
 
71
72
  `0.1.2-rc.1` 是唯一一次预发行尝试。仓库所有者决定从稳定 `0.1.2` 起不再发行预发行版;正式版缺陷通过新的递增稳定版本修复。`0.1.4` 已发布:仅精确 `grok-4.6` 开启图片,普通 user 与一层 tool-result 的红/蓝合成图共四次脱敏 Proxy 请求均通过;`grok-4.5` 的红图语义结果不可靠,因此失败关闭并与其他模型保持 text-only。`0.1.5` 维护发布供应链、账户面板投影与 Provider Runtime 安装事务。`0.1.6` 已发布图片历史 reasoning 兼容与 Windows CLI 分阶段 deadline 修复,精确制品、Trusted Publisher、Registry signature 与 provenance 均已验证;发布后图片能力已由仓库所有者确认可用。Windows 真机同时确认官方 `grok login --oauth` 可在 xAI OIDC discovery 阶段超时,此时登录 URL 尚未生成,不能据此声称 Provider 已修复或验证浏览器弹出。
72
73
 
73
- `0.1.7` 已发布闭合 CLI 安装/版本诊断、登录失败可解释性,以及采用 MIT 许可的 Harness `IconThinkOutline16` 路径几何;它不接管官方 CLI 的网络、代理或 OAuth 流程。sidebar quota `0.1.8` 曾发布后撤回,且该 npm 号码不能复用;Search 从未作为 `0.1.8` 发布。`0.1.9` 已发布精确 `grok-4.6` 的 Search 协议和页面,但遗漏 Host namespace 注册并过早冻结组合配置;`0.1.10` 只补齐 canonical settings 注册与调用级快照,不改变固定 Proxy、citation 或不可信远端内容边界。`0.1.10` 的真实 SettingsProvider/LLM 回归、页面写入、候选隔离安装、代码 PR 与 main 双平台 CI 已完成,发布证据 PR 和最终唯一制品仍待关闭。隔离验收与精确 Registry Host/client import/export smoke 均不覆盖浏览器手工对话、Agent/session loop、OAuth、真实账号/真实 xAI 请求或 Windows 真机。完整门禁见[逐版发布检查表](./10-release-checklist.md)。
74
+ `0.1.7` 已发布闭合 CLI 安装/版本诊断、登录失败可解释性,以及采用 MIT 许可的 Harness `IconThinkOutline16` 路径几何;它不接管官方 CLI 的网络、代理或 OAuth 流程。sidebar quota `0.1.8` 曾发布后撤回,且该 npm 号码不能复用;Search 从未作为 `0.1.8` 发布。`0.1.9` 发布精确 `grok-4.6` 的 Search 协议和页面,`0.1.10` 补齐 canonical settings 注册与调用级快照并完成正式发布。真实使用随后发现 High Effort + Web Search 续跑会出现一次已关闭 reasoning ID 的空占位复用;`0.1.11` 候选收窄地兼容该形状、接受空 reasoning,并加入与 summary 严格互斥的官方 raw `reasoning_text` 生命周期。脱敏真实探针只观察到 summary delta,不能作为 raw reasoning 真机证据。最终双平台 CI、唯一制品、精确授权与发布回读仍待关闭;浏览器手工对话、OAuth、完整真实会话和 Windows 真机继续属于独立边界。完整门禁见[逐版发布检查表](./10-release-checklist.md)。
74
75
 
75
76
  ## 官方依据
76
77
 
@@ -1,8 +1,8 @@
1
1
  # ADR-0010:默认关闭且独立配置的 Web/X Search
2
2
 
3
- - 状态:已接受;协议能力已在 `0.1.9` 正式发布,`0.1.10` 修正设置集成缺口
3
+ - 状态:已接受;协议能力已在 `0.1.9` 正式发布,`0.1.10` 修正设置集成缺口,`0.1.11` 修正 reasoning 续跑兼容
4
4
  - 日期:2026-08-30
5
- - 适用版本:`0.1.9` 协议能力,`0.1.10` 可用设置链路
5
+ - 适用版本:`0.1.9` 协议能力,`0.1.10` 可用设置链路,`0.1.11` reasoning 响应兼容
6
6
  - 取代:无
7
7
 
8
8
  ## 背景
@@ -86,6 +86,20 @@ request 与 receipt 均复制并冻结。decoder 不从 Config、route 或原始
86
86
 
87
87
  `0.1.10` 不改变 Search wire 或响应 allowlist,只补齐 canonical Host 注册和 Adapter 调用快照。回归测试必须同时证明:真实 SettingsProvider 可描述唯一 namespace、安全默认值与 `applies:"live"`;设置更新影响下一调用;更新前已准备的调用保留旧策略;无 settings service 时组合配置仍有效;插件卸载后 namespace 被清理。
88
88
 
89
+ ## `0.1.11` reasoning 响应兼容修正
90
+
91
+ 真实 `grok-4.6` High Effort + Web Search 续跑暴露了两种此前未冻结的合法形状:完整 `added → done` 但没有可见内容的 reasoning item;以及一次已闭合 reasoning item 的 ID,在中间完成 Search lifecycle 后,被新 output index 再使用一次作为严格空占位项。旧 decoder 的全局 item ID 唯一约束会把后一形状映射为 `INVALID_RESPONSE`。
92
+
93
+ `0.1.11` 只扩展 decoder 内部状态机,不改变公开 Provider 接口、Search descriptor 或设置:
94
+
95
+ - 普通闭合空 reasoning item 必须保持空 summary、无 content 或空 content,并通过既有状态、顺序、索引和 encrypted-content 上限校验。
96
+ - reasoning ID 仅在旧 lifecycle 已闭合、两个 output index 之间存在已完成的 Web/X server-tool lifecycle、且新 item 是精确的 `in_progress + summary:[]` 空起始形状时允许复用;同一 ID 最多放行一次。
97
+ - 复用后的 item 不得进入 summary 或 raw content lifecycle,只能以空 reasoning item 闭合。未闭合、跨类型、非空、无 Search 间隔或第二次复用继续失败关闭;message、function 与 server-tool ID 规则不放宽。
98
+ - 同时接受官方 Responses 的 raw reasoning 标准 lifecycle:`reasoning_text` content part、`response.reasoning_text.delta` / `done`、content part done 与最终 item content 必须逐层一致。raw 与 summary 模式互斥,缺失的 `item_id` / `content_index`、混用、乱序、提前完成或文本不一致均失败关闭。
99
+ - raw replay 元数据只保留 encrypted content 与 `reasoning_text` 类型标记;后续请求只发送 `encrypted_content` 和 `summary:[]`,不把 raw 明文重新发送或伪装成 summary。观察到 Search 时仍按既有规则抑制整个响应的 reasoning replay。
100
+
101
+ 脱敏真实 probe 对最终目标形状只发出一次 Responses POST,生产 decoder 接受 68 个事件、34 个 summary delta 与一个 finish;它没有产生 raw delta,因此只证明 summary/Search 续跑路径。raw reasoning 的接受域由官方事件契约和失败关闭 fixture 覆盖,不能描述为真机已验证。
102
+
89
103
  - 不支持的精确模型能力:`UNSUPPORTED_CONTENT`。
90
104
  - 协议、receipt、未知事件、未声明 function 或不闭合 lifecycle:`INVALID_RESPONSE`。
91
105
  - Abort、认证、429 与其他 HTTP 错误沿用现有 `ABORTED`、`AUTH`、`RATE_LIMIT`、`PROVIDER_ERROR`。
@@ -0,0 +1,72 @@
1
+ ## 中文
2
+
3
+ `0.1.11` 修复精确 `grok-4.6` 在 **High Effort + Web Search** 续跑时偶发的 `The Grok provider rejected an invalid or unsupported response`。上游会先关闭 reasoning 项,在一次 Search 完成后再把同一个 reasoning ID 使用一次作为空占位项;旧解码器把任何 ID 复用都视为非法响应。
4
+
5
+ > 当前为尚未发布的源码候选。代码 PR #25 与 main CI run `33302830043` 的 macOS 14 / Windows 2022 已通过;发布证据提交的 final CI、npm、GitHub Release、最终制品摘要与 provenance 仍须在最终提交冻结并取得精确 `dsh-grok-provider@0.1.11` 制品授权后补齐。
6
+
7
+ ### 发布后安装
8
+
9
+ ```sh
10
+ dsh plugin --profile web add dsh-grok-provider@0.1.11
11
+ dsh web
12
+ ```
13
+
14
+ ### 修复内容
15
+
16
+ - 仅在一次 Search 已完成后允许已经闭合的 reasoning ID 再出现一次,并且第二次必须是严格为空的 reasoning 占位项;无已完成 Search、未闭合复用、跨类型复用、非空复用和第二次重复仍失败关闭。
17
+ - 接受完整闭合的空 reasoning 项,同时继续校验事件序号、输出索引、状态和 encrypted replay。
18
+ - 支持官方 Responses 的 raw reasoning 标准生命周期:`reasoning_text` content part 以及 `response.reasoning_text.delta` / `done`。
19
+ - raw reasoning 与现有 summary reasoning 严格互斥;混用、乱序、重复、缺失完成事件或内容不一致仍返回通用非法响应错误。
20
+ - replay 元数据不保存 raw 明文,后续请求只回传 `encrypted_content` 与 `summary: []`,不会回传或把 raw 明文伪装成 summary;当前流中的 raw reasoning delta 仍会作为 Harness 可见 reasoning 输出。
21
+
22
+ ### 验证边界
23
+
24
+ - 聚焦自动化覆盖空项、一次性 ID 复用、raw reasoning 流式输出与 encrypted replay,以及对应的非法/截断生命周期。
25
+ - 脱敏真实探针通过生产解码器完成 1 次 POST:68 个事件、34 个 summary delta、0 个 raw reasoning delta、decoder accepted、1 个 finish。
26
+ - 该真实探针证明当前观察到的 **summary + Web Search 续跑路径** 可被接受;因为它没有返回 raw reasoning 事件,所以 **不能**作为 raw reasoning 真机验证。raw reasoning 当前只有协议 fixture 回归证据。
27
+
28
+ ### 兼容性与不变边界
29
+
30
+ - DeepSeek Harness:精确 `0.1.1-rc.2`
31
+ - Node.js:`>=24.19.0`
32
+ - 平台:macOS arm64、Windows x64;Windows 网络可达时的真实外部浏览器弹出仍未验收
33
+ - 本版不改变登录、凭据、设置开关、模型集合、Search descriptor、citation、图片输入、固定 endpoint 或网络/权限边界
34
+ - Search 结果和 citation 仍是不可信远端内容;插件不会打开或下载引用链接
35
+
36
+ <details>
37
+ <summary>English release notes</summary>
38
+
39
+ `0.1.11` fixes intermittent `The Grok provider rejected an invalid or unsupported response` failures when exact `grok-4.6` continues after Web Search at High Effort. The upstream stream may close a reasoning item, complete Search, and then reuse the same reasoning ID once as an empty placeholder; the previous decoder rejected every repeated item ID.
40
+
41
+ > This is an unpublished source candidate. Code PR #25 and main CI run `33302830043` passed on macOS 14 and Windows 2022. The release-evidence commit's final CI, npm, GitHub Release, final artifact digests, and provenance remain pending until the final commit is frozen and the exact `dsh-grok-provider@0.1.11` artifact is explicitly authorized.
42
+
43
+ ### Install after publication
44
+
45
+ ```sh
46
+ dsh plugin --profile web add dsh-grok-provider@0.1.11
47
+ dsh web
48
+ ```
49
+
50
+ ### Fixes
51
+
52
+ - Permit one reuse of an already closed reasoning ID only after one completed Search and only when the second lifecycle is a strictly empty reasoning placeholder. Reuse without completed Search, open, cross-type, non-empty, or repeated reuse still fails closed.
53
+ - Accept fully closed empty reasoning items while preserving sequence, output-index, status, and encrypted-replay validation.
54
+ - Support the official Responses raw-reasoning lifecycle: `reasoning_text` content parts and `response.reasoning_text.delta` / `done` events.
55
+ - Keep raw reasoning and summary reasoning strictly mutually exclusive. Mixed, out-of-order, duplicate, incomplete, or inconsistent lifecycles still map to the generic invalid-response error.
56
+ - Replay metadata does not retain raw plaintext. Later requests carry only `encrypted_content` plus `summary: []` and never replay or relabel raw plaintext as a summary; live raw-reasoning deltas remain visible to Harness.
57
+
58
+ ### Verification boundary
59
+
60
+ - Focused automation covers empty items, one-time ID reuse, raw-reasoning streaming and encrypted replay, plus the corresponding malformed and truncated lifecycles.
61
+ - A redacted real probe passed one POST through the production decoder: 68 events, 34 summary deltas, zero raw-reasoning deltas, decoder accepted, and one finish.
62
+ - That probe verifies the currently observed **summary + Web Search continuation path** only. Because it emitted no raw-reasoning events, it is **not** live evidence for raw reasoning; raw reasoning is currently protocol-fixture verified.
63
+
64
+ ### Compatibility and unchanged boundaries
65
+
66
+ - DeepSeek Harness: exact `0.1.1-rc.2`
67
+ - Node.js: `>=24.19.0`
68
+ - Platforms: macOS arm64 and Windows x64; real Windows external-browser launch with reachable networking remains unverified
69
+ - Authentication, credentials, settings, model routing, Search descriptors, citations, image input, fixed endpoints, and network/permission boundaries are unchanged
70
+ - Search results and citations remain untrusted remote content; the plugin never opens or downloads cited links
71
+
72
+ </details>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-grok-provider",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "Clean-room Grok Build provider for DeepSeek Harness with official CLI browser authentication",
5
5
  "type": "module",
6
6
  "license": "MIT",