codesift-mcp 0.12.0 → 0.14.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 (183) hide show
  1. package/README.md +44 -1
  2. package/dist/cli/commands.d.ts.map +1 -1
  3. package/dist/cli/commands.js +49 -3
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/cli/help.d.ts.map +1 -1
  6. package/dist/cli/help.js +25 -2
  7. package/dist/cli/help.js.map +1 -1
  8. package/dist/cli/hooks/pre-tool-use.d.ts +1 -0
  9. package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -1
  10. package/dist/cli/hooks/pre-tool-use.js +11 -2
  11. package/dist/cli/hooks/pre-tool-use.js.map +1 -1
  12. package/dist/cli/owner-only-file.d.ts +51 -0
  13. package/dist/cli/owner-only-file.d.ts.map +1 -0
  14. package/dist/cli/owner-only-file.js +121 -0
  15. package/dist/cli/owner-only-file.js.map +1 -0
  16. package/dist/cli/service.d.ts +17 -1
  17. package/dist/cli/service.d.ts.map +1 -1
  18. package/dist/cli/service.js +28 -12
  19. package/dist/cli/service.js.map +1 -1
  20. package/dist/cli/setup/codex.d.ts.map +1 -1
  21. package/dist/cli/setup/codex.js +14 -7
  22. package/dist/cli/setup/codex.js.map +1 -1
  23. package/dist/cli/setup/fs.d.ts +12 -0
  24. package/dist/cli/setup/fs.d.ts.map +1 -1
  25. package/dist/cli/setup/fs.js +17 -2
  26. package/dist/cli/setup/fs.js.map +1 -1
  27. package/dist/cli/setup/mcp.d.ts +14 -1
  28. package/dist/cli/setup/mcp.d.ts.map +1 -1
  29. package/dist/cli/setup/mcp.js +55 -5
  30. package/dist/cli/setup/mcp.js.map +1 -1
  31. package/dist/cli/setup/types.d.ts +19 -0
  32. package/dist/cli/setup/types.d.ts.map +1 -1
  33. package/dist/config.d.ts +13 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +21 -0
  36. package/dist/config.js.map +1 -1
  37. package/dist/formatters-core.d.ts +7 -0
  38. package/dist/formatters-core.d.ts.map +1 -1
  39. package/dist/formatters-core.js +14 -3
  40. package/dist/formatters-core.js.map +1 -1
  41. package/dist/parser/extractors/hono-inline-analyzer.js +2 -2
  42. package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -1
  43. package/dist/register-tool-groups/core/search.d.ts.map +1 -1
  44. package/dist/register-tool-groups/core/search.js +14 -0
  45. package/dist/register-tool-groups/core/search.js.map +1 -1
  46. package/dist/register-tool-groups/core/symbols.d.ts.map +1 -1
  47. package/dist/register-tool-groups/core/symbols.js +50 -5
  48. package/dist/register-tool-groups/core/symbols.js.map +1 -1
  49. package/dist/register-tools/runtime.d.ts +15 -6
  50. package/dist/register-tools/runtime.d.ts.map +1 -1
  51. package/dist/register-tools/runtime.js +30 -12
  52. package/dist/register-tools/runtime.js.map +1 -1
  53. package/dist/server.d.ts.map +1 -1
  54. package/dist/server.js +96 -11
  55. package/dist/server.js.map +1 -1
  56. package/dist/storage/_shared.d.ts +21 -0
  57. package/dist/storage/_shared.d.ts.map +1 -1
  58. package/dist/storage/_shared.js +36 -0
  59. package/dist/storage/_shared.js.map +1 -1
  60. package/dist/storage/embedding-store.d.ts +12 -1
  61. package/dist/storage/embedding-store.d.ts.map +1 -1
  62. package/dist/storage/embedding-store.js +42 -2
  63. package/dist/storage/embedding-store.js.map +1 -1
  64. package/dist/storage/index-footprint.d.ts +12 -0
  65. package/dist/storage/index-footprint.d.ts.map +1 -0
  66. package/dist/storage/index-footprint.js +41 -0
  67. package/dist/storage/index-footprint.js.map +1 -0
  68. package/dist/storage/index-store.d.ts +61 -3
  69. package/dist/storage/index-store.d.ts.map +1 -1
  70. package/dist/storage/index-store.js +409 -13
  71. package/dist/storage/index-store.js.map +1 -1
  72. package/dist/storage/registry.d.ts.map +1 -1
  73. package/dist/storage/registry.js +64 -1
  74. package/dist/storage/registry.js.map +1 -1
  75. package/dist/storage/shared-embedding-cache.d.ts +29 -0
  76. package/dist/storage/shared-embedding-cache.d.ts.map +1 -0
  77. package/dist/storage/shared-embedding-cache.js +120 -0
  78. package/dist/storage/shared-embedding-cache.js.map +1 -0
  79. package/dist/storage/sqlite/accessors.d.ts +34 -0
  80. package/dist/storage/sqlite/accessors.d.ts.map +1 -0
  81. package/dist/storage/sqlite/accessors.js +178 -0
  82. package/dist/storage/sqlite/accessors.js.map +1 -0
  83. package/dist/storage/sqlite/connection.d.ts +43 -0
  84. package/dist/storage/sqlite/connection.d.ts.map +1 -0
  85. package/dist/storage/sqlite/connection.js +241 -0
  86. package/dist/storage/sqlite/connection.js.map +1 -0
  87. package/dist/storage/sqlite/errors.d.ts +38 -0
  88. package/dist/storage/sqlite/errors.d.ts.map +1 -0
  89. package/dist/storage/sqlite/errors.js +150 -0
  90. package/dist/storage/sqlite/errors.js.map +1 -0
  91. package/dist/storage/sqlite/index-io.d.ts +49 -0
  92. package/dist/storage/sqlite/index-io.d.ts.map +1 -0
  93. package/dist/storage/sqlite/index-io.js +268 -0
  94. package/dist/storage/sqlite/index-io.js.map +1 -0
  95. package/dist/storage/sqlite/meta.d.ts +41 -0
  96. package/dist/storage/sqlite/meta.d.ts.map +1 -0
  97. package/dist/storage/sqlite/meta.js +28 -0
  98. package/dist/storage/sqlite/meta.js.map +1 -0
  99. package/dist/storage/sqlite/rows.d.ts +64 -0
  100. package/dist/storage/sqlite/rows.d.ts.map +1 -0
  101. package/dist/storage/sqlite/rows.js +186 -0
  102. package/dist/storage/sqlite/rows.js.map +1 -0
  103. package/dist/storage/sqlite/runtime.d.ts +6 -0
  104. package/dist/storage/sqlite/runtime.d.ts.map +1 -0
  105. package/dist/storage/sqlite/runtime.js +31 -0
  106. package/dist/storage/sqlite/runtime.js.map +1 -0
  107. package/dist/storage/sqlite/schema.d.ts +34 -0
  108. package/dist/storage/sqlite/schema.d.ts.map +1 -0
  109. package/dist/storage/sqlite/schema.js +98 -0
  110. package/dist/storage/sqlite/schema.js.map +1 -0
  111. package/dist/storage/sqlite-index-store.d.ts +49 -0
  112. package/dist/storage/sqlite-index-store.d.ts.map +1 -0
  113. package/dist/storage/sqlite-index-store.js +48 -0
  114. package/dist/storage/sqlite-index-store.js.map +1 -0
  115. package/dist/storage/telemetry/config.d.ts.map +1 -1
  116. package/dist/storage/telemetry/config.js +14 -3
  117. package/dist/storage/telemetry/config.js.map +1 -1
  118. package/dist/storage/telemetry/payload.d.ts.map +1 -1
  119. package/dist/storage/telemetry/payload.js +4 -1
  120. package/dist/storage/telemetry/payload.js.map +1 -1
  121. package/dist/storage/telemetry/retro-aggregator.d.ts +27 -0
  122. package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -0
  123. package/dist/storage/telemetry/retro-aggregator.js +179 -0
  124. package/dist/storage/telemetry/retro-aggregator.js.map +1 -0
  125. package/dist/storage/telemetry/sanitizer.d.ts +30 -0
  126. package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
  127. package/dist/storage/telemetry/sanitizer.js +23 -0
  128. package/dist/storage/telemetry/sanitizer.js.map +1 -1
  129. package/dist/storage/telemetry/uploader.d.ts.map +1 -1
  130. package/dist/storage/telemetry/uploader.js +6 -0
  131. package/dist/storage/telemetry/uploader.js.map +1 -1
  132. package/dist/storage/workspace-resolver.js +1 -1
  133. package/dist/storage/workspace-resolver.js.map +1 -1
  134. package/dist/tools/index-tools/file-indexer.js +19 -19
  135. package/dist/tools/index-tools/file-indexer.js.map +1 -1
  136. package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
  137. package/dist/tools/index-tools/folder-indexer.js +4 -1
  138. package/dist/tools/index-tools/folder-indexer.js.map +1 -1
  139. package/dist/tools/index-tools/parse.d.ts.map +1 -1
  140. package/dist/tools/index-tools/parse.js +4 -1
  141. package/dist/tools/index-tools/parse.js.map +1 -1
  142. package/dist/tools/index-tools/registry.d.ts +16 -0
  143. package/dist/tools/index-tools/registry.d.ts.map +1 -1
  144. package/dist/tools/index-tools/registry.js +95 -1
  145. package/dist/tools/index-tools/registry.js.map +1 -1
  146. package/dist/tools/index-tools.d.ts +2 -2
  147. package/dist/tools/index-tools.d.ts.map +1 -1
  148. package/dist/tools/index-tools.js +2 -2
  149. package/dist/tools/index-tools.js.map +1 -1
  150. package/dist/tools/plan-turn/stale-index.d.ts +32 -0
  151. package/dist/tools/plan-turn/stale-index.d.ts.map +1 -1
  152. package/dist/tools/plan-turn/stale-index.js +42 -5
  153. package/dist/tools/plan-turn/stale-index.js.map +1 -1
  154. package/dist/tools/search-tools/types.d.ts +20 -0
  155. package/dist/tools/search-tools/types.d.ts.map +1 -1
  156. package/dist/tools/search-tools/zero-hit.d.ts.map +1 -1
  157. package/dist/tools/search-tools/zero-hit.js +0 -0
  158. package/dist/tools/search-tools/zero-hit.js.map +1 -1
  159. package/dist/tools/status-tools.d.ts +20 -0
  160. package/dist/tools/status-tools.d.ts.map +1 -1
  161. package/dist/tools/status-tools.js +69 -18
  162. package/dist/tools/status-tools.js.map +1 -1
  163. package/dist/tools/symbol-tools.d.ts +95 -1
  164. package/dist/tools/symbol-tools.d.ts.map +1 -1
  165. package/dist/tools/symbol-tools.js +182 -26
  166. package/dist/tools/symbol-tools.js.map +1 -1
  167. package/dist/tools/workspace-scope-helper.d.ts.map +1 -1
  168. package/dist/tools/workspace-scope-helper.js +8 -1
  169. package/dist/tools/workspace-scope-helper.js.map +1 -1
  170. package/dist/tools/workspace-tools.d.ts.map +1 -1
  171. package/dist/tools/workspace-tools.js +9 -1
  172. package/dist/tools/workspace-tools.js.map +1 -1
  173. package/dist/types.d.ts +6 -0
  174. package/dist/types.d.ts.map +1 -1
  175. package/dist/utils/git-head.d.ts +12 -0
  176. package/dist/utils/git-head.d.ts.map +1 -1
  177. package/dist/utils/git-head.js +25 -0
  178. package/dist/utils/git-head.js.map +1 -1
  179. package/dist/utils/loopback.d.ts +23 -0
  180. package/dist/utils/loopback.d.ts.map +1 -0
  181. package/dist/utils/loopback.js +71 -0
  182. package/dist/utils/loopback.js.map +1 -0
  183. package/package.json +6 -4
@@ -1,14 +1,115 @@
1
1
  import { readFile } from "node:fs/promises";
2
+ import { statSync } from "node:fs";
2
3
  import { join } from "node:path";
3
4
  import { createHash } from "node:crypto";
4
5
  import { atomicWriteFile } from "./_shared.js";
6
+ import { isSqliteAvailable, loadIndexSqlite, saveIndexSqlite, saveIncrementalSqlite, removeFileFromIndexSqlite, getFileEntrySqlite, getDataVersion, importLegacyIndexIfEmpty, classifyStorageError, IndexStorageError, loadIndexSummarySqlite, } from "./sqlite-index-store.js";
7
+ import { indexFootprintBytes } from "./index-footprint.js";
8
+ import { indexCacheMemBudgetBytes } from "../config.js";
9
+ /** Bounded by entry count, not bytes: a summary holds no symbols, so it cannot dominate the heap
10
+ * the way a materialised index can. */
11
+ const MAX_CACHED_SUMMARIES = 16;
12
+ const summaryCache = new Map();
13
+ function copySummary(summary) {
14
+ const out = { ...summary, files: [...summary.files] };
15
+ if (summary.workspaces !== undefined)
16
+ out.workspaces = [...summary.workspaces];
17
+ return out;
18
+ }
19
+ export function resetSummaryCacheForTesting() {
20
+ summaryCache.clear();
21
+ }
5
22
  /** Serialize concurrent writes to the same index path. */
6
23
  const writeLocks = new Map();
24
+ /**
25
+ * Which on-disk format to use.
26
+ *
27
+ * `CODESIFT_INDEX_BACKEND=json` pins the legacy path (the documented rollback);
28
+ * `=sqlite` demands the new one and fails loudly if `node:sqlite` is missing, so a CI run
29
+ * cannot quietly exercise the wrong backend. Unset auto-detects, which is what keeps the
30
+ * `engines: >=20` floor honest: Node 20 has no `node:sqlite` and simply stays on JSON.
31
+ *
32
+ * Read from the environment here rather than `config.ts` because the choice must be
33
+ * resolvable from the short-lived `codesift postindex-file` hook process too, which never
34
+ * builds a full config.
35
+ */
36
+ let backendPromise;
37
+ export async function resolveIndexBackend() {
38
+ backendPromise ??= computeIndexBackend();
39
+ return backendPromise;
40
+ }
41
+ async function computeIndexBackend() {
42
+ const explicit = process.env["CODESIFT_INDEX_BACKEND"];
43
+ if (explicit === "json")
44
+ return "json";
45
+ if (explicit === "sqlite") {
46
+ if (!(await isSqliteAvailable())) {
47
+ throw new Error("CODESIFT_INDEX_BACKEND=sqlite but node:sqlite is unavailable (requires Node >= 22.5)");
48
+ }
49
+ return "sqlite";
50
+ }
51
+ return (await isSqliteAvailable()) ? "sqlite" : "json";
52
+ }
53
+ export function resetIndexBackendForTesting() {
54
+ backendPromise = undefined;
55
+ }
56
+ /** `<hash>.index.json` -> `<hash>.index.db`, so both formats sit side by side and the JSON
57
+ * stays available as the rollback artifact. */
58
+ export function sqlitePathFor(indexPath) {
59
+ return indexPath.endsWith(".json")
60
+ ? `${indexPath.slice(0, -".json".length)}.db`
61
+ : `${indexPath}.db`;
62
+ }
63
+ /** Guards one-time JSON->SQLite migration per index path. */
64
+ const migrations = new Map();
65
+ /**
66
+ * Bring an existing JSON index across on first touch.
67
+ *
68
+ * Deliberately non-destructive: the source `.json` is left in place. Deleting it would make
69
+ * `CODESIFT_INDEX_BACKEND=json` a one-way door, and the whole point of shipping a rollback
70
+ * switch is that it still has something to roll back to.
71
+ */
72
+ async function ensureSqliteMigrated(indexPath, dbPath) {
73
+ const inFlight = migrations.get(dbPath);
74
+ if (inFlight)
75
+ return inFlight;
76
+ const run = (async () => {
77
+ if ((await loadIndexSqlite(dbPath)) !== null)
78
+ return; // already migrated
79
+ const legacy = await loadJsonIndex(indexPath);
80
+ // importLegacyIndexIfEmpty re-checks emptiness under the write lock, so a second
81
+ // process that raced us here imports nothing instead of overwriting our rows.
82
+ if (legacy)
83
+ await importLegacyIndexIfEmpty(dbPath, legacy);
84
+ })();
85
+ migrations.set(dbPath, run);
86
+ try {
87
+ await run;
88
+ }
89
+ catch (err) {
90
+ // A failed migration is retried, not remembered as done — and we do NOT re-read the same
91
+ // failing database to decide that. Probing it again inside a `finally` would hit an
92
+ // already-struggling store a second time AND, if that probe throws too, JS try/finally
93
+ // semantics would replace the original error with the second one.
94
+ migrations.delete(dbPath);
95
+ throw err;
96
+ }
97
+ migrations.set(dbPath, Promise.resolve());
98
+ }
99
+ export function resetMigrationCacheForTesting() {
100
+ migrations.clear();
101
+ }
7
102
  /**
8
103
  * Save a code index atomically.
9
104
  * Writes to a temp file first, then renames to prevent partial reads.
10
105
  */
11
- export async function saveIndex(indexPath, index) {
106
+ export async function saveIndex(indexPath, index, opts) {
107
+ if ((await resolveIndexBackend()) === "sqlite") {
108
+ const dbPath = sqlitePathFor(indexPath);
109
+ await saveIndexSqlite(dbPath, index, opts);
110
+ invalidateIndexCache(dbPath);
111
+ return;
112
+ }
12
113
  const data = JSON.stringify(index);
13
114
  await atomicWriteFile(indexPath, data);
14
115
  }
@@ -23,24 +124,290 @@ export async function saveIndex(indexPath, index) {
23
124
  * where version enforcement would cause spurious reindexes.
24
125
  */
25
126
  export async function loadIndex(indexPath, currentVersions) {
26
- try {
27
- const raw = await readFile(indexPath, "utf-8");
28
- const parsed = JSON.parse(raw);
29
- if (!isValidIndex(parsed)) {
127
+ const index = await readIndex(indexPath);
128
+ if (!index)
129
+ return null;
130
+ if (currentVersions && !isExtractorVersionCurrent(index, currentVersions))
131
+ return null;
132
+ return index;
133
+ }
134
+ /**
135
+ * One file's `files[]` entry.
136
+ *
137
+ * This is the accessor ADR-003 exists for. `file-indexer` needs a single file's `mtime_ms`
138
+ * and `symbol_count` to decide whether an edit changed anything, and used to obtain them by
139
+ * loading the entire index — a 262 MB parse on tgm-survey-platform, paid on the first touch
140
+ * of every file, in a hook process that exits immediately afterwards and so can never reuse
141
+ * the result. Under SQLite it is one indexed row.
142
+ *
143
+ * The JSON backend keeps the old cost; there is no way to read one record out of a blob.
144
+ */
145
+ export async function getFileEntry(indexPath, filePath) {
146
+ if ((await resolveIndexBackend()) === "sqlite") {
147
+ const dbPath = sqlitePathFor(indexPath);
148
+ await ensureSqliteMigrated(indexPath, dbPath);
149
+ return getFileEntrySqlite(dbPath, filePath);
150
+ }
151
+ const index = await loadJsonIndex(indexPath);
152
+ return index?.files.find((f) => f.path === filePath);
153
+ }
154
+ /**
155
+ * Bounded, LRU by insertion order. A materialised index is the largest object this process
156
+ * holds — the JSON equivalent is 262 MB on tgm-survey-platform — and `codesift serve` is a
157
+ * long-lived daemon that touches many repos. An unbounded map here would have been the one
158
+ * cache in this codebase without a ceiling, next to an embedding cache that is explicitly
159
+ * RAM-budgeted (`CODESIFT_MAX_EMBEDDING_MEM_MB`); that asymmetry is how the OOM reports
160
+ * documented in CLAUDE.md started.
161
+ */
162
+ // `|| 3` would be wrong here: an operator setting 0 to minimise memory would get 3, because
163
+ // 0 is falsy. Only a non-numeric value should fall back.
164
+ const MAX_CACHED_INDEXES = (() => {
165
+ const raw = process.env["CODESIFT_MAX_CACHED_INDEXES"];
166
+ const parsed = raw === undefined ? 3 : Number(raw);
167
+ return Math.max(1, Number.isNaN(parsed) ? 3 : parsed);
168
+ })();
169
+ const indexCache = new Map();
170
+ function cachedBytes() {
171
+ let total = 0;
172
+ for (const entry of indexCache.values())
173
+ total += indexFootprintBytes(entry.index);
174
+ return total;
175
+ }
176
+ function cacheIndex(dbPath, entry) {
177
+ // Re-insert to move to the most-recent end of Map iteration order.
178
+ indexCache.delete(dbPath);
179
+ indexCache.set(dbPath, entry);
180
+ const budget = indexCacheMemBudgetBytes();
181
+ // Evict oldest-first on EITHER bound. The count cap alone let three repos of any size sit
182
+ // resident, and index sizes span two orders of magnitude — the measured tgm-survey-platform
183
+ // index is 411 MB against a few MB for a small repo, so "three indexes" was a ceiling only in
184
+ // name. The byte bound is the real one; the count cap stays as a cheap upper limit on entries.
185
+ //
186
+ // The running total is decremented per eviction rather than re-summed in the loop condition.
187
+ // `MAX_CACHED_INDEXES` has a floor but no ceiling (`CODESIFT_MAX_CACHED_INDEXES` is operator
188
+ // input), and re-summing would make each insert O(n²) in exactly the many-repo daemon this
189
+ // budget was written for.
190
+ let total = cachedBytes();
191
+ while (indexCache.size > 1 && (indexCache.size > MAX_CACHED_INDEXES || total > budget)) {
192
+ const oldest = indexCache.entries().next();
193
+ if (oldest.done)
194
+ break;
195
+ const [key, entry] = oldest.value;
196
+ total -= indexFootprintBytes(entry.index);
197
+ indexCache.delete(key);
198
+ }
199
+ // `size > 1` above deliberately keeps the entry just inserted even when it alone exceeds the
200
+ // budget. Evicting it would mean re-reading the same index on the very next call and evicting
201
+ // it again — an unbounded reload loop that costs far more than the memory it reclaims. A repo
202
+ // bigger than the whole budget is a reason to raise CODESIFT_MAX_INDEX_CACHE_MB, not to stop
203
+ // caching it.
204
+ }
205
+ /**
206
+ * Detach the two arrays callers actually touch.
207
+ *
208
+ * A bare `{...index}` only stops a caller REASSIGNING `files`/`symbols`; an in-place
209
+ * `push`/`sort`/`splice` would still hit the array the cache holds — and `data_version`
210
+ * cannot see an in-memory mutation, so the corruption would survive every later hit. The
211
+ * elements stay shared (symbols are treated as immutable records); this copies the two
212
+ * array containers, which is the boundary that was actually being crossed.
213
+ */
214
+ function copyIndex(index) {
215
+ return { ...index, files: [...index.files], symbols: [...index.symbols] };
216
+ }
217
+ function invalidateIndexCache(dbPath) {
218
+ indexCache.delete(dbPath);
219
+ // Our own writes do not move `data_version`, so the summary must be dropped explicitly too —
220
+ // otherwise a save would leave `index_status` reporting the pre-write counts indefinitely.
221
+ summaryCache.delete(dbPath);
222
+ }
223
+ export function resetIndexCacheForTesting() {
224
+ indexCache.clear();
225
+ }
226
+ export function getIndexCacheSizeForTesting() {
227
+ return indexCache.size;
228
+ }
229
+ export function getIndexCacheBytesForTesting() {
230
+ return cachedBytes();
231
+ }
232
+ /**
233
+ * Read an index's files and metadata WITHOUT constructing its symbols (ADR-004 stage 2).
234
+ *
235
+ * On the SQLite backend this skips the object graph entirely. On JSON there is nothing to skip —
236
+ * the format forces a whole-document parse — so this is parity, not a speedup, and it exists so
237
+ * callers can be written once against the narrow shape rather than branching on the backend.
238
+ */
239
+ export async function loadIndexSummary(indexPath) {
240
+ if ((await resolveIndexBackend()) === "sqlite") {
241
+ const dbPath = sqlitePathFor(indexPath);
242
+ await ensureSqliteMigrated(indexPath, dbPath);
243
+ // Cached on the same `data_version` signal as the full index. Without this a repo whose only
244
+ // traffic is `index_status` re-opened a connection and re-read the whole files table on every
245
+ // call, while its `getCodeIndex` sibling was served from memory — an asymmetry with no reason
246
+ // behind it. A summary is small (3 MB against 349 MB on the measured index), so this is not
247
+ // budgeted against `CODESIFT_MAX_INDEX_CACHE_MB`; it is bounded by entry count instead.
248
+ const dataVersion = await getDataVersion(dbPath);
249
+ const cached = summaryCache.get(dbPath);
250
+ if (cached && cached.dataVersion === dataVersion) {
251
+ summaryCache.delete(dbPath);
252
+ summaryCache.set(dbPath, cached); // move to the recent end (LRU, as in cacheIndex)
253
+ return copySummary(cached.summary);
254
+ }
255
+ const summary = await loadIndexSummarySqlite(dbPath);
256
+ if (summary === null)
30
257
  return null;
258
+ summaryCache.set(dbPath, { summary, dataVersion });
259
+ while (summaryCache.size > MAX_CACHED_SUMMARIES) {
260
+ const oldest = summaryCache.keys().next();
261
+ if (oldest.done)
262
+ break;
263
+ summaryCache.delete(oldest.value);
264
+ }
265
+ // Copy on the miss path too, for the same reason `readIndex` does: handing back the stored
266
+ // object lets the first caller mutate the entry every later reader is about to be given.
267
+ return copySummary(summary);
268
+ }
269
+ warnIfRollbackIsStale(indexPath);
270
+ const index = await loadJsonIndex(indexPath);
271
+ return index === null ? null : summariseIndex(index);
272
+ }
273
+ /**
274
+ * Project a fully-loaded index onto the narrow shape, dropping the symbols array.
275
+ *
276
+ * `files` is COPIED, not aliased. This function's main caller projects an index held in the
277
+ * `codeIndexes` cache, so handing back the live array would let one caller's `sort`/`splice`
278
+ * rewrite what every later reader is given — the exact boundary `copyIndex` above exists to
279
+ * defend, reached by a different route. `workspaces` is copied for the same reason.
280
+ */
281
+ export function summariseIndex(index) {
282
+ const summary = {
283
+ repo: index.repo,
284
+ root: index.root,
285
+ files: index.files === undefined ? [] : [...index.files],
286
+ created_at: index.created_at,
287
+ updated_at: index.updated_at,
288
+ symbol_count: index.symbol_count,
289
+ file_count: index.file_count,
290
+ };
291
+ if (index.extractor_version !== undefined)
292
+ summary.extractor_version = index.extractor_version;
293
+ if (index.workspaces !== undefined)
294
+ summary.workspaces = [...index.workspaces];
295
+ // `files` is required on CodeIndex, so the guard above is unreachable through the typed path —
296
+ // but this projects objects that also arrive from JSON on disk, where nothing enforces the type,
297
+ // and the cache-hit call site sits outside its caller's try/catch. A throw there would surface as
298
+ // a crash on a status call, which is a worse answer than an empty file list.
299
+ if (index.lossy_migration === true)
300
+ summary.lossy_migration = true;
301
+ return summary;
302
+ }
303
+ /** Backend-agnostic read, without version enforcement. */
304
+ async function readIndex(indexPath) {
305
+ if ((await resolveIndexBackend()) === "sqlite") {
306
+ const dbPath = sqlitePathFor(indexPath);
307
+ await ensureSqliteMigrated(indexPath, dbPath);
308
+ const dataVersion = await getDataVersion(dbPath);
309
+ const cached = indexCache.get(dbPath);
310
+ if (cached && cached.dataVersion === dataVersion) {
311
+ // Re-insert on HIT too, or the eviction order is FIFO-by-first-load rather than LRU:
312
+ // the hottest repo would be evicted the moment an (N+1)th repo is touched, while a
313
+ // repo read once and never again outlives it. That thrashes exactly the working set
314
+ // the cache exists to keep warm.
315
+ cacheIndex(dbPath, cached);
316
+ return copyIndex(cached.index);
31
317
  }
32
- if (currentVersions && !isExtractorVersionCurrent(parsed, currentVersions)) {
318
+ const index = await loadIndexSqlite(dbPath);
319
+ if (!index)
33
320
  return null;
321
+ cacheIndex(dbPath, { index, dataVersion });
322
+ // Copy on the miss path too: returning the freshly-cached object itself would let the
323
+ // very first caller mutate the entry every later reader is about to be handed.
324
+ return copyIndex(index);
325
+ }
326
+ warnIfRollbackIsStale(indexPath);
327
+ return loadJsonIndex(indexPath);
328
+ }
329
+ /**
330
+ * Warn when the JSON backend is serving a snapshot that SQLite has since moved past.
331
+ *
332
+ * The rollback switch keeps the `.json` untouched, which is what makes rolling back possible
333
+ * — and also means that after a repo has run on SQLite for a while, the JSON is a frozen
334
+ * snapshot from migration day. Falling back to it then answers every query from a stale index
335
+ * with no error and no empty result: the shape is valid, the extractor versions still match,
336
+ * it is simply old. That is the worst failure mode we have (confidently wrong), so it gets a
337
+ * loud one-time line rather than silence.
338
+ */
339
+ const staleRollbackWarned = new Set();
340
+ function warnIfRollbackIsStale(indexPath) {
341
+ if (staleRollbackWarned.has(indexPath))
342
+ return;
343
+ try {
344
+ // Mark only once a real comparison happened. Marking up front would permanently silence
345
+ // the warning for a long-lived JSON-pinned process that read this repo before any `.db`
346
+ // existed — precisely the process that most needs telling when one appears later.
347
+ const dbStat = statSync(sqlitePathFor(indexPath));
348
+ const jsonStat = statSync(indexPath);
349
+ staleRollbackWarned.add(indexPath);
350
+ if (dbStat.mtimeMs <= jsonStat.mtimeMs)
351
+ return;
352
+ const ageHours = Math.round((dbStat.mtimeMs - jsonStat.mtimeMs) / 3_600_000);
353
+ console.error(`[codesift] WARNING: reading the legacy JSON index at ${indexPath}, but a SQLite index ` +
354
+ `updated ~${ageHours}h more recently exists alongside it. Every answer from this repo ` +
355
+ `is from the pre-rollback snapshot. Run index_folder to rebuild the JSON index, or ` +
356
+ `unset CODESIFT_INDEX_BACKEND to go back to SQLite.`);
357
+ }
358
+ catch {
359
+ /* no .db, or unreadable — nothing to compare against, so nothing to warn about */
360
+ }
361
+ }
362
+ export function resetStaleRollbackWarningForTesting() {
363
+ staleRollbackWarned.clear();
364
+ }
365
+ /**
366
+ * Codes that genuinely mean "there is no index file here". Everything else that `readFile` can
367
+ * fail with — EISDIR, ENOTDIR, ENAMETOOLONG, ELOOP, platform-specific I/O errors — describes a
368
+ * path that is wrong or unreadable, not a repo that was never indexed. Reporting those as
369
+ * absence is the same misdiagnosis this change exists to remove, one layer down.
370
+ */
371
+ const ABSENCE_CODES = new Set(["ENOENT", "ENOTDIR_PARENT"]);
372
+ function nonAbsenceReadCode(err) {
373
+ const code = typeof err === "object" && err !== null ? err.code : undefined;
374
+ // No recognisable code at all: this is NOT evidence of absence. Only an explicit ENOENT is.
375
+ // Defaulting the unknown case to "nothing indexed here" is how a real fault becomes a
376
+ // confident empty answer — the whole failure mode being removed.
377
+ if (typeof code !== "string")
378
+ return "UNKNOWN_READ_ERROR";
379
+ return ABSENCE_CODES.has(code) ? null : code;
380
+ }
381
+ /**
382
+ * The legacy path, kept intact: it is both the Node 20 backend and the rollback target.
383
+ *
384
+ * ENOENT is absence and stays `null`; a malformed document is also `null` (an invalid index is
385
+ * rebuildable, which is the historical contract). But EACCES/EIO/EBUSY mean the file exists and
386
+ * we simply could not read it — reporting that as "no index" is how a permissions problem gets
387
+ * misdiagnosed as an unindexed repo.
388
+ */
389
+ async function loadJsonIndex(indexPath) {
390
+ let raw;
391
+ try {
392
+ raw = await readFile(indexPath, "utf-8");
393
+ }
394
+ catch (err) {
395
+ const code = classifyStorageError(err) ?? nonAbsenceReadCode(err);
396
+ if (code !== null) {
397
+ throw new IndexStorageError(`index storage at ${indexPath} is unreadable (${code}): ${err instanceof Error ? err.message : String(err)}`, code, indexPath, { cause: err });
34
398
  }
399
+ return null; // ENOENT and friends: nothing indexed here
400
+ }
401
+ try {
402
+ const parsed = JSON.parse(raw);
403
+ if (!isValidIndex(parsed))
404
+ return null;
35
405
  return parsed;
36
406
  }
37
407
  catch {
38
- return null;
408
+ return null; // malformed JSON is a rebuildable index, not a storage fault
39
409
  }
40
410
  }
41
- /** All languages whose stored `extractor_version` entry does not match
42
- * `currentVersions`, applying the same tolerances as `loadIndexOrStale`
43
- * (newly added keys with no files in that language are skipped). */
44
411
  export function collectExtractorVersionMismatches(index, currentVersions) {
45
412
  const stored = index.extractor_version ?? {};
46
413
  const storedKeys = Object.keys(stored);
@@ -96,10 +463,23 @@ export function collectExtractorVersionMismatches(index, currentVersions) {
96
463
  * to `loadIndex(...)` returning null. Callers must still handle null (no
97
464
  * structured error) for those cases. */
98
465
  export async function loadIndexOrStale(indexPath, currentVersions) {
466
+ let parsed;
99
467
  try {
100
- const raw = await readFile(indexPath, "utf-8");
101
- const parsed = JSON.parse(raw);
102
- if (!isValidIndex(parsed))
468
+ parsed = await readIndex(indexPath);
469
+ }
470
+ catch (err) {
471
+ const code = classifyStorageError(err);
472
+ if (code === null)
473
+ throw err;
474
+ return {
475
+ status: "unreadable",
476
+ reason: "storage_error",
477
+ code,
478
+ message: err instanceof Error ? err.message : String(err),
479
+ };
480
+ }
481
+ try {
482
+ if (!parsed)
103
483
  return null;
104
484
  const mismatches = collectExtractorVersionMismatches(parsed, currentVersions);
105
485
  if (mismatches.length > 0) {
@@ -241,6 +621,15 @@ function enqueueIndexMutation(indexPath, missing, apply) {
241
621
  * Serialized per indexPath to prevent read-modify-write races.
242
622
  */
243
623
  export async function saveIncremental(indexPath, updatedFile, newSymbols, fileEntry) {
624
+ if ((await resolveIndexBackend()) === "sqlite") {
625
+ const dbPath = sqlitePathFor(indexPath);
626
+ await ensureSqliteMigrated(indexPath, dbPath);
627
+ // No mutation batching here on purpose: batching exists to amortise a whole-blob
628
+ // rewrite, and this backend writes one file's rows inside a transaction instead.
629
+ await saveIncrementalSqlite(dbPath, updatedFile, newSymbols, fileEntry);
630
+ invalidateIndexCache(dbPath);
631
+ return;
632
+ }
244
633
  return enqueueIndexMutation(indexPath, "throw", (existing) => {
245
634
  const filtered = existing.symbols.filter((symbol) => symbol.file !== updatedFile);
246
635
  const merged = [...filtered, ...newSymbols];
@@ -261,6 +650,13 @@ export async function saveIncremental(indexPath, updatedFile, newSymbols, fileEn
261
650
  * Serialized per indexPath to prevent read-modify-write races.
262
651
  */
263
652
  export async function removeFileFromIndex(indexPath, deletedFile) {
653
+ if ((await resolveIndexBackend()) === "sqlite") {
654
+ const dbPath = sqlitePathFor(indexPath);
655
+ await ensureSqliteMigrated(indexPath, dbPath);
656
+ await removeFileFromIndexSqlite(dbPath, deletedFile);
657
+ invalidateIndexCache(dbPath);
658
+ return;
659
+ }
264
660
  return enqueueIndexMutation(indexPath, "skip", (existing) => {
265
661
  const hadSymbols = existing.symbols.some((s) => s.file === deletedFile);
266
662
  const hadFile = existing.files.some((f) => f.path === deletedFile);
@@ -1 +1 @@
1
- {"version":3,"file":"index-store.js","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-store.js","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGtD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAa1E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AA2BD;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAG1B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAGrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,GACjG,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAAC,CA6C1D;AA+BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQpD"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGtD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAa1E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AA2BD;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAG1B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAGrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,GACjG,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAAC,CA6C1D;AA+BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASpD"}
@@ -1,5 +1,5 @@
1
1
  import { readFile } from "node:fs/promises";
2
- import { readFileSync, existsSync } from "node:fs";
2
+ import { readFileSync, existsSync, statSync } from "node:fs";
3
3
  import { basename, isAbsolute, join, resolve, sep } from "node:path";
4
4
  import { atomicWriteFile } from "./_shared.js";
5
5
  /**
@@ -215,6 +215,17 @@ function isAncestorOrEqual(ancestor, descendant) {
215
215
  * through silently to the next step — derivation must never throw.
216
216
  */
217
217
  export function getRepoName(repoRoot) {
218
+ const worktree = linkedWorktree(repoRoot);
219
+ // Base name from the MAIN checkout, not from the worktree: a linked worktree has no
220
+ // `.git/config` of its own (the config lives in the main repo), so deriving locally would fall
221
+ // through to the worktree's own basename and every worktree of one repo would get an unrelated
222
+ // name. Taking the base from the main checkout keeps them grouped under one prefix and differing
223
+ // only by the suffix — which is what makes the set readable in `list_repos`.
224
+ if (worktree)
225
+ return `${baseRepoName(worktree.mainRoot)}@${worktree.name}`;
226
+ return baseRepoName(repoRoot);
227
+ }
228
+ function baseRepoName(repoRoot) {
218
229
  const override = readNameOverride(repoRoot);
219
230
  if (override)
220
231
  return override;
@@ -223,6 +234,58 @@ export function getRepoName(repoRoot) {
223
234
  return `local/${fromGit}`;
224
235
  return `local/${basename(repoRoot)}`;
225
236
  }
237
+ /**
238
+ * The git worktree identifier when `repoRoot` is a LINKED worktree, else null.
239
+ *
240
+ * Every one of the three name sources above collapses a repo's worktrees onto a single name, and
241
+ * the registry is keyed by name — so the last one indexed silently evicts the rest. Measured on
242
+ * this machine: `tgm-survey-platform` has **36 worktrees**, all carrying the same TRACKED
243
+ * `.codesift.json` (`{"name":"tgm-survey-platform"}`), so 35 registry entries were being
244
+ * overwritten. The override file is documented as the escape hatch FOR collisions; committing it
245
+ * makes it the cause of one, because git checks it out into every worktree.
246
+ *
247
+ * `git remote.origin.url` collapses them for the same reason (worktrees share the remote), and
248
+ * even the basename fallback collides whenever two worktrees are named alike under different
249
+ * parents.
250
+ *
251
+ * This is the H19 hazard as a persistent condition rather than a transient one: an agent working
252
+ * in one worktree resolves the repo by name and gets whichever tree registered last. Disambiguating
253
+ * here fixes all three sources at once, because it is applied to the result rather than to any of
254
+ * them.
255
+ *
256
+ * Detection is the presence of a `.git` FILE (linked worktrees get a file containing
257
+ * `gitdir: …/.git/worktrees/<name>`; a main checkout gets a directory). The trailing segment is
258
+ * git's own worktree name, which git already guarantees unique within the repository — safer than
259
+ * the directory basename, which is not.
260
+ */
261
+ function linkedWorktree(repoRoot) {
262
+ const dotGit = join(repoRoot, ".git");
263
+ try {
264
+ if (!statSync(dotGit).isFile())
265
+ return null; // main checkout, or no git at all
266
+ const pointer = readFileSync(dotGit, "utf-8").trim();
267
+ const match = pointer.match(/^gitdir:\s*(.+)$/m);
268
+ if (!match?.[1])
269
+ return null;
270
+ const raw = match[1].trim().replace(/[/\\]+$/, "");
271
+ // `gitdir:` is normally absolute but git permits a relative pointer.
272
+ const gitdir = isAbsolute(raw) ? raw : resolve(repoRoot, raw);
273
+ // Only a worktree pointer qualifies. Submodules also use a `.git` file, and their gitdir
274
+ // points at `…/.git/modules/<name>` — a submodule is a different repository with its own
275
+ // remote, so it already gets a distinct name and must not be suffixed onto its parent's.
276
+ const split = gitdir.split(/[/\\]\.git[/\\]worktrees[/\\]/);
277
+ if (split.length !== 2)
278
+ return null;
279
+ const mainRoot = split[0];
280
+ const name = split[1]?.split(/[/\\]/)[0];
281
+ if (!mainRoot || !name)
282
+ return null;
283
+ return { name, mainRoot };
284
+ }
285
+ catch {
286
+ return null; // derivation must never throw
287
+ }
288
+ }
226
289
  function readNameOverride(repoRoot) {
227
290
  const overridePath = join(repoRoot, ".codesift.json");
228
291
  if (!existsSync(overridePath))