

















@@ -1,4 +1,5 @@
11import type { OpenClawConfig } from "../config/types.openclaw.js";
2+import { CLAUDE_CLI_PROFILE_ID } from "./auth-profiles/constants.js";
23import {
34DEFAULT_OAUTH_REFRESH_MARGIN_MS,
45type AuthCredentialReasonCode,
@@ -8,6 +9,7 @@ import {
89import { resolveAuthProfileDisplayLabel } from "./auth-profiles/display.js";
910import { resolveEffectiveOAuthCredential } from "./auth-profiles/effective-oauth.js";
1011import type { AuthProfileCredential, AuthProfileStore } from "./auth-profiles/types.js";
12+import { readClaudeCliCredentialsCached } from "./cli-credentials.js";
1113import { normalizeProviderId } from "./provider-id.js";
12141315export type AuthProfileSource = "store";
@@ -101,6 +103,34 @@ function resolveOAuthStatus(
101103return { status: "ok", remainingMs };
102104}
103105106+function resolveClaudeCliStatusCredential(params: {
107+profileId: string;
108+credential: AuthProfileCredential;
109+}): AuthProfileCredential {
110+if (params.profileId !== CLAUDE_CLI_PROFILE_ID) {
111+return params.credential;
112+}
113+const cliCredential = readClaudeCliCredentialsCached({ allowKeychainPrompt: false });
114+if (!cliCredential) {
115+return params.credential;
116+}
117+if (cliCredential.type === "oauth") {
118+return {
119+type: "oauth",
120+provider: params.credential.provider,
121+access: cliCredential.access,
122+refresh: cliCredential.refresh,
123+expires: cliCredential.expires,
124+};
125+}
126+return {
127+type: "token",
128+provider: params.credential.provider,
129+token: cliCredential.token,
130+expires: cliCredential.expires,
131+};
132+}
133+104134function buildProfileHealth(params: {
105135profileId: string;
106136credential: AuthProfileCredential;
@@ -112,9 +142,10 @@ function buildProfileHealth(params: {
112142const { profileId, credential, store, cfg, now, warnAfterMs } = params;
113143const label = resolveAuthProfileDisplayLabel({ cfg, store, profileId });
114144const source = resolveAuthProfileSource(profileId);
115-const provider = normalizeProviderId(credential.provider);
145+const healthCredential = resolveClaudeCliStatusCredential({ profileId, credential });
146+const provider = normalizeProviderId(healthCredential.provider);
116147117-if (credential.type === "api_key") {
148+if (healthCredential.type === "api_key") {
118149return {
119150 profileId,
120151 provider,
@@ -125,9 +156,9 @@ function buildProfileHealth(params: {
125156};
126157}
127158128-if (credential.type === "token") {
159+if (healthCredential.type === "token") {
129160const eligibility = evaluateStoredCredentialEligibility({
130- credential,
161+credential: healthCredential,
131162 now,
132163});
133164if (!eligibility.eligible) {
@@ -143,8 +174,8 @@ function buildProfileHealth(params: {
143174 label,
144175};
145176}
146-const expiryState = resolveTokenExpiryState(credential.expires, now);
147-const expiresAt = expiryState === "valid" ? credential.expires : undefined;
177+const expiryState = resolveTokenExpiryState(healthCredential.expires, now);
178+const expiresAt = expiryState === "valid" ? healthCredential.expires : undefined;
148179if (!expiresAt) {
149180return {
150181 profileId,
@@ -171,7 +202,7 @@ function buildProfileHealth(params: {
171202172203const effectiveCredential = resolveEffectiveOAuthCredential({
173204 profileId,
174- credential,
205+credential: healthCredential,
175206});
176207const oauthWarnAfterMs = Math.max(warnAfterMs, DEFAULT_OAUTH_REFRESH_MARGIN_MS);
177208const { status: rawStatus, remainingMs } = resolveOAuthStatus(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。