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.
- package/LICENSE +21 -0
- package/README.md +349 -0
- package/dist/ConversationMemory.d.ts +231 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +357 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/cache/QueryCache.d.ts +215 -0
- package/dist/cache/QueryCache.d.ts.map +1 -0
- package/dist/cache/QueryCache.js +294 -0
- package/dist/cache/QueryCache.js.map +1 -0
- package/dist/cli/commands.d.ts +9 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +954 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/help.d.ts +16 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +361 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +30 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context/ContextInjector.d.ts +38 -0
- package/dist/context/ContextInjector.d.ts.map +1 -0
- package/dist/context/ContextInjector.js +235 -0
- package/dist/context/ContextInjector.js.map +1 -0
- package/dist/documentation/CodeAnalyzer.d.ts +29 -0
- package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
- package/dist/documentation/CodeAnalyzer.js +122 -0
- package/dist/documentation/CodeAnalyzer.js.map +1 -0
- package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
- package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
- package/dist/documentation/ConversationAnalyzer.js +157 -0
- package/dist/documentation/ConversationAnalyzer.js.map +1 -0
- package/dist/documentation/CrossReferencer.d.ts +67 -0
- package/dist/documentation/CrossReferencer.d.ts.map +1 -0
- package/dist/documentation/CrossReferencer.js +247 -0
- package/dist/documentation/CrossReferencer.js.map +1 -0
- package/dist/documentation/DocumentationGenerator.d.ts +22 -0
- package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
- package/dist/documentation/DocumentationGenerator.js +57 -0
- package/dist/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/documentation/MarkdownFormatter.d.ts +26 -0
- package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
- package/dist/documentation/MarkdownFormatter.js +301 -0
- package/dist/documentation/MarkdownFormatter.js.map +1 -0
- package/dist/documentation/types.d.ts +176 -0
- package/dist/documentation/types.d.ts.map +1 -0
- package/dist/documentation/types.js +5 -0
- package/dist/documentation/types.js.map +1 -0
- package/dist/embeddings/ConfigManager.d.ts +46 -0
- package/dist/embeddings/ConfigManager.d.ts.map +1 -0
- package/dist/embeddings/ConfigManager.js +177 -0
- package/dist/embeddings/ConfigManager.js.map +1 -0
- package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
- package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingConfig.js +132 -0
- package/dist/embeddings/EmbeddingConfig.js.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +157 -0
- package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
- package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingProvider.js +6 -0
- package/dist/embeddings/EmbeddingProvider.js.map +1 -0
- package/dist/embeddings/ModelRegistry.d.ts +48 -0
- package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
- package/dist/embeddings/ModelRegistry.js +170 -0
- package/dist/embeddings/ModelRegistry.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +114 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +393 -0
- package/dist/embeddings/VectorStore.js.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/handoff/SessionHandoffStore.d.ts +80 -0
- package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
- package/dist/handoff/SessionHandoffStore.js +314 -0
- package/dist/handoff/SessionHandoffStore.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +157 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory/WorkingMemoryStore.d.ts +83 -0
- package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
- package/dist/memory/WorkingMemoryStore.js +318 -0
- package/dist/memory/WorkingMemoryStore.js.map +1 -0
- package/dist/memory/types.d.ts +192 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/parsers/CodexConversationParser.d.ts +51 -0
- package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
- package/dist/parsers/CodexConversationParser.js +301 -0
- package/dist/parsers/CodexConversationParser.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +286 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +795 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +144 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +434 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +156 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +348 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +151 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +460 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +166 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +338 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/realtime/ConversationWatcher.d.ts +87 -0
- package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
- package/dist/realtime/ConversationWatcher.js +204 -0
- package/dist/realtime/ConversationWatcher.js.map +1 -0
- package/dist/realtime/IncrementalParser.d.ts +83 -0
- package/dist/realtime/IncrementalParser.d.ts.map +1 -0
- package/dist/realtime/IncrementalParser.js +232 -0
- package/dist/realtime/IncrementalParser.js.map +1 -0
- package/dist/realtime/LiveExtractor.d.ts +72 -0
- package/dist/realtime/LiveExtractor.d.ts.map +1 -0
- package/dist/realtime/LiveExtractor.js +288 -0
- package/dist/realtime/LiveExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +121 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +823 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/BackupManager.d.ts +58 -0
- package/dist/storage/BackupManager.d.ts.map +1 -0
- package/dist/storage/BackupManager.js +223 -0
- package/dist/storage/BackupManager.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +341 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +792 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/DeletionService.d.ts +70 -0
- package/dist/storage/DeletionService.d.ts.map +1 -0
- package/dist/storage/DeletionService.js +253 -0
- package/dist/storage/DeletionService.js.map +1 -0
- package/dist/storage/GlobalIndex.d.ts +133 -0
- package/dist/storage/GlobalIndex.d.ts.map +1 -0
- package/dist/storage/GlobalIndex.js +310 -0
- package/dist/storage/GlobalIndex.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +114 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +636 -0
- package/dist/storage/SQLiteManager.js.map +1 -0
- package/dist/storage/migrations.d.ts +54 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +285 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +436 -0
- package/dist/tools/ToolDefinitions.d.ts +946 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +937 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +791 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +3262 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +824 -0
- package/dist/types/ToolTypes.d.ts.map +1 -0
- package/dist/types/ToolTypes.js +6 -0
- package/dist/types/ToolTypes.js.map +1 -0
- package/dist/utils/Logger.d.ts +70 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +131 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/McpConfig.d.ts +54 -0
- package/dist/utils/McpConfig.d.ts.map +1 -0
- package/dist/utils/McpConfig.js +136 -0
- package/dist/utils/McpConfig.js.map +1 -0
- package/dist/utils/ProjectMigration.d.ts +82 -0
- package/dist/utils/ProjectMigration.d.ts.map +1 -0
- package/dist/utils/ProjectMigration.js +416 -0
- package/dist/utils/ProjectMigration.js.map +1 -0
- package/dist/utils/constants.d.ts +75 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +105 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/safeJson.d.ts +37 -0
- package/dist/utils/safeJson.d.ts.map +1 -0
- package/dist/utils/safeJson.js +48 -0
- package/dist/utils/safeJson.js.map +1 -0
- package/dist/utils/sanitization.d.ts +45 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +153 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/dist/utils/worktree.d.ts +15 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +86 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +98 -0
- package/scripts/changelog-check.sh +62 -0
- package/scripts/check-node.js +17 -0
- package/scripts/dev-config.js +56 -0
- 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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"}
|