fix: provider-scoped snapshot refresh with self-healing invalidation

This commit is contained in:
Mohamed Boudra
2026-04-21 13:14:59 +07:00
parent b01e274cce
commit 3832053736
6 changed files with 236 additions and 31 deletions
@@ -50,7 +50,7 @@ interface UseProvidersSnapshotResult {
error: string | null;
supportsSnapshot: boolean;
refresh: (providers?: AgentProvider[]) => Promise<void>;
refetchIfStale: () => void;
refetchIfStale: (selectedProvider?: AgentProvider | null) => void;
}
interface UseProvidersSnapshotOptions {
@@ -118,6 +118,14 @@ export function useProvidersSnapshot(
generatedAt: message.payload.generatedAt,
requestId: "providers_snapshot_update",
});
const shouldRefetch = message.payload.entries.some((entry) => entry.status === "loading");
if (shouldRefetch) {
void queryClient.invalidateQueries({
queryKey,
exact: true,
refetchType: "active",
});
}
});
}, [
client,
@@ -143,9 +151,26 @@ export function useProvidersSnapshot(
[client, normalizedCwd, queryClient, queryKey, refreshSnapshot],
);
const refetchIfStale = useCallback(() => {
void queryClient.refetchQueries({ queryKey, type: "active", stale: true });
}, [queryClient, queryKey]);
const refetchIfStale = useCallback(
(selectedProvider?: AgentProvider | null) => {
if (!selectedProvider) {
void queryClient.refetchQueries({ queryKey, type: "active", stale: true });
return;
}
const selectedEntry = snapshotQuery.data?.entries.find(
(entry) => entry.provider === selectedProvider,
);
if (!selectedEntry || selectedEntry.status === "loading") {
void queryClient.refetchQueries({ queryKey, type: "active" });
return;
}
void queryClient.refetchQueries({ queryKey, type: "active", stale: true });
},
[queryClient, queryKey, snapshotQuery.data?.entries],
);
return {
entries: snapshotQuery.data?.entries ?? undefined,