From d52a0c2320447137bc1a6b31527b80dca8551e0e Mon Sep 17 00:00:00 2001 From: dofastted Date: Tue, 20 Oct 2026 11:40:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(web):=20Claude=20Code=20=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E6=89=93=E5=BC=80=E7=99=BB=E5=BD=95=E7=BB=88=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 已有授权链接不再挡住官方登录。选择 Claude Code 时显示终端,链接只留给普通 OAuth 和 Setup Token。 --- web/src/features/vm/credential-panel.tsx | 66 ++++++++++++------------ 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/web/src/features/vm/credential-panel.tsx b/web/src/features/vm/credential-panel.tsx index 9afa07933..ac02de87e 100644 --- a/web/src/features/vm/credential-panel.tsx +++ b/web/src/features/vm/credential-panel.tsx @@ -411,6 +411,37 @@ function ClaudeCredentialPanel({ {importCred.isPending ? '换票中…' : '导入'} + ) : activeMethod === 'cc' ? ( +
+ + 打开槽终端并自动执行 claude auth + login。链接在终端里复制,授权码直接粘进终端,不经过面板。需要容器已运行且 + cli-node 已安装。 + + + + + + 官方登录 + + 终端会执行 claude auth + login。复制里面的链接,授权码粘回这个终端。 + + +
+ {loginOpen ? ( + + ) : null} +
+
+
+
) : linkReady ? (
@@ -477,42 +508,9 @@ function ClaudeCredentialPanel({ {kind === 'setup-token' ? `申请完整 OAuth 权限,换票后采集身份。浏览器须走 ${proxyHint || '同一槽出口'},授权码须含 # 后半段。以 Setup Token 模式运行,不跑官方初装。` - : activeMethod === 'cc' - ? `槽内 cli-node 执行官方 claude auth login。链接、PKCE 和换票都由官方 CLI 完成,浏览器须走 ${proxyHint || '同一槽出口'}。需要容器已运行且 cli-node 已安装。` - : `浏览器须走 ${proxyHint || '同一槽出口'},授权码须含 # 后半段。换票后采集身份。`} + : `浏览器须走 ${proxyHint || '同一槽出口'},授权码须含 # 后半段。换票后采集身份。`}
- ) : activeMethod === 'cc' ? ( -
- - 打开槽终端并自动执行 claude auth - login。链接在终端里复制,授权码直接粘进终端,不经过面板。需要容器已运行且 - cli-node 已安装。 - - - - - - 官方登录 - - 终端会执行 claude auth - login。复制里面的链接,授权码粘回这个终端。 - - -
- {loginOpen ? ( - - ) : null} -
-
-
-
) : (
From 9656ca6b4832816a032634340399da24dcb786e4 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Oct 2026 04:31:49 +0000 Subject: [PATCH 2/3] =?UTF-8?q?docs(changelog):=20=E6=9C=AA=E5=8F=91?= =?UTF-8?q?=E5=B8=83=20=E2=80=94=20CC=20=E7=99=BB=E5=BD=95=E7=BB=88?= =?UTF-8?q?=E7=AB=AF=E9=A1=BA=E5=BA=8F=20(#621)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ted --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bee6ed0ba..1dd9ac098 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 未发布 +- 面板凭据:选择 Claude Code 官方登录时直接打开槽终端,已有 OAuth 授权链接不再挡住 CC 登录路径。(#621) - Responses WebSocket:入站 `response.interrupt`(Codex steer)本地中止在飞 hop 并回 `response.interrupt.accepted`;取消走既有 handleProtocol 终态记账,不再报 `unsupported Responses WebSocket message type` 或网关 `incomplete_response`。上游 interrupt 转发对齐 CPR 后置。(#616) - Fable `7d_oi`:reset 已过(含秒级时间戳)不再永久判 rejected;`fableWindowResetAt` / weekly split 用 `parseResetMs`;过期清理纳入 `unified['7d_oi']`,且 `elapsedExtraResetMs` 纳入 `7d_oi` 后会在窗口过期时触发 usage probe;无 reset 时仍按 rejected 处理。(#601) - OpenAI 槽:从 OAuth `id_token` 读取 `chatgpt_subscription_active_until`(含 epoch 秒/毫秒归一化为 ISO),刷新时新 token 带 claim 则覆盖到期日、不带则保留旧值;账号页只读展示「订阅到期(以凭证为准)」,缺失显示「—」。`plan_type` 缺失时用 id_token 的 `chatgpt_plan_type` 兜底展示;wham 写入的套餐类型优先。(#609) From fb3c637d842ddaaf634c64dee9d882cfa9be35b5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 20 Oct 2026 04:36:11 +0000 Subject: [PATCH 3/3] =?UTF-8?q?docs(changelog):=20=E6=9C=AC=E5=88=87?= =?UTF-8?q?=E7=89=87=E5=BC=95=E7=94=A8=20#622?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ted --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dd9ac098..a42e54e6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 未发布 -- 面板凭据:选择 Claude Code 官方登录时直接打开槽终端,已有 OAuth 授权链接不再挡住 CC 登录路径。(#621) +- 面板凭据:选择 Claude Code 官方登录时直接打开槽终端,已有 OAuth 授权链接不再挡住 CC 登录路径。(#622) - Responses WebSocket:入站 `response.interrupt`(Codex steer)本地中止在飞 hop 并回 `response.interrupt.accepted`;取消走既有 handleProtocol 终态记账,不再报 `unsupported Responses WebSocket message type` 或网关 `incomplete_response`。上游 interrupt 转发对齐 CPR 后置。(#616) - Fable `7d_oi`:reset 已过(含秒级时间戳)不再永久判 rejected;`fableWindowResetAt` / weekly split 用 `parseResetMs`;过期清理纳入 `unified['7d_oi']`,且 `elapsedExtraResetMs` 纳入 `7d_oi` 后会在窗口过期时触发 usage probe;无 reset 时仍按 rejected 处理。(#601) - OpenAI 槽:从 OAuth `id_token` 读取 `chatgpt_subscription_active_until`(含 epoch 秒/毫秒归一化为 ISO),刷新时新 token 带 claim 则覆盖到期日、不带则保留旧值;账号页只读展示「订阅到期(以凭证为准)」,缺失显示「—」。`plan_type` 缺失时用 id_token 的 `chatgpt_plan_type` 兜底展示;wham 写入的套餐类型优先。(#609)