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
This commit is contained in:
kaitranntt
2026-01-23 14:40:40 -05:00
parent 0511c5e2fd
commit a41fd2a093
4 changed files with 34 additions and 17 deletions
+6 -1
View File
@@ -85,7 +85,12 @@ export class BinaryManager {
/** Check for updates by comparing installed version with latest release */
async checkForUpdates(): Promise<UpdateCheckResult> {
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 */
+12 -9
View File
@@ -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(),
+12 -5
View File
@@ -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<string> {
/**
* 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<UpdateCheckResult> {
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),
+4 -2
View File
@@ -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');