import type { Memory } from '../types' const API_BASE = '/api' interface QualityValidation { score: number level: 'excellent' | 'good' | 'fair' | 'poor' | 'critical' issues: string[] suggestions: string[] meetsStandards: boolean } /** * API service for memory management */ export class MemoryAPI { /** * Validate memory quality */ static async validateQuality(content: string): Promise { // Create a temporary memory object for validation const tempMemory: Memory = { id: 'temp', timestamp: new Date().toISOString(), content, tags: [], category: 'personal', complexity: 1, project: 'default', priority: 'medium', status: 'active', metadata: {} } try { const response = await fetch(`${API_BASE}/quality/validate/temp`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(tempMemory) }) if (!response.ok) { // Return default validation if endpoint fails return { score: 0, level: 'critical', issues: ['Could not validate quality'], suggestions: [], meetsStandards: false } } const data = await response.json() return data.quality } catch (error) { console.error('Quality validation failed:', error) // Return default validation if error return { score: 0, level: 'critical', issues: ['Could not validate quality'], suggestions: [], meetsStandards: false } } } /** * Load all memories */ static async loadMemories(): Promise { try { const response = await fetch(`${API_BASE}/memories`) if (!response.ok) { throw new Error(`Failed to load memories: ${response.status}`) } const data = await response.json() return Array.isArray(data) ? data : [] } catch (error) { console.error('Failed to load memories:', error) throw error } } /** * Add a new memory */ static async addMemory(content: string, tags: string[]): Promise { if (!content.trim()) { throw new Error('Memory content cannot be empty') } // Safeguard: Reject mock data patterns const mockDataPatterns = [ /mock-\d+/i, /test.*data/i, /sample.*content/i, /lorem ipsum/i, /fake.*data/i, /placeholder/i ]; const containsMockPattern = mockDataPatterns.some(pattern => pattern.test(content) || (Array.isArray(tags) && tags.some(tag => pattern.test(tag))) ); if (containsMockPattern) { throw new Error('Invalid memory: Mock data patterns detected. Only real memories are allowed.'); } // Safeguard: Validate real content requirements if (content.trim().length < 10) { throw new Error('Invalid memory: Content must be at least 10 characters long for real memories'); } const memory = { content: content.trim(), tags: tags.filter(Boolean) } try { const response = await fetch(`${API_BASE}/memories`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(memory) }) if (!response.ok) { throw new Error(`Failed to add memory: ${response.status}`) } } catch (error) { console.error('Failed to add memory:', error) throw error } } /** * Update an existing memory */ static async updateMemory(id: string, content: string, tags: string[]): Promise { if (!content.trim()) { throw new Error('Memory content cannot be empty') } const memory = { content: content.trim(), tags: tags.filter(Boolean) } try { const response = await fetch(`${API_BASE}/memories/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(memory) }) if (!response.ok) { throw new Error(`Failed to update memory: ${response.status}`) } } catch (error) { console.error('Failed to update memory:', error) throw error } } /** * Delete a memory */ static async deleteMemory(id: string): Promise { try { const response = await fetch(`${API_BASE}/memories/${id}`, { method: 'DELETE' }) if (!response.ok) { throw new Error(`Failed to delete memory: ${response.status}`) } } catch (error) { console.error('Failed to delete memory:', error) throw error } } }