# ๐ dsh-coding-subscription-oauth
**v0.5.6 ยท ์ด์ ์ด๋ฆ `dsh-grok-build`
**[DeepSeek Harness](https://github.com/deepseek-ai/dsh)์ฉ ์ฝ๋ฉ ๊ตฌ๋
OAuth ํ๋ฌ๊ทธ์ธ.** ์ด๋ฏธ ๊ฒฐ์ ํ ๊ตฌ๋
์ผ๋ก ํ ๋ฒ์ ๋ก๊ทธ์ธํ๊ณ , dsh ์ค์ ํ์ด์ง๋ CLI์์ ๊ทธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ธ์. **์ฑํ
์ ํ ํฐ์ ๋ถ์ฌ๋ฃ์ ํ์๊ฐ ์์ต๋๋ค.**
[](LICENSE)
[](CONTRIBUTING.md)
*[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)*
---
## ์ด๋ฆ ๋ณ๊ฒฝ
์ฒ์์๋ Grok Build ์ ์ฉ **`dsh-grok-build`** ์์ต๋๋ค. ์ง๊ธ์ SuperGrok / Codex / Kimi / Claude / Antigravity ์ฝ๋ฉ ๊ตฌ๋
OAuth์
๋๋ค.
| | ์ด๊ฒ์ ์ฐ์ธ์ | ๊ณ์ ๋์ |
|---|---|---|
| GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build`๏ผ๊ฐ์ `main`๏ผ |
| npm | `dsh-coding-subscription-oauth@0.5.6`๏ผํ์ฌ ๋ฆด๋ฆฌ์ค๏ผ | ๋ ๊ฑฐ์ npm ํจํค์ง๋ ๊ฒ์๋ ์ ์์ |
| CLI | `dsh-coding-oauth` | `dsh-grok-build` |
| Cordis ํ๋ฌ๊ทธ์ธ id | `llm-grok-build-oauth` | ๊ทธ๋๋ก |
| ์ค์ ํ์ด์ง HTTP API | `/plugins/dsh-grok-build/*` | ๊ทธ๋๋ก |
| ์๊ฒฉ ์ฆ๋ช
ํ์ผ | `$DSH_HOME/.grok-build-auth.json` ๋ฐ ๊ธฐํ `*-oauth-auth.json` | ๊ทธ๋๋ก |
## โจ ๊ธฐ๋ฅ
- ๐งพ **๋ด ๊ตฌ๋
๊ทธ๋๋ก ์ฌ์ฉ** โ ๋ณ๋ API key ์์ด ์ด๋ฏธ ๊ฒฐ์ ํ ์ฝ๋ฉ ํ๋์ ์ฌ์ฉํฉ๋๋ค.
- ๐ **๋ก์ปฌ OAuth, ํค ๋ถ์ฌ๋ฃ๊ธฐ ๋ถํ์** โ ์ค์ ํ์ด์ง๋ CLI์์ ์ธ์ฆํ๋ฉฐ, ํ ํฐ์ด ์ฑํ
์ ๋ค์ด๊ฐ์ง ์์ต๋๋ค.
- ๐งฉ **ํ๋์ ํ๋ฌ๊ทธ์ธ, ๋ค์ฏ ํ๋ก๋ฐ์ด๋** โ Grok Build, Codex, Kimi, Claude, Google Antigravity.
- ๐ก๏ธ **์์ ํ ์ค๊ณ** โ ์ธ์ฆ ํ์ผ์ ์์ ์ ์ ์ฉ `0600`, ์์์ ์ฐ๊ธฐ, ํฌ๋ก์ค ํ๋ก์ธ์ค ํ์ผ ์ ๊ธ.
- โ๏ธ **๋์ ์นดํ๋ก๊ทธ** โ ์ ํ๊ธฐ์๋ ์ธ์ฆ์ ์๋ฃํ ๋ผ์ฐํธ๋ง `(OAuth)` ๋ผ๋ฒจ๊ณผ ํจ๊ป ํ์๋๋ฉฐ, grok-4.6์ `xhigh`๋ ํฌํจ๋ฉ๋๋ค.
- ๐ **ํ๋ก์ ์ธ์งํ** โ ๊ฒ์ฆ๋ ์ ๋ขฐ ๊ฐ๋ฅํ ๊ตฌ๋
๋๋ฉ์ธ๋ง ํ๋ก์ํฉ๋๋ค.
- ๐ฅ **์๋ CLI Pull** โ ์ค์ ํ์ด์ง๊ฐ ํ์ฉ ๋ชฉ๋ก์ ์๋ ๊ณต์ Grok/Codex/Kimi/Claude CLI OAuth ํ์ผ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๊ฒ์ํฉ๋๋ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ฎ์ด์ฐ๊ธฐ ํ์ธ ํ ๋จ๋ฐฉํฅ ๋ณต์ฌ๋ณธ์ ๊ฐ์ ธ์ต๋๋ค.
- ๐๏ธ **ํญ์ผ๋ก ๋๋ ์ค์ ** โ Accounts, Gateway, Capabilities, About. ์๊ฒฉ ํธ์คํธ์์๋ device code๋ฅผ ์ฐ์ ํ๊ณ CLI missing ์์์ ์ค์ด๋ฉฐ, ๋ก๊ทธ์ธ๋ ์นด๋๋ ํผ์น ๋๊น์ง ์ ํ ์์ต๋๋ค.
- ๐๏ธ **์ ํ์ ๊ธฐ๋ฅ (๊ธฐ๋ณธ ๊บผ์ง)** โ Codex ๊ฒ์, ์ฌ์ฉ๋/์ฟผํฐ, ์ด๋ฏธ์ง ์์ฑ/ํธ์ง, Fast, Grok Imagine์ ์ค์์น๋ฅผ ์ผ๋ฉด ์ฆ์ ์ ์ฉ๋ฉ๋๋ค.
- ๐ **์ตํธ์ธ ๋ก์ปฌ API ๊ฒ์ดํธ์จ์ด** โ ๊ธฐ๋ณธ ๊บผ์ง์ ๋ฃจํ๋ฐฑ OpenAI/Anthropic ํธํ ์๋ฒ. ๋ด ๋๊ตฌ ์ ์ฉ์ด๋ฉฐ ๊ณต๊ฐ ๋ฆด๋ ์ด๊ฐ ์๋๋๋ค.
## ์ด ํ๋ฌ๊ทธ์ธ์ด ํธ๋ ์ฐ๋ ๋ฌธ์
์ฝ๋ฉ ๊ตฌ๋
์ DSH์ ๋ถ์ผ ๋ ์๋ ๊ฒ์์ดยท์ค๋ฅ๋ก ์ด ์ ์ฅ์์ ์ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
| ๊ฒ์ / ํ๋ฉด | ์ค์ ์์ธ | ์ด ํ๋ฌ๊ทธ์ธ |
|---|---|---|
| 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 ๋ฐฉ์ง |
| `API key is invalid` / `AUTH` | GUI๋ ๋ชจ๋ AUTH๋ฅผ ๊ทธ ๋ฌธ๊ตฌ๋ก ํ์. ํํ ์งง์ OAuth access token ๋ง๋ฃ | ๋ง๋ฃ **5๋ถ ์ ** refresh. 401์ด๋ฉด ์ ์ฅ ํ ํฐ์ ๋ฌดํจํํ๊ณ step ์ฌ์๋ |
| Codex/Kimi ๋ ๋ฒ์งธ ํด `INVALID_REPLAY_STATE` | replay๊ฐ pi-ai ๋ค์ดํฐ๋ธ provider id๋ฅผ ์ ์ง | Harness route id๋ฅผ ์ ์งํ๊ณ ์ค์ผ๋ replay๋ฅผ ๋ณต๊ตฌ |
| grok-4.6์ **xhigh**๊ฐ ์์ | `/v1/models-v2`์ `reasoning_efforts`๋ฅผ ๋ฒ๋ฆฌ๊ณ 4.5 ํ
ํ๋ฆฟ์ ๋ณต์ | live efforts๋ฅผ `thinkingLevelMap`์ ๋ฐ์. 4.6์ xhigh, 4.5๋ low/medium/high |
| Kimi Code๊ฐ Anthropic `x-api-key`๋ก ๋๊ฐ | OAuth token์ Anthropic ํค๋ก ์ ์ก | `Authorization: Bearer`๋ง ์ฌ์ฉ |
| ๋ก๊ทธ์ธํ์ง ์์ ๋ชจ๋ธ์ด ์ ํ๊ธฐ์ ๋จ์ | ๋ฑ๋ก๋ ๋ชจ๋ ๋ผ์ฐํธ๋ฅผ ๋์ด | ๋ฏธ์ธ์ฆ์ ๋น ๋ชฉ๋ก. ์ธ์ฆ๋จ์ `(OAuth)` |
| ์๊ฒฉ/ํค๋๋ฆฌ์ค์์ PKCE ๋ถ๊ฐ | localhost๋ก ๋์์ฌ ์ ์์ | Grok/Codex/Kimi๋ ๋๋ฐ์ด์ค ์ฝ๋. Claude๋ redirect URL ๋ถ์ฌ๋ฃ๊ธฐ |
| ํ๋ก์๋ก Grok์ ๋๊ณ ์ค๊ตญ Kimi๋ ์ฃฝ์ | ์ ์ญ `HTTPS_PROXY` | ํ์ฉ ๋๋ฉ์ธ๋ง. Kimi๋ ๊ธฐ๋ณธ ์ง๊ฒฐ(`proxyKimi: true`์ผ ๋๋ง ํ๋ก์) |
## ์ง์ ํ๋ก๋ฐ์ด๋
| ํ๋ก๋ฐ์ด๋ | ๋ผ์ฐํธ | ์ธ์ฆ | ๊ธฐ์กด API-key ๋ผ์ฐํธ์ ๊ณต์กด |
|---|---|---|---|
| **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
| **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
| **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
| **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | โ |
| **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | โ |
> Grok Build์ ๋๋ฐ์ด์ค ๋ก๊ทธ์ธ, ๋์ `/v1/models-v2` ์นดํ๋ก๊ทธ, Responses ์คํธ๋ฆฌ๋ฐ ์ถ๋ก ์ ์ค์ ๋ฐฐํฌ์์ ๊ฒ์ฆ๋์์ต๋๋ค. Codex/Kimi/Claude๋ `@earendil-works/pi-ai`์ ๋ค์ดํฐ๋ธ OAuth/๋ฆฌํ๋ ์๋ฅผ ์ฌ์ฌ์ฉํ๋ฉฐ ๋ฒค๋ ํ๋ก์ฐ๋ฅผ ์ฌ๊ตฌํํ์ง ์์ต๋๋ค.
## ๐ ๋น ๋ฅธ ์์
```bash
# 1. web ํ๋กํ์ ํ๋ฌ๊ทธ์ธ ์ค์น (ํ์ฌ npm ๋ฆด๋ฆฌ์ค)
dsh plugin --profile web add dsh-coding-subscription-oauth@0.5.6
# 2. ์ ํ ์ฌํญ โ Google Antigravity (๊ฒ์ฆ๋ ๊ณ ์ ๋ฒ์ )
dsh plugin --profile web add dsh-agy@0.1.2
# 3. ์์ฃผํ๋ dsh web ์๋น์ค ์ฌ์์
systemctl --user restart dsh-web.service
```
๊ทธ๋ฐ ๋ค์ **Settings โ Coding OAuth**๋ฅผ ์ด๊ณ ์ํ๋ ํ๋ก๋ฐ์ด๋์ ๋ก๊ทธ์ธํ์ธ์. ์๋ฃ์
๋๋ค โ ์ ํ๊ธฐ์์ ์ธ์ฆ๋ ๋ชจ๋ธ์ ์ ํํ๋ฉด ๋ฉ๋๋ค.
## ๐ ๋ชฉ์ฐจ
- [์ด๋ฆ ๋ณ๊ฒฝ](#์ด๋ฆ-๋ณ๊ฒฝ)
- [๊ธฐ๋ฅ](#-๊ธฐ๋ฅ)
- [์ด ํ๋ฌ๊ทธ์ธ์ด ํธ๋ ์ฐ๋ ๋ฌธ์ ](#์ด-ํ๋ฌ๊ทธ์ธ์ด-ํธ๋-์ฐ๋-๋ฌธ์ )
- [์ง์ ํ๋ก๋ฐ์ด๋](#์ง์-ํ๋ก๋ฐ์ด๋)
- [๋น ๋ฅธ ์์](#-๋น ๋ฅธ-์์)
- [์ค์น](#์ค์น)
- [์ค์ ํ์ด์ง](#์ค์ -ํ์ด์ง)
- [์ ํ์ ๊ธฐ๋ฅ](#์ ํ์ -๊ธฐ๋ฅ)
- [๋ก์ปฌ API ๊ฒ์ดํธ์จ์ด](#๋ก์ปฌ-api-๊ฒ์ดํธ์จ์ด)
- [CLI](#cli)
- [์ค๊ตญ์์์ Kimi](#์ค๊ตญ์์์-kimi)
- [๋คํธ์ํฌ ํ๋ก์](#๋คํธ์ํฌ-ํ๋ก์)
- [๋ณต์๋ ฅ](#๋ณต์๋ ฅ)
- [์๊ฒฉ ์ฆ๋ช
](#์๊ฒฉ-์ฆ๋ช
)
- [์ํคํ
์ฒ](#์ํคํ
์ฒ)
- [๊ธฐ์ ๋ฉ๋ชจ](#๊ธฐ์ -๋ฉ๋ชจ)
- [์ค์](#์ค์)
- [๋ฌธ์](#๋ฌธ์)
- [๊ด๋ จ ํ๋ก์ ํธ](#๊ด๋ จ-ํ๋ก์ ํธ)
- [๊ธฐ์ฌ](#๊ธฐ์ฌ)
- [๋ผ์ด์ ์ค](#๋ผ์ด์ ์ค)
## ์ค์น
DeepSeek Harness `0.1.0-rc.6+` ๋ฐ Node.js 22.19+๊ฐ ํ์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ [์ค์น ๋
ธํธ](INSTALL.md)๋ฅผ ์ฐธ์กฐํ์ธ์.
```bash
# ํ์ฌ npm ๋ฆด๋ฆฌ์ค (๊ถ์ฅ)
dsh plugin --profile web add dsh-coding-subscription-oauth@0.5.6
# ๊ฐ๋ฐ/๋์: GitHub์์
dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
# ๊ฐ๋ฐ/๋์: ๋ก์ปฌ ๊ฐ๋ฐ ๋๋ ํฐ๋ฆฌ์์
dsh plugin --profile web add ./dsh-coding-subscription-oauth
```
์ค์น ํ `dsh web`์ ์ฌ์์ํฉ๋๋ค. ์ค์ ๋ฐฐํฌ ๊ฒ์ฆ:
```bash
pnpm run verify:deployed # ์ค์ /api/llm.models + OAuth ์ํ ํ์ธ
DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # Google์ ๋ก๊ทธ์ธ๋ ๊ฒฝ์ฐ
DSH_RESTORE_PROVIDER=openai \
DSH_RESTORE_MODEL=gpt-5.6-sol \
DSH_RESTORE_REASONING=max \
pnpm run smoke:deployed # ์ค์ Codex/Kimi ๋๊ตฌ ํธ์ถ + ๋ ๋ฒ์งธ ์ฌ์ฉ์ turn ์ฌ์
```
> `smoke:deployed`๋ ์์ ์ธ์
์ ๋ง๋ค๊ณ Codex์ Kimi ๋๊ตฌ ํธ์ถ ๋ฐ ๋ ๋ฒ์งธ ์ฌ์ฉ์ turn(`INVALID_REPLAY_STATE` ํ๊ท)์ ๊ฒ์ฆํ ๋ค ์ ์ธ๋ ๊ธฐ๋ณธ ๋ชจ๋ธ์ ๋ณต์ํ๊ณ ์ธ์
์ ์์นด์ด๋ธํฉ๋๋ค.
## ์ค์ ํ์ด์ง
**Settings โ Coding OAuth**๋ฅผ ์ด์ด ์ฃผ์ธ์:

Accounts
|

Gateway
|

Capabilities
|
| ํ๋ก๋ฐ์ด๋ | ๋ฐฉ์ |
|---|---|
| Grok | ์ธ์ฆ ์ฝ๋ ยท ๋๋ฐ์ด์ค ์ฝ๋ ยท Grok CLI import ยท ๋ชจ๋ธ ์ ํ |
| Codex | ๋๋ฐ์ด์ค ์ฝ๋(์๊ฒฉ DSH ๊ถ์ฅ) ยท ๋ธ๋ผ์ฐ์ PKCE |
| Kimi | ๋๋ฐ์ด์ค ์ฝ๋ |
| Claude | ๋ธ๋ผ์ฐ์ PKCE(์๊ฒฉ ๋ธ๋ผ์ฐ์ ๋ ์ ์ฒด localhost redirect URL์ ๋ถ์ฌ๋ฃ๊ธฐ ๊ฐ๋ฅ) |
| Antigravity | `dsh-agy` ์ค์น ์ํ + profile-local CLI ๋ช
๋ น |
์ค์ ํ์ด์ง๋ **Accounts**, **Gateway**, **Capabilities**, **About** ๋ค ๊ฐ์ ์์ ํญ์ผ๋ก ๋๋ฉ๋๋ค. ๋ก๊ทธ์ธ๋ ํ๋ก๋ฐ์ด๋ ์นด๋๋ ๊ฐ๊ฒฐํ ์์ฝ์ผ๋ก ์ ํ๊ณ ๋ชจ๋ธ ํธ์ง ์ ํผ์ณ์ง๋๋ค. CLI pull ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ์ ์ฒด ๋๋น๋ก ํ์๋๊ณ , Imagine ์ํ๋ Capabilities ํญ์์ ํ์ธํ ์ ์์ต๋๋ค.
์ ํ๊ธฐ๋ ์ธ์ฆ์ ์๋ฃํ ๋ผ์ฐํธ๋ง ๋์ดํ๋ฉฐ, ์ธ์ฆ๋์ง ์์ ํ๋ก๋ฐ์ด๋๋ ๋น ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค. ํ๋ก๋ฐ์ด๋ ์ด๋ฆ์๋ `(OAuth)`๊ฐ ๋ถ๊ณ , ๋ก๊ทธ์ธ/์์ ํ `llm/adapters-updated`๋ฅผ ํตํด ์นดํ๋ก๊ทธ๊ฐ ๊ฐฑ์ ๋ฉ๋๋ค.
## ์ ํ์ ๊ธฐ๋ฅ
7๊ฐ ์ค์์น `codexSearch`, `codexImages`, `codexImageEdits`, `codexUsage`, `codexFast`, `grokImagineImage`, `grokImagineVideo`๋ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊บผ์ ธ ์์ผ๋ฉฐ ์ฌ์์ ์์ด ์ฆ์ ์ ์ฉ๋ฉ๋๋ค. ์ซ์ ์ค์ ์ `searchResults`(1โ20, ๊ธฐ๋ณธ 5), `imageCount`(1โ4, ๊ธฐ๋ณธ 1), `videoArtifactTtlMs`(1์๊ฐโ7์ผ, ๊ธฐ๋ณธ 7์ผ, UI์์๋ 1โ168์๊ฐ)์
๋๋ค. ๋ณด์กด ์๊ฐ์ ๋ฎ์ถ๋ฉด ๊ธฐ์กด ์ํฐํฉํธ๋ ์ฆ์ ๋จ์ถยท์ ๋ฆฌ๋๋ฉฐ, ๋์ธ ๊ฐ์ ์ดํ ์์ฑ๋ ์ํฐํฉํธ์๋ง ์ ์ฉ๋ฉ๋๋ค.
## ๋ก์ปฌ API ๊ฒ์ดํธ์จ์ด
๊ธฐ๋ณธ๊ฐ์ **๊บผ์ง**์
๋๋ค. ํ์ฑํํ๋ฉด DSH ์น ํฌํธ์ ๋ถ๋ฆฌ๋ ๋
๋ฆฝ `node:http` ์๋ฒ๊ฐ `127.0.0.1:18080`์์ ์์๋์ด ๊ฐ์ ๋ก๊ทธ์ธ OAuth ์ธ์
์ ์ฌ์ฌ์ฉํฉ๋๋ค:
```yaml
gateway:
enabled: false
bind: 127.0.0.1
port: 18080
```
์๋ํฌ์ธํธ: `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์๋ ํค๊ฐ ํ์ํฉ๋๋ค. ์๊ฒฉ ๋ฆด๋ ์ด๊ฐ ์๋๋๋ค.
## CLI
```bash
# `dsh-grok-build` ๋ ๊ฐ์ CLI ๋ณ์นญ
dsh-coding-oauth login [--pkce] | import | status | logout
# ์ต์ ํ๋ก๋ฐ์ด๋
dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
dsh-coding-oauth status all
dsh-coding-oauth logout codex
# Antigravity (๋จผ์ web ํ๋กํ์ ์ค์น)
dsh plugin --profile web exec dsh-agy login --headless
```
> `dsh-agy` CLI๋ DSH ํ๋ก์ธ์ค ๋ฐ์์ ๊ณ์ ํ์ ์์ ํ๋ฏ๋ก ํ๋ก์ธ์ค ๋ด ์นดํ๋ก๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค โ ๋ก๊ทธ์ธ/์์ ํ ๋ชจ๋ธ ์ ํ๊ธฐ๋ฅผ ๋ซ์๋ค ๋ค์ ์ฌ์ธ์.
## ์ค๊ตญ์์์ Kimi
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 ์ค์ ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
## ๋คํธ์ํฌ ํ๋ก์
์ฐ์ ์์: `config.proxy` โ `CODING_OAUTH_PROXY` โ `GROK_BUILD_PROXY` โ `HTTPS_PROXY`/`HTTP_PROXY`.
```yaml
- id: llm-grok-build-oauth
config:
proxy: http://127.0.0.1:7890
proxyKimi: false
```
๊ฒ์ฆ๋ ๊ตฌ๋
๋๋ฉ์ธ๋ง ํ๋ก์๋ฉ๋๋ค(xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity). ๋๋จธ์ง DSH ํธ๋ํฝ์ ์๋ ๋์คํจ์ฒ๋ฅผ ์ ์งํฉ๋๋ค. Kimi๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง๊ฒฐ์ด๋ฉฐ `proxyKimi: true`์ผ ๋๋ง ํ๋ก์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
## ๋ณต์๋ ฅ
OAuth ์ก์ธ์ค ํ ํฐ์ ์ ์ฅ๋ ๋ง๋ฃ ์๊ฐ **5๋ถ ์ **์ ์ ์ ์ ์ผ๋ก ๊ฐฑ์ ๋ฉ๋๋ค(pi-ai 0.84+). ์
์คํธ๋ฆผ์ด ๋ก์ปฌ์์๋ ์์ง ์ ํจํ ํ ํฐ์ 401/403์ผ๋ก ๊ฑฐ์ ํ๋ฉด, ํ๋ฌ๊ทธ์ธ์ด ์ ์ฅ๋ `expires`๋ฅผ ๊ณผ๊ฑฐ๋ก ๋๋๋ฆฌ๊ณ ์ฌ์๋ ๋จ๊ณ์์ ๋จผ์ ๊ฐฑ์ ํ ๋ค ๋ค์ ์์ฒญํฉ๋๋ค.
์์ฒญ ์ฌ์๋๋ 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์ ์ฌ์๋ํ์ง ์์ต๋๋ค. ๋ฐฐํฌ๋ณ ์ฌ์ ์:
```yaml
- id: llm-grok-build-oauth
config:
retryPolicy:
mode: normal
maxRetries: 5
retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
backoff: { initialDelayMs: 5000, maxDelayMs: 80000, jitterRatio: 0.1 }
```
## ์๊ฒฉ ์ฆ๋ช
์์ ์ ์ ์ฉ `0600`, ์์์ ์ฐ๊ธฐ, ํฌ๋ก์ค ํ๋ก์ธ์ค ํ์ผ ์ ๊ธ:
- `$DSH_HOME/.grok-build-auth.json`
- `$DSH_HOME/.codex-oauth-auth.json`
- `$DSH_HOME/.kimi-code-oauth-auth.json`
- `$DSH_HOME/.claude-code-oauth-auth.json`
์ ํ ์บ์๋ ํด๋น `*-models.json` ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค. **HTTP ์ํ, ๋ก๊ทธ, UI๊ฐ ํ ํฐ์ ๋ฐํํด์๋ ์ ๋ฉ๋๋ค.**
## ์ํคํ
์ฒ
```mermaid
flowchart LR
subgraph DSH["DSH Harness"]
UI[์ค์ / Web ยท Coding OAuth] --> LLM[llm route]
LLM --> ALIA[๋ผ์ฐํธ ๋ณ์นญ ์ด๋ํฐ]
end
ALIA --> PI[pi-ai ๋ค์ดํฐ๋ธ ํ๋ก๋ฐ์ด๋
OAuth ยท ๋ฆฌํ๋ ์ ยท ์คํธ๋ฆผ]
PI --> GROK[Grok Build]
PI --> COD[Codex]
PI --> KIMI[Kimi]
PI --> CLAU[Claude]
AGY[dsh-agy ํ๋ฌ๊ทธ์ธ] --> GAL[Google Antigravity]
```
## ๊ธฐ์ ๋ฉ๋ชจ
- **Grok Build**: `cli-chat-proxy.grok.com/v1`์ ์ปค์คํ
Responses ํ๋ก๋ฐ์ด๋, CLI ํ๊ฑฐํ๋ฆฐํธ ํค๋, ๋์ ๋ชจ๋ธ ์นดํ๋ก๊ทธ.
- **Codex/Kimi/Claude**: pi-ai ๋ค์ดํฐ๋ธ ํ๋ก๋ฐ์ด๋๊ฐ OAuth์ ๋ฆฌํ๋ ์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋ผ์ฐํธ ๋ณ์นญ ์ด๋ํฐ๊ฐ ์ด๋ฅผ ๋ค์ดํฐ๋ธ id์ ๋งคํํ๋ ๋ชจ๋ธ ๋ด๋ถ ์์ด๋ดํฐํฐ๋ ๋ณํ์ง ์์ต๋๋ค.
- Kimi access token์ ๋ช
์์ ์ผ๋ก `Authorization: Bearer`๋ก ๋ณํ๋ฉ๋๋ค โ Anthropic `x-api-key`๋ก ์๋ชป ๋ณด๋ด์ง๋ ์ผ์ด ์์ต๋๋ค.
- Google Antigravity๋ ์ฌ๊ธฐ์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง**ํ์ง ์์ต๋๋ค**. ๋ฒ์ ๊ณ ์ ํ ์ ์ฉ DSH ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํฉ๋๋ค.
## ์ค์
์ 3์ harness๋ฅผ ํตํ ์ฝ๋ฉ ๊ตฌ๋
์ฌ์ฉ์ ๊ฐ ๋ฒค๋ ์ด์ฉ์ฝ๊ด์ ํ์ ์ง๋์ ๋์ผ ์ ์์ผ๋ฉฐ ํ ๋น๋, ์ง์ญ ๋๋ ๊ณ์ ๋ฆฌ์คํฌ ๊ด๋ฆฌ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ ์ ์์ต๋๋ค. **๋ณธ์ธ ๊ณ์ ๋ง ์ฌ์ฉํ์ธ์.** ์ด ํ๋ก์ ํธ๋ ๋๋ ๊ณ์ , ํ ๋น๋ ์ฌํ๋งค, ์๊ฒฉ ๋ฆด๋ ์ด, ํ์ด์ ์ฐํ, ํด๋ผ์ด์ธํธ ์ฌ์นญ์ ์ง์ํ์ง ์์ต๋๋ค. ์์
์ฉ์ผ๋ก๋ ๋ฒค๋ ๊ณต์ API-key ์ฑ๋์ ๊ถ์ฅํฉ๋๋ค.
## ๋ฌธ์
| ๋ฌธ์ | ์ฉ๋ |
|---|---|
| [`INSTALL.md`](INSTALL.md) | ์ค์นยท์ฌ์ฉ ์์ธ |
| [`CHANGELOG.md`](CHANGELOG.md) | ๋ฆด๋ฆฌ์ค ์ด๋ ฅ |
| [`docs/00-project-rules.md`](docs/00-project-rules.md) | ๋ฒ์ ๊ด๋ฆฌ, ๋ฆด๋ฆฌ์ค ๋ฃจํ, ๊ณต๊ฐ/๋ก์ปฌ ๋ถ๋ฆฌ |
| [`docs/02-architecture.md`](docs/02-architecture.md) | ๋ด๋ถ ์ํคํ
์ฒ (๋ผ์ฐํธ ยท ๋ฐ์ดํฐ ํ๋ฆ ยท ๋ชจ๋ ยท API) ยท [ไธญๆ](docs/02-architecture.zh-CN.md) |
| [`CONTRIBUTING.md`](CONTRIBUTING.md) | ๊ธฐ์ฌ ๊ฐ์ด๋ |
## ๊ด๋ จ ํ๋ก์ ํธ
- [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) โ Google Antigravity์ฉ ๋
๋ฆฝ ๊ณ ์ ๋ฒ์ ํ๋ฌ๊ทธ์ธ.
## ๊ธฐ์ฌ
๊ธฐ๋ฅ, ๋ฌธ์, ๋ฒ์ญ, ๋ฒ๊ทธ ๋ณด๊ณ ๋ฑ ๋ชจ๋ ๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค. ํ๋ก์ธ์ค, ์ปค๋ฐ ๊ท์น ๋ฐ ๋ฆด๋ฆฌ์ค ๋ฃจํ๋ **[CONTRIBUTING](CONTRIBUTING.md)**์ ์ฐธ์กฐํ์ธ์. ๋ชฉ๋ก์ ์๋ ์ธ์ด๋ผ๋ฉด README ๋ฒ์ญ์ PR๋ก ๋ณด๋ด ์ฃผ์ธ์. ์ ์ธ์ด ํ
์ด๋ธ์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
## ๋ผ์ด์ ์ค
[Apache-2.0](LICENSE) ยท [NOTICE](NOTICE) ์ฐธ์กฐ. ์ผ๋ถ๋ [dsh-xai](https://github.com/MirDie/dsh-xai) ํ๋ก์ ํธ(Apache-2.0)์์ ํ์๋์์ต๋๋ค.