Files
goose/ui/desktop/src/utils/localMessageStorage.ts
T

77 lines
1.9 KiB
TypeScript

interface StoredMessage {
content: string;
timestamp: number;
}
const STORAGE_KEY = 'goose-chat-history';
const MAX_MESSAGES = 500;
const EXPIRY_DAYS = 30;
export class LocalMessageStorage {
private static getStoredMessages(): StoredMessage[] {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (!stored) return [];
const messages = JSON.parse(stored) as StoredMessage[];
const now = Date.now();
const expiryTime = now - EXPIRY_DAYS * 24 * 60 * 60 * 1000;
// Filter out expired messages and limit to max count
const validMessages = messages
.filter((msg) => msg.timestamp > expiryTime)
.slice(-MAX_MESSAGES);
// If we filtered any messages, update storage
if (validMessages.length !== messages.length) {
this.setStoredMessages(validMessages);
}
return validMessages;
} catch (error) {
console.error('Error reading message history:', error);
return [];
}
}
private static setStoredMessages(messages: StoredMessage[]) {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(messages));
} catch (error) {
console.error('Error saving message history:', error);
}
}
static addMessage(content: string) {
if (!content.trim()) return;
const messages = this.getStoredMessages();
const now = Date.now();
// Don't add duplicate of last message
if (messages.length > 0 && messages[messages.length - 1].content === content) {
return;
}
messages.push({
content,
timestamp: now,
});
// Keep only the most recent MAX_MESSAGES
const validMessages = messages.slice(-MAX_MESSAGES);
this.setStoredMessages(validMessages);
}
static getRecentMessages(): string[] {
return this.getStoredMessages()
.map((msg) => msg.content)
.reverse(); // Most recent first
}
static clearHistory() {
localStorage.removeItem(STORAGE_KEY);
}
}