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,310 @@
1
+ /**
2
+ * Global Index for Cross-Project Search
3
+ *
4
+ * This module manages a lightweight global registry of all indexed projects
5
+ * (both Claude Code and Codex). It maintains a central database that tracks:
6
+ * - Which projects have been indexed
7
+ * - Where their databases are located
8
+ * - When they were last indexed
9
+ * - Basic statistics about each project
10
+ *
11
+ * The global index enables:
12
+ * - Discovery of all indexed projects
13
+ * - Cross-project search routing
14
+ * - Batch indexing operations
15
+ * - Global statistics
16
+ *
17
+ * Architecture:
18
+ * - Each project keeps its own database (per-project isolation)
19
+ * - The global index is a registry that links to project databases
20
+ * - Cross-project searches query multiple databases and merge results
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const globalIndex = new GlobalIndex();
25
+ * await globalIndex.registerProject({
26
+ * project_path: '/Users/user/project',
27
+ * source_type: 'claude-code',
28
+ * db_path: '/Users/user/.claude/projects/-project/.db',
29
+ * });
30
+ *
31
+ * const projects = await globalIndex.getAllProjects();
32
+ * console.log(`Tracking ${projects.length} projects`);
33
+ * ```
34
+ */
35
+ import Database from "better-sqlite3";
36
+ import { existsSync, mkdirSync, openSync, closeSync } from "fs";
37
+ import { join, dirname } from "path";
38
+ import { homedir } from "os";
39
+ import { nanoid } from "nanoid";
40
+ import { safeJsonParse } from "../utils/safeJson.js";
41
+ import { getCanonicalProjectPath } from "../utils/worktree.js";
42
+ function resolveGlobalIndexPath() {
43
+ const defaultPath = join(homedir(), ".claude", ".cccmemory-global.db");
44
+ const canCreateDbFile = (dbPath) => {
45
+ try {
46
+ mkdirSync(dirname(dbPath), { recursive: true });
47
+ const fd = openSync(dbPath, "a");
48
+ closeSync(fd);
49
+ return true;
50
+ }
51
+ catch (error) {
52
+ const err = error;
53
+ if (err.code === "EACCES" || err.code === "EPERM" || err.code === "EROFS") {
54
+ return false;
55
+ }
56
+ throw error;
57
+ }
58
+ };
59
+ const canWriteExistingDbFile = (dbPath) => {
60
+ try {
61
+ const fd = openSync(dbPath, "r+");
62
+ closeSync(fd);
63
+ return true;
64
+ }
65
+ catch (error) {
66
+ const err = error;
67
+ if (err.code === "EACCES" ||
68
+ err.code === "EPERM" ||
69
+ err.code === "EROFS" ||
70
+ err.code === "ENOENT") {
71
+ return false;
72
+ }
73
+ throw error;
74
+ }
75
+ };
76
+ const requestedPath = process.env.CCCMEMORY_GLOBAL_INDEX_PATH;
77
+ if (requestedPath) {
78
+ if (canCreateDbFile(requestedPath)) {
79
+ return requestedPath;
80
+ }
81
+ throw new Error(`Global index path is not writable: ${requestedPath}\n` +
82
+ "Fix permissions or set CCCMEMORY_GLOBAL_INDEX_PATH to a writable file path.\n" +
83
+ "If you're running under Codex or Claude with a locked home dir (~/.claude or ~/.codex), " +
84
+ "you must set CCCMEMORY_GLOBAL_INDEX_PATH explicitly.");
85
+ }
86
+ if (canCreateDbFile(defaultPath)) {
87
+ return defaultPath;
88
+ }
89
+ const canonicalPath = getCanonicalProjectPath(process.cwd()).canonicalPath;
90
+ const fallbackPath = join(canonicalPath, ".cccmemory", "global-index.db");
91
+ if (existsSync(fallbackPath) && canWriteExistingDbFile(fallbackPath)) {
92
+ console.error(`⚠️ Using existing project-local global index at ${fallbackPath}. ` +
93
+ "No new files are created there automatically. " +
94
+ "Set CCCMEMORY_GLOBAL_INDEX_PATH to make this explicit.");
95
+ return fallbackPath;
96
+ }
97
+ throw new Error(`Unable to create global index at ${defaultPath}.\n` +
98
+ `Fix permissions for ${dirname(defaultPath)} or set CCCMEMORY_GLOBAL_INDEX_PATH.\n` +
99
+ "If you're running under Codex or Claude with a locked home dir (~/.claude or ~/.codex), " +
100
+ "you must set CCCMEMORY_GLOBAL_INDEX_PATH explicitly.");
101
+ }
102
+ /**
103
+ * Global Index Manager
104
+ *
105
+ * Maintains a central registry of all indexed projects in a global database.
106
+ */
107
+ export class GlobalIndex {
108
+ db = null;
109
+ globalDbPath;
110
+ initialized = false;
111
+ constructor(customPath) {
112
+ // Use custom path or default to ~/.claude/.cccmemory-global.db
113
+ // Note: Database is NOT opened here - lazy initialization in ensureInitialized()
114
+ if (customPath) {
115
+ this.globalDbPath = customPath;
116
+ }
117
+ else {
118
+ this.globalDbPath = resolveGlobalIndexPath();
119
+ }
120
+ }
121
+ /**
122
+ * Ensure database is initialized (lazy initialization).
123
+ * Called automatically by methods that need the database.
124
+ */
125
+ ensureInitialized() {
126
+ if (!this.initialized || !this.db) {
127
+ // Create parent directory if needed
128
+ const parentDir = dirname(this.globalDbPath);
129
+ if (!existsSync(parentDir)) {
130
+ mkdirSync(parentDir, { recursive: true });
131
+ }
132
+ // Open/create database
133
+ this.db = new Database(this.globalDbPath);
134
+ // Initialize schema
135
+ this.initializeSchema();
136
+ this.initialized = true;
137
+ }
138
+ return this.db;
139
+ }
140
+ /**
141
+ * Initialize the global index database schema.
142
+ * Note: this.db is guaranteed to be set when this is called from ensureInitialized()
143
+ */
144
+ initializeSchema() {
145
+ if (!this.db) {
146
+ throw new Error("Database not initialized");
147
+ }
148
+ this.db.exec(`
149
+ CREATE TABLE IF NOT EXISTS project_metadata (
150
+ id TEXT PRIMARY KEY,
151
+ project_path TEXT NOT NULL UNIQUE,
152
+ source_type TEXT NOT NULL,
153
+ db_path TEXT NOT NULL,
154
+ last_indexed INTEGER NOT NULL,
155
+ message_count INTEGER DEFAULT 0,
156
+ conversation_count INTEGER DEFAULT 0,
157
+ decision_count INTEGER DEFAULT 0,
158
+ mistake_count INTEGER DEFAULT 0,
159
+ metadata TEXT,
160
+ created_at INTEGER NOT NULL,
161
+ updated_at INTEGER NOT NULL
162
+ );
163
+
164
+ CREATE INDEX IF NOT EXISTS idx_proj_source ON project_metadata(source_type);
165
+ CREATE INDEX IF NOT EXISTS idx_proj_last_indexed ON project_metadata(last_indexed);
166
+ CREATE INDEX IF NOT EXISTS idx_proj_path ON project_metadata(project_path);
167
+ `);
168
+ }
169
+ /**
170
+ * Register or update a project in the global index.
171
+ * Uses atomic UPSERT to avoid race conditions.
172
+ *
173
+ * @param options - Project registration options
174
+ * @returns The registered/updated project metadata
175
+ */
176
+ registerProject(options) {
177
+ const db = this.ensureInitialized();
178
+ const now = Date.now();
179
+ const id = nanoid();
180
+ // Atomic UPSERT - avoids race conditions between concurrent registrations
181
+ const stmt = db.prepare(`
182
+ INSERT INTO project_metadata (
183
+ id, project_path, source_type, db_path, last_indexed,
184
+ message_count, conversation_count, decision_count, mistake_count,
185
+ metadata, created_at, updated_at
186
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
187
+ ON CONFLICT(project_path) DO UPDATE SET
188
+ source_type = excluded.source_type,
189
+ db_path = excluded.db_path,
190
+ last_indexed = excluded.last_indexed,
191
+ message_count = excluded.message_count,
192
+ conversation_count = excluded.conversation_count,
193
+ decision_count = excluded.decision_count,
194
+ mistake_count = excluded.mistake_count,
195
+ metadata = excluded.metadata,
196
+ updated_at = excluded.updated_at
197
+ `);
198
+ stmt.run(id, options.project_path, options.source_type, options.db_path, now, options.message_count ?? 0, options.conversation_count ?? 0, options.decision_count ?? 0, options.mistake_count ?? 0, JSON.stringify(options.metadata ?? {}), now, now);
199
+ const row = db
200
+ .prepare("SELECT * FROM project_metadata WHERE project_path = ?")
201
+ .get(options.project_path);
202
+ return {
203
+ id: row.id,
204
+ project_path: row.project_path,
205
+ source_type: row.source_type,
206
+ db_path: row.db_path,
207
+ last_indexed: row.last_indexed,
208
+ message_count: row.message_count,
209
+ conversation_count: row.conversation_count,
210
+ decision_count: row.decision_count,
211
+ mistake_count: row.mistake_count,
212
+ metadata: safeJsonParse(row.metadata, {}),
213
+ created_at: row.created_at,
214
+ updated_at: row.updated_at,
215
+ };
216
+ }
217
+ /**
218
+ * Get all registered projects.
219
+ *
220
+ * @param sourceType - Optional filter by source type
221
+ * @returns Array of project metadata
222
+ */
223
+ getAllProjects(sourceType) {
224
+ let sql = "SELECT * FROM project_metadata";
225
+ const params = [];
226
+ if (sourceType) {
227
+ sql += " WHERE source_type = ?";
228
+ params.push(sourceType);
229
+ }
230
+ sql += " ORDER BY last_indexed DESC";
231
+ const db = this.ensureInitialized();
232
+ const rows = db.prepare(sql).all(...params);
233
+ return rows.map((row) => ({
234
+ ...row,
235
+ metadata: safeJsonParse(row.metadata, {}),
236
+ }));
237
+ }
238
+ /**
239
+ * Get a specific project by path.
240
+ *
241
+ * @param projectPath - Absolute path to the project
242
+ * @returns Project metadata or null if not found
243
+ */
244
+ getProject(projectPath) {
245
+ const db = this.ensureInitialized();
246
+ const row = db
247
+ .prepare("SELECT * FROM project_metadata WHERE project_path = ?")
248
+ .get(projectPath);
249
+ if (!row) {
250
+ return null;
251
+ }
252
+ return {
253
+ ...row,
254
+ metadata: safeJsonParse(row.metadata, {}),
255
+ };
256
+ }
257
+ /**
258
+ * Remove a project from the global index.
259
+ *
260
+ * Note: This does NOT delete the project's database, only removes it from the registry.
261
+ *
262
+ * @param projectPath - Absolute path to the project
263
+ * @returns True if project was removed, false if not found
264
+ */
265
+ removeProject(projectPath) {
266
+ const db = this.ensureInitialized();
267
+ const stmt = db.prepare("DELETE FROM project_metadata WHERE project_path = ?");
268
+ const result = stmt.run(projectPath);
269
+ return result.changes > 0;
270
+ }
271
+ /**
272
+ * Get global statistics across all projects.
273
+ *
274
+ * @returns Aggregate statistics
275
+ */
276
+ getGlobalStats() {
277
+ const db = this.ensureInitialized();
278
+ const stats = db
279
+ .prepare(`
280
+ SELECT
281
+ COUNT(*) as total_projects,
282
+ COALESCE(SUM(CASE WHEN source_type = 'claude-code' THEN 1 ELSE 0 END), 0) as claude_code_projects,
283
+ COALESCE(SUM(CASE WHEN source_type = 'codex' THEN 1 ELSE 0 END), 0) as codex_projects,
284
+ COALESCE(SUM(message_count), 0) as total_messages,
285
+ COALESCE(SUM(conversation_count), 0) as total_conversations,
286
+ COALESCE(SUM(decision_count), 0) as total_decisions,
287
+ COALESCE(SUM(mistake_count), 0) as total_mistakes
288
+ FROM project_metadata
289
+ `)
290
+ .get();
291
+ return stats;
292
+ }
293
+ /**
294
+ * Close the global index database.
295
+ */
296
+ close() {
297
+ if (this.db) {
298
+ this.db.close();
299
+ this.db = null;
300
+ this.initialized = false;
301
+ }
302
+ }
303
+ /**
304
+ * Get the path to the global index database.
305
+ */
306
+ getDbPath() {
307
+ return this.globalDbPath;
308
+ }
309
+ }
310
+ //# sourceMappingURL=GlobalIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalIndex.js","sourceRoot":"","sources":["../../src/storage/GlobalIndex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
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
+ /** Memory-mapped I/O size in bytes (default: 1GB). Set to 0 to disable. */
12
+ mmapSize?: number;
13
+ /** Cache size in KB (default: 64MB) */
14
+ cacheSizeKb?: number;
15
+ }
16
+ export declare class SQLiteManager {
17
+ private db;
18
+ private dbPath;
19
+ private isReadOnly;
20
+ private mmapSize;
21
+ private cacheSizeKb;
22
+ constructor(config?: SQLiteConfig);
23
+ private ensureDirectoryExists;
24
+ /**
25
+ * Load sqlite-vec extension for vector search
26
+ */
27
+ private loadVectorExtension;
28
+ /**
29
+ * Create sqlite-vec virtual tables for vector search with specified dimensions
30
+ * Public method called when embedding provider dimensions are known
31
+ */
32
+ createVecTablesWithDimensions(dimensions: number): void;
33
+ /**
34
+ * Apply performance optimizations
35
+ * Based on code-graph-rag-mcp sqlite-manager.ts
36
+ */
37
+ private optimizeDatabase;
38
+ /**
39
+ * Initialize database schema from schema.sql
40
+ */
41
+ private initializeSchema;
42
+ /**
43
+ * Apply database migrations for existing databases
44
+ */
45
+ private applyMigrations;
46
+ /**
47
+ * Get the underlying database instance
48
+ */
49
+ getDatabase(): Database.Database;
50
+ /**
51
+ * Execute a transaction
52
+ */
53
+ transaction<T>(fn: () => T): T;
54
+ /**
55
+ * Prepare a statement
56
+ */
57
+ prepare<T extends unknown[] = unknown[]>(sql: string): Database.Statement<T>;
58
+ /**
59
+ * Execute SQL directly
60
+ */
61
+ exec(sql: string): void;
62
+ /**
63
+ * Close the database connection
64
+ */
65
+ close(): void;
66
+ /**
67
+ * Get database statistics
68
+ */
69
+ getStats(): {
70
+ dbPath: string;
71
+ fileSize: number;
72
+ pageCount: number;
73
+ pageSize: number;
74
+ wal: {
75
+ enabled: boolean;
76
+ size: number | null;
77
+ };
78
+ };
79
+ /**
80
+ * Get database file path
81
+ */
82
+ getDbPath(): string;
83
+ /**
84
+ * Vacuum the database to reclaim space
85
+ */
86
+ vacuum(): void;
87
+ /**
88
+ * Analyze the database for query optimization
89
+ */
90
+ analyze(): void;
91
+ /**
92
+ * Checkpoint the WAL file
93
+ */
94
+ checkpoint(): void;
95
+ /**
96
+ * Get current schema version
97
+ */
98
+ getSchemaVersion(): number;
99
+ }
100
+ /**
101
+ * Get a SQLiteManager instance for the given config.
102
+ * Instances are cached by dbPath to avoid re-opening the same database.
103
+ */
104
+ export declare function getSQLiteManager(config?: SQLiteConfig): SQLiteManager;
105
+ /**
106
+ * Reset all cached SQLiteManager instances.
107
+ * Useful for testing or when switching projects.
108
+ */
109
+ export declare function resetSQLiteManager(): void;
110
+ /**
111
+ * Reset a specific SQLiteManager instance by path.
112
+ */
113
+ export declare function resetSQLiteManagerByPath(dbPath: string): void;
114
+ //# 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;AAoBtC,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;IAClB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8KD,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,GAAE,YAAiB;IAoCrC,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;;OAGG;IACH,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IA2DvD;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqFxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyJvB;;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,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAU3B;AAKD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,aAAa,CAarE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM7D"}