chat / src /lib /utils /branchStorage.ts
Andrew
feat(utils): add branch storage utility
6bd5f9f
import { browser } from "$app/environment";
export interface BranchStateSnapshot {
messageId: string;
personaId: string;
personaName: string;
}
export interface BranchTrackingSnapshot {
messageId: string | null;
personaId: string | null;
}
const BRANCH_STATE_PREFIX = "branchState_";
const BRANCH_TRACKING_PREFIX = "branchTracking_";
function getBranchStateKey(conversationId: string): string {
return `${BRANCH_STATE_PREFIX}${conversationId}`;
}
function getBranchTrackingKey(conversationId: string): string {
return `${BRANCH_TRACKING_PREFIX}${conversationId}`;
}
export function loadBranchState(conversationId: string): BranchStateSnapshot | null {
if (!browser) return null;
const stored = localStorage.getItem(getBranchStateKey(conversationId));
if (!stored) return null;
try {
return JSON.parse(stored) as BranchStateSnapshot;
} catch {
localStorage.removeItem(getBranchStateKey(conversationId));
return null;
}
}
export function persistBranchState(
conversationId: string,
state: BranchStateSnapshot | null
): void {
if (!browser) return;
const key = getBranchStateKey(conversationId);
if (state) {
localStorage.setItem(key, JSON.stringify(state));
} else {
localStorage.removeItem(key);
}
}
export function loadBranchTracking(conversationId: string): BranchTrackingSnapshot {
if (!browser) return { messageId: null, personaId: null };
const stored = localStorage.getItem(getBranchTrackingKey(conversationId));
if (!stored) return { messageId: null, personaId: null };
try {
const parsed = JSON.parse(stored) as BranchTrackingSnapshot;
return {
messageId: parsed.messageId ?? null,
personaId: parsed.personaId ?? null,
};
} catch {
localStorage.removeItem(getBranchTrackingKey(conversationId));
return { messageId: null, personaId: null };
}
}
export function persistBranchTracking(
conversationId: string,
tracking: BranchTrackingSnapshot | null
): void {
if (!browser) return;
const key = getBranchTrackingKey(conversationId);
if (tracking && (tracking.messageId || tracking.personaId)) {
localStorage.setItem(key, JSON.stringify(tracking));
} else {
localStorage.removeItem(key);
}
}