From a41fd2a093d207d9216cde2a58da8669c09c7c04 Mon Sep 17 00:00:00 2001 From: kaitranntt Date: Fri, 23 Jan 2026 14:40:40 -0500 Subject: [PATCH] fix(cliproxy): make version cache backend-specific for proper switching - Add backend parameter to version cache functions (read/write/path) - Store cache at bin/{backend}/.version-cache.json instead of shared location - Pass backend through checkForUpdates() and BinaryManager - Add refetchType: 'all' to force immediate query refetch on backend change - Add cliproxy-server-config query invalidation for consistency --- src/cliproxy/binary-manager.ts | 7 ++++++- src/cliproxy/binary/version-cache.ts | 21 ++++++++++++--------- src/cliproxy/binary/version-checker.ts | 17 ++++++++++++----- ui/src/hooks/use-cliproxy.ts | 6 ++++-- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/cliproxy/binary-manager.ts b/src/cliproxy/binary-manager.ts index 06218844..986ef1b0 100644 --- a/src/cliproxy/binary-manager.ts +++ b/src/cliproxy/binary-manager.ts @@ -85,7 +85,12 @@ export class BinaryManager { /** Check for updates by comparing installed version with latest release */ async checkForUpdates(): Promise { - return checkForUpdates(this.config.binPath, this.config.version, this.config.verbose); + return checkForUpdates( + this.config.binPath, + this.config.version, + this.config.verbose, + this.backend + ); } /** Get full path to binary executable */ diff --git a/src/cliproxy/binary/version-cache.ts b/src/cliproxy/binary/version-cache.ts index 7d120afc..d7f11614 100644 --- a/src/cliproxy/binary/version-cache.ts +++ b/src/cliproxy/binary/version-cache.ts @@ -16,10 +16,10 @@ import { DEFAULT_BACKEND } from '../platform-detector'; import type { CLIProxyBackend } from '../types'; /** - * Get path to version cache file + * Get path to version cache file (backend-specific) */ -export function getVersionCachePath(): string { - return path.join(getCliproxyDir(), '.version-cache.json'); +export function getVersionCachePath(backend: CLIProxyBackend = DEFAULT_BACKEND): string { + return path.join(getBinDir(), backend, '.version-cache.json'); } /** @@ -30,10 +30,10 @@ export function getVersionPinPath(backend: CLIProxyBackend = DEFAULT_BACKEND): s } /** - * Read version cache if still valid + * Read version cache if still valid (backend-specific) */ -export function readVersionCache(): VersionCache | null { - const cachePath = getVersionCachePath(); +export function readVersionCache(backend: CLIProxyBackend = DEFAULT_BACKEND): VersionCache | null { + const cachePath = getVersionCachePath(backend); if (!fs.existsSync(cachePath)) { return null; } @@ -55,10 +55,13 @@ export function readVersionCache(): VersionCache | null { } /** - * Write version to cache + * Write version to cache (backend-specific) */ -export function writeVersionCache(version: string): void { - const cachePath = getVersionCachePath(); +export function writeVersionCache( + version: string, + backend: CLIProxyBackend = DEFAULT_BACKEND +): void { + const cachePath = getVersionCachePath(backend); const cache: VersionCache = { latestVersion: version, checkedAt: Date.now(), diff --git a/src/cliproxy/binary/version-checker.ts b/src/cliproxy/binary/version-checker.ts index 383b6bbc..9a15faba 100644 --- a/src/cliproxy/binary/version-checker.ts +++ b/src/cliproxy/binary/version-checker.ts @@ -17,7 +17,12 @@ import { GITHUB_API_ALL_RELEASES, VersionListResult, } from './types'; -import { CLIPROXY_MAX_STABLE_VERSION, CLIPROXY_FAULTY_RANGE } from '../platform-detector'; +import { + CLIPROXY_MAX_STABLE_VERSION, + CLIPROXY_FAULTY_RANGE, + DEFAULT_BACKEND, +} from '../platform-detector'; +import type { CLIProxyBackend } from '../types'; /** * Compare semver versions (true if latest > current) @@ -72,16 +77,18 @@ export async function fetchLatestVersion(verbose = false): Promise { /** * Check for updates by comparing installed version with latest release * Uses cache to avoid hitting GitHub API on every run + * Cache is backend-specific to handle different repos for original vs plus */ export async function checkForUpdates( binPath: string, configVersion: string, - verbose = false + verbose = false, + backend: CLIProxyBackend = DEFAULT_BACKEND ): Promise { const currentVersion = readInstalledVersion(binPath, configVersion); - // Try cache first - const cache = readVersionCache(); + // Try cache first (backend-specific) + const cache = readVersionCache(backend); if (cache) { if (verbose) { console.error(`[cliproxy] Using cached version: ${cache.latestVersion}`); @@ -98,7 +105,7 @@ export async function checkForUpdates( // Fetch from GitHub API const latestVersion = await fetchLatestVersion(verbose); const now = Date.now(); - writeVersionCache(latestVersion); + writeVersionCache(latestVersion, backend); return { hasUpdate: isNewerVersion(latestVersion, currentVersion), diff --git a/ui/src/hooks/use-cliproxy.ts b/ui/src/hooks/use-cliproxy.ts index dce70f76..6f6e6d18 100644 --- a/ui/src/hooks/use-cliproxy.ts +++ b/ui/src/hooks/use-cliproxy.ts @@ -353,8 +353,10 @@ export function useUpdateBackend() { api.cliproxyServer.updateBackend(backend, force), onSuccess: () => { // Invalidate all queries that depend on backend setting - queryClient.invalidateQueries({ queryKey: ['cliproxy-update-check'] }); - queryClient.invalidateQueries({ queryKey: ['cliproxy-versions'] }); + // Use refetchType: 'all' to force immediate refetch even if query is stale + queryClient.invalidateQueries({ queryKey: ['cliproxy-update-check'], refetchType: 'all' }); + queryClient.invalidateQueries({ queryKey: ['cliproxy-versions'], refetchType: 'all' }); + queryClient.invalidateQueries({ queryKey: ['cliproxy-server-config'], refetchType: 'all' }); queryClient.invalidateQueries({ queryKey: ['proxy-status'] }); queryClient.invalidateQueries({ queryKey: ['cliproxy-stats'] }); toast.success('Backend updated');