fix: count OpenCode inventory fallback as connected Merge pull request #183 from 777genius/fix/opencode-inventory-summary-count

fix: count OpenCode inventory fallback as connected
This commit is contained in:
Илия 2026-05-27 23:46:55 +03:00 committed by GitHub
commit a76d0cb2ed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 3 deletions

View file

@ -37,6 +37,7 @@ import {
getProviderDisconnectAction, getProviderDisconnectAction,
isConnectionManagedRuntimeProvider, isConnectionManagedRuntimeProvider,
isOpenCodeCatalogHydrating, isOpenCodeCatalogHydrating,
isProviderInventoryOnlyFallback,
shouldShowProviderConnectAction, shouldShowProviderConnectAction,
shouldShowProviderStatusSkeleton, shouldShowProviderStatusSkeleton,
} from '@renderer/components/runtime/providerConnectionUi'; } 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( function formatRuntimeAuthSummary(
cliStatus: NonNullable<ReturnType<typeof useCliInstaller>['cliStatus']>, cliStatus: NonNullable<ReturnType<typeof useCliInstaller>['cliStatus']>,
visibleProviders: readonly CliProviderStatus[], visibleProviders: readonly CliProviderStatus[],
@ -541,7 +546,7 @@ function formatRuntimeAuthSummary(
return t('cliStatus.provider.checkingProviders'); return t('cliStatus.provider.checkingProviders');
} }
const denominator = visibleProviders.length; 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 }); return t('cliStatus.provider.connectedCount', { connected, denominator });
} }
@ -571,7 +576,7 @@ function isCheckingMultimodelStatus(
function hasVisibleAuthenticatedMultimodelProvider( function hasVisibleAuthenticatedMultimodelProvider(
visibleProviders: readonly CliProviderStatus[] visibleProviders: readonly CliProviderStatus[]
): boolean { ): boolean {
return visibleProviders.some((provider) => provider.authenticated); return visibleProviders.some(isProviderCountedAsConnected);
} }
function isOpenCodeProviderEffectivelyReady(provider: CliProviderStatus): boolean { function isOpenCodeProviderEffectivelyReady(provider: CliProviderStatus): boolean {

View file

@ -718,9 +718,34 @@ describe('CLI status visibility during completed install state', () => {
supportsSelfUpdate: false, supportsSelfUpdate: false,
showVersionDetails: false, showVersionDetails: false,
showBinaryPath: false, showBinaryPath: false,
authLoggedIn: false, authLoggedIn: true,
authStatusChecking: false, authStatusChecking: false,
providers: [ 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', providerId: 'opencode',
displayName: 'OpenCode (200+ models)', 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('OpenCode');
expect(host.textContent).toContain('Providers: 3/3 connected');
expect(host.textContent).toContain('Models available'); expect(host.textContent).toContain('Models available');
expect(host.textContent).toContain('big-pickle'); expect(host.textContent).toContain('big-pickle');
expect(host.textContent).not.toContain('Checking...'); expect(host.textContent).not.toContain('Checking...');