@wrongstack/tools 0.296.2 → 0.296.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ts-parser.d.ts","sourceRoot":"","sources":["../../src/codebase-index/ts-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,WAAW,EAA0C,UAAU,EAAE,MAAM,aAAa,CAAC;AA+HnG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2G3E;AA+BD,6EAA6E;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"ts-parser.d.ts","sourceRoot":"","sources":["../../src/codebase-index/ts-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,WAAW,EAA0C,UAAU,EAAE,MAAM,aAAa,CAAC;AAmInG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAyH3E;AA+GD,6EAA6E;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
@@ -252,11 +252,18 @@ async function parseSymbols(opts) {
252
252
  } else if (ts.isHeritageClause(node)) {
253
253
  for (const t of node.types) {
254
254
  const name = getTypeName(t.expression);
255
- if (name) refs.push({ fromId: 0, toName: name, callType: node.token === ts.SyntaxKind.ExtendsKeyword ? "inherit" : "implement", line: lineNum });
255
+ if (name)
256
+ refs.push({
257
+ fromId: 0,
258
+ toName: name,
259
+ callType: node.token === ts.SyntaxKind.ExtendsKeyword ? "inherit" : "implement",
260
+ line: lineNum
261
+ });
256
262
  }
257
263
  } else if (ts.isImportDeclaration(node)) {
258
- const moduleName = getModuleName(node);
259
- if (moduleName) refs.push({ fromId: 0, toName: moduleName, callType: "import", line: lineNum });
264
+ emitImportSpecifierRefs(node, refs, lineNum);
265
+ } else if (ts.isExportDeclaration(node) && node.moduleSpecifier) {
266
+ emitExportSpecifierRefs(node, refs, lineNum);
260
267
  }
261
268
  const scopeIdx = scopeParts.length;
262
269
  pushScopeName(node, scopeParts);
@@ -272,11 +279,6 @@ function getTypeName(name) {
272
279
  if (ts.isQualifiedName(name)) return `${getTypeName(name.left)}.${name.right.text}`;
273
280
  return "";
274
281
  }
275
- function getModuleName(node) {
276
- const moduleSpecifier = node.moduleSpecifier;
277
- if (ts.isStringLiteral(moduleSpecifier)) return moduleSpecifier.text;
278
- return "";
279
- }
280
282
  function deduplicateRefs(refs) {
281
283
  const seen = /* @__PURE__ */ new Set();
282
284
  return refs.filter((r) => {
@@ -286,6 +288,44 @@ function deduplicateRefs(refs) {
286
288
  return true;
287
289
  });
288
290
  }
291
+ function getImportSpecifierName(spec) {
292
+ return spec.propertyName?.text ?? spec.name.text;
293
+ }
294
+ function emitImportSpecifierRefs(node, refs, lineNum) {
295
+ const clause = node.importClause;
296
+ if (!clause) return;
297
+ if (clause.name) {
298
+ refs.push({ fromId: 0, toName: clause.name.text, callType: "import", line: lineNum });
299
+ }
300
+ const bindings = clause.namedBindings;
301
+ if (!bindings) return;
302
+ if (ts.isNamedImports(bindings)) {
303
+ for (const element of bindings.elements) {
304
+ refs.push({
305
+ fromId: 0,
306
+ toName: getImportSpecifierName(element),
307
+ callType: "import",
308
+ line: lineNum
309
+ });
310
+ }
311
+ } else if (ts.isNamespaceImport(bindings)) {
312
+ refs.push({ fromId: 0, toName: bindings.name.text, callType: "import", line: lineNum });
313
+ }
314
+ }
315
+ function emitExportSpecifierRefs(node, refs, lineNum) {
316
+ const clause = node.exportClause;
317
+ if (clause && ts.isNamespaceExport(clause)) {
318
+ refs.push({ fromId: 0, toName: clause.name.text, callType: "import", line: lineNum });
319
+ return;
320
+ }
321
+ if (clause && ts.isNamedExports(clause)) {
322
+ for (const element of clause.elements) {
323
+ const originalName = element.propertyName?.text ?? element.name.text;
324
+ refs.push({ fromId: 0, toName: originalName, callType: "import", line: lineNum });
325
+ }
326
+ return;
327
+ }
328
+ }
289
329
  var ts, tsLoad, kindMapCache;
290
330
  var init_ts_parser = __esm({
291
331
  "src/codebase-index/ts-parser.ts"() {
@@ -2042,42 +2082,6 @@ import { expectDefined as expectDefined4 } from "@wrongstack/core/utils";
2042
2082
  import * as fs7 from "node:fs";
2043
2083
  import * as path10 from "node:path";
2044
2084
 
2045
- // src/codebase-index/schema.ts
2046
- var SCHEMA_VERSION = 3;
2047
-
2048
- // src/codebase-index/lsp-kind.ts
2049
- function lspKindToInternalKind(k) {
2050
- switch (k) {
2051
- case 5 /* Class */:
2052
- return "class";
2053
- case 6 /* Method */:
2054
- return "method";
2055
- case 7 /* Property */:
2056
- case 8 /* Field */:
2057
- return "property";
2058
- case 9 /* Constructor */:
2059
- return "class";
2060
- case 10 /* Enum */:
2061
- return "enum";
2062
- case 11 /* Interface */:
2063
- return "interface";
2064
- case 12 /* Function */:
2065
- return "function";
2066
- case 13 /* Variable */:
2067
- return "var";
2068
- case 14 /* Constant */:
2069
- return "const";
2070
- case 22 /* EnumMember */:
2071
- return "enum";
2072
- case 26 /* TypeParameter */:
2073
- return "type";
2074
- case 3 /* Namespace */:
2075
- return "namespace";
2076
- default:
2077
- return null;
2078
- }
2079
- }
2080
-
2081
2085
  // src/codebase-index/bm25.ts
2082
2086
  var K1 = 1.5;
2083
2087
  var B = 0.75;
@@ -2167,6 +2171,42 @@ var Bm25Index = class {
2167
2171
  }
2168
2172
  };
2169
2173
 
2174
+ // src/codebase-index/lsp-kind.ts
2175
+ function lspKindToInternalKind(k) {
2176
+ switch (k) {
2177
+ case 5 /* Class */:
2178
+ return "class";
2179
+ case 6 /* Method */:
2180
+ return "method";
2181
+ case 7 /* Property */:
2182
+ case 8 /* Field */:
2183
+ return "property";
2184
+ case 9 /* Constructor */:
2185
+ return "class";
2186
+ case 10 /* Enum */:
2187
+ return "enum";
2188
+ case 11 /* Interface */:
2189
+ return "interface";
2190
+ case 12 /* Function */:
2191
+ return "function";
2192
+ case 13 /* Variable */:
2193
+ return "var";
2194
+ case 14 /* Constant */:
2195
+ return "const";
2196
+ case 22 /* EnumMember */:
2197
+ return "enum";
2198
+ case 26 /* TypeParameter */:
2199
+ return "type";
2200
+ case 3 /* Namespace */:
2201
+ return "namespace";
2202
+ default:
2203
+ return null;
2204
+ }
2205
+ }
2206
+
2207
+ // src/codebase-index/schema.ts
2208
+ var SCHEMA_VERSION = 3;
2209
+
2170
2210
  // src/codebase-index/sqlite-runtime.ts
2171
2211
  import { createRequire } from "node:module";
2172
2212
  import { toErrorMessage } from "@wrongstack/core/utils";
@@ -2310,92 +2350,6 @@ function runSqliteWithRetry(fn) {
2310
2350
  throw lastError;
2311
2351
  }
2312
2352
 
2313
- // src/codebase-index/writer-helpers.ts
2314
- import { resolveWstackPaths } from "@wrongstack/core/utils";
2315
- function escapeLike(value) {
2316
- return value.replace(/[\\%_]/g, (char) => `\\${char}`);
2317
- }
2318
- function assignRefsToSymbols(refs, symbols) {
2319
- if (refs.length === 0 || symbols.length === 0) return [];
2320
- const ordered = [...symbols].sort((a, b) => a.line - b.line || a.col - b.col || a.id - b.id);
2321
- const seen = /* @__PURE__ */ new Set();
2322
- const assigned = [];
2323
- for (const ref of refs) {
2324
- let owner;
2325
- for (const symbol of ordered) {
2326
- if (symbol.line > ref.line) break;
2327
- owner = symbol;
2328
- }
2329
- if (!owner && ref.callType === "import") owner = ordered[0];
2330
- if (!owner || owner.id <= 0) continue;
2331
- const key = `${owner.id}:${ref.toName}:${ref.callType}`;
2332
- if (seen.has(key)) continue;
2333
- seen.add(key);
2334
- assigned.push({ ...ref, fromId: owner.id });
2335
- }
2336
- return assigned;
2337
- }
2338
- function resolveIndexDir(projectRoot, override) {
2339
- return override ?? resolveWstackPaths({ projectRoot }).projectCodebaseIndex;
2340
- }
2341
-
2342
- // src/codebase-index/writer-schema.ts
2343
- var METADATA_TABLE_SQL = `
2344
- CREATE TABLE IF NOT EXISTS metadata (
2345
- key TEXT PRIMARY KEY,
2346
- value TEXT NOT NULL
2347
- );
2348
- `;
2349
- var CORE_TABLES_SQL = `
2350
- CREATE TABLE IF NOT EXISTS files (
2351
- file TEXT PRIMARY KEY,
2352
- lang TEXT NOT NULL,
2353
- mtime_ms INTEGER NOT NULL,
2354
- symbol_count INTEGER NOT NULL DEFAULT 0,
2355
- last_indexed INTEGER NOT NULL
2356
- );
2357
- CREATE TABLE IF NOT EXISTS symbols (
2358
- id INTEGER PRIMARY KEY,
2359
- lang TEXT NOT NULL,
2360
- kind TEXT NOT NULL,
2361
- name TEXT NOT NULL,
2362
- file TEXT NOT NULL,
2363
- line INTEGER NOT NULL,
2364
- col INTEGER NOT NULL,
2365
- signature TEXT NOT NULL DEFAULT '',
2366
- doc_comment TEXT NOT NULL DEFAULT '',
2367
- scope TEXT NOT NULL DEFAULT '',
2368
- text TEXT NOT NULL DEFAULT '',
2369
- file_fk TEXT NOT NULL
2370
- );
2371
- `;
2372
- var SYMBOL_INDEX_SQL = [
2373
- "CREATE INDEX IF NOT EXISTS idx_s_name ON symbols(name)",
2374
- "CREATE INDEX IF NOT EXISTS idx_s_kind ON symbols(kind)",
2375
- "CREATE INDEX IF NOT EXISTS idx_s_lang ON symbols(lang)",
2376
- "CREATE INDEX IF NOT EXISTS idx_s_file ON symbols(file)",
2377
- "CREATE INDEX IF NOT EXISTS idx_s_lang_kind ON symbols(lang, kind)",
2378
- "CREATE INDEX IF NOT EXISTS idx_s_file_fk ON symbols(file_fk)",
2379
- "CREATE INDEX IF NOT EXISTS idx_s_name_id ON symbols(name, id)"
2380
- ];
2381
- var REFS_TABLE_SQL = `
2382
- CREATE TABLE IF NOT EXISTS refs (
2383
- id INTEGER PRIMARY KEY,
2384
- from_id INTEGER NOT NULL,
2385
- to_name TEXT NOT NULL,
2386
- to_id INTEGER,
2387
- call_type TEXT NOT NULL,
2388
- line INTEGER NOT NULL
2389
- );
2390
- `;
2391
- var REFS_INDEX_SQL = [
2392
- "CREATE INDEX IF NOT EXISTS idx_r_from ON refs(from_id)",
2393
- "CREATE INDEX IF NOT EXISTS idx_r_to_id ON refs(to_id)",
2394
- "CREATE INDEX IF NOT EXISTS idx_r_to_name ON refs(to_name)",
2395
- "CREATE INDEX IF NOT EXISTS idx_r_call_type ON refs(call_type)"
2396
- ];
2397
- var SYMBOLS_FTS_SQL = "CREATE VIRTUAL TABLE IF NOT EXISTS symbols_fts USING fts5(text, tokenize = 'unicode61')";
2398
-
2399
2353
  // src/codebase-index/writer-admin.ts
2400
2354
  import * as fs6 from "node:fs";
2401
2355
  import * as path8 from "node:path";
@@ -2868,6 +2822,35 @@ function getSymbolGraphWithStatement(stmt, fileFilter) {
2868
2822
  return { nodes, edges };
2869
2823
  }
2870
2824
 
2825
+ // src/codebase-index/writer-helpers.ts
2826
+ import { resolveWstackPaths } from "@wrongstack/core/utils";
2827
+ function escapeLike(value) {
2828
+ return value.replace(/[\\%_]/g, (char) => `\\${char}`);
2829
+ }
2830
+ function assignRefsToSymbols(refs, symbols) {
2831
+ if (refs.length === 0 || symbols.length === 0) return [];
2832
+ const ordered = [...symbols].sort((a, b) => a.line - b.line || a.col - b.col || a.id - b.id);
2833
+ const seen = /* @__PURE__ */ new Set();
2834
+ const assigned = [];
2835
+ for (const ref of refs) {
2836
+ let owner;
2837
+ for (const symbol of ordered) {
2838
+ if (symbol.line > ref.line) break;
2839
+ owner = symbol;
2840
+ }
2841
+ if (!owner && ref.callType === "import") owner = ordered[0];
2842
+ if (!owner || owner.id <= 0) continue;
2843
+ const key = `${owner.id}:${ref.toName}:${ref.callType}`;
2844
+ if (seen.has(key)) continue;
2845
+ seen.add(key);
2846
+ assigned.push({ ...ref, fromId: owner.id });
2847
+ }
2848
+ return assigned;
2849
+ }
2850
+ function resolveIndexDir(projectRoot, override) {
2851
+ return override ?? resolveWstackPaths({ projectRoot }).projectCodebaseIndex;
2852
+ }
2853
+
2871
2854
  // src/codebase-index/writer-pragmas.ts
2872
2855
  import { sqliteCachePragmas } from "@wrongstack/core/utils";
2873
2856
  function applyIndexStorePragmas(db) {
@@ -2886,6 +2869,63 @@ function applyIndexStorePragmas(db) {
2886
2869
  }
2887
2870
  }
2888
2871
 
2872
+ // src/codebase-index/writer-schema.ts
2873
+ var METADATA_TABLE_SQL = `
2874
+ CREATE TABLE IF NOT EXISTS metadata (
2875
+ key TEXT PRIMARY KEY,
2876
+ value TEXT NOT NULL
2877
+ );
2878
+ `;
2879
+ var CORE_TABLES_SQL = `
2880
+ CREATE TABLE IF NOT EXISTS files (
2881
+ file TEXT PRIMARY KEY,
2882
+ lang TEXT NOT NULL,
2883
+ mtime_ms INTEGER NOT NULL,
2884
+ symbol_count INTEGER NOT NULL DEFAULT 0,
2885
+ last_indexed INTEGER NOT NULL
2886
+ );
2887
+ CREATE TABLE IF NOT EXISTS symbols (
2888
+ id INTEGER PRIMARY KEY,
2889
+ lang TEXT NOT NULL,
2890
+ kind TEXT NOT NULL,
2891
+ name TEXT NOT NULL,
2892
+ file TEXT NOT NULL,
2893
+ line INTEGER NOT NULL,
2894
+ col INTEGER NOT NULL,
2895
+ signature TEXT NOT NULL DEFAULT '',
2896
+ doc_comment TEXT NOT NULL DEFAULT '',
2897
+ scope TEXT NOT NULL DEFAULT '',
2898
+ text TEXT NOT NULL DEFAULT '',
2899
+ file_fk TEXT NOT NULL
2900
+ );
2901
+ `;
2902
+ var SYMBOL_INDEX_SQL = [
2903
+ "CREATE INDEX IF NOT EXISTS idx_s_name ON symbols(name)",
2904
+ "CREATE INDEX IF NOT EXISTS idx_s_kind ON symbols(kind)",
2905
+ "CREATE INDEX IF NOT EXISTS idx_s_lang ON symbols(lang)",
2906
+ "CREATE INDEX IF NOT EXISTS idx_s_file ON symbols(file)",
2907
+ "CREATE INDEX IF NOT EXISTS idx_s_lang_kind ON symbols(lang, kind)",
2908
+ "CREATE INDEX IF NOT EXISTS idx_s_file_fk ON symbols(file_fk)",
2909
+ "CREATE INDEX IF NOT EXISTS idx_s_name_id ON symbols(name, id)"
2910
+ ];
2911
+ var REFS_TABLE_SQL = `
2912
+ CREATE TABLE IF NOT EXISTS refs (
2913
+ id INTEGER PRIMARY KEY,
2914
+ from_id INTEGER NOT NULL,
2915
+ to_name TEXT NOT NULL,
2916
+ to_id INTEGER,
2917
+ call_type TEXT NOT NULL,
2918
+ line INTEGER NOT NULL
2919
+ );
2920
+ `;
2921
+ var REFS_INDEX_SQL = [
2922
+ "CREATE INDEX IF NOT EXISTS idx_r_from ON refs(from_id)",
2923
+ "CREATE INDEX IF NOT EXISTS idx_r_to_id ON refs(to_id)",
2924
+ "CREATE INDEX IF NOT EXISTS idx_r_to_name ON refs(to_name)",
2925
+ "CREATE INDEX IF NOT EXISTS idx_r_call_type ON refs(call_type)"
2926
+ ];
2927
+ var SYMBOLS_FTS_SQL = "CREATE VIRTUAL TABLE IF NOT EXISTS symbols_fts USING fts5(text, tokenize = 'unicode61')";
2928
+
2889
2929
  // src/codebase-index/writer-search-helpers.ts
2890
2930
  function normalizeSearchLimit(limit) {
2891
2931
  return typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.trunc(limit)) : void 0;
@@ -3094,9 +3134,15 @@ var IndexStore = class _IndexStore {
3094
3134
  DROP TABLE IF EXISTS refs;
3095
3135
  `);
3096
3136
  this.db.exec("DROP TABLE IF EXISTS symbols_fts");
3097
- this.stmt("UPDATE metadata SET value = ? WHERE key = ?").run(String(SCHEMA_VERSION), "version");
3137
+ this.stmt("UPDATE metadata SET value = ? WHERE key = ?").run(
3138
+ String(SCHEMA_VERSION),
3139
+ "version"
3140
+ );
3098
3141
  } else if (storedVersion === null) {
3099
- this.stmt("INSERT INTO metadata(key, value) VALUES (?, ?)").run("version", String(SCHEMA_VERSION));
3142
+ this.stmt("INSERT INTO metadata(key, value) VALUES (?, ?)").run(
3143
+ "version",
3144
+ String(SCHEMA_VERSION)
3145
+ );
3100
3146
  }
3101
3147
  this.db.exec(CORE_TABLES_SQL);
3102
3148
  for (const sql of SYMBOL_INDEX_SQL) this.db.exec(sql);
@@ -3113,7 +3159,9 @@ var IndexStore = class _IndexStore {
3113
3159
  );
3114
3160
  if (symbolCount !== ftsCount) {
3115
3161
  this.db.exec("DELETE FROM symbols_fts");
3116
- const rows = this.stmt("SELECT id, name, signature, doc_comment FROM symbols ORDER BY id").all();
3162
+ const rows = this.stmt(
3163
+ "SELECT id, name, signature, doc_comment FROM symbols ORDER BY id"
3164
+ ).all();
3117
3165
  bulkInsertFtsWithStatement(
3118
3166
  (sql) => this.stmt(sql),
3119
3167
  _IndexStore.MAX_SQL_VARS,
@@ -3335,7 +3383,9 @@ var IndexStore = class _IndexStore {
3335
3383
  const limitSql = limit !== void 0 ? " LIMIT ?" : "";
3336
3384
  const sql = `SELECT id, lang, kind, name, file, line, col, signature, doc_comment, text FROM symbols ${where}${limitSql}`;
3337
3385
  const binds = limit !== void 0 ? [...values, limit] : values;
3338
- const rows = this.stmt(sql).all(...binds);
3386
+ const rows = this.stmt(sql).all(
3387
+ ...binds
3388
+ );
3339
3389
  return rows.map((row) => mapWriterSearchRow(row, filter?.lspKind));
3340
3390
  }
3341
3391
  /** Shared WHERE builder for {@link search} / empty-query ranked totals. */
@@ -3511,7 +3561,9 @@ var IndexStore = class _IndexStore {
3511
3561
  }
3512
3562
  setLastIndexed(ts2) {
3513
3563
  this.runWithRetry(() => {
3514
- this.stmt("INSERT OR REPLACE INTO metadata(key, value) VALUES('last_indexed', ?)").run(String(ts2));
3564
+ this.stmt("INSERT OR REPLACE INTO metadata(key, value) VALUES('last_indexed', ?)").run(
3565
+ String(ts2)
3566
+ );
3515
3567
  });
3516
3568
  }
3517
3569
  getMetadata(key) {
@@ -3622,7 +3674,9 @@ var IndexStore = class _IndexStore {
3622
3674
  this.stmt(
3623
3675
  `DELETE FROM refs WHERE from_id IN (SELECT id FROM symbols WHERE file IN (${placeholders}))`
3624
3676
  ).run(...options.deleteForFiles);
3625
- this.stmt(`DELETE FROM symbols WHERE file IN (${placeholders})`).run(...options.deleteForFiles);
3677
+ this.stmt(`DELETE FROM symbols WHERE file IN (${placeholders})`).run(
3678
+ ...options.deleteForFiles
3679
+ );
3626
3680
  }
3627
3681
  const totalSymbols = entries.reduce((n, e) => n + e.symbols.length, 0);
3628
3682
  let nextId = this.allocateSymbolIds(totalSymbols);
@@ -3666,11 +3720,7 @@ var IndexStore = class _IndexStore {
3666
3720
  this.ftsAvailable,
3667
3721
  ftsRows
3668
3722
  );
3669
- bulkInsertRefsWithStatement(
3670
- (sql) => this.stmt(sql),
3671
- _IndexStore.MAX_SQL_VARS,
3672
- refsToInsert
3673
- );
3723
+ bulkInsertRefsWithStatement((sql) => this.stmt(sql), _IndexStore.MAX_SQL_VARS, refsToInsert);
3674
3724
  const upsertStmt = this.stmt(
3675
3725
  `INSERT INTO files(file, lang, mtime_ms, symbol_count, last_indexed)
3676
3726
  VALUES (?, ?, ?, ?, ?)
@@ -3699,7 +3749,9 @@ var IndexStore = class _IndexStore {
3699
3749
  */
3700
3750
  deleteRefsForFile(file) {
3701
3751
  this.runWithRetry(() => {
3702
- this.stmt("DELETE FROM refs WHERE from_id IN (SELECT id FROM symbols WHERE file = ?)").run(file);
3752
+ this.stmt("DELETE FROM refs WHERE from_id IN (SELECT id FROM symbols WHERE file = ?)").run(
3753
+ file
3754
+ );
3703
3755
  });
3704
3756
  }
3705
3757
  /**
@@ -3854,9 +3906,7 @@ var IndexStore = class _IndexStore {
3854
3906
  * build the full symbol universe for the reachability scan.
3855
3907
  */
3856
3908
  getAllSymbols() {
3857
- return this.stmt(
3858
- "SELECT id, name, file, kind, line FROM symbols ORDER BY id"
3859
- ).all().map((r) => ({ ...r, kind: r.kind }));
3909
+ return this.stmt("SELECT id, name, file, kind, line FROM symbols ORDER BY id").all().map((r) => ({ ...r, kind: r.kind }));
3860
3910
  }
3861
3911
  /**
3862
3912
  * Returns every resolved reference (to_id IS NOT NULL). Used by
@@ -3868,6 +3918,25 @@ var IndexStore = class _IndexStore {
3868
3918
  "SELECT from_id AS fromId, to_id AS toId, call_type AS callType FROM refs WHERE to_id IS NOT NULL"
3869
3919
  ).all();
3870
3920
  }
3921
+ /**
3922
+ * Returns ALL import refs (including unresolved) with their source-file
3923
+ * path and resolved target id. Used by the dead-code scan's file-level
3924
+ * graph traversal to handle barrel-only entry points where no symbol
3925
+ * carries the ref.
3926
+ *
3927
+ * Refs whose `from_id` doesn't match a known symbol (e.g. pure-barrel
3928
+ * files with no declarations) will have `sourceFile === null`.
3929
+ */
3930
+ getAllImportRefs() {
3931
+ return this.stmt(
3932
+ `SELECT s.file AS sourceFile, r.to_name AS toName, r.to_id AS toId,
3933
+ r.call_type AS callType, r.line
3934
+ FROM refs r
3935
+ LEFT JOIN symbols s ON r.from_id = s.id
3936
+ WHERE r.call_type = 'import'
3937
+ ORDER BY r.line`
3938
+ ).all();
3939
+ }
3871
3940
  close() {
3872
3941
  this.stmtCache.clear();
3873
3942
  this.bm25Dirty = true;