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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/ConversationMemory.d.ts +80 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +203 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  8. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  9. package/dist/documentation/CodeAnalyzer.js +122 -0
  10. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  11. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  12. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  13. package/dist/documentation/ConversationAnalyzer.js +156 -0
  14. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  15. package/dist/documentation/CrossReferencer.d.ts +67 -0
  16. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  17. package/dist/documentation/CrossReferencer.js +247 -0
  18. package/dist/documentation/CrossReferencer.js.map +1 -0
  19. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  20. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  21. package/dist/documentation/DocumentationGenerator.js +57 -0
  22. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  23. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  24. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  25. package/dist/documentation/MarkdownFormatter.js +301 -0
  26. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  27. package/dist/documentation/types.d.ts +176 -0
  28. package/dist/documentation/types.d.ts.map +1 -0
  29. package/dist/documentation/types.js +5 -0
  30. package/dist/documentation/types.js.map +1 -0
  31. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  32. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  33. package/dist/embeddings/EmbeddingConfig.js +132 -0
  34. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  35. package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
  36. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  37. package/dist/embeddings/EmbeddingGenerator.js +129 -0
  38. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  39. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  40. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  41. package/dist/embeddings/EmbeddingProvider.js +6 -0
  42. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  43. package/dist/embeddings/VectorStore.d.ts +75 -0
  44. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  45. package/dist/embeddings/VectorStore.js +220 -0
  46. package/dist/embeddings/VectorStore.js.map +1 -0
  47. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  48. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  49. package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
  50. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  51. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  52. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  53. package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
  54. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  55. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  56. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  57. package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
  58. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  59. package/dist/index.d.ts +7 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +127 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/parsers/ConversationParser.d.ts +138 -0
  64. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  65. package/dist/parsers/ConversationParser.js +325 -0
  66. package/dist/parsers/ConversationParser.js.map +1 -0
  67. package/dist/parsers/DecisionExtractor.d.ts +76 -0
  68. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  69. package/dist/parsers/DecisionExtractor.js +305 -0
  70. package/dist/parsers/DecisionExtractor.js.map +1 -0
  71. package/dist/parsers/GitIntegrator.d.ts +71 -0
  72. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  73. package/dist/parsers/GitIntegrator.js +283 -0
  74. package/dist/parsers/GitIntegrator.js.map +1 -0
  75. package/dist/parsers/MistakeExtractor.d.ts +86 -0
  76. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  77. package/dist/parsers/MistakeExtractor.js +341 -0
  78. package/dist/parsers/MistakeExtractor.js.map +1 -0
  79. package/dist/parsers/RequirementsExtractor.d.ts +70 -0
  80. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  81. package/dist/parsers/RequirementsExtractor.js +252 -0
  82. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  83. package/dist/search/SemanticSearch.d.ts +90 -0
  84. package/dist/search/SemanticSearch.d.ts.map +1 -0
  85. package/dist/search/SemanticSearch.js +352 -0
  86. package/dist/search/SemanticSearch.js.map +1 -0
  87. package/dist/storage/ConversationStorage.d.ts +53 -0
  88. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  89. package/dist/storage/ConversationStorage.js +249 -0
  90. package/dist/storage/ConversationStorage.js.map +1 -0
  91. package/dist/storage/SQLiteManager.d.ts +88 -0
  92. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  93. package/dist/storage/SQLiteManager.js +281 -0
  94. package/dist/storage/SQLiteManager.js.map +1 -0
  95. package/dist/storage/migrations.d.ts +54 -0
  96. package/dist/storage/migrations.d.ts.map +1 -0
  97. package/dist/storage/migrations.js +153 -0
  98. package/dist/storage/migrations.js.map +1 -0
  99. package/dist/storage/schema.sql +321 -0
  100. package/dist/tools/ToolDefinitions.d.ts +265 -0
  101. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  102. package/dist/tools/ToolDefinitions.js +261 -0
  103. package/dist/tools/ToolDefinitions.js.map +1 -0
  104. package/dist/tools/ToolHandlers.d.ts +56 -0
  105. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  106. package/dist/tools/ToolHandlers.js +431 -0
  107. package/dist/tools/ToolHandlers.js.map +1 -0
  108. package/dist/types/ToolTypes.d.ts +333 -0
  109. package/dist/types/ToolTypes.d.ts.map +1 -0
  110. package/dist/types/ToolTypes.js +6 -0
  111. package/dist/types/ToolTypes.js.map +1 -0
  112. package/dist/utils/sanitization.d.ts +35 -0
  113. package/dist/utils/sanitization.d.ts.map +1 -0
  114. package/dist/utils/sanitization.js +97 -0
  115. package/dist/utils/sanitization.js.map +1 -0
  116. 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":"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"}
@@ -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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"}