dsh-coding-subscription-oauth 0.6.3 → 0.6.4

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 (116) hide show
  1. package/CHANGELOG.md +258 -250
  2. package/CONTRIBUTING.md +129 -129
  3. package/INSTALL.md +256 -255
  4. package/LICENSE +19 -19
  5. package/NOTICE +11 -11
  6. package/README.de.md +303 -303
  7. package/README.es.md +304 -304
  8. package/README.fr.md +304 -304
  9. package/README.ja.md +304 -304
  10. package/README.ko.md +304 -304
  11. package/README.md +320 -320
  12. package/README.pt-BR.md +304 -304
  13. package/README.ru.md +304 -304
  14. package/README.zh-CN.md +318 -318
  15. package/compatibility/dsh-bom.json +30 -30
  16. package/cordis.patch.yml +13 -13
  17. package/docs/00-project-rules.md +212 -212
  18. package/docs/02-architecture.md +138 -138
  19. package/docs/02-architecture.zh-CN.md +138 -138
  20. package/lib/bin.js +1333 -569
  21. package/lib/bin.js.map +4 -4
  22. package/lib/client.js +1 -1
  23. package/lib/client.js.map +2 -2
  24. package/lib/index.js +689 -25492
  25. package/lib/index.js.map +4 -4
  26. package/lib/invariant.js.map +1 -1
  27. package/media/en/settings_accounts.png +0 -0
  28. package/media/en/settings_capabilities.png +0 -0
  29. package/media/en/settings_gateway.png +0 -0
  30. package/media/settings_accounts.png +0 -0
  31. package/media/settings_capabilities.png +0 -0
  32. package/media/settings_gateway.png +0 -0
  33. package/media/settings_overview.png +0 -0
  34. package/media/zh-CN/settings_accounts.png +0 -0
  35. package/media/zh-CN/settings_capabilities.png +0 -0
  36. package/media/zh-CN/settings_gateway.png +0 -0
  37. package/package.json +223 -223
  38. package/patches/dsh-agy@0.1.2.patch +25 -25
  39. package/scripts/release.mjs +186 -186
  40. package/scripts/smoke-deployed-routes.mjs +146 -146
  41. package/scripts/verify-deployed-catalog.mjs +87 -87
  42. package/src/adapter.ts +348 -348
  43. package/src/alias-adapter.ts +147 -147
  44. package/src/auth-routes.ts +921 -921
  45. package/src/auth.ts +67 -67
  46. package/src/bin.ts +350 -350
  47. package/src/capability-routes.ts +279 -279
  48. package/src/capability-runtime.ts +314 -314
  49. package/src/capability-settings.ts +671 -671
  50. package/src/capability-tools.ts +685 -685
  51. package/src/catalog.ts +271 -271
  52. package/src/client/GrokBuildSettings.tsx +771 -771
  53. package/src/client/api.ts +88 -88
  54. package/src/client/components/AboutTab.tsx +30 -30
  55. package/src/client/components/AccountsTab.tsx +241 -241
  56. package/src/client/components/Badge.tsx +33 -33
  57. package/src/client/components/CapabilitiesTab.tsx +265 -265
  58. package/src/client/components/CliPullPreview.tsx +116 -116
  59. package/src/client/components/CopyButton.tsx +57 -57
  60. package/src/client/components/GatewayTab.tsx +469 -469
  61. package/src/client/components/NoticeBanner.tsx +46 -46
  62. package/src/client/components/ProgressBar.tsx +53 -53
  63. package/src/client/components/ProviderCard.tsx +606 -606
  64. package/src/client/components/SettingsTabs.tsx +75 -75
  65. package/src/client/components/ToggleSwitch.tsx +71 -71
  66. package/src/client/constants.ts +230 -230
  67. package/src/client/display.ts +61 -61
  68. package/src/client/dshClientAdapter.ts +127 -127
  69. package/src/client/gatewaySnippets.ts +37 -37
  70. package/src/client/index.tsx +156 -156
  71. package/src/client/locales.ts +540 -540
  72. package/src/client/microStyles.ts +52 -52
  73. package/src/client/parsers.ts +398 -398
  74. package/src/client/styles.ts +325 -325
  75. package/src/client/types.ts +199 -199
  76. package/src/codex-http.ts +447 -447
  77. package/src/codex-images.ts +503 -503
  78. package/src/codex-model-capabilities.ts +320 -320
  79. package/src/codex-search.ts +245 -245
  80. package/src/codex-usage.ts +263 -263
  81. package/src/compatibility.ts +55 -55
  82. package/src/dsh-host-adapter.ts +173 -173
  83. package/src/gateway-anthropic-messages.ts +84 -84
  84. package/src/gateway-auth.ts +102 -102
  85. package/src/gateway-backend.ts +274 -274
  86. package/src/gateway-body.ts +49 -49
  87. package/src/gateway-config.ts +76 -76
  88. package/src/gateway-http.ts +104 -104
  89. package/src/gateway-openai-chat.ts +124 -124
  90. package/src/gateway-openai-responses.ts +53 -53
  91. package/src/gateway-parse.ts +224 -224
  92. package/src/gateway-protocol.ts +52 -52
  93. package/src/gateway-routes.ts +158 -158
  94. package/src/gateway.ts +258 -258
  95. package/src/grok-errors.ts +24 -24
  96. package/src/grok-imagine.ts +1627 -1627
  97. package/src/grok-import.ts +151 -151
  98. package/src/http-json.ts +82 -82
  99. package/src/ids.ts +59 -59
  100. package/src/imagine-routes.ts +463 -463
  101. package/src/index.ts +735 -735
  102. package/src/invariant.ts +17 -17
  103. package/src/kimi-errors.ts +26 -26
  104. package/src/media-store.ts +927 -927
  105. package/src/oauth-import-routes.ts +324 -324
  106. package/src/oauth-providers.ts +152 -152
  107. package/src/oauth-session.ts +183 -183
  108. package/src/oauth-sources.ts +1104 -1104
  109. package/src/oauth.ts +620 -620
  110. package/src/provider.ts +128 -128
  111. package/src/proxy.ts +11 -11
  112. package/src/redact.ts +72 -72
  113. package/src/session.ts +218 -218
  114. package/src/store.ts +217 -217
  115. package/src/web-origin.ts +296 -296
  116. package/src/web-routes.ts +38 -38
package/README.ru.md CHANGED
@@ -1,304 +1,304 @@
1
-
2
- <!-- banner -->
3
- <div align="center">
4
-
5
- # 🔐 dsh-coding-subscription-oauth
6
-
7
- **v0.6.3 · ранее `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
- > **Upgrade / 升级:** Follow the versioned steps in [`INSTALL.md`](INSTALL.md). Install into the existing `web` profile, keep profile/config/credential files, and restart one existing DSH Web process after all packages are updated. When Hub and Subscription are both used, `dsh-coding-oauth-core@0.1.0` is their shared npm dependency, not a separate DSH plugin.
21
-
22
- ---
23
-
24
- ## Смена имени
25
-
26
- Сначала репозиторий назывался **`dsh-grok-build`** (только Grok Build). Теперь это OAuth для SuperGrok / Codex / Kimi / Claude / Antigravity.
27
-
28
- | | Используйте | По-прежнему работает |
29
- |---|---|---|
30
- | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build` (тот же `main`) |
31
- | npm | `dsh-coding-subscription-oauth@0.6.3` (текущая версия) | Старого npm-пакета не было |
32
- | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
33
- | Cordis plugin id | `llm-grok-build-oauth` | без изменений |
34
- | HTTP API страницы настроек | `/plugins/dsh-grok-build/*` | без изменений |
35
- | Файлы учёток | `$DSH_HOME/.grok-build-auth.json` и остальные `*-oauth-auth.json` | без изменений |
36
-
37
- ## ✨ Возможности
38
-
39
- - 🧾 **Своя подписка** — используйте уже оплаченные планы для кодинга вместо отдельных API-ключей.
40
- - 🔑 **Локальный OAuth, без вставки ключа** — авторизация в странице настроек или CLI; токены никогда не попадают в чат.
41
- - 🧩 **Один плагин, пять провайдеров** — Grok Build, Codex, Kimi, Claude и Google Antigravity.
42
- - 🛡️ **Безопасность по замыслу** — файлы учётных данных только-владелец `0600`, атомарная запись, межпроцессная блокировка файла.
43
- - ⚙️ **Динамический каталог** — селектор показывает только авторизованные маршруты с пометкой `(OAuth)`, включая `xhigh` для grok-4.6.
44
- - 🌐 **С учётом прокси** — проксируется только проверенные доверенные домены подписок.
45
- - 📥 **Ручной CLI Pull** — настройки обнаруживают разрешённые официальные OAuth-файлы CLI Grok/Codex/Kimi/Claude только для чтения; вы забираете одностороннюю копию после предпросмотра и подтверждения перезаписи.
46
- - 🗂️ **Настройки во вкладках** — Accounts, Gateway, Capabilities и About; на удалённых хостах предпочтителен device code и меньше шума CLI missing; вошедшие карточки свёрнуты, пока их не развернёшь.
47
- - 🎛️ **Опциональные возможности, по умолчанию выключены** — поиск Codex, использование/квота, генерация/редактирование изображений, Fast и Grok Imagine применяются сразу при включении. Дополнительный выключенный по умолчанию переключатель разрешает маршрутам не-Codex моделей вызывать инструменты изображений Codex, не обходя вход Codex, сессию и проверку владения вложениями.
48
- - 🔌 **Локальный API-шлюз по opt-in** — по умолчанию выключенный loopback-сервер, совместимый с OpenAI/Anthropic; для ваших собственных инструментов, а не публичный relay.
49
-
50
- ## Какие проблемы подключения закрывает этот плагин
51
-
52
- Обычно сюда приходят по этим поисковым запросам и ошибкам DSH.
53
- | Искали / увидели | Что на самом деле сломано | Что делает плагин |
54
- |---|---|---|
55
- | 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 |
56
- | `API key is invalid` / `AUTH` | GUI показывает этот текст на **любой** AUTH. Часто просто истёк короткий OAuth access token | Refresh за **5 минут** до expiry; при 401 токен сбрасывается и **step повторяется** |
57
- | `INVALID_REPLAY_STATE` на втором ходе Codex/Kimi | Replay всё ещё нёс нативный provider id pi-ai | Сохраняется id маршрута Harness, старый replay чинится |
58
- | у grok-4.6 нет **xhigh** | `/v1/models-v2` уже отдаёт `reasoning_efforts`; шаблон 4.5 прячет xhigh | Разбираем live efforts. У 4.6 есть xhigh; у 4.5 — low/medium/high |
59
- | Kimi Code уходит как Anthropic `x-api-key` | OAuth-токен отправили как ключ Anthropic | Только `Authorization: Bearer` |
60
- | Не вошедшие модели остаются в селекторе | Перечислялись все зарегистрированные маршруты | Неаутентифицированные маршруты пустые; вошедшие помечены `(OAuth)` |
61
- | PKCE на удалённом / headless DSH | Нельзя вернуться на `localhost` | Device-code для Grok/Codex/Kimi; Claude принимает вставленный redirect URL |
62
- | Прокси пускает Grok и ломает Kimi в Китае | Глобальный `HTTPS_PROXY` | Прокси только по allowlist; Kimi **напрямую**, пока не включён `proxyKimi: true` |
63
-
64
- ## Поддерживаемые провайдеры
65
-
66
- | Провайдер | Маршрут | Аутентификация | Сосуществует с |
67
- |---|---|---|---|
68
- | **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
69
- | **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
70
- | **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
71
- | **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | — |
72
- | **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | — |
73
-
74
- > Вход по устройству Grok Build, динамический каталог `/v1/models-v2` и потоковая инференция Responses проверены на реальных развёртываниях. Codex/Kimi/Claude используют нативный OAuth/refresh провайдера из `@earendil-works/pi-ai` вместо переписывания флоу каждого вендора.
75
-
76
- ## 🚀 Быстрый старт
77
-
78
- ```bash
79
- # 1. установите текущую npm-версию в web-профиль
80
- dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.3
81
-
82
- # 2. опционально — Google Antigravity (зафиксированная проверенная версия)
83
- dsh plugin --profile web add dsh-agy@0.1.2
84
-
85
- # 3. перезапустите существующий процесс DSH Web через настроенный менеджер процессов
86
- # `dsh web` — официальный псевдоним CLI, а не имя службы.
87
- ```
88
-
89
- Затем откройте **Settings → Coding OAuth** и войдите в любого провайдера. Готово — выберите авторизованную модель в селекторе.
90
-
91
- ## 📚 Содержание
92
-
93
- - [Смена имени](#смена-имени)
94
- - [Возможности](#-возможности)
95
- - [Какие проблемы подключения закрывает этот плагин](#какие-проблемы-подключения-закрывает-этот-плагин)
96
- - [Поддерживаемые провайдеры](#поддерживаемые-провайдеры)
97
- - [Быстрый старт](#-быстрый-старт)
98
- - [Установка](#установка)
99
- - [Страница настроек](#страница-настроек)
100
- - [Дополнительные возможности](#дополнительные-возможности)
101
- - [Локальный API-шлюз](#локальный-api-шлюз)
102
- - [CLI](#cli)
103
- - [Kimi в Китае](#kimi-в-китае)
104
- - [Сетевой прокси](#сетевой-прокси)
105
- - [Отказоустойчивость](#отказоустойчивость)
106
- - [Учётные данные](#учётные-данные)
107
- - [Архитектура](#архитектура)
108
- - [Технические заметки](#технические-заметки)
109
- - [Соответствие](#соответствие)
110
- - [Документация](#документация)
111
- - [Связанное](#связанное)
112
- - [Участие](#участие)
113
- - [Лицензия](#лицензия)
114
-
115
- ## Установка
116
-
117
- Требуется DeepSeek Harness `0.1.1-rc.2` и Node.js 22.19+. Полные детали в [заметках по установке](INSTALL.md).
118
-
119
- ```bash
120
- # текущая npm-версия (рекомендуется)
121
- dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.3
122
-
123
- # разработка/альтернатива: из GitHub
124
- dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
125
-
126
- # разработка/альтернатива: локальный checkout
127
- # dsh plugin --profile web add ./dsh-coding-subscription-oauth
128
- ```
129
-
130
- После установки перезапустите существующий процесс DSH Web. Проверка на реальном развёртывании:
131
-
132
- ```bash
133
- pnpm run verify:deployed # проверяет реальный /api/llm.models + статус OAuth
134
- DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # если Google уже вошёл
135
-
136
- DSH_RESTORE_PROVIDER=openai \
137
- DSH_RESTORE_MODEL=gpt-5.6-sol \
138
- DSH_RESTORE_REASONING=max \
139
- pnpm run smoke:deployed # реальные вызовы Codex/Kimi + replay второго turn
140
- ```
141
-
142
- > `smoke:deployed` создаёт временную сессию, проверяет вызовы инструментов Codex и Kimi и второй пользовательский turn (регрессию `INVALID_REPLAY_STATE`), восстанавливает объявленную модель по умолчанию и затем архивирует сессию.
143
-
144
- ## Страница настроек
145
-
146
- Откройте **Settings → Coding OAuth**:
147
-
148
-
149
-
150
- <table>
151
- <tr>
152
- <td align="center" valign="top" width="33%">
153
- <a href="media/en/settings_accounts.png"><img src="media/en/settings_accounts.png" alt="Coding OAuth Accounts tab" width="280" /></a><br />
154
- <sub>Accounts</sub>
155
- </td>
156
- <td align="center" valign="top" width="33%">
157
- <a href="media/en/settings_gateway.png"><img src="media/en/settings_gateway.png" alt="Coding OAuth Gateway tab" width="280" /></a><br />
158
- <sub>Gateway</sub>
159
- </td>
160
- <td align="center" valign="top" width="33%">
161
- <a href="media/en/settings_capabilities.png"><img src="media/en/settings_capabilities.png" alt="Coding OAuth Capabilities tab" width="280" /></a><br />
162
- <sub>Capabilities</sub>
163
- </td>
164
- </tr>
165
- </table>
166
-
167
- | Провайдер | Методы |
168
- |---|---|
169
- | Grok | код авторизации · код устройства · импорт CLI Grok · выбор моделей |
170
- | Codex | код устройства (рекомендуется на удалённом DSH) · PKCE в браузере |
171
- | Kimi | код устройства |
172
- | Claude | PKCE в браузере (удалённый браузер может вставить полный URL редиректа localhost) |
173
- | Antigravity | статус установки `dsh-agy` + локальные для профиля CLI-команды |
174
-
175
- Страница настроек разделена на четыре верхние вкладки: **Accounts**, **Gateway**, **Capabilities** и **About**. Карточки вошедших провайдеров сворачиваются в компактное резюме и разворачиваются для редактирования моделей. Предпросмотр CLI pull занимает всю ширину, а статус Imagine показан на вкладке Capabilities.
176
-
177
- Селектор показывает только маршруты, завершившие аутентификацию; неавторизованные провайдеры возвращают пустой список. Имена провайдеров получают `(OAuth)`, а каталог обновляется через `llm/adapters-updated` после входа/выхода.
178
-
179
- ## Дополнительные возможности
180
-
181
- Все восемь переключателей `codexSearch`, `codexImages`, `codexImageEdits`, `codexImagesAnyModel`, `codexUsage`, `codexFast`, `grokImagineImage` и `grokImagineVideo` по умолчанию выключены и применяются без перезапуска. Ограничения: `searchResults` (1–20, по умолчанию 5), `imageCount` (1–4, по умолчанию 1) и `videoArtifactTtlMs` (1 час–7 дней, по умолчанию 7 дней; в интерфейсе 1–168 часов). Уменьшение срока сразу сокращает и очищает существующие артефакты; увеличение действует только на новые.
182
-
183
- ## Локальный API-шлюз
184
-
185
- По умолчанию **выключен**. При включении запускается изолированный `node:http`-сервер (не веб-порт DSH) на `127.0.0.1:18080`, переиспользующий те же вошедшие OAuth-сессии:
186
-
187
- ```yaml
188
- gateway:
189
- enabled: false
190
- bind: 127.0.0.1
191
- port: 18080
192
- ```
193
-
194
- Эндпоинты: `GET /healthz`, `GET /v1/models`, `POST /v1/chat/completions`, `POST /v1/responses`, `POST /v1/messages`. Bearer-ключ хранится в `$DSH_HOME/.coding-oauth-gateway.json` (`0600`). В настройках можно скопировать базовый URL OpenAI (база + `/v1`), базовый URL Anthropic и текущий Bearer-ключ без ротации; показ ключа возможен только через loopback и не сохраняется в хранилище браузера. Ротация — подтверждаемое деструктивное действие. Порт прослушивания можно отредактировать напрямую и сохранить через Apply или заполнить кнопкой Random (18100–18999); выбранный порт сохраняется в доступном только владельцу документе шлюза, а работающий listener перепривязывается. Bind по-прежнему задаётся только в YAML; для не-loopback bind требуется ключ. Это не удалённый relay.
195
-
196
- ## CLI
197
-
198
- ```bash
199
- # `dsh-grok-build` по-прежнему алиас той же команды
200
- dsh-coding-oauth login [--pkce] | import | status | logout
201
-
202
- # более новые провайдеры
203
- dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
204
- dsh-coding-oauth status all
205
- dsh-coding-oauth logout codex
206
-
207
- # Antigravity (сначала установите в web-профиль)
208
- dsh plugin --profile web exec dsh-agy login --headless
209
- ```
210
-
211
- > CLI `dsh-agy` изменяет пул аккаунтов вне процесса DSH, поэтому не может отправить событие каталога внутри процесса — после входа/выхода закройте и снова откройте селектор моделей.
212
-
213
- ## Kimi в Китае
214
-
215
- 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-ключу.
216
-
217
- ## Сетевой прокси
218
-
219
- Приоритет: `config.proxy` → `CODING_OAUTH_PROXY` → `GROK_BUILD_PROXY` → `HTTPS_PROXY`/`HTTP_PROXY`.
220
-
221
- ```yaml
222
- - id: llm-grok-build-oauth
223
- config:
224
- proxy: http://127.0.0.1:7890
225
- proxyKimi: false
226
- ```
227
-
228
- Проксируются только проверенные домены подписок (xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity); остальной трафик DSH сохраняет исходный диспетчер. Kimi по умолчанию работает напрямую и использует прокси только при `proxyKimi: true`.
229
-
230
- ## Отказоустойчивость
231
-
232
- OAuth access token обновляется **за пять минут** до сохранённого срока (pi-ai 0.84+). Если апстрим всё же отклоняет локально ещё живой токен кодом 401/403, плагин сдвигает сохранённый `expires` в прошлое, и повторный шаг сначала обновляет токен, затем повторяет запрос.
233
-
234
- Повторы идут по политике harness: временные сбои (`RATE_LIMIT`/`SERVER`/`TIMEOUT`/`TRANSPORT`/`EMPTY_RESPONSE`) **и `AUTH`** повторяются с экспоненциальной задержкой (5 попыток, 5 с → 10 с → 20 с → 40 с → 80 с (~155 с суммарно), 10% jitter). Исчерпание квоты и мёртвый refresh token **не** повторяются. Переопределение для развёртывания:
235
-
236
- ```yaml
237
- - id: llm-grok-build-oauth
238
- config:
239
- retryPolicy:
240
- mode: normal
241
- maxRetries: 5
242
- retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
243
- backoff: { initialDelayMs: 5000, maxDelayMs: 80000, jitterRatio: 0.1 }
244
- ```
245
-
246
- ## Учётные данные
247
-
248
- Только-владелец `0600`, атомарная запись, межпроцессная блокировка файла:
249
-
250
- - `$DSH_HOME/.grok-build-auth.json`
251
- - `$DSH_HOME/.codex-oauth-auth.json`
252
- - `$DSH_HOME/.kimi-code-oauth-auth.json`
253
- - `$DSH_HOME/.claude-code-oauth-auth.json`
254
-
255
- Кеши выбора живут в соответствующих файлах `*-models.json`. **Ни один HTTP-статус, лог или интерфейс не должен возвращать токен.**
256
-
257
- ## Архитектура
258
-
259
- ```mermaid
260
- flowchart LR
261
- subgraph DSH["DSH Harness"]
262
- UI[Настройки / Web · Coding OAuth] --> LLM[llm route]
263
- LLM --> ALIA[Адаптер алиасов маршрутов]
264
- end
265
- ALIA --> PI[нативный провайдер pi-ai<br/>OAuth · refresh · stream]
266
- PI --> GROK[Grok Build]
267
- PI --> COD[Codex]
268
- PI --> KIMI[Kimi]
269
- PI --> CLAU[Claude]
270
- AGY[плагин dsh-agy] --> GAL[Google Antigravity]
271
- ```
272
-
273
- ## Технические заметки
274
-
275
- - **Grok Build**: собственный провайдер Responses на `cli-chat-proxy.grok.com/v1`, заголовки fingerprint CLI, динамический каталог моделей.
276
- - **Codex/Kimi/Claude**: нативные провайдеры pi-ai отвечают за OAuth и refresh; адаптер алиасов маршрутов сопоставляет их с нативными id, при этом идентичность модели не меняется.
277
- - Токен доступа Kimi явно преобразуется в `Authorization: Bearer` — никогда не отправляется по ошибке как `x-api-key` Anthropic.
278
- - Google Antigravity здесь **не** реверс-инжинирится; используется выделенный плагин DSH с зафиксированной версией.
279
-
280
- ## Соответствие
281
-
282
- Использование подписок на кодинг через сторонний harness может находиться в серой зоне условий каждого вендора и вызывать контроль квот, региона или риска аккаунта. **Используйте только свои аккаунты**; этот проект не поддерживает массовые аккаунты, перепродажу квот, удалённый relay, обход paywall или выдачу себя за клиента. Для коммерческого использования предпочитайте официальные каналы API-ключей вендоров.
283
-
284
- ## Документация
285
-
286
- | Документ | Назначение |
287
- |---|---|
288
- | [`INSTALL.md`](INSTALL.md) | Детали установки и использования |
289
- | [`CHANGELOG.md`](CHANGELOG.md) | История релизов |
290
- | [`docs/00-project-rules.md`](docs/00-project-rules.md) | Версионирование, цикл релиза, разделение публичное/личное |
291
- | [`docs/02-architecture.md`](docs/02-architecture.md) | Внутренняя архитектура (маршруты, поток данных, модули, API) · [中文](docs/02-architecture.zh-CN.md) |
292
- | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Руководство по участию |
293
-
294
- ## Связанное
295
-
296
- - [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) — отдельный зафиксированный плагин для Google Antigravity.
297
-
298
- ## Участие
299
-
300
- Приветствуются любые вклады — фичи, документация, переводы, отчёты об ошибках. См. **[CONTRIBUTING](CONTRIBUTING.md)** о порядке, конвенциях коммитов и цикле релиза. Если вашего языка нет в списке, отправьте PR с переводом README, и мы добавим его в таблицу выше.
301
-
302
- ## Лицензия
303
-
304
- [Apache-2.0](LICENSE) · см. [NOTICE](NOTICE). Части заимствованы из проекта [dsh-xai](https://github.com/MirDie/dsh-xai) (Apache-2.0).
1
+
2
+ <!-- banner -->
3
+ <div align="center">
4
+
5
+ # 🔐 dsh-coding-subscription-oauth
6
+
7
+ **v0.6.4 · ранее `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
+ > **Upgrade / 升级:** Follow the versioned steps in [`INSTALL.md`](INSTALL.md). Install into the existing `web` profile, keep profile/config/credential files, and restart one existing DSH Web process after all packages are updated. When Hub and Subscription are both used, `dsh-coding-oauth-core@0.1.1` with `undici@7.29.0` is their shared runtime pin, not a separate DSH plugin.
21
+
22
+ ---
23
+
24
+ ## Смена имени
25
+
26
+ Сначала репозиторий назывался **`dsh-grok-build`** (только Grok Build). Теперь это OAuth для SuperGrok / Codex / Kimi / Claude / Antigravity.
27
+
28
+ | | Используйте | По-прежнему работает |
29
+ |---|---|---|
30
+ | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build` (тот же `main`) |
31
+ | npm | `dsh-coding-subscription-oauth@0.6.4` (текущая версия) | Старого npm-пакета не было |
32
+ | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
33
+ | Cordis plugin id | `llm-grok-build-oauth` | без изменений |
34
+ | HTTP API страницы настроек | `/plugins/dsh-grok-build/*` | без изменений |
35
+ | Файлы учёток | `$DSH_HOME/.grok-build-auth.json` и остальные `*-oauth-auth.json` | без изменений |
36
+
37
+ ## ✨ Возможности
38
+
39
+ - 🧾 **Своя подписка** — используйте уже оплаченные планы для кодинга вместо отдельных API-ключей.
40
+ - 🔑 **Локальный OAuth, без вставки ключа** — авторизация в странице настроек или CLI; токены никогда не попадают в чат.
41
+ - 🧩 **Один плагин, пять провайдеров** — Grok Build, Codex, Kimi, Claude и Google Antigravity.
42
+ - 🛡️ **Безопасность по замыслу** — файлы учётных данных только-владелец `0600`, атомарная запись, межпроцессная блокировка файла.
43
+ - ⚙️ **Динамический каталог** — селектор показывает только авторизованные маршруты с пометкой `(OAuth)`, включая `xhigh` для grok-4.6.
44
+ - 🌐 **С учётом прокси** — проксируется только проверенные доверенные домены подписок.
45
+ - 📥 **Ручной CLI Pull** — настройки обнаруживают разрешённые официальные OAuth-файлы CLI Grok/Codex/Kimi/Claude только для чтения; вы забираете одностороннюю копию после предпросмотра и подтверждения перезаписи.
46
+ - 🗂️ **Настройки во вкладках** — Accounts, Gateway, Capabilities и About; на удалённых хостах предпочтителен device code и меньше шума CLI missing; вошедшие карточки свёрнуты, пока их не развернёшь.
47
+ - 🎛️ **Опциональные возможности, по умолчанию выключены** — поиск Codex, использование/квота, генерация/редактирование изображений, Fast и Grok Imagine применяются сразу при включении. Дополнительный выключенный по умолчанию переключатель разрешает маршрутам не-Codex моделей вызывать инструменты изображений Codex, не обходя вход Codex, сессию и проверку владения вложениями.
48
+ - 🔌 **Локальный API-шлюз по opt-in** — по умолчанию выключенный loopback-сервер, совместимый с OpenAI/Anthropic; для ваших собственных инструментов, а не публичный relay.
49
+
50
+ ## Какие проблемы подключения закрывает этот плагин
51
+
52
+ Обычно сюда приходят по этим поисковым запросам и ошибкам DSH.
53
+ | Искали / увидели | Что на самом деле сломано | Что делает плагин |
54
+ |---|---|---|
55
+ | 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 |
56
+ | `API key is invalid` / `AUTH` | GUI показывает этот текст на **любой** AUTH. Часто просто истёк короткий OAuth access token | Refresh за **5 минут** до expiry; при 401 токен сбрасывается и **step повторяется** |
57
+ | `INVALID_REPLAY_STATE` на втором ходе Codex/Kimi | Replay всё ещё нёс нативный provider id pi-ai | Сохраняется id маршрута Harness, старый replay чинится |
58
+ | у grok-4.6 нет **xhigh** | `/v1/models-v2` уже отдаёт `reasoning_efforts`; шаблон 4.5 прячет xhigh | Разбираем live efforts. У 4.6 есть xhigh; у 4.5 — low/medium/high |
59
+ | Kimi Code уходит как Anthropic `x-api-key` | OAuth-токен отправили как ключ Anthropic | Только `Authorization: Bearer` |
60
+ | Не вошедшие модели остаются в селекторе | Перечислялись все зарегистрированные маршруты | Неаутентифицированные маршруты пустые; вошедшие помечены `(OAuth)` |
61
+ | PKCE на удалённом / headless DSH | Нельзя вернуться на `localhost` | Device-code для Grok/Codex/Kimi; Claude принимает вставленный redirect URL |
62
+ | Прокси пускает Grok и ломает Kimi в Китае | Глобальный `HTTPS_PROXY` | Прокси только по allowlist; Kimi **напрямую**, пока не включён `proxyKimi: true` |
63
+
64
+ ## Поддерживаемые провайдеры
65
+
66
+ | Провайдер | Маршрут | Аутентификация | Сосуществует с |
67
+ |---|---|---|---|
68
+ | **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
69
+ | **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
70
+ | **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
71
+ | **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | — |
72
+ | **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | — |
73
+
74
+ > Вход по устройству Grok Build, динамический каталог `/v1/models-v2` и потоковая инференция Responses проверены на реальных развёртываниях. Codex/Kimi/Claude используют нативный OAuth/refresh провайдера из `@earendil-works/pi-ai` вместо переписывания флоу каждого вендора.
75
+
76
+ ## 🚀 Быстрый старт
77
+
78
+ ```bash
79
+ # 1. установите текущую npm-версию в web-профиль
80
+ dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.4
81
+
82
+ # 2. опционально — Google Antigravity (зафиксированная проверенная версия)
83
+ dsh plugin --profile web add dsh-agy@0.1.2
84
+
85
+ # 3. перезапустите существующий процесс DSH Web через настроенный менеджер процессов
86
+ # `dsh web` — официальный псевдоним CLI, а не имя службы.
87
+ ```
88
+
89
+ Затем откройте **Settings → Coding OAuth** и войдите в любого провайдера. Готово — выберите авторизованную модель в селекторе.
90
+
91
+ ## 📚 Содержание
92
+
93
+ - [Смена имени](#смена-имени)
94
+ - [Возможности](#-возможности)
95
+ - [Какие проблемы подключения закрывает этот плагин](#какие-проблемы-подключения-закрывает-этот-плагин)
96
+ - [Поддерживаемые провайдеры](#поддерживаемые-провайдеры)
97
+ - [Быстрый старт](#-быстрый-старт)
98
+ - [Установка](#установка)
99
+ - [Страница настроек](#страница-настроек)
100
+ - [Дополнительные возможности](#дополнительные-возможности)
101
+ - [Локальный API-шлюз](#локальный-api-шлюз)
102
+ - [CLI](#cli)
103
+ - [Kimi в Китае](#kimi-в-китае)
104
+ - [Сетевой прокси](#сетевой-прокси)
105
+ - [Отказоустойчивость](#отказоустойчивость)
106
+ - [Учётные данные](#учётные-данные)
107
+ - [Архитектура](#архитектура)
108
+ - [Технические заметки](#технические-заметки)
109
+ - [Соответствие](#соответствие)
110
+ - [Документация](#документация)
111
+ - [Связанное](#связанное)
112
+ - [Участие](#участие)
113
+ - [Лицензия](#лицензия)
114
+
115
+ ## Установка
116
+
117
+ Требуется DeepSeek Harness `0.1.1-rc.2` и Node.js 22.19+. Полные детали в [заметках по установке](INSTALL.md).
118
+
119
+ ```bash
120
+ # текущая npm-версия (рекомендуется)
121
+ dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.4
122
+
123
+ # разработка/альтернатива: из GitHub
124
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
125
+
126
+ # разработка/альтернатива: локальный checkout
127
+ # dsh plugin --profile web add ./dsh-coding-subscription-oauth
128
+ ```
129
+
130
+ После установки перезапустите существующий процесс DSH Web. Проверка на реальном развёртывании:
131
+
132
+ ```bash
133
+ pnpm run verify:deployed # проверяет реальный /api/llm.models + статус OAuth
134
+ DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # если Google уже вошёл
135
+
136
+ DSH_RESTORE_PROVIDER=openai \
137
+ DSH_RESTORE_MODEL=gpt-5.6-sol \
138
+ DSH_RESTORE_REASONING=max \
139
+ pnpm run smoke:deployed # реальные вызовы Codex/Kimi + replay второго turn
140
+ ```
141
+
142
+ > `smoke:deployed` создаёт временную сессию, проверяет вызовы инструментов Codex и Kimi и второй пользовательский turn (регрессию `INVALID_REPLAY_STATE`), восстанавливает объявленную модель по умолчанию и затем архивирует сессию.
143
+
144
+ ## Страница настроек
145
+
146
+ Откройте **Settings → Coding OAuth**:
147
+
148
+
149
+
150
+ <table>
151
+ <tr>
152
+ <td align="center" valign="top" width="33%">
153
+ <a href="media/en/settings_accounts.png"><img src="media/en/settings_accounts.png" alt="Coding OAuth Accounts tab" width="280" /></a><br />
154
+ <sub>Accounts</sub>
155
+ </td>
156
+ <td align="center" valign="top" width="33%">
157
+ <a href="media/en/settings_gateway.png"><img src="media/en/settings_gateway.png" alt="Coding OAuth Gateway tab" width="280" /></a><br />
158
+ <sub>Gateway</sub>
159
+ </td>
160
+ <td align="center" valign="top" width="33%">
161
+ <a href="media/en/settings_capabilities.png"><img src="media/en/settings_capabilities.png" alt="Coding OAuth Capabilities tab" width="280" /></a><br />
162
+ <sub>Capabilities</sub>
163
+ </td>
164
+ </tr>
165
+ </table>
166
+
167
+ | Провайдер | Методы |
168
+ |---|---|
169
+ | Grok | код авторизации · код устройства · импорт CLI Grok · выбор моделей |
170
+ | Codex | код устройства (рекомендуется на удалённом DSH) · PKCE в браузере |
171
+ | Kimi | код устройства |
172
+ | Claude | PKCE в браузере (удалённый браузер может вставить полный URL редиректа localhost) |
173
+ | Antigravity | статус установки `dsh-agy` + локальные для профиля CLI-команды |
174
+
175
+ Страница настроек разделена на четыре верхние вкладки: **Accounts**, **Gateway**, **Capabilities** и **About**. Карточки вошедших провайдеров сворачиваются в компактное резюме и разворачиваются для редактирования моделей. Предпросмотр CLI pull занимает всю ширину, а статус Imagine показан на вкладке Capabilities.
176
+
177
+ Селектор показывает только маршруты, завершившие аутентификацию; неавторизованные провайдеры возвращают пустой список. Имена провайдеров получают `(OAuth)`, а каталог обновляется через `llm/adapters-updated` после входа/выхода.
178
+
179
+ ## Дополнительные возможности
180
+
181
+ Все восемь переключателей `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 часов). Уменьшение срока сразу сокращает и очищает существующие артефакты; увеличение действует только на новые.
182
+
183
+ ## Локальный API-шлюз
184
+
185
+ По умолчанию **выключен**. При включении запускается изолированный `node:http`-сервер (не веб-порт DSH) на `127.0.0.1:18080`, переиспользующий те же вошедшие OAuth-сессии:
186
+
187
+ ```yaml
188
+ gateway:
189
+ enabled: false
190
+ bind: 127.0.0.1
191
+ port: 18080
192
+ ```
193
+
194
+ Эндпоинты: `GET /healthz`, `GET /v1/models`, `POST /v1/chat/completions`, `POST /v1/responses`, `POST /v1/messages`. Bearer-ключ хранится в `$DSH_HOME/.coding-oauth-gateway.json` (`0600`). В настройках можно скопировать базовый URL OpenAI (база + `/v1`), базовый URL Anthropic и текущий Bearer-ключ без ротации; показ ключа возможен только через loopback и не сохраняется в хранилище браузера. Ротация — подтверждаемое деструктивное действие. Порт прослушивания можно отредактировать напрямую и сохранить через Apply или заполнить кнопкой Random (18100–18999); выбранный порт сохраняется в доступном только владельцу документе шлюза, а работающий listener перепривязывается. Bind по-прежнему задаётся только в YAML; для не-loopback bind требуется ключ. Это не удалённый relay.
195
+
196
+ ## CLI
197
+
198
+ ```bash
199
+ # `dsh-grok-build` по-прежнему алиас той же команды
200
+ dsh-coding-oauth login [--pkce] | import | status | logout
201
+
202
+ # более новые провайдеры
203
+ dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
204
+ dsh-coding-oauth status all
205
+ dsh-coding-oauth logout codex
206
+
207
+ # Antigravity (сначала установите в web-профиль)
208
+ dsh plugin --profile web exec dsh-agy login --headless
209
+ ```
210
+
211
+ > CLI `dsh-agy` изменяет пул аккаунтов вне процесса DSH, поэтому не может отправить событие каталога внутри процесса — после входа/выхода закройте и снова откройте селектор моделей.
212
+
213
+ ## Kimi в Китае
214
+
215
+ 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-ключу.
216
+
217
+ ## Сетевой прокси
218
+
219
+ Приоритет: `config.proxy` → `CODING_OAUTH_PROXY` → `GROK_BUILD_PROXY` → `HTTPS_PROXY`/`HTTP_PROXY`.
220
+
221
+ ```yaml
222
+ - id: llm-grok-build-oauth
223
+ config:
224
+ proxy: http://127.0.0.1:7890
225
+ proxyKimi: false
226
+ ```
227
+
228
+ Проксируются только проверенные домены подписок (xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity); остальной трафик DSH сохраняет исходный диспетчер. Kimi по умолчанию работает напрямую и использует прокси только при `proxyKimi: true`.
229
+
230
+ ## Отказоустойчивость
231
+
232
+ OAuth access token обновляется **за пять минут** до сохранённого срока (pi-ai 0.84+). Если апстрим всё же отклоняет локально ещё живой токен кодом 401/403, плагин сдвигает сохранённый `expires` в прошлое, и повторный шаг сначала обновляет токен, затем повторяет запрос.
233
+
234
+ Повторы идут по политике harness: временные сбои (`RATE_LIMIT`/`SERVER`/`TIMEOUT`/`TRANSPORT`/`EMPTY_RESPONSE`) **и `AUTH`** повторяются с экспоненциальной задержкой (5 попыток, 5 с → 10 с → 20 с → 40 с → 80 с (~155 с суммарно), 10% jitter). Исчерпание квоты и мёртвый refresh token **не** повторяются. Переопределение для развёртывания:
235
+
236
+ ```yaml
237
+ - id: llm-grok-build-oauth
238
+ config:
239
+ retryPolicy:
240
+ mode: normal
241
+ maxRetries: 5
242
+ retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
243
+ backoff: { initialDelayMs: 5000, maxDelayMs: 80000, jitterRatio: 0.1 }
244
+ ```
245
+
246
+ ## Учётные данные
247
+
248
+ Только-владелец `0600`, атомарная запись, межпроцессная блокировка файла:
249
+
250
+ - `$DSH_HOME/.grok-build-auth.json`
251
+ - `$DSH_HOME/.codex-oauth-auth.json`
252
+ - `$DSH_HOME/.kimi-code-oauth-auth.json`
253
+ - `$DSH_HOME/.claude-code-oauth-auth.json`
254
+
255
+ Кеши выбора живут в соответствующих файлах `*-models.json`. **Ни один HTTP-статус, лог или интерфейс не должен возвращать токен.**
256
+
257
+ ## Архитектура
258
+
259
+ ```mermaid
260
+ flowchart LR
261
+ subgraph DSH["DSH Harness"]
262
+ UI[Настройки / Web · Coding OAuth] --> LLM[llm route]
263
+ LLM --> ALIA[Адаптер алиасов маршрутов]
264
+ end
265
+ ALIA --> PI[нативный провайдер pi-ai<br/>OAuth · refresh · stream]
266
+ PI --> GROK[Grok Build]
267
+ PI --> COD[Codex]
268
+ PI --> KIMI[Kimi]
269
+ PI --> CLAU[Claude]
270
+ AGY[плагин dsh-agy] --> GAL[Google Antigravity]
271
+ ```
272
+
273
+ ## Технические заметки
274
+
275
+ - **Grok Build**: собственный провайдер Responses на `cli-chat-proxy.grok.com/v1`, заголовки fingerprint CLI, динамический каталог моделей.
276
+ - **Codex/Kimi/Claude**: нативные провайдеры pi-ai отвечают за OAuth и refresh; адаптер алиасов маршрутов сопоставляет их с нативными id, при этом идентичность модели не меняется.
277
+ - Токен доступа Kimi явно преобразуется в `Authorization: Bearer` — никогда не отправляется по ошибке как `x-api-key` Anthropic.
278
+ - Google Antigravity здесь **не** реверс-инжинирится; используется выделенный плагин DSH с зафиксированной версией.
279
+
280
+ ## Соответствие
281
+
282
+ Использование подписок на кодинг через сторонний harness может находиться в серой зоне условий каждого вендора и вызывать контроль квот, региона или риска аккаунта. **Используйте только свои аккаунты**; этот проект не поддерживает массовые аккаунты, перепродажу квот, удалённый relay, обход paywall или выдачу себя за клиента. Для коммерческого использования предпочитайте официальные каналы API-ключей вендоров.
283
+
284
+ ## Документация
285
+
286
+ | Документ | Назначение |
287
+ |---|---|
288
+ | [`INSTALL.md`](INSTALL.md) | Детали установки и использования |
289
+ | [`CHANGELOG.md`](CHANGELOG.md) | История релизов |
290
+ | [`docs/00-project-rules.md`](docs/00-project-rules.md) | Версионирование, цикл релиза, разделение публичное/личное |
291
+ | [`docs/02-architecture.md`](docs/02-architecture.md) | Внутренняя архитектура (маршруты, поток данных, модули, API) · [中文](docs/02-architecture.zh-CN.md) |
292
+ | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Руководство по участию |
293
+
294
+ ## Связанное
295
+
296
+ - [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) — отдельный зафиксированный плагин для Google Antigravity.
297
+
298
+ ## Участие
299
+
300
+ Приветствуются любые вклады — фичи, документация, переводы, отчёты об ошибках. См. **[CONTRIBUTING](CONTRIBUTING.md)** о порядке, конвенциях коммитов и цикле релиза. Если вашего языка нет в списке, отправьте PR с переводом README, и мы добавим его в таблицу выше.
301
+
302
+ ## Лицензия
303
+
304
+ [Apache-2.0](LICENSE) · см. [NOTICE](NOTICE). Части заимствованы из проекта [dsh-xai](https://github.com/MirDie/dsh-xai) (Apache-2.0).