From 209b9c72add4327977d20569f62053c3a687b98d Mon Sep 17 00:00:00 2001 From: iliya Date: Wed, 27 May 2026 23:43:25 +0300 Subject: [PATCH] fix: count OpenCode inventory fallback as connected --- .../components/dashboard/CliStatusBanner.tsx | 9 ++++-- .../cli/CliStatusVisibility.test.ts | 28 ++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/dashboard/CliStatusBanner.tsx b/src/renderer/components/dashboard/CliStatusBanner.tsx index 63361c61..38fc6aff 100644 --- a/src/renderer/components/dashboard/CliStatusBanner.tsx +++ b/src/renderer/components/dashboard/CliStatusBanner.tsx @@ -37,6 +37,7 @@ import { getProviderDisconnectAction, isConnectionManagedRuntimeProvider, isOpenCodeCatalogHydrating, + isProviderInventoryOnlyFallback, shouldShowProviderConnectAction, shouldShowProviderStatusSkeleton, } from '@renderer/components/runtime/providerConnectionUi'; @@ -527,6 +528,10 @@ function isPendingMultimodelProviderStatus(provider: CliProviderStatus): boolean ); } +function isProviderCountedAsConnected(provider: CliProviderStatus): boolean { + return provider.authenticated || isProviderInventoryOnlyFallback(provider); +} + function formatRuntimeAuthSummary( cliStatus: NonNullable['cliStatus']>, visibleProviders: readonly CliProviderStatus[], @@ -541,7 +546,7 @@ function formatRuntimeAuthSummary( return t('cliStatus.provider.checkingProviders'); } const denominator = visibleProviders.length; - const connected = visibleProviders.filter((provider) => provider.authenticated).length; + const connected = visibleProviders.filter(isProviderCountedAsConnected).length; return t('cliStatus.provider.connectedCount', { connected, denominator }); } @@ -571,7 +576,7 @@ function isCheckingMultimodelStatus( function hasVisibleAuthenticatedMultimodelProvider( visibleProviders: readonly CliProviderStatus[] ): boolean { - return visibleProviders.some((provider) => provider.authenticated); + return visibleProviders.some(isProviderCountedAsConnected); } function isOpenCodeProviderEffectivelyReady(provider: CliProviderStatus): boolean { diff --git a/test/renderer/components/cli/CliStatusVisibility.test.ts b/test/renderer/components/cli/CliStatusVisibility.test.ts index 984a410b..57a52ff2 100644 --- a/test/renderer/components/cli/CliStatusVisibility.test.ts +++ b/test/renderer/components/cli/CliStatusVisibility.test.ts @@ -718,9 +718,34 @@ describe('CLI status visibility during completed install state', () => { supportsSelfUpdate: false, showVersionDetails: false, showBinaryPath: false, - authLoggedIn: false, + authLoggedIn: true, authStatusChecking: false, providers: [ + { + providerId: 'anthropic', + displayName: 'Anthropic', + supported: true, + authenticated: true, + authMethod: 'api_key', + verificationState: 'verified', + statusMessage: null, + models: ['claude-haiku-4-5'], + modelAvailability: [], + canLoginFromUi: true, + capabilities: { + teamLaunch: true, + oneShot: true, + }, + backend: null, + modelCatalog: null, + modelCatalogRefreshState: 'idle', + runtimeCapabilities: null, + }, + createCodexNativeRolloutProvider({ + state: 'ready', + statusMessage: 'ChatGPT account ready', + models: ['gpt-5.4'], + }), { providerId: 'opencode', displayName: 'OpenCode (200+ models)', @@ -755,6 +780,7 @@ describe('CLI status visibility during completed install state', () => { }); expect(host.textContent).toContain('OpenCode'); + expect(host.textContent).toContain('Providers: 3/3 connected'); expect(host.textContent).toContain('Models available'); expect(host.textContent).toContain('big-pickle'); expect(host.textContent).not.toContain('Checking...');