





















@@ -11,6 +11,7 @@ import {
1111DEFAULT_OAUTH_WARN_MS,
1212formatRemainingShort,
1313} from "../../agents/auth-health.js";
14+import { resolveAuthProfileOrder } from "../../agents/auth-profiles/order.js";
1415import { resolveAuthStorePathForDisplay } from "../../agents/auth-profiles/paths.js";
1516import { ensureAuthProfileStoreWithoutExternalProfiles as ensureAuthProfileStore } from "../../agents/auth-profiles/store.js";
1617import type { AuthProfileCredential } from "../../agents/auth-profiles/types.js";
@@ -20,20 +21,20 @@ import {
2021resolveProviderEnvApiKeyCandidates,
2122resolveProviderEnvAuthEvidence,
2223} from "../../agents/model-auth-env-vars.js";
23-import { resolveEnvApiKey } from "../../agents/model-auth.js";
24+import { resolveEnvApiKey, resolveUsableCustomProviderApiKey } from "../../agents/model-auth.js";
2425import {
2526buildModelAliasIndex,
2627isCliProvider,
2728modelKey,
2829normalizeProviderId,
29-parseModelRef,
3030resolveConfiguredModelRef,
3131resolveModelRefFromString,
3232} from "../../agents/model-selection.js";
3333import {
3434OPENAI_CODEX_PROVIDER_ID,
3535openAIProviderUsesCodexRuntimeByDefault,
3636} from "../../agents/openai-codex-routing.js";
37+import { resolveProviderIdForAuth } from "../../agents/provider-auth-aliases.js";
3738import { resolveDefaultAgentWorkspaceDir } from "../../agents/workspace.js";
3839import { createConfigIO } from "../../config/config.js";
3940import {
@@ -249,25 +250,39 @@ export async function modelsStatusCommand(
249250.map((p) => (typeof p === "string" ? normalizeProviderId(p) : ""))
250251.filter(Boolean),
251252);
252-const providersFromModels = new Set<string>();
253-const providerUses: Array<{ provider: string; allowCodexRuntimeFallback: boolean }> = [];
254-const addProviderUse = (raw: string | undefined, allowCodexRuntimeFallback: boolean) => {
253+const aliasIndex = buildModelAliasIndex({
254+ cfg,
255+defaultProvider: DEFAULT_PROVIDER,
256+ ...DISPLAY_MODEL_PARSE_OPTIONS,
257+});
258+const resolveStatusModelRef = (raw: string | undefined) => {
255259const modelRef = raw?.trim();
256260if (!modelRef) {
257-return;
261+return undefined;
258262}
259-const parsed = parseModelRef(modelRef, DEFAULT_PROVIDER, DISPLAY_MODEL_PARSE_OPTIONS);
260-if (parsed?.provider) {
263+return resolveModelRefFromString({
264+ cfg,
265+raw: modelRef,
266+defaultProvider: DEFAULT_PROVIDER,
267+ aliasIndex,
268+ ...DISPLAY_MODEL_PARSE_OPTIONS,
269+})?.ref;
270+};
271+const providersFromModels = new Set<string>();
272+const providerUses: Array<{ provider: string; allowCodexRuntimeFallback: boolean }> = [];
273+const addProviderUse = (raw: string | undefined, allowCodexRuntimeFallback: boolean) => {
274+const ref = resolveStatusModelRef(raw);
275+if (ref?.provider) {
261276providerUses.push({
262-provider: normalizeProviderId(parsed.provider),
277+provider: normalizeProviderId(ref.provider),
263278 allowCodexRuntimeFallback,
264279});
265280}
266281};
267282for (const raw of [defaultLabel, ...fallbacks, imageModel, ...imageFallbacks, ...allowed]) {
268-const parsed = parseModelRef(raw ?? "", DEFAULT_PROVIDER, DISPLAY_MODEL_PARSE_OPTIONS);
269-if (parsed?.provider) {
270-providersFromModels.add(normalizeProviderId(parsed.provider));
283+const ref = resolveStatusModelRef(raw);
284+if (ref?.provider) {
285+providersFromModels.add(normalizeProviderId(ref.provider));
271286}
272287}
273288for (const raw of [defaultLabel, ...fallbacks]) {
@@ -310,12 +325,15 @@ export async function modelsStatusCommand(
310325providerConfig: resolveProviderConfigForStatus(cfg, normalized),
311326},
312327});
328+if (!resolved) {
329+continue;
330+}
313331syntheticAuthByProvider.set(normalized, {
314332value: "plugin-owned",
315-source: resolved?.source ?? "plugin synthetic auth",
316-credential: resolved?.apiKey,
317-mode: resolved?.mode,
318-expiresAt: resolved?.expiresAt,
333+source: resolved.source,
334+credential: resolved.apiKey,
335+mode: resolved.mode,
336+expiresAt: resolved.expiresAt,
319337});
320338}
321339const runtimeCredentialsByProvider = new Map(
@@ -361,19 +379,50 @@ export async function modelsStatusCommand(
361379return hasAny;
362380});
363381const providerAuthMap = new Map(providerAuth.map((entry) => [entry.provider, entry]));
382+const resolveProviderAuthHealthId = (provider: string): string =>
383+resolveProviderIdForAuth(provider, { config: cfg, workspaceDir });
384+const hasUsableNonProfileAuth = (provider: string): boolean => {
385+const authProvider = resolveProviderAuthHealthId(provider);
386+for (const candidate of new Set([provider, authProvider])) {
387+const auth = providerAuthMap.get(candidate);
388+if (
389+auth?.env ||
390+auth?.syntheticAuth ||
391+syntheticAuthByProvider.has(candidate) ||
392+resolveUsableCustomProviderApiKey({ cfg, provider: candidate })
393+) {
394+return true;
395+}
396+}
397+return false;
398+};
399+const hasUsableProviderAuth = (provider: string): boolean => {
400+const authProvider = resolveProviderAuthHealthId(provider);
401+for (const candidate of new Set([provider, authProvider])) {
402+const orderedProfiles = resolveAuthProfileOrder({
403+ cfg,
404+ store,
405+provider: candidate,
406+});
407+if (orderedProfiles.length > 0 || hasUsableNonProfileAuth(candidate)) {
408+return true;
409+}
410+}
411+return false;
412+};
364413const hasUsableAuthForProviderInUse = (
365414provider: string,
366415options: { allowCodexRuntimeFallback: boolean },
367416): boolean => {
368-if (providerAuthMap.has(provider) || syntheticAuthByProvider.has(provider)) {
417+if (hasUsableProviderAuth(provider)) {
369418return true;
370419}
371420if (!options.allowCodexRuntimeFallback) {
372421return false;
373422}
374423return (
375424openAIProviderUsesCodexRuntimeByDefault({ provider, config: cfg }) &&
376-providerAuthMap.has(OPENAI_CODEX_PROVIDER_ID)
425+hasUsableProviderAuth(OPENAI_CODEX_PROVIDER_ID)
377426);
378427};
379428const missingProvidersInUse = Array.from(
@@ -414,11 +463,6 @@ export async function modelsStatusCommand(
414463throw new Error("--probe-max-tokens must be > 0.");
415464}
416465417-const aliasIndex = buildModelAliasIndex({
418- cfg,
419-defaultProvider: DEFAULT_PROVIDER,
420- ...DISPLAY_MODEL_PARSE_OPTIONS,
421-});
422466const rawCandidates = [
423467rawModel || resolvedLabel,
424468 ...fallbacks,
@@ -522,10 +566,31 @@ export async function modelsStatusCommand(
522566})();
523567524568const checkStatus = (() => {
569+const providersInUse = new Set<string>();
570+for (const usage of providerUses) {
571+providersInUse.add(usage.provider);
572+providersInUse.add(resolveProviderAuthHealthId(usage.provider));
573+if (
574+usage.allowCodexRuntimeFallback &&
575+openAIProviderUsesCodexRuntimeByDefault({ provider: usage.provider, config: cfg }) &&
576+providerAuthMap.has(OPENAI_CODEX_PROVIDER_ID)
577+) {
578+providersInUse.add(OPENAI_CODEX_PROVIDER_ID);
579+}
580+}
525581const hasExpiredOrMissing =
526-oauthProfiles.some((profile) => ["expired", "missing"].includes(profile.status)) ||
527-missingProvidersInUse.length > 0;
528-const hasExpiring = oauthProfiles.some((profile) => profile.status === "expiring");
582+authHealth.providers.some(
583+(provider) =>
584+providersInUse.has(provider.provider) &&
585+["expired", "missing"].includes(provider.status) &&
586+!hasUsableNonProfileAuth(provider.provider),
587+) || missingProvidersInUse.length > 0;
588+const hasExpiring = authHealth.providers.some(
589+(provider) =>
590+providersInUse.has(provider.provider) &&
591+provider.status === "expiring" &&
592+!hasUsableNonProfileAuth(provider.provider),
593+);
529594if (hasExpiredOrMissing) {
530595return 1;
531596}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。