dsh-coding-subscription-oauth 0.6.4 → 0.7.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 (151) hide show
  1. package/CHANGELOG.md +291 -255
  2. package/CONTRIBUTING.md +138 -129
  3. package/INSTALL.md +261 -256
  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 +321 -320
  12. package/README.pt-BR.md +304 -304
  13. package/README.ru.md +304 -304
  14. package/README.zh-CN.md +319 -318
  15. package/compatibility/dsh-bom.json +36 -30
  16. package/cordis.patch.yml +13 -13
  17. package/docs/00-project-rules.md +213 -212
  18. package/docs/02-architecture.md +142 -138
  19. package/docs/02-architecture.zh-CN.md +142 -138
  20. package/lib/auth-routes.d.ts +10 -1
  21. package/lib/auth-routes.d.ts.map +1 -1
  22. package/lib/bin.js +483 -50
  23. package/lib/bin.js.map +4 -4
  24. package/lib/client.js +5 -5
  25. package/lib/client.js.map +4 -4
  26. package/lib/compatibility.d.ts +0 -1
  27. package/lib/compatibility.d.ts.map +1 -1
  28. package/lib/gateway-protocol.d.ts +3 -46
  29. package/lib/gateway-protocol.d.ts.map +1 -1
  30. package/lib/gateway-routes.d.ts.map +1 -1
  31. package/lib/grok-errors.d.ts +2 -12
  32. package/lib/grok-errors.d.ts.map +1 -1
  33. package/lib/grok-imagine/client.d.ts +73 -0
  34. package/lib/grok-imagine/client.d.ts.map +1 -0
  35. package/lib/grok-imagine/index.d.ts +8 -0
  36. package/lib/grok-imagine/index.d.ts.map +1 -0
  37. package/lib/grok-imagine/net.d.ts +10 -0
  38. package/lib/grok-imagine/net.d.ts.map +1 -0
  39. package/lib/grok-imagine/parse.d.ts +20 -0
  40. package/lib/grok-imagine/parse.d.ts.map +1 -0
  41. package/lib/grok-imagine/types.d.ts +191 -0
  42. package/lib/grok-imagine/types.d.ts.map +1 -0
  43. package/lib/grok-imagine.d.ts +3 -263
  44. package/lib/grok-imagine.d.ts.map +1 -1
  45. package/lib/http-json.d.ts +2 -9
  46. package/lib/http-json.d.ts.map +1 -1
  47. package/lib/ids.d.ts +4 -0
  48. package/lib/ids.d.ts.map +1 -1
  49. package/lib/index.d.ts +2 -1
  50. package/lib/index.d.ts.map +1 -1
  51. package/lib/index.js +730 -196
  52. package/lib/index.js.map +4 -4
  53. package/lib/invariant.js.map +1 -1
  54. package/lib/kimi-errors.d.ts +2 -12
  55. package/lib/kimi-errors.d.ts.map +1 -1
  56. package/lib/oauth-session.d.ts +2 -0
  57. package/lib/oauth-session.d.ts.map +1 -1
  58. package/lib/session.d.ts +2 -0
  59. package/lib/session.d.ts.map +1 -1
  60. package/lib/store.d.ts +73 -1
  61. package/lib/store.d.ts.map +1 -1
  62. package/media/en/settings_accounts.png +0 -0
  63. package/media/en/settings_capabilities.png +0 -0
  64. package/media/en/settings_gateway.png +0 -0
  65. package/media/settings_accounts.png +0 -0
  66. package/media/settings_capabilities.png +0 -0
  67. package/media/settings_gateway.png +0 -0
  68. package/media/settings_overview.png +0 -0
  69. package/media/zh-CN/settings_accounts.png +0 -0
  70. package/media/zh-CN/settings_capabilities.png +0 -0
  71. package/media/zh-CN/settings_gateway.png +0 -0
  72. package/package.json +224 -221
  73. package/patches/dsh-agy@0.1.2.patch +25 -25
  74. package/scripts/release.mjs +187 -186
  75. package/scripts/smoke-deployed-routes.mjs +146 -146
  76. package/scripts/verify-deployed-catalog.mjs +87 -87
  77. package/src/adapter.ts +0 -348
  78. package/src/alias-adapter.ts +0 -147
  79. package/src/auth-routes.ts +0 -921
  80. package/src/auth.ts +0 -67
  81. package/src/bin.ts +0 -350
  82. package/src/capability-routes.ts +0 -279
  83. package/src/capability-runtime.ts +0 -314
  84. package/src/capability-settings.ts +0 -671
  85. package/src/capability-tools.ts +0 -685
  86. package/src/catalog.ts +0 -271
  87. package/src/client/GrokBuildSettings.tsx +0 -771
  88. package/src/client/api.ts +0 -88
  89. package/src/client/components/AboutTab.tsx +0 -30
  90. package/src/client/components/AccountsTab.tsx +0 -241
  91. package/src/client/components/Badge.tsx +0 -33
  92. package/src/client/components/CapabilitiesTab.tsx +0 -265
  93. package/src/client/components/CliPullPreview.tsx +0 -116
  94. package/src/client/components/CopyButton.tsx +0 -57
  95. package/src/client/components/GatewayTab.tsx +0 -469
  96. package/src/client/components/NoticeBanner.tsx +0 -46
  97. package/src/client/components/ProgressBar.tsx +0 -53
  98. package/src/client/components/ProviderCard.tsx +0 -606
  99. package/src/client/components/SettingsTabs.tsx +0 -75
  100. package/src/client/components/ToggleSwitch.tsx +0 -71
  101. package/src/client/constants.ts +0 -230
  102. package/src/client/display.ts +0 -61
  103. package/src/client/dshClientAdapter.ts +0 -127
  104. package/src/client/gatewaySnippets.ts +0 -37
  105. package/src/client/index.tsx +0 -156
  106. package/src/client/locales.ts +0 -540
  107. package/src/client/microStyles.ts +0 -52
  108. package/src/client/parsers.ts +0 -398
  109. package/src/client/styles.ts +0 -325
  110. package/src/client/types.ts +0 -199
  111. package/src/codex-http.ts +0 -447
  112. package/src/codex-images.ts +0 -503
  113. package/src/codex-model-capabilities.ts +0 -320
  114. package/src/codex-search.ts +0 -245
  115. package/src/codex-usage.ts +0 -263
  116. package/src/compatibility.ts +0 -55
  117. package/src/dsh-host-adapter.ts +0 -173
  118. package/src/gateway-anthropic-messages.ts +0 -84
  119. package/src/gateway-auth.ts +0 -102
  120. package/src/gateway-backend.ts +0 -274
  121. package/src/gateway-body.ts +0 -49
  122. package/src/gateway-config.ts +0 -76
  123. package/src/gateway-http.ts +0 -104
  124. package/src/gateway-openai-chat.ts +0 -124
  125. package/src/gateway-openai-responses.ts +0 -53
  126. package/src/gateway-parse.ts +0 -224
  127. package/src/gateway-protocol.ts +0 -52
  128. package/src/gateway-routes.ts +0 -158
  129. package/src/gateway.ts +0 -258
  130. package/src/grok-errors.ts +0 -24
  131. package/src/grok-imagine.ts +0 -1627
  132. package/src/grok-import.ts +0 -151
  133. package/src/http-json.ts +0 -82
  134. package/src/ids.ts +0 -59
  135. package/src/imagine-routes.ts +0 -463
  136. package/src/index.ts +0 -735
  137. package/src/invariant.ts +0 -17
  138. package/src/kimi-errors.ts +0 -26
  139. package/src/media-store.ts +0 -927
  140. package/src/oauth-import-routes.ts +0 -324
  141. package/src/oauth-providers.ts +0 -152
  142. package/src/oauth-session.ts +0 -183
  143. package/src/oauth-sources.ts +0 -1104
  144. package/src/oauth.ts +0 -620
  145. package/src/provider.ts +0 -128
  146. package/src/proxy.ts +0 -11
  147. package/src/redact.ts +0 -72
  148. package/src/session.ts +0 -218
  149. package/src/store.ts +0 -217
  150. package/src/web-origin.ts +0 -296
  151. package/src/web-routes.ts +0 -38
package/README.ko.md CHANGED
@@ -1,304 +1,304 @@
1
-
2
- <!-- banner -->
3
- <div align="center">
4
-
5
- # 🔐 dsh-coding-subscription-oauth
6
-
7
- **v0.6.4 · 이전 이름 `dsh-grok-build`
8
-
9
- **[DeepSeek Harness](https://github.com/deepseek-ai/dsh)용 코딩 구독 OAuth 플러그인.** 이미 결제한 구독으로 한 번에 로그인하고, dsh 설정 페이지나 CLI에서 그 모델을 사용하세요. **채팅에 토큰을 붙여넣을 필요가 없습니다.**
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
- 처음에는 Grok Build 전용 **`dsh-grok-build`** 였습니다. 지금은 SuperGrok / Codex / Kimi / Claude / Antigravity 코딩 구독 OAuth입니다.
27
- | | 이것을 쓰세요 | 계속 동작 |
28
- |---|---|---|
29
- | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build`(같은 `main`) |
30
- | npm | `dsh-coding-subscription-oauth@0.6.4`(현재 릴리스) | 레거시 npm 패키지는 게시된 적 없음 |
31
- | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
32
- | Cordis 플러그인 id | `llm-grok-build-oauth` | 그대로 |
33
- | 설정 페이지 HTTP API | `/plugins/dsh-grok-build/*` | 그대로 |
34
- | 자격 증명 파일 | `$DSH_HOME/.grok-build-auth.json` 및 기타 `*-oauth-auth.json` | 그대로 |
35
-
36
- ## ✨ 기능
37
-
38
- - 🧾 **내 구독 그대로 사용** — 별도 API key 없이 이미 결제한 코딩 플랜을 사용합니다.
39
- - 🔑 **로컬 OAuth, 키 붙여넣기 불필요** — 설정 페이지나 CLI에서 인증하며, 토큰이 채팅에 들어가지 않습니다.
40
- - 🧩 **하나의 플러그인, 다섯 프로바이더** — Grok Build, Codex, Kimi, Claude, Google Antigravity.
41
- - 🛡️ **안전한 설계** — 인증 파일은 소유자 전용 `0600`, 원자적 쓰기, 크로스 프로세스 파일 잠금.
42
- - ⚙️ **동적 카탈로그** — 선택기에는 인증을 완료한 라우트만 `(OAuth)` 라벨과 함께 표시되며, grok-4.6의 `xhigh`도 포함됩니다.
43
- - 🌐 **프록시 인지형** — 검증된 신뢰 가능한 구독 도메인만 프록시합니다.
44
- - 📥 **수동 CLI Pull** — 설정 페이지가 허용 목록에 있는 공식 Grok/Codex/Kimi/Claude CLI OAuth 파일을 읽기 전용으로 검색합니다. 미리보기와 덮어쓰기 확인 후 단방향 복사본을 가져옵니다.
45
- - 🗂️ **탭으로 나뉜 설정** — Accounts, Gateway, Capabilities, About. 원격 호스트에서는 device code를 우선하고 CLI missing 소음을 줄이며, 로그인된 카드는 펼칠 때까지 접혀 있습니다.
46
- - 🎛️ **선택적 기능 (기본 꺼짐)** — Codex 검색, 사용량/쿼터, 이미지 생성/편집, Fast, Grok Imagine은 스위치를 켜면 즉시 적용됩니다. 추가 기본 꺼짐 스위치로 비 Codex 모델 라우트가 Codex 이미지 도구를 호출할 수 있지만 Codex 로그인, 세션, 첨부 파일 소유권 검사는 그대로 유지됩니다.
47
- - 🔌 **옵트인 로컬 API 게이트웨이** — 기본 꺼짐의 루프백 OpenAI/Anthropic 호환 서버. 내 도구 전용이며 공개 릴레이가 아닙니다.
48
-
49
- ## 이 플러그인이 푸는 연동 문제
50
-
51
- 코딩 구독을 DSH에 붙일 때 아래 검색어·오류로 이 저장소에 오는 경우가 많습니다.
52
-
53
- | 검색 / 화면 | 실제 원인 | 이 플러그인 |
54
- |---|---|---|
55
- | SuperGrok / X Premium를 DSH에, Grok Build vs `api.x.ai` | 내장 `xai`는 종량 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 만료 | 만료 **5분 전** refresh. 401이면 저장 토큰을 무효화하고 step 재시도 |
57
- | Codex/Kimi 두 번째 턴 `INVALID_REPLAY_STATE` | replay가 pi-ai 네이티브 provider id를 유지 | Harness route id를 유지하고 오염된 replay를 복구 |
58
- | grok-4.6에 **xhigh**가 없음 | `/v1/models-v2`의 `reasoning_efforts`를 버리고 4.5 템플릿을 복제 | live efforts를 `thinkingLevelMap`에 반영. 4.6은 xhigh, 4.5는 low/medium/high |
59
- | Kimi Code가 Anthropic `x-api-key`로 나감 | OAuth token을 Anthropic 키로 전송 | `Authorization: Bearer`만 사용 |
60
- | 로그인하지 않은 모델이 선택기에 남음 | 등록된 모든 라우트를 나열 | 미인증은 빈 목록. 인증됨은 `(OAuth)` |
61
- | 원격/헤드리스에서 PKCE 불가 | localhost로 돌아올 수 없음 | Grok/Codex/Kimi는 디바이스 코드. Claude는 redirect URL 붙여넣기 |
62
- | 프록시로 Grok은 되고 중국 Kimi는 죽음 | 전역 `HTTPS_PROXY` | 허용 도메인만. Kimi는 기본 직결(`proxyKimi: true`일 때만 프록시) |
63
-
64
- ## 지원 프로바이더
65
-
66
- | 프로바이더 | 라우트 | 인증 | 기존 API-key 라우트와 공존 |
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는 `@earendil-works/pi-ai`의 네이티브 OAuth/리프레시를 재사용하며 벤더 플로우를 재구현하지 않습니다.
75
-
76
- ## 🚀 빠른 시작
77
-
78
- ```bash
79
- # 1. web 프로필에 플러그인 설치 (현재 npm 릴리스)
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
- # 개발/대안: 로컬 개발 디렉터리에서
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 도구 호출 + 두 번째 사용자 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 | 인증 코드 · 디바이스 코드 · Grok CLI import · 모델 선택 |
170
- | Codex | 디바이스 코드(원격 DSH 권장) · 브라우저 PKCE |
171
- | Kimi | 디바이스 코드 |
172
- | Claude | 브라우저 PKCE(원격 브라우저는 전체 localhost redirect URL을 붙여넣기 가능) |
173
- | Antigravity | `dsh-agy` 설치 상태 + profile-local CLI 명령 |
174
-
175
- 설정 페이지는 **Accounts**, **Gateway**, **Capabilities**, **About** 네 개의 상위 탭으로 나뉩니다. 로그인된 프로바이더 카드는 간결한 요약으로 접히고 모델 편집 시 펼쳐집니다. CLI pull 미리보기는 전체 너비로 표시되고, Imagine 상태는 Capabilities 탭에서 확인할 수 있습니다.
176
-
177
- 선택기는 인증을 완료한 라우트만 나열하며, 인증되지 않은 프로바이더는 빈 목록을 반환합니다. 프로바이더 이름에는 `(OAuth)`가 붙고, 로그인/아웃 후 `llm/adapters-updated`를 통해 카탈로그가 갱신됩니다.
178
-
179
- ## 선택적 기능
180
-
181
- 8개 스위치 `codexSearch`, `codexImages`, `codexImageEdits`, `codexImagesAnyModel`, `codexUsage`, `codexFast`, `grokImagineImage`, `grokImagineVideo`는 모두 기본적으로 꺼져 있으며 재시작 없이 즉시 적용됩니다. `codexImagesAnyModel`은 호출 모델 라우트 게이트만 완화합니다. 여전히 Codex 로그인, `codexImages`(편집 시 edits 플래그), 세션 첨부 소유권 및 편집 인가가 필요합니다. 숫자 설정은 `searchResults`(1–20, 기본 5), `imageCount`(1–4, 기본 1), `videoArtifactTtlMs`(1시간–7일, 기본 7일, UI에서는 1–168시간)입니다. 보존 시간을 낮추면 기존 아티팩트도 즉시 단축·정리되며, 높인 값은 이후 생성된 아티팩트에만 적용됩니다.
182
-
183
- ## 로컬 API 게이트웨이
184
-
185
- 기본값은 **꺼짐**입니다. 활성화하면 DSH 웹 포트와 분리된 독립 `node:http` 서버가 `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`)에 저장됩니다. 설정에서 OpenAI 베이스 URL(베이스 + `/v1`), Anthropic 베이스 URL, 현재 Bearer 키를 로테이션 없이 복사할 수 있습니다. 키 표시는 루프백에서만 가능하며 브라우저 스토리지에 저장되지 않습니다. 로테이션은 확인이 필요한 파괴적 작업입니다. 리슨 포트는 직접 편집해 Apply로 저장하거나 Random(18100–18999)으로 채울 수 있습니다. 선택한 포트는 소유자 전용 게이트웨이 문서에 저장되고 실행 중인 리스너가 다시 바인딩됩니다. bind는 YAML에서만 변경할 수 있으며, 루프백이 아닌 bind에는 키가 필요합니다. 원격 릴레이가 아닙니다.
195
-
196
- ## CLI
197
-
198
- ```bash
199
- # `dsh-grok-build` 는 같은 CLI 별칭
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
- > `dsh-agy` CLI는 DSH 프로세스 밖에서 계정 풀을 수정하므로 프로세스 내 카탈로그 이벤트를 내보낼 수 없습니다 — 로그인/아웃 후 모델 선택기를 닫았다 다시 여세요.
212
-
213
- ## 중국에서의 Kimi
214
-
215
- Kimi Code 구독 OAuth는 `https://auth.kimi.com`, 추론은 `https://api.kimi.com/coding`을 사용합니다. `https://api.moonshot.cn/v1`은 종량제 **Moonshot Open Platform** API-key 채널이며, 전환 가능한 "중국 OAuth 엔드포인트"는 없습니다. 이 플러그인은 별도 `kimi-code-oauth` 라우트를 사용하며 기존 `kimi-coding` API-key 설정에 영향을 주지 않습니다.
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 액세스 토큰은 저장된 만료 시각 **5분 전**에 선제적으로 갱신됩니다(pi-ai 0.84+). 업스트림이 로컬에서는 아직 유효한 토큰을 401/403으로 거절하면, 플러그인이 저장된 `expires`를 과거로 되돌리고 재시도 단계에서 먼저 갱신한 뒤 다시 요청합니다.
233
-
234
- 요청 재시도는 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). 쿼터 소진과 죽은 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 상태, 로그, UI가 토큰을 반환해서는 안 됩니다.**
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 · 리프레시 · 스트림]
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**: `cli-chat-proxy.grok.com/v1`의 커스텀 Responses 프로바이더, CLI 핑거프린트 헤더, 동적 모델 카탈로그.
276
- - **Codex/Kimi/Claude**: pi-ai 네이티브 프로바이더가 OAuth와 리프레시를 처리합니다. 라우트 별칭 어댑터가 이를 네이티브 id에 매핑하되 모델 내부 아이덴티티는 변하지 않습니다.
277
- - Kimi access token은 명시적으로 `Authorization: Bearer`로 변환됩니다 — Anthropic `x-api-key`로 잘못 보내지는 일이 없습니다.
278
- - Google Antigravity는 여기서 리버스 엔지니어링**하지 않습니다**. 버전 고정형 전용 DSH 플러그인을 사용합니다.
279
-
280
- ## 준수
281
-
282
- 제3자 harness를 통한 코딩 구독 사용은 각 벤더 이용약관의 회색 지대에 놓일 수 있으며 할당량, 지역 또는 계정 리스크 관리가 트리거될 수 있습니다. **본인 계정만 사용하세요.** 이 프로젝트는 대량 계정, 할당량 재판매, 원격 릴레이, 페이월 우회, 클라이언트 사칭을 지원하지 않습니다. 상업용으로는 벤더 공식 API-key 채널을 권장합니다.
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)**을 참조하세요. 목록에 없는 언어라면 README 번역을 PR로 보내 주세요. 위 언어 테이블에 추가하겠습니다.
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.7.0 · 이전 이름 `dsh-grok-build`
8
+
9
+ **[DeepSeek Harness](https://github.com/deepseek-ai/dsh)용 코딩 구독 OAuth 플러그인.** 이미 결제한 구독으로 한 번에 로그인하고, dsh 설정 페이지나 CLI에서 그 모델을 사용하세요. **채팅에 토큰을 붙여넣을 필요가 없습니다.**
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
+ > **업그레이드:** [`INSTALL.md`](INSTALL.md)의 버전별 단계를 따르세요. `0.7.0`는 공유 dispatcher 런타임을 `dsh-coding-oauth-core@0.1.2`과 `undici@7.29.0`으로 유지하고, Gateway 키 reveal/rotate를 loopback 접근으로 제한합니다. 설정·자격 증명·데이터·라우트 마이그레이션은 필요 없습니다. Grok Imagine은 명시적으로 고정된 dispatcher를 유지합니다. `0.6.2` 이후 릴리스에는 엄격한 Cordis 주입 시작 수정과 DSH `0.1.1-rc.2` 지원이 포함됩니다. profile/설정/자격 증명 파일은 유지하고, 업데이트 후 기존 DSH Web 프로세스를 한 번만 재시작하세요. Hub Subscription 함께 사용할 `dsh-coding-oauth-core@0.1.2`과 `undici@7.29.0`은 공유 런타임 핀이며 별도의 DSH 플러그인이 아닙니다.
21
+
22
+ ---
23
+
24
+ ## 이름 변경
25
+
26
+ 처음에는 Grok Build 전용 **`dsh-grok-build`** 였습니다. 지금은 SuperGrok / Codex / Kimi / Claude / Antigravity 코딩 구독 OAuth입니다.
27
+ | | 이것을 쓰세요 | 계속 동작 |
28
+ |---|---|---|
29
+ | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build`(같은 `main`) |
30
+ | npm | `dsh-coding-subscription-oauth@0.7.0`(현재 릴리스) | 레거시 npm 패키지는 게시된 적 없음 |
31
+ | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
32
+ | Cordis 플러그인 id | `llm-grok-build-oauth` | 그대로 |
33
+ | 설정 페이지 HTTP API | `/plugins/dsh-grok-build/*` | 그대로 |
34
+ | 자격 증명 파일 | `$DSH_HOME/.grok-build-auth.json` 및 기타 `*-oauth-auth.json` | 그대로 |
35
+
36
+ ## ✨ 기능
37
+
38
+ - 🧾 **내 구독 그대로 사용** — 별도 API key 없이 이미 결제한 코딩 플랜을 사용합니다.
39
+ - 🔑 **로컬 OAuth, 키 붙여넣기 불필요** — 설정 페이지나 CLI에서 인증하며, 토큰이 채팅에 들어가지 않습니다.
40
+ - 🧩 **하나의 플러그인, 다섯 프로바이더** — Grok Build, Codex, Kimi, Claude, Google Antigravity.
41
+ - 🛡️ **안전한 설계** — 인증 파일은 소유자 전용 `0600`, 원자적 쓰기, 크로스 프로세스 파일 잠금.
42
+ - ⚙️ **동적 카탈로그** — 선택기에는 인증을 완료한 라우트만 `(OAuth)` 라벨과 함께 표시되며, grok-4.6의 `xhigh`도 포함됩니다.
43
+ - 🌐 **프록시 인지형** — 검증된 신뢰 가능한 구독 도메인만 프록시합니다.
44
+ - 📥 **수동 CLI Pull** — 설정 페이지가 허용 목록에 있는 공식 Grok/Codex/Kimi/Claude CLI OAuth 파일을 읽기 전용으로 검색합니다. 미리보기와 덮어쓰기 확인 후 단방향 복사본을 가져옵니다.
45
+ - 🗂️ **탭으로 나뉜 설정** — Accounts, Gateway, Capabilities, About. 원격 호스트에서는 device code를 우선하고 CLI missing 소음을 줄이며, 로그인된 카드는 펼칠 때까지 접혀 있습니다.
46
+ - 🎛️ **선택적 기능 (기본 꺼짐)** — Codex 검색, 사용량/쿼터, 이미지 생성/편집, Fast, Grok Imagine은 스위치를 켜면 즉시 적용됩니다. 추가 기본 꺼짐 스위치로 비 Codex 모델 라우트가 Codex 이미지 도구를 호출할 수 있지만 Codex 로그인, 세션, 첨부 파일 소유권 검사는 그대로 유지됩니다.
47
+ - 🔌 **옵트인 로컬 API 게이트웨이** — 기본 꺼짐의 루프백 OpenAI/Anthropic 호환 서버. 내 도구 전용이며 공개 릴레이가 아닙니다.
48
+
49
+ ## 이 플러그인이 푸는 연동 문제
50
+
51
+ 코딩 구독을 DSH에 붙일 때 아래 검색어·오류로 이 저장소에 오는 경우가 많습니다.
52
+
53
+ | 검색 / 화면 | 실제 원인 | 이 플러그인 |
54
+ |---|---|---|
55
+ | SuperGrok / X Premium를 DSH에, Grok Build vs `api.x.ai` | 내장 `xai`는 종량 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 만료 | 만료 **5분 전** refresh. 401이면 저장 토큰을 무효화하고 step 재시도 |
57
+ | Codex/Kimi 두 번째 턴 `INVALID_REPLAY_STATE` | replay가 pi-ai 네이티브 provider id를 유지 | Harness route id를 유지하고 오염된 replay를 복구 |
58
+ | grok-4.6에 **xhigh**가 없음 | `/v1/models-v2`의 `reasoning_efforts`를 버리고 4.5 템플릿을 복제 | live efforts를 `thinkingLevelMap`에 반영. 4.6은 xhigh, 4.5는 low/medium/high |
59
+ | Kimi Code가 Anthropic `x-api-key`로 나감 | OAuth token을 Anthropic 키로 전송 | `Authorization: Bearer`만 사용 |
60
+ | 로그인하지 않은 모델이 선택기에 남음 | 등록된 모든 라우트를 나열 | 미인증은 빈 목록. 인증됨은 `(OAuth)` |
61
+ | 원격/헤드리스에서 PKCE 불가 | localhost로 돌아올 수 없음 | Grok/Codex/Kimi는 디바이스 코드. Claude는 redirect URL 붙여넣기 |
62
+ | 프록시로 Grok은 되고 중국 Kimi는 죽음 | 전역 `HTTPS_PROXY` | 허용 도메인만. Kimi는 기본 직결(`proxyKimi: true`일 때만 프록시) |
63
+
64
+ ## 지원 프로바이더
65
+
66
+ | 프로바이더 | 라우트 | 인증 | 기존 API-key 라우트와 공존 |
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는 `@earendil-works/pi-ai`의 네이티브 OAuth/리프레시를 재사용하며 벤더 플로우를 재구현하지 않습니다.
75
+
76
+ ## 🚀 빠른 시작
77
+
78
+ ```bash
79
+ # 1. web 프로필에 플러그인 설치 (현재 npm 릴리스)
80
+ dsh plugin --profile web add dsh-coding-subscription-oauth@0.7.0
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.7.0
122
+
123
+ # 개발/대안: GitHub에서
124
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
125
+
126
+ # 개발/대안: 로컬 개발 디렉터리에서
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 도구 호출 + 두 번째 사용자 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 | 인증 코드 · 디바이스 코드 · Grok CLI import · 모델 선택 |
170
+ | Codex | 디바이스 코드(원격 DSH 권장) · 브라우저 PKCE |
171
+ | Kimi | 디바이스 코드 |
172
+ | Claude | 브라우저 PKCE(원격 브라우저는 전체 localhost redirect URL을 붙여넣기 가능) |
173
+ | Antigravity | `dsh-agy` 설치 상태 + profile-local CLI 명령 |
174
+
175
+ 설정 페이지는 **Accounts**, **Gateway**, **Capabilities**, **About** 네 개의 상위 탭으로 나뉩니다. 로그인된 프로바이더 카드는 간결한 요약으로 접히고 모델 편집 시 펼쳐집니다. CLI pull 미리보기는 전체 너비로 표시되고, Imagine 상태는 Capabilities 탭에서 확인할 수 있습니다.
176
+
177
+ 선택기는 인증을 완료한 라우트만 나열하며, 인증되지 않은 프로바이더는 빈 목록을 반환합니다. 프로바이더 이름에는 `(OAuth)`가 붙고, 로그인/아웃 후 `llm/adapters-updated`를 통해 카탈로그가 갱신됩니다.
178
+
179
+ ## 선택적 기능
180
+
181
+ 8개 스위치 `codexSearch`, `codexImages`, `codexImageEdits`, `codexImagesAnyModel`, `codexUsage`, `codexFast`, `grokImagineImage`, `grokImagineVideo`는 모두 기본적으로 꺼져 있으며 재시작 없이 즉시 적용됩니다. `codexImagesAnyModel`은 호출 모델 라우트 게이트만 완화합니다. 여전히 Codex 로그인, `codexImages`(편집 시 edits 플래그), 세션 첨부 소유권 및 편집 인가가 필요합니다. 숫자 설정은 `searchResults`(1–20, 기본 5), `imageCount`(1–4, 기본 1), `videoArtifactTtlMs`(1시간–7일, 기본 7일, UI에서는 1–168시간)입니다. 보존 시간을 낮추면 기존 아티팩트도 즉시 단축·정리되며, 높인 값은 이후 생성된 아티팩트에만 적용됩니다.
182
+
183
+ ## 로컬 API 게이트웨이
184
+
185
+ 기본값은 **꺼짐**입니다. 활성화하면 DSH 웹 포트와 분리된 독립 `node:http` 서버가 `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`)에 저장됩니다. 설정에서 OpenAI 베이스 URL(베이스 + `/v1`), Anthropic 베이스 URL, 현재 Bearer 키를 로테이션 없이 복사할 수 있습니다. 키 표시는 루프백에서만 가능하며 브라우저 스토리지에 저장되지 않습니다. 로테이션은 확인이 필요한 파괴적 작업입니다. 리슨 포트는 직접 편집해 Apply로 저장하거나 Random(18100–18999)으로 채울 수 있습니다. 선택한 포트는 소유자 전용 게이트웨이 문서에 저장되고 실행 중인 리스너가 다시 바인딩됩니다. bind는 YAML에서만 변경할 수 있으며, 루프백이 아닌 bind에는 키가 필요합니다. 원격 릴레이가 아닙니다.
195
+
196
+ ## CLI
197
+
198
+ ```bash
199
+ # `dsh-grok-build` 는 같은 CLI 별칭
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
+ > `dsh-agy` CLI는 DSH 프로세스 밖에서 계정 풀을 수정하므로 프로세스 내 카탈로그 이벤트를 내보낼 수 없습니다 — 로그인/아웃 후 모델 선택기를 닫았다 다시 여세요.
212
+
213
+ ## 중국에서의 Kimi
214
+
215
+ Kimi Code 구독 OAuth는 `https://auth.kimi.com`, 추론은 `https://api.kimi.com/coding`을 사용합니다. `https://api.moonshot.cn/v1`은 종량제 **Moonshot Open Platform** API-key 채널이며, 전환 가능한 "중국 OAuth 엔드포인트"는 없습니다. 이 플러그인은 별도 `kimi-code-oauth` 라우트를 사용하며 기존 `kimi-coding` API-key 설정에 영향을 주지 않습니다.
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 액세스 토큰은 저장된 만료 시각 **5분 전**에 선제적으로 갱신됩니다(pi-ai 0.84+). 업스트림이 로컬에서는 아직 유효한 토큰을 401/403으로 거절하면, 플러그인이 저장된 `expires`를 과거로 되돌리고 재시도 단계에서 먼저 갱신한 뒤 다시 요청합니다.
233
+
234
+ 요청 재시도는 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). 쿼터 소진과 죽은 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 상태, 로그, UI가 토큰을 반환해서는 안 됩니다.**
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 · 리프레시 · 스트림]
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**: `cli-chat-proxy.grok.com/v1`의 커스텀 Responses 프로바이더, CLI 핑거프린트 헤더, 동적 모델 카탈로그.
276
+ - **Codex/Kimi/Claude**: pi-ai 네이티브 프로바이더가 OAuth와 리프레시를 처리합니다. 라우트 별칭 어댑터가 이를 네이티브 id에 매핑하되 모델 내부 아이덴티티는 변하지 않습니다.
277
+ - Kimi access token은 명시적으로 `Authorization: Bearer`로 변환됩니다 — Anthropic `x-api-key`로 잘못 보내지는 일이 없습니다.
278
+ - Google Antigravity는 여기서 리버스 엔지니어링**하지 않습니다**. 버전 고정형 전용 DSH 플러그인을 사용합니다.
279
+
280
+ ## 준수
281
+
282
+ 제3자 harness를 통한 코딩 구독 사용은 각 벤더 이용약관의 회색 지대에 놓일 수 있으며 할당량, 지역 또는 계정 리스크 관리가 트리거될 수 있습니다. **본인 계정만 사용하세요.** 이 프로젝트는 대량 계정, 할당량 재판매, 원격 릴레이, 페이월 우회, 클라이언트 사칭을 지원하지 않습니다. 상업용으로는 벤더 공식 API-key 채널을 권장합니다.
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)**을 참조하세요. 목록에 없는 언어라면 README 번역을 PR로 보내 주세요. 위 언어 테이블에 추가하겠습니다.
301
+
302
+ ## 라이선스
303
+
304
+ [Apache-2.0](LICENSE) · [NOTICE](NOTICE) 참조. 일부는 [dsh-xai](https://github.com/MirDie/dsh-xai) 프로젝트(Apache-2.0)에서 파생되었습니다.