{"_id":"@aeven-ai/dsh-subscription-auth","name":"@aeven-ai/dsh-subscription-auth","dist-tags":{"latest":"0.7.0"},"versions":{"0.7.0":{"name":"@aeven-ai/dsh-subscription-auth","description":"DeepSeek Harness coding-subscription OAuth: SuperGrok/Grok Build, ChatGPT Plus Codex, Kimi Code, Claude Code. Fixes AUTH API key is invalid, INVALID_REPLAY_STATE, grok-4.6 xhigh, Kimi Bearer vs x-api-key.","version":"0.7.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"repository":{"type":"git","url":"git+https://github.com/Aeven-AI/dsh-subscription-auth.git"},"bugs":{"url":"https://github.com/Aeven-AI/dsh-subscription-auth/issues"},"homepage":"https://github.com/Aeven-AI/dsh-subscription-auth#readme","keywords":["deepseek-harness","dsh-plugin","oauth","grok-build","super-grok","grok-4.6","cli-chat-proxy","openai-codex","chatgpt-plus","kimi-code","claude-code","google-antigravity","xhigh","device-code"],"type":"module","packageManager":"pnpm@11.21.0","engines":{"node":"^22.19.0 || >=24.0.0"},"main":"lib/index.js","types":"lib/index.d.ts","bin":{"dsh-coding-oauth":"lib/bin.js","dsh-grok-build":"lib/bin.js"},"scripts":{"check:bom":"node build/verify-dsh-bom.mjs","assert:node":"node scripts/assert-node.mjs","assert:oauth-core":"node scripts/assert-oauth-core.mjs","clean":"node build/clean.mjs","typecheck":"tsc -b tsconfig.host.json tsconfig.client.json","build:server":"tsc -p tsconfig.build.json && tsc -p tsconfig.dts-bin.json && node build/build-server.mjs","build:client":"node build/build-client.mjs","build:artifacts":"pnpm run check:bom && pnpm run clean && pnpm run typecheck && pnpm run build:server && pnpm run build:client","build":"pnpm run release:build","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","lint":"biome check","check:next":"pnpm run assert:node && pnpm run assert:oauth-core && pnpm run check:bom && pnpm run lint && pnpm run typecheck && pnpm run test:coverage","check":"pnpm run assert:node && pnpm run assert:oauth-core && pnpm run lint && pnpm run release:build && pnpm run test:coverage","release:promote":"node build/promote-release.mjs","release:verify":"node build/verify-release.mjs","release:build":"pnpm run build:artifacts && pnpm run release:promote","release:dry":"node scripts/release.mjs --dry-run","release:inspect":"pnpm run assert:node && node scripts/release.mjs --dry-run","release:pack":"node scripts/release.mjs --pack","release:publish":"node scripts/release-publish.mjs","verify:deployed":"node scripts/verify-deployed-catalog.mjs","smoke:deployed":"node scripts/smoke-deployed-routes.mjs","smoke:dsh-alpha":"node scripts/smoke-dsh-alpha.mjs","prepack":"pnpm run release:build"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/invariant.d.ts","default":"./lib/invariant.js"},"./client":"./lib/client.js","./cordis.patch.yml":"./cordis.patch.yml","./package.json":"./package.json"},"license":"Apache-2.0","dsh":{"compatibility":{"coreAbi":"dsh-coding-oauth-core/v1","verifiedBom":"./compatibility/dsh-bom.json","participant":"coding-subscription-oauth","diagnostics":"standalone","bom":{"@deepseek-ai/cordis":"4.0.2","@deepseek-ai/dsh-atomic-write":"0.1.2-alpha.5","@deepseek-ai/dsh-attachment":"0.1.2-alpha.5","@deepseek-ai/dsh-client-locale":"0.1.2-alpha.5","@deepseek-ai/dsh-client-ui-renderer":"0.1.2-alpha.5","@deepseek-ai/dsh-client-ui-settings":"0.1.2-alpha.5","@deepseek-ai/dsh-client-ui-slots":"0.1.2-alpha.5","@deepseek-ai/dsh-client-web":"0.1.2-alpha.5","@deepseek-ai/dsh-credentials":"0.1.2-alpha.5","@deepseek-ai/dsh-home-paths":"0.1.2-alpha.5","@deepseek-ai/dsh-host-webserver":"0.1.2-alpha.5","@deepseek-ai/dsh-invariants":"0.1.2-alpha.5","@deepseek-ai/dsh-llm":"0.1.2-alpha.5","@deepseek-ai/dsh-llm-pi-ai":"0.1.2-alpha.5","@deepseek-ai/dsh-tools":"0.1.2-alpha.5","@deepseek-ai/schemastery":"3.18.2","@earendil-works/pi-ai":"0.84.2","react":"18.3.1","react-dom":"18.3.1"}},"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-locale"],"platform":"web"}},"dependencies":{"dsh-coding-oauth-core":"0.1.2","undici":"7.29.0"},"peerDependencies":{"@deepseek-ai/cordis":"4.0.2","@deepseek-ai/dsh-atomic-write":"0.1.2-alpha.5","@deepseek-ai/dsh-attachment":"0.1.2-alpha.5","@deepseek-ai/dsh-credentials":"0.1.2-alpha.5","@deepseek-ai/dsh-home-paths":"0.1.2-alpha.5","@deepseek-ai/dsh-host-webserver":"0.1.2-alpha.5","@deepseek-ai/dsh-invariants":"0.1.2-alpha.5","@deepseek-ai/dsh-llm":"0.1.2-alpha.5","@deepseek-ai/dsh-llm-pi-ai":"0.1.2-alpha.5","@deepseek-ai/dsh-tools":"0.1.2-alpha.5","@deepseek-ai/schemastery":"3.18.2","@earendil-works/pi-ai":"0.84.2","react":"18.3.1","react-dom":"18.3.1"},"peerDependenciesMeta":{"@deepseek-ai/cordis":{"optional":true},"@deepseek-ai/dsh-attachment":{"optional":true},"@deepseek-ai/dsh-credentials":{"optional":true},"@deepseek-ai/dsh-host-webserver":{"optional":true},"@deepseek-ai/dsh-invariants":{"optional":true},"@deepseek-ai/dsh-tools":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true}},"devDependencies":{"@biomejs/biome":"^2.5.8","@deepseek-ai/cordis":"4.0.2","@deepseek-ai/dsh-atomic-write":"0.1.2-alpha.5","@deepseek-ai/dsh-attachment":"0.1.2-alpha.5","@deepseek-ai/dsh-client-locale":"0.1.2-alpha.5","@deepseek-ai/dsh-client-ui-renderer":"0.1.2-alpha.5","@deepseek-ai/dsh-client-ui-settings":"0.1.2-alpha.5","@deepseek-ai/dsh-client-ui-slots":"0.1.2-alpha.5","@deepseek-ai/dsh-client-web":"0.1.2-alpha.5","@deepseek-ai/dsh-credentials":"0.1.2-alpha.5","@deepseek-ai/dsh-home-paths":"0.1.2-alpha.5","@deepseek-ai/dsh-host-webserver":"0.1.2-alpha.5","@deepseek-ai/dsh-invariants":"0.1.2-alpha.5","@deepseek-ai/dsh-llm":"0.1.2-alpha.5","@deepseek-ai/dsh-llm-pi-ai":"0.1.2-alpha.5","@deepseek-ai/dsh-tools":"0.1.2-alpha.5","@deepseek-ai/schemastery":"3.18.2","@earendil-works/pi-ai":"0.84.2","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.3","@types/node":"^22.20.0","@types/react":"~18.3.1","@types/react-dom":"18.3.7","@vitest/coverage-v8":"4.1.10","esbuild":"^0.28.2","happy-dom":"^20.12.0","react":"18.3.1","react-dom":"18.3.1","typescript":"^6.0.3","undici":"7.29.0","vitest":"^4.1.8"},"overrides":{"@earendil-works/pi-ai":"0.84.2"},"gitHead":"2111467be0deca56c8f51e75985de860a31733c5","_id":"@aeven-ai/dsh-subscription-auth@0.7.0","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-a1Upd+p1Gqd4EAN+lj6pz29PgTYNpYkM9CfoT9/kecRYg/7sqgJgoMZ9pOJGUNUBIoh9S1dQzAhfeMXvubvBUQ==","shasum":"66fcce5ed43363fcaba783451d7ba7acb94274b5","tarball":"https://registry.npmjs.org/@aeven-ai/dsh-subscription-auth/-/dsh-subscription-auth-0.7.0.tgz","fileCount":154,"unpackedSize":9748637,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB6107C/4Q4Mu43XKqbhGoq6+9cb30WFmjVpFWggxTQFAiEAouOTNg5LYa3zIXEcRMeifGefaV3qS3r/LySNAaN6t0Y="}]},"_npmUser":{"name":"olibaron","email":"olivier@airwave.io"},"directories":{},"maintainers":[{"name":"olibaron","email":"olivier@airwave.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-subscription-auth_0.7.0_1788388106880_0.2110598621139168"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-02T22:28:26.343Z","0.7.0":"2026-09-02T22:28:27.076Z","modified":"2026-09-02T22:28:27.303Z"},"maintainers":[{"name":"olibaron","email":"olivier@airwave.io"}],"description":"DeepSeek Harness coding-subscription OAuth: SuperGrok/Grok Build, ChatGPT Plus Codex, Kimi Code, Claude Code. Fixes AUTH API key is invalid, INVALID_REPLAY_STATE, grok-4.6 xhigh, Kimi Bearer vs x-api-key.","homepage":"https://github.com/Aeven-AI/dsh-subscription-auth#readme","keywords":["deepseek-harness","dsh-plugin","oauth","grok-build","super-grok","grok-4.6","cli-chat-proxy","openai-codex","chatgpt-plus","kimi-code","claude-code","google-antigravity","xhigh","device-code"],"repository":{"type":"git","url":"git+https://github.com/Aeven-AI/dsh-subscription-auth.git"},"bugs":{"url":"https://github.com/Aeven-AI/dsh-subscription-auth/issues"},"license":"Apache-2.0","readme":"\n<!-- banner -->\n<div align=\"center\">\n\n# 🔐 @aeven-ai/dsh-subscription-auth\n\n**v0.7.0** · 原名 `dsh-grok-build`\n\n**面向 [DeepSeek Harness](https://github.com/deepseek-ai/dsh) 的编码订阅 OAuth 插件。** 把 SuperGrok / X Premium（Grok Build）、ChatGPT Plus/Pro（Codex）、Kimi Code、Claude Pro/Max 和 Google Antigravity 接到 DSH——不必再开一份按量 API-key，**也不要把 token 粘贴进聊天。**\n\n[![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n\n*[English](README.md) · [中文版](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Português (BR)](README.pt-BR.md) · [Español](README.es.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md)*\n\n</div>\n\n---\n\n> **升级：** `0.7.0` 将 npm 包迁移到 `@aeven-ai/dsh-subscription-auth`，新增带文件锁的多账户凭据存储（现有凭据会自动迁移），并将 Imagine 产物一次性迁移到 `.dsh-subscription-auth-media`。请按 [`INSTALL.md`](INSTALL.md) 操作：保留现有 profile、配置和凭据文件，安装 scoped 包后移除旧包记录，再重启一次现有 DSH Web 进程。\n\n---\n\n## 项目更名\n\n最初只做 Grok Build，仓库名是 **`dsh-grok-build`**。现在覆盖 SuperGrok / Grok Build、ChatGPT Plus Codex、Kimi Code、Claude Code 和 Google Antigravity，因此改为现名。\n\n| | 请用这个 | 仍然可用 |\n|---|---|---|\n| npm（推荐） | 当前版本是 `0.7.0`：`dsh plugin --profile web add @aeven-ai/dsh-subscription-auth@0.7.0` | `dsh-coding-subscription-oauth@0.6.5` 仍可安装，但不会再更新 |\n| GitHub / 开发安装 | [`@aeven-ai/dsh-subscription-auth`](https://github.com/Aeven-AI/dsh-subscription-auth) | 旧仓库 `dsh-grok-build` 已删除 |\n| CLI | `dsh-coding-oauth` | `dsh-grok-build` |\n| Cordis 插件 id | `llm-grok-build-oauth` | 不变 |\n| 设置页 HTTP API | `/plugins/dsh-grok-build/*` | 不变 |\n| 凭据文件 | `$DSH_HOME/.grok-build-auth.json` 及其他 `*-oauth-auth.json` | 不变 |\n\n## ✨ 特性\n\n- 🧳 **自带订阅** —— SuperGrok、ChatGPT Plus/Pro、Kimi Code、Claude Pro/Max，不必另开按量 API-key。\n- 🔑 **本地 OAuth，不用贴 key** —— 在设置页或 CLI 完成授权；access/refresh token 不进聊天、日志和 HTTP 状态。\n- 🧩 **一个插件，五大供应商** —— Grok Build（`cli-chat-proxy.grok.com`）、Codex、Kimi Code、Claude Code 与 Google Antigravity。\n- 🛡️ **安全设计** —— 凭据文件均为 owner-only `0600`、原子写、跨进程文件锁。\n- ⚙️ **动态目录** —— 选择器只列出已登录路由并标注 `(OAuth)`，含 grok-4.6 的 `xhigh`。\n- 🌐 **代理感知** —— 只代理审核过的订阅域名；Kimi 中国流量默认直连。\n- 📥 **手动 CLI 拉取** —— 设置页只读发现白名单内的官方 Grok/Codex/Kimi/Claude CLI OAuth 文件；预览并确认覆盖后，单向拉取一份副本。\n- 🗂️ **多账户设置** —— 每个供应商最多保留八个账户，可在 Accounts 标签页切换当前账户或移除账户；已有单账户凭据会自动迁移。\n- 🎛️ **可选能力默认关闭** —— Codex 搜索、用量/配额、图像生成/编辑、Fast、Grok Imagine 打开后立即生效。另有默认关闭的开关，允许非 Codex 模型路由调用 Codex 图像工具，同时保留 Codex 登录、会话和附件归属检查。\n- 🔌 **可选本地 API 网关** —— 默认关闭的 loopback OpenAI/Anthropic 兼容服务，支持复制 base URL 和 Bearer key，只给你自己的工具用，不是公网中继。\n\n## 本插件解决的接入问题\n\n下面这些搜索词和 DSH 报错，通常就是会搜到这个仓库的原因。\n\n| 你搜到 / 看到的 | 实际坏在哪 | 本插件怎么处理 |\n|---|---|---|\n| SuperGrok / X Premium 接入 DSH、「Grok Build 和 `api.x.ai` 不是一路」 | 内置 `xai` 路由是**按量 API**。编码订阅走 `cli-chat-proxy.grok.com` | 独立 `grok-build` 路由 + 官方 CLI 指纹头（`X-XAI-Token-Auth`、`x-grok-client-identifier`、`x-grok-client-version`），避免静默 403 |\n| `本轮运行失败` **API key is invalid** / `AUTH` | GUI 把所有 `AUTH` 都显示成这句。常见原因是 OAuth access token 到期（Kimi 约 15 分钟） | 过期前 **5 分钟**主动刷新；遇到 401 先作废本地 token，刷新后再**重试该 step** |\n| 第二轮 Codex / Kimi 报 `INVALID_REPLAY_STATE` | replay state 仍带着 pi-ai 原生 provider id | 保持 Harness route id，并修复历史被污染的 replay |\n| grok-4.6 没有 **xhigh** / Extra High Effort | 线上 `GET /v1/models-v2` 已返回含 `xhigh` 的 `reasoning_efforts`；套用 grok-4.5 模板会被 pi-ai 藏掉 | 解析 live `reasoning_efforts`。4.6 有 `xhigh`，4.5 仍是 low/medium/high |\n| Kimi Code 401，或请求变成 Anthropic `x-api-key` | OAuth token 被当成 Anthropic key 发出 | `api.kimi.com/coding` **只**走 `Authorization: Bearer` |\n| 没登录的 Grok / Codex / Claude 仍出现在模型选择器 | 所有已注册路由都被列出来 | 未认证路由模型列表为空；已登录名称带 `(OAuth)` |\n| **远程 / 无头** DSH 没法浏览器登录 | PKCE 回不到本机 `localhost` | Grok/Codex/Kimi 走设备码；Claude 可粘贴完整 localhost 回调 URL |\n| 开了代理 Grok 通了、国内 Kimi 挂了 | 全局 `HTTPS_PROXY` 一刀切 | 白名单代理；Kimi 默认**直连**（`proxyKimi: true` 才走代理）。`auth.kimi.com` ≠ `api.moonshot.cn` |\n| 想在 DSH 用 ChatGPT Plus / Claude Pro，又不想再买 API | 另开 OpenAI / Anthropic API-key | `codex-oauth` / `claude-code-oauth` 本地 OAuth，与现有 `openai` / `kimi-coding` API-key 路由共存 |\n\n## 支持的供应商\n\n| 供应商 | 路由 | 认证 | 与现有 API-key 路由共存 |\n|---|---|---|---|\n| **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |\n| **OpenAI Codex** | `codex-oauth` · 可选 `codex-oauth-fast` | ChatGPT Plus/Pro OAuth | `openai` |\n| **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |\n| **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | — |\n| **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | — |\n\n> Grok Build 的 device 登录、动态 `/v1/models-v2` 目录与 Responses 流式推理已在实机上验证。Codex/Kimi/Claude 复用 `@earendil-works/pi-ai` 的 provider-native OAuth/刷新协议，不重新实现各供应商流程。\n\n## 🚀 快速开始\n\n```bash\n# 1. 安装当前 npm 发布版到 web profile\ndsh plugin --profile web add @aeven-ai/dsh-subscription-auth@0.7.0\n\n# 2. 可选 —— Google Antigravity（固定审核过的版本）\ndsh plugin --profile web add dsh-agy@0.1.2\n\n# 3. 使用本机实际配置的进程管理器重启现有 DSH Web 进程\n# 官方 `dsh web` 是启动 web profile 的 CLI 别名，不是服务单元名。\n```\n\n然后打开 **设置 → 编码 OAuth** 登录任一供应商即可。选择器会自动列出已认证的模型。\n\n## 📚 目录\n\n- [项目更名](#项目更名)\n- [特性](#-特性)\n- [本插件解决的接入问题](#本插件解决的接入问题)\n- [支持的供应商](#支持的供应商)\n- [快速开始](#-快速开始)\n- [安装](#安装)\n- [设置页](#设置页)\n- [可选能力](#可选能力)\n- [本地 API 网关](#本地-api-网关)\n- [CLI](#cli)\n- [Kimi 中国说明](#kimi-中国说明)\n- [网络代理](#网络代理)\n- [弹性重试](#弹性重试)\n- [凭据](#凭据)\n- [架构](#架构)\n- [技术方案](#技术方案)\n- [合规](#合规)\n- [文档](#文档)\n- [相关项目](#相关项目)\n- [贡献](#贡献)\n- [许可证](#许可证)\n\n## 安装\n\n需要 DeepSeek Harness `0.1.1-rc.2` 与 Node.js 22.19+。完整细节见[安装说明](INSTALL.md)。\n\n```bash\n# 当前 npm 版本\ndsh plugin --profile web add @aeven-ai/dsh-subscription-auth@0.7.0\n\n# 开发 / 备用：从 GitHub 安装\ndsh plugin --profile web add github:Aeven-AI/dsh-subscription-auth\n\n# 本地开发目录（备用）\n# dsh plugin --profile web add ./@aeven-ai/dsh-subscription-auth\n```\n\n安装后重启现有 DSH Web 进程。维护者可在源码 checkout 中对实际部署做验证（npm 安装不包含这些脚本）：\n\n```bash\npnpm run verify:deployed            # 核对真实 /api/llm.models 与 OAuth 状态\nDSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed   # 已登录 Google 时\n\nDSH_RESTORE_PROVIDER=openai \\\nDSH_RESTORE_MODEL=gpt-5.6-sol \\\nDSH_RESTORE_REASONING=max \\\npnpm run smoke:deployed             # 真实 Codex/Kimi tool-call + 第二个用户 turn 回放\n```\n\n> `smoke:deployed` 会创建临时会话、分别测试 Codex/Kimi 工具调用与第二个用户 turn（覆盖 `INVALID_REPLAY_STATE` 回归），恢复显式指定的默认模型后归档测试会话。\n\n## 设置页\n\n打开 **设置 → 编码 OAuth**。页面采用分段标签：**Accounts**、**Gateway**、**Capabilities**、**About**，并带有实时状态提示、语义化徽章与骨架屏加载。远程（非 loopback）主机上，Accounts 会优先设备码登录，并把嘈杂的 CLI 缺失提示收成一条；已登录供应商卡片默认折叠，展开后可搜索/筛选模型、查看配额进度条或使用 CLI 拉取；Gateway 提供 cURL / Python / IDE 快速配置片段，Capabilities 使用开关联动（含依赖项置灰）并显示 Imagine 状态。\n\nDSH Web 仍只绑定 loopback。远程 Settings 必须经 SSH 隧道，或经已完成属主认证的 HTTPS 反向代理。插件优先使用 DSH 原生 `ownerRequestPolicy`；fallback 同时要求真实可信 TCP peer、精确 HTTPS Origin/Host、同源 Fetch Metadata、代理注入的 owner proof，以及变更请求独立的 CSRF proof。`X-Forwarded-*` 不能授权，配置不完整会 fail closed。配置方法见 [INSTALL.md](INSTALL.md#安全访问远程-settings)。\n\n<table>\n  <tr>\n    <td align=\"center\" valign=\"top\" width=\"33%\">\n      <a href=\"media/zh-CN/settings_accounts.png\"><img src=\"media/zh-CN/settings_accounts.png\" alt=\"编码 OAuth · Accounts 标签\" width=\"280\" /></a><br />\n      <sub>Accounts</sub>\n    </td>\n    <td align=\"center\" valign=\"top\" width=\"33%\">\n      <a href=\"media/zh-CN/settings_gateway.png\"><img src=\"media/zh-CN/settings_gateway.png\" alt=\"编码 OAuth · Gateway 标签\" width=\"280\" /></a><br />\n      <sub>Gateway</sub>\n    </td>\n    <td align=\"center\" valign=\"top\" width=\"33%\">\n      <a href=\"media/zh-CN/settings_capabilities.png\"><img src=\"media/zh-CN/settings_capabilities.png\" alt=\"编码 OAuth · Capabilities 标签\" width=\"280\" /></a><br />\n      <sub>Capabilities</sub>\n    </td>\n  </tr>\n</table>\n\n| 供应商 | 方式 |\n|---|---|\n| Grok | 授权码 · 设备码 · 模型勾选 |\n| Codex | 设备码（推荐远程 DSH）· 浏览器 PKCE |\n| Kimi | 设备码 |\n| Claude | 浏览器 PKCE（远程浏览器可粘贴完整 localhost redirect URL） |\n| Antigravity | `dsh-agy` 安装状态 + profile-local CLI 命令 |\n\nDSH 主机在远端时优先使用设备码。浏览器/PKCE 登录会打开供应商页面；如果 localhost 回调无法到达这台 DSH 主机，可把返回的授权 code 或完整 redirect URL 粘贴到等待中的设置卡片。\n\n设置页还会**只读发现**白名单内的官方 Grok / Codex / Kimi / Claude CLI OAuth 文件。同步是显式的单向**拉取**，不是自动导入：发现 → 预览 → 冲突/指纹核对 → 确认覆盖。官方 CLI 文件从不被写入。读取会拒绝符号链接、非普通文件、非属主文件、组/其他人可读，以及超大文档（`O_NOFOLLOW`）。预览票据一次性、五分钟过期、最多 32 张。\n\n选择器只列出已认证的路由；未登录供应商返回空列表。供应商名称统一带 `(OAuth)`，登录或登出后通过 `llm/adapters-updated` 刷新目录。\n\n## 可选能力\n\n八项开关默认全部**关闭**，打开后**立即生效**（无需重启）：`codexSearch`、`codexImages`、`codexImageEdits`、`codexImagesAnyModel`、`codexUsage`、`codexFast`、`grokImagineImage`、`grokImagineVideo`。`codexImagesAnyModel` 仅放宽调用模型路由限制；仍要求已登录 Codex、开启 `codexImages`（编辑还需 edits 开关），并保留当前会话附件归属和编辑授权检查。数值控制为 `searchResults`（1–20，默认 5）、`imageCount`（1–4，默认 1）、`videoArtifactTtlMs`（1 小时–7 天，默认 7 天；界面以 1–168 小时显示）。降低视频保留时间会立即缩短并清理已有产物；提高只影响之后生成的产物。管理员也可在插件配置的 `capabilities` 下提供不含秘密的 composition 默认值；`coding-subscription-oauth` 设置区中的用户值会覆盖这层 base，省略时所有开关仍保持关闭。\n\n`codex-oauth-fast` 仅在**最新一次 live catalog** 标明至少有一个 `priority` 可用模型后才会出现。请求会发送 `service_tier: priority` 和路由提示。界面写的是 **已请求 Fast**，不保证延迟，也不保证上游会兑现。\n\nCodex 搜索、用量和图像是**需显式打开**的私有 `chatgpt.com/backend-api` 端点。图像生成固定使用 `gpt-image-2`。图像编辑只接受当前会话顶层、且由本会话持有的附件 id。\n\nGrok Imagine 只走官方 `https://api.x.ai`，模型为 `grok-imagine-image-2.0` 与 `grok-imagine-video-1.5`。凭据是独立的 DSH 凭据引用 `XAI_API_KEY`——不用 Grok OAuth，也不回退到进程环境变量。生成结果在 MIME / 大小 / 超时 / 重定向 / DNS 控制下，仅从冻结主机 `imgen.x.ai`、`videogen.x.ai`、`vidgen.x.ai` 下载，存入私有产物库（单件与唯一对象总量均硬限 256 MiB，最长七天），并只通过同源 loopback 路由提供。\n\n## 本地 API 网关\n\n默认**关闭**。启用后会在 `127.0.0.1:18080` 启动独立的 `node:http` 服务（不占用 DSH web 端口），复用已经登录的 OAuth 会话：\n\n```yaml\ngateway:\n  enabled: false\n  bind: 127.0.0.1\n  port: 18080\n```\n\n端点：`GET /healthz`、`GET /v1/models`、`POST /v1/chat/completions`、`POST /v1/responses`、`POST /v1/messages`。Bearer key 保存在 `$DSH_HOME/.coding-oauth-gateway.json`（`0600`）。\n\n在 **Gateway** 标签中，可以复制 OpenAI base URL（例如 `http://127.0.0.1:18080/v1`）、Anthropic base URL，或直接复制当前 Bearer key，不必轮换；密钥显示仅限 loopback，且不会写入浏览器存储；轮换 key 前必须确认。监听端口可直接 **Apply/确定**，也可用 **Random/随机** 填充（`18100`–`18999`）；选定端口会持久化到属主专用的网关文档，运行中的监听器会重新绑定。bind 仍只能写在 YAML 中；非 loopback bind 必须配置 key。这不是远程中继。\n\n## CLI\n\n```bash\n# `dsh-grok-build` 仍是同一命令的别名\ndsh-coding-oauth login [--pkce] | import | status | logout\n\n# 新供应商\ndsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude\ndsh-coding-oauth status all\ndsh-coding-oauth logout codex\n\n# Antigravity（先安装到 web profile）\ndsh plugin --profile web exec dsh-agy login --headless\n```\n\n> `dsh-agy` CLI 在 DSH 进程外修改账号池，无法发送进程内 catalog event——登录或登出后关闭并重新打开模型选择器即可。\n\n## Kimi 中国说明\n\nKimi Code 订阅 OAuth 使用 `https://auth.kimi.com`；推理使用 `https://api.kimi.com/coding`。`https://api.moonshot.cn/v1` 是按量付费的 **Moonshot Open Platform** API-key 通道——不存在可切换的“中国 OAuth endpoint”。本插件使用独立的 `kimi-code-oauth` 路由，不影响已有 `kimi-coding` API-key 配置。\n\n## 网络代理\n\n优先级：`config.proxy` → `CODING_OAUTH_PROXY` → `GROK_BUILD_PROXY` → `HTTPS_PROXY`/`HTTP_PROXY`。\n\n```yaml\n- id: llm-grok-build-oauth\n  config:\n    proxy: http://127.0.0.1:7890\n    proxyKimi: false\n```\n\n插件只代理审核过的订阅域名（xAI/Grok、OpenAI Codex、Claude/Anthropic、Google Antigravity）；其余 DSH 流量保持原 dispatcher。Kimi 默认直连，仅当 `proxyKimi: true` 时才进入代理。\n\n## 弹性重试\n\nOAuth access token 会在本地记录过期时间前 **5 分钟**主动刷新（pi-ai 0.84+），避免请求踩到令牌寿命的最后几秒。若服务端仍以 401/403 拒绝一个本地尚未过期的令牌（服务端提前吊销或时钟偏差），插件会把凭据的 `expires` 回写到过去，重试的 step 会先刷新再发请求——用户无感知自愈，而不是本轮直接失败。\n\n请求重试走 harness 的 retry 策略：瞬时故障（`RATE_LIMIT`/`SERVER`/`TIMEOUT`/`TRANSPORT`/`EMPTY_RESPONSE`）**以及 `AUTH`** 会按指数退避重试（默认 5 次，5 s → 10 s → 20 s → 40 s → 80 s，约 155 s 叠加时常，10% jitter）。xAI「at capacity / high demand / priority processing」等文案会在 finish 管道重映射为 `RATE_LIMIT`，从而进入该策略（上游 `error.code: null` 时 pi-ai 会标成 `PI_AI_ERROR`）。配额耗尽和 refresh token 失效**不**重试——会立刻给出真实错误和重新登录提示。部署级覆盖：\n\n```yaml\n- id: llm-grok-build-oauth\n  config:\n    retryPolicy:\n      mode: normal\n      maxRetries: 5\n      retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]\n      backoff: { initialDelayMs: 5000, maxDelayMs: 80000, jitterRatio: 0.1 }\n```\n\n## 凭据\n\nowner-only `0600`、原子写、跨进程文件锁：\n\n- `$DSH_HOME/.grok-build-auth.json`\n- `$DSH_HOME/.codex-oauth-auth.json`\n- `$DSH_HOME/.kimi-code-oauth-auth.json`\n- `$DSH_HOME/.claude-code-oauth-auth.json`\n\n勾选/目录缓存使用对应的 `*-models.json` 文件。Grok Imagine 使用独立的 DSH 凭据名 `XAI_API_KEY`（不是 Grok OAuth 文件）。**任何 HTTP 状态、日志或 UI 都不得返回 token。**\n\n## 架构\n\n```mermaid\nflowchart LR\n    subgraph DSH[\"DSH Harness\"]\n        UI[设置 / Web · 编码 OAuth] --> LLM[llm route]\n        LLM --> ALIA[路由别名适配器]\n    end\n    ALIA --> PI[pi-ai 原生 provider<br/>OAuth · 刷新 · 流式]\n    PI --> GROK[Grok Build]\n    PI --> COD[Codex]\n    PI --> KIMI[Kimi]\n    PI --> CLAU[Claude]\n    AGY[dsh-agy 插件] --> GAL[Google Antigravity]\n```\n\n## 技术方案\n\n- **Grok Build**：`cli-chat-proxy.grok.com/v1` 的 Responses API（不是 `api.x.ai`）、CLI 指纹头、live `/v1/models-v2`（含 grok-4.6 的 `reasoning.effort: xhigh`）。\n- **Codex/Kimi/Claude**：pi-ai 原生 provider 负责 OAuth 与刷新；路由别名适配器映射到原生 id，避免多轮 `INVALID_REPLAY_STATE`。\n- Kimi access token 显式转为 `Authorization: Bearer`——绝不会误发成 Anthropic `x-api-key`。\n- **Codex Fast / 私有端点**：`codex-oauth-fast` 需显式打开，目录过期则失败关闭；搜索、用量和 `gpt-image-2` 图像默认关闭。\n- **Grok Imagine**：只走官方 `api.x.ai`，`XAI_API_KEY` 通过 DSH 凭据解析，下载路由为同源 `/plugins/dsh-grok-build/imagine/*`。\n- Google Antigravity **不**在本项目逆向，使用固定版本的专用 DSH 插件。\n\n## 合规\n\n通过第三方 harness 使用编码订阅可能处于各供应商服务条款灰色地带，并可能触发配额、地区或账号风控。**仅使用自己的账号**；本项目不支持批量账号、额度转售、远程 relay、付费墙绕过或客户端伪装。商用优先选择官方 API-key 通道。\n\n## 文档\n\n| 文档 | 用途 |\n|---|---|\n| [`INSTALL.md`](INSTALL.md) | 安装与使用细节 |\n| [`CHANGELOG.md`](CHANGELOG.md) | 版本历史 |\n| [`docs/00-project-rules.md`](docs/00-project-rules.md) | 版本、发版循环、公开层与本地内参分层 |\n| [`docs/02-architecture.md`](docs/02-architecture.md) | 内部架构（路由、数据流、模块、API）· [中文](docs/02-architecture.zh-CN.md) |\n| [`CONTRIBUTING.md`](CONTRIBUTING.md) | 贡献指南 |\n\n## 相关项目\n\n- [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) —— 用于 Google Antigravity 的独立固定版本插件。\n\n## 贡献\n\n欢迎各类贡献——功能、文档、翻译、Bug 反馈。流程、提交规范与发版循环见 **[CONTRIBUTING](CONTRIBUTING.md)**。若你的语言不在列表中，欢迎 PR 一份 README 翻译，我们会加入上方语言表。\n\n## 许可证\n\n[Apache-2.0](LICENSE) · 参见 [NOTICE](NOTICE)。部分代码派生自 [dsh-xai](https://github.com/MirDie/dsh-xai) 项目（Apache-2.0）。\n","readmeFilename":"README.zh-CN.md","_rev":"1-e588fee7db66118273b713a4f509f402"}