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.
Files changed (181) hide show
  1. package/CHANGELOG.md +149 -278
  2. package/INSTRUCTIONS.md +23 -9
  3. package/README.md +217 -97
  4. package/SECURITY.md +55 -21
  5. package/dist/src/core/cacheManager.d.ts +4 -5
  6. package/dist/src/core/cacheManager.js +49 -33
  7. package/dist/src/core/cacheManager.js.map +1 -1
  8. package/dist/src/core/engine.d.ts +1 -1
  9. package/dist/src/core/engine.js +3 -3
  10. package/dist/src/core/engine.js.map +1 -1
  11. package/dist/src/core/indexManager.d.ts +58 -0
  12. package/dist/src/core/indexManager.js +252 -0
  13. package/dist/src/core/indexManager.js.map +1 -0
  14. package/dist/src/core/indexManagerQueries.d.ts +14 -0
  15. package/dist/src/core/indexManagerQueries.js +95 -0
  16. package/dist/src/core/indexManagerQueries.js.map +1 -0
  17. package/dist/src/core/sessionManager.d.ts +117 -0
  18. package/dist/src/core/sessionManager.js +231 -0
  19. package/dist/src/core/sessionManager.js.map +1 -0
  20. package/dist/src/core/validator.d.ts +1 -1
  21. package/dist/src/core/validator.js +18 -10
  22. package/dist/src/core/validator.js.map +1 -1
  23. package/dist/src/index.d.ts +1 -13
  24. package/dist/src/index.js +25 -999
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/operations/astTransform.d.ts +38 -0
  27. package/dist/src/operations/astTransform.js +239 -0
  28. package/dist/src/operations/astTransform.js.map +1 -0
  29. package/dist/src/operations/compress.d.ts +5 -3
  30. package/dist/src/operations/compress.js +73 -7
  31. package/dist/src/operations/compress.js.map +1 -1
  32. package/dist/src/operations/confirmationStore.d.ts +35 -8
  33. package/dist/src/operations/confirmationStore.js +112 -14
  34. package/dist/src/operations/confirmationStore.js.map +1 -1
  35. package/dist/src/operations/impactAnalysis.d.ts +9 -0
  36. package/dist/src/operations/impactAnalysis.js +61 -0
  37. package/dist/src/operations/impactAnalysis.js.map +1 -0
  38. package/dist/src/operations/pendingStore.d.ts +51 -0
  39. package/dist/src/operations/pendingStore.js +201 -0
  40. package/dist/src/operations/pendingStore.js.map +1 -0
  41. package/dist/src/operations/pendingStoreInit.d.ts +6 -0
  42. package/dist/src/operations/pendingStoreInit.js +42 -0
  43. package/dist/src/operations/pendingStoreInit.js.map +1 -0
  44. package/dist/src/operations/read.d.ts +6 -92
  45. package/dist/src/operations/read.js +4 -449
  46. package/dist/src/operations/read.js.map +1 -1
  47. package/dist/src/operations/readCore.d.ts +33 -0
  48. package/dist/src/operations/readCore.js +142 -0
  49. package/dist/src/operations/readCore.js.map +1 -0
  50. package/dist/src/operations/rename.d.ts +13 -0
  51. package/dist/src/operations/rename.js +130 -0
  52. package/dist/src/operations/rename.js.map +1 -0
  53. package/dist/src/operations/searchOperation.d.ts +16 -0
  54. package/dist/src/operations/searchOperation.js +113 -0
  55. package/dist/src/operations/searchOperation.js.map +1 -0
  56. package/dist/src/operations/symbolQuery.d.ts +38 -0
  57. package/dist/src/operations/symbolQuery.js +194 -0
  58. package/dist/src/operations/symbolQuery.js.map +1 -0
  59. package/dist/src/operations/write.d.ts +11 -14
  60. package/dist/src/operations/write.js +6 -125
  61. package/dist/src/operations/write.js.map +1 -1
  62. package/dist/src/parsers/base.d.ts +1 -1
  63. package/dist/src/parsers/base.js +1 -1
  64. package/dist/src/parsers/csharp.d.ts +12 -0
  65. package/dist/src/parsers/csharp.js +67 -0
  66. package/dist/src/parsers/csharp.js.map +1 -0
  67. package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
  68. package/dist/src/parsers/dartTreeSitter.js +1 -1
  69. package/dist/src/parsers/go.d.ts +11 -0
  70. package/dist/src/parsers/go.js +74 -0
  71. package/dist/src/parsers/go.js.map +1 -0
  72. package/dist/src/parsers/java.d.ts +12 -0
  73. package/dist/src/parsers/java.js +62 -0
  74. package/dist/src/parsers/java.js.map +1 -0
  75. package/dist/src/parsers/kotlin.d.ts +12 -0
  76. package/dist/src/parsers/kotlin.js +75 -0
  77. package/dist/src/parsers/kotlin.js.map +1 -0
  78. package/dist/src/parsers/php.d.ts +1 -1
  79. package/dist/src/parsers/php.js +1 -1
  80. package/dist/src/parsers/python.d.ts +1 -1
  81. package/dist/src/parsers/python.js +1 -1
  82. package/dist/src/parsers/registry.d.ts +1 -1
  83. package/dist/src/parsers/registry.js +63 -2
  84. package/dist/src/parsers/registry.js.map +1 -1
  85. package/dist/src/parsers/ruby.d.ts +12 -0
  86. package/dist/src/parsers/ruby.js +73 -0
  87. package/dist/src/parsers/ruby.js.map +1 -0
  88. package/dist/src/parsers/rust.d.ts +12 -0
  89. package/dist/src/parsers/rust.js +66 -0
  90. package/dist/src/parsers/rust.js.map +1 -0
  91. package/dist/src/parsers/typescript.d.ts +1 -1
  92. package/dist/src/parsers/typescript.js +28 -38
  93. package/dist/src/parsers/typescript.js.map +1 -1
  94. package/dist/src/tools/adminHandlers.d.ts +67 -0
  95. package/dist/src/tools/adminHandlers.js +129 -0
  96. package/dist/src/tools/adminHandlers.js.map +1 -0
  97. package/dist/src/tools/context.d.ts +9 -0
  98. package/dist/src/tools/context.js +21 -0
  99. package/dist/src/tools/context.js.map +1 -0
  100. package/dist/src/tools/handlers.d.ts +4 -0
  101. package/dist/src/tools/handlers.js +5 -0
  102. package/dist/src/tools/handlers.js.map +1 -0
  103. package/dist/src/tools/pipeline.d.ts +6 -0
  104. package/dist/src/tools/pipeline.js +100 -0
  105. package/dist/src/tools/pipeline.js.map +1 -0
  106. package/dist/src/tools/readHandlers.d.ts +55 -0
  107. package/dist/src/tools/readHandlers.js +220 -0
  108. package/dist/src/tools/readHandlers.js.map +1 -0
  109. package/dist/src/tools/toolDefinitions.d.ts +1037 -0
  110. package/dist/src/tools/toolDefinitions.js +13 -0
  111. package/dist/src/tools/toolDefinitions.js.map +1 -0
  112. package/dist/src/tools/toolDefinitionsAdmin.d.ts +89 -0
  113. package/dist/src/tools/toolDefinitionsAdmin.js +99 -0
  114. package/dist/src/tools/toolDefinitionsAdmin.js.map +1 -0
  115. package/dist/src/tools/toolDefinitionsCore.d.ts +949 -0
  116. package/dist/src/tools/toolDefinitionsCore.js +267 -0
  117. package/dist/src/tools/toolDefinitionsCore.js.map +1 -0
  118. package/dist/src/tools/writeHandlers.d.ts +37 -0
  119. package/dist/src/tools/writeHandlers.js +199 -0
  120. package/dist/src/tools/writeHandlers.js.map +1 -0
  121. package/dist/src/utils/appDir.d.ts +19 -0
  122. package/dist/src/utils/appDir.js +50 -0
  123. package/dist/src/utils/appDir.js.map +1 -0
  124. package/dist/src/utils/auditLogWriter.d.ts +9 -0
  125. package/dist/src/utils/auditLogWriter.js +49 -0
  126. package/dist/src/utils/auditLogWriter.js.map +1 -0
  127. package/dist/src/utils/auditLogger.d.ts +1 -10
  128. package/dist/src/utils/auditLogger.js +14 -109
  129. package/dist/src/utils/auditLogger.js.map +1 -1
  130. package/dist/src/utils/auditQuery.d.ts +23 -0
  131. package/dist/src/utils/auditQuery.js +67 -0
  132. package/dist/src/utils/auditQuery.js.map +1 -0
  133. package/dist/src/utils/backupManager.d.ts +2 -2
  134. package/dist/src/utils/backupManager.js +29 -12
  135. package/dist/src/utils/backupManager.js.map +1 -1
  136. package/dist/src/utils/constants.d.ts +1 -1
  137. package/dist/src/utils/constants.js +8 -1
  138. package/dist/src/utils/constants.js.map +1 -1
  139. package/dist/src/utils/diff.d.ts +12 -1
  140. package/dist/src/utils/diff.js +41 -1
  141. package/dist/src/utils/diff.js.map +1 -1
  142. package/dist/src/utils/fileLock.d.ts +7 -2
  143. package/dist/src/utils/fileLock.js +14 -11
  144. package/dist/src/utils/fileLock.js.map +1 -1
  145. package/dist/src/utils/fileWalker.d.ts +1 -1
  146. package/dist/src/utils/fileWalker.js +1 -1
  147. package/dist/src/utils/fileWatcher.d.ts +1 -1
  148. package/dist/src/utils/fileWatcher.js +1 -1
  149. package/dist/src/utils/fuzzySearch.d.ts +1 -1
  150. package/dist/src/utils/fuzzySearch.js +1 -1
  151. package/dist/src/utils/logger.d.ts +1 -1
  152. package/dist/src/utils/logger.js +2 -2
  153. package/dist/src/utils/logger.js.map +1 -1
  154. package/dist/src/utils/rateLimiter.d.ts +9 -1
  155. package/dist/src/utils/rateLimiter.js +12 -1
  156. package/dist/src/utils/rateLimiter.js.map +1 -1
  157. package/dist/src/utils/regexValidator.d.ts +12 -0
  158. package/dist/src/utils/regexValidator.js +48 -0
  159. package/dist/src/utils/regexValidator.js.map +1 -0
  160. package/dist/src/utils/safeRegex.d.ts +2 -92
  161. package/dist/src/utils/safeRegex.js +41 -222
  162. package/dist/src/utils/safeRegex.js.map +1 -1
  163. package/dist/src/utils/safeRegexApi.d.ts +56 -0
  164. package/dist/src/utils/safeRegexApi.js +99 -0
  165. package/dist/src/utils/safeRegexApi.js.map +1 -0
  166. package/dist/src/utils/safeRegexPool.d.ts +7 -0
  167. package/dist/src/utils/safeRegexPool.js +102 -0
  168. package/dist/src/utils/safeRegexPool.js.map +1 -0
  169. package/dist/src/utils/searchTools.js +6 -6
  170. package/dist/src/utils/searchTools.js.map +1 -1
  171. package/dist/src/utils/streaming.d.ts +4 -3
  172. package/dist/src/utils/streaming.js +1 -1
  173. package/dist/src/utils/streaming.js.map +1 -1
  174. package/dist/src/utils/telemetry.d.ts +1 -1
  175. package/dist/src/utils/telemetry.js +1 -1
  176. package/dist/src/utils/toctou.d.ts +7 -0
  177. package/dist/src/utils/toctou.js +24 -0
  178. package/dist/src/utils/toctou.js.map +1 -0
  179. package/llms.txt +173 -21
  180. package/package.json +2 -2
  181. package/scripts/replace-version.js +0 -59
@@ -1,17 +1,33 @@
1
1
  /**
2
- * Confirmation Store - v3.6.3
2
+ * Confirmation Store - v3.7.1
3
3
  * Two-phase write: dry-run preview → confirm with token
4
4
  * Stores pending write operations with auto-expiry
5
+ * NOW with SQLite persistence for crash recovery
5
6
  */
6
7
  import * as crypto from "node:crypto";
8
+ import { PendingOperationStore } from "./pendingStore.js";
7
9
  const EXPIRY_MS = 5 * 60 * 1000; // 5 minutes
8
10
  const MAX_PENDING = 50;
9
- class ConfirmationStore {
11
+ export class ConfirmationStore {
10
12
  pending = new Map();
13
+ persistentStore = null;
14
+ sessionId;
15
+ cleanupInterval = null;
16
+ constructor(sessionId = "default", projectRoot) {
17
+ this.sessionId = sessionId;
18
+ if (projectRoot) {
19
+ this.persistentStore = new PendingOperationStore(projectRoot);
20
+ }
21
+ this.cleanupInterval = setInterval(() => this.cleanup(), 60_000);
22
+ if (this.cleanupInterval.unref) {
23
+ this.cleanupInterval.unref();
24
+ }
25
+ }
11
26
  /**
12
27
  * Store a pending write operation and return a confirmation token.
13
28
  * Invalidates any existing pending token for the same file(s) —
14
29
  * prevents stale tokens from overwriting newer changes.
30
+ * NOW persists to SQLite for crash recovery.
15
31
  */
16
32
  storePending(params) {
17
33
  this.cleanup();
@@ -35,7 +51,7 @@ class ConfirmationStore {
35
51
  }
36
52
  const token = crypto.randomBytes(16).toString("hex");
37
53
  const now = Date.now();
38
- this.pending.set(token, {
54
+ const pendingOp = {
39
55
  token,
40
56
  filePath: params.filePath,
41
57
  operation: params.operation,
@@ -46,6 +62,11 @@ class ConfirmationStore {
46
62
  expiresAt: now + EXPIRY_MS,
47
63
  originalHash: params.originalHash,
48
64
  pendingWrites: params.pendingWrites,
65
+ };
66
+ this.pending.set(token, pendingOp);
67
+ // Persist to SQLite if available (fire-and-forget for crash recovery)
68
+ this.persistentStore?.storePending(this.sessionId, token, params).catch(() => {
69
+ // Persistence failure is non-blocking — token still valid in memory
49
70
  });
50
71
  // Enforce max pending limit
51
72
  if (this.pending.size > MAX_PENDING) {
@@ -60,18 +81,58 @@ class ConfirmationStore {
60
81
  }
61
82
  /**
62
83
  * Retrieve and consume a pending operation by token
84
+ * Tries in-memory first, then falls back to SQLite for crash recovery
63
85
  */
64
- consumePending(token) {
86
+ async consumePending(token) {
65
87
  this.cleanup();
88
+ // Check in-memory (primary path)
66
89
  const op = this.pending.get(token);
67
- if (!op)
68
- return null;
69
- if (Date.now() > op.expiresAt) {
90
+ if (op) {
91
+ if (Date.now() > op.expiresAt) {
92
+ this.pending.delete(token);
93
+ return null;
94
+ }
70
95
  this.pending.delete(token);
71
- return null;
96
+ // Fire-and-forget: remove from persistent store too
97
+ this.persistentStore?.consumePending(token).catch(() => {
98
+ // Best-effort cleanup of consumed token from SQLite
99
+ });
100
+ return op;
101
+ }
102
+ // SQLite fallback for crash recovery
103
+ if (this.persistentStore) {
104
+ try {
105
+ const dbOp = await this.persistentStore.consumePending(token);
106
+ if (dbOp) {
107
+ let parsedPendingWrites;
108
+ if (dbOp.pendingWrites) {
109
+ try {
110
+ parsedPendingWrites = JSON.parse(dbOp.pendingWrites);
111
+ }
112
+ catch {
113
+ // Malformed pendingWrites JSON in SQLite — proceed without multi-file writes
114
+ }
115
+ }
116
+ return {
117
+ token: dbOp.token,
118
+ filePath: dbOp.filePath,
119
+ operation: dbOp.operation,
120
+ symbolName: dbOp.symbolName,
121
+ newContent: dbOp.newContent,
122
+ diff: dbOp.diff,
123
+ createdAt: dbOp.createdAt,
124
+ expiresAt: dbOp.expiresAt,
125
+ originalHash: dbOp.originalHash,
126
+ pendingWrites: parsedPendingWrites,
127
+ };
128
+ }
129
+ }
130
+ catch (err) {
131
+ // SQLite crash-recovery path failed — non-blocking, but worth observing
132
+ console.error('[ConfirmationStore] SQLite fallback failed:', err);
133
+ }
72
134
  }
73
- this.pending.delete(token);
74
- return op;
135
+ return null;
75
136
  }
76
137
  /**
77
138
  * Check if any pending token exists for the given file path (without consuming).
@@ -123,9 +184,46 @@ class ConfirmationStore {
123
184
  clearAll() {
124
185
  this.pending.clear();
125
186
  }
187
+ /**
188
+ * List all pending operations (for recovery/debugging)
189
+ */
190
+ listAll() {
191
+ this.cleanup();
192
+ return Array.from(this.pending.values()).map(op => ({
193
+ token: op.token,
194
+ filePath: op.filePath,
195
+ operation: op.operation,
196
+ createdAt: op.createdAt,
197
+ expiresAt: op.expiresAt,
198
+ }));
199
+ }
200
+ /**
201
+ * Returns true if SQLite persistence is active for this store
202
+ */
203
+ hasPersistentStore() {
204
+ return this.persistentStore !== null;
205
+ }
206
+ /**
207
+ * Activate SQLite persistence after construction.
208
+ * Called when projectRoot becomes known (first real tool call).
209
+ */
210
+ activatePersistence(sessionId, projectRoot) {
211
+ if (this.persistentStore)
212
+ return; // already active
213
+ this.sessionId = sessionId;
214
+ this.persistentStore = new PendingOperationStore(projectRoot);
215
+ }
216
+ /**
217
+ * Close the persistent store
218
+ */
219
+ close() {
220
+ if (this.cleanupInterval) {
221
+ clearInterval(this.cleanupInterval);
222
+ this.cleanupInterval = null;
223
+ }
224
+ this.persistentStore?.close().catch(() => {
225
+ // Teardown cleanup — cannot recover
226
+ });
227
+ }
126
228
  }
127
- /**
128
- * Global confirmation store instance
129
- */
130
- export const globalConfirmationStore = new ConfirmationStore();
131
229
  //# sourceMappingURL=confirmationStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirmationStore.js","sourceRoot":"","sources":["../../../src/operations/confirmationStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"confirmationStore.js","sourceRoot":"","sources":["../../../src/operations/confirmationStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Impact analysis operation
3
+ */
4
+ import type { ReadResult } from "./readCore.js";
5
+ export declare function analyzeImpact(params: {
6
+ filePath: string;
7
+ rootDir: string;
8
+ projectRoot: string;
9
+ }): Promise<ReadResult>;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Impact analysis operation
3
+ */
4
+ import * as fs from "node:fs/promises";
5
+ import * as path from "node:path";
6
+ import { EXCLUDE_DIRS, SUPPORTED_EXTENSIONS } from "../utils/constants.js";
7
+ import { walkDir } from "../utils/fileWalker.js";
8
+ import { IndexManager } from "../core/indexManager.js";
9
+ import { safeRegexAnyTest } from "../utils/safeRegex.js";
10
+ import { sanitizeRegexPattern } from "../utils/regexValidator.js";
11
+ export async function analyzeImpact(params) {
12
+ try {
13
+ // ── Fast path: use persistent index if available ──────────────────────
14
+ const indexManager = new IndexManager(params.projectRoot);
15
+ if (await indexManager.hasIndex()) {
16
+ const dependents = await indexManager.getDependents(params.filePath);
17
+ return {
18
+ success: true,
19
+ content: JSON.stringify({ file: params.filePath, dependents, source: "index" }, null, 2),
20
+ };
21
+ }
22
+ // ── Slow path: regex scan (no index yet) ─────────────────────────────
23
+ const dependents = [];
24
+ const fileName = path.basename(params.filePath);
25
+ const baseName = sanitizeRegexPattern(fileName.replace(/\.[^.]+$/, ""));
26
+ const fullName = sanitizeRegexPattern(fileName);
27
+ const importPatterns = [
28
+ `import.*from.*['"].*${baseName}`,
29
+ `require\\(['"].*${fullName}`,
30
+ `from.*${baseName}.*import`,
31
+ ];
32
+ await walkDir(params.rootDir, {
33
+ extensions: SUPPORTED_EXTENSIONS,
34
+ excludeDirs: EXCLUDE_DIRS,
35
+ onFile: async (fullPath) => {
36
+ const content = await fs.readFile(fullPath, "utf-8");
37
+ const matchResult = await safeRegexAnyTest(importPatterns, content);
38
+ if (matchResult.timedOut) {
39
+ throw new Error(matchResult.error ?? "Regex timed out during impact scan (ReDoS prevented)");
40
+ }
41
+ if (!matchResult.success) {
42
+ throw new Error(matchResult.error ?? "Impact scan regex failed");
43
+ }
44
+ if (matchResult.matched) {
45
+ dependents.push(fullPath);
46
+ }
47
+ },
48
+ });
49
+ return {
50
+ success: true,
51
+ content: JSON.stringify({ file: params.filePath, dependents, source: "regex scan — run get_semantic_repo_map to build index" }, null, 2),
52
+ };
53
+ }
54
+ catch (error) {
55
+ return {
56
+ success: false,
57
+ error: error instanceof Error ? error.message : String(error),
58
+ };
59
+ }
60
+ }
61
+ //# sourceMappingURL=impactAnalysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impactAnalysis.js","sourceRoot":"","sources":["../../../src/operations/impactAnalysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /** Pending Operation Store - SQLite crash recovery */
2
+ export interface PendingOperation {
3
+ token: string;
4
+ sessionId: string;
5
+ filePath: string;
6
+ operation: string;
7
+ symbolName?: string;
8
+ newContent: string;
9
+ diff: string;
10
+ createdAt: number;
11
+ expiresAt: number;
12
+ originalHash?: string;
13
+ pendingWrites?: string;
14
+ }
15
+ /** SQLite-backed pending operation store */
16
+ export declare class PendingOperationStore {
17
+ private db;
18
+ private projectRoot;
19
+ private dbPath;
20
+ private initialized;
21
+ constructor(projectRoot: string);
22
+ private init;
23
+ private persist;
24
+ storePending(sessionId: string, token: string, params: {
25
+ filePath: string;
26
+ operation: string;
27
+ symbolName?: string;
28
+ newContent: string;
29
+ diff: string;
30
+ originalHash?: string;
31
+ pendingWrites?: Array<{
32
+ filePath: string;
33
+ newContent: string;
34
+ }>;
35
+ }): Promise<void>;
36
+ consumePending(token: string): Promise<PendingOperation | null>;
37
+ listPendingForSession(sessionId: string): Promise<Array<{
38
+ token: string;
39
+ filePath: string;
40
+ operation: string;
41
+ createdAt: number;
42
+ expiresAt: number;
43
+ }>>;
44
+ hasConflictingPending(filePath: string): Promise<boolean>;
45
+ getPendingCount(sessionId: string): Promise<number>;
46
+ clearSession(sessionId: string): Promise<void>;
47
+ clearAll(): Promise<void>;
48
+ private cleanup;
49
+ private normalizePath;
50
+ close(): Promise<void>;
51
+ }
@@ -0,0 +1,201 @@
1
+ /** Pending Operation Store - SQLite crash recovery */
2
+ import * as fs from "node:fs/promises";
3
+ import * as path from "node:path";
4
+ import * as crypto from "node:crypto";
5
+ import { getAppDir } from "../utils/appDir.js";
6
+ import { openPendingDatabase } from "./pendingStoreInit.js";
7
+ const EXPIRY_MS = 5 * 60 * 1000;
8
+ /** SQLite-backed pending operation store */
9
+ export class PendingOperationStore {
10
+ db = null;
11
+ projectRoot;
12
+ dbPath;
13
+ initialized = false;
14
+ constructor(projectRoot) {
15
+ this.projectRoot = projectRoot;
16
+ const projectHash = crypto.createHash('sha256')
17
+ .update(projectRoot)
18
+ .digest('hex')
19
+ .substring(0, 8);
20
+ this.dbPath = path.join(getAppDir(`pending/${projectHash}`), 'pending.db');
21
+ }
22
+ async init() {
23
+ if (this.initialized)
24
+ return;
25
+ this.db = await openPendingDatabase(this.dbPath);
26
+ this.initialized = true;
27
+ this.cleanup();
28
+ }
29
+ async persist() {
30
+ if (!this.db)
31
+ return;
32
+ const data = this.db.export();
33
+ await fs.mkdir(path.dirname(this.dbPath), { recursive: true });
34
+ const tmpPath = `${this.dbPath}.tmp`;
35
+ await fs.writeFile(tmpPath, data);
36
+ await fs.rename(tmpPath, this.dbPath);
37
+ }
38
+ async storePending(sessionId, token, params) {
39
+ await this.init();
40
+ if (!this.db)
41
+ throw new Error("Database not initialized");
42
+ this.cleanup();
43
+ // Invalidate conflicting operations (same file)
44
+ const normalizedPath = this.normalizePath(params.filePath);
45
+ this.db.run(`
46
+ DELETE FROM pending_operations
47
+ WHERE file_path = ? OR pending_writes LIKE ?
48
+ `, [normalizedPath, `%"${normalizedPath}"%`]);
49
+ const now = Date.now();
50
+ this.db.run(`
51
+ INSERT INTO pending_operations (
52
+ token, session_id, file_path, operation, symbol_name,
53
+ new_content, diff, created_at, expires_at, original_hash, pending_writes
54
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
55
+ `, [
56
+ token,
57
+ sessionId,
58
+ normalizedPath,
59
+ params.operation,
60
+ params.symbolName || null,
61
+ params.newContent,
62
+ params.diff,
63
+ now,
64
+ now + EXPIRY_MS,
65
+ params.originalHash || null,
66
+ params.pendingWrites ? JSON.stringify(params.pendingWrites) : null
67
+ ]);
68
+ await this.persist();
69
+ }
70
+ async consumePending(token) {
71
+ await this.init();
72
+ if (!this.db)
73
+ return null;
74
+ this.cleanup();
75
+ const stmt = this.db.prepare(`
76
+ SELECT * FROM pending_operations WHERE token = ?
77
+ `);
78
+ stmt.bind([token]);
79
+ let row = null;
80
+ if (stmt.step()) {
81
+ row = stmt.getAsObject();
82
+ }
83
+ stmt.free();
84
+ if (!row)
85
+ return null;
86
+ if (Date.now() > row.expires_at) {
87
+ this.db.run(`DELETE FROM pending_operations WHERE token = ?`, [token]);
88
+ await this.persist();
89
+ return null;
90
+ }
91
+ // Delete after retrieval (consume)
92
+ this.db.run(`DELETE FROM pending_operations WHERE token = ?`, [token]);
93
+ await this.persist();
94
+ return {
95
+ token: row.token,
96
+ sessionId: row.session_id,
97
+ filePath: row.file_path,
98
+ operation: row.operation,
99
+ symbolName: row.symbol_name || undefined,
100
+ newContent: row.new_content,
101
+ diff: row.diff,
102
+ createdAt: row.created_at,
103
+ expiresAt: row.expires_at,
104
+ originalHash: row.original_hash || undefined,
105
+ pendingWrites: row.pending_writes || undefined,
106
+ };
107
+ }
108
+ async listPendingForSession(sessionId) {
109
+ await this.init();
110
+ if (!this.db)
111
+ return [];
112
+ this.cleanup();
113
+ const stmt = this.db.prepare(`
114
+ SELECT token, file_path, operation, created_at, expires_at
115
+ FROM pending_operations
116
+ WHERE session_id = ? AND expires_at > ?
117
+ ORDER BY created_at DESC
118
+ `);
119
+ stmt.bind([sessionId, Date.now()]);
120
+ const results = [];
121
+ while (stmt.step()) {
122
+ results.push(stmt.getAsObject());
123
+ }
124
+ stmt.free();
125
+ return results.map((row) => ({
126
+ token: row.token,
127
+ filePath: row.file_path,
128
+ operation: row.operation,
129
+ createdAt: row.created_at,
130
+ expiresAt: row.expires_at,
131
+ }));
132
+ }
133
+ async hasConflictingPending(filePath) {
134
+ await this.init();
135
+ if (!this.db)
136
+ return false;
137
+ this.cleanup();
138
+ const normalizedPath = this.normalizePath(filePath);
139
+ const stmt = this.db.prepare(`
140
+ SELECT COUNT(*) as count FROM pending_operations
141
+ WHERE (file_path = ? OR pending_writes LIKE ?) AND expires_at > ?
142
+ `);
143
+ stmt.bind([normalizedPath, `%"${normalizedPath}"%`, Date.now()]);
144
+ let count = 0;
145
+ if (stmt.step()) {
146
+ const row = stmt.getAsObject();
147
+ count = row.count;
148
+ }
149
+ stmt.free();
150
+ return count > 0;
151
+ }
152
+ async getPendingCount(sessionId) {
153
+ await this.init();
154
+ if (!this.db)
155
+ return 0;
156
+ this.cleanup();
157
+ const stmt = this.db.prepare(`
158
+ SELECT COUNT(*) as count FROM pending_operations
159
+ WHERE session_id = ? AND expires_at > ?
160
+ `);
161
+ stmt.bind([sessionId, Date.now()]);
162
+ let count = 0;
163
+ if (stmt.step()) {
164
+ const row = stmt.getAsObject();
165
+ count = row.count;
166
+ }
167
+ stmt.free();
168
+ return count;
169
+ }
170
+ async clearSession(sessionId) {
171
+ await this.init();
172
+ if (!this.db)
173
+ return;
174
+ this.db.run(`DELETE FROM pending_operations WHERE session_id = ?`, [sessionId]);
175
+ await this.persist();
176
+ }
177
+ async clearAll() {
178
+ await this.init();
179
+ if (!this.db)
180
+ return;
181
+ this.db.run(`DELETE FROM pending_operations`);
182
+ await this.persist();
183
+ }
184
+ cleanup() {
185
+ if (!this.db)
186
+ return;
187
+ const now = Date.now();
188
+ this.db.run(`DELETE FROM pending_operations WHERE expires_at < ?`, [now]);
189
+ }
190
+ normalizePath(filePath) {
191
+ return filePath.replace(/\\/g, '/').toLowerCase();
192
+ }
193
+ async close() {
194
+ if (this.db) {
195
+ await this.persist();
196
+ this.db.close();
197
+ this.db = null;
198
+ }
199
+ }
200
+ }
201
+ //# sourceMappingURL=pendingStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingStore.js","sourceRoot":"","sources":["../../../src/operations/pendingStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Pending store database initialization
3
+ */
4
+ import { Database } from "sql.js";
5
+ export declare function initPendingSchema(db: Database): void;
6
+ export declare function openPendingDatabase(dbPath: string): Promise<Database>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Pending store database initialization
3
+ */
4
+ import initSqlJs from "sql.js";
5
+ import * as fs from "node:fs/promises";
6
+ import { existsSync } from "fs";
7
+ import * as path from "node:path";
8
+ export function initPendingSchema(db) {
9
+ db.run(`
10
+ CREATE TABLE IF NOT EXISTS pending_operations (
11
+ token TEXT PRIMARY KEY,
12
+ session_id TEXT NOT NULL,
13
+ file_path TEXT NOT NULL,
14
+ operation TEXT NOT NULL,
15
+ symbol_name TEXT,
16
+ new_content TEXT NOT NULL,
17
+ diff TEXT NOT NULL,
18
+ created_at INTEGER NOT NULL,
19
+ expires_at INTEGER NOT NULL,
20
+ original_hash TEXT,
21
+ pending_writes TEXT
22
+ )
23
+ `);
24
+ db.run(`CREATE INDEX IF NOT EXISTS idx_session_id ON pending_operations(session_id)`);
25
+ db.run(`CREATE INDEX IF NOT EXISTS idx_expires_at ON pending_operations(expires_at)`);
26
+ db.run(`CREATE INDEX IF NOT EXISTS idx_file_path ON pending_operations(file_path)`);
27
+ }
28
+ export async function openPendingDatabase(dbPath) {
29
+ const SQL = await initSqlJs();
30
+ let db;
31
+ if (existsSync(dbPath)) {
32
+ db = new SQL.Database(await fs.readFile(dbPath));
33
+ }
34
+ else {
35
+ db = new SQL.Database();
36
+ }
37
+ initPendingSchema(db);
38
+ await fs.mkdir(path.dirname(dbPath), { recursive: true });
39
+ await fs.writeFile(dbPath, db.export());
40
+ return db;
41
+ }
42
+ //# sourceMappingURL=pendingStoreInit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingStoreInit.js","sourceRoot":"","sources":["../../../src/operations/pendingStoreInit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,SAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,UAAU,iBAAiB,CAAC,EAAY;IAC5C,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;;;GAcN,CAAC,CAAC;IACH,EAAE,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IACtF,EAAE,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IACtF,EAAE,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAc;IACtD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,EAAY,CAAC;IACjB,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IACD,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC;AACZ,CAAC"}