mcp-code-context 3.6.3 → 3.7.1
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/CHANGELOG.md +149 -278
- package/INSTRUCTIONS.md +23 -9
- package/README.md +217 -97
- package/SECURITY.md +55 -21
- package/dist/src/core/cacheManager.d.ts +4 -5
- package/dist/src/core/cacheManager.js +49 -33
- package/dist/src/core/cacheManager.js.map +1 -1
- package/dist/src/core/engine.d.ts +1 -1
- package/dist/src/core/engine.js +3 -3
- package/dist/src/core/engine.js.map +1 -1
- package/dist/src/core/indexManager.d.ts +58 -0
- package/dist/src/core/indexManager.js +252 -0
- package/dist/src/core/indexManager.js.map +1 -0
- package/dist/src/core/indexManagerQueries.d.ts +14 -0
- package/dist/src/core/indexManagerQueries.js +95 -0
- package/dist/src/core/indexManagerQueries.js.map +1 -0
- package/dist/src/core/sessionManager.d.ts +117 -0
- package/dist/src/core/sessionManager.js +231 -0
- package/dist/src/core/sessionManager.js.map +1 -0
- package/dist/src/core/validator.d.ts +1 -1
- package/dist/src/core/validator.js +18 -10
- package/dist/src/core/validator.js.map +1 -1
- package/dist/src/index.d.ts +1 -13
- package/dist/src/index.js +25 -999
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/astTransform.d.ts +38 -0
- package/dist/src/operations/astTransform.js +239 -0
- package/dist/src/operations/astTransform.js.map +1 -0
- package/dist/src/operations/compress.d.ts +5 -3
- package/dist/src/operations/compress.js +73 -7
- package/dist/src/operations/compress.js.map +1 -1
- package/dist/src/operations/confirmationStore.d.ts +35 -8
- package/dist/src/operations/confirmationStore.js +112 -14
- package/dist/src/operations/confirmationStore.js.map +1 -1
- package/dist/src/operations/impactAnalysis.d.ts +9 -0
- package/dist/src/operations/impactAnalysis.js +61 -0
- package/dist/src/operations/impactAnalysis.js.map +1 -0
- package/dist/src/operations/pendingStore.d.ts +51 -0
- package/dist/src/operations/pendingStore.js +201 -0
- package/dist/src/operations/pendingStore.js.map +1 -0
- package/dist/src/operations/pendingStoreInit.d.ts +6 -0
- package/dist/src/operations/pendingStoreInit.js +42 -0
- package/dist/src/operations/pendingStoreInit.js.map +1 -0
- package/dist/src/operations/read.d.ts +6 -92
- package/dist/src/operations/read.js +4 -449
- package/dist/src/operations/read.js.map +1 -1
- package/dist/src/operations/readCore.d.ts +33 -0
- package/dist/src/operations/readCore.js +142 -0
- package/dist/src/operations/readCore.js.map +1 -0
- package/dist/src/operations/rename.d.ts +13 -0
- package/dist/src/operations/rename.js +130 -0
- package/dist/src/operations/rename.js.map +1 -0
- package/dist/src/operations/searchOperation.d.ts +16 -0
- package/dist/src/operations/searchOperation.js +113 -0
- package/dist/src/operations/searchOperation.js.map +1 -0
- package/dist/src/operations/symbolQuery.d.ts +38 -0
- package/dist/src/operations/symbolQuery.js +194 -0
- package/dist/src/operations/symbolQuery.js.map +1 -0
- package/dist/src/operations/write.d.ts +11 -14
- package/dist/src/operations/write.js +6 -125
- package/dist/src/operations/write.js.map +1 -1
- package/dist/src/parsers/base.d.ts +1 -1
- package/dist/src/parsers/base.js +1 -1
- package/dist/src/parsers/csharp.d.ts +12 -0
- package/dist/src/parsers/csharp.js +67 -0
- package/dist/src/parsers/csharp.js.map +1 -0
- package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
- package/dist/src/parsers/dartTreeSitter.js +1 -1
- package/dist/src/parsers/go.d.ts +11 -0
- package/dist/src/parsers/go.js +74 -0
- package/dist/src/parsers/go.js.map +1 -0
- package/dist/src/parsers/java.d.ts +12 -0
- package/dist/src/parsers/java.js +62 -0
- package/dist/src/parsers/java.js.map +1 -0
- package/dist/src/parsers/kotlin.d.ts +12 -0
- package/dist/src/parsers/kotlin.js +75 -0
- package/dist/src/parsers/kotlin.js.map +1 -0
- package/dist/src/parsers/php.d.ts +1 -1
- package/dist/src/parsers/php.js +1 -1
- package/dist/src/parsers/python.d.ts +1 -1
- package/dist/src/parsers/python.js +1 -1
- package/dist/src/parsers/registry.d.ts +1 -1
- package/dist/src/parsers/registry.js +63 -2
- package/dist/src/parsers/registry.js.map +1 -1
- package/dist/src/parsers/ruby.d.ts +12 -0
- package/dist/src/parsers/ruby.js +73 -0
- package/dist/src/parsers/ruby.js.map +1 -0
- package/dist/src/parsers/rust.d.ts +12 -0
- package/dist/src/parsers/rust.js +66 -0
- package/dist/src/parsers/rust.js.map +1 -0
- package/dist/src/parsers/typescript.d.ts +1 -1
- package/dist/src/parsers/typescript.js +28 -38
- package/dist/src/parsers/typescript.js.map +1 -1
- package/dist/src/tools/adminHandlers.d.ts +67 -0
- package/dist/src/tools/adminHandlers.js +129 -0
- package/dist/src/tools/adminHandlers.js.map +1 -0
- package/dist/src/tools/context.d.ts +9 -0
- package/dist/src/tools/context.js +21 -0
- package/dist/src/tools/context.js.map +1 -0
- package/dist/src/tools/handlers.d.ts +4 -0
- package/dist/src/tools/handlers.js +5 -0
- package/dist/src/tools/handlers.js.map +1 -0
- package/dist/src/tools/pipeline.d.ts +6 -0
- package/dist/src/tools/pipeline.js +100 -0
- package/dist/src/tools/pipeline.js.map +1 -0
- package/dist/src/tools/readHandlers.d.ts +55 -0
- package/dist/src/tools/readHandlers.js +220 -0
- package/dist/src/tools/readHandlers.js.map +1 -0
- package/dist/src/tools/toolDefinitions.d.ts +1037 -0
- package/dist/src/tools/toolDefinitions.js +13 -0
- package/dist/src/tools/toolDefinitions.js.map +1 -0
- package/dist/src/tools/toolDefinitionsAdmin.d.ts +89 -0
- package/dist/src/tools/toolDefinitionsAdmin.js +99 -0
- package/dist/src/tools/toolDefinitionsAdmin.js.map +1 -0
- package/dist/src/tools/toolDefinitionsCore.d.ts +949 -0
- package/dist/src/tools/toolDefinitionsCore.js +267 -0
- package/dist/src/tools/toolDefinitionsCore.js.map +1 -0
- package/dist/src/tools/writeHandlers.d.ts +37 -0
- package/dist/src/tools/writeHandlers.js +199 -0
- package/dist/src/tools/writeHandlers.js.map +1 -0
- package/dist/src/utils/appDir.d.ts +19 -0
- package/dist/src/utils/appDir.js +50 -0
- package/dist/src/utils/appDir.js.map +1 -0
- package/dist/src/utils/auditLogWriter.d.ts +9 -0
- package/dist/src/utils/auditLogWriter.js +49 -0
- package/dist/src/utils/auditLogWriter.js.map +1 -0
- package/dist/src/utils/auditLogger.d.ts +1 -10
- package/dist/src/utils/auditLogger.js +14 -109
- package/dist/src/utils/auditLogger.js.map +1 -1
- package/dist/src/utils/auditQuery.d.ts +23 -0
- package/dist/src/utils/auditQuery.js +67 -0
- package/dist/src/utils/auditQuery.js.map +1 -0
- package/dist/src/utils/backupManager.d.ts +2 -2
- package/dist/src/utils/backupManager.js +29 -12
- package/dist/src/utils/backupManager.js.map +1 -1
- package/dist/src/utils/constants.d.ts +1 -1
- package/dist/src/utils/constants.js +8 -1
- package/dist/src/utils/constants.js.map +1 -1
- package/dist/src/utils/diff.d.ts +12 -1
- package/dist/src/utils/diff.js +41 -1
- package/dist/src/utils/diff.js.map +1 -1
- package/dist/src/utils/fileLock.d.ts +7 -2
- package/dist/src/utils/fileLock.js +14 -11
- package/dist/src/utils/fileLock.js.map +1 -1
- package/dist/src/utils/fileWalker.d.ts +1 -1
- package/dist/src/utils/fileWalker.js +1 -1
- package/dist/src/utils/fileWatcher.d.ts +1 -1
- package/dist/src/utils/fileWatcher.js +1 -1
- package/dist/src/utils/fuzzySearch.d.ts +1 -1
- package/dist/src/utils/fuzzySearch.js +1 -1
- package/dist/src/utils/logger.d.ts +1 -1
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/logger.js.map +1 -1
- package/dist/src/utils/rateLimiter.d.ts +9 -1
- package/dist/src/utils/rateLimiter.js +12 -1
- package/dist/src/utils/rateLimiter.js.map +1 -1
- package/dist/src/utils/regexValidator.d.ts +12 -0
- package/dist/src/utils/regexValidator.js +48 -0
- package/dist/src/utils/regexValidator.js.map +1 -0
- package/dist/src/utils/safeRegex.d.ts +2 -92
- package/dist/src/utils/safeRegex.js +41 -222
- package/dist/src/utils/safeRegex.js.map +1 -1
- package/dist/src/utils/safeRegexApi.d.ts +56 -0
- package/dist/src/utils/safeRegexApi.js +99 -0
- package/dist/src/utils/safeRegexApi.js.map +1 -0
- package/dist/src/utils/safeRegexPool.d.ts +7 -0
- package/dist/src/utils/safeRegexPool.js +102 -0
- package/dist/src/utils/safeRegexPool.js.map +1 -0
- package/dist/src/utils/searchTools.js +6 -6
- package/dist/src/utils/searchTools.js.map +1 -1
- package/dist/src/utils/streaming.d.ts +4 -3
- package/dist/src/utils/streaming.js +1 -1
- package/dist/src/utils/streaming.js.map +1 -1
- package/dist/src/utils/telemetry.d.ts +1 -1
- package/dist/src/utils/telemetry.js +1 -1
- package/dist/src/utils/toctou.d.ts +7 -0
- package/dist/src/utils/toctou.js +24 -0
- package/dist/src/utils/toctou.js.map +1 -0
- package/llms.txt +173 -21
- package/package.json +2 -2
- package/scripts/replace-version.js +0 -59
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log file I/O helpers
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
export async function initLogDir(logDir) {
|
|
7
|
+
try {
|
|
8
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
console.error("Failed to create audit log directory:", error);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function ensureLogFile(logDir, currentLogFile) {
|
|
15
|
+
if (currentLogFile)
|
|
16
|
+
return { file: currentLogFile };
|
|
17
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
18
|
+
return { file: path.join(logDir, `audit-${timestamp}.log`) };
|
|
19
|
+
}
|
|
20
|
+
export async function rotateLog(logDir, maxFiles) {
|
|
21
|
+
const files = await getLogFiles(logDir);
|
|
22
|
+
if (files.length > maxFiles) {
|
|
23
|
+
for (const file of files.slice(0, files.length - maxFiles)) {
|
|
24
|
+
try {
|
|
25
|
+
await fs.unlink(file);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Old audit log deletion is best-effort — continue with remaining files
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function getLogFiles(logDir) {
|
|
34
|
+
try {
|
|
35
|
+
const entries = await fs.readdir(logDir);
|
|
36
|
+
const files = entries
|
|
37
|
+
.filter((name) => name.startsWith("audit-") && name.endsWith(".log"))
|
|
38
|
+
.map((name) => path.join(logDir, name));
|
|
39
|
+
const stats = await Promise.all(files.map(async (file) => ({
|
|
40
|
+
file,
|
|
41
|
+
mtime: (await fs.stat(file)).mtime.getTime(),
|
|
42
|
+
})));
|
|
43
|
+
return stats.sort((a, b) => a.mtime - b.mtime).map((s) => s.file);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return []; // Log directory may not exist yet (first run)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=auditLogWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditLogWriter.js","sourceRoot":"","sources":["../../../src/utils/auditLogWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,cAA6B;IAE7B,IAAI,cAAc;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,SAAS,MAAM,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,QAAgB;IAC9D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,OAAO;aAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACpE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACzB,IAAI;YACJ,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE;SAC7C,CAAC,CAAC,CACJ,CAAC;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,8CAA8C;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Audit Logger - v3.
|
|
2
|
+
* Audit Logger - v3.7.1
|
|
3
3
|
* Comprehensive audit trail for all operations
|
|
4
4
|
*/
|
|
5
5
|
export interface AuditEntry {
|
|
@@ -48,9 +48,6 @@ export declare class AuditLogger {
|
|
|
48
48
|
* Flush buffer to file
|
|
49
49
|
*/
|
|
50
50
|
flush(): Promise<void>;
|
|
51
|
-
/**
|
|
52
|
-
* Query audit logs
|
|
53
|
-
*/
|
|
54
51
|
query(filters: {
|
|
55
52
|
startTime?: number;
|
|
56
53
|
endTime?: number;
|
|
@@ -60,9 +57,6 @@ export declare class AuditLogger {
|
|
|
60
57
|
result?: "success" | "failure";
|
|
61
58
|
limit?: number;
|
|
62
59
|
}): Promise<AuditEntry[]>;
|
|
63
|
-
/**
|
|
64
|
-
* Get audit statistics
|
|
65
|
-
*/
|
|
66
60
|
getStats(timeRange?: {
|
|
67
61
|
start: number;
|
|
68
62
|
end: number;
|
|
@@ -73,9 +67,6 @@ export declare class AuditLogger {
|
|
|
73
67
|
byResult: Record<string, number>;
|
|
74
68
|
securityEvents: number;
|
|
75
69
|
}>;
|
|
76
|
-
/**
|
|
77
|
-
* Stop logger and flush
|
|
78
|
-
*/
|
|
79
70
|
stop(): Promise<void>;
|
|
80
71
|
private initLogDir;
|
|
81
72
|
private ensureLogFile;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Audit Logger - v3.
|
|
2
|
+
* Audit Logger - v3.7.1
|
|
3
3
|
* Comprehensive audit trail for all operations
|
|
4
4
|
*/
|
|
5
5
|
import * as fs from "node:fs/promises";
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
6
|
+
import { LOG_DIR } from "./logger.js";
|
|
7
|
+
import { initLogDir as initAuditLogDir, ensureLogFile as ensureAuditLogFile, rotateLog as rotateAuditLog, getLogFiles as getAuditLogFiles, } from "./auditLogWriter.js";
|
|
8
|
+
import { queryAuditLogs, getAuditStats } from "./auditQuery.js";
|
|
8
9
|
export class AuditLogger {
|
|
9
10
|
config;
|
|
10
11
|
currentLogFile = null;
|
|
@@ -111,79 +112,12 @@ export class AuditLogger {
|
|
|
111
112
|
console.error("Failed to flush audit log:", error);
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
|
-
/**
|
|
115
|
-
* Query audit logs
|
|
116
|
-
*/
|
|
117
115
|
async query(filters) {
|
|
118
|
-
|
|
119
|
-
const limit = filters.limit || 1000;
|
|
120
|
-
try {
|
|
121
|
-
const files = await this.getLogFiles();
|
|
122
|
-
for (const file of files.reverse()) {
|
|
123
|
-
if (results.length >= limit)
|
|
124
|
-
break;
|
|
125
|
-
const content = await fs.readFile(file, "utf-8");
|
|
126
|
-
const lines = content.split("\n").filter((line) => line.trim());
|
|
127
|
-
for (const line of lines.reverse()) {
|
|
128
|
-
if (results.length >= limit)
|
|
129
|
-
break;
|
|
130
|
-
try {
|
|
131
|
-
const entry = JSON.parse(line);
|
|
132
|
-
// Apply filters
|
|
133
|
-
if (filters.startTime && entry.timestamp < filters.startTime)
|
|
134
|
-
continue;
|
|
135
|
-
if (filters.endTime && entry.timestamp > filters.endTime)
|
|
136
|
-
continue;
|
|
137
|
-
if (filters.level && entry.level !== filters.level)
|
|
138
|
-
continue;
|
|
139
|
-
if (filters.operation && entry.operation !== filters.operation)
|
|
140
|
-
continue;
|
|
141
|
-
if (filters.clientId && entry.clientId !== filters.clientId)
|
|
142
|
-
continue;
|
|
143
|
-
if (filters.result && entry.result !== filters.result)
|
|
144
|
-
continue;
|
|
145
|
-
results.push(entry);
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
// Skip invalid lines
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
catch (error) {
|
|
154
|
-
console.error("Failed to query audit logs:", error);
|
|
155
|
-
}
|
|
156
|
-
return results;
|
|
116
|
+
return queryAuditLogs(this.config.logDir, filters);
|
|
157
117
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Get audit statistics
|
|
160
|
-
*/
|
|
161
118
|
async getStats(timeRange) {
|
|
162
|
-
|
|
163
|
-
startTime: timeRange?.start,
|
|
164
|
-
endTime: timeRange?.end,
|
|
165
|
-
limit: 100000,
|
|
166
|
-
});
|
|
167
|
-
const stats = {
|
|
168
|
-
totalEntries: entries.length,
|
|
169
|
-
byLevel: {},
|
|
170
|
-
byOperation: {},
|
|
171
|
-
byResult: {},
|
|
172
|
-
securityEvents: 0,
|
|
173
|
-
};
|
|
174
|
-
for (const entry of entries) {
|
|
175
|
-
stats.byLevel[entry.level] = (stats.byLevel[entry.level] || 0) + 1;
|
|
176
|
-
stats.byOperation[entry.operation] = (stats.byOperation[entry.operation] || 0) + 1;
|
|
177
|
-
stats.byResult[entry.result] = (stats.byResult[entry.result] || 0) + 1;
|
|
178
|
-
if (entry.level === "security") {
|
|
179
|
-
stats.securityEvents++;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return stats;
|
|
119
|
+
return getAuditStats(this.config.logDir, timeRange);
|
|
183
120
|
}
|
|
184
|
-
/**
|
|
185
|
-
* Stop logger and flush
|
|
186
|
-
*/
|
|
187
121
|
async stop() {
|
|
188
122
|
if (this.flushInterval) {
|
|
189
123
|
clearInterval(this.flushInterval);
|
|
@@ -191,55 +125,23 @@ export class AuditLogger {
|
|
|
191
125
|
}
|
|
192
126
|
await this.flush();
|
|
193
127
|
}
|
|
194
|
-
// Private methods
|
|
195
128
|
async initLogDir() {
|
|
196
|
-
|
|
197
|
-
await fs.mkdir(this.config.logDir, { recursive: true });
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
console.error("Failed to create audit log directory:", error);
|
|
201
|
-
}
|
|
129
|
+
await initAuditLogDir(this.config.logDir);
|
|
202
130
|
}
|
|
203
131
|
async ensureLogFile() {
|
|
204
132
|
if (!this.currentLogFile) {
|
|
205
|
-
const
|
|
206
|
-
this.currentLogFile =
|
|
133
|
+
const { file } = await ensureAuditLogFile(this.config.logDir, this.currentLogFile);
|
|
134
|
+
this.currentLogFile = file;
|
|
207
135
|
this.currentLogSize = 0;
|
|
208
136
|
}
|
|
209
137
|
}
|
|
210
138
|
async rotateLog() {
|
|
211
139
|
this.currentLogFile = null;
|
|
212
140
|
this.currentLogSize = 0;
|
|
213
|
-
|
|
214
|
-
const files = await this.getLogFiles();
|
|
215
|
-
if (files.length > this.config.maxFiles) {
|
|
216
|
-
const toDelete = files.slice(0, files.length - this.config.maxFiles);
|
|
217
|
-
for (const file of toDelete) {
|
|
218
|
-
try {
|
|
219
|
-
await fs.unlink(file);
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
// Ignore errors
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
141
|
+
await rotateAuditLog(this.config.logDir, this.config.maxFiles);
|
|
226
142
|
}
|
|
227
143
|
async getLogFiles() {
|
|
228
|
-
|
|
229
|
-
const entries = await fs.readdir(this.config.logDir);
|
|
230
|
-
const files = entries
|
|
231
|
-
.filter((name) => name.startsWith("audit-") && name.endsWith(".log"))
|
|
232
|
-
.map((name) => path.join(this.config.logDir, name));
|
|
233
|
-
// Sort by creation time
|
|
234
|
-
const stats = await Promise.all(files.map(async (file) => ({
|
|
235
|
-
file,
|
|
236
|
-
mtime: (await fs.stat(file)).mtime.getTime(),
|
|
237
|
-
})));
|
|
238
|
-
return stats.sort((a, b) => a.mtime - b.mtime).map((s) => s.file);
|
|
239
|
-
}
|
|
240
|
-
catch {
|
|
241
|
-
return [];
|
|
242
|
-
}
|
|
144
|
+
return getAuditLogFiles(this.config.logDir);
|
|
243
145
|
}
|
|
244
146
|
logToConsole(entry) {
|
|
245
147
|
const emoji = {
|
|
@@ -263,6 +165,9 @@ export class AuditLogger {
|
|
|
263
165
|
console.error("Failed to flush audit log:", error);
|
|
264
166
|
});
|
|
265
167
|
}, 5000); // Flush every 5 seconds
|
|
168
|
+
if (this.flushInterval.unref) {
|
|
169
|
+
this.flushInterval.unref();
|
|
170
|
+
}
|
|
266
171
|
}
|
|
267
172
|
}
|
|
268
173
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditLogger.js","sourceRoot":"","sources":["../../../src/utils/auditLogger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"auditLogger.js","sourceRoot":"","sources":["../../../src/utils/auditLogger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log query helpers
|
|
3
|
+
*/
|
|
4
|
+
import type { AuditEntry } from "./auditLogger.js";
|
|
5
|
+
export declare function queryAuditLogs(logDir: string, filters: {
|
|
6
|
+
startTime?: number;
|
|
7
|
+
endTime?: number;
|
|
8
|
+
level?: AuditEntry["level"];
|
|
9
|
+
operation?: string;
|
|
10
|
+
clientId?: string;
|
|
11
|
+
result?: "success" | "failure";
|
|
12
|
+
limit?: number;
|
|
13
|
+
}): Promise<AuditEntry[]>;
|
|
14
|
+
export declare function getAuditStats(logDir: string, timeRange?: {
|
|
15
|
+
start: number;
|
|
16
|
+
end: number;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
totalEntries: number;
|
|
19
|
+
byLevel: Record<string, number>;
|
|
20
|
+
byOperation: Record<string, number>;
|
|
21
|
+
byResult: Record<string, number>;
|
|
22
|
+
securityEvents: number;
|
|
23
|
+
}>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log query helpers
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import { getLogFiles } from "./auditLogWriter.js";
|
|
6
|
+
export async function queryAuditLogs(logDir, filters) {
|
|
7
|
+
const results = [];
|
|
8
|
+
const limit = filters.limit || 1000;
|
|
9
|
+
try {
|
|
10
|
+
const files = await getLogFiles(logDir);
|
|
11
|
+
for (const file of files.reverse()) {
|
|
12
|
+
if (results.length >= limit)
|
|
13
|
+
break;
|
|
14
|
+
const content = await fs.readFile(file, "utf-8");
|
|
15
|
+
for (const line of content.split("\n").filter((l) => l.trim()).reverse()) {
|
|
16
|
+
if (results.length >= limit)
|
|
17
|
+
break;
|
|
18
|
+
try {
|
|
19
|
+
const entry = JSON.parse(line);
|
|
20
|
+
if (filters.startTime && entry.timestamp < filters.startTime)
|
|
21
|
+
continue;
|
|
22
|
+
if (filters.endTime && entry.timestamp > filters.endTime)
|
|
23
|
+
continue;
|
|
24
|
+
if (filters.level && entry.level !== filters.level)
|
|
25
|
+
continue;
|
|
26
|
+
if (filters.operation && entry.operation !== filters.operation)
|
|
27
|
+
continue;
|
|
28
|
+
if (filters.clientId && entry.clientId !== filters.clientId)
|
|
29
|
+
continue;
|
|
30
|
+
if (filters.result && entry.result !== filters.result)
|
|
31
|
+
continue;
|
|
32
|
+
results.push(entry);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Skip malformed NDJSON lines (partial writes, truncation)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error("Failed to query audit logs:", error);
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
export async function getAuditStats(logDir, timeRange) {
|
|
46
|
+
const entries = await queryAuditLogs(logDir, {
|
|
47
|
+
startTime: timeRange?.start,
|
|
48
|
+
endTime: timeRange?.end,
|
|
49
|
+
limit: 100000,
|
|
50
|
+
});
|
|
51
|
+
const stats = {
|
|
52
|
+
totalEntries: entries.length,
|
|
53
|
+
byLevel: {},
|
|
54
|
+
byOperation: {},
|
|
55
|
+
byResult: {},
|
|
56
|
+
securityEvents: 0,
|
|
57
|
+
};
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
stats.byLevel[entry.level] = (stats.byLevel[entry.level] || 0) + 1;
|
|
60
|
+
stats.byOperation[entry.operation] = (stats.byOperation[entry.operation] || 0) + 1;
|
|
61
|
+
stats.byResult[entry.result] = (stats.byResult[entry.result] || 0) + 1;
|
|
62
|
+
if (entry.level === "security")
|
|
63
|
+
stats.securityEvents++;
|
|
64
|
+
}
|
|
65
|
+
return stats;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=auditQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditQuery.js","sourceRoot":"","sources":["../../../src/utils/auditQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Backup Manager - v3.
|
|
3
|
-
* Handles rolling backups in
|
|
2
|
+
* Backup Manager - v3.7.1
|
|
3
|
+
* Handles rolling backups in ~/.mcp-code-context/backups/
|
|
4
4
|
*/
|
|
5
5
|
import * as fs from "node:fs/promises";
|
|
6
6
|
import * as path from "node:path";
|
|
7
7
|
import * as crypto from "node:crypto";
|
|
8
8
|
import { tmpdir } from "os";
|
|
9
|
-
import { existsSync, mkdirSync } from "fs";
|
|
9
|
+
import { existsSync, mkdirSync, readdirSync, copyFileSync, rmSync } from "fs";
|
|
10
|
+
import { getAppDir } from "./appDir.js";
|
|
10
11
|
import { MAX_BACKUPS_PER_FILE, HASH_LENGTH } from './constants.js';
|
|
11
12
|
/**
|
|
12
13
|
* Manages file backups with automatic rotation.
|
|
@@ -19,13 +20,28 @@ export class BackupManager {
|
|
|
19
20
|
if (this.backupRootCache.has(projectRoot)) {
|
|
20
21
|
return this.backupRootCache.get(projectRoot);
|
|
21
22
|
}
|
|
22
|
-
const projectHash = crypto.createHash('
|
|
23
|
+
const projectHash = crypto.createHash('sha256')
|
|
23
24
|
.update(projectRoot)
|
|
24
25
|
.digest('hex')
|
|
25
26
|
.substring(0, HASH_LENGTH);
|
|
26
|
-
const backupRoot =
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const backupRoot = getAppDir(`backups/${projectHash}`);
|
|
28
|
+
// Silent migration: move existing os.tmpdir() backups to new location
|
|
29
|
+
const legacyRoot = path.join(tmpdir(), 'mcp-backups', projectHash);
|
|
30
|
+
if (existsSync(legacyRoot)) {
|
|
31
|
+
try {
|
|
32
|
+
const files = readdirSync(legacyRoot);
|
|
33
|
+
for (const file of files) {
|
|
34
|
+
const src = path.join(legacyRoot, file);
|
|
35
|
+
const dst = path.join(backupRoot, file);
|
|
36
|
+
if (!existsSync(dst)) {
|
|
37
|
+
copyFileSync(src, dst);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
rmSync(legacyRoot, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Legacy backup migration is best-effort — never block normal operation
|
|
44
|
+
}
|
|
29
45
|
}
|
|
30
46
|
this.backupRootCache.set(projectRoot, backupRoot);
|
|
31
47
|
return backupRoot;
|
|
@@ -42,14 +58,14 @@ export class BackupManager {
|
|
|
42
58
|
await fs.access(filePath);
|
|
43
59
|
}
|
|
44
60
|
catch {
|
|
45
|
-
return;
|
|
61
|
+
return; // Source file does not exist — nothing to back up (new file creation)
|
|
46
62
|
}
|
|
47
63
|
const backupDir = this.getBackupRoot(projectRoot);
|
|
48
64
|
if (!existsSync(backupDir)) {
|
|
49
65
|
mkdirSync(backupDir, { recursive: true });
|
|
50
66
|
}
|
|
51
67
|
const relativePath = path.relative(projectRoot, filePath);
|
|
52
|
-
const safeName = crypto.createHash('
|
|
68
|
+
const safeName = crypto.createHash('sha256').update(relativePath).digest('hex').substring(0, HASH_LENGTH) + "_" + path.basename(filePath);
|
|
53
69
|
const timestamp = Date.now();
|
|
54
70
|
const backupFileName = `${safeName}_${timestamp}.bak`;
|
|
55
71
|
const backupFilePath = path.join(backupDir, backupFileName);
|
|
@@ -68,12 +84,13 @@ export class BackupManager {
|
|
|
68
84
|
try {
|
|
69
85
|
const backupDir = this.getBackupRoot(projectRoot);
|
|
70
86
|
const relativePath = path.relative(projectRoot, filePath);
|
|
71
|
-
const safeName = crypto.createHash('
|
|
87
|
+
const safeName = crypto.createHash('sha256').update(relativePath).digest('hex').substring(0, HASH_LENGTH) + "_" + path.basename(filePath);
|
|
72
88
|
let files;
|
|
73
89
|
try {
|
|
74
90
|
files = await fs.readdir(backupDir);
|
|
75
91
|
}
|
|
76
92
|
catch {
|
|
93
|
+
// Backup directory does not exist (ENOENT) or is inaccessible
|
|
77
94
|
return { success: false, error: `No backups directory found for project "${projectRoot}"` };
|
|
78
95
|
}
|
|
79
96
|
const fileBackups = files
|
|
@@ -157,7 +174,7 @@ export class BackupManager {
|
|
|
157
174
|
try {
|
|
158
175
|
const backupDir = this.getBackupRoot(projectRoot);
|
|
159
176
|
const relativePath = path.relative(projectRoot, filePath);
|
|
160
|
-
const safeName = crypto.createHash('
|
|
177
|
+
const safeName = crypto.createHash('sha256').update(relativePath).digest('hex').substring(0, HASH_LENGTH) + "_" + path.basename(filePath);
|
|
161
178
|
const files = await fs.readdir(backupDir);
|
|
162
179
|
return files
|
|
163
180
|
.filter(f => f.startsWith(safeName + "_") && f.endsWith(".bak"))
|
|
@@ -165,7 +182,7 @@ export class BackupManager {
|
|
|
165
182
|
.sort((a, b) => b.localeCompare(a));
|
|
166
183
|
}
|
|
167
184
|
catch {
|
|
168
|
-
return [];
|
|
185
|
+
return []; // Backup directory may not exist — no backups available
|
|
169
186
|
}
|
|
170
187
|
}
|
|
171
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backupManager.js","sourceRoot":"","sources":["../../../src/utils/backupManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"backupManager.js","sourceRoot":"","sources":["../../../src/utils/backupManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEnE;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAU,WAAW,GAAG,oBAAoB,CAAC;IACnD,MAAM,CAAC,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD,MAAM,CAAC,aAAa,CAAC,WAAmB;QAC9C,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC;QAChD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;aAC5C,MAAM,CAAC,WAAW,CAAC;aACnB,MAAM,CAAC,KAAK,CAAC;aACb,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAE7B,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;QAEvD,sEAAsE;QACtE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;gBACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;YAC1E,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,WAAmB;QAC7D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,sEAAsE;QAChF,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE1I,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,GAAG,QAAQ,IAAI,SAAS,MAAM,CAAC;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAE5D,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,WAAmB,EAAE,QAAgB,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE1I,IAAI,KAAe,CAAC;YACpB,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;gBAC9D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2CAA2C,WAAW,GAAG,EAAE,CAAC;YAC9F,CAAC;YAED,MAAM,WAAW,GAAG,KAAK;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,WAAW,GAAG,EAAE,CAAC;YACzH,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAE1D,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAE5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAmB;QACpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,YAAY,GAAG,CAAC,CAAC;gBACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBAC5C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACrC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;wBACvB,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,CAAC;yBAAM,CAAC;wBACN,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC5B,CAAC;oBACD,YAAY,EAAE,CAAC;gBACjB,CAAC;gBACD,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;gBAC5C,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAiB,EAAE,QAAgB;QACzE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,WAAW,GAAG,KAAK;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtC,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1C,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5D,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;oBACrC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,WAAmB;QAC5D,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE1I,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,OAAO,KAAK;iBACT,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;iBACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC,CAAC,wDAAwD;QACrE,CAAC;IACH,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Constants - Centralized configuration
|
|
3
|
-
* v3.
|
|
3
|
+
* v3.7.1
|
|
4
4
|
*/
|
|
5
5
|
// Directory exclusions
|
|
6
6
|
export const EXCLUDE_DIRS = [
|
|
@@ -25,6 +25,13 @@ export const SUPPORTED_EXTENSIONS = [
|
|
|
25
25
|
".pyi",
|
|
26
26
|
".php",
|
|
27
27
|
".dart",
|
|
28
|
+
".java",
|
|
29
|
+
".go",
|
|
30
|
+
".cs",
|
|
31
|
+
".rb",
|
|
32
|
+
".rs",
|
|
33
|
+
".kt",
|
|
34
|
+
".kts",
|
|
28
35
|
];
|
|
29
36
|
// File and size limits
|
|
30
37
|
export const MAX_FILES_REPO_MAP = 500;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uBAAuB;AACvB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,cAAc;IACd,UAAU;IACV,aAAa;CACd,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uBAAuB;AACvB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,cAAc;IACd,UAAU;IACV,aAAa;CACd,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;CACP,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC,yBAAyB;AACzB,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,MAAM;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,0BAA0B;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,qBAAqB;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,sBAAsB;AAE1D,uBAAuB;AACvB,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,wBAAwB;AACxB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,qBAAqB;AACrB,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,sBAAsB;AACtB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC"}
|
package/dist/src/utils/diff.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Diff Utilities - v3.
|
|
2
|
+
* Diff Utilities - v3.7.1
|
|
3
3
|
* Uses diff-match-patch for efficient diffing
|
|
4
4
|
*/
|
|
5
5
|
export interface DiffLine {
|
|
@@ -7,9 +7,20 @@ export interface DiffLine {
|
|
|
7
7
|
content: string;
|
|
8
8
|
lineNumber?: number;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Generates an early fallback diff for large files with many changes.
|
|
12
|
+
* Avoids O(n+d²) degradation from Myers algorithm.
|
|
13
|
+
* FIX-07: Added in v3.7.1.
|
|
14
|
+
*
|
|
15
|
+
* @param oldText - Original file content
|
|
16
|
+
* @param newText - Modified file content
|
|
17
|
+
* @returns Human-readable summary diff
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateEarlyFallbackDiff(oldText: string, newText: string): string;
|
|
10
20
|
/**
|
|
11
21
|
* Generates a unified diff using Myers algorithm.
|
|
12
22
|
* Falls back to simple diff for files exceeding line limit.
|
|
23
|
+
* FIX-07: Added early fallback for large files with high change ratio.
|
|
13
24
|
*
|
|
14
25
|
* @param oldText - Original file content
|
|
15
26
|
* @param newText - Modified file content
|