# ๐Ÿ” dsh-coding-subscription-oauth **v0.5.6 ยท ์ด์ „ ์ด๋ฆ„ `dsh-grok-build` **[DeepSeek Harness](https://github.com/deepseek-ai/dsh)์šฉ ์ฝ”๋”ฉ ๊ตฌ๋… OAuth ํ”Œ๋Ÿฌ๊ทธ์ธ.** ์ด๋ฏธ ๊ฒฐ์ œํ•œ ๊ตฌ๋…์œผ๋กœ ํ•œ ๋ฒˆ์— ๋กœ๊ทธ์ธํ•˜๊ณ , dsh ์„ค์ • ํŽ˜์ด์ง€๋‚˜ CLI์—์„œ ๊ทธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. **์ฑ„ํŒ…์— ํ† ํฐ์„ ๋ถ™์—ฌ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.** [![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](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**๋ฅผ ์—ด์–ด ์ฃผ์„ธ์š”:
Coding OAuth Accounts tab
Accounts
Coding OAuth Gateway tab
Gateway
Coding OAuth Capabilities tab
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)์—์„œ ํŒŒ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.