dsh-coding-subscription-oauth 0.5.0

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.
Files changed (178) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/CONTRIBUTING.md +109 -0
  3. package/INSTALL.md +220 -0
  4. package/LICENSE +19 -0
  5. package/NOTICE +11 -0
  6. package/README.de.md +254 -0
  7. package/README.es.md +254 -0
  8. package/README.fr.md +254 -0
  9. package/README.ja.md +254 -0
  10. package/README.ko.md +254 -0
  11. package/README.md +286 -0
  12. package/README.pt-BR.md +254 -0
  13. package/README.ru.md +254 -0
  14. package/README.zh-CN.md +271 -0
  15. package/cordis.patch.yml +13 -0
  16. package/docs/00-project-rules.md +195 -0
  17. package/docs/02-architecture.md +132 -0
  18. package/docs/02-architecture.zh-CN.md +128 -0
  19. package/lib/adapter.d.ts +24 -0
  20. package/lib/adapter.d.ts.map +1 -0
  21. package/lib/alias-adapter.d.ts +43 -0
  22. package/lib/alias-adapter.d.ts.map +1 -0
  23. package/lib/auth-routes.d.ts +155 -0
  24. package/lib/auth-routes.d.ts.map +1 -0
  25. package/lib/auth.d.ts +29 -0
  26. package/lib/auth.d.ts.map +1 -0
  27. package/lib/bin.d.ts +6 -0
  28. package/lib/bin.d.ts.map +1 -0
  29. package/lib/bin.js +27591 -0
  30. package/lib/bin.js.map +7 -0
  31. package/lib/capability-routes.d.ts +43 -0
  32. package/lib/capability-routes.d.ts.map +1 -0
  33. package/lib/capability-runtime.d.ts +56 -0
  34. package/lib/capability-runtime.d.ts.map +1 -0
  35. package/lib/capability-settings.d.ts +263 -0
  36. package/lib/capability-settings.d.ts.map +1 -0
  37. package/lib/capability-tools.d.ts +50 -0
  38. package/lib/capability-tools.d.ts.map +1 -0
  39. package/lib/catalog.d.ts +53 -0
  40. package/lib/catalog.d.ts.map +1 -0
  41. package/lib/client.js +3 -0
  42. package/lib/client.js.map +7 -0
  43. package/lib/codex-http.d.ts +77 -0
  44. package/lib/codex-http.d.ts.map +1 -0
  45. package/lib/codex-images.d.ts +109 -0
  46. package/lib/codex-images.d.ts.map +1 -0
  47. package/lib/codex-model-capabilities.d.ts +112 -0
  48. package/lib/codex-model-capabilities.d.ts.map +1 -0
  49. package/lib/codex-search.d.ts +96 -0
  50. package/lib/codex-search.d.ts.map +1 -0
  51. package/lib/codex-usage.d.ts +79 -0
  52. package/lib/codex-usage.d.ts.map +1 -0
  53. package/lib/gateway-anthropic-messages.d.ts +8 -0
  54. package/lib/gateway-anthropic-messages.d.ts.map +1 -0
  55. package/lib/gateway-auth.d.ts +22 -0
  56. package/lib/gateway-auth.d.ts.map +1 -0
  57. package/lib/gateway-backend.d.ts +62 -0
  58. package/lib/gateway-backend.d.ts.map +1 -0
  59. package/lib/gateway-body.d.ts +9 -0
  60. package/lib/gateway-body.d.ts.map +1 -0
  61. package/lib/gateway-config.d.ts +24 -0
  62. package/lib/gateway-config.d.ts.map +1 -0
  63. package/lib/gateway-http.d.ts +16 -0
  64. package/lib/gateway-http.d.ts.map +1 -0
  65. package/lib/gateway-openai-chat.d.ts +8 -0
  66. package/lib/gateway-openai-chat.d.ts.map +1 -0
  67. package/lib/gateway-openai-responses.d.ts +8 -0
  68. package/lib/gateway-openai-responses.d.ts.map +1 -0
  69. package/lib/gateway-parse.d.ts +10 -0
  70. package/lib/gateway-parse.d.ts.map +1 -0
  71. package/lib/gateway-protocol.d.ts +47 -0
  72. package/lib/gateway-protocol.d.ts.map +1 -0
  73. package/lib/gateway-routes.d.ts +21 -0
  74. package/lib/gateway-routes.d.ts.map +1 -0
  75. package/lib/gateway.d.ts +48 -0
  76. package/lib/gateway.d.ts.map +1 -0
  77. package/lib/grok-imagine.d.ts +271 -0
  78. package/lib/grok-imagine.d.ts.map +1 -0
  79. package/lib/grok-import.d.ts +21 -0
  80. package/lib/grok-import.d.ts.map +1 -0
  81. package/lib/http-json.d.ts +10 -0
  82. package/lib/http-json.d.ts.map +1 -0
  83. package/lib/ids.d.ts +33 -0
  84. package/lib/ids.d.ts.map +1 -0
  85. package/lib/imagine-routes.d.ts +59 -0
  86. package/lib/imagine-routes.d.ts.map +1 -0
  87. package/lib/index.d.ts +69 -0
  88. package/lib/index.d.ts.map +1 -0
  89. package/lib/index.js +35355 -0
  90. package/lib/index.js.map +7 -0
  91. package/lib/invariant.d.ts +9 -0
  92. package/lib/invariant.d.ts.map +1 -0
  93. package/lib/invariant.js +14 -0
  94. package/lib/invariant.js.map +7 -0
  95. package/lib/kimi-errors.d.ts +13 -0
  96. package/lib/kimi-errors.d.ts.map +1 -0
  97. package/lib/media-store.d.ts +130 -0
  98. package/lib/media-store.d.ts.map +1 -0
  99. package/lib/oauth-import-routes.d.ts +52 -0
  100. package/lib/oauth-import-routes.d.ts.map +1 -0
  101. package/lib/oauth-providers.d.ts +26 -0
  102. package/lib/oauth-providers.d.ts.map +1 -0
  103. package/lib/oauth-session.d.ts +40 -0
  104. package/lib/oauth-session.d.ts.map +1 -0
  105. package/lib/oauth-sources.d.ts +205 -0
  106. package/lib/oauth-sources.d.ts.map +1 -0
  107. package/lib/oauth.d.ts +79 -0
  108. package/lib/oauth.d.ts.map +1 -0
  109. package/lib/provider.d.ts +38 -0
  110. package/lib/provider.d.ts.map +1 -0
  111. package/lib/proxy.d.ts +17 -0
  112. package/lib/proxy.d.ts.map +1 -0
  113. package/lib/redact.d.ts +5 -0
  114. package/lib/redact.d.ts.map +1 -0
  115. package/lib/session.d.ts +40 -0
  116. package/lib/session.d.ts.map +1 -0
  117. package/lib/store.d.ts +46 -0
  118. package/lib/store.d.ts.map +1 -0
  119. package/lib/web-origin.d.ts +10 -0
  120. package/lib/web-origin.d.ts.map +1 -0
  121. package/lib/web-routes.d.ts +20 -0
  122. package/lib/web-routes.d.ts.map +1 -0
  123. package/package.json +185 -0
  124. package/patches/dsh-agy@0.1.2.patch +25 -0
  125. package/scripts/release.mjs +166 -0
  126. package/scripts/smoke-deployed-routes.mjs +146 -0
  127. package/scripts/verify-deployed-catalog.mjs +87 -0
  128. package/src/adapter.ts +282 -0
  129. package/src/alias-adapter.ts +152 -0
  130. package/src/auth-routes.ts +871 -0
  131. package/src/auth.ts +67 -0
  132. package/src/bin.ts +350 -0
  133. package/src/capability-routes.ts +275 -0
  134. package/src/capability-runtime.ts +313 -0
  135. package/src/capability-settings.ts +657 -0
  136. package/src/capability-tools.ts +666 -0
  137. package/src/catalog.ts +271 -0
  138. package/src/client/GrokBuildSettings.tsx +2221 -0
  139. package/src/client/index.tsx +37 -0
  140. package/src/client/locales.ts +421 -0
  141. package/src/codex-http.ts +447 -0
  142. package/src/codex-images.ts +485 -0
  143. package/src/codex-model-capabilities.ts +320 -0
  144. package/src/codex-search.ts +245 -0
  145. package/src/codex-usage.ts +263 -0
  146. package/src/gateway-anthropic-messages.ts +84 -0
  147. package/src/gateway-auth.ts +100 -0
  148. package/src/gateway-backend.ts +274 -0
  149. package/src/gateway-body.ts +49 -0
  150. package/src/gateway-config.ts +76 -0
  151. package/src/gateway-http.ts +104 -0
  152. package/src/gateway-openai-chat.ts +124 -0
  153. package/src/gateway-openai-responses.ts +53 -0
  154. package/src/gateway-parse.ts +224 -0
  155. package/src/gateway-protocol.ts +52 -0
  156. package/src/gateway-routes.ts +152 -0
  157. package/src/gateway.ts +242 -0
  158. package/src/grok-imagine.ts +1627 -0
  159. package/src/grok-import.ts +151 -0
  160. package/src/http-json.ts +82 -0
  161. package/src/ids.ts +45 -0
  162. package/src/imagine-routes.ts +461 -0
  163. package/src/index.ts +598 -0
  164. package/src/invariant.ts +17 -0
  165. package/src/kimi-errors.ts +26 -0
  166. package/src/media-store.ts +927 -0
  167. package/src/oauth-import-routes.ts +314 -0
  168. package/src/oauth-providers.ts +152 -0
  169. package/src/oauth-session.ts +183 -0
  170. package/src/oauth-sources.ts +1104 -0
  171. package/src/oauth.ts +620 -0
  172. package/src/provider.ts +128 -0
  173. package/src/proxy.ts +99 -0
  174. package/src/redact.ts +72 -0
  175. package/src/session.ts +218 -0
  176. package/src/store.ts +217 -0
  177. package/src/web-origin.ts +60 -0
  178. package/src/web-routes.ts +75 -0
@@ -0,0 +1,254 @@
1
+
2
+ <!-- banner -->
3
+ <div align="center">
4
+
5
+ # 🔐 dsh-coding-subscription-oauth
6
+
7
+ **v0.5.0** · antigo `dsh-grok-build`
8
+
9
+ **Plugin de OAuth para assinaturas de codificação do [DeepSeek Harness](https://github.com/deepseek-ai/dsh).** Entre com as assinaturas que você já paga — depois use os modelos delas a partir da página de configurações do dsh ou da CLI. **Nenhum token colado no chat.**
10
+
11
+ [![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE)
12
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
13
+
14
+ *[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)*
15
+
16
+ </div>
17
+
18
+ ---
19
+
20
+ ## Mudança de nome
21
+
22
+ O projeto começou como **`dsh-grok-build`** (só Grok Build). Agora cobre SuperGrok / Codex / Kimi / Claude / Antigravity.
23
+
24
+ | | Use isto | Ainda funciona |
25
+ |---|---|---|
26
+ | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build` (mesmo `main`) |
27
+ | npm | Ainda não publicado; instale pelo GitHub | Nenhum pacote npm legado foi publicado |
28
+ | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
29
+ | Cordis plugin id | `llm-grok-build-oauth` | inalterado |
30
+ | API HTTP das configurações | `/plugins/dsh-grok-build/*` | inalterado |
31
+ | Arquivos de credenciais | `$DSH_HOME/.grok-build-auth.json` e os outros `*-oauth-auth.json` | inalterado |
32
+
33
+ ## ✨ Recursos
34
+
35
+ - 🧾 **Traga sua própria assinatura** — use os planos de codificação que você já paga em vez de chaves de API separadas.
36
+ - 🔑 **OAuth local, sem colar chave** — autorize na página de configurações ou na CLI; os tokens nunca entram no chat.
37
+ - 🧩 **Um plugin, cinco provedores** — Grok Build, Codex, Kimi, Claude e Google Antigravity.
38
+ - 🛡️ **Seguro por design** — arquivos de credenciais com permissão somente-dono `0600`, escrita atômica, bloqueio de arquivo entre processos.
39
+ - ⚙️ **Catálogo dinâmico** — o seletor de modelos lista exatamente os provedores que você autenticou.
40
+ - 🌐 **Ciente de proxy** — faz proxy apenas de domínios de assinatura revisados e confiáveis.
41
+
42
+ ## Problemas de integração que este plugin resolve
43
+
44
+ Estas são as buscas e erros do DSH que costumam trazer as pessoas até aqui.
45
+
46
+ | Você buscou / viu | O que estava quebrado | O que o plugin faz |
47
+ |---|---|---|
48
+ | SuperGrok / X Premium no DSH, Grok Build vs `api.x.ai` | A rota `xai` é a API paga por uso. A assinatura de coding vai a `cli-chat-proxy.grok.com` | Rota `grok-build` + cabeçalhos de fingerprint da CLI (`X-XAI-Token-Auth` etc.) para evitar 403 silencioso |
49
+ | `API key is invalid` / `AUTH` | A GUI mapeia **todo** AUTH para esse texto. Muitas vezes o access token OAuth expirou | Refresh **5 min** antes do expiry; em 401 invalida o token e **repete o step** |
50
+ | `INVALID_REPLAY_STATE` no 2º turno Codex/Kimi | O replay ainda tinha o provider id nativo do pi-ai | Mantém o id da rota do Harness e repara replay antigo |
51
+ | grok-4.6 sem **xhigh** | `/v1/models-v2` já traz `reasoning_efforts`; clonar o template 4.5 esconde xhigh | Lê os efforts ao vivo. 4.6 tem xhigh; 4.5 fica low/medium/high |
52
+ | Kimi Code como `x-api-key` Anthropic | Token OAuth enviado como chave Anthropic | Só `Authorization: Bearer` |
53
+ | Modelos sem login ainda no seletor | Todas as rotas registradas apareciam | Rotas sem auth ficam vazias; nomes autenticados levam `(OAuth)` |
54
+ | PKCE em DSH remoto / headless | Não há como voltar ao `localhost` | Device-code para Grok/Codex/Kimi; Claude aceita a URL de redirect colada |
55
+ | Proxy libera Grok e quebra Kimi na China | Um `HTTPS_PROXY` global | Proxy só na allowlist; Kimi fica **direto** salvo `proxyKimi: true` |
56
+
57
+ ## Provedores suportados
58
+
59
+ | Provedor | Rota | Autenticação | Coexiste com |
60
+ |---|---|---|---|
61
+ | **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
62
+ | **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
63
+ | **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
64
+ | **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | — |
65
+ | **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | — |
66
+
67
+ > O login por dispositivo do Grok Build, o catálogo dinâmico `/v1/models-v2` e a inferência em streaming via Responses são verificados em implantações reais. Codex/Kimi/Claude reutilizam o OAuth/refresh nativo do provedor de `@earendil-works/pi-ai` em vez de reimplementar fluxos de cada fornecedor.
68
+
69
+ ## 🚀 Início rápido
70
+
71
+ ```bash
72
+ # 1. instale o plugin no perfil web
73
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
74
+
75
+ # 2. opcional — Google Antigravity (versão fixa revisada)
76
+ dsh plugin --profile web add dsh-agy@0.1.2
77
+
78
+ # 3. reinicie o serviço dsh web residente
79
+ systemctl --user restart dsh-web.service
80
+ ```
81
+
82
+ Depois abra **Settings → Coding OAuth** e faça login em qualquer provedor. Pronto — escolha seu modelo autenticado no seletor.
83
+
84
+ ## 📚 Sumário
85
+
86
+ - [Mudança de nome](#mudança-de-nome)
87
+ - [Problemas de integração que este plugin resolve](#problemas-de-integração-que-este-plugin-resolve)
88
+ - [Instalação](#instalação)
89
+ - [Página de configurações](#página-de-configurações)
90
+ - [CLI](#cli)
91
+ - [Kimi na China](#kimi-na-china)
92
+ - [Proxy de rede](#proxy-de-rede)
93
+ - [Resiliência](#resiliência)
94
+ - [Credenciais](#credenciais)
95
+ - [Arquitetura](#arquitetura)
96
+ - [Notas técnicas](#notas-técnicas)
97
+ - [Conformidade](#conformidade)
98
+ - [Documentação](#documentação)
99
+ - [Contribuição](#contribuição)
100
+ - [Licença](#licença)
101
+
102
+ ## Instalação
103
+
104
+ Requer DeepSeek Harness `0.1.0-rc.6+` e Node.js 22.19+. Detalhes completos nas [notas de instalação](INSTALL.md).
105
+
106
+ ```bash
107
+ # do GitHub
108
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
109
+
110
+ # ou um checkout local de desenvolvimento
111
+ dsh plugin --profile web add ./dsh-coding-subscription-oauth
112
+ ```
113
+
114
+ Reinicie o `dsh web` após instalar. Verificação contra uma implantação ao vivo:
115
+
116
+ ```bash
117
+ pnpm run verify:deployed # confere /api/llm.models real + estado OAuth
118
+ DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # se o Google estiver conectado
119
+
120
+ DSH_RESTORE_PROVIDER=openai \
121
+ DSH_RESTORE_MODEL=gpt-5.6-sol \
122
+ DSH_RESTORE_REASONING=max \
123
+ pnpm run smoke:deployed # chamadas reais Codex/Kimi + replay do segundo turn
124
+ ```
125
+
126
+ > O `smoke:deployed` cria uma sessão temporária, valida chamadas de ferramenta do Codex e do Kimi e um segundo turn do usuário (regressão de `INVALID_REPLAY_STATE`), restaura o modelo padrão declarado e depois arquiva a sessão.
127
+
128
+ ## Página de configurações
129
+
130
+ Abra **Settings → Coding OAuth**:
131
+
132
+ | Provedor | Métodos |
133
+ |---|---|
134
+ | Grok | código de autorização · código de dispositivo · importação via CLI Grok · seleção de modelos |
135
+ | Codex | código de dispositivo (recomendado em DSH remoto) · PKCE no navegador |
136
+ | Kimi | código de dispositivo |
137
+ | Claude | PKCE no navegador (um navegador remoto pode colar a URL completa de redirect localhost) |
138
+ | Antigravity | status de instalação do `dsh-agy` + comandos CLI local ao perfil |
139
+
140
+ O seletor lista apenas rotas que concluíram a autenticação; provedores não autenticados retornam lista vazia. Os nomes dos provedores recebem `(OAuth)` e o catálogo é atualizado via `llm/adapters-updated` após entrar/sair.
141
+
142
+ ## Capacidades opcionais
143
+
144
+ Os sete controles `codexSearch`, `codexImages`, `codexImageEdits`, `codexUsage`, `codexFast`, `grokImagineImage` e `grokImagineVideo` começam desativados e mudam ao vivo, sem reinício. Os limites são `searchResults` (1–20, padrão 5), `imageCount` (1–4, padrão 1) e `videoArtifactTtlMs` (1 hora–7 dias, padrão 7 dias; a interface mostra 1–168 horas). Reduzir a retenção encurta e limpa artefatos existentes imediatamente; aumentá-la vale apenas para novos artefatos.
145
+
146
+ ## CLI
147
+
148
+ ```bash
149
+ # `dsh-grok-build` continua sendo um alias
150
+ dsh-coding-oauth login [--pkce] | import | status | logout
151
+
152
+ # provedores mais recentes
153
+ dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
154
+ dsh-coding-oauth status all
155
+ dsh-coding-oauth logout codex
156
+
157
+ # Antigravity (instale no perfil web primeiro)
158
+ dsh plugin --profile web exec dsh-agy login --headless
159
+ ```
160
+
161
+ > A CLI do `dsh-agy` altera o pool de contas fora do processo DSH, então não consegue emitir um evento de catálogo no processo — feche e reabra o seletor de modelos após entrar/sair.
162
+
163
+ ## Kimi na China
164
+
165
+ O OAuth da assinatura do Kimi Code usa `https://auth.kimi.com`; a inferência usa `https://api.kimi.com/coding`. O `https://api.moonshot.cn/v1` é o canal de chave API de pagamento por uso do **Moonshot Open Platform** — não existe um "endpoint OAuth da China" alternável. Este plugin usa uma rota separada `kimi-code-oauth` e não afeta uma configuração `kimi-coding` por chave API existente.
166
+
167
+ ## Proxy de rede
168
+
169
+ Prioridade: `config.proxy` → `CODING_OAUTH_PROXY` → `GROK_BUILD_PROXY` → `HTTPS_PROXY`/`HTTP_PROXY`.
170
+
171
+ ```yaml
172
+ - id: llm-grok-build-oauth
173
+ config:
174
+ proxy: http://127.0.0.1:7890
175
+ proxyKimi: false
176
+ ```
177
+
178
+ Apenas domínios de assinatura revisados são usados via proxy (xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity); todo o restante do tráfego DSH mantém o dispatcher original. O Kimi fica direto por padrão e só usa o proxy quando `proxyKimi: true`.
179
+
180
+ ## Resiliência
181
+
182
+ Os tokens de acesso OAuth são renovados **cinco minutos** antes do vencimento armazenado (pi-ai 0.84+). Se o upstream ainda rejeitar um token localmente válido com 401/403, o plugin retrocede o `expires` gravado e o step repetido renova o token antes de reenviar.
183
+
184
+ As novas tentativas seguem a política do harness: falhas transitórias (`RATE_LIMIT`/`SERVER`/`TIMEOUT`/`TRANSPORT`/`EMPTY_RESPONSE`) **e `AUTH`** repetem com backoff exponencial (padrão: 2 tentativas, 500 ms → 10 s, 10% de jitter). Esgotamento de cota e refresh token morto **não** são repetidos. Sobrescrita por implantação:
185
+
186
+ ```yaml
187
+ - id: llm-grok-build-oauth
188
+ config:
189
+ retryPolicy:
190
+ mode: normal
191
+ maxRetries: 2
192
+ retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
193
+ backoff: { initialDelayMs: 500, maxDelayMs: 10000, jitterRatio: 0.1 }
194
+ ```
195
+
196
+ ## Credenciais
197
+
198
+ Somente-dono `0600`, escrita atômica, bloqueio de arquivo entre processos:
199
+
200
+ - `$DSH_HOME/.grok-build-auth.json`
201
+ - `$DSH_HOME/.codex-oauth-auth.json`
202
+ - `$DSH_HOME/.kimi-code-oauth-auth.json`
203
+ - `$DSH_HOME/.claude-code-oauth-auth.json`
204
+
205
+ Os caches de seleção ficam nos arquivos `*-models.json` correspondentes. **Nenhum status HTTP, log ou interface pode devolver um token.**
206
+
207
+ ## Arquitetura
208
+
209
+ ```mermaid
210
+ flowchart LR
211
+ subgraph DSH["DSH Harness"]
212
+ UI[Configurações / Web · Coding OAuth] --> LLM[llm route]
213
+ LLM --> ALIA[Adaptador de alias de rota]
214
+ end
215
+ ALIA --> PI[provedor nativo pi-ai<br/>OAuth · refresh · stream]
216
+ PI --> GROK[Grok Build]
217
+ PI --> COD[Codex]
218
+ PI --> KIMI[Kimi]
219
+ PI --> CLAU[Claude]
220
+ AGY[plugin dsh-agy] --> GAL[Google Antigravity]
221
+ ```
222
+
223
+ ## Notas técnicas
224
+
225
+ - **Grok Build**: provedor Responses personalizado em `cli-chat-proxy.grok.com/v1`, cabeçalhos de impressão digital da CLI, catálogo de modelos dinâmico.
226
+ - **Codex/Kimi/Claude**: provedores nativos do pi-ai cuidam do OAuth e do refresh; o adaptador de alias de rota os mapeia para os ids nativos enquanto a identidade do modelo permanece inalterada.
227
+ - O access token do Kimi é convertido explicitamente para `Authorization: Bearer` — nunca é enviado acidentalmente como `x-api-key` do Anthropic.
228
+ - O Google Antigravity **não** é engenharia reversa aqui; ele usa um plugin DSH dedicado com versão fixa.
229
+
230
+ ## Conformidade
231
+
232
+ Usar assinaturas de codificação por meio de um harness de terceiros pode estar em uma zona cinzenta dos termos de cada fornecedor e pode acionar controles de cota, regional ou de risco de conta. **Use apenas suas próprias contas**; este projeto não suporta contas em massa, revenda de cota, retransmissão remota, bypass de paywall ou personificação de cliente. Para uso comercial, prefira os canais oficiais de chave API dos fornecedores.
233
+
234
+ ## Documentação
235
+
236
+ | Documento | Propósito |
237
+ |---|---|
238
+ | [`INSTALL.md`](INSTALL.md) | Detalhes de instalação e uso |
239
+ | [`CHANGELOG.md`](CHANGELOG.md) | Histórico de versões |
240
+ | [`docs/00-project-rules.md`](docs/00-project-rules.md) | Versionamento, loop de release, divisão público/privado |
241
+ | [`docs/02-architecture.md`](docs/02-architecture.md) | Arquitetura interna (rotas, fluxo de dados, módulos, API) · [中文](docs/02-architecture.zh-CN.md) |
242
+ | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Guia de contribuição |
243
+
244
+ ## Relacionados
245
+
246
+ - [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) — plugin separado fixo para Google Antigravity.
247
+
248
+ ## Contribuição
249
+
250
+ Contribuições de todos os tipos são bem-vindas — recursos, documentação, traduções, relatórios de bug. Veja **[CONTRIBUTING](CONTRIBUTING.md)** para o fluxo, convenções de commit e o loop de release. Se o seu idioma não estiver listado, envie um PR com a tradução do README e o adicionaremos à tabela acima.
251
+
252
+ ## Licença
253
+
254
+ [Apache-2.0](LICENSE) · consulte [NOTICE](NOTICE). Partes derivadas do projeto [dsh-xai](https://github.com/MirDie/dsh-xai) (Apache-2.0).
package/README.ru.md ADDED
@@ -0,0 +1,254 @@
1
+
2
+ <!-- banner -->
3
+ <div align="center">
4
+
5
+ # 🔐 dsh-coding-subscription-oauth
6
+
7
+ **v0.5.0** · ранее `dsh-grok-build`
8
+
9
+ **Плагин OAuth для подписок на кодинг для [DeepSeek Harness](https://github.com/deepseek-ai/dsh).** Войдите один раз по уже оплаченным подпискам — и используйте их модели из страницы настроек или CLI dsh. **Никаких вставленных токенов в чат.**
10
+
11
+ [![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE)
12
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
13
+
14
+ *[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)*
15
+
16
+ </div>
17
+
18
+ ---
19
+
20
+ ## Смена имени
21
+
22
+ Сначала репозиторий назывался **`dsh-grok-build`** (только Grok Build). Теперь это OAuth для SuperGrok / Codex / Kimi / Claude / Antigravity.
23
+
24
+ | | Используйте | По-прежнему работает |
25
+ |---|---|---|
26
+ | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build` (тот же `main`) |
27
+ | npm | Пока не опубликовано; ставьте с GitHub | Старого npm-пакета не было |
28
+ | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
29
+ | Cordis plugin id | `llm-grok-build-oauth` | без изменений |
30
+ | HTTP API страницы настроек | `/plugins/dsh-grok-build/*` | без изменений |
31
+ | Файлы учёток | `$DSH_HOME/.grok-build-auth.json` и остальные `*-oauth-auth.json` | без изменений |
32
+
33
+ ## ✨ Возможности
34
+
35
+ - 🧾 **Своя подписка** — используйте уже оплаченные планы для кодинга вместо отдельных API-ключей.
36
+ - 🔑 **Локальный OAuth, без вставки ключа** — авторизация в странице настроек или CLI; токены никогда не попадают в чат.
37
+ - 🧩 **Один плагин, пять провайдеров** — Grok Build, Codex, Kimi, Claude и Google Antigravity.
38
+ - 🛡️ **Безопасность по замыслу** — файлы учётных данных только-владелец `0600`, атомарная запись, межпроцессная блокировка файла.
39
+ - ⚙️ **Динамический каталог** — селектор моделей показывает ровно те провайдеры, которые вы авторизовали.
40
+ - 🌐 **С учётом прокси** — проксируется только проверенные доверенные домены подписок.
41
+
42
+ ## Какие проблемы подключения закрывает этот плагин
43
+
44
+ Обычно сюда приходят по этим поисковым запросам и ошибкам DSH.
45
+
46
+ | Искали / увидели | Что на самом деле сломано | Что делает плагин |
47
+ |---|---|---|
48
+ | SuperGrok / X Premium в DSH, Grok Build vs `api.x.ai` | Встроенный маршрут `xai` — это pay-as-you-go API. Подписка ходит на `cli-chat-proxy.grok.com` | Маршрут `grok-build` + отпечаток CLI (`X-XAI-Token-Auth` и др.), чтобы не ловить тихий 403 |
49
+ | `API key is invalid` / `AUTH` | GUI показывает этот текст на **любой** AUTH. Часто просто истёк короткий OAuth access token | Refresh за **5 минут** до expiry; при 401 токен сбрасывается и **step повторяется** |
50
+ | `INVALID_REPLAY_STATE` на втором ходе Codex/Kimi | Replay всё ещё нёс нативный provider id pi-ai | Сохраняется id маршрута Harness, старый replay чинится |
51
+ | у grok-4.6 нет **xhigh** | `/v1/models-v2` уже отдаёт `reasoning_efforts`; шаблон 4.5 прячет xhigh | Разбираем live efforts. У 4.6 есть xhigh; у 4.5 — low/medium/high |
52
+ | Kimi Code уходит как Anthropic `x-api-key` | OAuth-токен отправили как ключ Anthropic | Только `Authorization: Bearer` |
53
+ | Не вошедшие модели остаются в селекторе | Перечислялись все зарегистрированные маршруты | Неаутентифицированные маршруты пустые; вошедшие помечены `(OAuth)` |
54
+ | PKCE на удалённом / headless DSH | Нельзя вернуться на `localhost` | Device-code для Grok/Codex/Kimi; Claude принимает вставленный redirect URL |
55
+ | Прокси пускает Grok и ломает Kimi в Китае | Глобальный `HTTPS_PROXY` | Прокси только по allowlist; Kimi **напрямую**, пока не включён `proxyKimi: true` |
56
+
57
+ ## Поддерживаемые провайдеры
58
+
59
+ | Провайдер | Маршрут | Аутентификация | Сосуществует с |
60
+ |---|---|---|---|
61
+ | **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
62
+ | **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
63
+ | **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
64
+ | **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | — |
65
+ | **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | — |
66
+
67
+ > Вход по устройству Grok Build, динамический каталог `/v1/models-v2` и потоковая инференция Responses проверены на реальных развёртываниях. Codex/Kimi/Claude используют нативный OAuth/refresh провайдера из `@earendil-works/pi-ai` вместо переписывания флоу каждого вендора.
68
+
69
+ ## 🚀 Быстрый старт
70
+
71
+ ```bash
72
+ # 1. установите плагин в web-профиль
73
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
74
+
75
+ # 2. опционально — Google Antigravity (зафиксированная проверенная версия)
76
+ dsh plugin --profile web add dsh-agy@0.1.2
77
+
78
+ # 3. перезапустите резидентный сервис dsh web
79
+ systemctl --user restart dsh-web.service
80
+ ```
81
+
82
+ Затем откройте **Settings → Coding OAuth** и войдите в любого провайдера. Готово — выберите авторизованную модель в селекторе.
83
+
84
+ ## 📚 Содержание
85
+
86
+ - [Смена имени](#смена-имени)
87
+ - [Какие проблемы подключения закрывает этот плагин](#какие-проблемы-подключения-закрывает-этот-плагин)
88
+ - [Установка](#установка)
89
+ - [Страница настроек](#страница-настроек)
90
+ - [CLI](#cli)
91
+ - [Kimi в Китае](#kimi-в-китае)
92
+ - [Сетевой прокси](#сетевой-прокси)
93
+ - [Отказоустойчивость](#отказоустойчивость)
94
+ - [Учётные данные](#учётные-данные)
95
+ - [Архитектура](#архитектура)
96
+ - [Технические заметки](#технические-заметки)
97
+ - [Соответствие](#соответствие)
98
+ - [Документация](#документация)
99
+ - [Участие](#участие)
100
+ - [Лицензия](#лицензия)
101
+
102
+ ## Установка
103
+
104
+ Требуется DeepSeek Harness `0.1.0-rc.6+` и Node.js 22.19+. Полные детали в [заметках по установке](INSTALL.md).
105
+
106
+ ```bash
107
+ # с GitHub
108
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
109
+
110
+ # или локальный dev-клоун
111
+ dsh plugin --profile web add ./dsh-coding-subscription-oauth
112
+ ```
113
+
114
+ После установки перезапустите `dsh web`. Проверка на реальном развёртывании:
115
+
116
+ ```bash
117
+ pnpm run verify:deployed # проверяет реальный /api/llm.models + статус OAuth
118
+ DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # если Google уже вошёл
119
+
120
+ DSH_RESTORE_PROVIDER=openai \
121
+ DSH_RESTORE_MODEL=gpt-5.6-sol \
122
+ DSH_RESTORE_REASONING=max \
123
+ pnpm run smoke:deployed # реальные вызовы Codex/Kimi + replay второго turn
124
+ ```
125
+
126
+ > `smoke:deployed` создаёт временную сессию, проверяет вызовы инструментов Codex и Kimi и второй пользовательский turn (регрессию `INVALID_REPLAY_STATE`), восстанавливает объявленную модель по умолчанию и затем архивирует сессию.
127
+
128
+ ## Страница настроек
129
+
130
+ Откройте **Settings → Coding OAuth**:
131
+
132
+ | Провайдер | Методы |
133
+ |---|---|
134
+ | Grok | код авторизации · код устройства · импорт CLI Grok · выбор моделей |
135
+ | Codex | код устройства (рекомендуется на удалённом DSH) · PKCE в браузере |
136
+ | Kimi | код устройства |
137
+ | Claude | PKCE в браузере (удалённый браузер может вставить полный URL редиректа localhost) |
138
+ | Antigravity | статус установки `dsh-agy` + локальные для профиля CLI-команды |
139
+
140
+ Селектор показывает только маршруты, завершившие аутентификацию; неавторизованные провайдеры возвращают пустой список. Имена провайдеров получают `(OAuth)`, а каталог обновляется через `llm/adapters-updated` после входа/выхода.
141
+
142
+ ## Дополнительные возможности
143
+
144
+ Все семь переключателей `codexSearch`, `codexImages`, `codexImageEdits`, `codexUsage`, `codexFast`, `grokImagineImage` и `grokImagineVideo` по умолчанию выключены и применяются без перезапуска. Ограничения: `searchResults` (1–20, по умолчанию 5), `imageCount` (1–4, по умолчанию 1) и `videoArtifactTtlMs` (1 час–7 дней, по умолчанию 7 дней; в интерфейсе 1–168 часов). Уменьшение срока сразу сокращает и очищает существующие артефакты; увеличение действует только на новые.
145
+
146
+ ## CLI
147
+
148
+ ```bash
149
+ # `dsh-grok-build` по-прежнему алиас той же команды
150
+ dsh-coding-oauth login [--pkce] | import | status | logout
151
+
152
+ # более новые провайдеры
153
+ dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
154
+ dsh-coding-oauth status all
155
+ dsh-coding-oauth logout codex
156
+
157
+ # Antigravity (сначала установите в web-профиль)
158
+ dsh plugin --profile web exec dsh-agy login --headless
159
+ ```
160
+
161
+ > CLI `dsh-agy` изменяет пул аккаунтов вне процесса DSH, поэтому не может отправить событие каталога внутри процесса — после входа/выхода закройте и снова откройте селектор моделей.
162
+
163
+ ## Kimi в Китае
164
+
165
+ OAuth подписки Kimi Code использует `https://auth.kimi.com`; инференция — `https://api.kimi.com/coding`. `https://api.moonshot.cn/v1` — это канал API-ключей с оплатой за использование **Moonshot Open Platform**; переключаемого «китайского OAuth-эндпоинта» не существует. Этот плагин использует отдельный маршрут `kimi-code-oauth` и не влияет на существующую конфигурацию `kimi-coding` по API-ключу.
166
+
167
+ ## Сетевой прокси
168
+
169
+ Приоритет: `config.proxy` → `CODING_OAUTH_PROXY` → `GROK_BUILD_PROXY` → `HTTPS_PROXY`/`HTTP_PROXY`.
170
+
171
+ ```yaml
172
+ - id: llm-grok-build-oauth
173
+ config:
174
+ proxy: http://127.0.0.1:7890
175
+ proxyKimi: false
176
+ ```
177
+
178
+ Проксируются только проверенные домены подписок (xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity); остальной трафик DSH сохраняет исходный диспетчер. Kimi по умолчанию работает напрямую и использует прокси только при `proxyKimi: true`.
179
+
180
+ ## Отказоустойчивость
181
+
182
+ OAuth access token обновляется **за пять минут** до сохранённого срока (pi-ai 0.84+). Если апстрим всё же отклоняет локально ещё живой токен кодом 401/403, плагин сдвигает сохранённый `expires` в прошлое, и повторный шаг сначала обновляет токен, затем повторяет запрос.
183
+
184
+ Повторы идут по политике harness: временные сбои (`RATE_LIMIT`/`SERVER`/`TIMEOUT`/`TRANSPORT`/`EMPTY_RESPONSE`) **и `AUTH`** повторяются с экспоненциальной задержкой (2 попытки, 500 мс → 10 с, 10% jitter). Исчерпание квоты и мёртвый refresh token **не** повторяются. Переопределение для развёртывания:
185
+
186
+ ```yaml
187
+ - id: llm-grok-build-oauth
188
+ config:
189
+ retryPolicy:
190
+ mode: normal
191
+ maxRetries: 2
192
+ retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
193
+ backoff: { initialDelayMs: 500, maxDelayMs: 10000, jitterRatio: 0.1 }
194
+ ```
195
+
196
+ ## Учётные данные
197
+
198
+ Только-владелец `0600`, атомарная запись, межпроцессная блокировка файла:
199
+
200
+ - `$DSH_HOME/.grok-build-auth.json`
201
+ - `$DSH_HOME/.codex-oauth-auth.json`
202
+ - `$DSH_HOME/.kimi-code-oauth-auth.json`
203
+ - `$DSH_HOME/.claude-code-oauth-auth.json`
204
+
205
+ Кеши выбора живут в соответствующих файлах `*-models.json`. **Ни один HTTP-статус, лог или интерфейс не должен возвращать токен.**
206
+
207
+ ## Архитектура
208
+
209
+ ```mermaid
210
+ flowchart LR
211
+ subgraph DSH["DSH Harness"]
212
+ UI[Настройки / Web · Coding OAuth] --> LLM[llm route]
213
+ LLM --> ALIA[Адаптер алиасов маршрутов]
214
+ end
215
+ ALIA --> PI[нативный провайдер pi-ai<br/>OAuth · refresh · stream]
216
+ PI --> GROK[Grok Build]
217
+ PI --> COD[Codex]
218
+ PI --> KIMI[Kimi]
219
+ PI --> CLAU[Claude]
220
+ AGY[плагин dsh-agy] --> GAL[Google Antigravity]
221
+ ```
222
+
223
+ ## Технические заметки
224
+
225
+ - **Grok Build**: собственный провайдер Responses на `cli-chat-proxy.grok.com/v1`, заголовки fingerprint CLI, динамический каталог моделей.
226
+ - **Codex/Kimi/Claude**: нативные провайдеры pi-ai отвечают за OAuth и refresh; адаптер алиасов маршрутов сопоставляет их с нативными id, при этом идентичность модели не меняется.
227
+ - Токен доступа Kimi явно преобразуется в `Authorization: Bearer` — никогда не отправляется по ошибке как `x-api-key` Anthropic.
228
+ - Google Antigravity здесь **не** реверс-инжинирится; используется выделенный плагин DSH с зафиксированной версией.
229
+
230
+ ## Соответствие
231
+
232
+ Использование подписок на кодинг через сторонний harness может находиться в серой зоне условий каждого вендора и вызывать контроль квот, региона или риска аккаунта. **Используйте только свои аккаунты**; этот проект не поддерживает массовые аккаунты, перепродажу квот, удалённый relay, обход paywall или выдачу себя за клиента. Для коммерческого использования предпочитайте официальные каналы API-ключей вендоров.
233
+
234
+ ## Документация
235
+
236
+ | Документ | Назначение |
237
+ |---|---|
238
+ | [`INSTALL.md`](INSTALL.md) | Детали установки и использования |
239
+ | [`CHANGELOG.md`](CHANGELOG.md) | История релизов |
240
+ | [`docs/00-project-rules.md`](docs/00-project-rules.md) | Версионирование, цикл релиза, разделение публичное/личное |
241
+ | [`docs/02-architecture.md`](docs/02-architecture.md) | Внутренняя архитектура (маршруты, поток данных, модули, API) · [中文](docs/02-architecture.zh-CN.md) |
242
+ | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Руководство по участию |
243
+
244
+ ## Связанное
245
+
246
+ - [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) — отдельный зафиксированный плагин для Google Antigravity.
247
+
248
+ ## Участие
249
+
250
+ Приветствуются любые вклады — фичи, документация, переводы, отчёты об ошибках. См. **[CONTRIBUTING](CONTRIBUTING.md)** о порядке, конвенциях коммитов и цикле релиза. Если вашего языка нет в списке, отправьте PR с переводом README, и мы добавим его в таблицу выше.
251
+
252
+ ## Лицензия
253
+
254
+ [Apache-2.0](LICENSE) · см. [NOTICE](NOTICE). Части заимствованы из проекта [dsh-xai](https://github.com/MirDie/dsh-xai) (Apache-2.0).