@mzhub/mem-ts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +335 -0
- package/dist/BaseAdapter-BoRh1T7O.d.mts +75 -0
- package/dist/BaseAdapter-CQVX-gcA.d.ts +75 -0
- package/dist/BaseProvider-CEoiLGj5.d.ts +34 -0
- package/dist/BaseProvider-edMh_R9t.d.mts +34 -0
- package/dist/adapters/index.d.mts +259 -0
- package/dist/adapters/index.d.ts +259 -0
- package/dist/adapters/index.js +1570 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +1542 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/index-Ci5Q9G9H.d.mts +289 -0
- package/dist/index-Dl-Q2au9.d.ts +289 -0
- package/dist/index.d.mts +1206 -0
- package/dist/index.d.ts +1206 -0
- package/dist/index.js +5126 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5058 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middleware/index.d.mts +4 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.js +63 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/index.mjs +59 -0
- package/dist/middleware/index.mjs.map +1 -0
- package/dist/providers/index.d.mts +96 -0
- package/dist/providers/index.d.ts +96 -0
- package/dist/providers/index.js +379 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/index.mjs +370 -0
- package/dist/providers/index.mjs.map +1 -0
- package/dist/types-G9qmfSeZ.d.mts +260 -0
- package/dist/types-G9qmfSeZ.d.ts +260 -0
- package/logo.png +0 -0
- package/package.json +114 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/BaseAdapter.ts","../../src/adapters/InMemoryAdapter.ts","../../src/adapters/JSONFileAdapter.ts","../../src/adapters/MongoDBAdapter.ts","../../src/adapters/PostgresAdapter.ts","../../src/adapters/UpstashRedisAdapter.ts"],"names":["uuidv4","result"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\r\n MemoryFact,\r\n ConversationExchange,\r\n Session,\r\n FactFilter,\r\n} from \"../types\";\r\n\r\n/**\r\n * Abstract base class for storage adapters.\r\n * All storage implementations must extend this class.\r\n */\r\nexport abstract class BaseAdapter {\r\n protected initialized = false;\r\n\r\n /**\r\n * Initialize the adapter (connect to database, create tables, etc.)\r\n */\r\n abstract initialize(): Promise<void>;\r\n\r\n /**\r\n * Close the adapter connection\r\n */\r\n abstract close(): Promise<void>;\r\n\r\n // =========================================================================\r\n // Fact Operations\r\n // =========================================================================\r\n\r\n /**\r\n * Get facts for a user with optional filters\r\n */\r\n abstract getFacts(userId: string, filter?: FactFilter): Promise<MemoryFact[]>;\r\n\r\n /**\r\n * Get a specific fact by ID\r\n */\r\n abstract getFactById(\r\n userId: string,\r\n factId: string\r\n ): Promise<MemoryFact | null>;\r\n\r\n /**\r\n * Insert or update a fact\r\n */\r\n abstract upsertFact(\r\n userId: string,\r\n fact: Omit<MemoryFact, \"id\" | \"createdAt\" | \"updatedAt\">\r\n ): Promise<MemoryFact>;\r\n\r\n /**\r\n * Update an existing fact\r\n */\r\n abstract updateFact(\r\n userId: string,\r\n factId: string,\r\n updates: Partial<MemoryFact>\r\n ): Promise<MemoryFact>;\r\n\r\n /**\r\n * Delete a fact (soft delete - sets invalidatedAt)\r\n */\r\n abstract deleteFact(\r\n userId: string,\r\n factId: string,\r\n reason?: string\r\n ): Promise<void>;\r\n\r\n /**\r\n * Hard delete a fact (permanent)\r\n */\r\n abstract hardDeleteFact(userId: string, factId: string): Promise<void>;\r\n\r\n // =========================================================================\r\n // Conversation Operations\r\n // =========================================================================\r\n\r\n /**\r\n * Get conversation history for a user\r\n */\r\n abstract getConversationHistory(\r\n userId: string,\r\n limit?: number,\r\n sessionId?: string\r\n ): Promise<ConversationExchange[]>;\r\n\r\n /**\r\n * Save a conversation exchange\r\n */\r\n abstract saveConversation(\r\n userId: string,\r\n exchange: Omit<ConversationExchange, \"id\">\r\n ): Promise<ConversationExchange>;\r\n\r\n // =========================================================================\r\n // Session Operations\r\n // =========================================================================\r\n\r\n /**\r\n * Get all sessions for a user\r\n */\r\n abstract getSessions(userId: string, limit?: number): Promise<Session[]>;\r\n\r\n /**\r\n * Get a specific session\r\n */\r\n abstract getSession(\r\n userId: string,\r\n sessionId: string\r\n ): Promise<Session | null>;\r\n\r\n /**\r\n * Create a new session\r\n */\r\n abstract createSession(userId: string): Promise<Session>;\r\n\r\n /**\r\n * End a session\r\n */\r\n abstract endSession(\r\n userId: string,\r\n sessionId: string,\r\n summary?: string\r\n ): Promise<Session>;\r\n\r\n // =========================================================================\r\n // Utility Methods\r\n // =========================================================================\r\n\r\n /**\r\n * Check if adapter is initialized\r\n */\r\n isInitialized(): boolean {\r\n return this.initialized;\r\n }\r\n\r\n /**\r\n * Ensure adapter is initialized before operations\r\n */\r\n protected async ensureInitialized(): Promise<void> {\r\n if (!this.initialized) {\r\n await this.initialize();\r\n }\r\n }\r\n}\r\n","import { v4 as uuidv4 } from \"uuid\";\r\nimport { BaseAdapter } from \"./BaseAdapter\";\r\nimport type {\r\n MemoryFact,\r\n ConversationExchange,\r\n Session,\r\n FactFilter,\r\n} from \"../types\";\r\n\r\ninterface UserData {\r\n facts: Map<string, MemoryFact>;\r\n conversations: ConversationExchange[];\r\n sessions: Map<string, Session>;\r\n}\r\n\r\n/**\r\n * In-memory storage adapter for development and testing.\r\n * Data is lost when the process exits.\r\n */\r\nexport class InMemoryAdapter extends BaseAdapter {\r\n private users: Map<string, UserData> = new Map();\r\n\r\n async initialize(): Promise<void> {\r\n this.initialized = true;\r\n }\r\n\r\n async close(): Promise<void> {\r\n this.users.clear();\r\n this.initialized = false;\r\n }\r\n\r\n private getUserData(userId: string): UserData {\r\n let userData = this.users.get(userId);\r\n if (!userData) {\r\n userData = {\r\n facts: new Map(),\r\n conversations: [],\r\n sessions: new Map(),\r\n };\r\n this.users.set(userId, userData);\r\n }\r\n return userData;\r\n }\r\n\r\n // =========================================================================\r\n // Fact Operations\r\n // =========================================================================\r\n\r\n async getFacts(userId: string, filter?: FactFilter): Promise<MemoryFact[]> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n let facts = Array.from(userData.facts.values());\r\n\r\n // Apply filters\r\n if (filter) {\r\n if (filter.subject) {\r\n facts = facts.filter((f) => f.subject === filter.subject);\r\n }\r\n if (filter.predicate) {\r\n facts = facts.filter((f) => f.predicate === filter.predicate);\r\n }\r\n if (filter.predicates && filter.predicates.length > 0) {\r\n facts = facts.filter((f) => filter.predicates!.includes(f.predicate));\r\n }\r\n if (filter.validOnly !== false) {\r\n facts = facts.filter((f) => f.invalidatedAt === null);\r\n }\r\n\r\n // Sort\r\n if (filter.orderBy) {\r\n facts.sort((a, b) => {\r\n const aVal = a[filter.orderBy!];\r\n const bVal = b[filter.orderBy!];\r\n if (aVal instanceof Date && bVal instanceof Date) {\r\n return filter.orderDir === \"desc\"\r\n ? bVal.getTime() - aVal.getTime()\r\n : aVal.getTime() - bVal.getTime();\r\n }\r\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\r\n return filter.orderDir === \"desc\" ? bVal - aVal : aVal - bVal;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n // Limit\r\n if (filter.limit) {\r\n facts = facts.slice(0, filter.limit);\r\n }\r\n }\r\n\r\n return facts;\r\n }\r\n\r\n async getFactById(\r\n userId: string,\r\n factId: string\r\n ): Promise<MemoryFact | null> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n return userData.facts.get(factId) || null;\r\n }\r\n\r\n async upsertFact(\r\n userId: string,\r\n fact: Omit<MemoryFact, \"id\" | \"createdAt\" | \"updatedAt\">\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n\r\n // Check for existing fact with same subject+predicate\r\n const existingFact = Array.from(userData.facts.values()).find(\r\n (f) =>\r\n f.subject === fact.subject &&\r\n f.predicate === fact.predicate &&\r\n f.invalidatedAt === null\r\n );\r\n\r\n const now = new Date();\r\n\r\n if (existingFact) {\r\n // Update existing\r\n const updated: MemoryFact = {\r\n ...existingFact,\r\n ...fact,\r\n updatedAt: now,\r\n };\r\n userData.facts.set(existingFact.id, updated);\r\n return updated;\r\n }\r\n\r\n // Create new\r\n const newFact: MemoryFact = {\r\n ...fact,\r\n id: uuidv4(),\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n userData.facts.set(newFact.id, newFact);\r\n return newFact;\r\n }\r\n\r\n async updateFact(\r\n userId: string,\r\n factId: string,\r\n updates: Partial<MemoryFact>\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n const fact = userData.facts.get(factId);\r\n\r\n if (!fact) {\r\n throw new Error(`Fact not found: ${factId}`);\r\n }\r\n\r\n const updated: MemoryFact = {\r\n ...fact,\r\n ...updates,\r\n id: fact.id, // Prevent ID change\r\n updatedAt: new Date(),\r\n };\r\n userData.facts.set(factId, updated);\r\n return updated;\r\n }\r\n\r\n async deleteFact(\r\n userId: string,\r\n factId: string,\r\n _reason?: string\r\n ): Promise<void> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n const fact = userData.facts.get(factId);\r\n\r\n if (fact) {\r\n fact.invalidatedAt = new Date();\r\n userData.facts.set(factId, fact);\r\n }\r\n }\r\n\r\n async hardDeleteFact(userId: string, factId: string): Promise<void> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n userData.facts.delete(factId);\r\n }\r\n\r\n // =========================================================================\r\n // Conversation Operations\r\n // =========================================================================\r\n\r\n async getConversationHistory(\r\n userId: string,\r\n limit?: number,\r\n sessionId?: string\r\n ): Promise<ConversationExchange[]> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n let conversations = [...userData.conversations];\r\n\r\n if (sessionId) {\r\n conversations = conversations.filter((c) => c.sessionId === sessionId);\r\n }\r\n\r\n // Sort by timestamp descending (most recent first)\r\n conversations.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\r\n\r\n if (limit) {\r\n conversations = conversations.slice(0, limit);\r\n }\r\n\r\n return conversations;\r\n }\r\n\r\n async saveConversation(\r\n userId: string,\r\n exchange: Omit<ConversationExchange, \"id\">\r\n ): Promise<ConversationExchange> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n\r\n const newExchange: ConversationExchange = {\r\n ...exchange,\r\n id: uuidv4(),\r\n };\r\n\r\n userData.conversations.push(newExchange);\r\n\r\n // Update session message count\r\n const session = userData.sessions.get(exchange.sessionId);\r\n if (session) {\r\n session.messageCount++;\r\n }\r\n\r\n return newExchange;\r\n }\r\n\r\n // =========================================================================\r\n // Session Operations\r\n // =========================================================================\r\n\r\n async getSessions(userId: string, limit?: number): Promise<Session[]> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n let sessions = Array.from(userData.sessions.values());\r\n\r\n // Sort by startedAt descending\r\n sessions.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());\r\n\r\n if (limit) {\r\n sessions = sessions.slice(0, limit);\r\n }\r\n\r\n return sessions;\r\n }\r\n\r\n async getSession(userId: string, sessionId: string): Promise<Session | null> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n return userData.sessions.get(sessionId) || null;\r\n }\r\n\r\n async createSession(userId: string): Promise<Session> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n\r\n const session: Session = {\r\n id: uuidv4(),\r\n userId,\r\n startedAt: new Date(),\r\n endedAt: null,\r\n messageCount: 0,\r\n };\r\n\r\n userData.sessions.set(session.id, session);\r\n return session;\r\n }\r\n\r\n async endSession(\r\n userId: string,\r\n sessionId: string,\r\n summary?: string\r\n ): Promise<Session> {\r\n await this.ensureInitialized();\r\n const userData = this.getUserData(userId);\r\n const session = userData.sessions.get(sessionId);\r\n\r\n if (!session) {\r\n throw new Error(`Session not found: ${sessionId}`);\r\n }\r\n\r\n session.endedAt = new Date();\r\n if (summary) {\r\n session.summary = summary;\r\n }\r\n\r\n userData.sessions.set(sessionId, session);\r\n return session;\r\n }\r\n\r\n // =========================================================================\r\n // Utility Methods\r\n // =========================================================================\r\n\r\n /**\r\n * Clear all data for a user (useful for testing)\r\n */\r\n async clearUser(userId: string): Promise<void> {\r\n this.users.delete(userId);\r\n }\r\n\r\n /**\r\n * Clear all data (useful for testing)\r\n */\r\n async clearAll(): Promise<void> {\r\n this.users.clear();\r\n }\r\n\r\n /**\r\n * Export all data for a user (for portability)\r\n */\r\n async exportUser(userId: string): Promise<{\r\n facts: MemoryFact[];\r\n conversations: ConversationExchange[];\r\n sessions: Session[];\r\n }> {\r\n const userData = this.getUserData(userId);\r\n return {\r\n facts: Array.from(userData.facts.values()),\r\n conversations: userData.conversations,\r\n sessions: Array.from(userData.sessions.values()),\r\n };\r\n }\r\n\r\n /**\r\n * Import data for a user\r\n */\r\n async importUser(\r\n userId: string,\r\n data: {\r\n facts: MemoryFact[];\r\n conversations: ConversationExchange[];\r\n sessions: Session[];\r\n }\r\n ): Promise<void> {\r\n const userData = this.getUserData(userId);\r\n\r\n for (const fact of data.facts) {\r\n userData.facts.set(fact.id, fact);\r\n }\r\n\r\n userData.conversations.push(...data.conversations);\r\n\r\n for (const session of data.sessions) {\r\n userData.sessions.set(session.id, session);\r\n }\r\n }\r\n}\r\n","import * as fs from \"fs/promises\";\r\nimport * as path from \"path\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { BaseAdapter } from \"./BaseAdapter\";\r\nimport type {\r\n MemoryFact,\r\n ConversationExchange,\r\n Session,\r\n FactFilter,\r\n} from \"../types\";\r\n\r\ninterface JSONUserData {\r\n facts: MemoryFact[];\r\n conversations: ConversationExchange[];\r\n sessions: Session[];\r\n}\r\n\r\nexport interface JSONFileAdapterConfig {\r\n /** Base path for storing JSON files (default: ./.mem-ts) */\r\n path?: string;\r\n /** Pretty print JSON files (default: true in dev, false in prod) */\r\n prettyPrint?: boolean;\r\n}\r\n\r\n/**\r\n * JSON file-based storage adapter for MVP/single-server deployments.\r\n * Stores each user's data in separate JSON files for portability.\r\n *\r\n * Directory structure:\r\n * .mem-ts/\r\n * ├── users/\r\n * │ ├── {userId}/\r\n * │ │ ├── facts.json\r\n * │ │ ├── conversations.json\r\n * │ │ └── sessions.json\r\n */\r\nexport class JSONFileAdapter extends BaseAdapter {\r\n private basePath: string;\r\n private prettyPrint: boolean;\r\n\r\n constructor(config: JSONFileAdapterConfig = {}) {\r\n super();\r\n this.basePath = config.path || \"./.mem-ts\";\r\n this.prettyPrint =\r\n config.prettyPrint ?? process.env.NODE_ENV !== \"production\";\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n await fs.mkdir(path.join(this.basePath, \"users\"), { recursive: true });\r\n this.initialized = true;\r\n }\r\n\r\n async close(): Promise<void> {\r\n this.initialized = false;\r\n }\r\n\r\n // =========================================================================\r\n // File I/O Helpers\r\n // =========================================================================\r\n\r\n private getUserPath(userId: string): string {\r\n // Sanitize userId to prevent path traversal attacks\r\n const safeUserId = userId.replace(/[^a-zA-Z0-9_-]/g, \"_\");\r\n return path.join(this.basePath, \"users\", safeUserId);\r\n }\r\n\r\n private async ensureUserDir(userId: string): Promise<void> {\r\n await fs.mkdir(this.getUserPath(userId), { recursive: true });\r\n }\r\n\r\n private async readFile<T>(\r\n userId: string,\r\n filename: string,\r\n defaultValue: T\r\n ): Promise<T> {\r\n const filePath = path.join(this.getUserPath(userId), filename);\r\n try {\r\n const data = await fs.readFile(filePath, \"utf-8\");\r\n return JSON.parse(data, this.dateReviver);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return defaultValue;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private async writeFile<T>(\r\n userId: string,\r\n filename: string,\r\n data: T\r\n ): Promise<void> {\r\n await this.ensureUserDir(userId);\r\n const filePath = path.join(this.getUserPath(userId), filename);\r\n const json = this.prettyPrint\r\n ? JSON.stringify(data, null, 2)\r\n : JSON.stringify(data);\r\n await fs.writeFile(filePath, json, \"utf-8\");\r\n }\r\n\r\n // Date reviver for JSON.parse\r\n private dateReviver(_key: string, value: unknown): unknown {\r\n if (typeof value === \"string\") {\r\n // Check if it's an ISO date string\r\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/;\r\n if (dateRegex.test(value)) {\r\n return new Date(value);\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n // =========================================================================\r\n // Fact Operations\r\n // =========================================================================\r\n\r\n async getFacts(userId: string, filter?: FactFilter): Promise<MemoryFact[]> {\r\n await this.ensureInitialized();\r\n let facts = await this.readFile<MemoryFact[]>(userId, \"facts.json\", []);\r\n\r\n // Apply filters\r\n if (filter) {\r\n if (filter.subject) {\r\n facts = facts.filter((f) => f.subject === filter.subject);\r\n }\r\n if (filter.predicate) {\r\n facts = facts.filter((f) => f.predicate === filter.predicate);\r\n }\r\n if (filter.predicates && filter.predicates.length > 0) {\r\n facts = facts.filter((f) => filter.predicates!.includes(f.predicate));\r\n }\r\n if (filter.validOnly !== false) {\r\n facts = facts.filter((f) => f.invalidatedAt === null);\r\n }\r\n\r\n // Sort\r\n if (filter.orderBy) {\r\n facts.sort((a, b) => {\r\n const aVal = a[filter.orderBy!];\r\n const bVal = b[filter.orderBy!];\r\n if (aVal instanceof Date && bVal instanceof Date) {\r\n return filter.orderDir === \"desc\"\r\n ? bVal.getTime() - aVal.getTime()\r\n : aVal.getTime() - bVal.getTime();\r\n }\r\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\r\n return filter.orderDir === \"desc\" ? bVal - aVal : aVal - bVal;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n // Limit\r\n if (filter.limit) {\r\n facts = facts.slice(0, filter.limit);\r\n }\r\n }\r\n\r\n return facts;\r\n }\r\n\r\n async getFactById(\r\n userId: string,\r\n factId: string\r\n ): Promise<MemoryFact | null> {\r\n await this.ensureInitialized();\r\n const facts = await this.readFile<MemoryFact[]>(userId, \"facts.json\", []);\r\n return facts.find((f) => f.id === factId) || null;\r\n }\r\n\r\n async upsertFact(\r\n userId: string,\r\n fact: Omit<MemoryFact, \"id\" | \"createdAt\" | \"updatedAt\">\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n const facts = await this.readFile<MemoryFact[]>(userId, \"facts.json\", []);\r\n\r\n // Check for existing fact with same subject+predicate\r\n const existingIndex = facts.findIndex(\r\n (f) =>\r\n f.subject === fact.subject &&\r\n f.predicate === fact.predicate &&\r\n f.invalidatedAt === null\r\n );\r\n\r\n const now = new Date();\r\n\r\n if (existingIndex >= 0) {\r\n // Update existing\r\n const updated: MemoryFact = {\r\n ...facts[existingIndex],\r\n ...fact,\r\n updatedAt: now,\r\n };\r\n facts[existingIndex] = updated;\r\n await this.writeFile(userId, \"facts.json\", facts);\r\n return updated;\r\n }\r\n\r\n // Create new\r\n const newFact: MemoryFact = {\r\n ...fact,\r\n id: uuidv4(),\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n facts.push(newFact);\r\n await this.writeFile(userId, \"facts.json\", facts);\r\n return newFact;\r\n }\r\n\r\n async updateFact(\r\n userId: string,\r\n factId: string,\r\n updates: Partial<MemoryFact>\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n const facts = await this.readFile<MemoryFact[]>(userId, \"facts.json\", []);\r\n const index = facts.findIndex((f) => f.id === factId);\r\n\r\n if (index === -1) {\r\n throw new Error(`Fact not found: ${factId}`);\r\n }\r\n\r\n const updated: MemoryFact = {\r\n ...facts[index],\r\n ...updates,\r\n id: facts[index].id, // Prevent ID change\r\n updatedAt: new Date(),\r\n };\r\n facts[index] = updated;\r\n await this.writeFile(userId, \"facts.json\", facts);\r\n return updated;\r\n }\r\n\r\n async deleteFact(\r\n userId: string,\r\n factId: string,\r\n _reason?: string\r\n ): Promise<void> {\r\n await this.ensureInitialized();\r\n const facts = await this.readFile<MemoryFact[]>(userId, \"facts.json\", []);\r\n const index = facts.findIndex((f) => f.id === factId);\r\n\r\n if (index >= 0) {\r\n facts[index].invalidatedAt = new Date();\r\n await this.writeFile(userId, \"facts.json\", facts);\r\n }\r\n }\r\n\r\n async hardDeleteFact(userId: string, factId: string): Promise<void> {\r\n await this.ensureInitialized();\r\n const facts = await this.readFile<MemoryFact[]>(userId, \"facts.json\", []);\r\n const filtered = facts.filter((f) => f.id !== factId);\r\n await this.writeFile(userId, \"facts.json\", filtered);\r\n }\r\n\r\n // =========================================================================\r\n // Conversation Operations\r\n // =========================================================================\r\n\r\n async getConversationHistory(\r\n userId: string,\r\n limit?: number,\r\n sessionId?: string\r\n ): Promise<ConversationExchange[]> {\r\n await this.ensureInitialized();\r\n let conversations = await this.readFile<ConversationExchange[]>(\r\n userId,\r\n \"conversations.json\",\r\n []\r\n );\r\n\r\n if (sessionId) {\r\n conversations = conversations.filter((c) => c.sessionId === sessionId);\r\n }\r\n\r\n // Sort by timestamp descending (most recent first)\r\n conversations.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\r\n\r\n if (limit) {\r\n conversations = conversations.slice(0, limit);\r\n }\r\n\r\n return conversations;\r\n }\r\n\r\n async saveConversation(\r\n userId: string,\r\n exchange: Omit<ConversationExchange, \"id\">\r\n ): Promise<ConversationExchange> {\r\n await this.ensureInitialized();\r\n const conversations = await this.readFile<ConversationExchange[]>(\r\n userId,\r\n \"conversations.json\",\r\n []\r\n );\r\n\r\n const newExchange: ConversationExchange = {\r\n ...exchange,\r\n id: uuidv4(),\r\n };\r\n\r\n conversations.push(newExchange);\r\n await this.writeFile(userId, \"conversations.json\", conversations);\r\n\r\n // Update session message count\r\n const sessions = await this.readFile<Session[]>(\r\n userId,\r\n \"sessions.json\",\r\n []\r\n );\r\n const sessionIndex = sessions.findIndex((s) => s.id === exchange.sessionId);\r\n if (sessionIndex >= 0) {\r\n sessions[sessionIndex].messageCount++;\r\n await this.writeFile(userId, \"sessions.json\", sessions);\r\n }\r\n\r\n return newExchange;\r\n }\r\n\r\n // =========================================================================\r\n // Session Operations\r\n // =========================================================================\r\n\r\n async getSessions(userId: string, limit?: number): Promise<Session[]> {\r\n await this.ensureInitialized();\r\n let sessions = await this.readFile<Session[]>(userId, \"sessions.json\", []);\r\n\r\n // Sort by startedAt descending\r\n sessions.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());\r\n\r\n if (limit) {\r\n sessions = sessions.slice(0, limit);\r\n }\r\n\r\n return sessions;\r\n }\r\n\r\n async getSession(userId: string, sessionId: string): Promise<Session | null> {\r\n await this.ensureInitialized();\r\n const sessions = await this.readFile<Session[]>(\r\n userId,\r\n \"sessions.json\",\r\n []\r\n );\r\n return sessions.find((s) => s.id === sessionId) || null;\r\n }\r\n\r\n async createSession(userId: string): Promise<Session> {\r\n await this.ensureInitialized();\r\n const sessions = await this.readFile<Session[]>(\r\n userId,\r\n \"sessions.json\",\r\n []\r\n );\r\n\r\n const session: Session = {\r\n id: uuidv4(),\r\n userId,\r\n startedAt: new Date(),\r\n endedAt: null,\r\n messageCount: 0,\r\n };\r\n\r\n sessions.push(session);\r\n await this.writeFile(userId, \"sessions.json\", sessions);\r\n return session;\r\n }\r\n\r\n async endSession(\r\n userId: string,\r\n sessionId: string,\r\n summary?: string\r\n ): Promise<Session> {\r\n await this.ensureInitialized();\r\n const sessions = await this.readFile<Session[]>(\r\n userId,\r\n \"sessions.json\",\r\n []\r\n );\r\n const index = sessions.findIndex((s) => s.id === sessionId);\r\n\r\n if (index === -1) {\r\n throw new Error(`Session not found: ${sessionId}`);\r\n }\r\n\r\n sessions[index].endedAt = new Date();\r\n if (summary) {\r\n sessions[index].summary = summary;\r\n }\r\n\r\n await this.writeFile(userId, \"sessions.json\", sessions);\r\n return sessions[index];\r\n }\r\n\r\n // =========================================================================\r\n // Utility Methods\r\n // =========================================================================\r\n\r\n /**\r\n * Export all data for a user (for portability)\r\n */\r\n async exportUser(userId: string): Promise<JSONUserData> {\r\n return {\r\n facts: await this.readFile<MemoryFact[]>(userId, \"facts.json\", []),\r\n conversations: await this.readFile<ConversationExchange[]>(\r\n userId,\r\n \"conversations.json\",\r\n []\r\n ),\r\n sessions: await this.readFile<Session[]>(userId, \"sessions.json\", []),\r\n };\r\n }\r\n\r\n /**\r\n * Import data for a user\r\n */\r\n async importUser(userId: string, data: JSONUserData): Promise<void> {\r\n await this.writeFile(userId, \"facts.json\", data.facts);\r\n await this.writeFile(userId, \"conversations.json\", data.conversations);\r\n await this.writeFile(userId, \"sessions.json\", data.sessions);\r\n }\r\n\r\n /**\r\n * Delete all data for a user\r\n */\r\n async deleteUser(userId: string): Promise<void> {\r\n const userPath = this.getUserPath(userId);\r\n await fs.rm(userPath, { recursive: true, force: true });\r\n }\r\n}\r\n","import { BaseAdapter } from \"./BaseAdapter\";\r\nimport type {\r\n MemoryFact,\r\n ConversationExchange,\r\n Session,\r\n FactFilter,\r\n} from \"../types\";\r\n\r\n/**\r\n * Configuration for MongoDB adapter\r\n */\r\nexport interface MongoDBAdapterConfig {\r\n /** MongoDB connection URI */\r\n uri: string;\r\n /** Database name */\r\n database?: string;\r\n /** Collection prefix (default: 'memts_') */\r\n collectionPrefix?: string;\r\n}\r\n\r\n/**\r\n * MongoDB storage adapter for production deployments.\r\n * Requires: npm install mongodb\r\n *\r\n * Collections created:\r\n * - memts_facts: User facts (knowledge graph)\r\n * - memts_conversations: Conversation history\r\n * - memts_sessions: Session metadata\r\n */\r\nexport class MongoDBAdapter extends BaseAdapter {\r\n private config: MongoDBAdapterConfig;\r\n private client: unknown;\r\n private db: unknown;\r\n private collectionPrefix: string;\r\n\r\n constructor(config: MongoDBAdapterConfig) {\r\n super();\r\n this.config = config;\r\n this.collectionPrefix = config.collectionPrefix || \"memts_\";\r\n }\r\n\r\n private async getClient(): Promise<unknown> {\r\n if (this.client) return this.client;\r\n\r\n try {\r\n // @ts-ignore - mongodb is an optional peer dependency\r\n const { MongoClient } = await import(\"mongodb\");\r\n this.client = new MongoClient(this.config.uri);\r\n await (this.client as { connect: () => Promise<void> }).connect();\r\n return this.client;\r\n } catch {\r\n throw new Error(\"MongoDB driver not installed. Run: npm install mongodb\");\r\n }\r\n }\r\n\r\n private getCollection(name: string): unknown {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return (this.db as any).collection(`${this.collectionPrefix}${name}`);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n const client = await this.getClient();\r\n const dbName = this.config.database || \"memts\";\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.db = (client as any).db(dbName);\r\n\r\n // Create indexes for efficient queries\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const facts = this.getCollection(\"facts\") as any;\r\n await facts.createIndex({ userId: 1, subject: 1, predicate: 1 });\r\n await facts.createIndex({ userId: 1, invalidatedAt: 1 });\r\n await facts.createIndex({ userId: 1, updatedAt: -1 });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const conversations = this.getCollection(\"conversations\") as any;\r\n await conversations.createIndex({ userId: 1, sessionId: 1 });\r\n await conversations.createIndex({ userId: 1, timestamp: -1 });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const sessions = this.getCollection(\"sessions\") as any;\r\n await sessions.createIndex({ userId: 1, startedAt: -1 });\r\n\r\n this.initialized = true;\r\n }\r\n\r\n async close(): Promise<void> {\r\n if (this.client) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n await (this.client as any).close();\r\n this.client = undefined;\r\n this.db = undefined;\r\n }\r\n this.initialized = false;\r\n }\r\n\r\n // =========================================================================\r\n // Fact Operations\r\n // =========================================================================\r\n\r\n async getFacts(userId: string, filter?: FactFilter): Promise<MemoryFact[]> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"facts\") as any;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const query: any = { userId };\r\n\r\n if (filter?.subject) query.subject = filter.subject;\r\n if (filter?.predicate) query.predicate = filter.predicate;\r\n if (filter?.predicates?.length) {\r\n query.predicate = { $in: filter.predicates };\r\n }\r\n if (filter?.validOnly !== false) {\r\n query.invalidatedAt = null;\r\n }\r\n\r\n let cursor = collection.find(query);\r\n\r\n if (filter?.orderBy) {\r\n const dir = filter.orderDir === \"asc\" ? 1 : -1;\r\n cursor = cursor.sort({ [filter.orderBy]: dir });\r\n }\r\n\r\n if (filter?.limit) {\r\n cursor = cursor.limit(filter.limit);\r\n }\r\n\r\n const docs = await cursor.toArray();\r\n return docs.map(this.docToFact);\r\n }\r\n\r\n async getFactById(\r\n userId: string,\r\n factId: string\r\n ): Promise<MemoryFact | null> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"facts\") as any;\r\n const doc = await collection.findOne({ userId, id: factId });\r\n return doc ? this.docToFact(doc) : null;\r\n }\r\n\r\n async upsertFact(\r\n userId: string,\r\n fact: Omit<MemoryFact, \"id\" | \"createdAt\" | \"updatedAt\">\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"facts\") as any;\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n const now = new Date();\r\n\r\n // Try to find existing fact\r\n const existing = await collection.findOne({\r\n userId,\r\n subject: fact.subject,\r\n predicate: fact.predicate,\r\n invalidatedAt: null,\r\n });\r\n\r\n if (existing) {\r\n // Update existing\r\n await collection.updateOne(\r\n { _id: existing._id },\r\n {\r\n $set: {\r\n object: fact.object,\r\n confidence: fact.confidence,\r\n source: fact.source,\r\n updatedAt: now,\r\n metadata: fact.metadata,\r\n },\r\n }\r\n );\r\n return this.docToFact({\r\n ...existing,\r\n object: fact.object,\r\n updatedAt: now,\r\n });\r\n }\r\n\r\n // Create new\r\n const newFact = {\r\n id: uuidv4(),\r\n userId,\r\n ...fact,\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n\r\n await collection.insertOne(newFact);\r\n return this.docToFact(newFact);\r\n }\r\n\r\n async updateFact(\r\n userId: string,\r\n factId: string,\r\n updates: Partial<MemoryFact>\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"facts\") as any;\r\n\r\n const result = await collection.findOneAndUpdate(\r\n { userId, id: factId },\r\n {\r\n $set: {\r\n ...updates,\r\n updatedAt: new Date(),\r\n },\r\n },\r\n { returnDocument: \"after\" }\r\n );\r\n\r\n if (!result) {\r\n throw new Error(`Fact not found: ${factId}`);\r\n }\r\n\r\n return this.docToFact(result);\r\n }\r\n\r\n async deleteFact(\r\n userId: string,\r\n factId: string,\r\n _reason?: string\r\n ): Promise<void> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"facts\") as any;\r\n\r\n await collection.updateOne(\r\n { userId, id: factId },\r\n { $set: { invalidatedAt: new Date() } }\r\n );\r\n }\r\n\r\n async hardDeleteFact(userId: string, factId: string): Promise<void> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"facts\") as any;\r\n await collection.deleteOne({ userId, id: factId });\r\n }\r\n\r\n // =========================================================================\r\n // Conversation Operations\r\n // =========================================================================\r\n\r\n async getConversationHistory(\r\n userId: string,\r\n limit?: number,\r\n sessionId?: string\r\n ): Promise<ConversationExchange[]> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"conversations\") as any;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const query: any = { userId };\r\n if (sessionId) query.sessionId = sessionId;\r\n\r\n let cursor = collection.find(query).sort({ timestamp: -1 });\r\n\r\n if (limit) {\r\n cursor = cursor.limit(limit);\r\n }\r\n\r\n const docs = await cursor.toArray();\r\n return docs.map(this.docToConversation);\r\n }\r\n\r\n async saveConversation(\r\n userId: string,\r\n exchange: Omit<ConversationExchange, \"id\">\r\n ): Promise<ConversationExchange> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"conversations\") as any;\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n const newExchange = {\r\n id: uuidv4(),\r\n ...exchange,\r\n };\r\n\r\n await collection.insertOne(newExchange);\r\n\r\n // Update session message count\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const sessionsCollection = this.getCollection(\"sessions\") as any;\r\n await sessionsCollection.updateOne(\r\n { userId, id: exchange.sessionId },\r\n { $inc: { messageCount: 1 } }\r\n );\r\n\r\n return this.docToConversation(newExchange);\r\n }\r\n\r\n // =========================================================================\r\n // Session Operations\r\n // =========================================================================\r\n\r\n async getSessions(userId: string, limit?: number): Promise<Session[]> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"sessions\") as any;\r\n\r\n let cursor = collection.find({ userId }).sort({ startedAt: -1 });\r\n\r\n if (limit) {\r\n cursor = cursor.limit(limit);\r\n }\r\n\r\n const docs = await cursor.toArray();\r\n return docs.map(this.docToSession);\r\n }\r\n\r\n async getSession(userId: string, sessionId: string): Promise<Session | null> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"sessions\") as any;\r\n const doc = await collection.findOne({ userId, id: sessionId });\r\n return doc ? this.docToSession(doc) : null;\r\n }\r\n\r\n async createSession(userId: string): Promise<Session> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"sessions\") as any;\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n const session = {\r\n id: uuidv4(),\r\n userId,\r\n startedAt: new Date(),\r\n endedAt: null,\r\n messageCount: 0,\r\n };\r\n\r\n await collection.insertOne(session);\r\n return this.docToSession(session);\r\n }\r\n\r\n async endSession(\r\n userId: string,\r\n sessionId: string,\r\n summary?: string\r\n ): Promise<Session> {\r\n await this.ensureInitialized();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const collection = this.getCollection(\"sessions\") as any;\r\n\r\n const result = await collection.findOneAndUpdate(\r\n { userId, id: sessionId },\r\n {\r\n $set: {\r\n endedAt: new Date(),\r\n ...(summary && { summary }),\r\n },\r\n },\r\n { returnDocument: \"after\" }\r\n );\r\n\r\n if (!result) {\r\n throw new Error(`Session not found: ${sessionId}`);\r\n }\r\n\r\n return this.docToSession(result);\r\n }\r\n\r\n // =========================================================================\r\n // Helper Methods\r\n // =========================================================================\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private docToFact(doc: any): MemoryFact {\r\n return {\r\n id: doc.id,\r\n subject: doc.subject,\r\n predicate: doc.predicate,\r\n object: doc.object,\r\n confidence: doc.confidence,\r\n importance: doc.importance ?? 5,\r\n source: doc.source,\r\n sourceConversationId: doc.sourceConversationId,\r\n createdAt: new Date(doc.createdAt),\r\n updatedAt: new Date(doc.updatedAt),\r\n invalidatedAt: doc.invalidatedAt ? new Date(doc.invalidatedAt) : null,\r\n accessCount: doc.accessCount ?? 0,\r\n lastAccessedAt: doc.lastAccessedAt\r\n ? new Date(doc.lastAccessedAt)\r\n : undefined,\r\n metadata: doc.metadata,\r\n };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private docToConversation(doc: any): ConversationExchange {\r\n return {\r\n id: doc.id,\r\n userId: doc.userId,\r\n sessionId: doc.sessionId,\r\n userMessage: doc.userMessage,\r\n assistantResponse: doc.assistantResponse,\r\n timestamp: new Date(doc.timestamp),\r\n metadata: doc.metadata,\r\n };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private docToSession(doc: any): Session {\r\n return {\r\n id: doc.id,\r\n userId: doc.userId,\r\n startedAt: new Date(doc.startedAt),\r\n endedAt: doc.endedAt ? new Date(doc.endedAt) : null,\r\n messageCount: doc.messageCount,\r\n summary: doc.summary,\r\n };\r\n }\r\n}\r\n","import { BaseAdapter } from \"./BaseAdapter\";\r\nimport type {\r\n MemoryFact,\r\n ConversationExchange,\r\n Session,\r\n FactFilter,\r\n} from \"../types\";\r\n\r\n/**\r\n * Configuration for PostgreSQL adapter\r\n */\r\nexport interface PostgresAdapterConfig {\r\n /** PostgreSQL connection string */\r\n connectionString: string;\r\n /** Schema name (default: 'memts') */\r\n schema?: string;\r\n /** Enable pgvector for semantic search (requires pgvector extension) */\r\n enableVector?: boolean;\r\n}\r\n\r\n/**\r\n * PostgreSQL storage adapter for production deployments.\r\n * Requires: npm install pg\r\n *\r\n * Tables created:\r\n * - memts.facts: User facts (knowledge graph)\r\n * - memts.conversations: Conversation history\r\n * - memts.sessions: Session metadata\r\n */\r\nexport class PostgresAdapter extends BaseAdapter {\r\n private config: PostgresAdapterConfig;\r\n private pool: unknown;\r\n private schema: string;\r\n\r\n constructor(config: PostgresAdapterConfig) {\r\n super();\r\n this.config = config;\r\n this.schema = config.schema || \"memts\";\r\n }\r\n\r\n private async getPool(): Promise<unknown> {\r\n if (this.pool) return this.pool;\r\n\r\n try {\r\n // @ts-ignore - pg is an optional peer dependency\r\n const { Pool } = await import(\"pg\");\r\n this.pool = new Pool({\r\n connectionString: this.config.connectionString,\r\n });\r\n return this.pool;\r\n } catch {\r\n throw new Error(\"PostgreSQL driver not installed. Run: npm install pg\");\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private async query(sql: string, params?: unknown[]): Promise<any> {\r\n const pool = await this.getPool();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return (pool as any).query(sql, params);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n await this.getPool();\r\n\r\n // Create schema\r\n await this.query(`CREATE SCHEMA IF NOT EXISTS ${this.schema}`);\r\n\r\n // Create facts table\r\n await this.query(`\r\n CREATE TABLE IF NOT EXISTS ${this.schema}.facts (\r\n id UUID PRIMARY KEY,\r\n user_id VARCHAR(255) NOT NULL,\r\n subject VARCHAR(255) NOT NULL,\r\n predicate VARCHAR(255) NOT NULL,\r\n object TEXT NOT NULL,\r\n confidence REAL DEFAULT 0.8,\r\n source VARCHAR(255),\r\n created_at TIMESTAMPTZ DEFAULT NOW(),\r\n updated_at TIMESTAMPTZ DEFAULT NOW(),\r\n invalidated_at TIMESTAMPTZ,\r\n metadata JSONB\r\n )\r\n `);\r\n\r\n // Create indexes for facts\r\n await this.query(`\r\n CREATE INDEX IF NOT EXISTS idx_facts_user_subject_predicate \r\n ON ${this.schema}.facts (user_id, subject, predicate)\r\n `);\r\n await this.query(`\r\n CREATE INDEX IF NOT EXISTS idx_facts_user_valid \r\n ON ${this.schema}.facts (user_id, invalidated_at)\r\n `);\r\n\r\n // Create conversations table\r\n await this.query(`\r\n CREATE TABLE IF NOT EXISTS ${this.schema}.conversations (\r\n id UUID PRIMARY KEY,\r\n user_id VARCHAR(255) NOT NULL,\r\n session_id VARCHAR(255) NOT NULL,\r\n user_message TEXT NOT NULL,\r\n assistant_response TEXT NOT NULL,\r\n timestamp TIMESTAMPTZ DEFAULT NOW(),\r\n metadata JSONB\r\n )\r\n `);\r\n\r\n await this.query(`\r\n CREATE INDEX IF NOT EXISTS idx_conversations_user_session \r\n ON ${this.schema}.conversations (user_id, session_id)\r\n `);\r\n\r\n // Create sessions table\r\n await this.query(`\r\n CREATE TABLE IF NOT EXISTS ${this.schema}.sessions (\r\n id UUID PRIMARY KEY,\r\n user_id VARCHAR(255) NOT NULL,\r\n started_at TIMESTAMPTZ DEFAULT NOW(),\r\n ended_at TIMESTAMPTZ,\r\n message_count INTEGER DEFAULT 0,\r\n summary TEXT\r\n )\r\n `);\r\n\r\n await this.query(`\r\n CREATE INDEX IF NOT EXISTS idx_sessions_user \r\n ON ${this.schema}.sessions (user_id, started_at DESC)\r\n `);\r\n\r\n this.initialized = true;\r\n }\r\n\r\n async close(): Promise<void> {\r\n if (this.pool) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n await (this.pool as any).end();\r\n this.pool = undefined;\r\n }\r\n this.initialized = false;\r\n }\r\n\r\n // =========================================================================\r\n // Fact Operations\r\n // =========================================================================\r\n\r\n async getFacts(userId: string, filter?: FactFilter): Promise<MemoryFact[]> {\r\n await this.ensureInitialized();\r\n\r\n let sql = `SELECT * FROM ${this.schema}.facts WHERE user_id = $1`;\r\n const params: unknown[] = [userId];\r\n let paramIndex = 2;\r\n\r\n if (filter?.subject) {\r\n sql += ` AND subject = $${paramIndex++}`;\r\n params.push(filter.subject);\r\n }\r\n\r\n if (filter?.predicate) {\r\n sql += ` AND predicate = $${paramIndex++}`;\r\n params.push(filter.predicate);\r\n }\r\n\r\n if (filter?.predicates?.length) {\r\n const placeholders = filter.predicates\r\n .map((_, i) => `$${paramIndex + i}`)\r\n .join(\", \");\r\n sql += ` AND predicate IN (${placeholders})`;\r\n params.push(...filter.predicates);\r\n paramIndex += filter.predicates.length;\r\n }\r\n\r\n if (filter?.validOnly !== false) {\r\n sql += ` AND invalidated_at IS NULL`;\r\n }\r\n\r\n if (filter?.orderBy) {\r\n const column = this.camelToSnake(filter.orderBy);\r\n const dir = filter.orderDir === \"asc\" ? \"ASC\" : \"DESC\";\r\n sql += ` ORDER BY ${column} ${dir}`;\r\n }\r\n\r\n if (filter?.limit) {\r\n sql += ` LIMIT $${paramIndex}`;\r\n params.push(filter.limit);\r\n }\r\n\r\n const result = await this.query(sql, params);\r\n return result.rows.map(this.rowToFact.bind(this));\r\n }\r\n\r\n async getFactById(\r\n userId: string,\r\n factId: string\r\n ): Promise<MemoryFact | null> {\r\n await this.ensureInitialized();\r\n const result = await this.query(\r\n `SELECT * FROM ${this.schema}.facts WHERE user_id = $1 AND id = $2`,\r\n [userId, factId]\r\n );\r\n return result.rows[0] ? this.rowToFact(result.rows[0]) : null;\r\n }\r\n\r\n async upsertFact(\r\n userId: string,\r\n fact: Omit<MemoryFact, \"id\" | \"createdAt\" | \"updatedAt\">\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n // Check for existing\r\n const existing = await this.query(\r\n `SELECT id FROM ${this.schema}.facts \r\n WHERE user_id = $1 AND subject = $2 AND predicate = $3 AND invalidated_at IS NULL`,\r\n [userId, fact.subject, fact.predicate]\r\n );\r\n\r\n if (existing.rows[0]) {\r\n // Update existing\r\n const result = await this.query(\r\n `UPDATE ${this.schema}.facts \r\n SET object = $1, confidence = $2, source = $3, updated_at = NOW(), metadata = $4\r\n WHERE id = $5 RETURNING *`,\r\n [\r\n fact.object,\r\n fact.confidence,\r\n fact.source,\r\n fact.metadata || null,\r\n existing.rows[0].id,\r\n ]\r\n );\r\n return this.rowToFact(result.rows[0]);\r\n }\r\n\r\n // Insert new\r\n const id = uuidv4();\r\n const result = await this.query(\r\n `INSERT INTO ${this.schema}.facts \r\n (id, user_id, subject, predicate, object, confidence, source, invalidated_at, metadata)\r\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *`,\r\n [\r\n id,\r\n userId,\r\n fact.subject,\r\n fact.predicate,\r\n fact.object,\r\n fact.confidence,\r\n fact.source,\r\n null,\r\n fact.metadata || null,\r\n ]\r\n );\r\n return this.rowToFact(result.rows[0]);\r\n }\r\n\r\n async updateFact(\r\n userId: string,\r\n factId: string,\r\n updates: Partial<MemoryFact>\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n\r\n const setClauses: string[] = [\"updated_at = NOW()\"];\r\n const params: unknown[] = [];\r\n let paramIndex = 1;\r\n\r\n if (updates.object !== undefined) {\r\n setClauses.push(`object = $${paramIndex++}`);\r\n params.push(updates.object);\r\n }\r\n if (updates.confidence !== undefined) {\r\n setClauses.push(`confidence = $${paramIndex++}`);\r\n params.push(updates.confidence);\r\n }\r\n if (updates.metadata !== undefined) {\r\n setClauses.push(`metadata = $${paramIndex++}`);\r\n params.push(updates.metadata);\r\n }\r\n\r\n params.push(userId, factId);\r\n\r\n const result = await this.query(\r\n `UPDATE ${this.schema}.facts SET ${setClauses.join(\", \")} \r\n WHERE user_id = $${paramIndex++} AND id = $${paramIndex} RETURNING *`,\r\n params\r\n );\r\n\r\n if (!result.rows[0]) {\r\n throw new Error(`Fact not found: ${factId}`);\r\n }\r\n\r\n return this.rowToFact(result.rows[0]);\r\n }\r\n\r\n async deleteFact(\r\n userId: string,\r\n factId: string,\r\n _reason?: string\r\n ): Promise<void> {\r\n await this.ensureInitialized();\r\n await this.query(\r\n `UPDATE ${this.schema}.facts SET invalidated_at = NOW() WHERE user_id = $1 AND id = $2`,\r\n [userId, factId]\r\n );\r\n }\r\n\r\n async hardDeleteFact(userId: string, factId: string): Promise<void> {\r\n await this.ensureInitialized();\r\n await this.query(\r\n `DELETE FROM ${this.schema}.facts WHERE user_id = $1 AND id = $2`,\r\n [userId, factId]\r\n );\r\n }\r\n\r\n // =========================================================================\r\n // Conversation Operations\r\n // =========================================================================\r\n\r\n async getConversationHistory(\r\n userId: string,\r\n limit?: number,\r\n sessionId?: string\r\n ): Promise<ConversationExchange[]> {\r\n await this.ensureInitialized();\r\n\r\n let sql = `SELECT * FROM ${this.schema}.conversations WHERE user_id = $1`;\r\n const params: unknown[] = [userId];\r\n\r\n if (sessionId) {\r\n sql += ` AND session_id = $2`;\r\n params.push(sessionId);\r\n }\r\n\r\n sql += ` ORDER BY timestamp DESC`;\r\n\r\n if (limit) {\r\n sql += ` LIMIT $${params.length + 1}`;\r\n params.push(limit);\r\n }\r\n\r\n const result = await this.query(sql, params);\r\n return result.rows.map(this.rowToConversation.bind(this));\r\n }\r\n\r\n async saveConversation(\r\n userId: string,\r\n exchange: Omit<ConversationExchange, \"id\">\r\n ): Promise<ConversationExchange> {\r\n await this.ensureInitialized();\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n const id = uuidv4();\r\n const result = await this.query(\r\n `INSERT INTO ${this.schema}.conversations \r\n (id, user_id, session_id, user_message, assistant_response, timestamp, metadata)\r\n VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *`,\r\n [\r\n id,\r\n userId,\r\n exchange.sessionId,\r\n exchange.userMessage,\r\n exchange.assistantResponse,\r\n exchange.timestamp,\r\n exchange.metadata || null,\r\n ]\r\n );\r\n\r\n // Update session message count\r\n await this.query(\r\n `UPDATE ${this.schema}.sessions SET message_count = message_count + 1 WHERE id = $1`,\r\n [exchange.sessionId]\r\n );\r\n\r\n return this.rowToConversation(result.rows[0]);\r\n }\r\n\r\n // =========================================================================\r\n // Session Operations\r\n // =========================================================================\r\n\r\n async getSessions(userId: string, limit?: number): Promise<Session[]> {\r\n await this.ensureInitialized();\r\n\r\n let sql = `SELECT * FROM ${this.schema}.sessions WHERE user_id = $1 ORDER BY started_at DESC`;\r\n const params: unknown[] = [userId];\r\n\r\n if (limit) {\r\n sql += ` LIMIT $2`;\r\n params.push(limit);\r\n }\r\n\r\n const result = await this.query(sql, params);\r\n return result.rows.map(this.rowToSession.bind(this));\r\n }\r\n\r\n async getSession(userId: string, sessionId: string): Promise<Session | null> {\r\n await this.ensureInitialized();\r\n const result = await this.query(\r\n `SELECT * FROM ${this.schema}.sessions WHERE user_id = $1 AND id = $2`,\r\n [userId, sessionId]\r\n );\r\n return result.rows[0] ? this.rowToSession(result.rows[0]) : null;\r\n }\r\n\r\n async createSession(userId: string): Promise<Session> {\r\n await this.ensureInitialized();\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n const id = uuidv4();\r\n const result = await this.query(\r\n `INSERT INTO ${this.schema}.sessions (id, user_id) VALUES ($1, $2) RETURNING *`,\r\n [id, userId]\r\n );\r\n return this.rowToSession(result.rows[0]);\r\n }\r\n\r\n async endSession(\r\n userId: string,\r\n sessionId: string,\r\n summary?: string\r\n ): Promise<Session> {\r\n await this.ensureInitialized();\r\n\r\n const result = await this.query(\r\n `UPDATE ${this.schema}.sessions \r\n SET ended_at = NOW(), summary = COALESCE($1, summary)\r\n WHERE user_id = $2 AND id = $3 RETURNING *`,\r\n [summary || null, userId, sessionId]\r\n );\r\n\r\n if (!result.rows[0]) {\r\n throw new Error(`Session not found: ${sessionId}`);\r\n }\r\n\r\n return this.rowToSession(result.rows[0]);\r\n }\r\n\r\n // =========================================================================\r\n // Helper Methods\r\n // =========================================================================\r\n\r\n private camelToSnake(str: string): string {\r\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private rowToFact(row: any): MemoryFact {\r\n return {\r\n id: row.id,\r\n subject: row.subject,\r\n predicate: row.predicate,\r\n object: row.object,\r\n confidence: row.confidence,\r\n importance: row.importance ?? 5,\r\n source: row.source,\r\n sourceConversationId: row.source_conversation_id,\r\n createdAt: new Date(row.created_at),\r\n updatedAt: new Date(row.updated_at),\r\n invalidatedAt: row.invalidated_at ? new Date(row.invalidated_at) : null,\r\n accessCount: row.access_count ?? 0,\r\n lastAccessedAt: row.last_accessed_at\r\n ? new Date(row.last_accessed_at)\r\n : undefined,\r\n metadata: row.metadata,\r\n };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private rowToConversation(row: any): ConversationExchange {\r\n return {\r\n id: row.id,\r\n userId: row.user_id,\r\n sessionId: row.session_id,\r\n userMessage: row.user_message,\r\n assistantResponse: row.assistant_response,\r\n timestamp: new Date(row.timestamp),\r\n metadata: row.metadata,\r\n };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private rowToSession(row: any): Session {\r\n return {\r\n id: row.id,\r\n userId: row.user_id,\r\n startedAt: new Date(row.started_at),\r\n endedAt: row.ended_at ? new Date(row.ended_at) : null,\r\n messageCount: row.message_count,\r\n summary: row.summary,\r\n };\r\n }\r\n}\r\n","import { BaseAdapter } from \"./BaseAdapter\";\r\nimport type {\r\n MemoryFact,\r\n ConversationExchange,\r\n Session,\r\n FactFilter,\r\n} from \"../types\";\r\n\r\n/**\r\n * Configuration for Upstash Redis adapter\r\n */\r\nexport interface UpstashRedisAdapterConfig {\r\n /** Upstash Redis REST URL */\r\n url: string;\r\n /** Upstash Redis REST Token */\r\n token: string;\r\n /** Key prefix (default: 'memts:') */\r\n prefix?: string;\r\n /** TTL for hot cache entries in seconds (default: 3600) */\r\n cacheTtl?: number;\r\n}\r\n\r\n/**\r\n * Upstash Redis adapter for serverless hot cache layer.\r\n * Uses the Upstash REST API - no Redis connection needed.\r\n *\r\n * Key structure:\r\n * - memts:{userId}:facts - Hash of facts\r\n * - memts:{userId}:conversations - List of conversations\r\n * - memts:{userId}:sessions - Hash of sessions\r\n */\r\nexport class UpstashRedisAdapter extends BaseAdapter {\r\n private config: UpstashRedisAdapterConfig;\r\n private prefix: string;\r\n private defaultTtl: number;\r\n\r\n constructor(config: UpstashRedisAdapterConfig) {\r\n super();\r\n this.config = config;\r\n this.prefix = config.prefix || \"memts:\";\r\n this.defaultTtl = config.cacheTtl || 3600;\r\n }\r\n\r\n private async redis<T>(command: string[]): Promise<T> {\r\n const response = await fetch(this.config.url, {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${this.config.token}`,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(command),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Upstash Redis error: ${response.statusText}`);\r\n }\r\n\r\n const data = (await response.json()) as { result: T };\r\n return data.result;\r\n }\r\n\r\n private key(userId: string, type: string): string {\r\n return `${this.prefix}${userId}:${type}`;\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n // Test connection\r\n await this.redis([\"PING\"]);\r\n this.initialized = true;\r\n }\r\n\r\n async close(): Promise<void> {\r\n this.initialized = false;\r\n }\r\n\r\n // =========================================================================\r\n // Fact Operations\r\n // =========================================================================\r\n\r\n async getFacts(userId: string, filter?: FactFilter): Promise<MemoryFact[]> {\r\n await this.ensureInitialized();\r\n\r\n const data = await this.redis<string[] | Record<string, string>>([\r\n \"HGETALL\",\r\n this.key(userId, \"facts\"),\r\n ]);\r\n\r\n if (!data) return [];\r\n\r\n // Upstash returns HGETALL as array [key1, val1, key2, val2, ...]\r\n // Convert to object if it's an array\r\n let dataObj: Record<string, string>;\r\n if (Array.isArray(data)) {\r\n dataObj = {};\r\n for (let i = 0; i < data.length; i += 2) {\r\n if (data[i + 1]) {\r\n dataObj[data[i]] = data[i + 1];\r\n }\r\n }\r\n } else if (typeof data === \"object\") {\r\n dataObj = data;\r\n } else {\r\n return [];\r\n }\r\n\r\n let facts: MemoryFact[] = Object.values(dataObj)\r\n .filter((v) => typeof v === \"string\")\r\n .map((v) => JSON.parse(v) as MemoryFact)\r\n .map((f) => ({\r\n ...f,\r\n createdAt: new Date(f.createdAt),\r\n updatedAt: new Date(f.updatedAt),\r\n invalidatedAt: f.invalidatedAt ? new Date(f.invalidatedAt) : null,\r\n }));\r\n\r\n // Apply filters\r\n if (filter) {\r\n if (filter.subject) {\r\n facts = facts.filter((f) => f.subject === filter.subject);\r\n }\r\n if (filter.predicate) {\r\n facts = facts.filter((f) => f.predicate === filter.predicate);\r\n }\r\n if (filter.predicates?.length) {\r\n facts = facts.filter((f) => filter.predicates!.includes(f.predicate));\r\n }\r\n if (filter.validOnly !== false) {\r\n facts = facts.filter((f) => f.invalidatedAt === null);\r\n }\r\n if (filter.orderBy) {\r\n facts.sort((a, b) => {\r\n const aVal = a[filter.orderBy!];\r\n const bVal = b[filter.orderBy!];\r\n if (aVal instanceof Date && bVal instanceof Date) {\r\n return filter.orderDir === \"desc\"\r\n ? bVal.getTime() - aVal.getTime()\r\n : aVal.getTime() - bVal.getTime();\r\n }\r\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\r\n return filter.orderDir === \"desc\" ? bVal - aVal : aVal - bVal;\r\n }\r\n return 0;\r\n });\r\n }\r\n if (filter.limit) {\r\n facts = facts.slice(0, filter.limit);\r\n }\r\n }\r\n\r\n return facts;\r\n }\r\n\r\n async getFactById(\r\n userId: string,\r\n factId: string\r\n ): Promise<MemoryFact | null> {\r\n await this.ensureInitialized();\r\n\r\n const data = await this.redis<string | null>([\r\n \"HGET\",\r\n this.key(userId, \"facts\"),\r\n factId,\r\n ]);\r\n\r\n if (!data) return null;\r\n\r\n const fact = JSON.parse(data) as MemoryFact;\r\n return {\r\n ...fact,\r\n createdAt: new Date(fact.createdAt),\r\n updatedAt: new Date(fact.updatedAt),\r\n invalidatedAt: fact.invalidatedAt ? new Date(fact.invalidatedAt) : null,\r\n };\r\n }\r\n\r\n async upsertFact(\r\n userId: string,\r\n fact: Omit<MemoryFact, \"id\" | \"createdAt\" | \"updatedAt\">\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n // Check for existing fact\r\n const existingFacts = await this.getFacts(userId, {\r\n subject: fact.subject,\r\n predicate: fact.predicate,\r\n validOnly: true,\r\n });\r\n\r\n const now = new Date();\r\n\r\n if (existingFacts.length > 0) {\r\n // Update existing\r\n const existing = existingFacts[0];\r\n const updated: MemoryFact = {\r\n ...existing,\r\n ...fact,\r\n updatedAt: now,\r\n };\r\n await this.redis([\r\n \"HSET\",\r\n this.key(userId, \"facts\"),\r\n existing.id,\r\n JSON.stringify(updated),\r\n ]);\r\n return updated;\r\n }\r\n\r\n // Create new\r\n const newFact: MemoryFact = {\r\n ...fact,\r\n id: uuidv4(),\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n\r\n await this.redis([\r\n \"HSET\",\r\n this.key(userId, \"facts\"),\r\n newFact.id,\r\n JSON.stringify(newFact),\r\n ]);\r\n return newFact;\r\n }\r\n\r\n async updateFact(\r\n userId: string,\r\n factId: string,\r\n updates: Partial<MemoryFact>\r\n ): Promise<MemoryFact> {\r\n await this.ensureInitialized();\r\n\r\n const existing = await this.getFactById(userId, factId);\r\n if (!existing) {\r\n throw new Error(`Fact not found: ${factId}`);\r\n }\r\n\r\n const updated: MemoryFact = {\r\n ...existing,\r\n ...updates,\r\n id: existing.id,\r\n updatedAt: new Date(),\r\n };\r\n\r\n await this.redis([\r\n \"HSET\",\r\n this.key(userId, \"facts\"),\r\n factId,\r\n JSON.stringify(updated),\r\n ]);\r\n return updated;\r\n }\r\n\r\n async deleteFact(\r\n userId: string,\r\n factId: string,\r\n _reason?: string\r\n ): Promise<void> {\r\n await this.ensureInitialized();\r\n\r\n const existing = await this.getFactById(userId, factId);\r\n if (existing) {\r\n existing.invalidatedAt = new Date();\r\n await this.redis([\r\n \"HSET\",\r\n this.key(userId, \"facts\"),\r\n factId,\r\n JSON.stringify(existing),\r\n ]);\r\n }\r\n }\r\n\r\n async hardDeleteFact(userId: string, factId: string): Promise<void> {\r\n await this.ensureInitialized();\r\n await this.redis([\"HDEL\", this.key(userId, \"facts\"), factId]);\r\n }\r\n\r\n // =========================================================================\r\n // Conversation Operations\r\n // =========================================================================\r\n\r\n async getConversationHistory(\r\n userId: string,\r\n limit?: number,\r\n sessionId?: string\r\n ): Promise<ConversationExchange[]> {\r\n await this.ensureInitialized();\r\n\r\n const data = await this.redis<string[]>([\r\n \"LRANGE\",\r\n this.key(userId, \"conversations\"),\r\n \"0\",\r\n \"-1\",\r\n ]);\r\n\r\n if (!data || !Array.isArray(data)) return [];\r\n\r\n let conversations: ConversationExchange[] = data\r\n .map((v) => JSON.parse(v) as ConversationExchange)\r\n .map((c) => ({\r\n ...c,\r\n timestamp: new Date(c.timestamp),\r\n }));\r\n\r\n if (sessionId) {\r\n conversations = conversations.filter((c) => c.sessionId === sessionId);\r\n }\r\n\r\n conversations.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\r\n\r\n if (limit) {\r\n conversations = conversations.slice(0, limit);\r\n }\r\n\r\n return conversations;\r\n }\r\n\r\n async saveConversation(\r\n userId: string,\r\n exchange: Omit<ConversationExchange, \"id\">\r\n ): Promise<ConversationExchange> {\r\n await this.ensureInitialized();\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n const newExchange: ConversationExchange = {\r\n ...exchange,\r\n id: uuidv4(),\r\n };\r\n\r\n await this.redis([\r\n \"LPUSH\",\r\n this.key(userId, \"conversations\"),\r\n JSON.stringify(newExchange),\r\n ]);\r\n\r\n // Update session message count\r\n const session = await this.getSession(userId, exchange.sessionId);\r\n if (session) {\r\n session.messageCount++;\r\n await this.redis([\r\n \"HSET\",\r\n this.key(userId, \"sessions\"),\r\n session.id,\r\n JSON.stringify(session),\r\n ]);\r\n }\r\n\r\n return newExchange;\r\n }\r\n\r\n // =========================================================================\r\n // Session Operations\r\n // =========================================================================\r\n\r\n async getSessions(userId: string, limit?: number): Promise<Session[]> {\r\n await this.ensureInitialized();\r\n\r\n const data = await this.redis<string[] | Record<string, string>>([\r\n \"HGETALL\",\r\n this.key(userId, \"sessions\"),\r\n ]);\r\n\r\n if (!data) return [];\r\n\r\n // Upstash returns HGETALL as array [key1, val1, key2, val2, ...]\r\n let dataObj: Record<string, string>;\r\n if (Array.isArray(data)) {\r\n dataObj = {};\r\n for (let i = 0; i < data.length; i += 2) {\r\n if (data[i + 1]) {\r\n dataObj[data[i]] = data[i + 1];\r\n }\r\n }\r\n } else if (typeof data === \"object\") {\r\n dataObj = data;\r\n } else {\r\n return [];\r\n }\r\n\r\n let sessions: Session[] = Object.values(dataObj)\r\n .filter((v) => typeof v === \"string\")\r\n .map((v) => JSON.parse(v) as Session)\r\n .map((s) => ({\r\n ...s,\r\n startedAt: new Date(s.startedAt),\r\n endedAt: s.endedAt ? new Date(s.endedAt) : null,\r\n }));\r\n\r\n sessions.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());\r\n\r\n if (limit) {\r\n sessions = sessions.slice(0, limit);\r\n }\r\n\r\n return sessions;\r\n }\r\n\r\n async getSession(userId: string, sessionId: string): Promise<Session | null> {\r\n await this.ensureInitialized();\r\n\r\n const data = await this.redis<string | null>([\r\n \"HGET\",\r\n this.key(userId, \"sessions\"),\r\n sessionId,\r\n ]);\r\n\r\n if (!data) return null;\r\n\r\n const session = JSON.parse(data) as Session;\r\n return {\r\n ...session,\r\n startedAt: new Date(session.startedAt),\r\n endedAt: session.endedAt ? new Date(session.endedAt) : null,\r\n };\r\n }\r\n\r\n async createSession(userId: string): Promise<Session> {\r\n await this.ensureInitialized();\r\n const { v4: uuidv4 } = await import(\"uuid\");\r\n\r\n const session: Session = {\r\n id: uuidv4(),\r\n userId,\r\n startedAt: new Date(),\r\n endedAt: null,\r\n messageCount: 0,\r\n };\r\n\r\n await this.redis([\r\n \"HSET\",\r\n this.key(userId, \"sessions\"),\r\n session.id,\r\n JSON.stringify(session),\r\n ]);\r\n return session;\r\n }\r\n\r\n async endSession(\r\n userId: string,\r\n sessionId: string,\r\n summary?: string\r\n ): Promise<Session> {\r\n await this.ensureInitialized();\r\n\r\n const session = await this.getSession(userId, sessionId);\r\n if (!session) {\r\n throw new Error(`Session not found: ${sessionId}`);\r\n }\r\n\r\n session.endedAt = new Date();\r\n if (summary) {\r\n session.summary = summary;\r\n }\r\n\r\n await this.redis([\r\n \"HSET\",\r\n this.key(userId, \"sessions\"),\r\n sessionId,\r\n JSON.stringify(session),\r\n ]);\r\n return session;\r\n }\r\n\r\n // =========================================================================\r\n // Utility Methods for Hot Cache\r\n // =========================================================================\r\n\r\n /**\r\n * Set TTL on a user's data (useful for expiring cache)\r\n * If no TTL is provided, uses the configured default TTL.\r\n */\r\n async setUserTtl(userId: string, ttlSeconds?: number): Promise<void> {\r\n const ttl = ttlSeconds ?? this.defaultTtl;\r\n await this.redis([\"EXPIRE\", this.key(userId, \"facts\"), String(ttl)]);\r\n await this.redis([\r\n \"EXPIRE\",\r\n this.key(userId, \"conversations\"),\r\n String(ttl),\r\n ]);\r\n await this.redis([\"EXPIRE\", this.key(userId, \"sessions\"), String(ttl)]);\r\n }\r\n\r\n /**\r\n * Clear all data for a user\r\n */\r\n async clearUser(userId: string): Promise<void> {\r\n await this.redis([\"DEL\", this.key(userId, \"facts\")]);\r\n await this.redis([\"DEL\", this.key(userId, \"conversations\")]);\r\n await this.redis([\"DEL\", this.key(userId, \"sessions\")]);\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { P as ProviderConfig, c as MemoryOSOptions, H as HydrateOptions, d as HydratedContext, E as ExtractionResult, F as FactFilter, M as MemoryFact, S as Session, C as ConversationExchange } from './types-G9qmfSeZ.mjs';
|
|
2
|
+
import { B as BaseAdapter } from './BaseAdapter-BoRh1T7O.mjs';
|
|
3
|
+
import { B as BaseProvider } from './BaseProvider-edMh_R9t.mjs';
|
|
4
|
+
|
|
5
|
+
interface MemoryOSConfig {
|
|
6
|
+
/** LLM provider configuration or instance */
|
|
7
|
+
llm: ProviderConfig | {
|
|
8
|
+
instance: BaseProvider;
|
|
9
|
+
};
|
|
10
|
+
/** Storage adapter instance */
|
|
11
|
+
adapter?: BaseAdapter;
|
|
12
|
+
/** Behavioral options */
|
|
13
|
+
options?: MemoryOSOptions;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* MemoryOS - The main orchestrator for AI agent memory.
|
|
17
|
+
*
|
|
18
|
+
* Implements the "Two-Brain" architecture:
|
|
19
|
+
* - Fast Brain: Synchronous context retrieval before LLM calls
|
|
20
|
+
* - Slow Brain: Asynchronous fact extraction after responses
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* import { MemoryOS } from 'mem-ts';
|
|
25
|
+
* import { JSONFileAdapter } from 'mem-ts/adapters';
|
|
26
|
+
*
|
|
27
|
+
* const memory = new MemoryOS({
|
|
28
|
+
* llm: { provider: 'openai', apiKey: 'sk-...', model: 'gpt-4o-mini' },
|
|
29
|
+
* adapter: new JSONFileAdapter({ path: './.mem-ts' })
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Before LLM call - get context
|
|
33
|
+
* const context = await memory.hydrate(userId, userMessage);
|
|
34
|
+
*
|
|
35
|
+
* // After LLM response - extract facts (non-blocking)
|
|
36
|
+
* memory.digest(userId, userMessage, assistantResponse);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
declare class MemoryOS {
|
|
40
|
+
private adapter;
|
|
41
|
+
private provider;
|
|
42
|
+
private extractor;
|
|
43
|
+
private hydrator;
|
|
44
|
+
private options;
|
|
45
|
+
private initialized;
|
|
46
|
+
private activeSessions;
|
|
47
|
+
constructor(config: MemoryOSConfig);
|
|
48
|
+
/**
|
|
49
|
+
* Initialize the memory system (connects to storage, etc.)
|
|
50
|
+
*/
|
|
51
|
+
initialize(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Ensure the system is initialized
|
|
54
|
+
*/
|
|
55
|
+
private ensureInitialized;
|
|
56
|
+
/**
|
|
57
|
+
* Hydrate context for injection into an LLM prompt.
|
|
58
|
+
*
|
|
59
|
+
* This is the "Fast Brain" - runs synchronously before each LLM call
|
|
60
|
+
* to provide relevant context from the user's memory.
|
|
61
|
+
*
|
|
62
|
+
* @param userId - Unique identifier for the user
|
|
63
|
+
* @param message - The user's current message (used for relevance ranking)
|
|
64
|
+
* @param options - Optional filtering and limiting options
|
|
65
|
+
* @returns Compiled context ready for injection
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const context = await memory.hydrate(userId, userMessage);
|
|
70
|
+
*
|
|
71
|
+
* const response = await openai.chat.completions.create({
|
|
72
|
+
* messages: [
|
|
73
|
+
* { role: 'system', content: `Context: ${context.compiledPrompt}` },
|
|
74
|
+
* { role: 'user', content: userMessage }
|
|
75
|
+
* ]
|
|
76
|
+
* });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
hydrate(userId: string, message: string, options?: HydrateOptions): Promise<HydratedContext>;
|
|
80
|
+
/**
|
|
81
|
+
* Digest a conversation exchange to extract facts.
|
|
82
|
+
*
|
|
83
|
+
* This is the "Slow Brain" - runs asynchronously in the background
|
|
84
|
+
* after a response is sent to the user. Does not block.
|
|
85
|
+
*
|
|
86
|
+
* @param userId - Unique identifier for the user
|
|
87
|
+
* @param userMessage - What the user said
|
|
88
|
+
* @param assistantResponse - What the assistant replied
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* // Fire and forget - doesn't block
|
|
93
|
+
* memory.digest(userId, userMessage, response.content);
|
|
94
|
+
*
|
|
95
|
+
* // Return response to user immediately
|
|
96
|
+
* res.json({ message: response.content });
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
digest(userId: string, userMessage: string, assistantResponse: string): void;
|
|
100
|
+
/**
|
|
101
|
+
* Extract facts immediately (synchronous version of digest).
|
|
102
|
+
* Useful for testing or when you need the extraction result.
|
|
103
|
+
*/
|
|
104
|
+
digestSync(userId: string, userMessage: string, assistantResponse: string): Promise<ExtractionResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Get all facts for a user
|
|
107
|
+
*/
|
|
108
|
+
getFacts(userId: string, filter?: FactFilter): Promise<MemoryFact[]>;
|
|
109
|
+
/**
|
|
110
|
+
* Add a fact directly (bypasses extraction)
|
|
111
|
+
*/
|
|
112
|
+
addFact(userId: string, subject: string, predicate: string, object: string, confidence?: number, importance?: number): Promise<MemoryFact>;
|
|
113
|
+
/**
|
|
114
|
+
* Delete a fact
|
|
115
|
+
*/
|
|
116
|
+
deleteFact(userId: string, factId: string, reason?: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Clear all facts for a user (use with caution!)
|
|
119
|
+
*/
|
|
120
|
+
clearFacts(userId: string): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Start a new session for a user
|
|
123
|
+
*/
|
|
124
|
+
startSession(userId: string): Promise<Session>;
|
|
125
|
+
/**
|
|
126
|
+
* End the current session for a user
|
|
127
|
+
*/
|
|
128
|
+
endSession(userId: string, summary?: string): Promise<Session | null>;
|
|
129
|
+
/**
|
|
130
|
+
* Get or create a session ID for a user
|
|
131
|
+
*/
|
|
132
|
+
private getOrCreateSession;
|
|
133
|
+
/**
|
|
134
|
+
* Ensure a session exists (async version)
|
|
135
|
+
*/
|
|
136
|
+
private ensureSession;
|
|
137
|
+
/**
|
|
138
|
+
* Get conversation history for a user
|
|
139
|
+
*/
|
|
140
|
+
getHistory(userId: string, limit?: number, sessionId?: string): Promise<ConversationExchange[]>;
|
|
141
|
+
/**
|
|
142
|
+
* Export all data for a user (for portability)
|
|
143
|
+
*/
|
|
144
|
+
exportUser(userId: string): Promise<{
|
|
145
|
+
facts: MemoryFact[];
|
|
146
|
+
conversations: ConversationExchange[];
|
|
147
|
+
sessions: Session[];
|
|
148
|
+
}>;
|
|
149
|
+
/**
|
|
150
|
+
* Wait for all pending extractions to complete
|
|
151
|
+
*/
|
|
152
|
+
drain(): Promise<void>;
|
|
153
|
+
/**
|
|
154
|
+
* Get the number of pending extraction tasks
|
|
155
|
+
*/
|
|
156
|
+
getPendingExtractions(): number;
|
|
157
|
+
/**
|
|
158
|
+
* Close the memory system (disconnects from storage)
|
|
159
|
+
*/
|
|
160
|
+
close(): Promise<void>;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Express/Connect-style request object
|
|
165
|
+
*/
|
|
166
|
+
interface MiddlewareRequest {
|
|
167
|
+
body?: {
|
|
168
|
+
userId?: string;
|
|
169
|
+
message?: string;
|
|
170
|
+
[key: string]: unknown;
|
|
171
|
+
};
|
|
172
|
+
params?: Record<string, string>;
|
|
173
|
+
query?: Record<string, string>;
|
|
174
|
+
headers?: Record<string, string | string[] | undefined>;
|
|
175
|
+
user?: {
|
|
176
|
+
id?: string;
|
|
177
|
+
userId?: string;
|
|
178
|
+
[key: string]: unknown;
|
|
179
|
+
};
|
|
180
|
+
memoryContext?: HydratedContext;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Express/Connect-style response object
|
|
184
|
+
*/
|
|
185
|
+
interface MiddlewareResponse {
|
|
186
|
+
locals?: Record<string, unknown>;
|
|
187
|
+
json?: (body: unknown) => void;
|
|
188
|
+
on?: (event: string, callback: () => void) => void;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Next function to call the next middleware
|
|
192
|
+
*/
|
|
193
|
+
type NextFunction = (error?: unknown) => void;
|
|
194
|
+
/**
|
|
195
|
+
* Options for the memory middleware
|
|
196
|
+
*/
|
|
197
|
+
interface MemoryMiddlewareOptions {
|
|
198
|
+
/** Function to extract userId from request */
|
|
199
|
+
getUserId?: (req: MiddlewareRequest) => string | undefined;
|
|
200
|
+
/** Function to extract user message from request */
|
|
201
|
+
getMessage?: (req: MiddlewareRequest) => string | undefined;
|
|
202
|
+
/** Attach context to request object */
|
|
203
|
+
attachToRequest?: boolean;
|
|
204
|
+
/** Auto-digest on response finish (requires response body capture) */
|
|
205
|
+
autoDigest?: boolean;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Result attached to request/response
|
|
209
|
+
*/
|
|
210
|
+
declare global {
|
|
211
|
+
namespace Express {
|
|
212
|
+
interface Request {
|
|
213
|
+
memoryContext?: HydratedContext;
|
|
214
|
+
}
|
|
215
|
+
interface Locals {
|
|
216
|
+
memoryContext?: HydratedContext;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Create Express middleware for automatic context hydration.
|
|
222
|
+
*
|
|
223
|
+
* @example
|
|
224
|
+
* ```typescript
|
|
225
|
+
* import express from 'express';
|
|
226
|
+
* import { MemoryOS } from 'mem-ts';
|
|
227
|
+
* import { createMemoryMiddleware } from 'mem-ts/middleware';
|
|
228
|
+
*
|
|
229
|
+
* const app = express();
|
|
230
|
+
* const memory = new MemoryOS({ ... });
|
|
231
|
+
*
|
|
232
|
+
* app.use('/chat', createMemoryMiddleware(memory, {
|
|
233
|
+
* getUserId: (req) => req.user?.id,
|
|
234
|
+
* getMessage: (req) => req.body?.message,
|
|
235
|
+
* }));
|
|
236
|
+
*
|
|
237
|
+
* app.post('/chat', (req, res) => {
|
|
238
|
+
* const context = req.memoryContext;
|
|
239
|
+
* // Use context.compiledPrompt in your LLM call
|
|
240
|
+
* });
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
declare function createMemoryMiddleware(memory: MemoryOS, options?: MemoryMiddlewareOptions): (req: MiddlewareRequest, res: MiddlewareResponse, next: NextFunction) => Promise<void>;
|
|
244
|
+
/**
|
|
245
|
+
* Helper function to digest after response in Express.
|
|
246
|
+
* Call this after sending the response.
|
|
247
|
+
*
|
|
248
|
+
* @example
|
|
249
|
+
* ```typescript
|
|
250
|
+
* app.post('/chat', async (req, res) => {
|
|
251
|
+
* const response = await callLLM(req.memoryContext, req.body.message);
|
|
252
|
+
* res.json({ message: response });
|
|
253
|
+
*
|
|
254
|
+
* // Digest in background
|
|
255
|
+
* digestAfterResponse(memory, req.user.id, req.body.message, response);
|
|
256
|
+
* });
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
declare function digestAfterResponse(memory: MemoryOS, userId: string, userMessage: string, assistantResponse: string): void;
|
|
260
|
+
/**
|
|
261
|
+
* Create a Next.js API route handler wrapper.
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* ```typescript
|
|
265
|
+
* // pages/api/chat.ts or app/api/chat/route.ts
|
|
266
|
+
* import { withMemory } from 'mem-ts/middleware';
|
|
267
|
+
*
|
|
268
|
+
* export const POST = withMemory(memory, async (req, context) => {
|
|
269
|
+
* const { message } = await req.json();
|
|
270
|
+
* const response = await callLLM(context.compiledPrompt, message);
|
|
271
|
+
* return Response.json({ message: response });
|
|
272
|
+
* }, {
|
|
273
|
+
* getUserId: (req) => req.headers.get('x-user-id'),
|
|
274
|
+
* });
|
|
275
|
+
* ```
|
|
276
|
+
*/
|
|
277
|
+
declare function withMemory<T extends {
|
|
278
|
+
json: () => Promise<{
|
|
279
|
+
message?: string;
|
|
280
|
+
userId?: string;
|
|
281
|
+
}>;
|
|
282
|
+
}>(memory: MemoryOS, handler: (req: T, context: HydratedContext) => Promise<Response>, options?: {
|
|
283
|
+
getUserId?: (req: T) => string | null | undefined;
|
|
284
|
+
getMessage?: (body: {
|
|
285
|
+
message?: string;
|
|
286
|
+
}) => string | undefined;
|
|
287
|
+
}): (req: T) => Promise<Response>;
|
|
288
|
+
|
|
289
|
+
export { MemoryOS as M, type NextFunction as N, type MemoryOSConfig as a, type MemoryMiddlewareOptions as b, createMemoryMiddleware as c, digestAfterResponse as d, type MiddlewareRequest as e, type MiddlewareResponse as f, withMemory as w };
|