File size: 2,166 Bytes
6bd5f9f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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);
	}
}