@su-record/vibe 2.4.74 → 2.4.76

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.
Files changed (51) hide show
  1. package/commands/vibe.run.md +11 -13
  2. package/commands/vibe.spec.md +161 -37
  3. package/dist/lib/MemoryManager.d.ts +13 -155
  4. package/dist/lib/MemoryManager.d.ts.map +1 -1
  5. package/dist/lib/MemoryManager.js +52 -617
  6. package/dist/lib/MemoryManager.js.map +1 -1
  7. package/dist/lib/memory/KnowledgeGraph.d.ts +34 -0
  8. package/dist/lib/memory/KnowledgeGraph.d.ts.map +1 -0
  9. package/dist/lib/memory/KnowledgeGraph.js +216 -0
  10. package/dist/lib/memory/KnowledgeGraph.js.map +1 -0
  11. package/dist/lib/memory/KnowledgeGraph.test.d.ts +2 -0
  12. package/dist/lib/memory/KnowledgeGraph.test.d.ts.map +1 -0
  13. package/dist/lib/memory/KnowledgeGraph.test.js +189 -0
  14. package/dist/lib/memory/KnowledgeGraph.test.js.map +1 -0
  15. package/dist/lib/memory/MemorySearch.d.ts +25 -0
  16. package/dist/lib/memory/MemorySearch.d.ts.map +1 -0
  17. package/dist/lib/memory/MemorySearch.js +85 -0
  18. package/dist/lib/memory/MemorySearch.js.map +1 -0
  19. package/dist/lib/memory/MemorySearch.test.d.ts +2 -0
  20. package/dist/lib/memory/MemorySearch.test.d.ts.map +1 -0
  21. package/dist/lib/memory/MemorySearch.test.js +149 -0
  22. package/dist/lib/memory/MemorySearch.test.js.map +1 -0
  23. package/dist/lib/memory/MemoryStorage.d.ts +77 -0
  24. package/dist/lib/memory/MemoryStorage.d.ts.map +1 -0
  25. package/dist/lib/memory/MemoryStorage.js +278 -0
  26. package/dist/lib/memory/MemoryStorage.js.map +1 -0
  27. package/dist/lib/memory/MemoryStorage.test.d.ts +2 -0
  28. package/dist/lib/memory/MemoryStorage.test.d.ts.map +1 -0
  29. package/dist/lib/memory/MemoryStorage.test.js +198 -0
  30. package/dist/lib/memory/MemoryStorage.test.js.map +1 -0
  31. package/dist/lib/memory/index.d.ts +4 -0
  32. package/dist/lib/memory/index.d.ts.map +1 -0
  33. package/dist/lib/memory/index.js +8 -0
  34. package/dist/lib/memory/index.js.map +1 -0
  35. package/dist/tools/convention/analyzeComplexity.d.ts +3 -1
  36. package/dist/tools/convention/analyzeComplexity.d.ts.map +1 -1
  37. package/dist/tools/convention/analyzeComplexity.js +99 -1
  38. package/dist/tools/convention/analyzeComplexity.js.map +1 -1
  39. package/dist/tools/convention/analyzeComplexity.test.d.ts +2 -0
  40. package/dist/tools/convention/analyzeComplexity.test.d.ts.map +1 -0
  41. package/dist/tools/convention/analyzeComplexity.test.js +207 -0
  42. package/dist/tools/convention/analyzeComplexity.test.js.map +1 -0
  43. package/dist/tools/convention/validateCodeQuality.d.ts +3 -1
  44. package/dist/tools/convention/validateCodeQuality.d.ts.map +1 -1
  45. package/dist/tools/convention/validateCodeQuality.js +144 -1
  46. package/dist/tools/convention/validateCodeQuality.js.map +1 -1
  47. package/dist/tools/convention/validateCodeQuality.test.d.ts +2 -0
  48. package/dist/tools/convention/validateCodeQuality.test.d.ts.map +1 -0
  49. package/dist/tools/convention/validateCodeQuality.test.js +230 -0
  50. package/dist/tools/convention/validateCodeQuality.test.js.map +1 -0
  51. package/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ // Advanced memory search operations
2
+ // Extracted from MemoryManager for better separation of concerns
3
+ export class MemorySearch {
4
+ db;
5
+ storage;
6
+ graph;
7
+ constructor(storage, graph) {
8
+ this.storage = storage;
9
+ this.graph = graph;
10
+ this.db = storage.getDatabase();
11
+ }
12
+ /**
13
+ * Advanced search with multiple strategies
14
+ */
15
+ searchAdvanced(query, strategy, options = {}) {
16
+ const { limit = 20, category, startKey, depth = 2 } = options;
17
+ switch (strategy) {
18
+ case 'keyword':
19
+ return this.searchKeyword(query, limit, category);
20
+ case 'graph_traversal':
21
+ if (!startKey)
22
+ return this.searchKeyword(query, limit, category);
23
+ return this.graph.getRelatedMemories(startKey, depth);
24
+ case 'temporal':
25
+ return this.searchTemporal(query, limit);
26
+ case 'priority':
27
+ return this.searchByPriority(query, limit);
28
+ case 'context_aware':
29
+ return this.searchContextAware(query, limit, category);
30
+ default:
31
+ return this.storage.search(query);
32
+ }
33
+ }
34
+ searchKeyword(query, limit, category) {
35
+ let sql = `
36
+ SELECT * FROM memories
37
+ WHERE (key LIKE ? OR value LIKE ?)
38
+ `;
39
+ const params = [`%${query}%`, `%${query}%`];
40
+ if (category) {
41
+ sql += ` AND category = ?`;
42
+ params.push(category);
43
+ }
44
+ sql += ` ORDER BY priority DESC, timestamp DESC LIMIT ?`;
45
+ params.push(limit);
46
+ return this.db.prepare(sql).all(...params);
47
+ }
48
+ searchTemporal(query, limit) {
49
+ const sql = `
50
+ SELECT * FROM memories
51
+ WHERE key LIKE ? OR value LIKE ?
52
+ ORDER BY timestamp DESC
53
+ LIMIT ?
54
+ `;
55
+ return this.db.prepare(sql).all(`%${query}%`, `%${query}%`, limit);
56
+ }
57
+ searchByPriority(query, limit) {
58
+ const sql = `
59
+ SELECT * FROM memories
60
+ WHERE key LIKE ? OR value LIKE ?
61
+ ORDER BY priority DESC, lastAccessed DESC
62
+ LIMIT ?
63
+ `;
64
+ return this.db.prepare(sql).all(`%${query}%`, `%${query}%`, limit);
65
+ }
66
+ searchContextAware(query, limit, category) {
67
+ let sql = `
68
+ SELECT *,
69
+ (CASE WHEN key LIKE ? THEN 3 ELSE 0 END +
70
+ CASE WHEN value LIKE ? THEN 2 ELSE 0 END +
71
+ priority * 0.5) as relevance_score
72
+ FROM memories
73
+ WHERE key LIKE ? OR value LIKE ?
74
+ `;
75
+ const params = [`%${query}%`, `%${query}%`, `%${query}%`, `%${query}%`];
76
+ if (category) {
77
+ sql += ` AND category = ?`;
78
+ params.push(category);
79
+ }
80
+ sql += ` ORDER BY relevance_score DESC, lastAccessed DESC LIMIT ?`;
81
+ params.push(limit);
82
+ return this.db.prepare(sql).all(...params);
83
+ }
84
+ }
85
+ //# sourceMappingURL=MemorySearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorySearch.js","sourceRoot":"","sources":["../../../src/lib/memory/MemorySearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MemorySearch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorySearch.test.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemorySearch.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,149 @@
1
+ // Unit tests for MemorySearch
2
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
3
+ import { MemoryStorage } from './MemoryStorage.js';
4
+ import { KnowledgeGraph } from './KnowledgeGraph.js';
5
+ import { MemorySearch } from './MemorySearch.js';
6
+ import { rmSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { tmpdir } from 'os';
9
+ describe('MemorySearch', () => {
10
+ let storage;
11
+ let graph;
12
+ let search;
13
+ let testDir;
14
+ beforeEach(() => {
15
+ testDir = join(tmpdir(), `vibe-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
16
+ storage = new MemoryStorage(testDir);
17
+ graph = new KnowledgeGraph(storage);
18
+ search = new MemorySearch(storage, graph);
19
+ // Setup test data with varied priorities and categories
20
+ storage.save('user-auth', 'Authentication module for users', 'auth', 10);
21
+ storage.save('user-profile', 'User profile management', 'profile', 5);
22
+ storage.save('admin-auth', 'Admin authentication system', 'auth', 8);
23
+ storage.save('api-endpoint', 'REST API endpoints', 'api', 3);
24
+ storage.save('database-config', 'Database configuration settings', 'config', 7);
25
+ });
26
+ afterEach(() => {
27
+ storage.close();
28
+ try {
29
+ rmSync(testDir, { recursive: true, force: true });
30
+ }
31
+ catch {
32
+ // Ignore cleanup errors
33
+ }
34
+ });
35
+ describe('searchAdvanced with keyword strategy', () => {
36
+ it('should search by keyword in key and value', () => {
37
+ const results = search.searchAdvanced('user', 'keyword');
38
+ expect(results.length).toBeGreaterThan(0);
39
+ expect(results.some(r => r.key.includes('user'))).toBe(true);
40
+ });
41
+ it('should filter by category', () => {
42
+ const results = search.searchAdvanced('auth', 'keyword', { category: 'auth' });
43
+ expect(results.every(r => r.category === 'auth')).toBe(true);
44
+ });
45
+ it('should respect limit option', () => {
46
+ const results = search.searchAdvanced('', 'keyword', { limit: 2 });
47
+ expect(results.length).toBeLessThanOrEqual(2);
48
+ });
49
+ it('should order by priority', () => {
50
+ const results = search.searchAdvanced('auth', 'keyword');
51
+ // First result should have higher priority
52
+ if (results.length > 1) {
53
+ expect(results[0].priority).toBeGreaterThanOrEqual(results[1].priority || 0);
54
+ }
55
+ });
56
+ });
57
+ describe('searchAdvanced with temporal strategy', () => {
58
+ it('should return results ordered by timestamp', () => {
59
+ const results = search.searchAdvanced('', 'temporal');
60
+ expect(results.length).toBeGreaterThan(0);
61
+ // Most recent first
62
+ if (results.length > 1) {
63
+ expect(results[0].timestamp >= results[1].timestamp).toBe(true);
64
+ }
65
+ });
66
+ });
67
+ describe('searchAdvanced with priority strategy', () => {
68
+ it('should order by priority then last accessed', () => {
69
+ const results = search.searchAdvanced('', 'priority');
70
+ expect(results.length).toBeGreaterThan(0);
71
+ // Highest priority first
72
+ if (results.length > 1) {
73
+ expect(results[0].priority).toBeGreaterThanOrEqual(results[1].priority || 0);
74
+ }
75
+ });
76
+ it('should filter by query', () => {
77
+ const results = search.searchAdvanced('auth', 'priority');
78
+ expect(results.every(r => r.key.includes('auth') || r.value.includes('auth'))).toBe(true);
79
+ });
80
+ });
81
+ describe('searchAdvanced with graph_traversal strategy', () => {
82
+ beforeEach(() => {
83
+ graph.linkMemories('user-auth', 'user-profile', 'related');
84
+ graph.linkMemories('user-profile', 'database-config', 'depends-on');
85
+ });
86
+ it('should fall back to keyword search without startKey', () => {
87
+ const results = search.searchAdvanced('user', 'graph_traversal');
88
+ expect(results.length).toBeGreaterThan(0);
89
+ });
90
+ it('should traverse graph from startKey', () => {
91
+ const results = search.searchAdvanced('', 'graph_traversal', {
92
+ startKey: 'user-auth',
93
+ depth: 2
94
+ });
95
+ const keys = results.map(r => r.key);
96
+ expect(keys).toContain('user-profile');
97
+ });
98
+ it('should respect depth parameter', () => {
99
+ const depth1 = search.searchAdvanced('', 'graph_traversal', {
100
+ startKey: 'user-auth',
101
+ depth: 1
102
+ });
103
+ const depth2 = search.searchAdvanced('', 'graph_traversal', {
104
+ startKey: 'user-auth',
105
+ depth: 2
106
+ });
107
+ expect(depth2.length).toBeGreaterThanOrEqual(depth1.length);
108
+ });
109
+ });
110
+ describe('searchAdvanced with context_aware strategy', () => {
111
+ it('should rank by relevance score', () => {
112
+ // Use single word that exists in test data
113
+ const results = search.searchAdvanced('user', 'context_aware');
114
+ expect(results.length).toBeGreaterThan(0);
115
+ // Results with matches in key should be ranked higher
116
+ });
117
+ it('should filter by category', () => {
118
+ const results = search.searchAdvanced('auth', 'context_aware', { category: 'auth' });
119
+ expect(results.every(r => r.category === 'auth')).toBe(true);
120
+ });
121
+ it('should consider priority in relevance', () => {
122
+ const results = search.searchAdvanced('auth', 'context_aware');
123
+ // Higher priority items should generally rank better for same keyword match
124
+ expect(results.length).toBeGreaterThan(0);
125
+ });
126
+ });
127
+ describe('searchAdvanced with unknown strategy', () => {
128
+ it('should fall back to basic search', () => {
129
+ const results = search.searchAdvanced('user', 'unknown');
130
+ expect(results.length).toBeGreaterThan(0);
131
+ });
132
+ });
133
+ describe('search options', () => {
134
+ it('should use default limit of 20', () => {
135
+ // Add more items
136
+ for (let i = 0; i < 25; i++) {
137
+ storage.save(`item-${i}`, `value ${i}`, 'test');
138
+ }
139
+ const results = search.searchAdvanced('item', 'keyword');
140
+ expect(results.length).toBeLessThanOrEqual(20);
141
+ });
142
+ it('should handle empty query', () => {
143
+ const results = search.searchAdvanced('', 'keyword', { limit: 5 });
144
+ // Should return some results (empty query matches all due to LIKE %%)
145
+ expect(results.length).toBeGreaterThan(0);
146
+ });
147
+ });
148
+ });
149
+ //# sourceMappingURL=MemorySearch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorySearch.test.js","sourceRoot":"","sources":["../../../src/lib/memory/MemorySearch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import Database from 'better-sqlite3';
2
+ export interface MemoryItem {
3
+ key: string;
4
+ value: string;
5
+ category: string;
6
+ timestamp: string;
7
+ lastAccessed: string;
8
+ priority?: number;
9
+ }
10
+ export declare class MemoryStorage {
11
+ protected db: Database.Database;
12
+ protected readonly dbPath: string;
13
+ private recallStmt;
14
+ private saveStmt;
15
+ private recallSelectStmt;
16
+ private recallUpdateStmt;
17
+ constructor(projectPath: string);
18
+ private initializeDatabase;
19
+ private initializePreparedStatements;
20
+ private migrateFromJSON;
21
+ /**
22
+ * Save or update a memory item
23
+ */
24
+ save(key: string, value: string, category?: string, priority?: number): void;
25
+ /**
26
+ * Recall a memory item by key
27
+ */
28
+ recall(key: string): MemoryItem | null;
29
+ /**
30
+ * Delete a memory item
31
+ */
32
+ delete(key: string): boolean;
33
+ /**
34
+ * Update a memory item's value
35
+ */
36
+ update(key: string, value: string): boolean;
37
+ /**
38
+ * List all memories or filter by category
39
+ */
40
+ list(category?: string): MemoryItem[];
41
+ /**
42
+ * Search memories by keyword
43
+ */
44
+ search(query: string): MemoryItem[];
45
+ /**
46
+ * Get memories by priority level
47
+ */
48
+ getByPriority(priority: number): MemoryItem[];
49
+ /**
50
+ * Update priority of a memory item
51
+ */
52
+ setPriority(key: string, priority: number): boolean;
53
+ /**
54
+ * Get memory statistics
55
+ */
56
+ getStats(): {
57
+ total: number;
58
+ byCategory: Record<string, number>;
59
+ };
60
+ /**
61
+ * Get memories sorted by time
62
+ */
63
+ getTimeline(startDate?: string, endDate?: string, limit?: number): MemoryItem[];
64
+ /**
65
+ * Get database instance (for KnowledgeGraph)
66
+ */
67
+ getDatabase(): Database.Database;
68
+ /**
69
+ * Get database path
70
+ */
71
+ getDbPath(): string;
72
+ /**
73
+ * Close database connection
74
+ */
75
+ close(): void;
76
+ }
77
+ //# sourceMappingURL=MemoryStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryStorage.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAmC;gBAE/C,WAAW,EAAE,MAAM;IAsB/B,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,4BAA4B;IAoBpC,OAAO,CAAC,eAAe;IAoCvB;;OAEG;IACI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI;IAcjG;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAoB7C;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASnC;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAYlD;;OAEG;IACI,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAgB5C;;OAEG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;IAW1C;;OAEG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAUpD;;OAEG;IACI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAM1D;;OAEG;IACI,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAkBxE;;OAEG;IACI,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAmB1F;;OAEG;IACI,WAAW,IAAI,QAAQ,CAAC,QAAQ;IAIvC;;OAEG;IACI,SAAS,IAAI,MAAM;IAI1B;;OAEG;IACI,KAAK,IAAI,IAAI;CAKrB"}
@@ -0,0 +1,278 @@
1
+ // Core memory storage operations (CRUD)
2
+ // Extracted from MemoryManager for better separation of concerns
3
+ import Database from 'better-sqlite3';
4
+ import path from 'path';
5
+ import { mkdirSync, readFileSync, renameSync, existsSync } from 'fs';
6
+ export class MemoryStorage {
7
+ db;
8
+ dbPath;
9
+ recallStmt = null;
10
+ saveStmt = null;
11
+ recallSelectStmt = null;
12
+ recallUpdateStmt = null;
13
+ constructor(projectPath) {
14
+ // Normalize path
15
+ const resolvedPath = path.resolve(projectPath);
16
+ // Project-based memory: store in {projectPath}/.claude/vibe/memories/
17
+ const memoryDir = path.join(resolvedPath, '.claude', 'vibe', 'memories');
18
+ this.dbPath = path.join(memoryDir, 'memories.db');
19
+ try {
20
+ mkdirSync(memoryDir, { recursive: true });
21
+ }
22
+ catch (error) {
23
+ const nodeError = error;
24
+ if (nodeError.code !== 'EEXIST') {
25
+ throw new Error(`Failed to create memory directory: ${nodeError.message}`);
26
+ }
27
+ }
28
+ this.db = new Database(this.dbPath);
29
+ this.initializeDatabase();
30
+ this.migrateFromJSON();
31
+ }
32
+ initializeDatabase() {
33
+ // Create memories table
34
+ this.db.exec(`
35
+ CREATE TABLE IF NOT EXISTS memories (
36
+ key TEXT PRIMARY KEY,
37
+ value TEXT NOT NULL,
38
+ category TEXT NOT NULL DEFAULT 'general',
39
+ timestamp TEXT NOT NULL,
40
+ lastAccessed TEXT NOT NULL,
41
+ priority INTEGER DEFAULT 0
42
+ );
43
+
44
+ CREATE INDEX IF NOT EXISTS idx_category ON memories(category);
45
+ CREATE INDEX IF NOT EXISTS idx_timestamp ON memories(timestamp);
46
+ CREATE INDEX IF NOT EXISTS idx_priority ON memories(priority);
47
+ CREATE INDEX IF NOT EXISTS idx_lastAccessed ON memories(lastAccessed);
48
+ `);
49
+ // Create memory_relations table for Knowledge Graph
50
+ this.db.exec(`
51
+ CREATE TABLE IF NOT EXISTS memory_relations (
52
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
53
+ sourceKey TEXT NOT NULL,
54
+ targetKey TEXT NOT NULL,
55
+ relationType TEXT NOT NULL,
56
+ strength REAL DEFAULT 1.0,
57
+ metadata TEXT,
58
+ timestamp TEXT NOT NULL,
59
+ UNIQUE(sourceKey, targetKey, relationType)
60
+ );
61
+
62
+ CREATE INDEX IF NOT EXISTS idx_rel_source ON memory_relations(sourceKey);
63
+ CREATE INDEX IF NOT EXISTS idx_rel_target ON memory_relations(targetKey);
64
+ CREATE INDEX IF NOT EXISTS idx_rel_type ON memory_relations(relationType);
65
+ `);
66
+ // Enable WAL mode for better concurrency
67
+ this.db.pragma('journal_mode = WAL');
68
+ // Pre-compile frequently used statements
69
+ this.initializePreparedStatements();
70
+ }
71
+ initializePreparedStatements() {
72
+ try {
73
+ this.recallStmt = this.db.prepare(`
74
+ UPDATE memories SET lastAccessed = ?
75
+ WHERE key = ?
76
+ RETURNING *
77
+ `);
78
+ }
79
+ catch {
80
+ // RETURNING not supported, use fallback
81
+ this.recallStmt = null;
82
+ this.recallSelectStmt = this.db.prepare(`SELECT * FROM memories WHERE key = ?`);
83
+ this.recallUpdateStmt = this.db.prepare(`UPDATE memories SET lastAccessed = ? WHERE key = ?`);
84
+ }
85
+ this.saveStmt = this.db.prepare(`
86
+ INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
87
+ VALUES (?, ?, ?, ?, ?, ?)
88
+ `);
89
+ }
90
+ migrateFromJSON() {
91
+ const jsonPath = path.join(path.dirname(this.dbPath), 'memories.json');
92
+ if (!existsSync(jsonPath))
93
+ return;
94
+ try {
95
+ const jsonData = readFileSync(jsonPath, 'utf-8');
96
+ const memories = JSON.parse(jsonData);
97
+ if (memories.length === 0)
98
+ return;
99
+ const insert = this.db.prepare(`
100
+ INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
101
+ VALUES (?, ?, ?, ?, ?, ?)
102
+ `);
103
+ const insertMany = this.db.transaction((items) => {
104
+ for (const item of items) {
105
+ insert.run(item.key, item.value, item.category || 'general', item.timestamp, item.lastAccessed, item.priority || 0);
106
+ }
107
+ });
108
+ insertMany(memories);
109
+ renameSync(jsonPath, `${jsonPath}.backup`);
110
+ }
111
+ catch {
112
+ // Migration failed, ignore
113
+ }
114
+ }
115
+ /**
116
+ * Save or update a memory item
117
+ */
118
+ save(key, value, category = 'general', priority = 0) {
119
+ const timestamp = new Date().toISOString();
120
+ if (this.saveStmt) {
121
+ this.saveStmt.run(key, value, category, timestamp, timestamp, priority);
122
+ }
123
+ else {
124
+ const stmt = this.db.prepare(`
125
+ INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
126
+ VALUES (?, ?, ?, ?, ?, ?)
127
+ `);
128
+ stmt.run(key, value, category, timestamp, timestamp, priority);
129
+ }
130
+ }
131
+ /**
132
+ * Recall a memory item by key
133
+ */
134
+ recall(key) {
135
+ const timestamp = new Date().toISOString();
136
+ if (this.recallStmt) {
137
+ const result = this.recallStmt.get(timestamp, key);
138
+ return result || null;
139
+ }
140
+ if (!this.recallSelectStmt || !this.recallUpdateStmt) {
141
+ throw new Error('Fallback recall statements not initialized');
142
+ }
143
+ const result = this.recallSelectStmt.get(key);
144
+ if (result) {
145
+ this.recallUpdateStmt.run(timestamp, key);
146
+ }
147
+ return result || null;
148
+ }
149
+ /**
150
+ * Delete a memory item
151
+ */
152
+ delete(key) {
153
+ // Also delete related relations
154
+ this.db.prepare(`DELETE FROM memory_relations WHERE sourceKey = ? OR targetKey = ?`).run(key, key);
155
+ const stmt = this.db.prepare(`DELETE FROM memories WHERE key = ?`);
156
+ const result = stmt.run(key);
157
+ return result.changes > 0;
158
+ }
159
+ /**
160
+ * Update a memory item's value
161
+ */
162
+ update(key, value) {
163
+ const timestamp = new Date().toISOString();
164
+ const stmt = this.db.prepare(`
165
+ UPDATE memories
166
+ SET value = ?, timestamp = ?, lastAccessed = ?
167
+ WHERE key = ?
168
+ `);
169
+ const result = stmt.run(value, timestamp, timestamp, key);
170
+ return result.changes > 0;
171
+ }
172
+ /**
173
+ * List all memories or filter by category
174
+ */
175
+ list(category) {
176
+ if (category) {
177
+ const stmt = this.db.prepare(`
178
+ SELECT * FROM memories WHERE category = ?
179
+ ORDER BY priority DESC, timestamp DESC
180
+ `);
181
+ return stmt.all(category);
182
+ }
183
+ else {
184
+ const stmt = this.db.prepare(`
185
+ SELECT * FROM memories
186
+ ORDER BY priority DESC, timestamp DESC
187
+ `);
188
+ return stmt.all();
189
+ }
190
+ }
191
+ /**
192
+ * Search memories by keyword
193
+ */
194
+ search(query) {
195
+ const stmt = this.db.prepare(`
196
+ SELECT * FROM memories
197
+ WHERE key LIKE ? OR value LIKE ?
198
+ ORDER BY priority DESC, timestamp DESC
199
+ `);
200
+ const pattern = `%${query}%`;
201
+ return stmt.all(pattern, pattern);
202
+ }
203
+ /**
204
+ * Get memories by priority level
205
+ */
206
+ getByPriority(priority) {
207
+ const stmt = this.db.prepare(`
208
+ SELECT * FROM memories
209
+ WHERE priority = ?
210
+ ORDER BY timestamp DESC
211
+ `);
212
+ return stmt.all(priority);
213
+ }
214
+ /**
215
+ * Update priority of a memory item
216
+ */
217
+ setPriority(key, priority) {
218
+ const stmt = this.db.prepare(`UPDATE memories SET priority = ? WHERE key = ?`);
219
+ const result = stmt.run(priority, key);
220
+ return result.changes > 0;
221
+ }
222
+ /**
223
+ * Get memory statistics
224
+ */
225
+ getStats() {
226
+ const categories = this.db.prepare(`
227
+ SELECT category, COUNT(*) as count
228
+ FROM memories
229
+ GROUP BY category
230
+ `).all();
231
+ const byCategory = {};
232
+ let total = 0;
233
+ categories.forEach(cat => {
234
+ byCategory[cat.category] = cat.count;
235
+ total += cat.count;
236
+ });
237
+ return { total, byCategory };
238
+ }
239
+ /**
240
+ * Get memories sorted by time
241
+ */
242
+ getTimeline(startDate, endDate, limit = 50) {
243
+ let sql = `SELECT * FROM memories WHERE 1=1`;
244
+ const params = [];
245
+ if (startDate) {
246
+ sql += ` AND timestamp >= ?`;
247
+ params.push(startDate);
248
+ }
249
+ if (endDate) {
250
+ sql += ` AND timestamp <= ?`;
251
+ params.push(endDate);
252
+ }
253
+ sql += ` ORDER BY timestamp DESC LIMIT ?`;
254
+ params.push(limit);
255
+ return this.db.prepare(sql).all(...params);
256
+ }
257
+ /**
258
+ * Get database instance (for KnowledgeGraph)
259
+ */
260
+ getDatabase() {
261
+ return this.db;
262
+ }
263
+ /**
264
+ * Get database path
265
+ */
266
+ getDbPath() {
267
+ return this.dbPath;
268
+ }
269
+ /**
270
+ * Close database connection
271
+ */
272
+ close() {
273
+ if (this.db) {
274
+ this.db.close();
275
+ }
276
+ }
277
+ }
278
+ //# sourceMappingURL=MemoryStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryStorage.js","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MemoryStorage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryStorage.test.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.test.ts"],"names":[],"mappings":""}