## 中文 `1.0.1` 已正式发布,修复开启 Web/X Search 后,Harness 本地 function 与 xAI server Search 同名时固定 Proxy 返回 HTTP 400 的问题。它同时让真实 HTTP 错误保留为 `PROVIDER_ERROR`,不再被 SSE 解析层误报为 `INVALID_RESPONSE`。 > 在 `1.0.1` 发布回读时,npm Registry 的稳定版和 `latest` 均为 `1.0.1`。唯一授权制品、双平台 final CI、GitHub Release、Registry 字节回读、签名、attestations 与 SLSA provenance 均已验证。 ### 安装或升级 ```bash dsh plugin --profile web add dsh-grok-provider@1.0.1 ``` ### 根因 Harness 会提供名为 `web_search` / `x_search` 的本地 function;当用户同时启用 Provider 的 xAI server Search 时,`1.0.0` 会把同名 function definition 与 `{ type: "web_search" }` / `{ type: "x_search" }` 一起发往固定 Proxy。该组合被上游以 HTTP 400 拒绝。 旧 SSE 包装层又把 transport 读取过程中抛出的 HTTP 错误统一改写成无效 SSE,因此界面只显示 `The Grok provider rejected an invalid or unsupported response` / `INVALID_RESPONSE`,掩盖了真正的 Provider HTTP 错误。 ### 修复内容 - 请求编译器先完整验证全部 Harness functions,再只从 wire definitions 中精确过滤与**已启用** server Search 同名的 `web_search` / `x_search`。关闭对应开关时,本地 function 保持原样。 - 历史 `function_call` / `function_call_output` 不删除、不改名;现有会话中的旧 `web_search` / `x_search` 调用可以继续参与上下文。 - 最终 receipt 拒绝 function names 与 server tools 的任何交集,避免 decoder 接受一份含糊的请求能力声明。 - SSE parser 只把真实 framing/JSON/协议错误归为 `INVALID_RESPONSE`;source iterable 抛出的 transport error 原样上抛,固定 Proxy HTTP 400 因而映射为 `PROVIDER_ERROR`。认证、429 和中止仍沿用既有映射。 - 失败后不会自动删减 Search 并重放请求。 ### 真实账号验证边界 在仓库所有者明确授权的已登录账号环境中,最终源码精确回放了原失败 X 会话的结构: - 8 条 messages; - 40 个 source functions; - wire 为 38 个 function definitions + 2 个 server Search tools; - 保留 2 个历史 reserved-name function calls; - 只执行 1 次 models GET 和 1 次 Responses POST; - 接收 314 个 events,并以 `response.completed` 闭合。 验证没有保存或输出消息正文、回复正文、URL、账号身份或凭据。它证明该已知冲突在当前账号环境中可以完成;该真实回放本身不替代 CI、制品、发布或 Windows 真机浏览器登录证据。 ### 发布证据 - 最终 release commit:`3c25a53571531e35ac888df16df4fe6c01849e85`;annotated tag object `ab79b1bb1e408a0112166cadc26761a327819c3f` peel 到该提交;final CI run [`33312946205`](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33312946205) 在 macOS 14 / Windows 2022 全绿。 - 仓库所有者明确授权的唯一 tarball 含 73 个文件,packed size 为 240,904 bytes,unpacked size 为 748,888 bytes;SHA-1 为 `9e6449160947104e8dbb71b7201c53e81b073f83`,SHA-256 为 `e3e15646d38de23c32c71ed759f9c10be9b2d790d4b10b4b8dfe59a44fbfef9f`,SRI 为 `sha512-Bm1qjJQ9i7CWT0oWah7QKDVBP8dR2YQtvEEZGE/BOSwZCo8sZbrW2v2QSfUfLsOLHcQXFZZ0jlDCAztr1m/q+A==`。 - Trusted Publisher run [`33313699790` attempt 1](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33313699790/attempts/1) 从精确 `v1.0.1` tag ref 发布;冻结候选、唯一 GitHub Release asset 与 npm Registry tarball 逐字节一致,npm `latest=1.0.1`。 - Node `24.19.0` / npm `11.5.1` 的锁定 Registry 隔离安装通过 Host `name`/`apply` 与 client `id`/factory smoke,生产依赖审计为 0 漏洞;`npm audit signatures` 验证安装图中 11 个 Registry signatures 与 2 个 attestations。本包公开 metadata 含 1 个 Registry signature 和 2 个 attestations,SLSA provenance 精确绑定 `release.yml`、`refs/tags/v1.0.1`、release commit 与 publish run。 - 已知文档边界:精确授权 tarball 在发布前冻结,因此其中的 README 仍是候选态文案,npm `1.0.1` 页面也会永久保留该历史内容。已发布版本不可原地替换;现已发布并完成回读的 `1.0.2` 制品携带纠正后的双语 README 与精确安装命令,当前 npm 包主页随 `latest=1.0.2` 显示新文档。 ### 不变边界 - DeepSeek Harness:精确 `0.1.1-rc.2` - Node.js:`>=24.19.0` - Search 仍默认关闭且只对精确 `grok-4.6` 开放 - 登录、凭据、模型目录、图片输入、固定 endpoint、citation 处理与权限边界不变 - 网络可达 Windows 真机外部浏览器弹出仍未验收
English release notes `1.0.1` is published. It fixes fixed-Proxy HTTP 400 failures when Harness local functions share the `web_search` / `x_search` names with enabled xAI server Search tools. It also preserves real HTTP failures as `PROVIDER_ERROR` instead of misreporting them as SSE-level `INVALID_RESPONSE`. > At the time of the `1.0.1` publication readback, the npm stable release and `latest` were both `1.0.1`. The uniquely authorized artifact, final dual-platform CI, GitHub Release, Registry byte readback, signatures, attestations, and SLSA provenance are verified. ### Install or upgrade ```bash dsh plugin --profile web add dsh-grok-provider@1.0.1 ``` ### Root cause Harness supplies local functions named `web_search` and `x_search`. When a user also enables the Provider's xAI server Search, `1.0.0` sends those function definitions together with `{ type: "web_search" }` and `{ type: "x_search" }`. The fixed Proxy rejects that ambiguous tool list with HTTP 400. The previous SSE wrapper then converted HTTP errors thrown while reading the transport into invalid-SSE errors. The UI therefore showed only `The Grok provider rejected an invalid or unsupported response` / `INVALID_RESPONSE`, hiding the actual Provider HTTP failure. ### Fixes - Fully validate every Harness function first, then omit only wire definitions whose names collide with an **enabled** `web_search` / `x_search` server tool. The local function remains unchanged when the corresponding setting is off. - Preserve historical `function_call` / `function_call_output` items without deleting or renaming prior reserved-name calls. - Reject every function-name/server-tool intersection in the final response receipt. - Classify only real SSE framing, JSON, or protocol faults as `INVALID_RESPONSE`. Transport errors raised by the source iterable propagate unchanged, so fixed-Proxy HTTP 400 maps to `PROVIDER_ERROR`; authentication, 429, and abort mappings remain unchanged. - Never retry a posted request by silently removing Search. ### Real-account verification boundary With the repository owner's explicit permission in the already authenticated account environment, the final source replayed the original failing X-session structure exactly: - 8 messages; - 40 source functions; - 38 function definitions + 2 server Search tools on the wire; - 2 historical reserved-name function calls preserved; - exactly 1 models GET and 1 Responses POST; - 314 events ending in `response.completed`. The verification retained or exposed no message text, response text, URL, account identity, or credential. It demonstrates completion of the known conflict in the current account environment; that replay alone is not CI, artifact, publication, or real-device Windows browser-login evidence. ### Release evidence - Final release commit: `3c25a53571531e35ac888df16df4fe6c01849e85`; annotated tag object `ab79b1bb1e408a0112166cadc26761a327819c3f` peels to that commit; final CI run [`33312946205`](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33312946205) passed on macOS 14 and Windows 2022. - The repository owner explicitly authorized the unique 73-file tarball. It is 240,904 bytes packed and 748,888 bytes unpacked; SHA-1 is `9e6449160947104e8dbb71b7201c53e81b073f83`, SHA-256 is `e3e15646d38de23c32c71ed759f9c10be9b2d790d4b10b4b8dfe59a44fbfef9f`, and SRI is `sha512-Bm1qjJQ9i7CWT0oWah7QKDVBP8dR2YQtvEEZGE/BOSwZCo8sZbrW2v2QSfUfLsOLHcQXFZZ0jlDCAztr1m/q+A==`. - Trusted Publisher run [`33313699790` attempt 1](https://github.com/yoshino-xiao7/dsh-grok-provider/actions/runs/33313699790/attempts/1) published from the exact `v1.0.1` tag ref. The frozen candidate, unique GitHub Release asset, and npm Registry tarball are byte-identical; npm `latest=1.0.1`. - A locked Registry installation under Node `24.19.0` / npm `11.5.1` passed Host `name`/`apply` and client `id`/factory smoke checks with zero production vulnerabilities. `npm audit signatures` verified 11 Registry signatures and 2 attestations in the installed graph. Public package metadata exposes 1 Registry signature and 2 attestations, while SLSA provenance exactly binds `release.yml`, `refs/tags/v1.0.1`, the release commit, and the publish run. - Known documentation boundary: the exactly authorized tarball was frozen before publication, so its embedded README still uses candidate-state wording and the npm `1.0.1` version page permanently retains that historical text. Published versions cannot be replaced in place; the published and fully read-back `1.0.2` artifact carries the corrected bilingual README and exact installation command, and the current npm package page now follows `latest=1.0.2`. ### Unchanged boundaries - DeepSeek Harness: exact `0.1.1-rc.2` - Node.js: `>=24.19.0` - Search remains default-off and limited to exact `grok-4.6` - Authentication, credentials, model catalog, image input, fixed endpoints, citation handling, and permission boundaries are unchanged - Network-reachable external-browser launch remains unverified on a real Windows device