@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.
- package/commands/vibe.run.md +11 -13
- package/commands/vibe.spec.md +161 -37
- package/dist/lib/MemoryManager.d.ts +13 -155
- package/dist/lib/MemoryManager.d.ts.map +1 -1
- package/dist/lib/MemoryManager.js +52 -617
- package/dist/lib/MemoryManager.js.map +1 -1
- package/dist/lib/memory/KnowledgeGraph.d.ts +34 -0
- package/dist/lib/memory/KnowledgeGraph.d.ts.map +1 -0
- package/dist/lib/memory/KnowledgeGraph.js +216 -0
- package/dist/lib/memory/KnowledgeGraph.js.map +1 -0
- package/dist/lib/memory/KnowledgeGraph.test.d.ts +2 -0
- package/dist/lib/memory/KnowledgeGraph.test.d.ts.map +1 -0
- package/dist/lib/memory/KnowledgeGraph.test.js +189 -0
- package/dist/lib/memory/KnowledgeGraph.test.js.map +1 -0
- package/dist/lib/memory/MemorySearch.d.ts +25 -0
- package/dist/lib/memory/MemorySearch.d.ts.map +1 -0
- package/dist/lib/memory/MemorySearch.js +85 -0
- package/dist/lib/memory/MemorySearch.js.map +1 -0
- package/dist/lib/memory/MemorySearch.test.d.ts +2 -0
- package/dist/lib/memory/MemorySearch.test.d.ts.map +1 -0
- package/dist/lib/memory/MemorySearch.test.js +149 -0
- package/dist/lib/memory/MemorySearch.test.js.map +1 -0
- package/dist/lib/memory/MemoryStorage.d.ts +77 -0
- package/dist/lib/memory/MemoryStorage.d.ts.map +1 -0
- package/dist/lib/memory/MemoryStorage.js +278 -0
- package/dist/lib/memory/MemoryStorage.js.map +1 -0
- package/dist/lib/memory/MemoryStorage.test.d.ts +2 -0
- package/dist/lib/memory/MemoryStorage.test.d.ts.map +1 -0
- package/dist/lib/memory/MemoryStorage.test.js +198 -0
- package/dist/lib/memory/MemoryStorage.test.js.map +1 -0
- package/dist/lib/memory/index.d.ts +4 -0
- package/dist/lib/memory/index.d.ts.map +1 -0
- package/dist/lib/memory/index.js +8 -0
- package/dist/lib/memory/index.js.map +1 -0
- package/dist/tools/convention/analyzeComplexity.d.ts +3 -1
- package/dist/tools/convention/analyzeComplexity.d.ts.map +1 -1
- package/dist/tools/convention/analyzeComplexity.js +99 -1
- package/dist/tools/convention/analyzeComplexity.js.map +1 -1
- package/dist/tools/convention/analyzeComplexity.test.d.ts +2 -0
- package/dist/tools/convention/analyzeComplexity.test.d.ts.map +1 -0
- package/dist/tools/convention/analyzeComplexity.test.js +207 -0
- package/dist/tools/convention/analyzeComplexity.test.js.map +1 -0
- package/dist/tools/convention/validateCodeQuality.d.ts +3 -1
- package/dist/tools/convention/validateCodeQuality.d.ts.map +1 -1
- package/dist/tools/convention/validateCodeQuality.js +144 -1
- package/dist/tools/convention/validateCodeQuality.js.map +1 -1
- package/dist/tools/convention/validateCodeQuality.test.d.ts +2 -0
- package/dist/tools/convention/validateCodeQuality.test.d.ts.map +1 -0
- package/dist/tools/convention/validateCodeQuality.test.js +230 -0
- package/dist/tools/convention/validateCodeQuality.test.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryStorage.test.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/MemoryStorage.test.ts"],"names":[],"mappings":""}
|