diff --git a/packages/app/src/components/agent-status-bar.model-loading.test.ts b/packages/app/src/components/agent-status-bar.model-loading.test.ts new file mode 100644 index 000000000..d75714a85 --- /dev/null +++ b/packages/app/src/components/agent-status-bar.model-loading.test.ts @@ -0,0 +1,31 @@ +import { QueryClient, QueryObserver } from "@tanstack/react-query"; +import { describe, expect, it } from "vitest"; + +import { isProviderModelsQueryLoading } from "./agent-status-bar.model-loading"; + +describe("isProviderModelsQueryLoading", () => { + it("does not treat a disabled pending query as loading", () => { + const queryClient = new QueryClient(); + const observer = new QueryObserver(queryClient, { + queryKey: ["providerModels", "server-1", "__missing_provider__"], + enabled: false, + queryFn: async () => [], + }); + + const result = observer.getCurrentResult(); + + expect(result.isPending).toBe(true); + expect(result.isLoading).toBe(false); + expect(result.isFetching).toBe(false); + expect(isProviderModelsQueryLoading(result)).toBe(false); + }); + + it("treats an active fetch as loading", () => { + expect( + isProviderModelsQueryLoading({ + isLoading: false, + isFetching: true, + }), + ).toBe(true); + }); +}); diff --git a/packages/app/src/components/agent-status-bar.model-loading.ts b/packages/app/src/components/agent-status-bar.model-loading.ts new file mode 100644 index 000000000..b8673e6f4 --- /dev/null +++ b/packages/app/src/components/agent-status-bar.model-loading.ts @@ -0,0 +1,8 @@ +interface ProviderModelsQueryState { + isFetching: boolean; + isLoading: boolean; +} + +export function isProviderModelsQueryLoading(input: ProviderModelsQueryState): boolean { + return input.isLoading || input.isFetching; +} diff --git a/packages/app/src/components/agent-status-bar.tsx b/packages/app/src/components/agent-status-bar.tsx index fbefa2f45..d15f3aea9 100644 --- a/packages/app/src/components/agent-status-bar.tsx +++ b/packages/app/src/components/agent-status-bar.tsx @@ -33,6 +33,7 @@ import { getStatusSelectorHint, resolveAgentModelSelection, } from "@/components/agent-status-bar.utils"; +import { isProviderModelsQueryLoading } from "@/components/agent-status-bar.model-loading"; type StatusOption = { id: string; @@ -634,12 +635,7 @@ export function AgentStatusBar({ agentId, serverId }: AgentStatusBarProps) { const client = useSessionStore((state) => state.sessions[serverId]?.client ?? null); const modelsQuery = useQuery({ - queryKey: [ - "providerModels", - serverId, - agent?.provider ?? "__missing_provider__", - agent?.cwd ?? "__missing_cwd__", - ], + queryKey: ["providerModels", serverId, agent?.provider ?? "__missing_provider__"], enabled: Boolean(client && agent?.provider), staleTime: 5 * 60 * 1000, queryFn: async () => { @@ -753,7 +749,7 @@ export function AgentStatusBar({ agentId, serverId }: AgentStatusBarProps) { console.warn("[AgentStatusBar] setAgentThinkingOption failed", error); }); }} - isModelLoading={modelsQuery.isPending || modelsQuery.isFetching} + isModelLoading={isProviderModelsQueryLoading(modelsQuery)} disabled={!client} /> ); diff --git a/packages/app/src/hooks/use-agent-form-state.ts b/packages/app/src/hooks/use-agent-form-state.ts index 7a783b61e..bec3f0392 100644 --- a/packages/app/src/hooks/use-agent-form-state.ts +++ b/packages/app/src/hooks/use-agent-form-state.ts @@ -418,7 +418,7 @@ export function useAgentFormState(options: UseAgentFormStateOptions = {}): UseAg }, [formState.workingDir]); const providerModelsQuery = useQuery({ - queryKey: ["providerModels", formState.serverId, formState.provider, debouncedCwd], + queryKey: ["providerModels", formState.serverId, formState.provider], enabled: Boolean( isVisible && isTargetDaemonReady && @@ -446,7 +446,7 @@ export function useAgentFormState(options: UseAgentFormStateOptions = {}): UseAg const allProviderModelQueries = useQueries({ queries: providerDefinitions.map((def) => ({ - queryKey: ["providerModels", formState.serverId, def.id, debouncedCwd], + queryKey: ["providerModels", formState.serverId, def.id], enabled: Boolean( isVisible && isTargetDaemonReady && formState.serverId && client && isConnected, ),