From 08437def80afac5f3cd5dc18313bc003ea2f75bc Mon Sep 17 00:00:00 2001 From: Shine1i Date: Tue, 17 Feb 2026 20:43:08 +0100 Subject: [PATCH] feat: add session-based storage for chat training comparison handoff - Implemented a utility to manage `training-compare-handoff` data in `sessionStorage` with strict validation and expiration logic. - Added methods to set, retrieve, and clear handoff data for improved chat training flow. --- .../chat/lib/training-compare-handoff.ts | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 studio/frontend/src/features/chat/lib/training-compare-handoff.ts diff --git a/studio/frontend/src/features/chat/lib/training-compare-handoff.ts b/studio/frontend/src/features/chat/lib/training-compare-handoff.ts new file mode 100644 index 0000000000..1ceaf7a00b --- /dev/null +++ b/studio/frontend/src/features/chat/lib/training-compare-handoff.ts @@ -0,0 +1,53 @@ +const TRAINING_COMPARE_HANDOFF_KEY = "chat:training-compare-handoff:v1"; +const HANDOFF_MAX_AGE_MS = 15 * 60 * 1000; + +export type TrainingCompareHandoff = { + intent: "compare"; + baseModel: string | null; + requestedAt: number; +}; + +export function setTrainingCompareHandoff(baseModel: string | null): void { + if (typeof window === "undefined") return; + + const payload: TrainingCompareHandoff = { + intent: "compare", + baseModel, + requestedAt: Date.now(), + }; + window.sessionStorage.setItem( + TRAINING_COMPARE_HANDOFF_KEY, + JSON.stringify(payload), + ); +} + +export function getTrainingCompareHandoff(): TrainingCompareHandoff | null { + if (typeof window === "undefined") return null; + + const raw = window.sessionStorage.getItem(TRAINING_COMPARE_HANDOFF_KEY); + if (!raw) return null; + + try { + const parsed = JSON.parse(raw) as Partial; + if (parsed.intent !== "compare") return null; + if (typeof parsed.requestedAt !== "number") return null; + if (Date.now() - parsed.requestedAt > HANDOFF_MAX_AGE_MS) { + clearTrainingCompareHandoff(); + return null; + } + return { + intent: "compare", + baseModel: + typeof parsed.baseModel === "string" ? parsed.baseModel : null, + requestedAt: parsed.requestedAt, + }; + } catch { + clearTrainingCompareHandoff(); + return null; + } +} + +export function clearTrainingCompareHandoff(): void { + if (typeof window === "undefined") return; + window.sessionStorage.removeItem(TRAINING_COMPARE_HANDOFF_KEY); +}