Global/local chat history store in localstorage (#2428)
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user