import type { LLMMessage } from '../llm/llm-provider.js'; export interface SessionMeta { sessionKey: string; createdAt: number; updatedAt: number; title?: string; messageCount: number; } export interface SessionStore { loadMessages(sessionKey: string): Promise; appendMessage(sessionKey: string, message: LLMMessage): Promise; replaceMessages(sessionKey: string, messages: LLMMessage[]): Promise; listSessions(): Promise; deleteSession(sessionKey: string): Promise; exists(sessionKey: string): Promise; } export class InMemorySessionStore implements SessionStore { private sessions = new Map(); async loadMessages(sessionKey: string): Promise { return [...(this.sessions.get(sessionKey)?.messages ?? [])]; } async appendMessage(sessionKey: string, message: LLMMessage): Promise { let session = this.sessions.get(sessionKey); if (!session) { session = { messages: [], meta: { sessionKey, createdAt: Date.now(), updatedAt: Date.now(), messageCount: 0 }, }; this.sessions.set(sessionKey, session); } session.messages.push(message); session.meta.updatedAt = Date.now(); session.meta.messageCount = session.messages.length; } async replaceMessages(sessionKey: string, messages: LLMMessage[]): Promise { let session = this.sessions.get(sessionKey); if (!session) { session = { messages: [], meta: { sessionKey, createdAt: Date.now(), updatedAt: Date.now(), messageCount: 0 }, }; this.sessions.set(sessionKey, session); } session.messages = [...messages]; session.meta.updatedAt = Date.now(); session.meta.messageCount = messages.length; } async listSessions(): Promise { return [...this.sessions.values()].map((s) => ({ ...s.meta })); } async deleteSession(sessionKey: string): Promise { this.sessions.delete(sessionKey); } async exists(sessionKey: string): Promise { return this.sessions.has(sessionKey); } }