Repository navigation
Device-code logins need one consistent hint on every login surface #2529
Description
Area
Dashboard
What are you trying to accomplish?
Finish a device-code OAuth login (xAI, Claude, Kimi, Nous, GitHub Copilot) from the dashboard without guessing, and finish it from a machine that is not the one running the proxy.
What prevents this today?
The affordances a login needs are split across four surfaces, and no surface has all of them:
| Surface | Authorization URL | Device / user code | Paste redirect or code |
|---|---|---|---|
| Provider workspace panel | yes | yes | no |
| Add-provider modal, OAuth pane | yes | no | yes |
| Add-provider modal, Accounts tab | no | no | no |
| Codex account modal | yes | no | yes |
Concretely:
gui/src/components/use-add-provider-oauth.tstypes the login response as{ url, instructions, error }and never readsdeviceCode, althoughPOST /api/oauth/loginreturns it.gui/src/components/provider-workspace/ProviderAuthPanel.tsxrenders the URL and the device code and has no paste field anywhere in the file, so a remote or SSH re-authentication on an existing provider has no way to submit a code.- One device provider does not set
deviceCodeat all and puts the user code inside a proseinstructionsstring, so no surface can render it as a code widget. LoginUrlBlockreturns nothing when the URL is empty, so a device flow that returns only a code shows an empty box.
What should OpenCodex do?
Every surface that can start a login should show, when the provider supplies them: the user code with a copy button, the verification URL with a copy button, any provider instructions, and a field to paste a redirect URL or authorization code.
Example usage or interface
Start a Kimi login from the dashboard. Expected: the user code is displayed in a copyable widget and the verification URL is copyable, on whichever surface the login was started from. Today the code is only reachable by reading a sentence, and only on some surfaces.
Alternatives or workarounds
Reading the code out of the instructions sentence where it happens to be rendered, or starting the login from a different dialog than the one you wanted.
Additional context
The four surfaces drifted apart because each grew the half its own flow needed. Which affordances a user gets should be a property of the provider's flow, not of which dialog they happened to open.
Checks
- I searched existing issues and documentation.
- This request describes a concrete OpenCodex workflow rather than merely naming a desired technology.
- I removed secrets and personal data.
Activity
lidge-jun commentedon Aug 25, 2026
리뷰 · 우선순위 59 / 80
설명: 이 이슈는 기기 코드 로그인이 화면마다 다른 힌트를 보여주는 구멍을 고치자고 한다. 작성자는 lidge-jun 이다. 라벨은 enhancement, account-pool, gui 다. 지금 CURRENT dev HEAD 는 98ed186 이다. 방금 2492 가 클로드 계정 풀 카드 여백만 고쳤다. 로그인 힌트 네 화면은 그대로다. 구현 풀이 아직 없다. 이슈를 연다. 닫지 말 것. 라벨은 바꾸지 말 것.
네 화면을 HEAD 에서 직접 읽었다. 제공자 작업공간 ProviderAuthPanel.tsx 387-402줄은 url 과 deviceCode 위젯이 있다. 붙여넣기 칸은 파일 안에 없다. 추가 제공자 모달 OAuth 칸 add-provider-oauth-pane.tsx 59-98줄은 LoginUrlBlock 과 붙여넣기가 있다. 기기 코드 위젯은 없다. use-add-provider-oauth.ts 53줄은 응답을 url, instructions, error 로만 읽는다. deviceCode 칸을 버린다. 추가 제공자 모달 계정 탭 ProviderCatalog.tsx 148-198줄은 로그인과 취소 버튼만 있다. url, 코드, 붙여넣기가 모두 없다. 코덱스 대기 add-codex-account-waiting-step.tsx 38-67줄은 url 과 붙여넣기가 있고 기기 코드는 없다. LoginUrlBlock 16줄은 url 이 비면 null 을 돌려서, 코드만 있는 흐름은 빈 상자가 된다.
서버는 이미 deviceCode 를 돌려준다. oauth-account-routes.ts 158-176줄 startLoginFlow 결과가 url, instructions, deviceCode 로 나간다. 작업공간 쪽 use-providers-oauth.ts 93-95줄은 그 칸을 읽는다. 모달 쪽 훅만 안 읽는다. 제공자마다 onAuth 가 다르다. kimi.ts 212줄은 url 과 Enter code 문장만 넣고 deviceCode 칸이 없다. nous.ts 659-662줄과 github-copilot.ts 395-398줄은 deviceCode 에 userCode 를 넣는다. 그래서 작업공간 위젯은 누스와 깃허브만 코드를 보여주고, 키미는 문장 안에만 있다. xai.ts 169-173줄과 anthropic 로그인은 브라우저 리다이렉트와 붙여넣기 우회다. RFC 기기 코드가 아니다. 이슈가 둘을 한 바구니에 넣었다. 구현은 제공자 이름 목록이 아니라 deviceCode 가 있는지, 붙여넣기 우회가 있는지로 갈라야 한다.
고치는 모양은 한 로그인 힌트 조각이 네 화면을 먹이는 것이다. 코드 복사, url 복사, 안내 문장, 붙여넣기 칸을 제공자가 준 것만 그린다. 1769 는 붙여넣기 우회 드래프트다. 그 풀로 이 이슈를 닫지 말 것. 1769 는 모달 붙여넣기만 보고, 기기 코드 위젯과 계정 탭은 비어 있다. 2221 네이티브 메인 토큰 갱신과도 다르다. 2497 드래프트를 이 이슈로 합치지 말 것. types.ts 와 config.ts 가르기와는 무관하다. 프리뷰 배포가 아니다. 2463 2464 2465 별칭 파일은 없다. 닫지 말 것.
구현 풀이 오기 전에는 이 이슈만 연다. 계정 탭에서 키미를 누르면 코드가 안 보이고, 원격 재인증은 붙여넣을 곳이 없다. 재현은 대시보드에서 키미 또는 누스 로그인을 작업공간과 추가 모달과 계정 탭에서 각각 시작해 보면 된다. 내가 머지하지 않는다. 구현이 착지하기 전에 닫지 말 것.
gui/src/components/use-add-provider-oauth.ts 53줄 - 로그인 응답에서 deviceCode 를 읽지 않아 모달이 코드를 받을 수 없다
gui/src/components/add-provider-oauth-pane.tsx 59줄 - LoginUrlBlock 만 있고 기기 코드 위젯이 없다
gui/src/components/provider-workspace/ProviderAuthPanel.tsx 387-402줄 - url 과 deviceCode 는 있고 붙여넣기 칸이 없어 원격 재인증이 막힌다
gui/src/components/provider-catalog/ProviderCatalog.tsx 148-198줄 - 계정 탭은 버튼만 있고 url, 코드, 붙여넣기가 모두 없다
gui/src/components/login-url-block.tsx 16줄 - url 이 비면 아무것도 안 그려 코드만 있는 흐름이 빈 상자가 된다
src/oauth/kimi.ts 212줄 - onAuth 에 deviceCode 칸이 없고 코드를 문장에만 넣는다. 어떤 화면도 위젯으로 못 그린다
메인테이너의 판단이 필요한 지점
너의 추천
이 이슈는 연다. 구현 풀을 기다린다. 한 힌트 조각이 네 화면을 먹이게 한다. 키미 onAuth 에 deviceCode 를 넣고, 모달 훅이 그 칸을 읽게 한다. 1769 로 닫지 말 것. 2221 도 연다. 내가 머지하지 않는다. 라벨은 그대로 둔다. 프리뷰 배포가 아니다.
이 댓글은 grok-bot이 작성했습니다
lidge-jun commentedon Aug 25, 2026
Landed via #2530 at d7d708f