agent-ecosystem/src/renderer/hooks/useEffectiveCliProviderStatus.ts

59 lines
1.9 KiB
TypeScript

import { useMemo } from 'react';
import {
mergeCodexCliStatusWithSnapshot,
useCodexAccountSnapshot,
} from '@features/codex-account/renderer';
import { useStore } from '@renderer/store';
import { createLoadingMultimodelCliStatus } from '@renderer/store/slices/cliInstallerSlice';
import type { CliInstallationStatus, CliProviderId, CliProviderStatus } from '@shared/types';
export interface EffectiveCliProviderStatusSnapshot {
cliStatus: CliInstallationStatus | null;
providerStatus: CliProviderStatus | null;
loading: boolean;
}
export function useEffectiveCliProviderStatus(
providerId: CliProviderId | undefined
): EffectiveCliProviderStatusSnapshot {
const multimodelEnabled = useStore((s) => s.appConfig?.general?.multimodelEnabled ?? true);
const cliStatus = useStore((s) => s.cliStatus);
const cliStatusLoading = useStore((s) => s.cliStatusLoading);
const loadingCliStatus = useMemo(
() =>
!cliStatus && cliStatusLoading && multimodelEnabled
? createLoadingMultimodelCliStatus()
: cliStatus,
[cliStatus, cliStatusLoading, multimodelEnabled]
);
const codexAccount = useCodexAccountSnapshot({
enabled:
providerId === 'codex' &&
multimodelEnabled &&
loadingCliStatus?.flavor === 'agent_teams_orchestrator' &&
Boolean(loadingCliStatus?.providers.some((provider) => provider.providerId === 'codex')),
});
const effectiveCliStatus = useMemo(
() => mergeCodexCliStatusWithSnapshot(loadingCliStatus, codexAccount.snapshot),
[codexAccount.snapshot, loadingCliStatus]
);
const providerStatus = useMemo(
() =>
providerId
? (effectiveCliStatus?.providers.find((provider) => provider.providerId === providerId) ??
null)
: null,
[effectiveCliStatus?.providers, providerId]
);
return {
cliStatus: effectiveCliStatus,
providerStatus,
loading: cliStatusLoading && effectiveCliStatus === null,
};
}