claude-conversation-memory-mcp 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/LICENSE +21 -0
- package/README.md +223 -0
- package/dist/ConversationMemory.d.ts +80 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +203 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/documentation/CodeAnalyzer.d.ts +29 -0
- package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
- package/dist/documentation/CodeAnalyzer.js +122 -0
- package/dist/documentation/CodeAnalyzer.js.map +1 -0
- package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
- package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
- package/dist/documentation/ConversationAnalyzer.js +156 -0
- package/dist/documentation/ConversationAnalyzer.js.map +1 -0
- package/dist/documentation/CrossReferencer.d.ts +67 -0
- package/dist/documentation/CrossReferencer.d.ts.map +1 -0
- package/dist/documentation/CrossReferencer.js +247 -0
- package/dist/documentation/CrossReferencer.js.map +1 -0
- package/dist/documentation/DocumentationGenerator.d.ts +22 -0
- package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
- package/dist/documentation/DocumentationGenerator.js +57 -0
- package/dist/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/documentation/MarkdownFormatter.d.ts +26 -0
- package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
- package/dist/documentation/MarkdownFormatter.js +301 -0
- package/dist/documentation/MarkdownFormatter.js.map +1 -0
- package/dist/documentation/types.d.ts +176 -0
- package/dist/documentation/types.d.ts.map +1 -0
- package/dist/documentation/types.js +5 -0
- package/dist/documentation/types.js.map +1 -0
- package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
- package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingConfig.js +132 -0
- package/dist/embeddings/EmbeddingConfig.js.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +129 -0
- package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
- package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingProvider.js +6 -0
- package/dist/embeddings/EmbeddingProvider.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +75 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +220 -0
- package/dist/embeddings/VectorStore.js.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +138 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +325 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +76 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +305 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +71 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +283 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +86 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +341 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +70 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +252 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +90 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +352 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +53 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +249 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +88 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +281 -0
- package/dist/storage/SQLiteManager.js.map +1 -0
- package/dist/storage/migrations.d.ts +54 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +153 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +321 -0
- package/dist/tools/ToolDefinitions.d.ts +265 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +261 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +56 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +431 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +333 -0
- package/dist/types/ToolTypes.d.ts.map +1 -0
- package/dist/types/ToolTypes.js +6 -0
- package/dist/types/ToolTypes.js.map +1 -0
- package/dist/utils/sanitization.d.ts +35 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +97 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Storage Layer
|
|
3
|
+
* CRUD operations for all conversation-related data
|
|
4
|
+
*/
|
|
5
|
+
import { sanitizeForLike } from "../utils/sanitization.js";
|
|
6
|
+
export class ConversationStorage {
|
|
7
|
+
db;
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
}
|
|
11
|
+
// ==================== Conversations ====================
|
|
12
|
+
async storeConversations(conversations) {
|
|
13
|
+
const stmt = this.db.prepare(`
|
|
14
|
+
INSERT OR REPLACE INTO conversations
|
|
15
|
+
(id, project_path, first_message_at, last_message_at, message_count,
|
|
16
|
+
git_branch, claude_version, metadata, created_at, updated_at)
|
|
17
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
18
|
+
`);
|
|
19
|
+
this.db.transaction(() => {
|
|
20
|
+
for (const conv of conversations) {
|
|
21
|
+
stmt.run(conv.id, conv.project_path, conv.first_message_at, conv.last_message_at, conv.message_count, conv.git_branch, conv.claude_version, JSON.stringify(conv.metadata), conv.created_at, conv.updated_at);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
console.log(`✓ Stored ${conversations.length} conversations`);
|
|
25
|
+
}
|
|
26
|
+
getConversation(id) {
|
|
27
|
+
const row = this.db
|
|
28
|
+
.prepare("SELECT * FROM conversations WHERE id = ?")
|
|
29
|
+
.get(id);
|
|
30
|
+
if (!row) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
...row,
|
|
35
|
+
metadata: JSON.parse(row.metadata || "{}"),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// ==================== Messages ====================
|
|
39
|
+
async storeMessages(messages) {
|
|
40
|
+
const stmt = this.db.prepare(`
|
|
41
|
+
INSERT OR REPLACE INTO messages
|
|
42
|
+
(id, conversation_id, parent_id, message_type, role, content,
|
|
43
|
+
timestamp, is_sidechain, agent_id, request_id, git_branch, cwd, metadata)
|
|
44
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
45
|
+
`);
|
|
46
|
+
this.db.transaction(() => {
|
|
47
|
+
for (const msg of messages) {
|
|
48
|
+
stmt.run(msg.id, msg.conversation_id, msg.parent_id || null, msg.message_type, msg.role || null, msg.content || null, msg.timestamp, msg.is_sidechain ? 1 : 0, msg.agent_id || null, msg.request_id || null, msg.git_branch || null, msg.cwd || null, JSON.stringify(msg.metadata));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
console.log(`✓ Stored ${messages.length} messages`);
|
|
52
|
+
}
|
|
53
|
+
// ==================== Tool Uses ====================
|
|
54
|
+
async storeToolUses(toolUses) {
|
|
55
|
+
const stmt = this.db.prepare(`
|
|
56
|
+
INSERT OR REPLACE INTO tool_uses
|
|
57
|
+
(id, message_id, tool_name, tool_input, timestamp)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?)
|
|
59
|
+
`);
|
|
60
|
+
this.db.transaction(() => {
|
|
61
|
+
for (const tool of toolUses) {
|
|
62
|
+
stmt.run(tool.id, tool.message_id, tool.tool_name, JSON.stringify(tool.tool_input), tool.timestamp);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
console.log(`✓ Stored ${toolUses.length} tool uses`);
|
|
66
|
+
}
|
|
67
|
+
// ==================== Tool Results ====================
|
|
68
|
+
async storeToolResults(toolResults) {
|
|
69
|
+
const stmt = this.db.prepare(`
|
|
70
|
+
INSERT OR REPLACE INTO tool_results
|
|
71
|
+
(id, tool_use_id, message_id, content, is_error, stdout, stderr, is_image, timestamp)
|
|
72
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
73
|
+
`);
|
|
74
|
+
this.db.transaction(() => {
|
|
75
|
+
for (const result of toolResults) {
|
|
76
|
+
stmt.run(result.id, result.tool_use_id, result.message_id, result.content || null, result.is_error ? 1 : 0, result.stdout || null, result.stderr || null, result.is_image ? 1 : 0, result.timestamp);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
console.log(`✓ Stored ${toolResults.length} tool results`);
|
|
80
|
+
}
|
|
81
|
+
// ==================== File Edits ====================
|
|
82
|
+
async storeFileEdits(fileEdits) {
|
|
83
|
+
const stmt = this.db.prepare(`
|
|
84
|
+
INSERT OR REPLACE INTO file_edits
|
|
85
|
+
(id, conversation_id, file_path, message_id, backup_version,
|
|
86
|
+
backup_time, snapshot_timestamp, metadata)
|
|
87
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
88
|
+
`);
|
|
89
|
+
this.db.transaction(() => {
|
|
90
|
+
for (const edit of fileEdits) {
|
|
91
|
+
stmt.run(edit.id, edit.conversation_id, edit.file_path, edit.message_id, edit.backup_version || null, edit.backup_time || null, edit.snapshot_timestamp, JSON.stringify(edit.metadata));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
console.log(`✓ Stored ${fileEdits.length} file edits`);
|
|
95
|
+
}
|
|
96
|
+
getFileEdits(filePath) {
|
|
97
|
+
return this.db
|
|
98
|
+
.prepare("SELECT * FROM file_edits WHERE file_path = ? ORDER BY snapshot_timestamp DESC")
|
|
99
|
+
.all(filePath);
|
|
100
|
+
}
|
|
101
|
+
// ==================== Thinking Blocks ====================
|
|
102
|
+
async storeThinkingBlocks(blocks) {
|
|
103
|
+
const stmt = this.db.prepare(`
|
|
104
|
+
INSERT OR REPLACE INTO thinking_blocks
|
|
105
|
+
(id, message_id, thinking_content, signature, timestamp)
|
|
106
|
+
VALUES (?, ?, ?, ?, ?)
|
|
107
|
+
`);
|
|
108
|
+
this.db.transaction(() => {
|
|
109
|
+
for (const block of blocks) {
|
|
110
|
+
stmt.run(block.id, block.message_id, block.thinking_content, block.signature || null, block.timestamp);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
console.log(`✓ Stored ${blocks.length} thinking blocks`);
|
|
114
|
+
}
|
|
115
|
+
// ==================== Decisions ====================
|
|
116
|
+
async storeDecisions(decisions) {
|
|
117
|
+
const stmt = this.db.prepare(`
|
|
118
|
+
INSERT OR REPLACE INTO decisions
|
|
119
|
+
(id, conversation_id, message_id, decision_text, rationale,
|
|
120
|
+
alternatives_considered, rejected_reasons, context, related_files,
|
|
121
|
+
related_commits, timestamp)
|
|
122
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
123
|
+
`);
|
|
124
|
+
this.db.transaction(() => {
|
|
125
|
+
for (const decision of decisions) {
|
|
126
|
+
stmt.run(decision.id, decision.conversation_id, decision.message_id, decision.decision_text, decision.rationale || null, JSON.stringify(decision.alternatives_considered), JSON.stringify(decision.rejected_reasons), decision.context || null, JSON.stringify(decision.related_files), JSON.stringify(decision.related_commits), decision.timestamp);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
console.log(`✓ Stored ${decisions.length} decisions`);
|
|
130
|
+
}
|
|
131
|
+
getDecisionsForFile(filePath) {
|
|
132
|
+
const sanitized = sanitizeForLike(filePath);
|
|
133
|
+
const rows = this.db
|
|
134
|
+
.prepare("SELECT * FROM decisions WHERE related_files LIKE ? ESCAPE '\\' ORDER BY timestamp DESC")
|
|
135
|
+
.all(`%"${sanitized}"%`);
|
|
136
|
+
return rows.map((row) => ({
|
|
137
|
+
...row,
|
|
138
|
+
alternatives_considered: JSON.parse(row.alternatives_considered || "[]"),
|
|
139
|
+
rejected_reasons: JSON.parse(row.rejected_reasons || "{}"),
|
|
140
|
+
related_files: JSON.parse(row.related_files || "[]"),
|
|
141
|
+
related_commits: JSON.parse(row.related_commits || "[]"),
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
// ==================== Git Commits ====================
|
|
145
|
+
async storeGitCommits(commits) {
|
|
146
|
+
const stmt = this.db.prepare(`
|
|
147
|
+
INSERT OR REPLACE INTO git_commits
|
|
148
|
+
(hash, message, author, timestamp, branch, files_changed,
|
|
149
|
+
conversation_id, related_message_id, metadata)
|
|
150
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
151
|
+
`);
|
|
152
|
+
this.db.transaction(() => {
|
|
153
|
+
for (const commit of commits) {
|
|
154
|
+
stmt.run(commit.hash, commit.message, commit.author || null, commit.timestamp, commit.branch || null, JSON.stringify(commit.files_changed), commit.conversation_id || null, commit.related_message_id || null, JSON.stringify(commit.metadata));
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
console.log(`✓ Stored ${commits.length} git commits`);
|
|
158
|
+
}
|
|
159
|
+
getCommitsForFile(filePath) {
|
|
160
|
+
const sanitized = sanitizeForLike(filePath);
|
|
161
|
+
const rows = this.db
|
|
162
|
+
.prepare("SELECT * FROM git_commits WHERE files_changed LIKE ? ESCAPE '\\' ORDER BY timestamp DESC")
|
|
163
|
+
.all(`%"${sanitized}"%`);
|
|
164
|
+
return rows.map((row) => ({
|
|
165
|
+
...row,
|
|
166
|
+
files_changed: JSON.parse(row.files_changed || "[]"),
|
|
167
|
+
metadata: JSON.parse(row.metadata || "{}"),
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
// ==================== Mistakes ====================
|
|
171
|
+
async storeMistakes(mistakes) {
|
|
172
|
+
const stmt = this.db.prepare(`
|
|
173
|
+
INSERT OR REPLACE INTO mistakes
|
|
174
|
+
(id, conversation_id, message_id, mistake_type, what_went_wrong,
|
|
175
|
+
correction, user_correction_message, files_affected, timestamp)
|
|
176
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
177
|
+
`);
|
|
178
|
+
this.db.transaction(() => {
|
|
179
|
+
for (const mistake of mistakes) {
|
|
180
|
+
stmt.run(mistake.id, mistake.conversation_id, mistake.message_id, mistake.mistake_type, mistake.what_went_wrong, mistake.correction || null, mistake.user_correction_message || null, JSON.stringify(mistake.files_affected), mistake.timestamp);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
console.log(`✓ Stored ${mistakes.length} mistakes`);
|
|
184
|
+
}
|
|
185
|
+
// ==================== Requirements ====================
|
|
186
|
+
async storeRequirements(requirements) {
|
|
187
|
+
const stmt = this.db.prepare(`
|
|
188
|
+
INSERT OR REPLACE INTO requirements
|
|
189
|
+
(id, type, description, rationale, affects_components,
|
|
190
|
+
conversation_id, message_id, timestamp)
|
|
191
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
192
|
+
`);
|
|
193
|
+
this.db.transaction(() => {
|
|
194
|
+
for (const req of requirements) {
|
|
195
|
+
stmt.run(req.id, req.type, req.description, req.rationale || null, JSON.stringify(req.affects_components), req.conversation_id, req.message_id, req.timestamp);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
console.log(`✓ Stored ${requirements.length} requirements`);
|
|
199
|
+
}
|
|
200
|
+
// ==================== Validations ====================
|
|
201
|
+
async storeValidations(validations) {
|
|
202
|
+
const stmt = this.db.prepare(`
|
|
203
|
+
INSERT OR REPLACE INTO validations
|
|
204
|
+
(id, conversation_id, what_was_tested, test_command, result,
|
|
205
|
+
performance_data, files_tested, timestamp)
|
|
206
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
207
|
+
`);
|
|
208
|
+
this.db.transaction(() => {
|
|
209
|
+
for (const val of validations) {
|
|
210
|
+
stmt.run(val.id, val.conversation_id, val.what_was_tested, val.test_command || null, val.result, val.performance_data ? JSON.stringify(val.performance_data) : null, JSON.stringify(val.files_tested), val.timestamp);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
console.log(`✓ Stored ${validations.length} validations`);
|
|
214
|
+
}
|
|
215
|
+
// ==================== Queries ====================
|
|
216
|
+
getFileTimeline(filePath) {
|
|
217
|
+
// Combine file edits, commits, and decisions
|
|
218
|
+
const edits = this.getFileEdits(filePath);
|
|
219
|
+
const commits = this.getCommitsForFile(filePath);
|
|
220
|
+
const decisions = this.getDecisionsForFile(filePath);
|
|
221
|
+
return {
|
|
222
|
+
file_path: filePath,
|
|
223
|
+
edits,
|
|
224
|
+
commits,
|
|
225
|
+
decisions,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
getStats() {
|
|
229
|
+
const stats = {
|
|
230
|
+
conversations: this.db
|
|
231
|
+
.prepare("SELECT COUNT(*) as count FROM conversations")
|
|
232
|
+
.get(),
|
|
233
|
+
messages: this.db
|
|
234
|
+
.prepare("SELECT COUNT(*) as count FROM messages")
|
|
235
|
+
.get(),
|
|
236
|
+
decisions: this.db
|
|
237
|
+
.prepare("SELECT COUNT(*) as count FROM decisions")
|
|
238
|
+
.get(),
|
|
239
|
+
mistakes: this.db
|
|
240
|
+
.prepare("SELECT COUNT(*) as count FROM mistakes")
|
|
241
|
+
.get(),
|
|
242
|
+
git_commits: this.db
|
|
243
|
+
.prepare("SELECT COUNT(*) as count FROM git_commits")
|
|
244
|
+
.get(),
|
|
245
|
+
};
|
|
246
|
+
return stats;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=ConversationStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationStorage.js","sourceRoot":"","sources":["../../src/storage/ConversationStorage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,EAAiB;QAAjB,OAAE,GAAF,EAAE,CAAe;IAAG,CAAC;IAEzC,0DAA0D;IAE1D,KAAK,CAAC,kBAAkB,CAAC,aAA6B;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC7B,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,CAChB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,aAAa,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAChE,CAAC;IAED,eAAe,CAAC,EAAU;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,0CAA0C,CAAC;aACnD,GAAG,CAAC,EAAE,CAAgC,CAAC;QAE1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,GAAG,GAAG;YACN,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,qDAAqD;IAErD,KAAK,CAAC,aAAa,CAAC,QAAmB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG,CACN,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,eAAe,EACnB,GAAG,CAAC,SAAS,IAAI,IAAI,EACrB,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,IAAI,IAAI,IAAI,EAChB,GAAG,CAAC,OAAO,IAAI,IAAI,EACnB,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACxB,GAAG,CAAC,QAAQ,IAAI,IAAI,EACpB,GAAG,CAAC,UAAU,IAAI,IAAI,EACtB,GAAG,CAAC,UAAU,IAAI,IAAI,EACtB,GAAG,CAAC,GAAG,IAAI,IAAI,EACf,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAC7B,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,sDAAsD;IAEtD,KAAK,CAAC,aAAa,CAAC,QAAmB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAC/B,IAAI,CAAC,SAAS,CACf,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,yDAAyD;IAEzD,KAAK,CAAC,gBAAgB,CAAC,WAAyB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,OAAO,IAAI,IAAI,EACtB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,MAAM,CAAC,MAAM,IAAI,IAAI,EACrB,MAAM,CAAC,MAAM,IAAI,IAAI,EACrB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,MAAM,CAAC,SAAS,CACjB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,MAAM,eAAe,CAAC,CAAC;IAC7D,CAAC;IAED,uDAAuD;IAEvD,KAAK,CAAC,cAAc,CAAC,SAAqB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,cAAc,IAAI,IAAI,EAC3B,IAAI,CAAC,WAAW,IAAI,IAAI,EACxB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC9B,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN,+EAA+E,CAChF;aACA,GAAG,CAAC,QAAQ,CAAe,CAAC;IACjC,CAAC;IAED,4DAA4D;IAE5D,KAAK,CAAC,mBAAmB,CAAC,MAAuB;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,SAAS,IAAI,IAAI,EACvB,KAAK,CAAC,SAAS,CAChB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED,sDAAsD;IAEtD,KAAK,CAAC,cAAc,CAAC,SAAqB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,GAAG,CACN,QAAQ,CAAC,EAAE,EACX,QAAQ,CAAC,eAAe,EACxB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,SAAS,IAAI,IAAI,EAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAChD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACzC,QAAQ,CAAC,OAAO,IAAI,IAAI,EACxB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,EACxC,QAAQ,CAAC,SAAS,CACnB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,mBAAmB,CAAC,QAAgB;QAClC,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,wFAAwF,CAAC;aACjG,GAAG,CAAC,KAAK,SAAS,IAAI,CAAkB,CAAC;QAE5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,GAAG,GAAG;YACN,uBAAuB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC;YACxE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;YAC1D,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;YACpD,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC;SACzD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,wDAAwD;IAExD,KAAK,CAAC,eAAe,CAAC,OAAoB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,MAAM,IAAI,IAAI,EACrB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,MAAM,IAAI,IAAI,EACrB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,EACpC,MAAM,CAAC,eAAe,IAAI,IAAI,EAC9B,MAAM,CAAC,kBAAkB,IAAI,IAAI,EACjC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAChC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;IACxD,CAAC;IAED,iBAAiB,CAAC,QAAgB;QAChC,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,0FAA0F,CAAC;aACnG,GAAG,CAAC,KAAK,SAAS,IAAI,CAAmB,CAAC;QAE7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,GAAG,GAAG;YACN,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;YACpD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;SAC3C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,qDAAqD;IAErD,KAAK,CAAC,aAAa,CAAC,QAAmB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,UAAU,IAAI,IAAI,EAC1B,OAAO,CAAC,uBAAuB,IAAI,IAAI,EACvC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,EACtC,OAAO,CAAC,SAAS,CAClB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,yDAAyD;IAEzD,KAAK,CAAC,iBAAiB,CAAC,YAA2B;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CACN,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,SAAS,IAAI,IAAI,EACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,EACtC,GAAG,CAAC,eAAe,EACnB,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,SAAS,CACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,MAAM,eAAe,CAAC,CAAC;IAC9D,CAAC;IAED,wDAAwD;IAExD,KAAK,CAAC,gBAAgB,CAAC,WAAyB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,IAAI,CAAC,GAAG,CACN,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,eAAe,EACnB,GAAG,CAAC,eAAe,EACnB,GAAG,CAAC,YAAY,IAAI,IAAI,EACxB,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,EAChC,GAAG,CAAC,SAAS,CACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,MAAM,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,oDAAoD;IAEpD,eAAe,CAAC,QAAgB;QAM9B,6CAA6C;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAErD,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,KAAK;YACL,OAAO;YACP,SAAS;SACV,CAAC;IACJ,CAAC;IAED,QAAQ;QAON,MAAM,KAAK,GAAG;YACZ,aAAa,EAAE,IAAI,CAAC,EAAE;iBACnB,OAAO,CAAC,6CAA6C,CAAC;iBACtD,GAAG,EAAuB;YAC7B,QAAQ,EAAE,IAAI,CAAC,EAAE;iBACd,OAAO,CAAC,wCAAwC,CAAC;iBACjD,GAAG,EAAuB;YAC7B,SAAS,EAAE,IAAI,CAAC,EAAE;iBACf,OAAO,CAAC,yCAAyC,CAAC;iBAClD,GAAG,EAAuB;YAC7B,QAAQ,EAAE,IAAI,CAAC,EAAE;iBACd,OAAO,CAAC,wCAAwC,CAAC;iBACjD,GAAG,EAAuB;YAC7B,WAAW,EAAE,IAAI,CAAC,EAAE;iBACjB,OAAO,CAAC,2CAA2C,CAAC;iBACpD,GAAG,EAAuB;SAC9B,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Manager with optimized settings
|
|
3
|
+
* Based on patterns from code-graph-rag-mcp for maximum performance
|
|
4
|
+
*/
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
export interface SQLiteConfig {
|
|
7
|
+
dbPath?: string;
|
|
8
|
+
projectPath?: string;
|
|
9
|
+
readOnly?: boolean;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class SQLiteManager {
|
|
13
|
+
private db;
|
|
14
|
+
private dbPath;
|
|
15
|
+
private isReadOnly;
|
|
16
|
+
constructor(config?: SQLiteConfig);
|
|
17
|
+
private ensureDirectoryExists;
|
|
18
|
+
/**
|
|
19
|
+
* Load sqlite-vec extension for vector search
|
|
20
|
+
*/
|
|
21
|
+
private loadVectorExtension;
|
|
22
|
+
/**
|
|
23
|
+
* Create sqlite-vec virtual tables for vector search with specified dimensions
|
|
24
|
+
* Public method called when embedding provider dimensions are known
|
|
25
|
+
*/
|
|
26
|
+
createVecTablesWithDimensions(dimensions: number): void;
|
|
27
|
+
/**
|
|
28
|
+
* Apply performance optimizations
|
|
29
|
+
* Based on code-graph-rag-mcp sqlite-manager.ts
|
|
30
|
+
*/
|
|
31
|
+
private optimizeDatabase;
|
|
32
|
+
/**
|
|
33
|
+
* Initialize database schema from schema.sql
|
|
34
|
+
*/
|
|
35
|
+
private initializeSchema;
|
|
36
|
+
/**
|
|
37
|
+
* Get the underlying database instance
|
|
38
|
+
*/
|
|
39
|
+
getDatabase(): Database.Database;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a transaction
|
|
42
|
+
*/
|
|
43
|
+
transaction<T>(fn: () => T): T;
|
|
44
|
+
/**
|
|
45
|
+
* Prepare a statement
|
|
46
|
+
*/
|
|
47
|
+
prepare<T extends unknown[] = unknown[]>(sql: string): Database.Statement<T>;
|
|
48
|
+
/**
|
|
49
|
+
* Execute SQL directly
|
|
50
|
+
*/
|
|
51
|
+
exec(sql: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Close the database connection
|
|
54
|
+
*/
|
|
55
|
+
close(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Get database statistics
|
|
58
|
+
*/
|
|
59
|
+
getStats(): {
|
|
60
|
+
dbPath: string;
|
|
61
|
+
fileSize: number;
|
|
62
|
+
pageCount: number;
|
|
63
|
+
pageSize: number;
|
|
64
|
+
wal: {
|
|
65
|
+
enabled: boolean;
|
|
66
|
+
size: number | null;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Vacuum the database to reclaim space
|
|
71
|
+
*/
|
|
72
|
+
vacuum(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Analyze the database for query optimization
|
|
75
|
+
*/
|
|
76
|
+
analyze(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Checkpoint the WAL file
|
|
79
|
+
*/
|
|
80
|
+
checkpoint(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get current schema version
|
|
83
|
+
*/
|
|
84
|
+
getSchemaVersion(): number;
|
|
85
|
+
}
|
|
86
|
+
export declare function getSQLiteManager(config?: SQLiteConfig): SQLiteManager;
|
|
87
|
+
export declare function resetSQLiteManager(): void;
|
|
88
|
+
//# sourceMappingURL=SQLiteManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLiteManager.d.ts","sourceRoot":"","sources":["../../src/storage/SQLiteManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAkBtC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAU;gBAEhB,MAAM,GAAE,YAAiB;IAyCrC,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;;OAGG;IACH,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAyCvD;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmCxB;;OAEG;IACH,WAAW,IAAI,QAAQ,CAAC,QAAQ;IAIhC;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAK9B;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAI5E;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,QAAQ,IAAI;QACV,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;KAChD;IA+BD;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAU3B;AAKD,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,aAAa,CAKrE;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Manager with optimized settings
|
|
3
|
+
* Based on patterns from code-graph-rag-mcp for maximum performance
|
|
4
|
+
*/
|
|
5
|
+
import Database from "better-sqlite3";
|
|
6
|
+
import { readFileSync } from "fs";
|
|
7
|
+
import { join, dirname } from "path";
|
|
8
|
+
import { homedir } from "os";
|
|
9
|
+
import { mkdirSync, existsSync } from "fs";
|
|
10
|
+
import { fileURLToPath } from "url";
|
|
11
|
+
import { pathToProjectFolderName } from "../utils/sanitization.js";
|
|
12
|
+
import * as sqliteVec from "sqlite-vec";
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = dirname(__filename);
|
|
15
|
+
// Performance constants (from code-graph-rag-mcp)
|
|
16
|
+
const CACHE_SIZE_KB = 64000; // 64MB cache
|
|
17
|
+
const MMAP_SIZE = 30000000000; // 30GB memory-mapped I/O
|
|
18
|
+
const PAGE_SIZE = 4096; // 4KB page size
|
|
19
|
+
const WAL_AUTOCHECKPOINT = 1000; // Checkpoint WAL after 1000 pages
|
|
20
|
+
export class SQLiteManager {
|
|
21
|
+
db;
|
|
22
|
+
dbPath;
|
|
23
|
+
isReadOnly;
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
// Determine database location
|
|
26
|
+
if (config.dbPath) {
|
|
27
|
+
// Explicit path provided
|
|
28
|
+
this.dbPath = config.dbPath;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Per-project database in ~/.claude/projects/{project-folder}/
|
|
32
|
+
const projectPath = config.projectPath || process.cwd();
|
|
33
|
+
const projectFolderName = pathToProjectFolderName(projectPath);
|
|
34
|
+
this.dbPath = join(homedir(), ".claude", "projects", projectFolderName, ".claude-conversations-memory.db");
|
|
35
|
+
}
|
|
36
|
+
this.isReadOnly = config.readOnly || false;
|
|
37
|
+
// Ensure directory exists
|
|
38
|
+
this.ensureDirectoryExists();
|
|
39
|
+
// Initialize database
|
|
40
|
+
this.db = new Database(this.dbPath, {
|
|
41
|
+
readonly: this.isReadOnly,
|
|
42
|
+
verbose: config.verbose ? console.log : undefined,
|
|
43
|
+
});
|
|
44
|
+
// Load sqlite-vec extension
|
|
45
|
+
this.loadVectorExtension();
|
|
46
|
+
// Apply optimized PRAGMAs
|
|
47
|
+
this.optimizeDatabase();
|
|
48
|
+
// Initialize schema if needed
|
|
49
|
+
if (!this.isReadOnly) {
|
|
50
|
+
this.initializeSchema();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
ensureDirectoryExists() {
|
|
54
|
+
const dir = dirname(this.dbPath);
|
|
55
|
+
if (!existsSync(dir)) {
|
|
56
|
+
mkdirSync(dir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load sqlite-vec extension for vector search
|
|
61
|
+
*/
|
|
62
|
+
loadVectorExtension() {
|
|
63
|
+
try {
|
|
64
|
+
sqliteVec.load(this.db);
|
|
65
|
+
console.log("✓ sqlite-vec extension loaded");
|
|
66
|
+
// Note: Vec tables will be created when embedding dimensions are known
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.warn("⚠️ Failed to load sqlite-vec extension:", error.message);
|
|
70
|
+
console.warn(" Vector search will use BLOB fallback");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create sqlite-vec virtual tables for vector search with specified dimensions
|
|
75
|
+
* Public method called when embedding provider dimensions are known
|
|
76
|
+
*/
|
|
77
|
+
createVecTablesWithDimensions(dimensions) {
|
|
78
|
+
try {
|
|
79
|
+
// Check if tables already exist with correct dimensions
|
|
80
|
+
// If they exist with different dimensions, we need to drop and recreate
|
|
81
|
+
try {
|
|
82
|
+
const result = this.db.prepare("SELECT 1 FROM vec_message_embeddings LIMIT 1").get();
|
|
83
|
+
if (result) {
|
|
84
|
+
// Tables exist, assume they have correct dimensions
|
|
85
|
+
// (Recreating would lose data)
|
|
86
|
+
console.log(`✓ sqlite-vec virtual tables already exist`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Tables don't exist, create them
|
|
92
|
+
}
|
|
93
|
+
// Create message embeddings virtual table
|
|
94
|
+
this.db.exec(`
|
|
95
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_message_embeddings
|
|
96
|
+
USING vec0(
|
|
97
|
+
id TEXT PRIMARY KEY,
|
|
98
|
+
embedding float[${dimensions}]
|
|
99
|
+
)
|
|
100
|
+
`);
|
|
101
|
+
// Create decision embeddings virtual table
|
|
102
|
+
this.db.exec(`
|
|
103
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_decision_embeddings
|
|
104
|
+
USING vec0(
|
|
105
|
+
id TEXT PRIMARY KEY,
|
|
106
|
+
embedding float[${dimensions}]
|
|
107
|
+
)
|
|
108
|
+
`);
|
|
109
|
+
console.log(`✓ sqlite-vec virtual tables created (${dimensions} dimensions)`);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.warn("⚠️ Failed to create vec virtual tables:", error.message);
|
|
113
|
+
console.warn(" Will fall back to BLOB storage");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Apply performance optimizations
|
|
118
|
+
* Based on code-graph-rag-mcp sqlite-manager.ts
|
|
119
|
+
*/
|
|
120
|
+
optimizeDatabase() {
|
|
121
|
+
// WAL mode for concurrent reads during writes
|
|
122
|
+
this.db.pragma("journal_mode = WAL");
|
|
123
|
+
// 64MB cache for better performance
|
|
124
|
+
this.db.pragma(`cache_size = -${CACHE_SIZE_KB}`);
|
|
125
|
+
// NORMAL synchronous for balance between safety and speed
|
|
126
|
+
this.db.pragma("synchronous = NORMAL");
|
|
127
|
+
// Store temp tables in memory
|
|
128
|
+
this.db.pragma("temp_store = MEMORY");
|
|
129
|
+
// Memory-mapped I/O for faster access
|
|
130
|
+
this.db.pragma(`mmap_size = ${MMAP_SIZE}`);
|
|
131
|
+
// 4KB page size (optimal for most systems)
|
|
132
|
+
this.db.pragma(`page_size = ${PAGE_SIZE}`);
|
|
133
|
+
// Auto-checkpoint WAL after 1000 pages
|
|
134
|
+
this.db.pragma(`wal_autocheckpoint = ${WAL_AUTOCHECKPOINT}`);
|
|
135
|
+
// Enable foreign key constraints
|
|
136
|
+
this.db.pragma("foreign_keys = ON");
|
|
137
|
+
// Analysis for query optimization
|
|
138
|
+
this.db.pragma("optimize");
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Initialize database schema from schema.sql
|
|
142
|
+
*/
|
|
143
|
+
initializeSchema() {
|
|
144
|
+
try {
|
|
145
|
+
// Check if schema is already initialized
|
|
146
|
+
const tables = this.db
|
|
147
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='schema_version'")
|
|
148
|
+
.all();
|
|
149
|
+
if (tables.length === 0) {
|
|
150
|
+
console.log("Initializing database schema...");
|
|
151
|
+
// Read and execute schema.sql
|
|
152
|
+
const schemaPath = join(__dirname, "schema.sql");
|
|
153
|
+
const schema = readFileSync(schemaPath, "utf-8");
|
|
154
|
+
// Execute the entire schema at once
|
|
155
|
+
// SQLite can handle multiple statements in a single exec() call
|
|
156
|
+
this.db.exec(schema);
|
|
157
|
+
// Record schema version
|
|
158
|
+
this.db
|
|
159
|
+
.prepare("INSERT INTO schema_version (version, applied_at, description) VALUES (?, ?, ?)")
|
|
160
|
+
.run(1, Date.now(), "Initial schema");
|
|
161
|
+
console.log("Database schema initialized successfully");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error("Error initializing schema:", error);
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get the underlying database instance
|
|
171
|
+
*/
|
|
172
|
+
getDatabase() {
|
|
173
|
+
return this.db;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Execute a transaction
|
|
177
|
+
*/
|
|
178
|
+
transaction(fn) {
|
|
179
|
+
const tx = this.db.transaction(fn);
|
|
180
|
+
return tx();
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Prepare a statement
|
|
184
|
+
*/
|
|
185
|
+
prepare(sql) {
|
|
186
|
+
return this.db.prepare(sql);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Execute SQL directly
|
|
190
|
+
*/
|
|
191
|
+
exec(sql) {
|
|
192
|
+
this.db.exec(sql);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Close the database connection
|
|
196
|
+
*/
|
|
197
|
+
close() {
|
|
198
|
+
if (this.db.open) {
|
|
199
|
+
this.db.close();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get database statistics
|
|
204
|
+
*/
|
|
205
|
+
getStats() {
|
|
206
|
+
const pageCount = this.db.pragma("page_count", { simple: true });
|
|
207
|
+
const pageSize = this.db.pragma("page_size", { simple: true });
|
|
208
|
+
const journalMode = this.db.pragma("journal_mode", {
|
|
209
|
+
simple: true,
|
|
210
|
+
});
|
|
211
|
+
let walSize = null;
|
|
212
|
+
if (journalMode === "wal") {
|
|
213
|
+
try {
|
|
214
|
+
const walStat = this.db
|
|
215
|
+
.prepare("SELECT * FROM pragma_wal_checkpoint('PASSIVE')")
|
|
216
|
+
.get();
|
|
217
|
+
walSize = walStat?.log ?? null;
|
|
218
|
+
}
|
|
219
|
+
catch (_e) {
|
|
220
|
+
// WAL not available
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
dbPath: this.dbPath,
|
|
225
|
+
fileSize: pageCount * pageSize,
|
|
226
|
+
pageCount,
|
|
227
|
+
pageSize,
|
|
228
|
+
wal: {
|
|
229
|
+
enabled: journalMode === "wal",
|
|
230
|
+
size: walSize,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Vacuum the database to reclaim space
|
|
236
|
+
*/
|
|
237
|
+
vacuum() {
|
|
238
|
+
this.db.exec("VACUUM");
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Analyze the database for query optimization
|
|
242
|
+
*/
|
|
243
|
+
analyze() {
|
|
244
|
+
this.db.exec("ANALYZE");
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Checkpoint the WAL file
|
|
248
|
+
*/
|
|
249
|
+
checkpoint() {
|
|
250
|
+
this.db.pragma("wal_checkpoint(TRUNCATE)");
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get current schema version
|
|
254
|
+
*/
|
|
255
|
+
getSchemaVersion() {
|
|
256
|
+
try {
|
|
257
|
+
const result = this.db
|
|
258
|
+
.prepare("SELECT MAX(version) as version FROM schema_version")
|
|
259
|
+
.get();
|
|
260
|
+
return result?.version || 0;
|
|
261
|
+
}
|
|
262
|
+
catch (_error) {
|
|
263
|
+
return 0;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Singleton instance
|
|
268
|
+
let instance = null;
|
|
269
|
+
export function getSQLiteManager(config) {
|
|
270
|
+
if (!instance) {
|
|
271
|
+
instance = new SQLiteManager(config);
|
|
272
|
+
}
|
|
273
|
+
return instance;
|
|
274
|
+
}
|
|
275
|
+
export function resetSQLiteManager() {
|
|
276
|
+
if (instance) {
|
|
277
|
+
instance.close();
|
|
278
|
+
instance = null;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=SQLiteManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLiteManager.js","sourceRoot":"","sources":["../../src/storage/SQLiteManager.ts"],"names":[],"mappings":"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"}
|