


























@@ -0,0 +1,207 @@
1+import type { OpenClawConfig } from "../../config/types.openclaw.js";
2+import { resolveCliRuntimeExecutionProvider } from "../model-runtime-aliases.js";
3+import { resolveProviderIdForAuth } from "../provider-auth-aliases.js";
4+import { findNormalizedProviderValue, normalizeProviderId } from "../provider-id.js";
5+import { CLAUDE_CLI_PROFILE_ID } from "./constants.js";
6+import type { AuthProfileStore } from "./types.js";
7+8+const CLAUDE_CLI_PROVIDER_ID = "claude-cli";
9+10+export function resolveExternalCliAuthOverlayScopeFromSelection(params: {
11+provider: string;
12+cfg?: OpenClawConfig;
13+agentId?: string;
14+modelId?: string;
15+workspaceDir?: string;
16+store?: AuthProfileStore;
17+userLockedAuthProfileId?: string;
18+}): {
19+providerIds?: readonly string[];
20+ignoreAutoPreferredProfile: boolean;
21+} {
22+const authScope = resolveExternalCliAuthScopeFromAuthSelection({
23+provider: params.provider,
24+cfg: params.cfg,
25+workspaceDir: params.workspaceDir,
26+store: params.store,
27+userLockedAuthProfileId: params.userLockedAuthProfileId,
28+});
29+const selectedRuntimeProvider =
30+resolveCliRuntimeExecutionProvider({
31+provider: params.provider,
32+cfg: params.cfg,
33+agentId: params.agentId,
34+modelId: params.modelId,
35+authProfileId: params.userLockedAuthProfileId,
36+}) || (params.provider === CLAUDE_CLI_PROVIDER_ID ? CLAUDE_CLI_PROVIDER_ID : undefined);
37+const selectedProvider =
38+authScope.selectedProviderId ??
39+(selectedRuntimeProvider === CLAUDE_CLI_PROVIDER_ID ? CLAUDE_CLI_PROVIDER_ID : undefined);
40+const providerIds = [
41+ ...new Set([
42+ ...authScope.providerIds,
43+ ...(selectedRuntimeProvider === CLAUDE_CLI_PROVIDER_ID ? [CLAUDE_CLI_PROVIDER_ID] : []),
44+]),
45+];
46+return {
47+ ...(providerIds.length > 0 ? { providerIds } : {}),
48+ignoreAutoPreferredProfile:
49+!params.userLockedAuthProfileId && selectedProvider === CLAUDE_CLI_PROVIDER_ID,
50+};
51+}
52+53+function resolveExternalCliAuthScopeFromAuthSelection(params: {
54+provider: string;
55+cfg?: OpenClawConfig;
56+workspaceDir?: string;
57+store?: AuthProfileStore;
58+userLockedAuthProfileId?: string;
59+}): {
60+providerIds: string[];
61+selectedProviderId?: string;
62+} {
63+if (params.userLockedAuthProfileId) {
64+const providerId = resolveExternalCliProviderIdForCompatibleAuthProfile({
65+ ...params,
66+profileId: params.userLockedAuthProfileId,
67+})?.externalCliProviderId;
68+return {
69+providerIds: providerId ? [providerId] : [],
70+ ...(providerId ? { selectedProviderId: providerId } : {}),
71+};
72+}
73+74+const providerIds: string[] = [];
75+let sawCompatibleOrderedProfile = false;
76+let selectedProviderId: string | undefined;
77+for (const profileId of resolveConfiguredAuthProfileOrder(params)) {
78+const resolved = resolveExternalCliProviderIdForCompatibleAuthProfile({
79+ ...params,
80+ profileId,
81+});
82+if (!resolved.compatible) {
83+continue;
84+}
85+if (!sawCompatibleOrderedProfile) {
86+selectedProviderId = resolved.externalCliProviderId;
87+sawCompatibleOrderedProfile = true;
88+}
89+if (resolved.externalCliProviderId) {
90+providerIds.push(resolved.externalCliProviderId);
91+}
92+}
93+if (sawCompatibleOrderedProfile) {
94+return {
95+providerIds: [...new Set(providerIds)],
96+ ...(selectedProviderId ? { selectedProviderId } : {}),
97+};
98+}
99+100+let compatibleProfileCount = 0;
101+const profileIds = [
102+ ...new Set([
103+ ...Object.keys(params.cfg?.auth?.profiles ?? {}),
104+ ...Object.keys(params.store?.profiles ?? {}),
105+]),
106+];
107+for (const profileId of profileIds) {
108+const resolved = resolveExternalCliProviderIdForCompatibleAuthProfile({
109+ ...params,
110+ profileId,
111+});
112+if (!resolved.compatible) {
113+continue;
114+}
115+compatibleProfileCount += 1;
116+if (resolved.externalCliProviderId) {
117+providerIds.push(resolved.externalCliProviderId);
118+}
119+}
120+const uniqueProviderIds = [...new Set(providerIds)];
121+return {
122+providerIds: uniqueProviderIds,
123+ ...(compatibleProfileCount === 1 && uniqueProviderIds[0]
124+ ? { selectedProviderId: uniqueProviderIds[0] }
125+ : {}),
126+};
127+}
128+129+function resolveConfiguredAuthProfileOrder(params: {
130+provider: string;
131+cfg?: OpenClawConfig;
132+workspaceDir?: string;
133+store?: AuthProfileStore;
134+}): string[] {
135+const providerAuthKey = resolveProviderIdForAuth(params.provider, {
136+config: params.cfg,
137+workspaceDir: params.workspaceDir,
138+});
139+const orderedProfileIds =
140+resolveAuthProfileOrderEntries({
141+order: params.store?.order,
142+provider: params.provider,
143+ providerAuthKey,
144+}) ??
145+resolveAuthProfileOrderEntries({
146+order: params.cfg?.auth?.order,
147+provider: params.provider,
148+ providerAuthKey,
149+}) ??
150+[];
151+return [
152+ ...new Set(
153+orderedProfileIds
154+.map((profileId) => profileId?.trim())
155+.filter((profileId): profileId is string => !!profileId),
156+),
157+];
158+}
159+160+function resolveAuthProfileOrderEntries(params: {
161+order?: Record<string, string[]>;
162+provider: string;
163+providerAuthKey: string;
164+}): string[] | undefined {
165+return (
166+findNormalizedProviderValue(params.order, params.providerAuthKey) ??
167+(normalizeProviderId(params.providerAuthKey) === normalizeProviderId(params.provider)
168+ ? undefined
169+ : findNormalizedProviderValue(params.order, params.provider))
170+);
171+}
172+173+function resolveExternalCliProviderIdForCompatibleAuthProfile(params: {
174+provider: string;
175+cfg?: OpenClawConfig;
176+workspaceDir?: string;
177+store?: AuthProfileStore;
178+profileId: string;
179+}): {
180+compatible: boolean;
181+externalCliProviderId?: string;
182+} {
183+const profile = params.cfg?.auth?.profiles?.[params.profileId];
184+const credential = params.store?.profiles?.[params.profileId];
185+const profileProvider =
186+profile?.provider ??
187+credential?.provider ??
188+(params.profileId === CLAUDE_CLI_PROFILE_ID ? CLAUDE_CLI_PROVIDER_ID : undefined);
189+if (!profileProvider) {
190+return { compatible: false };
191+}
192+const authAliasParams = {
193+config: params.cfg,
194+workspaceDir: params.workspaceDir,
195+};
196+const providerAuthKey = resolveProviderIdForAuth(params.provider, authAliasParams);
197+const profileAuthKey = resolveProviderIdForAuth(profileProvider, authAliasParams);
198+if (!providerAuthKey || profileAuthKey !== providerAuthKey) {
199+return { compatible: false };
200+}
201+return {
202+compatible: true,
203+ ...(normalizeProviderId(profileProvider) === CLAUDE_CLI_PROVIDER_ID
204+ ? { externalCliProviderId: CLAUDE_CLI_PROVIDER_ID }
205+ : {}),
206+};
207+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。