@endlessblink/like-i-said-v2
Version:
Task Management & Memory for Claude - Track tasks, remember context, and maintain continuity across sessions with 27 powerful tools. Works with Claude Desktop and Claude Code.
183 lines (163 loc) • 4.85 kB
text/typescript
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<QualityValidation> {
// 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<Memory[]> {
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<void> {
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<void> {
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<void> {
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
}
}
}