cccmemory 1.8.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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -0
  3. package/dist/ConversationMemory.d.ts +231 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +357 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/cache/QueryCache.d.ts +215 -0
  8. package/dist/cache/QueryCache.d.ts.map +1 -0
  9. package/dist/cache/QueryCache.js +294 -0
  10. package/dist/cache/QueryCache.js.map +1 -0
  11. package/dist/cli/commands.d.ts +9 -0
  12. package/dist/cli/commands.d.ts.map +1 -0
  13. package/dist/cli/commands.js +954 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/cli/help.d.ts +16 -0
  16. package/dist/cli/help.d.ts.map +1 -0
  17. package/dist/cli/help.js +361 -0
  18. package/dist/cli/help.js.map +1 -0
  19. package/dist/cli/index.d.ts +30 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +111 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/context/ContextInjector.d.ts +38 -0
  24. package/dist/context/ContextInjector.d.ts.map +1 -0
  25. package/dist/context/ContextInjector.js +235 -0
  26. package/dist/context/ContextInjector.js.map +1 -0
  27. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  28. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  29. package/dist/documentation/CodeAnalyzer.js +122 -0
  30. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  31. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  32. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  33. package/dist/documentation/ConversationAnalyzer.js +157 -0
  34. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  35. package/dist/documentation/CrossReferencer.d.ts +67 -0
  36. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  37. package/dist/documentation/CrossReferencer.js +247 -0
  38. package/dist/documentation/CrossReferencer.js.map +1 -0
  39. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  40. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  41. package/dist/documentation/DocumentationGenerator.js +57 -0
  42. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  43. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  44. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  45. package/dist/documentation/MarkdownFormatter.js +301 -0
  46. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  47. package/dist/documentation/types.d.ts +176 -0
  48. package/dist/documentation/types.d.ts.map +1 -0
  49. package/dist/documentation/types.js +5 -0
  50. package/dist/documentation/types.js.map +1 -0
  51. package/dist/embeddings/ConfigManager.d.ts +46 -0
  52. package/dist/embeddings/ConfigManager.d.ts.map +1 -0
  53. package/dist/embeddings/ConfigManager.js +177 -0
  54. package/dist/embeddings/ConfigManager.js.map +1 -0
  55. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  56. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  57. package/dist/embeddings/EmbeddingConfig.js +132 -0
  58. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  59. package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
  60. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  61. package/dist/embeddings/EmbeddingGenerator.js +157 -0
  62. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  63. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  64. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  65. package/dist/embeddings/EmbeddingProvider.js +6 -0
  66. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  67. package/dist/embeddings/ModelRegistry.d.ts +48 -0
  68. package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
  69. package/dist/embeddings/ModelRegistry.js +170 -0
  70. package/dist/embeddings/ModelRegistry.js.map +1 -0
  71. package/dist/embeddings/VectorStore.d.ts +114 -0
  72. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  73. package/dist/embeddings/VectorStore.js +393 -0
  74. package/dist/embeddings/VectorStore.js.map +1 -0
  75. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  76. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  77. package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
  78. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  79. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  80. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  81. package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
  82. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  83. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  84. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  85. package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
  86. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  87. package/dist/handoff/SessionHandoffStore.d.ts +80 -0
  88. package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
  89. package/dist/handoff/SessionHandoffStore.js +314 -0
  90. package/dist/handoff/SessionHandoffStore.js.map +1 -0
  91. package/dist/index.d.ts +7 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +115 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/mcp-server.d.ts +27 -0
  96. package/dist/mcp-server.d.ts.map +1 -0
  97. package/dist/mcp-server.js +157 -0
  98. package/dist/mcp-server.js.map +1 -0
  99. package/dist/memory/WorkingMemoryStore.d.ts +83 -0
  100. package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
  101. package/dist/memory/WorkingMemoryStore.js +318 -0
  102. package/dist/memory/WorkingMemoryStore.js.map +1 -0
  103. package/dist/memory/types.d.ts +192 -0
  104. package/dist/memory/types.d.ts.map +1 -0
  105. package/dist/memory/types.js +8 -0
  106. package/dist/memory/types.js.map +1 -0
  107. package/dist/parsers/CodexConversationParser.d.ts +51 -0
  108. package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
  109. package/dist/parsers/CodexConversationParser.js +301 -0
  110. package/dist/parsers/CodexConversationParser.js.map +1 -0
  111. package/dist/parsers/ConversationParser.d.ts +286 -0
  112. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  113. package/dist/parsers/ConversationParser.js +795 -0
  114. package/dist/parsers/ConversationParser.js.map +1 -0
  115. package/dist/parsers/DecisionExtractor.d.ts +144 -0
  116. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  117. package/dist/parsers/DecisionExtractor.js +434 -0
  118. package/dist/parsers/DecisionExtractor.js.map +1 -0
  119. package/dist/parsers/GitIntegrator.d.ts +156 -0
  120. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  121. package/dist/parsers/GitIntegrator.js +348 -0
  122. package/dist/parsers/GitIntegrator.js.map +1 -0
  123. package/dist/parsers/MistakeExtractor.d.ts +151 -0
  124. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  125. package/dist/parsers/MistakeExtractor.js +460 -0
  126. package/dist/parsers/MistakeExtractor.js.map +1 -0
  127. package/dist/parsers/RequirementsExtractor.d.ts +166 -0
  128. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  129. package/dist/parsers/RequirementsExtractor.js +338 -0
  130. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  131. package/dist/realtime/ConversationWatcher.d.ts +87 -0
  132. package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
  133. package/dist/realtime/ConversationWatcher.js +204 -0
  134. package/dist/realtime/ConversationWatcher.js.map +1 -0
  135. package/dist/realtime/IncrementalParser.d.ts +83 -0
  136. package/dist/realtime/IncrementalParser.d.ts.map +1 -0
  137. package/dist/realtime/IncrementalParser.js +232 -0
  138. package/dist/realtime/IncrementalParser.js.map +1 -0
  139. package/dist/realtime/LiveExtractor.d.ts +72 -0
  140. package/dist/realtime/LiveExtractor.d.ts.map +1 -0
  141. package/dist/realtime/LiveExtractor.js +288 -0
  142. package/dist/realtime/LiveExtractor.js.map +1 -0
  143. package/dist/search/SemanticSearch.d.ts +121 -0
  144. package/dist/search/SemanticSearch.d.ts.map +1 -0
  145. package/dist/search/SemanticSearch.js +823 -0
  146. package/dist/search/SemanticSearch.js.map +1 -0
  147. package/dist/storage/BackupManager.d.ts +58 -0
  148. package/dist/storage/BackupManager.d.ts.map +1 -0
  149. package/dist/storage/BackupManager.js +223 -0
  150. package/dist/storage/BackupManager.js.map +1 -0
  151. package/dist/storage/ConversationStorage.d.ts +341 -0
  152. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  153. package/dist/storage/ConversationStorage.js +792 -0
  154. package/dist/storage/ConversationStorage.js.map +1 -0
  155. package/dist/storage/DeletionService.d.ts +70 -0
  156. package/dist/storage/DeletionService.d.ts.map +1 -0
  157. package/dist/storage/DeletionService.js +253 -0
  158. package/dist/storage/DeletionService.js.map +1 -0
  159. package/dist/storage/GlobalIndex.d.ts +133 -0
  160. package/dist/storage/GlobalIndex.d.ts.map +1 -0
  161. package/dist/storage/GlobalIndex.js +310 -0
  162. package/dist/storage/GlobalIndex.js.map +1 -0
  163. package/dist/storage/SQLiteManager.d.ts +114 -0
  164. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  165. package/dist/storage/SQLiteManager.js +636 -0
  166. package/dist/storage/SQLiteManager.js.map +1 -0
  167. package/dist/storage/migrations.d.ts +54 -0
  168. package/dist/storage/migrations.d.ts.map +1 -0
  169. package/dist/storage/migrations.js +285 -0
  170. package/dist/storage/migrations.js.map +1 -0
  171. package/dist/storage/schema.sql +436 -0
  172. package/dist/tools/ToolDefinitions.d.ts +946 -0
  173. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  174. package/dist/tools/ToolDefinitions.js +937 -0
  175. package/dist/tools/ToolDefinitions.js.map +1 -0
  176. package/dist/tools/ToolHandlers.d.ts +791 -0
  177. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  178. package/dist/tools/ToolHandlers.js +3262 -0
  179. package/dist/tools/ToolHandlers.js.map +1 -0
  180. package/dist/types/ToolTypes.d.ts +824 -0
  181. package/dist/types/ToolTypes.d.ts.map +1 -0
  182. package/dist/types/ToolTypes.js +6 -0
  183. package/dist/types/ToolTypes.js.map +1 -0
  184. package/dist/utils/Logger.d.ts +70 -0
  185. package/dist/utils/Logger.d.ts.map +1 -0
  186. package/dist/utils/Logger.js +131 -0
  187. package/dist/utils/Logger.js.map +1 -0
  188. package/dist/utils/McpConfig.d.ts +54 -0
  189. package/dist/utils/McpConfig.d.ts.map +1 -0
  190. package/dist/utils/McpConfig.js +136 -0
  191. package/dist/utils/McpConfig.js.map +1 -0
  192. package/dist/utils/ProjectMigration.d.ts +82 -0
  193. package/dist/utils/ProjectMigration.d.ts.map +1 -0
  194. package/dist/utils/ProjectMigration.js +416 -0
  195. package/dist/utils/ProjectMigration.js.map +1 -0
  196. package/dist/utils/constants.d.ts +75 -0
  197. package/dist/utils/constants.d.ts.map +1 -0
  198. package/dist/utils/constants.js +105 -0
  199. package/dist/utils/constants.js.map +1 -0
  200. package/dist/utils/safeJson.d.ts +37 -0
  201. package/dist/utils/safeJson.d.ts.map +1 -0
  202. package/dist/utils/safeJson.js +48 -0
  203. package/dist/utils/safeJson.js.map +1 -0
  204. package/dist/utils/sanitization.d.ts +45 -0
  205. package/dist/utils/sanitization.d.ts.map +1 -0
  206. package/dist/utils/sanitization.js +153 -0
  207. package/dist/utils/sanitization.js.map +1 -0
  208. package/dist/utils/worktree.d.ts +15 -0
  209. package/dist/utils/worktree.d.ts.map +1 -0
  210. package/dist/utils/worktree.js +86 -0
  211. package/dist/utils/worktree.js.map +1 -0
  212. package/package.json +98 -0
  213. package/scripts/changelog-check.sh +62 -0
  214. package/scripts/check-node.js +17 -0
  215. package/scripts/dev-config.js +56 -0
  216. package/scripts/postinstall.js +117 -0
@@ -0,0 +1,636 @@
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, mkdirSync, existsSync, openSync, closeSync, renameSync } from "fs";
7
+ import { join, dirname, basename } from "path";
8
+ import { homedir } from "os";
9
+ import { fileURLToPath } from "url";
10
+ import { pathToProjectFolderName, escapeTableName } from "../utils/sanitization.js";
11
+ import { getCanonicalProjectPath } from "../utils/worktree.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 DEFAULT_CACHE_SIZE_KB = 64000; // 64MB cache
17
+ const DEFAULT_MMAP_SIZE = 1000000000; // 1GB memory-mapped I/O (safe default)
18
+ const PAGE_SIZE = 4096; // 4KB page size
19
+ const WAL_AUTOCHECKPOINT = 1000; // Checkpoint WAL after 1000 pages
20
+ const NEW_DB_FILE_NAME = ".cccmemory.db";
21
+ const LEGACY_DB_FILE_NAMES = [".claude-conversations-memory.db", ".codex-conversations-memory.db"];
22
+ function resolveDbPath(config = {}) {
23
+ const projectPath = config.projectPath || process.cwd();
24
+ const canonicalPath = getCanonicalProjectPath(projectPath).canonicalPath;
25
+ const projectFolderName = pathToProjectFolderName(canonicalPath);
26
+ const defaultPath = join(homedir(), ".claude", "projects", projectFolderName, NEW_DB_FILE_NAME);
27
+ const fallbackPath = join(canonicalPath, ".cccmemory", NEW_DB_FILE_NAME);
28
+ const normalizeRequestedPath = (requestedPath) => {
29
+ const requestedBase = basename(requestedPath);
30
+ if (LEGACY_DB_FILE_NAMES.includes(requestedBase)) {
31
+ return join(dirname(requestedPath), NEW_DB_FILE_NAME);
32
+ }
33
+ return requestedPath;
34
+ };
35
+ const getLegacyCandidates = (dir, targetPath) => {
36
+ return LEGACY_DB_FILE_NAMES
37
+ .map((name) => join(dir, name))
38
+ .filter((legacyPath) => legacyPath !== targetPath);
39
+ };
40
+ const canCreateDbFile = (dbPath) => {
41
+ try {
42
+ mkdirSync(dirname(dbPath), { recursive: true });
43
+ const fd = openSync(dbPath, "a");
44
+ closeSync(fd);
45
+ return true;
46
+ }
47
+ catch (error) {
48
+ const err = error;
49
+ if (err.code === "EACCES" || err.code === "EPERM" || err.code === "EROFS") {
50
+ return false;
51
+ }
52
+ throw error;
53
+ }
54
+ };
55
+ const canWriteExistingDbFile = (dbPath) => {
56
+ try {
57
+ const fd = openSync(dbPath, "r+");
58
+ closeSync(fd);
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ const err = error;
63
+ if (err.code === "EACCES" ||
64
+ err.code === "EPERM" ||
65
+ err.code === "EROFS" ||
66
+ err.code === "ENOENT") {
67
+ return false;
68
+ }
69
+ throw error;
70
+ }
71
+ };
72
+ const maybeMigrateLegacyDb = (targetPath, readOnly) => {
73
+ if (existsSync(targetPath)) {
74
+ return targetPath;
75
+ }
76
+ const legacyCandidates = getLegacyCandidates(dirname(targetPath), targetPath);
77
+ const legacyPath = legacyCandidates.find((candidate) => existsSync(candidate));
78
+ if (!legacyPath) {
79
+ return targetPath;
80
+ }
81
+ if (readOnly) {
82
+ console.error(`⚠️ Found legacy database at ${legacyPath}. Using legacy file in read-only mode.`);
83
+ return legacyPath;
84
+ }
85
+ try {
86
+ renameSync(legacyPath, targetPath);
87
+ console.error(`✓ Migrated legacy database to ${targetPath}`);
88
+ return targetPath;
89
+ }
90
+ catch (error) {
91
+ const err = error;
92
+ if (err.code === "EACCES" || err.code === "EPERM" || err.code === "EXDEV" || err.code === "EROFS") {
93
+ const canWriteLegacy = canWriteExistingDbFile(legacyPath);
94
+ if (canWriteLegacy) {
95
+ console.error(`⚠️ Failed to rename legacy database (${legacyPath} → ${targetPath}). Using legacy file instead.`);
96
+ return legacyPath;
97
+ }
98
+ throw new Error(`Legacy database found at ${legacyPath} but cannot be migrated or written.\n` +
99
+ `Fix permissions for ${dirname(legacyPath)} or set CCCMEMORY_DB_PATH to a writable file path.`);
100
+ }
101
+ throw error;
102
+ }
103
+ };
104
+ const requestedPath = config.dbPath || process.env.CCCMEMORY_DB_PATH;
105
+ if (requestedPath) {
106
+ const normalizedPath = normalizeRequestedPath(requestedPath);
107
+ if (config.readOnly) {
108
+ const migratedPath = maybeMigrateLegacyDb(normalizedPath, true);
109
+ if (existsSync(migratedPath)) {
110
+ return migratedPath;
111
+ }
112
+ throw new Error(`Database file not found at ${migratedPath} (read-only mode).\n` +
113
+ `Provide a valid path via CCCMEMORY_DB_PATH or config.dbPath.`);
114
+ }
115
+ const migratedPath = maybeMigrateLegacyDb(normalizedPath, false);
116
+ if (migratedPath !== normalizedPath) {
117
+ return migratedPath;
118
+ }
119
+ if (canCreateDbFile(normalizedPath)) {
120
+ return normalizedPath;
121
+ }
122
+ throw new Error(`Database path is not writable: ${normalizedPath}\n` +
123
+ "Fix permissions or set CCCMEMORY_DB_PATH to a writable file path.\n" +
124
+ "If you're running under Codex or Claude with a locked home dir (~/.claude or ~/.codex), " +
125
+ "you must set CCCMEMORY_DB_PATH explicitly.");
126
+ }
127
+ if (config.readOnly) {
128
+ const migratedDefault = maybeMigrateLegacyDb(defaultPath, true);
129
+ if (existsSync(migratedDefault)) {
130
+ return migratedDefault;
131
+ }
132
+ if (existsSync(fallbackPath)) {
133
+ console.error(`⚠️ Using existing project-local database at ${fallbackPath}. ` +
134
+ "No new files are created there automatically. " +
135
+ "Set CCCMEMORY_DB_PATH to make this explicit.");
136
+ return fallbackPath;
137
+ }
138
+ throw new Error(`Database file not found at ${defaultPath} (read-only mode).\n` +
139
+ "Create the database in write mode, or set CCCMEMORY_DB_PATH to an existing file.");
140
+ }
141
+ const migratedDefault = maybeMigrateLegacyDb(defaultPath, false);
142
+ if (migratedDefault !== defaultPath) {
143
+ return migratedDefault;
144
+ }
145
+ if (canCreateDbFile(defaultPath)) {
146
+ return defaultPath;
147
+ }
148
+ if (existsSync(fallbackPath) && canWriteExistingDbFile(fallbackPath)) {
149
+ console.error(`⚠️ Using existing project-local database at ${fallbackPath}. ` +
150
+ "No new files are created there automatically. " +
151
+ "Set CCCMEMORY_DB_PATH to make this explicit.");
152
+ return fallbackPath;
153
+ }
154
+ throw new Error(`Unable to create database in ${dirname(defaultPath)}.\n` +
155
+ `Fix permissions for ${dirname(defaultPath)} or set CCCMEMORY_DB_PATH to a writable file path.\n` +
156
+ "If you're running under Codex or Claude with a locked home dir (~/.claude or ~/.codex), " +
157
+ "you must set CCCMEMORY_DB_PATH explicitly.");
158
+ }
159
+ export class SQLiteManager {
160
+ db;
161
+ dbPath;
162
+ isReadOnly;
163
+ mmapSize;
164
+ cacheSizeKb;
165
+ constructor(config = {}) {
166
+ this.mmapSize = config.mmapSize ?? DEFAULT_MMAP_SIZE;
167
+ this.cacheSizeKb = config.cacheSizeKb ?? DEFAULT_CACHE_SIZE_KB;
168
+ // Determine database location
169
+ this.dbPath = resolveDbPath(config);
170
+ this.isReadOnly = config.readOnly || false;
171
+ // Ensure directory exists (only in write mode)
172
+ if (!this.isReadOnly) {
173
+ this.ensureDirectoryExists();
174
+ }
175
+ else {
176
+ // In read-only mode, verify the database file exists
177
+ if (!existsSync(this.dbPath)) {
178
+ throw new Error(`Database file not found: ${this.dbPath}`);
179
+ }
180
+ }
181
+ // Initialize database
182
+ this.db = new Database(this.dbPath, {
183
+ readonly: this.isReadOnly,
184
+ verbose: config.verbose ? console.log : undefined,
185
+ });
186
+ // Load sqlite-vec extension
187
+ this.loadVectorExtension();
188
+ // Apply optimized PRAGMAs
189
+ this.optimizeDatabase();
190
+ // Initialize schema if needed
191
+ if (!this.isReadOnly) {
192
+ this.initializeSchema();
193
+ }
194
+ }
195
+ ensureDirectoryExists() {
196
+ const dir = dirname(this.dbPath);
197
+ if (!existsSync(dir)) {
198
+ mkdirSync(dir, { recursive: true });
199
+ }
200
+ }
201
+ /**
202
+ * Load sqlite-vec extension for vector search
203
+ */
204
+ loadVectorExtension() {
205
+ try {
206
+ sqliteVec.load(this.db);
207
+ console.error("✓ sqlite-vec extension loaded");
208
+ // Note: Vec tables will be created when embedding dimensions are known
209
+ }
210
+ catch (error) {
211
+ console.error("⚠️ Failed to load sqlite-vec extension:", error.message);
212
+ console.error(" Vector search will use BLOB fallback");
213
+ }
214
+ }
215
+ /**
216
+ * Create sqlite-vec virtual tables for vector search with specified dimensions
217
+ * Public method called when embedding provider dimensions are known
218
+ */
219
+ createVecTablesWithDimensions(dimensions) {
220
+ // SECURITY: Validate dimensions to prevent SQL injection
221
+ if (!Number.isInteger(dimensions) || dimensions <= 0 || dimensions > 10000) {
222
+ throw new Error(`Invalid dimensions: must be a positive integer <= 10000, got ${typeof dimensions === 'number' ? dimensions : 'non-number'}`);
223
+ }
224
+ try {
225
+ // Check if ALL vec tables exist - only skip if all three exist
226
+ let allTablesExist = true;
227
+ const vecTables = ['vec_message_embeddings', 'vec_decision_embeddings', 'vec_mistake_embeddings'];
228
+ for (const table of vecTables) {
229
+ try {
230
+ this.db.prepare(`SELECT 1 FROM ${table} LIMIT 1`).get();
231
+ }
232
+ catch {
233
+ allTablesExist = false;
234
+ break;
235
+ }
236
+ }
237
+ if (allTablesExist) {
238
+ console.error(`✓ sqlite-vec virtual tables already exist`);
239
+ return;
240
+ }
241
+ // Create message embeddings virtual table
242
+ // dimensions is validated above to be a safe integer
243
+ this.db.exec(`
244
+ CREATE VIRTUAL TABLE IF NOT EXISTS vec_message_embeddings
245
+ USING vec0(
246
+ id TEXT PRIMARY KEY,
247
+ embedding float[${dimensions}]
248
+ )
249
+ `);
250
+ // Create decision embeddings virtual table
251
+ this.db.exec(`
252
+ CREATE VIRTUAL TABLE IF NOT EXISTS vec_decision_embeddings
253
+ USING vec0(
254
+ id TEXT PRIMARY KEY,
255
+ embedding float[${dimensions}]
256
+ )
257
+ `);
258
+ // Create mistake embeddings virtual table
259
+ this.db.exec(`
260
+ CREATE VIRTUAL TABLE IF NOT EXISTS vec_mistake_embeddings
261
+ USING vec0(
262
+ id TEXT PRIMARY KEY,
263
+ embedding float[${dimensions}]
264
+ )
265
+ `);
266
+ console.error(`✓ sqlite-vec virtual tables created (${dimensions} dimensions)`);
267
+ }
268
+ catch (error) {
269
+ console.error("⚠️ Failed to create vec virtual tables:", error.message);
270
+ console.error(" Will fall back to BLOB storage");
271
+ }
272
+ }
273
+ /**
274
+ * Apply performance optimizations
275
+ * Based on code-graph-rag-mcp sqlite-manager.ts
276
+ */
277
+ optimizeDatabase() {
278
+ // Skip write-related PRAGMAs in read-only mode
279
+ if (!this.isReadOnly) {
280
+ // WAL mode for concurrent reads during writes
281
+ // If WAL cannot be enabled (e.g., sandboxed filesystem), fall back to MEMORY
282
+ try {
283
+ this.db.pragma("journal_mode = WAL");
284
+ }
285
+ catch (error) {
286
+ console.error("⚠️ Failed to enable WAL mode, falling back to MEMORY journal:", error.message);
287
+ this.db.pragma("journal_mode = MEMORY");
288
+ }
289
+ // NORMAL synchronous for balance between safety and speed
290
+ this.db.pragma("synchronous = NORMAL");
291
+ // 4KB page size (optimal for most systems)
292
+ this.db.pragma(`page_size = ${PAGE_SIZE}`);
293
+ // Auto-checkpoint WAL after 1000 pages
294
+ this.db.pragma(`wal_autocheckpoint = ${WAL_AUTOCHECKPOINT}`);
295
+ // Analysis for query optimization
296
+ this.db.pragma("optimize");
297
+ }
298
+ // These PRAGMAs are safe in read-only mode
299
+ // Configurable cache for better performance (default 64MB)
300
+ this.db.pragma(`cache_size = -${this.cacheSizeKb}`);
301
+ // Store temp tables in memory
302
+ this.db.pragma("temp_store = MEMORY");
303
+ // Configurable memory-mapped I/O (default 1GB, safe for most systems)
304
+ if (this.mmapSize > 0) {
305
+ this.db.pragma(`mmap_size = ${this.mmapSize}`);
306
+ }
307
+ // Enable foreign key constraints
308
+ this.db.pragma("foreign_keys = ON");
309
+ }
310
+ /**
311
+ * Initialize database schema from schema.sql
312
+ */
313
+ initializeSchema() {
314
+ try {
315
+ // Check if schema is already initialized
316
+ const schemaVersionExists = this.db
317
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='schema_version'")
318
+ .all();
319
+ if (schemaVersionExists.length === 0) {
320
+ // Check if this is a legacy database with incompatible schema
321
+ const conversationsExists = this.db
322
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='conversations'")
323
+ .all();
324
+ if (conversationsExists.length > 0) {
325
+ // Check if conversations table has expected columns
326
+ const columns = this.db
327
+ .prepare("PRAGMA table_info(conversations)")
328
+ .all();
329
+ const hasSourceType = columns.some((col) => col.name === "source_type");
330
+ const hasMessageCount = columns.some((col) => col.name === "message_count");
331
+ if (!hasSourceType || !hasMessageCount) {
332
+ // Legacy database with incompatible schema - drop and recreate
333
+ console.error("⚠️ Legacy database detected with incompatible schema. Recreating...");
334
+ // Get all table names
335
+ const allTables = this.db
336
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'")
337
+ .all();
338
+ // Drop all tables (escape table names to prevent SQL injection)
339
+ for (const table of allTables) {
340
+ try {
341
+ const safeName = escapeTableName(table.name);
342
+ this.db.exec(`DROP TABLE IF EXISTS "${safeName}"`);
343
+ }
344
+ catch (_e) {
345
+ // Ignore errors when dropping (virtual tables may have dependencies)
346
+ }
347
+ }
348
+ console.error("Legacy tables dropped");
349
+ }
350
+ }
351
+ console.error("Initializing database schema...");
352
+ // Read and execute schema.sql
353
+ const schemaPath = join(__dirname, "schema.sql");
354
+ const schema = readFileSync(schemaPath, "utf-8");
355
+ // Execute the entire schema at once
356
+ // SQLite can handle multiple statements in a single exec() call
357
+ this.db.exec(schema);
358
+ // Record schema version (current version is 3)
359
+ this.db
360
+ .prepare("INSERT INTO schema_version (version, applied_at, description) VALUES (?, ?, ?)")
361
+ .run(3, Date.now(), "Initial schema with fixed FTS tables");
362
+ console.error("Database schema initialized successfully");
363
+ }
364
+ else {
365
+ // Apply migrations if needed
366
+ this.applyMigrations();
367
+ }
368
+ }
369
+ catch (error) {
370
+ console.error("Error initializing schema:", error);
371
+ throw error;
372
+ }
373
+ }
374
+ /**
375
+ * Apply database migrations for existing databases
376
+ */
377
+ applyMigrations() {
378
+ const currentVersion = this.getSchemaVersion();
379
+ // Migration 1 -> 2: Add source_type column to conversations table
380
+ if (currentVersion < 2) {
381
+ try {
382
+ console.error("Applying migration: Adding source_type column...");
383
+ // Check if column already exists (in case of partial migration)
384
+ const columns = this.db
385
+ .prepare("PRAGMA table_info(conversations)")
386
+ .all();
387
+ const hasSourceType = columns.some((col) => col.name === "source_type");
388
+ if (!hasSourceType) {
389
+ this.db.exec("ALTER TABLE conversations ADD COLUMN source_type TEXT DEFAULT 'claude-code'");
390
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_conv_source ON conversations(source_type)");
391
+ }
392
+ // Record migration
393
+ this.db
394
+ .prepare("INSERT INTO schema_version (version, applied_at, description) VALUES (?, ?, ?)")
395
+ .run(2, Date.now(), "Add source_type column and global index support");
396
+ console.error("Migration v2 applied successfully");
397
+ }
398
+ catch (error) {
399
+ console.error("Error applying migration v2:", error);
400
+ throw error;
401
+ }
402
+ }
403
+ // Migration 2 -> 3: Fix messages_fts schema (remove non-existent context column)
404
+ if (currentVersion < 3) {
405
+ try {
406
+ console.error("Applying migration v3: Fixing messages_fts schema...");
407
+ // FTS5 virtual tables can't be altered, must drop and recreate
408
+ // The old schema had 'context' column which doesn't exist in messages table
409
+ this.db.exec("DROP TABLE IF EXISTS messages_fts");
410
+ this.db.exec(`
411
+ CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
412
+ id UNINDEXED,
413
+ content,
414
+ metadata,
415
+ content=messages,
416
+ content_rowid=rowid
417
+ )
418
+ `);
419
+ // Rebuild FTS index from messages table
420
+ try {
421
+ this.db.exec("INSERT INTO messages_fts(messages_fts) VALUES('rebuild')");
422
+ console.error("FTS index rebuilt successfully");
423
+ }
424
+ catch (ftsError) {
425
+ console.error("FTS rebuild warning:", ftsError.message);
426
+ }
427
+ // Record migration
428
+ this.db
429
+ .prepare("INSERT INTO schema_version (version, applied_at, description) VALUES (?, ?, ?)")
430
+ .run(3, Date.now(), "Fix messages_fts schema - remove context column");
431
+ console.error("Migration v3 applied successfully");
432
+ }
433
+ catch (error) {
434
+ console.error("Error applying migration v3:", error);
435
+ throw error;
436
+ }
437
+ }
438
+ // Migration 3 -> 4: Add mistake_embeddings and mistakes_fts for semantic search
439
+ if (currentVersion < 4) {
440
+ try {
441
+ console.error("Applying migration v4: Adding mistake semantic search support...");
442
+ // Create mistake_embeddings table
443
+ this.db.exec(`
444
+ CREATE TABLE IF NOT EXISTS mistake_embeddings (
445
+ id TEXT PRIMARY KEY,
446
+ mistake_id TEXT NOT NULL,
447
+ embedding BLOB NOT NULL,
448
+ created_at INTEGER NOT NULL,
449
+ FOREIGN KEY (mistake_id) REFERENCES mistakes(id) ON DELETE CASCADE
450
+ )
451
+ `);
452
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_mistake_embeddings_mistake_id ON mistake_embeddings(mistake_id)");
453
+ // Create mistakes_fts FTS5 table (standalone, not content-synced)
454
+ this.db.exec(`
455
+ CREATE VIRTUAL TABLE IF NOT EXISTS mistakes_fts USING fts5(
456
+ id,
457
+ what_went_wrong,
458
+ correction,
459
+ mistake_type
460
+ )
461
+ `);
462
+ // Populate FTS from existing mistakes
463
+ try {
464
+ this.db.exec(`
465
+ INSERT INTO mistakes_fts(id, what_went_wrong, correction, mistake_type)
466
+ SELECT id, what_went_wrong, COALESCE(correction, ''), mistake_type FROM mistakes
467
+ `);
468
+ console.error("Mistakes FTS index populated successfully");
469
+ }
470
+ catch (ftsError) {
471
+ console.error("Mistakes FTS populate warning:", ftsError.message);
472
+ }
473
+ // Record migration
474
+ this.db
475
+ .prepare("INSERT INTO schema_version (version, applied_at, description) VALUES (?, ?, ?)")
476
+ .run(4, Date.now(), "Add mistake_embeddings and mistakes_fts for semantic search");
477
+ console.error("Migration v4 applied successfully");
478
+ }
479
+ catch (error) {
480
+ console.error("Error applying migration v4:", error);
481
+ throw error;
482
+ }
483
+ }
484
+ }
485
+ /**
486
+ * Get the underlying database instance
487
+ */
488
+ getDatabase() {
489
+ return this.db;
490
+ }
491
+ /**
492
+ * Execute a transaction
493
+ */
494
+ transaction(fn) {
495
+ const tx = this.db.transaction(fn);
496
+ return tx();
497
+ }
498
+ /**
499
+ * Prepare a statement
500
+ */
501
+ prepare(sql) {
502
+ return this.db.prepare(sql);
503
+ }
504
+ /**
505
+ * Execute SQL directly
506
+ */
507
+ exec(sql) {
508
+ this.db.exec(sql);
509
+ }
510
+ /**
511
+ * Close the database connection
512
+ */
513
+ close() {
514
+ if (this.db.open) {
515
+ this.db.close();
516
+ }
517
+ }
518
+ /**
519
+ * Get database statistics
520
+ */
521
+ getStats() {
522
+ const pageCount = this.db.pragma("page_count", { simple: true });
523
+ const pageSize = this.db.pragma("page_size", { simple: true });
524
+ const journalMode = this.db.pragma("journal_mode", {
525
+ simple: true,
526
+ });
527
+ let walSize = null;
528
+ if (journalMode === "wal") {
529
+ try {
530
+ const walStat = this.db
531
+ .prepare("SELECT * FROM pragma_wal_checkpoint('PASSIVE')")
532
+ .get();
533
+ walSize = walStat?.log ?? null;
534
+ }
535
+ catch (_e) {
536
+ // WAL not available
537
+ }
538
+ }
539
+ return {
540
+ dbPath: this.dbPath,
541
+ fileSize: pageCount * pageSize,
542
+ pageCount,
543
+ pageSize,
544
+ wal: {
545
+ enabled: journalMode === "wal",
546
+ size: walSize,
547
+ },
548
+ };
549
+ }
550
+ /**
551
+ * Get database file path
552
+ */
553
+ getDbPath() {
554
+ return this.dbPath;
555
+ }
556
+ /**
557
+ * Vacuum the database to reclaim space
558
+ */
559
+ vacuum() {
560
+ if (this.isReadOnly) {
561
+ throw new Error("Cannot vacuum database in read-only mode");
562
+ }
563
+ this.db.exec("VACUUM");
564
+ }
565
+ /**
566
+ * Analyze the database for query optimization
567
+ */
568
+ analyze() {
569
+ if (this.isReadOnly) {
570
+ throw new Error("Cannot analyze database in read-only mode");
571
+ }
572
+ this.db.exec("ANALYZE");
573
+ }
574
+ /**
575
+ * Checkpoint the WAL file
576
+ */
577
+ checkpoint() {
578
+ if (this.isReadOnly) {
579
+ throw new Error("Cannot checkpoint database in read-only mode");
580
+ }
581
+ this.db.pragma("wal_checkpoint(TRUNCATE)");
582
+ }
583
+ /**
584
+ * Get current schema version
585
+ */
586
+ getSchemaVersion() {
587
+ try {
588
+ const result = this.db
589
+ .prepare("SELECT MAX(version) as version FROM schema_version")
590
+ .get();
591
+ return result?.version || 0;
592
+ }
593
+ catch (_error) {
594
+ return 0;
595
+ }
596
+ }
597
+ }
598
+ // Instance cache keyed by dbPath to support multiple databases
599
+ const instances = new Map();
600
+ /**
601
+ * Get a SQLiteManager instance for the given config.
602
+ * Instances are cached by dbPath to avoid re-opening the same database.
603
+ */
604
+ export function getSQLiteManager(config) {
605
+ const resolvedPath = resolveDbPath(config);
606
+ // Check if we already have an instance for this path
607
+ const existing = instances.get(resolvedPath);
608
+ if (existing) {
609
+ return existing;
610
+ }
611
+ // Create new instance and cache it
612
+ const instance = new SQLiteManager({ ...config, dbPath: resolvedPath });
613
+ instances.set(instance.getDbPath(), instance);
614
+ return instance;
615
+ }
616
+ /**
617
+ * Reset all cached SQLiteManager instances.
618
+ * Useful for testing or when switching projects.
619
+ */
620
+ export function resetSQLiteManager() {
621
+ for (const instance of instances.values()) {
622
+ instance.close();
623
+ }
624
+ instances.clear();
625
+ }
626
+ /**
627
+ * Reset a specific SQLiteManager instance by path.
628
+ */
629
+ export function resetSQLiteManagerByPath(dbPath) {
630
+ const instance = instances.get(dbPath);
631
+ if (instance) {
632
+ instance.close();
633
+ instances.delete(dbPath);
634
+ }
635
+ }
636
+ //# 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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"}