dsh-coding-subscription-oauth 0.7.0 โ†’ 0.8.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 (43) hide show
  1. package/CHANGELOG.md +312 -296
  2. package/CONTRIBUTING.md +138 -138
  3. package/INSTALL.md +267 -261
  4. package/LICENSE +19 -19
  5. package/NOTICE +11 -11
  6. package/README.de.md +309 -303
  7. package/README.es.md +310 -304
  8. package/README.fr.md +310 -304
  9. package/README.ja.md +310 -304
  10. package/README.ko.md +310 -304
  11. package/README.md +327 -321
  12. package/README.pt-BR.md +310 -304
  13. package/README.ru.md +310 -304
  14. package/README.zh-CN.md +325 -319
  15. package/compatibility/dsh-bom.json +36 -36
  16. package/cordis.patch.yml +13 -13
  17. package/docs/00-project-rules.md +213 -213
  18. package/docs/02-architecture.md +143 -142
  19. package/docs/02-architecture.zh-CN.md +143 -142
  20. package/lib/adapter.d.ts.map +1 -1
  21. package/lib/bin.js +13 -6
  22. package/lib/bin.js.map +3 -3
  23. package/lib/client.js +3 -3
  24. package/lib/client.js.map +4 -4
  25. package/lib/gateway-auth.d.ts +1 -0
  26. package/lib/gateway-auth.d.ts.map +1 -1
  27. package/lib/gateway-config.d.ts +4 -0
  28. package/lib/gateway-config.d.ts.map +1 -1
  29. package/lib/gateway-http.d.ts +5 -0
  30. package/lib/gateway-http.d.ts.map +1 -1
  31. package/lib/gateway-opencode-go.d.ts +22 -0
  32. package/lib/gateway-opencode-go.d.ts.map +1 -0
  33. package/lib/gateway.d.ts +2 -0
  34. package/lib/gateway.d.ts.map +1 -1
  35. package/lib/index.js +278 -63
  36. package/lib/index.js.map +4 -4
  37. package/lib/invariant.js.map +1 -1
  38. package/package.json +229 -226
  39. package/patches/dsh-agy@0.1.2.patch +25 -25
  40. package/scripts/release.mjs +187 -187
  41. package/scripts/smoke-deployed-routes.mjs +146 -146
  42. package/scripts/verify-adapter-host.mjs +70 -0
  43. package/scripts/verify-deployed-catalog.mjs +87 -87
package/README.ko.md CHANGED
@@ -1,304 +1,310 @@
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)์—์„œ ํŒŒ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
1
+
2
+ <!-- banner -->
3
+ <div align="center">
4
+
5
+ # ๐Ÿ” dsh-coding-subscription-oauth
6
+
7
+ **v0.8.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.8.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
+ - ๐Ÿค **์˜ตํŠธ์ธ OpenCode Go ํ˜ธํ™˜** โ€” ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ OpenCode Go๋กœ ์ฑ„ํŒ…์„ ํ”„๋ก์‹œํ•˜๊ณ  sticky `x-opencode-session`์„ ์ฃผ์ž…(`MissingSessionID` ๋ฐฉ์ง€); ๊ธฐ๋ณธ off.
49
+
50
+ ## ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ‘ธ๋Š” ์—ฐ๋™ ๋ฌธ์ œ
51
+
52
+ ์ฝ”๋”ฉ ๊ตฌ๋…์„ DSH์— ๋ถ™์ผ ๋•Œ ์•„๋ž˜ ๊ฒ€์ƒ‰์–ดยท์˜ค๋ฅ˜๋กœ ์ด ์ €์žฅ์†Œ์— ์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
53
+
54
+ | ๊ฒ€์ƒ‰ / ํ™”๋ฉด | ์‹ค์ œ ์›์ธ | ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ |
55
+ |---|---|---|
56
+ | 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 ๋ฐฉ์ง€ |
57
+ | `API key is invalid` / `AUTH` | GUI๋Š” ๋ชจ๋“  AUTH๋ฅผ ๊ทธ ๋ฌธ๊ตฌ๋กœ ํ‘œ์‹œ. ํ”ํžˆ ์งง์€ OAuth access token ๋งŒ๋ฃŒ | ๋งŒ๋ฃŒ **5๋ถ„ ์ „** refresh. 401์ด๋ฉด ์ €์žฅ ํ† ํฐ์„ ๋ฌดํšจํ™”ํ•˜๊ณ  step ์žฌ์‹œ๋„ |
58
+ | Codex/Kimi ๋‘ ๋ฒˆ์งธ ํ„ด `INVALID_REPLAY_STATE` | replay๊ฐ€ pi-ai ๋„ค์ดํ‹ฐ๋ธŒ provider id๋ฅผ ์œ ์ง€ | Harness route id๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์˜ค์—ผ๋œ replay๋ฅผ ๋ณต๊ตฌ |
59
+ | grok-4.6์— **xhigh**๊ฐ€ ์—†์Œ | `/v1/models-v2`์˜ `reasoning_efforts`๋ฅผ ๋ฒ„๋ฆฌ๊ณ  4.5 ํ…œํ”Œ๋ฆฟ์„ ๋ณต์ œ | live efforts๋ฅผ `thinkingLevelMap`์— ๋ฐ˜์˜. 4.6์€ xhigh, 4.5๋Š” low/medium/high |
60
+ | Kimi Code๊ฐ€ Anthropic `x-api-key`๋กœ ๋‚˜๊ฐ | OAuth token์„ Anthropic ํ‚ค๋กœ ์ „์†ก | `Authorization: Bearer`๋งŒ ์‚ฌ์šฉ |
61
+ | ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ๋ชจ๋ธ์ด ์„ ํƒ๊ธฐ์— ๋‚จ์Œ | ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋ผ์šฐํŠธ๋ฅผ ๋‚˜์—ด | ๋ฏธ์ธ์ฆ์€ ๋นˆ ๋ชฉ๋ก. ์ธ์ฆ๋จ์€ `(OAuth)` |
62
+ | ์›๊ฒฉ/ํ—ค๋“œ๋ฆฌ์Šค์—์„œ PKCE ๋ถˆ๊ฐ€ | localhost๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์—†์Œ | Grok/Codex/Kimi๋Š” ๋””๋ฐ”์ด์Šค ์ฝ”๋“œ. Claude๋Š” redirect URL ๋ถ™์—ฌ๋„ฃ๊ธฐ |
63
+ | ํ”„๋ก์‹œ๋กœ Grok์€ ๋˜๊ณ  ์ค‘๊ตญ Kimi๋Š” ์ฃฝ์Œ | ์ „์—ญ `HTTPS_PROXY` | ํ—ˆ์šฉ ๋„๋ฉ”์ธ๋งŒ. Kimi๋Š” ๊ธฐ๋ณธ ์ง๊ฒฐ(`proxyKimi: true`์ผ ๋•Œ๋งŒ ํ”„๋ก์‹œ) |
64
+ | OpenCode Go ์ฑ„ํŒ…์ด `MissingSessionID` / `x-opencode-session` ๋ˆ„๋ฝ์œผ๋กœ ์‹คํŒจ | ํด๋ผ์ด์–ธํŠธ๊ฐ€ sticky ์„ธ์…˜ ํ—ค๋”๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Œ | ์˜ตํŠธ์ธ ๊ฒŒ์ดํŠธ์›จ์ด OpenCode Go ํ”„๋ก์‹œ๊ฐ€ sticky `x-opencode-session` ์ฃผ์ž… |
65
+
66
+ ## ์ง€์› ํ”„๋กœ๋ฐ”์ด๋”
67
+
68
+ | ํ”„๋กœ๋ฐ”์ด๋” | ๋ผ์šฐํŠธ | ์ธ์ฆ | ๊ธฐ์กด API-key ๋ผ์šฐํŠธ์™€ ๊ณต์กด |
69
+ |---|---|---|---|
70
+ | **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
71
+ | **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
72
+ | **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
73
+ | **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | โ€” |
74
+ | **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | โ€” |
75
+
76
+ > Grok Build์˜ ๋””๋ฐ”์ด์Šค ๋กœ๊ทธ์ธ, ๋™์  `/v1/models-v2` ์นดํƒˆ๋กœ๊ทธ, Responses ์ŠคํŠธ๋ฆฌ๋ฐ ์ถ”๋ก ์€ ์‹ค์ œ ๋ฐฐํฌ์—์„œ ๊ฒ€์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Codex/Kimi/Claude๋Š” `@earendil-works/pi-ai`์˜ ๋„ค์ดํ‹ฐ๋ธŒ OAuth/๋ฆฌํ”„๋ ˆ์‹œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉฐ ๋ฒค๋” ํ”Œ๋กœ์šฐ๋ฅผ ์žฌ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
77
+
78
+ ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘
79
+
80
+ ```bash
81
+ # 1. web ํ”„๋กœํ•„์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ (ํ˜„์žฌ npm ๋ฆด๋ฆฌ์Šค)
82
+ dsh plugin --profile web add dsh-coding-subscription-oauth@0.8.0
83
+
84
+ # 2. ์„ ํƒ ์‚ฌํ•ญ โ€” Google Antigravity (๊ฒ€์ฆ๋œ ๊ณ ์ • ๋ฒ„์ „)
85
+ dsh plugin --profile web add dsh-agy@0.1.2
86
+
87
+ # 3. ์‹ค์ œ๋กœ ๊ตฌ์„ฑํ•œ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์ž๋กœ ๊ธฐ์กด DSH Web ํ”„๋กœ์„ธ์Šค ์žฌ์‹œ์ž‘
88
+ # `dsh web`์€ ๊ณต์‹ CLI ๋ณ„์นญ์ด์ง€ ์„œ๋น„์Šค ์ด๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค.
89
+ ```
90
+
91
+ ๊ทธ๋Ÿฐ ๋‹ค์Œ **Settings โ†’ Coding OAuth**๋ฅผ ์—ด๊ณ  ์›ํ•˜๋Š” ํ”„๋กœ๋ฐ”์ด๋”์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”. ์™„๋ฃŒ์ž…๋‹ˆ๋‹ค โ€” ์„ ํƒ๊ธฐ์—์„œ ์ธ์ฆ๋œ ๋ชจ๋ธ์„ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
92
+
93
+ ## ๐Ÿ“š ๋ชฉ์ฐจ
94
+
95
+ - [์ด๋ฆ„ ๋ณ€๊ฒฝ](#์ด๋ฆ„-๋ณ€๊ฒฝ)
96
+ - [๊ธฐ๋Šฅ](#-๊ธฐ๋Šฅ)
97
+ - [์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ‘ธ๋Š” ์—ฐ๋™ ๋ฌธ์ œ](#์ด-ํ”Œ๋Ÿฌ๊ทธ์ธ์ด-ํ‘ธ๋Š”-์—ฐ๋™-๋ฌธ์ œ)
98
+ - [์ง€์› ํ”„๋กœ๋ฐ”์ด๋”](#์ง€์›-ํ”„๋กœ๋ฐ”์ด๋”)
99
+ - [๋น ๋ฅธ ์‹œ์ž‘](#-๋น ๋ฅธ-์‹œ์ž‘)
100
+ - [์„ค์น˜](#์„ค์น˜)
101
+ - [์„ค์ • ํŽ˜์ด์ง€](#์„ค์ •-ํŽ˜์ด์ง€)
102
+ - [์„ ํƒ์  ๊ธฐ๋Šฅ](#์„ ํƒ์ -๊ธฐ๋Šฅ)
103
+ - [๋กœ์ปฌ API ๊ฒŒ์ดํŠธ์›จ์ด](#๋กœ์ปฌ-api-๊ฒŒ์ดํŠธ์›จ์ด)
104
+ - [CLI](#cli)
105
+ - [์ค‘๊ตญ์—์„œ์˜ Kimi](#์ค‘๊ตญ์—์„œ์˜-kimi)
106
+ - [๋„คํŠธ์›Œํฌ ํ”„๋ก์‹œ](#๋„คํŠธ์›Œํฌ-ํ”„๋ก์‹œ)
107
+ - [๋ณต์›๋ ฅ](#๋ณต์›๋ ฅ)
108
+ - [์ž๊ฒฉ ์ฆ๋ช…](#์ž๊ฒฉ-์ฆ๋ช…)
109
+ - [์•„ํ‚คํ…์ฒ˜](#์•„ํ‚คํ…์ฒ˜)
110
+ - [๊ธฐ์ˆ  ๋ฉ”๋ชจ](#๊ธฐ์ˆ -๋ฉ”๋ชจ)
111
+ - [์ค€์ˆ˜](#์ค€์ˆ˜)
112
+ - [๋ฌธ์„œ](#๋ฌธ์„œ)
113
+ - [๊ด€๋ จ ํ”„๋กœ์ ํŠธ](#๊ด€๋ จ-ํ”„๋กœ์ ํŠธ)
114
+ - [๊ธฐ์—ฌ](#๊ธฐ์—ฌ)
115
+ - [๋ผ์ด์„ ์Šค](#๋ผ์ด์„ ์Šค)
116
+
117
+ ## ์„ค์น˜
118
+
119
+ DeepSeek Harness `0.1.1-rc.2` ๋ฐ Node.js 22.19+๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [์„ค์น˜ ๋…ธํŠธ](INSTALL.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
120
+
121
+ ```bash
122
+ # ํ˜„์žฌ npm ๋ฆด๋ฆฌ์Šค (๊ถŒ์žฅ)
123
+ dsh plugin --profile web add dsh-coding-subscription-oauth@0.8.0
124
+
125
+ # ๊ฐœ๋ฐœ/๋Œ€์•ˆ: GitHub์—์„œ
126
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
127
+
128
+ # ๊ฐœ๋ฐœ/๋Œ€์•ˆ: ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ
129
+ dsh plugin --profile web add ./dsh-coding-subscription-oauth
130
+ ```
131
+
132
+ ์„ค์น˜ ํ›„ ๊ธฐ์กด DSH Web ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐฐํฌ ๊ฒ€์ฆ:
133
+
134
+ ```bash
135
+ pnpm run verify:deployed # ์‹ค์ œ /api/llm.models + OAuth ์ƒํƒœ ํ™•์ธ
136
+ DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # Google์— ๋กœ๊ทธ์ธ๋œ ๊ฒฝ์šฐ
137
+
138
+ DSH_RESTORE_PROVIDER=openai \
139
+ DSH_RESTORE_MODEL=gpt-5.6-sol \
140
+ DSH_RESTORE_REASONING=max \
141
+ pnpm run smoke:deployed # ์‹ค์ œ Codex/Kimi ๋„๊ตฌ ํ˜ธ์ถœ + ๋‘ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž turn ์žฌ์ƒ
142
+ ```
143
+
144
+ > `smoke:deployed`๋Š” ์ž„์‹œ ์„ธ์…˜์„ ๋งŒ๋“ค๊ณ  Codex์™€ Kimi ๋„๊ตฌ ํ˜ธ์ถœ ๋ฐ ๋‘ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž turn(`INVALID_REPLAY_STATE` ํšŒ๊ท€)์„ ๊ฒ€์ฆํ•œ ๋’ค ์„ ์–ธ๋œ ๊ธฐ๋ณธ ๋ชจ๋ธ์„ ๋ณต์›ํ•˜๊ณ  ์„ธ์…˜์„ ์•„์นด์ด๋ธŒํ•ฉ๋‹ˆ๋‹ค.
145
+
146
+ ## ์„ค์ • ํŽ˜์ด์ง€
147
+
148
+ **Settings โ†’ Coding OAuth**๋ฅผ ์—ด์–ด ์ฃผ์„ธ์š”:
149
+
150
+
151
+
152
+ <table>
153
+ <tr>
154
+ <td align="center" valign="top" width="33%">
155
+ <a href="media/en/settings_accounts.png"><img src="media/en/settings_accounts.png" alt="Coding OAuth Accounts tab" width="280" /></a><br />
156
+ <sub>Accounts</sub>
157
+ </td>
158
+ <td align="center" valign="top" width="33%">
159
+ <a href="media/en/settings_gateway.png"><img src="media/en/settings_gateway.png" alt="Coding OAuth Gateway tab" width="280" /></a><br />
160
+ <sub>Gateway</sub>
161
+ </td>
162
+ <td align="center" valign="top" width="33%">
163
+ <a href="media/en/settings_capabilities.png"><img src="media/en/settings_capabilities.png" alt="Coding OAuth Capabilities tab" width="280" /></a><br />
164
+ <sub>Capabilities</sub>
165
+ </td>
166
+ </tr>
167
+ </table>
168
+
169
+ | ํ”„๋กœ๋ฐ”์ด๋” | ๋ฐฉ์‹ |
170
+ |---|---|
171
+ | Grok | ์ธ์ฆ ์ฝ”๋“œ ยท ๋””๋ฐ”์ด์Šค ์ฝ”๋“œ ยท Grok CLI import ยท ๋ชจ๋ธ ์„ ํƒ |
172
+ | Codex | ๋””๋ฐ”์ด์Šค ์ฝ”๋“œ(์›๊ฒฉ DSH ๊ถŒ์žฅ) ยท ๋ธŒ๋ผ์šฐ์ € PKCE |
173
+ | Kimi | ๋””๋ฐ”์ด์Šค ์ฝ”๋“œ |
174
+ | Claude | ๋ธŒ๋ผ์šฐ์ € PKCE(์›๊ฒฉ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ „์ฒด localhost redirect URL์„ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ฐ€๋Šฅ) |
175
+ | Antigravity | `dsh-agy` ์„ค์น˜ ์ƒํƒœ + profile-local CLI ๋ช…๋ น |
176
+
177
+ ์„ค์ • ํŽ˜์ด์ง€๋Š” **Accounts**, **Gateway**, **Capabilities**, **About** ๋„ค ๊ฐœ์˜ ์ƒ์œ„ ํƒญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ๋œ ํ”„๋กœ๋ฐ”์ด๋” ์นด๋“œ๋Š” ๊ฐ„๊ฒฐํ•œ ์š”์•ฝ์œผ๋กœ ์ ‘ํžˆ๊ณ  ๋ชจ๋ธ ํŽธ์ง‘ ์‹œ ํŽผ์ณ์ง‘๋‹ˆ๋‹ค. CLI pull ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ์ „์ฒด ๋„ˆ๋น„๋กœ ํ‘œ์‹œ๋˜๊ณ , Imagine ์ƒํƒœ๋Š” Capabilities ํƒญ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
178
+
179
+ ์„ ํƒ๊ธฐ๋Š” ์ธ์ฆ์„ ์™„๋ฃŒํ•œ ๋ผ์šฐํŠธ๋งŒ ๋‚˜์—ดํ•˜๋ฉฐ, ์ธ์ฆ๋˜์ง€ ์•Š์€ ํ”„๋กœ๋ฐ”์ด๋”๋Š” ๋นˆ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ฐ”์ด๋” ์ด๋ฆ„์—๋Š” `(OAuth)`๊ฐ€ ๋ถ™๊ณ , ๋กœ๊ทธ์ธ/์•„์›ƒ ํ›„ `llm/adapters-updated`๋ฅผ ํ†ตํ•ด ์นดํƒˆ๋กœ๊ทธ๊ฐ€ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.
180
+
181
+ ## ์„ ํƒ์  ๊ธฐ๋Šฅ
182
+
183
+ 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์‹œ๊ฐ„)์ž…๋‹ˆ๋‹ค. ๋ณด์กด ์‹œ๊ฐ„์„ ๋‚ฎ์ถ”๋ฉด ๊ธฐ์กด ์•„ํ‹ฐํŒฉํŠธ๋„ ์ฆ‰์‹œ ๋‹จ์ถ•ยท์ •๋ฆฌ๋˜๋ฉฐ, ๋†’์ธ ๊ฐ’์€ ์ดํ›„ ์ƒ์„ฑ๋œ ์•„ํ‹ฐํŒฉํŠธ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
184
+
185
+ ## ๋กœ์ปฌ API ๊ฒŒ์ดํŠธ์›จ์ด
186
+
187
+ ๊ธฐ๋ณธ๊ฐ’์€ **๊บผ์ง**์ž…๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ฉด DSH ์›น ํฌํŠธ์™€ ๋ถ„๋ฆฌ๋œ ๋…๋ฆฝ `node:http` ์„œ๋ฒ„๊ฐ€ `127.0.0.1:18080`์—์„œ ์‹œ์ž‘๋˜์–ด ๊ฐ™์€ ๋กœ๊ทธ์ธ OAuth ์„ธ์…˜์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
188
+
189
+ ```yaml
190
+ gateway:
191
+ enabled: false
192
+ bind: 127.0.0.1
193
+ port: 18080
194
+ opencodeGo:
195
+ enabled: false
196
+ ```
197
+
198
+ ์—”๋“œํฌ์ธํŠธ: `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์—๋Š” ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์›๊ฒฉ ๋ฆด๋ ˆ์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
199
+
200
+ ์„ ํƒ์  **OpenCode Go ํ˜ธํ™˜**(`gateway.opencodeGo.enabled`, ๊ธฐ๋ณธ off)์€ Gateway ํƒญ์—์„œ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผœ๋ฉด `POST /v1/chat/completions`๋ฅผ ๊ณ ์ • URL `https://opencode.ai/zen/go/v1/chat/completions`๋กœ ์ „๋‹ฌํ•˜๊ณ  sticky `x-opencode-session`์„ ์ฃผ์ž…ํ•˜์—ฌ, OpenCode ์„ธ์…˜ ์นœํ™”์„ฑ์„ ๋ณด๋‚ด์ง€ ์•Š๋Š” ํด๋ผ์ด์–ธํŠธ(์•„๋‹ˆ๋ฉด `MissingSessionID`)๋„ ์ด ๋ฃจํ”„๋ฐฑ ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜ id ์šฐ์„ ์ˆœ์œ„: `x-deepseek-harness-session-id` โ†’ `x-opencode-session` โ†’ `x-session-id` โ†’ body `session_id` โ†’ ์ƒ์„ฑ UUID. ํ•ด๋‹น ๋ชจ๋“œ์—์„œ๋Š” ๊ฒŒ์ดํŠธ์›จ์ด Bearer key๋ฅผ OpenCode API key๋กœ ์„ค์ •ํ•˜์„ธ์š”. ์žฌ์‹œ์ž‘ ์—†์ด ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.
201
+
202
+ ## CLI
203
+
204
+ ```bash
205
+ # `dsh-grok-build` ๋Š” ๊ฐ™์€ CLI ๋ณ„์นญ
206
+ dsh-coding-oauth login [--pkce] | import | status | logout
207
+
208
+ # ์ตœ์‹  ํ”„๋กœ๋ฐ”์ด๋”
209
+ dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
210
+ dsh-coding-oauth status all
211
+ dsh-coding-oauth logout codex
212
+
213
+ # Antigravity (๋จผ์ € web ํ”„๋กœํ•„์— ์„ค์น˜)
214
+ dsh plugin --profile web exec dsh-agy login --headless
215
+ ```
216
+
217
+ > `dsh-agy` CLI๋Š” DSH ํ”„๋กœ์„ธ์Šค ๋ฐ–์—์„œ ๊ณ„์ • ํ’€์„ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค ๋‚ด ์นดํƒˆ๋กœ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค โ€” ๋กœ๊ทธ์ธ/์•„์›ƒ ํ›„ ๋ชจ๋ธ ์„ ํƒ๊ธฐ๋ฅผ ๋‹ซ์•˜๋‹ค ๋‹ค์‹œ ์—ฌ์„ธ์š”.
218
+
219
+ ## ์ค‘๊ตญ์—์„œ์˜ Kimi
220
+
221
+ 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 ์„ค์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
222
+
223
+ ## ๋„คํŠธ์›Œํฌ ํ”„๋ก์‹œ
224
+
225
+ ์šฐ์„ ์ˆœ์œ„: `config.proxy` โ†’ `CODING_OAUTH_PROXY` โ†’ `GROK_BUILD_PROXY` โ†’ `HTTPS_PROXY`/`HTTP_PROXY`.
226
+
227
+ ```yaml
228
+ - id: llm-grok-build-oauth
229
+ config:
230
+ proxy: http://127.0.0.1:7890
231
+ proxyKimi: false
232
+ ```
233
+
234
+ ๊ฒ€์ฆ๋œ ๊ตฌ๋… ๋„๋ฉ”์ธ๋งŒ ํ”„๋ก์‹œ๋ฉ๋‹ˆ๋‹ค(xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity). ๋‚˜๋จธ์ง€ DSH ํŠธ๋ž˜ํ”ฝ์€ ์›๋ž˜ ๋””์ŠคํŒจ์ฒ˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Kimi๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง๊ฒฐ์ด๋ฉฐ `proxyKimi: true`์ผ ๋•Œ๋งŒ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
235
+
236
+ ## ๋ณต์›๋ ฅ
237
+
238
+ OAuth ์•ก์„ธ์Šค ํ† ํฐ์€ ์ €์žฅ๋œ ๋งŒ๋ฃŒ ์‹œ๊ฐ **5๋ถ„ ์ „**์— ์„ ์ œ์ ์œผ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค(pi-ai 0.84+). ์—…์ŠคํŠธ๋ฆผ์ด ๋กœ์ปฌ์—์„œ๋Š” ์•„์ง ์œ ํšจํ•œ ํ† ํฐ์„ 401/403์œผ๋กœ ๊ฑฐ์ ˆํ•˜๋ฉด, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ €์žฅ๋œ `expires`๋ฅผ ๊ณผ๊ฑฐ๋กœ ๋˜๋Œ๋ฆฌ๊ณ  ์žฌ์‹œ๋„ ๋‹จ๊ณ„์—์„œ ๋จผ์ € ๊ฐฑ์‹ ํ•œ ๋’ค ๋‹ค์‹œ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
239
+
240
+ ์š”์ฒญ ์žฌ์‹œ๋„๋Š” 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์€ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ๋ณ„ ์žฌ์ •์˜:
241
+
242
+ ```yaml
243
+ - id: llm-grok-build-oauth
244
+ config:
245
+ retryPolicy:
246
+ mode: normal
247
+ maxRetries: 5
248
+ retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
249
+ backoff: { initialDelayMs: 5000, maxDelayMs: 80000, jitterRatio: 0.1 }
250
+ ```
251
+
252
+ ## ์ž๊ฒฉ ์ฆ๋ช…
253
+
254
+ ์†Œ์œ ์ž ์ „์šฉ `0600`, ์›์ž์  ์“ฐ๊ธฐ, ํฌ๋กœ์Šค ํ”„๋กœ์„ธ์Šค ํŒŒ์ผ ์ž ๊ธˆ:
255
+
256
+ - `$DSH_HOME/.grok-build-auth.json`
257
+ - `$DSH_HOME/.codex-oauth-auth.json`
258
+ - `$DSH_HOME/.kimi-code-oauth-auth.json`
259
+ - `$DSH_HOME/.claude-code-oauth-auth.json`
260
+
261
+ ์„ ํƒ ์บ์‹œ๋Š” ํ•ด๋‹น `*-models.json` ํŒŒ์ผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. **HTTP ์ƒํƒœ, ๋กœ๊ทธ, UI๊ฐ€ ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.**
262
+
263
+ ## ์•„ํ‚คํ…์ฒ˜
264
+
265
+ ```mermaid
266
+ flowchart LR
267
+ subgraph DSH["DSH Harness"]
268
+ UI[์„ค์ • / Web ยท Coding OAuth] --> LLM[llm route]
269
+ LLM --> ALIA[๋ผ์šฐํŠธ ๋ณ„์นญ ์–ด๋Œ‘ํ„ฐ]
270
+ end
271
+ ALIA --> PI[pi-ai ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ๋ฐ”์ด๋”<br/>OAuth ยท ๋ฆฌํ”„๋ ˆ์‹œ ยท ์ŠคํŠธ๋ฆผ]
272
+ PI --> GROK[Grok Build]
273
+ PI --> COD[Codex]
274
+ PI --> KIMI[Kimi]
275
+ PI --> CLAU[Claude]
276
+ AGY[dsh-agy ํ”Œ๋Ÿฌ๊ทธ์ธ] --> GAL[Google Antigravity]
277
+ ```
278
+
279
+ ## ๊ธฐ์ˆ  ๋ฉ”๋ชจ
280
+
281
+ - **Grok Build**: `cli-chat-proxy.grok.com/v1`์˜ ์ปค์Šคํ…€ Responses ํ”„๋กœ๋ฐ”์ด๋”, CLI ํ•‘๊ฑฐํ”„๋ฆฐํŠธ ํ—ค๋”, ๋™์  ๋ชจ๋ธ ์นดํƒˆ๋กœ๊ทธ.
282
+ - **Codex/Kimi/Claude**: pi-ai ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ OAuth์™€ ๋ฆฌํ”„๋ ˆ์‹œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ ๋ณ„์นญ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ด๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ id์— ๋งคํ•‘ํ•˜๋˜ ๋ชจ๋ธ ๋‚ด๋ถ€ ์•„์ด๋ดํ‹ฐํ‹ฐ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
283
+ - Kimi access token์€ ๋ช…์‹œ์ ์œผ๋กœ `Authorization: Bearer`๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค โ€” Anthropic `x-api-key`๋กœ ์ž˜๋ชป ๋ณด๋‚ด์ง€๋Š” ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.
284
+ - Google Antigravity๋Š” ์—ฌ๊ธฐ์„œ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง**ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. ๋ฒ„์ „ ๊ณ ์ •ํ˜• ์ „์šฉ DSH ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
285
+
286
+ ## ์ค€์ˆ˜
287
+
288
+ ์ œ3์ž harness๋ฅผ ํ†ตํ•œ ์ฝ”๋”ฉ ๊ตฌ๋… ์‚ฌ์šฉ์€ ๊ฐ ๋ฒค๋” ์ด์šฉ์•ฝ๊ด€์˜ ํšŒ์ƒ‰ ์ง€๋Œ€์— ๋†“์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ• ๋‹น๋Ÿ‰, ์ง€์—ญ ๋˜๋Š” ๊ณ„์ • ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **๋ณธ์ธ ๊ณ„์ •๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.** ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋Œ€๋Ÿ‰ ๊ณ„์ •, ํ• ๋‹น๋Ÿ‰ ์žฌํŒ๋งค, ์›๊ฒฉ ๋ฆด๋ ˆ์ด, ํŽ˜์ด์›” ์šฐํšŒ, ํด๋ผ์ด์–ธํŠธ ์‚ฌ์นญ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์—…์šฉ์œผ๋กœ๋Š” ๋ฒค๋” ๊ณต์‹ API-key ์ฑ„๋„์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
289
+
290
+ ## ๋ฌธ์„œ
291
+
292
+ | ๋ฌธ์„œ | ์šฉ๋„ |
293
+ |---|---|
294
+ | [`INSTALL.md`](INSTALL.md) | ์„ค์น˜ยท์‚ฌ์šฉ ์ƒ์„ธ |
295
+ | [`CHANGELOG.md`](CHANGELOG.md) | ๋ฆด๋ฆฌ์Šค ์ด๋ ฅ |
296
+ | [`docs/00-project-rules.md`](docs/00-project-rules.md) | ๋ฒ„์ „ ๊ด€๋ฆฌ, ๋ฆด๋ฆฌ์Šค ๋ฃจํ”„, ๊ณต๊ฐœ/๋กœ์ปฌ ๋ถ„๋ฆฌ |
297
+ | [`docs/02-architecture.md`](docs/02-architecture.md) | ๋‚ด๋ถ€ ์•„ํ‚คํ…์ฒ˜ (๋ผ์šฐํŠธ ยท ๋ฐ์ดํ„ฐ ํ๋ฆ„ ยท ๋ชจ๋“ˆ ยท API) ยท [ไธญๆ–‡](docs/02-architecture.zh-CN.md) |
298
+ | [`CONTRIBUTING.md`](CONTRIBUTING.md) | ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ |
299
+
300
+ ## ๊ด€๋ จ ํ”„๋กœ์ ํŠธ
301
+
302
+ - [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) โ€” Google Antigravity์šฉ ๋…๋ฆฝ ๊ณ ์ • ๋ฒ„์ „ ํ”Œ๋Ÿฌ๊ทธ์ธ.
303
+
304
+ ## ๊ธฐ์—ฌ
305
+
306
+ ๊ธฐ๋Šฅ, ๋ฌธ์„œ, ๋ฒˆ์—ญ, ๋ฒ„๊ทธ ๋ณด๊ณ  ๋“ฑ ๋ชจ๋“  ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค, ์ปค๋ฐ‹ ๊ทœ์น™ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ฃจํ”„๋Š” **[CONTRIBUTING](CONTRIBUTING.md)**์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๋ชฉ๋ก์— ์—†๋Š” ์–ธ์–ด๋ผ๋ฉด README ๋ฒˆ์—ญ์„ PR๋กœ ๋ณด๋‚ด ์ฃผ์„ธ์š”. ์œ„ ์–ธ์–ด ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
307
+
308
+ ## ๋ผ์ด์„ ์Šค
309
+
310
+ [Apache-2.0](LICENSE) ยท [NOTICE](NOTICE) ์ฐธ์กฐ. ์ผ๋ถ€๋Š” [dsh-xai](https://github.com/MirDie/dsh-xai) ํ”„๋กœ์ ํŠธ(Apache-2.0)์—์„œ ํŒŒ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.