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,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Migration Utility
|
|
3
|
+
* Handles migration of conversation history when project directories are renamed
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readdirSync, mkdirSync, copyFileSync } from "fs";
|
|
6
|
+
import { join } from "path";
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import Database from "better-sqlite3";
|
|
9
|
+
import { pathToProjectFolderName, validateDatabasePath } from "./sanitization.js";
|
|
10
|
+
export class ProjectMigration {
|
|
11
|
+
projectsDir;
|
|
12
|
+
constructor(_sqliteManager, projectsDir) {
|
|
13
|
+
// Parameter kept for backwards compatibility but not used
|
|
14
|
+
// Allow override of projects directory for testing
|
|
15
|
+
this.projectsDir = projectsDir || join(homedir(), ".claude", "projects");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the projects directory (for use by other classes)
|
|
19
|
+
*/
|
|
20
|
+
getProjectsDir() {
|
|
21
|
+
return this.projectsDir;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Discover old conversation folders using combined approach
|
|
25
|
+
*/
|
|
26
|
+
async discoverOldFolders(currentProjectPath) {
|
|
27
|
+
const candidates = [];
|
|
28
|
+
const projectsDir = this.projectsDir;
|
|
29
|
+
if (!existsSync(projectsDir)) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const folders = readdirSync(projectsDir);
|
|
33
|
+
for (const folder of folders) {
|
|
34
|
+
const folderPath = join(projectsDir, folder);
|
|
35
|
+
const dbPath = join(folderPath, ".cccmemory.db");
|
|
36
|
+
let storedPath = null;
|
|
37
|
+
let stats = { conversations: 0, messages: 0, lastActivity: null };
|
|
38
|
+
let pathScore = 0;
|
|
39
|
+
// Strategy 1: Check database for stored project_path
|
|
40
|
+
if (existsSync(dbPath)) {
|
|
41
|
+
try {
|
|
42
|
+
const db = new Database(dbPath, { readonly: true });
|
|
43
|
+
// Get stored project path
|
|
44
|
+
const pathRow = db
|
|
45
|
+
.prepare("SELECT project_path FROM conversations LIMIT 1")
|
|
46
|
+
.get();
|
|
47
|
+
storedPath = pathRow?.project_path || null;
|
|
48
|
+
// Get statistics
|
|
49
|
+
const statsRow = db.prepare(`
|
|
50
|
+
SELECT
|
|
51
|
+
COUNT(DISTINCT id) as conversations,
|
|
52
|
+
MAX(last_message_at) as last_activity
|
|
53
|
+
FROM conversations
|
|
54
|
+
`).get();
|
|
55
|
+
const messageCount = db
|
|
56
|
+
.prepare("SELECT COUNT(*) as count FROM messages")
|
|
57
|
+
.get();
|
|
58
|
+
stats = {
|
|
59
|
+
conversations: statsRow?.conversations || 0,
|
|
60
|
+
messages: messageCount?.count || 0,
|
|
61
|
+
lastActivity: statsRow?.last_activity || null
|
|
62
|
+
};
|
|
63
|
+
db.close();
|
|
64
|
+
// Score based on path match
|
|
65
|
+
if (storedPath) {
|
|
66
|
+
pathScore = this.scorePath(currentProjectPath, storedPath);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (_error) {
|
|
70
|
+
// Database exists but can't read - still a candidate
|
|
71
|
+
pathScore = 10;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Strategy 2: Folder name similarity
|
|
75
|
+
const expectedFolder = pathToProjectFolderName(currentProjectPath);
|
|
76
|
+
const folderScore = this.scoreFolderName(expectedFolder, folder);
|
|
77
|
+
// Strategy 3: Check for JSONL files
|
|
78
|
+
let jsonlCount = 0;
|
|
79
|
+
try {
|
|
80
|
+
jsonlCount = readdirSync(folderPath).filter(f => f.endsWith(".jsonl")).length;
|
|
81
|
+
}
|
|
82
|
+
catch (_error) {
|
|
83
|
+
// Can't read folder
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// Calculate overall score
|
|
87
|
+
const score = this.calculateOverallScore({
|
|
88
|
+
pathScore,
|
|
89
|
+
folderScore,
|
|
90
|
+
hasDatabase: existsSync(dbPath),
|
|
91
|
+
jsonlCount
|
|
92
|
+
});
|
|
93
|
+
if (score > 0 || storedPath !== null) {
|
|
94
|
+
candidates.push({
|
|
95
|
+
folderPath,
|
|
96
|
+
folderName: folder,
|
|
97
|
+
storedProjectPath: storedPath,
|
|
98
|
+
stats,
|
|
99
|
+
score
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Sort by score (highest first)
|
|
104
|
+
return candidates.sort((a, b) => b.score - a.score);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate migration is safe and possible
|
|
108
|
+
*/
|
|
109
|
+
validateMigration(sourceFolder, targetFolder, mode = "migrate") {
|
|
110
|
+
const errors = [];
|
|
111
|
+
// Check source exists
|
|
112
|
+
if (!existsSync(sourceFolder)) {
|
|
113
|
+
errors.push("Source folder does not exist");
|
|
114
|
+
return { valid: false, errors };
|
|
115
|
+
}
|
|
116
|
+
// Check source has JSONL files
|
|
117
|
+
const sourceFiles = readdirSync(sourceFolder).filter(f => f.endsWith(".jsonl"));
|
|
118
|
+
if (sourceFiles.length === 0) {
|
|
119
|
+
errors.push("Source folder has no conversation files");
|
|
120
|
+
}
|
|
121
|
+
// Check source database is readable
|
|
122
|
+
const sourceDb = join(sourceFolder, ".cccmemory.db");
|
|
123
|
+
if (existsSync(sourceDb)) {
|
|
124
|
+
try {
|
|
125
|
+
const db = new Database(sourceDb, { readonly: true });
|
|
126
|
+
db.prepare("SELECT 1 FROM conversations LIMIT 1").get();
|
|
127
|
+
db.close();
|
|
128
|
+
}
|
|
129
|
+
catch (_error) {
|
|
130
|
+
errors.push("Source database is corrupted or unreadable");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Check target doesn't have data (conflict detection) - ONLY for migrate mode
|
|
134
|
+
if (mode === "migrate" && existsSync(targetFolder)) {
|
|
135
|
+
const targetFiles = readdirSync(targetFolder).filter(f => f.endsWith(".jsonl"));
|
|
136
|
+
if (targetFiles.length > 0) {
|
|
137
|
+
errors.push("Target folder already has conversation data");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Get statistics if validation passed so far
|
|
141
|
+
let stats;
|
|
142
|
+
if (errors.length === 0 && existsSync(sourceDb)) {
|
|
143
|
+
try {
|
|
144
|
+
const db = new Database(sourceDb, { readonly: true });
|
|
145
|
+
const convCount = db
|
|
146
|
+
.prepare("SELECT COUNT(*) as count FROM conversations")
|
|
147
|
+
.get();
|
|
148
|
+
const msgCount = db
|
|
149
|
+
.prepare("SELECT COUNT(*) as count FROM messages")
|
|
150
|
+
.get();
|
|
151
|
+
db.close();
|
|
152
|
+
stats = {
|
|
153
|
+
conversations: convCount.count,
|
|
154
|
+
messages: msgCount.count,
|
|
155
|
+
files: sourceFiles.length
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (_error) {
|
|
159
|
+
// Can't get stats, but not a blocker
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
valid: errors.length === 0,
|
|
164
|
+
errors,
|
|
165
|
+
stats
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Execute migration (copy files and update database)
|
|
170
|
+
*/
|
|
171
|
+
async executeMigration(sourceFolder, targetFolder, oldProjectPath, newProjectPath, dryRun, mode = "migrate") {
|
|
172
|
+
// Validate first
|
|
173
|
+
const validation = this.validateMigration(sourceFolder, targetFolder, mode);
|
|
174
|
+
if (!validation.valid) {
|
|
175
|
+
throw new Error(`Migration validation failed: ${validation.errors.join(", ")}`);
|
|
176
|
+
}
|
|
177
|
+
if (dryRun) {
|
|
178
|
+
return {
|
|
179
|
+
success: true,
|
|
180
|
+
filesCopied: validation.stats?.files || 0,
|
|
181
|
+
databaseUpdated: false,
|
|
182
|
+
message: "Dry run: No changes made"
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
// Create target folder
|
|
186
|
+
if (!existsSync(targetFolder)) {
|
|
187
|
+
mkdirSync(targetFolder, { recursive: true });
|
|
188
|
+
}
|
|
189
|
+
const sourceDb = join(sourceFolder, ".cccmemory.db");
|
|
190
|
+
const targetDb = join(targetFolder, ".cccmemory.db");
|
|
191
|
+
// Branch based on mode
|
|
192
|
+
if (mode === "merge") {
|
|
193
|
+
return this.executeMerge(sourceFolder, targetFolder, sourceDb, targetDb, oldProjectPath, newProjectPath);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Original migrate logic (replace target)
|
|
197
|
+
// Copy all JSONL files
|
|
198
|
+
const jsonlFiles = readdirSync(sourceFolder).filter(f => f.endsWith(".jsonl"));
|
|
199
|
+
let filesCopied = 0;
|
|
200
|
+
for (const file of jsonlFiles) {
|
|
201
|
+
const sourcePath = join(sourceFolder, file);
|
|
202
|
+
const targetPath = join(targetFolder, file);
|
|
203
|
+
copyFileSync(sourcePath, targetPath);
|
|
204
|
+
filesCopied++;
|
|
205
|
+
}
|
|
206
|
+
if (existsSync(sourceDb)) {
|
|
207
|
+
// Create backup
|
|
208
|
+
const backupPath = join(sourceFolder, ".cccmemory.db.bak");
|
|
209
|
+
copyFileSync(sourceDb, backupPath);
|
|
210
|
+
// Copy database
|
|
211
|
+
copyFileSync(sourceDb, targetDb);
|
|
212
|
+
// Update project_path in the copied database
|
|
213
|
+
this.updateProjectPaths(targetDb, oldProjectPath, newProjectPath);
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
success: true,
|
|
217
|
+
filesCopied,
|
|
218
|
+
databaseUpdated: true,
|
|
219
|
+
message: `Migrated ${filesCopied} conversation files`
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Execute merge (combine source into existing target)
|
|
225
|
+
*/
|
|
226
|
+
executeMerge(sourceFolder, targetFolder, sourceDb, targetDb, oldProjectPath, newProjectPath) {
|
|
227
|
+
// Copy only JSONL files that don't exist in target (skip duplicates)
|
|
228
|
+
const sourceFiles = readdirSync(sourceFolder).filter(f => f.endsWith(".jsonl"));
|
|
229
|
+
const existingFiles = existsSync(targetFolder)
|
|
230
|
+
? readdirSync(targetFolder).filter(f => f.endsWith(".jsonl"))
|
|
231
|
+
: [];
|
|
232
|
+
const existingSet = new Set(existingFiles);
|
|
233
|
+
let filesCopied = 0;
|
|
234
|
+
for (const file of sourceFiles) {
|
|
235
|
+
if (!existingSet.has(file)) {
|
|
236
|
+
const sourcePath = join(sourceFolder, file);
|
|
237
|
+
const targetPath = join(targetFolder, file);
|
|
238
|
+
copyFileSync(sourcePath, targetPath);
|
|
239
|
+
filesCopied++;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Merge databases
|
|
243
|
+
if (existsSync(sourceDb)) {
|
|
244
|
+
if (existsSync(targetDb)) {
|
|
245
|
+
// Backup target database before merge
|
|
246
|
+
const backupPath = join(targetFolder, ".cccmemory.db.bak");
|
|
247
|
+
copyFileSync(targetDb, backupPath);
|
|
248
|
+
// Merge source into target
|
|
249
|
+
this.mergeDatabase(sourceDb, targetDb, oldProjectPath, newProjectPath);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
// No target database yet, just copy
|
|
253
|
+
copyFileSync(sourceDb, targetDb);
|
|
254
|
+
this.updateProjectPaths(targetDb, oldProjectPath, newProjectPath);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
success: true,
|
|
259
|
+
filesCopied,
|
|
260
|
+
databaseUpdated: true,
|
|
261
|
+
message: `Merged ${filesCopied} new conversation files into target`
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Merge source database into target database (INSERT OR IGNORE strategy)
|
|
266
|
+
*/
|
|
267
|
+
mergeDatabase(sourceDbPath, targetDbPath, oldProjectPath, newProjectPath) {
|
|
268
|
+
// Check which tables exist BEFORE attaching
|
|
269
|
+
const source = new Database(sourceDbPath, { readonly: true });
|
|
270
|
+
const sourceTables = new Set(source.prepare("SELECT name FROM sqlite_master WHERE type='table'").all().map(row => row.name));
|
|
271
|
+
source.close();
|
|
272
|
+
const target = new Database(targetDbPath);
|
|
273
|
+
const targetTables = new Set(target.prepare("SELECT name FROM sqlite_master WHERE type='table'").all().map(row => row.name));
|
|
274
|
+
try {
|
|
275
|
+
target.exec("BEGIN TRANSACTION");
|
|
276
|
+
// Attach source database (validate path to prevent SQL injection)
|
|
277
|
+
const safeSourcePath = validateDatabasePath(sourceDbPath);
|
|
278
|
+
target.exec(`ATTACH DATABASE '${safeSourcePath}' AS source`);
|
|
279
|
+
// Merge conversations (always exists)
|
|
280
|
+
target.exec(`
|
|
281
|
+
INSERT OR IGNORE INTO conversations
|
|
282
|
+
SELECT * FROM source.conversations
|
|
283
|
+
`);
|
|
284
|
+
// Merge other tables only if they exist in both databases
|
|
285
|
+
const tablesToMerge = [
|
|
286
|
+
"messages",
|
|
287
|
+
"tool_uses",
|
|
288
|
+
"decisions",
|
|
289
|
+
"mistakes",
|
|
290
|
+
"requirements",
|
|
291
|
+
"file_evolution",
|
|
292
|
+
"git_commits"
|
|
293
|
+
];
|
|
294
|
+
for (const table of tablesToMerge) {
|
|
295
|
+
if (sourceTables.has(table) && targetTables.has(table)) {
|
|
296
|
+
target.exec(`
|
|
297
|
+
INSERT OR IGNORE INTO ${table}
|
|
298
|
+
SELECT * FROM source.${table}
|
|
299
|
+
`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// Update project_path for newly merged conversations from source
|
|
303
|
+
const stmt = target.prepare(`
|
|
304
|
+
UPDATE conversations
|
|
305
|
+
SET project_path = ?
|
|
306
|
+
WHERE project_path = ?
|
|
307
|
+
`);
|
|
308
|
+
stmt.run(newProjectPath, oldProjectPath);
|
|
309
|
+
target.exec("COMMIT");
|
|
310
|
+
// Detach source after commit
|
|
311
|
+
target.exec("DETACH DATABASE source");
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
try {
|
|
315
|
+
target.exec("ROLLBACK");
|
|
316
|
+
}
|
|
317
|
+
catch (_rollbackError) {
|
|
318
|
+
// Rollback might fail if transaction already ended
|
|
319
|
+
}
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
finally {
|
|
323
|
+
target.close();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Update project_path in database (with transaction)
|
|
328
|
+
*/
|
|
329
|
+
updateProjectPaths(dbPath, oldPath, newPath) {
|
|
330
|
+
const db = new Database(dbPath);
|
|
331
|
+
try {
|
|
332
|
+
db.exec("BEGIN TRANSACTION");
|
|
333
|
+
const stmt = db.prepare("UPDATE conversations SET project_path = ? WHERE project_path = ?");
|
|
334
|
+
const result = stmt.run(newPath, oldPath);
|
|
335
|
+
if (result.changes === 0) {
|
|
336
|
+
throw new Error("No conversations updated - path mismatch");
|
|
337
|
+
}
|
|
338
|
+
db.exec("COMMIT");
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
db.exec("ROLLBACK");
|
|
342
|
+
db.close();
|
|
343
|
+
throw error;
|
|
344
|
+
}
|
|
345
|
+
db.close();
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Score path similarity
|
|
349
|
+
*/
|
|
350
|
+
scorePath(currentPath, oldPath) {
|
|
351
|
+
// Exact match
|
|
352
|
+
if (currentPath === oldPath) {
|
|
353
|
+
return 100;
|
|
354
|
+
}
|
|
355
|
+
// Split into components using platform-aware separator
|
|
356
|
+
// Handle both Unix (/) and Windows (\) paths
|
|
357
|
+
const pathSeparatorRegex = /[\\/]/;
|
|
358
|
+
const currentParts = currentPath.split(pathSeparatorRegex).filter(p => p.length > 0);
|
|
359
|
+
const oldParts = oldPath.split(pathSeparatorRegex).filter(p => p.length > 0);
|
|
360
|
+
// Count matching components
|
|
361
|
+
let matches = 0;
|
|
362
|
+
const minLength = Math.min(currentParts.length, oldParts.length);
|
|
363
|
+
for (let i = 0; i < minLength; i++) {
|
|
364
|
+
if (currentParts[i] === oldParts[i]) {
|
|
365
|
+
matches++;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// If only one component differs and same length, likely a rename
|
|
369
|
+
if (currentParts.length === oldParts.length &&
|
|
370
|
+
matches === currentParts.length - 1) {
|
|
371
|
+
return 80;
|
|
372
|
+
}
|
|
373
|
+
// General similarity score
|
|
374
|
+
return (matches / Math.max(currentParts.length, oldParts.length)) * 100;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Score folder name similarity
|
|
378
|
+
*/
|
|
379
|
+
scoreFolderName(expected, actual) {
|
|
380
|
+
// Exact match
|
|
381
|
+
if (expected === actual) {
|
|
382
|
+
return 100;
|
|
383
|
+
}
|
|
384
|
+
// Split by dashes
|
|
385
|
+
const expectedParts = expected.split("-").filter(p => p.length > 0);
|
|
386
|
+
const actualParts = actual.split("-").filter(p => p.length > 0);
|
|
387
|
+
// Count matching parts
|
|
388
|
+
let matches = 0;
|
|
389
|
+
const minLength = Math.min(expectedParts.length, actualParts.length);
|
|
390
|
+
for (let i = 0; i < minLength; i++) {
|
|
391
|
+
if (expectedParts[i] === actualParts[i]) {
|
|
392
|
+
matches++;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Calculate percentage
|
|
396
|
+
return (matches / Math.max(expectedParts.length, actualParts.length)) * 100;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Calculate overall score from multiple factors
|
|
400
|
+
*/
|
|
401
|
+
calculateOverallScore(factors) {
|
|
402
|
+
let score = 0;
|
|
403
|
+
// Path similarity is most important (0-100 points)
|
|
404
|
+
score += factors.pathScore;
|
|
405
|
+
// Folder name similarity (weighted 50%)
|
|
406
|
+
score += factors.folderScore * 0.5;
|
|
407
|
+
// Having a database is good (20 points)
|
|
408
|
+
if (factors.hasDatabase) {
|
|
409
|
+
score += 20;
|
|
410
|
+
}
|
|
411
|
+
// More JSONL files = higher confidence (1 point per file, max 30)
|
|
412
|
+
score += Math.min(factors.jsonlCount, 30);
|
|
413
|
+
return score;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=ProjectMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectMigration.js","sourceRoot":"","sources":["../../src/utils/ProjectMigration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAsClF,MAAM,OAAO,gBAAgB;IACnB,WAAW,CAAS;IAE5B,YAAY,cAAwB,EAAE,WAAoB;QACxD,0DAA0D;QAC1D,mDAAmD;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,kBAA0B;QACjD,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAEjD,IAAI,UAAU,GAAkB,IAAI,CAAC;YACrC,IAAI,KAAK,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,IAAqB,EAAE,CAAC;YACnF,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,qDAAqD;YACrD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBAEpD,0BAA0B;oBAC1B,MAAM,OAAO,GAAG,EAAE;yBACf,OAAO,CAAC,gDAAgD,CAAC;yBACzD,GAAG,EAA0C,CAAC;oBACjD,UAAU,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;oBAE3C,iBAAiB;oBACjB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;WAK3B,CAAC,CAAC,GAAG,EAAyE,CAAC;oBAEhF,MAAM,YAAY,GAAG,EAAE;yBACpB,OAAO,CAAC,wCAAwC,CAAC;yBACjD,GAAG,EAAmC,CAAC;oBAE1C,KAAK,GAAG;wBACN,aAAa,EAAE,QAAQ,EAAE,aAAa,IAAI,CAAC;wBAC3C,QAAQ,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;wBAClC,YAAY,EAAE,QAAQ,EAAE,aAAa,IAAI,IAAI;qBAC9C,CAAC;oBAEF,EAAE,CAAC,KAAK,EAAE,CAAC;oBAEX,4BAA4B;oBAC5B,IAAI,UAAU,EAAE,CAAC;wBACf,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;gBAAC,OAAO,MAAM,EAAE,CAAC;oBAChB,qDAAqD;oBACrD,SAAS,GAAG,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,qCAAqC;YACrC,MAAM,cAAc,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;YACnE,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAEjE,oCAAoC;YACpC,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC;gBACH,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAChF,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,oBAAoB;gBACpB,SAAS;YACX,CAAC;YAED,0BAA0B;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC;gBACvC,SAAS;gBACT,WAAW;gBACX,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC;gBAC/B,UAAU;aACX,CAAC,CAAC;YAEH,IAAI,KAAK,GAAG,CAAC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC;oBACd,UAAU;oBACV,UAAU,EAAE,MAAM;oBAClB,iBAAiB,EAAE,UAAU;oBAC7B,KAAK;oBACL,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,iBAAiB,CACf,YAAoB,EACpB,YAAoB,EACpB,OAA4B,SAAS;QAErC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,sBAAsB;QACtB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QAED,+BAA+B;QAC/B,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;QAED,oCAAoC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAE,CAAC;gBACxD,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,8EAA8E;QAC9E,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnD,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,KAA6E,CAAC;QAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,EAAE;qBACjB,OAAO,CAAC,6CAA6C,CAAC;qBACtD,GAAG,EAAuB,CAAC;gBAC9B,MAAM,QAAQ,GAAG,EAAE;qBAChB,OAAO,CAAC,wCAAwC,CAAC;qBACjD,GAAG,EAAuB,CAAC;gBAC9B,EAAE,CAAC,KAAK,EAAE,CAAC;gBAEX,KAAK,GAAG;oBACN,aAAa,EAAE,SAAS,CAAC,KAAK;oBAC9B,QAAQ,EAAE,QAAQ,CAAC,KAAK;oBACxB,KAAK,EAAE,WAAW,CAAC,MAAM;iBAC1B,CAAC;YACJ,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,qCAAqC;YACvC,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,KAAK;SACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,YAAoB,EACpB,YAAoB,EACpB,cAAsB,EACtB,cAAsB,EACtB,MAAe,EACf,OAA4B,SAAS;QAErC,iBAAiB;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC;gBACzC,eAAe,EAAE,KAAK;gBACtB,OAAO,EAAE,0BAA0B;aACpC,CAAC;QACJ,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAErD,uBAAuB;QACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,YAAY,CACtB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,cAAc,CACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,uBAAuB;YACvB,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/E,IAAI,WAAW,GAAG,CAAC,CAAC;YAEpB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC5C,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACrC,WAAW,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,gBAAgB;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;gBAC3D,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAEnC,gBAAgB;gBAChB,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAEjC,6CAA6C;gBAC7C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;YACpE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,WAAW;gBACX,eAAe,EAAE,IAAI;gBACrB,OAAO,EAAE,YAAY,WAAW,qBAAqB;aACtD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAClB,YAAoB,EACpB,YAAoB,EACpB,QAAgB,EAChB,QAAgB,EAChB,cAAsB,EACtB,cAAsB;QAEtB,qEAAqE;QACrE,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChF,MAAM,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC;YAC5C,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7D,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QAE3C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC5C,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACrC,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,sCAAsC;gBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;gBAC3D,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAEnC,2BAA2B;gBAC3B,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW;YACX,eAAe,EAAE,IAAI;YACrB,OAAO,EAAE,UAAU,WAAW,qCAAqC;SACpE,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CACnB,YAAoB,EACpB,YAAoB,EACpB,cAAsB,EACtB,cAAsB;QAEtB,4CAA4C;QAC5C,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAExB,MAAM,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,EACxE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CACvB,CAAC;QACF,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAExB,MAAM,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,EACxE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CACvB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAEjC,kEAAkE;YAClE,MAAM,cAAc,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,oBAAoB,cAAc,aAAa,CAAC,CAAC;YAE7D,sCAAsC;YACtC,MAAM,CAAC,IAAI,CAAC;;;OAGX,CAAC,CAAC;YAEH,0DAA0D;YAC1D,MAAM,aAAa,GAAG;gBACpB,UAAU;gBACV,WAAW;gBACX,WAAW;gBACX,UAAU;gBACV,cAAc;gBACd,gBAAgB;gBAChB,aAAa;aACd,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvD,MAAM,CAAC,IAAI,CAAC;oCACc,KAAK;mCACN,KAAK;WAC7B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,iEAAiE;YACjE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;;;OAI3B,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAEzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtB,6BAA6B;YAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,cAAc,EAAE,CAAC;gBACxB,mDAAmD;YACrD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAc,EAAE,OAAe,EAAE,OAAe;QACzE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAE7B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;YAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE1C,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YAED,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,CAAC;QACd,CAAC;QAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,WAAmB,EAAE,OAAe;QAC5C,cAAc;QACd,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC;QACb,CAAC;QAED,uDAAuD;QACvD,6CAA6C;QAC7C,MAAM,kBAAkB,GAAG,OAAO,CAAC;QACnC,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE7E,4BAA4B;QAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpC,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IACE,YAAY,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;YACvC,OAAO,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,EACnC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB,EAAE,MAAc;QAC9C,cAAc;QACd,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,kBAAkB;QAClB,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhE,uBAAuB;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAErE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,OAAqB;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,mDAAmD;QACnD,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;QAE3B,wCAAwC;QACxC,KAAK,IAAI,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC;QAEnC,wCAAwC;QACxC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;QAED,kEAAkE;QAClE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE1C,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Constants
|
|
3
|
+
*
|
|
4
|
+
* Centralized location for magic numbers and configuration values.
|
|
5
|
+
* Extracted from scattered literals throughout the codebase.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DB_CONFIG: {
|
|
8
|
+
readonly CACHE_SIZE_KB: 64000;
|
|
9
|
+
readonly MMAP_SIZE: 30000000000;
|
|
10
|
+
readonly PAGE_SIZE: 4096;
|
|
11
|
+
readonly WAL_AUTOCHECKPOINT: 1000;
|
|
12
|
+
readonly DB_FILE_NAME: ".cccmemory.db";
|
|
13
|
+
readonly BACKUP_SUFFIX: ".bak";
|
|
14
|
+
};
|
|
15
|
+
export declare const EMBEDDING_CONFIG: {
|
|
16
|
+
readonly OLLAMA_DEFAULT_DIMENSIONS: 1024;
|
|
17
|
+
readonly TRANSFORMERS_DEFAULT_DIMENSIONS: 384;
|
|
18
|
+
readonly OPENAI_DEFAULT_DIMENSIONS: 1536;
|
|
19
|
+
readonly OLLAMA_DEFAULT_MODEL: "mxbai-embed-large";
|
|
20
|
+
readonly TRANSFORMERS_DEFAULT_MODEL: "Xenova/all-MiniLM-L6-v2";
|
|
21
|
+
readonly OPENAI_DEFAULT_MODEL: "text-embedding-ada-002";
|
|
22
|
+
readonly BATCH_SIZE: 100;
|
|
23
|
+
readonly DEFAULT_SIMILARITY_THRESHOLD: 0.7;
|
|
24
|
+
};
|
|
25
|
+
export declare const SEARCH_CONFIG: {
|
|
26
|
+
readonly DEFAULT_LIMIT: 10;
|
|
27
|
+
readonly MAX_LIMIT: 100;
|
|
28
|
+
readonly SNIPPET_CONTEXT_CHARS: 200;
|
|
29
|
+
readonly DEFAULT_DAYS_BACK: 30;
|
|
30
|
+
};
|
|
31
|
+
export declare const PATH_PATTERNS: {
|
|
32
|
+
readonly CLAUDE_DIR: ".claude";
|
|
33
|
+
readonly PROJECTS_DIR: "projects";
|
|
34
|
+
readonly LEGACY_PREFIX: "-Users-";
|
|
35
|
+
readonly CONFIG_FILE: ".claude-memory-config.jsonc";
|
|
36
|
+
};
|
|
37
|
+
export declare const TIME: {
|
|
38
|
+
readonly SECOND: 1000;
|
|
39
|
+
readonly MINUTE: number;
|
|
40
|
+
readonly HOUR: number;
|
|
41
|
+
readonly DAY: number;
|
|
42
|
+
readonly WEEK: number;
|
|
43
|
+
};
|
|
44
|
+
export declare const LIMITS: {
|
|
45
|
+
readonly MAX_MESSAGE_LENGTH: 100000;
|
|
46
|
+
readonly MAX_FILE_PATH_LENGTH: 4096;
|
|
47
|
+
readonly MAX_DECISION_LENGTH: 10000;
|
|
48
|
+
readonly MAX_BATCH_SIZE: 1000;
|
|
49
|
+
readonly MAX_SEARCH_RESULTS: 1000;
|
|
50
|
+
readonly MIN_SIMILARITY_SCORE: 0;
|
|
51
|
+
readonly MAX_SIMILARITY_SCORE: 1;
|
|
52
|
+
};
|
|
53
|
+
export declare const MIGRATION_CONFIG: {
|
|
54
|
+
readonly MIN_CONVERSATIONS_FOR_MIGRATION: 1;
|
|
55
|
+
readonly MIN_SIMILARITY_SCORE_FOR_MATCH: 0.7;
|
|
56
|
+
readonly AUTO_BACKUP: true;
|
|
57
|
+
readonly KEEP_SOURCE_FILES: true;
|
|
58
|
+
};
|
|
59
|
+
export declare const MCP_CONFIG: {
|
|
60
|
+
readonly TOOL_TIMEOUT_MS: 30000;
|
|
61
|
+
readonly BATCH_PROCESSING_SIZE: 50;
|
|
62
|
+
};
|
|
63
|
+
export declare const ERROR_MESSAGES: {
|
|
64
|
+
readonly NO_CONVERSATIONS_FOUND: "No conversations found";
|
|
65
|
+
readonly INDEX_REQUIRED: "Please index conversations first";
|
|
66
|
+
readonly INVALID_PROJECT_PATH: "Invalid project path";
|
|
67
|
+
readonly DATABASE_ERROR: "Database operation failed";
|
|
68
|
+
readonly EMBEDDING_ERROR: "Embedding generation failed";
|
|
69
|
+
};
|
|
70
|
+
export declare const SUCCESS_MESSAGES: {
|
|
71
|
+
readonly INDEX_COMPLETE: "Indexing complete";
|
|
72
|
+
readonly MIGRATION_COMPLETE: "Migration complete";
|
|
73
|
+
readonly BACKUP_CREATED: "Backup created successfully";
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,eAAO,MAAM,SAAS;;;;;;;CAYZ,CAAC;AAGX,eAAO,MAAM,gBAAgB;;;;;;;;;CAgBnB,CAAC;AAGX,eAAO,MAAM,aAAa;;;;;CAUhB,CAAC;AAGX,eAAO,MAAM,aAAa;;;;;CAUhB,CAAC;AAGX,eAAO,MAAM,IAAI;;;;;;CAMP,CAAC;AAGX,eAAO,MAAM,MAAM;;;;;;;;CAaT,CAAC;AAGX,eAAO,MAAM,gBAAgB;;;;;CAQnB,CAAC;AAGX,eAAO,MAAM,UAAU;;;CAMb,CAAC;AAGX,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAGX,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Constants
|
|
3
|
+
*
|
|
4
|
+
* Centralized location for magic numbers and configuration values.
|
|
5
|
+
* Extracted from scattered literals throughout the codebase.
|
|
6
|
+
*/
|
|
7
|
+
// Database Configuration
|
|
8
|
+
export const DB_CONFIG = {
|
|
9
|
+
// Performance settings (from SQLiteManager)
|
|
10
|
+
CACHE_SIZE_KB: 64000, // 64MB cache
|
|
11
|
+
MMAP_SIZE: 30000000000, // 30GB memory-mapped I/O
|
|
12
|
+
PAGE_SIZE: 4096, // 4KB page size
|
|
13
|
+
WAL_AUTOCHECKPOINT: 1000, // Checkpoint WAL after 1000 pages
|
|
14
|
+
// Database file name
|
|
15
|
+
DB_FILE_NAME: '.cccmemory.db',
|
|
16
|
+
// Backup suffix
|
|
17
|
+
BACKUP_SUFFIX: '.bak',
|
|
18
|
+
};
|
|
19
|
+
// Embedding Configuration
|
|
20
|
+
export const EMBEDDING_CONFIG = {
|
|
21
|
+
// Default model dimensions
|
|
22
|
+
OLLAMA_DEFAULT_DIMENSIONS: 1024, // mxbai-embed-large
|
|
23
|
+
TRANSFORMERS_DEFAULT_DIMENSIONS: 384, // Xenova/all-MiniLM-L6-v2
|
|
24
|
+
OPENAI_DEFAULT_DIMENSIONS: 1536, // text-embedding-ada-002
|
|
25
|
+
// Default models
|
|
26
|
+
OLLAMA_DEFAULT_MODEL: 'mxbai-embed-large',
|
|
27
|
+
TRANSFORMERS_DEFAULT_MODEL: 'Xenova/all-MiniLM-L6-v2',
|
|
28
|
+
OPENAI_DEFAULT_MODEL: 'text-embedding-ada-002',
|
|
29
|
+
// Batch size for embedding generation
|
|
30
|
+
BATCH_SIZE: 100,
|
|
31
|
+
// Similarity threshold
|
|
32
|
+
DEFAULT_SIMILARITY_THRESHOLD: 0.7,
|
|
33
|
+
};
|
|
34
|
+
// Search Configuration
|
|
35
|
+
export const SEARCH_CONFIG = {
|
|
36
|
+
// Default result limits
|
|
37
|
+
DEFAULT_LIMIT: 10,
|
|
38
|
+
MAX_LIMIT: 100,
|
|
39
|
+
// Context window for snippets
|
|
40
|
+
SNIPPET_CONTEXT_CHARS: 200,
|
|
41
|
+
// Date range defaults
|
|
42
|
+
DEFAULT_DAYS_BACK: 30,
|
|
43
|
+
};
|
|
44
|
+
// File Path Patterns
|
|
45
|
+
export const PATH_PATTERNS = {
|
|
46
|
+
// Conversation directories
|
|
47
|
+
CLAUDE_DIR: '.claude',
|
|
48
|
+
PROJECTS_DIR: 'projects',
|
|
49
|
+
// Legacy patterns
|
|
50
|
+
LEGACY_PREFIX: '-Users-',
|
|
51
|
+
// Config file
|
|
52
|
+
CONFIG_FILE: '.claude-memory-config.jsonc',
|
|
53
|
+
};
|
|
54
|
+
// Time Constants (milliseconds)
|
|
55
|
+
export const TIME = {
|
|
56
|
+
SECOND: 1000,
|
|
57
|
+
MINUTE: 60 * 1000,
|
|
58
|
+
HOUR: 60 * 60 * 1000,
|
|
59
|
+
DAY: 24 * 60 * 60 * 1000,
|
|
60
|
+
WEEK: 7 * 24 * 60 * 60 * 1000,
|
|
61
|
+
};
|
|
62
|
+
// Validation Limits
|
|
63
|
+
export const LIMITS = {
|
|
64
|
+
// String length limits
|
|
65
|
+
MAX_MESSAGE_LENGTH: 100000,
|
|
66
|
+
MAX_FILE_PATH_LENGTH: 4096,
|
|
67
|
+
MAX_DECISION_LENGTH: 10000,
|
|
68
|
+
// Array size limits
|
|
69
|
+
MAX_BATCH_SIZE: 1000,
|
|
70
|
+
MAX_SEARCH_RESULTS: 1000,
|
|
71
|
+
// Numeric limits
|
|
72
|
+
MIN_SIMILARITY_SCORE: 0.0,
|
|
73
|
+
MAX_SIMILARITY_SCORE: 1.0,
|
|
74
|
+
};
|
|
75
|
+
// Migration Configuration
|
|
76
|
+
export const MIGRATION_CONFIG = {
|
|
77
|
+
// Validation thresholds
|
|
78
|
+
MIN_CONVERSATIONS_FOR_MIGRATION: 1,
|
|
79
|
+
MIN_SIMILARITY_SCORE_FOR_MATCH: 0.7,
|
|
80
|
+
// Backup behavior
|
|
81
|
+
AUTO_BACKUP: true,
|
|
82
|
+
KEEP_SOURCE_FILES: true,
|
|
83
|
+
};
|
|
84
|
+
// MCP Configuration
|
|
85
|
+
export const MCP_CONFIG = {
|
|
86
|
+
// Tool timeout
|
|
87
|
+
TOOL_TIMEOUT_MS: 30000, // 30 seconds
|
|
88
|
+
// Batch processing
|
|
89
|
+
BATCH_PROCESSING_SIZE: 50,
|
|
90
|
+
};
|
|
91
|
+
// Error Messages (commonly reused)
|
|
92
|
+
export const ERROR_MESSAGES = {
|
|
93
|
+
NO_CONVERSATIONS_FOUND: 'No conversations found',
|
|
94
|
+
INDEX_REQUIRED: 'Please index conversations first',
|
|
95
|
+
INVALID_PROJECT_PATH: 'Invalid project path',
|
|
96
|
+
DATABASE_ERROR: 'Database operation failed',
|
|
97
|
+
EMBEDDING_ERROR: 'Embedding generation failed',
|
|
98
|
+
};
|
|
99
|
+
// Success Messages (commonly reused)
|
|
100
|
+
export const SUCCESS_MESSAGES = {
|
|
101
|
+
INDEX_COMPLETE: 'Indexing complete',
|
|
102
|
+
MIGRATION_COMPLETE: 'Migration complete',
|
|
103
|
+
BACKUP_CREATED: 'Backup created successfully',
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe JSON parsing utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides crash-safe JSON parsing with fallback values.
|
|
5
|
+
* Use this instead of raw JSON.parse() when parsing data from:
|
|
6
|
+
* - Database rows (may be corrupted)
|
|
7
|
+
* - User input
|
|
8
|
+
* - External sources
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Safely parse JSON with a fallback value on error.
|
|
12
|
+
*
|
|
13
|
+
* Unlike JSON.parse(), this function:
|
|
14
|
+
* - Never throws
|
|
15
|
+
* - Handles null/undefined input
|
|
16
|
+
* - Handles non-string input
|
|
17
|
+
* - Returns the fallback on any parse error
|
|
18
|
+
*
|
|
19
|
+
* @param value - The JSON string to parse
|
|
20
|
+
* @param fallback - Value to return if parsing fails
|
|
21
|
+
* @returns Parsed value or fallback
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Safe object parsing
|
|
26
|
+
* const data = safeJsonParse(row.metadata, {});
|
|
27
|
+
*
|
|
28
|
+
* // Safe array parsing
|
|
29
|
+
* const files = safeJsonParse(row.files_changed, []);
|
|
30
|
+
*
|
|
31
|
+
* // With specific type
|
|
32
|
+
* interface Config { debug: boolean }
|
|
33
|
+
* const config = safeJsonParse<Config>(jsonStr, { debug: false });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function safeJsonParse<T>(value: string | null | undefined, fallback: T): T;
|
|
37
|
+
//# sourceMappingURL=safeJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeJson.d.ts","sourceRoot":"","sources":["../../src/utils/safeJson.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAWjF"}
|