kiri-mcp-server 0.9.6 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +144 -13
  2. package/dist/client/cli.js +68 -0
  3. package/dist/client/cli.js.map +1 -0
  4. package/dist/client/index.js +5 -0
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/eval/metrics.js +47 -0
  7. package/dist/eval/metrics.js.map +1 -0
  8. package/dist/indexer/cli.js +362 -0
  9. package/dist/indexer/cli.js.map +1 -0
  10. package/dist/indexer/codeintel.js +182 -0
  11. package/dist/indexer/codeintel.js.map +1 -0
  12. package/dist/indexer/git.js +30 -0
  13. package/dist/indexer/git.js.map +1 -0
  14. package/dist/indexer/language.js +34 -0
  15. package/dist/indexer/language.js.map +1 -0
  16. package/dist/indexer/pipeline/filters/denylist.js +71 -0
  17. package/dist/indexer/pipeline/filters/denylist.js.map +1 -0
  18. package/dist/indexer/schema.js +101 -0
  19. package/dist/indexer/schema.js.map +1 -0
  20. package/dist/package.json +14 -1
  21. package/dist/server/bootstrap.js +19 -0
  22. package/dist/server/bootstrap.js.map +1 -0
  23. package/dist/server/context.js +1 -0
  24. package/dist/server/context.js.map +1 -0
  25. package/dist/server/fallbacks/degradeController.js +69 -0
  26. package/dist/server/fallbacks/degradeController.js.map +1 -0
  27. package/dist/server/handlers.js +1268 -0
  28. package/dist/server/handlers.js.map +1 -0
  29. package/dist/server/main.js +151 -0
  30. package/dist/server/main.js.map +1 -0
  31. package/dist/server/observability/metrics.js +56 -0
  32. package/dist/server/observability/metrics.js.map +1 -0
  33. package/dist/server/observability/tracing.js +58 -0
  34. package/dist/server/observability/tracing.js.map +1 -0
  35. package/dist/server/rpc.js +477 -0
  36. package/dist/server/rpc.js.map +1 -0
  37. package/dist/server/runtime.js +47 -0
  38. package/dist/server/runtime.js.map +1 -0
  39. package/dist/server/scoring.js +116 -0
  40. package/dist/server/scoring.js.map +1 -0
  41. package/dist/server/stdio.js +76 -0
  42. package/dist/server/stdio.js.map +1 -0
  43. package/dist/shared/duckdb.js +119 -0
  44. package/dist/shared/duckdb.js.map +1 -0
  45. package/dist/shared/embedding.js +98 -0
  46. package/dist/shared/embedding.js.map +1 -0
  47. package/dist/shared/index.js +9 -0
  48. package/dist/shared/index.js.map +1 -0
  49. package/dist/shared/security/config.js +64 -0
  50. package/dist/shared/security/config.js.map +1 -0
  51. package/dist/shared/security/masker.js +56 -0
  52. package/dist/shared/security/masker.js.map +1 -0
  53. package/dist/shared/tokenizer.js +4 -0
  54. package/dist/shared/tokenizer.js.map +1 -0
  55. package/dist/shared/utils/simpleYaml.js +89 -0
  56. package/dist/shared/utils/simpleYaml.js.map +1 -0
  57. package/dist/src/client/proxy.js +83 -13
  58. package/dist/src/client/proxy.js.map +1 -1
  59. package/dist/src/client/start-daemon.d.ts.map +1 -1
  60. package/dist/src/client/start-daemon.js +2 -1
  61. package/dist/src/client/start-daemon.js.map +1 -1
  62. package/dist/src/daemon/daemon.js +97 -18
  63. package/dist/src/daemon/daemon.js.map +1 -1
  64. package/dist/src/daemon/socket.d.ts +6 -4
  65. package/dist/src/daemon/socket.d.ts.map +1 -1
  66. package/dist/src/daemon/socket.js +62 -18
  67. package/dist/src/daemon/socket.js.map +1 -1
  68. package/dist/src/indexer/cli.d.ts +1 -0
  69. package/dist/src/indexer/cli.d.ts.map +1 -1
  70. package/dist/src/indexer/cli.js +503 -257
  71. package/dist/src/indexer/cli.js.map +1 -1
  72. package/dist/src/indexer/codeintel.d.ts +1 -1
  73. package/dist/src/indexer/codeintel.d.ts.map +1 -1
  74. package/dist/src/indexer/codeintel.js +296 -3
  75. package/dist/src/indexer/codeintel.js.map +1 -1
  76. package/dist/src/indexer/dart/analyze.d.ts +29 -0
  77. package/dist/src/indexer/dart/analyze.d.ts.map +1 -0
  78. package/dist/src/indexer/dart/analyze.js +452 -0
  79. package/dist/src/indexer/dart/analyze.js.map +1 -0
  80. package/dist/src/indexer/dart/client.d.ts +113 -0
  81. package/dist/src/indexer/dart/client.d.ts.map +1 -0
  82. package/dist/src/indexer/dart/client.js +444 -0
  83. package/dist/src/indexer/dart/client.js.map +1 -0
  84. package/dist/src/indexer/dart/config.d.ts +36 -0
  85. package/dist/src/indexer/dart/config.d.ts.map +1 -0
  86. package/dist/src/indexer/dart/config.js +62 -0
  87. package/dist/src/indexer/dart/config.js.map +1 -0
  88. package/dist/src/indexer/dart/dependencies.d.ts +17 -0
  89. package/dist/src/indexer/dart/dependencies.d.ts.map +1 -0
  90. package/dist/src/indexer/dart/dependencies.js +102 -0
  91. package/dist/src/indexer/dart/dependencies.js.map +1 -0
  92. package/dist/src/indexer/dart/pathKey.d.ts +40 -0
  93. package/dist/src/indexer/dart/pathKey.d.ts.map +1 -0
  94. package/dist/src/indexer/dart/pathKey.js +72 -0
  95. package/dist/src/indexer/dart/pathKey.js.map +1 -0
  96. package/dist/src/indexer/dart/poolGate.d.ts +57 -0
  97. package/dist/src/indexer/dart/poolGate.d.ts.map +1 -0
  98. package/dist/src/indexer/dart/poolGate.js +87 -0
  99. package/dist/src/indexer/dart/poolGate.js.map +1 -0
  100. package/dist/src/indexer/dart/sdk.d.ts +40 -0
  101. package/dist/src/indexer/dart/sdk.d.ts.map +1 -0
  102. package/dist/src/indexer/dart/sdk.js +167 -0
  103. package/dist/src/indexer/dart/sdk.js.map +1 -0
  104. package/dist/src/indexer/dart/transform.d.ts +17 -0
  105. package/dist/src/indexer/dart/transform.d.ts.map +1 -0
  106. package/dist/src/indexer/dart/transform.js +157 -0
  107. package/dist/src/indexer/dart/transform.js.map +1 -0
  108. package/dist/src/indexer/dart/types.d.ts +137 -0
  109. package/dist/src/indexer/dart/types.d.ts.map +1 -0
  110. package/dist/src/indexer/dart/types.js +5 -0
  111. package/dist/src/indexer/dart/types.js.map +1 -0
  112. package/dist/src/indexer/git.d.ts +1 -0
  113. package/dist/src/indexer/git.d.ts.map +1 -1
  114. package/dist/src/indexer/git.js +8 -0
  115. package/dist/src/indexer/git.js.map +1 -1
  116. package/dist/src/indexer/language.d.ts.map +1 -1
  117. package/dist/src/indexer/language.js +1 -0
  118. package/dist/src/indexer/language.js.map +1 -1
  119. package/dist/src/indexer/queue.d.ts +19 -0
  120. package/dist/src/indexer/queue.d.ts.map +1 -0
  121. package/dist/src/indexer/queue.js +50 -0
  122. package/dist/src/indexer/queue.js.map +1 -0
  123. package/dist/src/indexer/schema.d.ts +61 -1
  124. package/dist/src/indexer/schema.d.ts.map +1 -1
  125. package/dist/src/indexer/schema.js +253 -2
  126. package/dist/src/indexer/schema.js.map +1 -1
  127. package/dist/src/indexer/watch.d.ts +21 -0
  128. package/dist/src/indexer/watch.d.ts.map +1 -1
  129. package/dist/src/indexer/watch.js +189 -28
  130. package/dist/src/indexer/watch.js.map +1 -1
  131. package/dist/src/server/abbreviations.d.ts +47 -0
  132. package/dist/src/server/abbreviations.d.ts.map +1 -0
  133. package/dist/src/server/abbreviations.js +71 -0
  134. package/dist/src/server/abbreviations.js.map +1 -0
  135. package/dist/src/server/boost-profiles.d.ts +63 -0
  136. package/dist/src/server/boost-profiles.d.ts.map +1 -0
  137. package/dist/src/server/boost-profiles.js +86 -0
  138. package/dist/src/server/boost-profiles.js.map +1 -0
  139. package/dist/src/server/context.d.ts +7 -0
  140. package/dist/src/server/context.d.ts.map +1 -1
  141. package/dist/src/server/handlers.d.ts +3 -2
  142. package/dist/src/server/handlers.d.ts.map +1 -1
  143. package/dist/src/server/handlers.js +542 -96
  144. package/dist/src/server/handlers.js.map +1 -1
  145. package/dist/src/server/indexBootstrap.d.ts.map +1 -1
  146. package/dist/src/server/indexBootstrap.js +4 -1
  147. package/dist/src/server/indexBootstrap.js.map +1 -1
  148. package/dist/src/server/main.d.ts.map +1 -1
  149. package/dist/src/server/main.js +112 -30
  150. package/dist/src/server/main.js.map +1 -1
  151. package/dist/src/server/rpc.d.ts.map +1 -1
  152. package/dist/src/server/rpc.js +28 -9
  153. package/dist/src/server/rpc.js.map +1 -1
  154. package/dist/src/server/rrf.d.ts +86 -0
  155. package/dist/src/server/rrf.d.ts.map +1 -0
  156. package/dist/src/server/rrf.js +108 -0
  157. package/dist/src/server/rrf.js.map +1 -0
  158. package/dist/src/server/runtime.d.ts.map +1 -1
  159. package/dist/src/server/runtime.js +45 -6
  160. package/dist/src/server/runtime.js.map +1 -1
  161. package/dist/src/server/scoring.d.ts.map +1 -1
  162. package/dist/src/server/scoring.js +19 -0
  163. package/dist/src/server/scoring.js.map +1 -1
  164. package/dist/src/shared/cli/args.d.ts +70 -0
  165. package/dist/src/shared/cli/args.d.ts.map +1 -0
  166. package/dist/src/shared/cli/args.js +84 -0
  167. package/dist/src/shared/cli/args.js.map +1 -0
  168. package/dist/src/shared/duckdb.d.ts.map +1 -1
  169. package/dist/src/shared/duckdb.js +9 -0
  170. package/dist/src/shared/duckdb.js.map +1 -1
  171. package/dist/src/shared/embedding/engine.d.ts +38 -0
  172. package/dist/src/shared/embedding/engine.d.ts.map +1 -0
  173. package/dist/src/shared/embedding/engine.js +6 -0
  174. package/dist/src/shared/embedding/engine.js.map +1 -0
  175. package/dist/src/shared/embedding/lsh-engine.d.ts +11 -0
  176. package/dist/src/shared/embedding/lsh-engine.d.ts.map +1 -0
  177. package/dist/src/shared/embedding/lsh-engine.js +14 -0
  178. package/dist/src/shared/embedding/lsh-engine.js.map +1 -0
  179. package/dist/src/shared/embedding/registry.d.ts +25 -0
  180. package/dist/src/shared/embedding/registry.d.ts.map +1 -0
  181. package/dist/src/shared/embedding/registry.js +50 -0
  182. package/dist/src/shared/embedding/registry.js.map +1 -0
  183. package/dist/src/shared/embedding/semantic-engine.d.ts +14 -0
  184. package/dist/src/shared/embedding/semantic-engine.d.ts.map +1 -0
  185. package/dist/src/shared/embedding/semantic-engine.js +50 -0
  186. package/dist/src/shared/embedding/semantic-engine.js.map +1 -0
  187. package/dist/src/shared/models/model-manager.d.ts +38 -0
  188. package/dist/src/shared/models/model-manager.d.ts.map +1 -0
  189. package/dist/src/shared/models/model-manager.js +116 -0
  190. package/dist/src/shared/models/model-manager.js.map +1 -0
  191. package/dist/src/shared/models/model-manifest.d.ts +22 -0
  192. package/dist/src/shared/models/model-manifest.d.ts.map +1 -0
  193. package/dist/src/shared/models/model-manifest.js +24 -0
  194. package/dist/src/shared/models/model-manifest.js.map +1 -0
  195. package/dist/src/shared/utils/path.d.ts +46 -0
  196. package/dist/src/shared/utils/path.d.ts.map +1 -0
  197. package/dist/src/shared/utils/path.js +94 -0
  198. package/dist/src/shared/utils/path.js.map +1 -0
  199. package/dist/src/shared/utils/socket.d.ts +61 -0
  200. package/dist/src/shared/utils/socket.d.ts.map +1 -0
  201. package/dist/src/shared/utils/socket.js +156 -0
  202. package/dist/src/shared/utils/socket.js.map +1 -0
  203. package/dist/src/shared/utils/validation.d.ts +14 -0
  204. package/dist/src/shared/utils/validation.d.ts.map +1 -0
  205. package/dist/src/shared/utils/validation.js +22 -0
  206. package/dist/src/shared/utils/validation.js.map +1 -0
  207. package/package.json +14 -1
@@ -1,7 +1,9 @@
1
- import { resolve } from "node:path";
1
+ import { realpathSync, mkdirSync } from "node:fs";
2
+ import { resolve, relative, sep, dirname, isAbsolute } from "node:path";
2
3
  import { performance } from "node:perf_hooks";
3
4
  import { watch } from "chokidar";
4
5
  import { acquireLock, releaseLock, getLockOwner, LockfileError } from "../shared/utils/lockfile.js";
6
+ import { normalizeDbPath, normalizeRepoPath } from "../shared/utils/path.js";
5
7
  import { runIndexer } from "./cli.js";
6
8
  import { createDenylistFilter } from "./pipeline/filters/denylist.js";
7
9
  /**
@@ -21,6 +23,7 @@ import { createDenylistFilter } from "./pipeline/filters/denylist.js";
21
23
  */
22
24
  export class IndexWatcher {
23
25
  options;
26
+ rawRepoRoot;
24
27
  watcher = null;
25
28
  reindexTimer = null;
26
29
  isReindexing = false;
@@ -29,11 +32,28 @@ export class IndexWatcher {
29
32
  pendingFiles = new Set();
30
33
  stats;
31
34
  lockfilePath;
35
+ realpathCache = new Map();
32
36
  isStopping = false; // Flag to prevent new reindexes during shutdown
33
37
  constructor(options) {
38
+ this.rawRepoRoot = resolve(options.repoRoot);
39
+ const repoRoot = normalizeRepoPath(this.rawRepoRoot);
40
+ let databasePath;
41
+ // Fix #2: Ensure parent directory exists BEFORE normalization
42
+ // This guarantees consistent path normalization on first and subsequent runs
43
+ // Using sync version because constructors can't be async
44
+ try {
45
+ const parentDir = dirname(resolve(options.databasePath));
46
+ mkdirSync(parentDir, { recursive: true });
47
+ }
48
+ catch {
49
+ // Ignore if already exists or permission denied
50
+ }
51
+ // Critical: Use normalizeDbPath to ensure consistent path with cli.ts
52
+ // This prevents lock file and queue key mismatch
53
+ databasePath = normalizeDbPath(options.databasePath);
34
54
  this.options = {
35
- repoRoot: resolve(options.repoRoot),
36
- databasePath: resolve(options.databasePath),
55
+ repoRoot,
56
+ databasePath,
37
57
  debounceMs: options.debounceMs ?? 500,
38
58
  };
39
59
  if (options.configPath) {
@@ -57,6 +77,72 @@ export class IndexWatcher {
57
77
  });
58
78
  }
59
79
  }
80
+ getCachedRealPath(absPath) {
81
+ const cached = this.realpathCache.get(absPath);
82
+ if (cached) {
83
+ return cached;
84
+ }
85
+ try {
86
+ const realPath = realpathSync.native(absPath);
87
+ this.realpathCache.set(absPath, realPath);
88
+ if (this.realpathCache.size > 2048) {
89
+ const key = this.realpathCache.keys().next().value;
90
+ if (key) {
91
+ this.realpathCache.delete(key);
92
+ }
93
+ }
94
+ return realPath;
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * Normalizes absolute file path to repository-relative path.
102
+ *
103
+ * Fix #3: Proper cross-platform path handling to prevent denylist bypass on Windows.
104
+ *
105
+ * Strategy:
106
+ * - Use path.relative() instead of string replacement
107
+ * - Normalize path separator to forward slash (git-compatible)
108
+ * - Reject paths outside repository (security check)
109
+ * - Reject Windows cross-drive paths and UNC paths
110
+ * - Resolve symlinks to prevent bypass via junctions/symlinks
111
+ *
112
+ * @param absPath - Absolute path from file watcher
113
+ * @returns Git-compatible relative path, or null if outside repo
114
+ */
115
+ normalizePathForRepo(absPath) {
116
+ const rel = relative(this.options.repoRoot, absPath);
117
+ // Fix #3: Security - Reject paths outside repository
118
+ // - Parent directory traversal: ".."
119
+ // - Absolute paths (Unix): starts with "/"
120
+ // - Absolute paths (Windows): starts with drive letter "C:" or "C:\"
121
+ // - UNC paths (Windows): starts with "\\" or "//"
122
+ // Note: Empty string is ALLOWED (represents repo root for chokidar directory watching)
123
+ if (rel.startsWith("..") ||
124
+ isAbsolute(rel) ||
125
+ /^[A-Za-z]:/.test(rel) ||
126
+ rel.startsWith("\\\\") ||
127
+ rel.startsWith("//")) {
128
+ return null;
129
+ }
130
+ // Fix #3: Additional safety - Resolve symlinks once and cache the result
131
+ // This prevents bypass via junction points or symlinks pointing outside the repo
132
+ const realAbsPath = this.getCachedRealPath(absPath);
133
+ if (realAbsPath) {
134
+ const realRepoRoot = this.options.repoRoot; // Already normalized in constructor
135
+ const realRel = relative(realRepoRoot, realAbsPath);
136
+ // Double-check the real path is still inside repo
137
+ if (realRel.startsWith("..") || isAbsolute(realRel)) {
138
+ return null;
139
+ }
140
+ }
141
+ // Allow empty string (repo root itself) for chokidar directory watching
142
+ // Normalize to forward slash for cross-platform compatibility
143
+ // Windows uses backslash, but git and denylist rules expect forward slash
144
+ return rel.split(sep).join("/");
145
+ }
60
146
  /**
61
147
  * Starts the file watcher and begins monitoring for changes.
62
148
  *
@@ -73,7 +159,11 @@ export class IndexWatcher {
73
159
  persistent: true,
74
160
  ignoreInitial: true, // Don't trigger on existing files
75
161
  ignored: (path) => {
76
- const relativePath = path.replace(this.options.repoRoot + "/", "");
162
+ const relativePath = this.normalizePathForRepo(path);
163
+ // Reject paths outside repo or invalid paths (explicit null check, not falsy check)
164
+ if (relativePath === null) {
165
+ return true;
166
+ }
77
167
  return denylistFilter.isDenied(relativePath);
78
168
  },
79
169
  // Editor-specific handling
@@ -85,17 +175,47 @@ export class IndexWatcher {
85
175
  usePolling: false, // Use native OS events (faster)
86
176
  // depth option omitted for no depth limit
87
177
  });
88
- // Register event handlers
89
- this.watcher
90
- .on("add", (path) => this.scheduleReindex("add", path))
91
- .on("change", (path) => this.scheduleReindex("change", path))
92
- .on("unlink", (path) => this.scheduleReindex("unlink", path))
93
- .on("error", (error) => {
94
- process.stderr.write(`❌ File watcher error: ${error instanceof Error ? error.message : String(error)}\n`);
95
- })
96
- .on("ready", () => {
97
- process.stderr.write(`👁️ Watch mode started. Monitoring ${this.options.repoRoot} for changes...\n`);
98
- process.stderr.write(` Debounce: ${this.options.debounceMs}ms\n`);
178
+ // Return promise that resolves when watcher is fully initialized
179
+ return new Promise((resolve, reject) => {
180
+ const watcher = this.watcher;
181
+ let settled = false;
182
+ const settle = (cb) => {
183
+ if (settled) {
184
+ return;
185
+ }
186
+ settled = true;
187
+ cb();
188
+ };
189
+ const handleError = (error) => {
190
+ process.stderr.write(`❌ File watcher error: ${error instanceof Error ? error.message : String(error)}\n`);
191
+ if (this.watcher) {
192
+ void this.watcher.close().catch(() => {
193
+ /* ignore */
194
+ });
195
+ this.watcher = null;
196
+ }
197
+ settle(() => {
198
+ reject(new Error(`Failed to start watch mode: ${error instanceof Error ? error.message : String(error)}`));
199
+ });
200
+ };
201
+ // Register event handlers
202
+ watcher
203
+ .on("add", (path) => {
204
+ this.scheduleReindex("add", path);
205
+ })
206
+ .on("change", (path) => {
207
+ this.scheduleReindex("change", path);
208
+ })
209
+ .on("unlink", (path) => {
210
+ this.scheduleReindex("unlink", path);
211
+ })
212
+ .on("error", handleError)
213
+ .once("ready", () => {
214
+ watcher.off("error", handleError);
215
+ process.stderr.write(`👁️ Watch mode started. Monitoring ${this.options.repoRoot} for changes...\n`);
216
+ process.stderr.write(` Debounce: ${this.options.debounceMs}ms\n`);
217
+ settle(resolve);
218
+ });
99
219
  });
100
220
  }
101
221
  /**
@@ -111,7 +231,11 @@ export class IndexWatcher {
111
231
  if (this.isStopping) {
112
232
  return;
113
233
  }
114
- const relativePath = path.replace(this.options.repoRoot + "/", "");
234
+ const relativePath = this.normalizePathForRepo(path);
235
+ // Ignore paths outside repository (security check)
236
+ if (!relativePath) {
237
+ return;
238
+ }
115
239
  this.pendingFiles.add(relativePath);
116
240
  // Clear existing timer if present
117
241
  if (this.reindexTimer !== null) {
@@ -126,9 +250,11 @@ export class IndexWatcher {
126
250
  const moreCount = Math.max(0, this.pendingFiles.size - 5);
127
251
  const summary = moreCount > 0 ? `${fileList} (+${moreCount} more)` : fileList;
128
252
  process.stderr.write(`\n📝 File changes detected: ${summary}\n`);
129
- // Clear pending files and trigger reindex
253
+ // Fix #3 & #4: Capture snapshot BEFORE clearing to prevent data loss and enable incremental indexing
254
+ const changedPaths = Array.from(this.pendingFiles);
130
255
  this.pendingFiles.clear();
131
- void this.executeReindex();
256
+ // Pass snapshot to executeReindex
257
+ void this.executeReindex(changedPaths);
132
258
  }, this.options.debounceMs);
133
259
  // Mark pending flag (used if reindex is already running)
134
260
  this.pendingReindex = true;
@@ -138,8 +264,10 @@ export class IndexWatcher {
138
264
  *
139
265
  * If a reindex is already in progress, marks a pending flag to trigger
140
266
  * another reindex after the current one completes.
267
+ *
268
+ * @param changedPaths - Array of file paths that changed (Fix #3 & #4: snapshot from scheduleReindex)
141
269
  */
142
- async executeReindex() {
270
+ async executeReindex(changedPaths) {
143
271
  // Don't start reindex if watcher is stopping
144
272
  if (this.isStopping) {
145
273
  process.stderr.write(`🛑 Watcher stopping. Skipping reindex.\n`);
@@ -147,6 +275,10 @@ export class IndexWatcher {
147
275
  }
148
276
  // Check if already reindexing
149
277
  if (this.isReindexing) {
278
+ // Fix #6: Restore changedPaths back to pendingFiles to prevent data loss
279
+ for (const path of changedPaths) {
280
+ this.pendingFiles.add(path);
281
+ }
150
282
  process.stderr.write(`⏳ Reindex already in progress. Will reindex again after completion.\n`);
151
283
  this.pendingReindex = true;
152
284
  return;
@@ -154,10 +286,12 @@ export class IndexWatcher {
154
286
  this.isReindexing = true;
155
287
  this.pendingReindex = false;
156
288
  this.stats.lastReindexStart = performance.now();
157
- // Capture pending files for incremental indexing
158
- const changedPaths = Array.from(this.pendingFiles);
289
+ // Fix #3 & #4: Use changedPaths parameter (snapshot from scheduleReindex) instead of reading pendingFiles
290
+ // This prevents data loss on lock contention and enables true incremental indexing
159
291
  // Create and store the reindex promise for proper shutdown handling
160
292
  this.reindexPromise = (async () => {
293
+ // Fix #1: Track lock ownership to prevent releasing locks we don't own
294
+ let lockAcquired = false;
161
295
  try {
162
296
  // Double-check stopping flag before acquiring lock
163
297
  if (this.isStopping) {
@@ -167,12 +301,18 @@ export class IndexWatcher {
167
301
  // Acquire lock to prevent concurrent indexing
168
302
  try {
169
303
  acquireLock(this.lockfilePath);
304
+ lockAcquired = true; // Fix #1: Only set to true on successful acquisition
170
305
  }
171
306
  catch (error) {
172
307
  if (error instanceof LockfileError) {
308
+ // Fix #3: Restore changedPaths to pendingFiles to prevent data loss
309
+ for (const path of changedPaths) {
310
+ this.pendingFiles.add(path);
311
+ }
312
+ this.pendingReindex = true; // Mark for retry when lock is available
173
313
  const ownerPid = error.ownerPid ?? getLockOwner(this.lockfilePath);
174
314
  const ownerInfo = ownerPid ? ` (PID: ${ownerPid})` : "";
175
- process.stderr.write(`⚠️ Another indexing process${ownerInfo} holds the lock. Skipping this reindex.\n`);
315
+ process.stderr.write(`⚠️ Another indexing process${ownerInfo} holds the lock. Changes queued for retry.\n`);
176
316
  return;
177
317
  }
178
318
  throw error;
@@ -181,10 +321,11 @@ export class IndexWatcher {
181
321
  const start = performance.now();
182
322
  process.stderr.write(`🔄 Incrementally reindexing ${changedPaths.length} file(s)...\n`);
183
323
  await runIndexer({
184
- repoRoot: this.options.repoRoot,
324
+ repoRoot: this.rawRepoRoot,
185
325
  databasePath: this.options.databasePath,
186
326
  full: false,
187
327
  changedPaths,
328
+ skipLocking: true, // Fix #1: Watcher already holds the lock
188
329
  });
189
330
  const duration = performance.now() - start;
190
331
  this.stats.reindexCount++;
@@ -198,22 +339,42 @@ export class IndexWatcher {
198
339
  }
199
340
  }
200
341
  catch (error) {
342
+ // Fix #2: Restore changedPaths for ALL errors, not just LockfileError
343
+ // This prevents permanent data loss when reindex fails due to:
344
+ // - Database I/O errors
345
+ // - Parsing failures
346
+ // - Network timeouts
347
+ // - Any other transient errors
348
+ for (const path of changedPaths) {
349
+ this.pendingFiles.add(path);
350
+ }
351
+ this.pendingReindex = true;
201
352
  process.stderr.write(`❌ Reindex failed: ${error instanceof Error ? error.message : String(error)}\n`);
202
- process.stderr.write(` Watch mode continues. Next change will trigger reindex.\n`);
353
+ process.stderr.write(` Changes queued for retry on next file event.\n`);
203
354
  }
204
355
  finally {
205
356
  this.isReindexing = false;
206
- releaseLock(this.lockfilePath);
357
+ // Fix #1: Only release lock if we acquired it (prevents deleting other process's locks)
358
+ if (lockAcquired) {
359
+ releaseLock(this.lockfilePath);
360
+ }
207
361
  this.reindexPromise = null;
208
362
  // Clear timer to prevent resource leak
209
363
  if (this.reindexTimer !== null) {
210
364
  clearTimeout(this.reindexTimer);
211
365
  this.reindexTimer = null;
212
366
  }
213
- // If more changes occurred during reindex, schedule another one
214
- if (this.pendingReindex) {
367
+ // Fix #7: If more changes occurred during reindex, trigger direct retry
368
+ if (this.pendingReindex && this.pendingFiles.size > 0) {
215
369
  process.stderr.write(`🔁 New changes detected during reindex. Scheduling another reindex...\n`);
216
- this.scheduleReindex("batch", "(multiple files)");
370
+ // Direct retry without file system event dependency
371
+ // Don't clear pendingFiles here - let the timer callback handle it
372
+ this.reindexTimer = setTimeout(() => {
373
+ this.reindexTimer = null;
374
+ const changedPaths = Array.from(this.pendingFiles);
375
+ this.pendingFiles.clear();
376
+ void this.executeReindex(changedPaths);
377
+ }, this.options.debounceMs);
217
378
  }
218
379
  }
219
380
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/indexer/watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/indexer/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Abbreviation expansion for path matching (ADR 003)
3
+ *
4
+ * Bridges the vocabulary gap between natural language queries and technical path names.
5
+ * Example: "database" → ["database", "db", "data"]
6
+ *
7
+ * LDE principles:
8
+ * - Pure functions (no side effects)
9
+ * - Readonly types (immutability)
10
+ * - Property-based testing
11
+ */
12
+ /**
13
+ * Abbreviation mapping (LDE: readonly, immutable)
14
+ */
15
+ export interface AbbreviationMap {
16
+ readonly canonical: string;
17
+ readonly variants: readonly string[];
18
+ }
19
+ /**
20
+ * Default abbreviation dictionary
21
+ *
22
+ * Maintenance: Add new entries as needed, alphabetically sorted by canonical
23
+ * Conflicts: Use most common meaning (e.g., "db" → "database" not "debug")
24
+ */
25
+ export declare const DEFAULT_ABBREVIATIONS: readonly AbbreviationMap[];
26
+ /**
27
+ * Expand term with common abbreviations (LDE: pure function)
28
+ *
29
+ * Matches term (case-insensitive) against abbreviation dictionary and returns
30
+ * all related forms (canonical + variants).
31
+ *
32
+ * @param term - Query term to expand (e.g., "db", "database", "config")
33
+ * @param abbreviations - Abbreviation dictionary (default: DEFAULT_ABBREVIATIONS)
34
+ * @returns Readonly array of expanded terms including canonical and all variants
35
+ *
36
+ * @example
37
+ * expandAbbreviations("db") → ["database", "db", "data"]
38
+ * expandAbbreviations("config") → ["configuration", "config", "cfg", "conf"]
39
+ * expandAbbreviations("unknown") → ["unknown"]
40
+ *
41
+ * LDE properties:
42
+ * - Pure: Same input always produces same output
43
+ * - No side effects: Doesn't modify input or global state
44
+ * - Immutable: Returns readonly array
45
+ */
46
+ export declare function expandAbbreviations(term: string, abbreviations?: readonly AbbreviationMap[]): readonly string[];
47
+ //# sourceMappingURL=abbreviations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abbreviations.d.ts","sourceRoot":"","sources":["../../../src/server/abbreviations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,eAAe,EAqB3D,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,SAAS,eAAe,EAA0B,GAChE,SAAS,MAAM,EAAE,CAenB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Abbreviation expansion for path matching (ADR 003)
3
+ *
4
+ * Bridges the vocabulary gap between natural language queries and technical path names.
5
+ * Example: "database" → ["database", "db", "data"]
6
+ *
7
+ * LDE principles:
8
+ * - Pure functions (no side effects)
9
+ * - Readonly types (immutability)
10
+ * - Property-based testing
11
+ */
12
+ /**
13
+ * Default abbreviation dictionary
14
+ *
15
+ * Maintenance: Add new entries as needed, alphabetically sorted by canonical
16
+ * Conflicts: Use most common meaning (e.g., "db" → "database" not "debug")
17
+ */
18
+ export const DEFAULT_ABBREVIATIONS = [
19
+ { canonical: "administrator", variants: ["admin"] },
20
+ { canonical: "application", variants: ["app"] },
21
+ { canonical: "authentication", variants: ["auth"] },
22
+ { canonical: "authorization", variants: ["authz"] },
23
+ { canonical: "configuration", variants: ["config", "cfg", "conf"] },
24
+ { canonical: "controller", variants: ["ctrl"] },
25
+ { canonical: "database", variants: ["db", "data"] },
26
+ { canonical: "development", variants: ["dev"] },
27
+ { canonical: "directory", variants: ["dir"] },
28
+ { canonical: "document", variants: ["doc", "docs"] },
29
+ { canonical: "error", variants: ["err", "errors"] },
30
+ { canonical: "implementation", variants: ["impl"] },
31
+ { canonical: "manager", variants: ["mgr"] },
32
+ { canonical: "production", variants: ["prod"] },
33
+ { canonical: "repository", variants: ["repo"] },
34
+ { canonical: "service", variants: ["svc", "srv"] },
35
+ { canonical: "source", variants: ["src"] },
36
+ { canonical: "specification", variants: ["spec", "specs"] },
37
+ { canonical: "temporary", variants: ["tmp", "temp"] },
38
+ { canonical: "utilities", variants: ["util", "utils"] },
39
+ ];
40
+ /**
41
+ * Expand term with common abbreviations (LDE: pure function)
42
+ *
43
+ * Matches term (case-insensitive) against abbreviation dictionary and returns
44
+ * all related forms (canonical + variants).
45
+ *
46
+ * @param term - Query term to expand (e.g., "db", "database", "config")
47
+ * @param abbreviations - Abbreviation dictionary (default: DEFAULT_ABBREVIATIONS)
48
+ * @returns Readonly array of expanded terms including canonical and all variants
49
+ *
50
+ * @example
51
+ * expandAbbreviations("db") → ["database", "db", "data"]
52
+ * expandAbbreviations("config") → ["configuration", "config", "cfg", "conf"]
53
+ * expandAbbreviations("unknown") → ["unknown"]
54
+ *
55
+ * LDE properties:
56
+ * - Pure: Same input always produces same output
57
+ * - No side effects: Doesn't modify input or global state
58
+ * - Immutable: Returns readonly array
59
+ */
60
+ export function expandAbbreviations(term, abbreviations = DEFAULT_ABBREVIATIONS) {
61
+ const normalized = term.toLowerCase().trim();
62
+ // Find matching abbreviation map (check both canonical and variants)
63
+ const map = abbreviations.find((m) => m.canonical === normalized || m.variants.includes(normalized));
64
+ if (map) {
65
+ // Return all forms: canonical + variants
66
+ return [map.canonical, ...map.variants];
67
+ }
68
+ // No match: return original term
69
+ return [term];
70
+ }
71
+ //# sourceMappingURL=abbreviations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abbreviations.js","sourceRoot":"","sources":["../../../src/server/abbreviations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA+B;IAC/D,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;IACnE,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC7C,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;IACpD,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IACnD,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC3C,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;IAC/C,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;IAClD,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC1C,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAC3D,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;IACrD,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;CACxD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,gBAA4C,qBAAqB;IAEjE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAE7C,qEAAqE;IACrE,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CACrE,CAAC;IAEF,IAAI,GAAG,EAAE,CAAC;QACR,yCAAyC;QACzC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Boost Profile Configurations
3
+ *
4
+ * This module provides centralized configuration for boost_profile options.
5
+ * Each profile defines how different file types should be ranked in search results.
6
+ *
7
+ * Profiles:
8
+ * - default: Prioritizes implementation files over documentation
9
+ * - docs: Prioritizes documentation over implementation
10
+ * - balanced: Equal weight for both docs and implementation
11
+ * - none: No file type boosting (pure keyword scoring)
12
+ */
13
+ /**
14
+ * Boost profile configuration
15
+ * Defines how different file types should be ranked
16
+ */
17
+ export interface BoostProfileConfig {
18
+ /**
19
+ * Directories to allow even if they match global denylist patterns.
20
+ * Example: ["docs/"] allows docs/ files despite being blacklisted by default.
21
+ * This overrides the global blacklist in applyFileTypeBoost/applyAdditiveFilePenalties.
22
+ */
23
+ denylistOverrides: string[];
24
+ /** Multiplicative factors for different file types */
25
+ fileTypeMultipliers: {
26
+ /** Documentation files (.md, .yaml, .yml, .mdc) */
27
+ doc: number;
28
+ /** Implementation files (src/**) */
29
+ impl: number;
30
+ /** Configuration files (tsconfig.json, package.json, etc.) */
31
+ config: number;
32
+ };
33
+ /**
34
+ * Path-specific multipliers (e.g., src/app/ gets higher boost than src/)
35
+ * Array is sorted by prefix length (longest first) to ensure correct matching priority
36
+ */
37
+ pathMultipliers: Array<{
38
+ prefix: string;
39
+ multiplier: number;
40
+ }>;
41
+ /**
42
+ * Skip additive penalty for config files (-1.5 score penalty)
43
+ * and only apply multiplicative penalty (e.g., 0.3x multiplier)
44
+ * @default false
45
+ */
46
+ skipConfigAdditivePenalty?: boolean;
47
+ }
48
+ export type BoostProfileName = "default" | "docs" | "none" | "balanced";
49
+ /**
50
+ * Boost profile definitions
51
+ * Centralized configuration for all boost profiles
52
+ */
53
+ export declare const BOOST_PROFILES: Record<BoostProfileName, BoostProfileConfig>;
54
+ /**
55
+ * Get boost profile configuration by name
56
+ * @throws Error if profile name is invalid
57
+ */
58
+ export declare function getBoostProfile(name: BoostProfileName): BoostProfileConfig;
59
+ /**
60
+ * Check if a profile name is valid
61
+ */
62
+ export declare function isValidBoostProfile(name: string): name is BoostProfileName;
63
+ //# sourceMappingURL=boost-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boost-profiles.d.ts","sourceRoot":"","sources":["../../../src/server/boost-profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAE5B,sDAAsD;IACtD,mBAAmB,EAAE;QACnB,mDAAmD;QACnD,GAAG,EAAE,MAAM,CAAC;QACZ,oCAAoC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,8DAA8D;QAC9D,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;;OAGG;IACH,eAAe,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/D;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAqDvE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CAS1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,gBAAgB,CAE1E"}