# dockyard-dsh

> 把 Codex、Antigravity、Grok、Claude、Cursor 五个官方 OAuth 接入 DSH,统一账号池与实时额度。

## Metadata

- Author: [@AITabby](https://github.com/AITabby)
- Repo: <https://github.com/AITabby/dockyard-dsh.git>
- GitHub: [AITabby/dockyard-dsh](https://github.com/AITabby/dockyard-dsh)
- Stars: 73
- Language: JavaScript
- License: [MIT](https://spdx.org/licenses/MIT.html)
- Topics: `account-pool`, `deepseek-harness`, `dsh-plugin`, `macos`, `oauth`
- Forks: 7
- Open Issues: 1
- Last push: 2026-08-17T20:19:56.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:AITabby/dockyard-dsh
```

## Wiki

## 一句话定位
dockyard-dsh 是 DeepSeek Harness 的官方 OAuth 账号池插件,把 Codex、Antigravity、Grok、Claude、Cursor 五个官方浏览器授权、本机会话和原生请求链路整合到同一个共享 runtime,让 DSH 用户在聊天时按账号选择策略使用这些官方账号。

## 核心能力
- 接入 Codex、Antigravity、Grok、Claude、Cursor 五个官方 provider,提供统一的账号发现、登录和授权
- 通过 `/dockyard` 命令管理账号、查询实时额度、设置选择策略、手动切换默认账号
- 支持账号池策略:manual / sticky_session / round_robin / failover,跨账号轮换和故障转移
- 读取每个 provider 官方的实时模型目录、推理档位、订阅/额度和到期时间
- 提供 provider-native 请求链路(原生 Responses、Gemini SSE、Grok streaming 等),不走 DSH 之外的代理网关
- 提供本地 DMG 应用形态,在 macOS 双击即可启动内嵌的 DSH web profile

## 技术实现
- **语言**: JavaScript (ESM `.mjs`) + TypeScript 风格 JSDoc;含一份 Python PTY 辅助脚本(给 Antigravity CLI 套一个伪 TTY)
- **关键依赖**: `@deepseek-ai/dsh-llm-pi-ai` (Codex 走 pi-ai 适配) / `@deepseek-ai/dsh-api-remotes` / `@deepseek-ai/dsh-typert-protocol` / `@earendil-works/pi-ai` / `zod`(运行时 Schema 校验)
- **架构模式**: Cordis plugin + 自有 `DockyardRuntime`,通过 `cordis.patch.yml` 把自身 bundle 注入 DSH,再注入 llm/commands/credentials/settings 四个服务面;同时通过 `DshInjectionBridge` 把每个 provider 注册成 DSH route
- **入口文件**: `packages/dsh-plugin/src/index.mjs`(开发源);`packages/dsh-plugin/dist/index.mjs`(运行时构建产物);同时输出浏览器侧 `lib/client.js`

## 适用场景
普通 DSH 用户经常要在多个官方 AI 服务之间切换,而每个服务都有自己的登录态、额度和模型目录。dockyard-dsh 把这些账号统一纳入 DSH 的同一个账号池,让你在一个对话里按账号策略自动选择可用账号,直接看每个账号的实时剩余额度和订阅状态,而不必为每个 provider 各开一个客户端。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness (DSH) | 0.1.0-rc.6 | bundle 内 DSH 包固定到 `^0.1.0-rc.6`;安装命令要求 `--profile web` |
| Node.js | ^22.19.0 或 >=24.0.0 | `engines.node` 直接声明;DSH 上游同步要求 |
| DSH profile | web | 必须装到 DSH 自带的 web profile 才会有 GUI |
| macOS 凭据 | macOS(完整功能) | 凭据默认走 macOS Keychain + Swift helper;非 macOS 默认凭据存储 fail closed |
| Python3 + pty | 可选 | 仅 Antigravity CLI fallback 路径使用,可由 `DOCKYARD_ANTIGRAVITY_PTY_PYTHON` 覆盖 |

## 安装方式
```bash
dsh plugin --profile web add github:AITabby/dockyard-dsh
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `DOCKYARD_DSH_HOME` | 环境变量 | 覆盖状态文件目录,默认 `~/.dockyard-dsh` | 未设置 |
| `DOCKYARD_DSH_REFRESH_INTERVAL_MS` | 环境变量 | 后台定时刷新额度的间隔(毫秒) | 300000(5 分钟) |
| `DOCKYARD_DSH_REFRESH_TIMEOUT_MS` | 环境变量 | 单次账号刷新的超时阈值(毫秒) | 15000(15 秒) |
| `DOCKYARD_DSH_CLI_PATH` | 环境变量 | 覆盖 provider 通用 CLI 路径 | 未设置 |
| `DOCKYARD_ANTIGRAVITY_CLIENT_ID` / `DOCKYARD_ANTIGRAVITY_CLIENT_SECRET` | 环境变量 | Antigravity Google loopback OAuth 凭据;不提供则浏览器授权无法启动 | 未设置 |
| `DOCKYARD_ANTIGRAVITY_CLI` / `DOCKYARD_ANTIGRAVITY_PTY_PYTHON` / `DOCKYARD_ANTIGRAVITY_PROJECT` / `DOCKYARD_ANTIGRAVITY_ENDPOINT` / `DOCKYARD_ANTIGRAVITY_QUOTA_ENDPOINT` / `DOCKYARD_ANTIGRAVITY_USER_AGENT` / `DOCKYARD_ANTIGRAVITY_CATALOG_TTL_MS` / `DOCKYARD_ANTIGRAVITY_OAUTH_SCOPE` | 环境变量 | Antigravity provider 内部 endpoint、UA、目录缓存 TTL、CLI 与 PTY Python 路径 | 各 provider 内部默认值 |
| `DOCKYARD_GROK_CLI` / `DOCKYARD_GROK_ENDPOINT` / `DOCKYARD_GROK_USER_AGENT` / `DOCKYARD_GROK_CATALOG_TTL_MS` | 环境变量 | Grok provider 内部 endpoint、UA、目录缓存 TTL、CLI 路径 | 各 provider 内部默认值 |
| `DOCKYARD_CURSOR_CLI` / `DOCKYARD_CURSOR_ENDPOINT` / `CURSOR_API_BASE_URL` | 环境变量 | Cursor provider 内部 endpoint、CLI 路径、API base | 各 provider 内部默认值 |

## 常见问题
**Q: dockyard-dsh 是给 DSH 加新模型 API 还是给 DSH 加账号池?**

A: 加账号池。它把多个官方 OAuth 官方客户端会话接到同一个共享 runtime,在 DSH 内部按账号选择策略请求,不会替换 DSH 自带的核心。

**Q: 安装到哪个 DSH profile 才会有 GUI?**

A: 安装到 DSH 自带的 web profile 才能看到 Dockyard 提供的账号/额度界面;新建空 profile 不会启动 Web GUI。

**Q: Antigravity 浏览器授权为什么报缺 client 信息?**

A: Antigravity 用的是 Google loopback OAuth,需要 `DOCKYARD_ANTIGRAVITY_CLIENT_ID` 和 `DOCKYARD_ANTIGRAVITY_CLIENT_SECRET`,这两个变量不在仓库里,需在启动 DSH 的 shell 里自己设置,不要提交。

**Q: macOS 以外的平台能用吗?**

A: DSH 本身是 web host,跨平台;但凭据默认存 macOS Keychain,在非 macOS 上默认凭据存储会 fail closed,需要宿主 DSH Credentials 服务接管,否则 token 无法持久化。Windows EXE 已经在构建但仓库自述中尚未验证发布资产。

**Q: 数据保存在哪里,卸载是否干净?**

A: 账号策略与账号元数据写到 `~/.dockyard-dsh/state.json`(可用 `DOCKYARD_DSH_HOME` 改路径),OAuth token 写在 macOS Keychain 服务 `com.dockyard-dsh.credentials` 或宿主 DSH Credentials。卸载后删除 `state.json` 与 Keychain 中该服务的条目即可彻底清理。

**Q: 怎么添加新账号?**

A: 在 DSH web 里用 `/dockyard login <provider>` 启动官方浏览器授权页;如果想导入本机已有的官方客户端登录态,先 `/dockyard scan <provider>` 再 `/dockyard add <provider>`,两者是独立操作,已有账号不会被 Add 静默重复导入。

**Q: 用哪种策略比较好?**

A: 单人单账号用 `manual`;多账号轮流用 `round_robin`;希望失败自动切换用 `failover`;同一会话里持续走同一个账号用 `sticky_session`。可用 `/dockyard policy <provider> <policy>` 在线切换。

## 上手难度
入门 — 安装一行命令就能用,默认就提供账号池、实时额度和模型目录;只有 Antigravity OAuth 这一个 provider 需要自己准备凭据,其余 provider 直接 `/dockyard login` 即可上手。

## 已知问题与限制
- DSH 上游目前仍是 developer preview,版本升级可能引入 breaking change,bundle 已锁到 `@deepseek-ai/dsh@0.1.0-rc.6`
- 各个 provider 的官方 CLI、客户端路径、OAuth 返回字段、额度接口都可能变化,字段缺失时 dockyard-dsh 会保持 `unknown`/`null`,不会伪造
- Windows EXE 在 README 中标注"已完成构建但仍在上传/验证中",未验证前不要用于生产
- macOS 是完整凭据持久化平台;非 macOS 上默认的 `UnavailableSecretStore` 在写入时会显式抛错,不会静默退回不安全存储(若不接宿主 DSH Credentials,token 不能保存)
- Antigravity 的官方 CLI 检测需要真实 TTY,内部会通过 Python `pty` 模块套一个伪终端;该路径要求 Python3 + `pty` 模块可用,可通过 `DOCKYARD_ANTIGRAVITY_PTY_PYTHON` 指定其他 Python

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dockyard-dsh](https://deepseek-plugin.org/plugins/AITabby/dockyard-dsh)
Wiki generated by AI (model: `MiniMax-M3`)
