fix(cliproxy): tighten session affinity status handling

This commit is contained in:
Tam Nhu Tran committed 2026-04-28 12:26:42 -04:00
1 parent 4309db89c3
commit 20f3916d55
2 files changed
+21 -11

No files matched your search

+3 -1
View File
@@ -99,6 +99,8 @@ const MIN_STALE_HIGH_ONLY_GEMINI_MINOR_VERSIONS = 3;
const MIN_STALE_GUESSED_GEMINI_AVERAGE_VARIANTS_PER_MINOR = 2; const MIN_STALE_GUESSED_GEMINI_AVERAGE_VARIANTS_PER_MINOR = 2;
const LEGACY_GEMINI_STALE_ALIAS_MIGRATION_VERSION = 16; const LEGACY_GEMINI_STALE_ALIAS_MIGRATION_VERSION = 16;
const MAX_LEGACY_MANUAL_GEMINI_MINOR_VERSION = 2; const MAX_LEGACY_MANUAL_GEMINI_MINOR_VERSION = 2;
const GO_DURATION_SEGMENT = String.raw`(?:\d+(?:\.\d+)?(?:ns|us|µs|μs|ms|s|m|h))`;
const GO_DURATION_PATTERN = new RegExp(`^${GO_DURATION_SEGMENT}+$`);
/** /**
* Get provider configuration * Get provider configuration
@@ -139,7 +141,7 @@ function getSessionAffinityEnabled(): boolean {
function getSessionAffinityTtl(): string { function getSessionAffinityTtl(): string {
const ttl = loadOrCreateUnifiedConfig().cliproxy?.routing?.session_affinity_ttl?.trim(); const ttl = loadOrCreateUnifiedConfig().cliproxy?.routing?.session_affinity_ttl?.trim();
return ttl || '1h'; return ttl && GO_DURATION_PATTERN.test(ttl) ? ttl : '1h';
} }
function sanitizeYamlScalar(rawValue: string): string { function sanitizeYamlScalar(rawValue: string): string {
@@ -168,12 +168,20 @@ export function ProxyStatusWidget() {
} = useCliproxySessionAffinity(); } = useCliproxySessionAffinity();
const updateSessionAffinity = useUpdateCliproxySessionAffinity(); const updateSessionAffinity = useUpdateCliproxySessionAffinity();
const isSavingRoutingConfig = updateRouting.isPending || updateSessionAffinity.isPending; const isSavingRoutingConfig = updateRouting.isPending || updateSessionAffinity.isPending;
const routingConfigError = const routingConfigError = routingError instanceof Error ? routingError : null;
routingError instanceof Error const effectiveSessionAffinityState =
? routingError sessionAffinityState ??
: sessionAffinityError instanceof Error (sessionAffinityError instanceof Error
? sessionAffinityError ? {
: null; source: 'unsupported' as const,
target: (routingState?.target ?? (isRemoteMode ? 'remote' : 'local')) as
| 'local'
| 'remote',
reachable: false,
manageable: false,
message: sessionAffinityError.message,
}
: undefined);
const startProxy = useStartProxy(); const startProxy = useStartProxy();
const stopProxy = useStopProxy(); const stopProxy = useStopProxy();
const restartProxy = useRestartProxy(); const restartProxy = useRestartProxy();
@@ -330,11 +338,11 @@ export function ProxyStatusWidget() {
</div> </div>
<RoutingGuidanceCard <RoutingGuidanceCard
key={`remote:${routingState?.strategy ?? 'round-robin'}:${sessionAffinityState?.enabled ?? 'na'}:${sessionAffinityState?.ttl ?? 'na'}:${sessionAffinityState?.manageable ?? 'na'}`} key={`remote:${routingState?.strategy ?? 'round-robin'}:${effectiveSessionAffinityState?.enabled ?? 'na'}:${effectiveSessionAffinityState?.ttl ?? 'na'}:${effectiveSessionAffinityState?.manageable ?? 'na'}`}
compact compact
className="mt-3" className="mt-3"
state={routingState} state={routingState}
sessionAffinityState={sessionAffinityState} sessionAffinityState={effectiveSessionAffinityState}
isLoading={routingLoading || sessionAffinityLoading} isLoading={routingLoading || sessionAffinityLoading}
isSaving={isSavingRoutingConfig} isSaving={isSavingRoutingConfig}
error={routingConfigError} error={routingConfigError}
@@ -488,11 +496,11 @@ export function ProxyStatusWidget() {
</div> </div>
<RoutingGuidanceCard <RoutingGuidanceCard
key={`local:${routingState?.strategy ?? 'round-robin'}:${sessionAffinityState?.enabled ?? 'na'}:${sessionAffinityState?.ttl ?? 'na'}:${sessionAffinityState?.manageable ?? 'na'}`} key={`local:${routingState?.strategy ?? 'round-robin'}:${effectiveSessionAffinityState?.enabled ?? 'na'}:${effectiveSessionAffinityState?.ttl ?? 'na'}:${effectiveSessionAffinityState?.manageable ?? 'na'}`}
compact compact
className="mt-3" className="mt-3"
state={routingState} state={routingState}
sessionAffinityState={sessionAffinityState} sessionAffinityState={effectiveSessionAffinityState}
isLoading={routingLoading || sessionAffinityLoading} isLoading={routingLoading || sessionAffinityLoading}
isSaving={isSavingRoutingConfig} isSaving={isSavingRoutingConfig}
error={routingConfigError} error={routingConfigError}