@jafreck/lore 0.1.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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +405 -0
  3. package/dist/cli.d.ts +19 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +345 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +22 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +16 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/indexer/call-graph.d.ts +39 -0
  12. package/dist/indexer/call-graph.d.ts.map +1 -0
  13. package/dist/indexer/call-graph.js +193 -0
  14. package/dist/indexer/call-graph.js.map +1 -0
  15. package/dist/indexer/complexity.d.ts +9 -0
  16. package/dist/indexer/complexity.d.ts.map +1 -0
  17. package/dist/indexer/complexity.js +66 -0
  18. package/dist/indexer/complexity.js.map +1 -0
  19. package/dist/indexer/config-parser.d.ts +16 -0
  20. package/dist/indexer/config-parser.d.ts.map +1 -0
  21. package/dist/indexer/config-parser.js +261 -0
  22. package/dist/indexer/config-parser.js.map +1 -0
  23. package/dist/indexer/coverage.d.ts +13 -0
  24. package/dist/indexer/coverage.d.ts.map +1 -0
  25. package/dist/indexer/coverage.js +84 -0
  26. package/dist/indexer/coverage.js.map +1 -0
  27. package/dist/indexer/db.d.ts +38 -0
  28. package/dist/indexer/db.d.ts.map +1 -0
  29. package/dist/indexer/db.js +275 -0
  30. package/dist/indexer/db.js.map +1 -0
  31. package/dist/indexer/embedder.d.ts +70 -0
  32. package/dist/indexer/embedder.d.ts.map +1 -0
  33. package/dist/indexer/embedder.js +186 -0
  34. package/dist/indexer/embedder.js.map +1 -0
  35. package/dist/indexer/ensure-python-deps.d.ts +22 -0
  36. package/dist/indexer/ensure-python-deps.d.ts.map +1 -0
  37. package/dist/indexer/ensure-python-deps.js +47 -0
  38. package/dist/indexer/ensure-python-deps.js.map +1 -0
  39. package/dist/indexer/extractors/bash.d.ts +12 -0
  40. package/dist/indexer/extractors/bash.d.ts.map +1 -0
  41. package/dist/indexer/extractors/bash.js +57 -0
  42. package/dist/indexer/extractors/bash.js.map +1 -0
  43. package/dist/indexer/extractors/c.d.ts +12 -0
  44. package/dist/indexer/extractors/c.d.ts.map +1 -0
  45. package/dist/indexer/extractors/c.js +106 -0
  46. package/dist/indexer/extractors/c.js.map +1 -0
  47. package/dist/indexer/extractors/cpp.d.ts +12 -0
  48. package/dist/indexer/extractors/cpp.d.ts.map +1 -0
  49. package/dist/indexer/extractors/cpp.js +84 -0
  50. package/dist/indexer/extractors/cpp.js.map +1 -0
  51. package/dist/indexer/extractors/csharp.d.ts +12 -0
  52. package/dist/indexer/extractors/csharp.d.ts.map +1 -0
  53. package/dist/indexer/extractors/csharp.js +79 -0
  54. package/dist/indexer/extractors/csharp.js.map +1 -0
  55. package/dist/indexer/extractors/dart.d.ts +12 -0
  56. package/dist/indexer/extractors/dart.d.ts.map +1 -0
  57. package/dist/indexer/extractors/dart.js +80 -0
  58. package/dist/indexer/extractors/dart.js.map +1 -0
  59. package/dist/indexer/extractors/elixir.d.ts +12 -0
  60. package/dist/indexer/extractors/elixir.d.ts.map +1 -0
  61. package/dist/indexer/extractors/elixir.js +87 -0
  62. package/dist/indexer/extractors/elixir.js.map +1 -0
  63. package/dist/indexer/extractors/elm.d.ts +12 -0
  64. package/dist/indexer/extractors/elm.d.ts.map +1 -0
  65. package/dist/indexer/extractors/elm.js +87 -0
  66. package/dist/indexer/extractors/elm.js.map +1 -0
  67. package/dist/indexer/extractors/go.d.ts +12 -0
  68. package/dist/indexer/extractors/go.d.ts.map +1 -0
  69. package/dist/indexer/extractors/go.js +158 -0
  70. package/dist/indexer/extractors/go.js.map +1 -0
  71. package/dist/indexer/extractors/haskell.d.ts +12 -0
  72. package/dist/indexer/extractors/haskell.d.ts.map +1 -0
  73. package/dist/indexer/extractors/haskell.js +104 -0
  74. package/dist/indexer/extractors/haskell.js.map +1 -0
  75. package/dist/indexer/extractors/java.d.ts +12 -0
  76. package/dist/indexer/extractors/java.d.ts.map +1 -0
  77. package/dist/indexer/extractors/java.js +68 -0
  78. package/dist/indexer/extractors/java.js.map +1 -0
  79. package/dist/indexer/extractors/javascript.d.ts +13 -0
  80. package/dist/indexer/extractors/javascript.d.ts.map +1 -0
  81. package/dist/indexer/extractors/javascript.js +180 -0
  82. package/dist/indexer/extractors/javascript.js.map +1 -0
  83. package/dist/indexer/extractors/julia.d.ts +12 -0
  84. package/dist/indexer/extractors/julia.d.ts.map +1 -0
  85. package/dist/indexer/extractors/julia.js +94 -0
  86. package/dist/indexer/extractors/julia.js.map +1 -0
  87. package/dist/indexer/extractors/kotlin.d.ts +12 -0
  88. package/dist/indexer/extractors/kotlin.d.ts.map +1 -0
  89. package/dist/indexer/extractors/kotlin.js +71 -0
  90. package/dist/indexer/extractors/kotlin.js.map +1 -0
  91. package/dist/indexer/extractors/lua.d.ts +12 -0
  92. package/dist/indexer/extractors/lua.d.ts.map +1 -0
  93. package/dist/indexer/extractors/lua.js +68 -0
  94. package/dist/indexer/extractors/lua.js.map +1 -0
  95. package/dist/indexer/extractors/objc.d.ts +12 -0
  96. package/dist/indexer/extractors/objc.d.ts.map +1 -0
  97. package/dist/indexer/extractors/objc.js +129 -0
  98. package/dist/indexer/extractors/objc.js.map +1 -0
  99. package/dist/indexer/extractors/ocaml.d.ts +12 -0
  100. package/dist/indexer/extractors/ocaml.d.ts.map +1 -0
  101. package/dist/indexer/extractors/ocaml.js +92 -0
  102. package/dist/indexer/extractors/ocaml.js.map +1 -0
  103. package/dist/indexer/extractors/php.d.ts +12 -0
  104. package/dist/indexer/extractors/php.d.ts.map +1 -0
  105. package/dist/indexer/extractors/php.js +99 -0
  106. package/dist/indexer/extractors/php.js.map +1 -0
  107. package/dist/indexer/extractors/python.d.ts +12 -0
  108. package/dist/indexer/extractors/python.d.ts.map +1 -0
  109. package/dist/indexer/extractors/python.js +129 -0
  110. package/dist/indexer/extractors/python.js.map +1 -0
  111. package/dist/indexer/extractors/ruby.d.ts +12 -0
  112. package/dist/indexer/extractors/ruby.d.ts.map +1 -0
  113. package/dist/indexer/extractors/ruby.js +100 -0
  114. package/dist/indexer/extractors/ruby.js.map +1 -0
  115. package/dist/indexer/extractors/rust.d.ts +12 -0
  116. package/dist/indexer/extractors/rust.d.ts.map +1 -0
  117. package/dist/indexer/extractors/rust.js +82 -0
  118. package/dist/indexer/extractors/rust.js.map +1 -0
  119. package/dist/indexer/extractors/scala.d.ts +12 -0
  120. package/dist/indexer/extractors/scala.d.ts.map +1 -0
  121. package/dist/indexer/extractors/scala.js +91 -0
  122. package/dist/indexer/extractors/scala.js.map +1 -0
  123. package/dist/indexer/extractors/swift.d.ts +12 -0
  124. package/dist/indexer/extractors/swift.d.ts.map +1 -0
  125. package/dist/indexer/extractors/swift.js +90 -0
  126. package/dist/indexer/extractors/swift.js.map +1 -0
  127. package/dist/indexer/extractors/types.d.ts +118 -0
  128. package/dist/indexer/extractors/types.d.ts.map +1 -0
  129. package/dist/indexer/extractors/types.js +43 -0
  130. package/dist/indexer/extractors/types.js.map +1 -0
  131. package/dist/indexer/extractors/typescript.d.ts +14 -0
  132. package/dist/indexer/extractors/typescript.d.ts.map +1 -0
  133. package/dist/indexer/extractors/typescript.js +172 -0
  134. package/dist/indexer/extractors/typescript.js.map +1 -0
  135. package/dist/indexer/extractors/zig.d.ts +12 -0
  136. package/dist/indexer/extractors/zig.d.ts.map +1 -0
  137. package/dist/indexer/extractors/zig.js +95 -0
  138. package/dist/indexer/extractors/zig.js.map +1 -0
  139. package/dist/indexer/git-history.d.ts +23 -0
  140. package/dist/indexer/git-history.d.ts.map +1 -0
  141. package/dist/indexer/git-history.js +144 -0
  142. package/dist/indexer/git-history.js.map +1 -0
  143. package/dist/indexer/git-hooks.d.ts +19 -0
  144. package/dist/indexer/git-hooks.d.ts.map +1 -0
  145. package/dist/indexer/git-hooks.js +74 -0
  146. package/dist/indexer/git-hooks.js.map +1 -0
  147. package/dist/indexer/index.d.ts +83 -0
  148. package/dist/indexer/index.d.ts.map +1 -0
  149. package/dist/indexer/index.js +431 -0
  150. package/dist/indexer/index.js.map +1 -0
  151. package/dist/indexer/parser.d.ts +30 -0
  152. package/dist/indexer/parser.d.ts.map +1 -0
  153. package/dist/indexer/parser.js +114 -0
  154. package/dist/indexer/parser.js.map +1 -0
  155. package/dist/indexer/poller.d.ts +50 -0
  156. package/dist/indexer/poller.d.ts.map +1 -0
  157. package/dist/indexer/poller.js +140 -0
  158. package/dist/indexer/poller.js.map +1 -0
  159. package/dist/indexer/resolver.d.ts +52 -0
  160. package/dist/indexer/resolver.d.ts.map +1 -0
  161. package/dist/indexer/resolver.js +271 -0
  162. package/dist/indexer/resolver.js.map +1 -0
  163. package/dist/indexer/test-mapper.d.ts +6 -0
  164. package/dist/indexer/test-mapper.d.ts.map +1 -0
  165. package/dist/indexer/test-mapper.js +48 -0
  166. package/dist/indexer/test-mapper.js.map +1 -0
  167. package/dist/indexer/walker.d.ts +51 -0
  168. package/dist/indexer/walker.d.ts.map +1 -0
  169. package/dist/indexer/walker.js +100 -0
  170. package/dist/indexer/walker.js.map +1 -0
  171. package/dist/indexer/watcher.d.ts +51 -0
  172. package/dist/indexer/watcher.d.ts.map +1 -0
  173. package/dist/indexer/watcher.js +107 -0
  174. package/dist/indexer/watcher.js.map +1 -0
  175. package/dist/kb-server/db.d.ts +241 -0
  176. package/dist/kb-server/db.d.ts.map +1 -0
  177. package/dist/kb-server/db.js +659 -0
  178. package/dist/kb-server/db.js.map +1 -0
  179. package/dist/kb-server/server.d.ts +35 -0
  180. package/dist/kb-server/server.d.ts.map +1 -0
  181. package/dist/kb-server/server.js +240 -0
  182. package/dist/kb-server/server.js.map +1 -0
  183. package/dist/kb-server/tools/annotations.d.ts +40 -0
  184. package/dist/kb-server/tools/annotations.d.ts.map +1 -0
  185. package/dist/kb-server/tools/annotations.js +35 -0
  186. package/dist/kb-server/tools/annotations.js.map +1 -0
  187. package/dist/kb-server/tools/architecture.d.ts +60 -0
  188. package/dist/kb-server/tools/architecture.d.ts.map +1 -0
  189. package/dist/kb-server/tools/architecture.js +174 -0
  190. package/dist/kb-server/tools/architecture.js.map +1 -0
  191. package/dist/kb-server/tools/blame.d.ts +67 -0
  192. package/dist/kb-server/tools/blame.d.ts.map +1 -0
  193. package/dist/kb-server/tools/blame.js +162 -0
  194. package/dist/kb-server/tools/blame.js.map +1 -0
  195. package/dist/kb-server/tools/coverage.d.ts +67 -0
  196. package/dist/kb-server/tools/coverage.d.ts.map +1 -0
  197. package/dist/kb-server/tools/coverage.js +74 -0
  198. package/dist/kb-server/tools/coverage.js.map +1 -0
  199. package/dist/kb-server/tools/graph.d.ts +56 -0
  200. package/dist/kb-server/tools/graph.d.ts.map +1 -0
  201. package/dist/kb-server/tools/graph.js +188 -0
  202. package/dist/kb-server/tools/graph.js.map +1 -0
  203. package/dist/kb-server/tools/history.d.ts +47 -0
  204. package/dist/kb-server/tools/history.d.ts.map +1 -0
  205. package/dist/kb-server/tools/history.js +91 -0
  206. package/dist/kb-server/tools/history.js.map +1 -0
  207. package/dist/kb-server/tools/lookup.d.ts +36 -0
  208. package/dist/kb-server/tools/lookup.d.ts.map +1 -0
  209. package/dist/kb-server/tools/lookup.js +45 -0
  210. package/dist/kb-server/tools/lookup.js.map +1 -0
  211. package/dist/kb-server/tools/metrics.d.ts +73 -0
  212. package/dist/kb-server/tools/metrics.d.ts.map +1 -0
  213. package/dist/kb-server/tools/metrics.js +79 -0
  214. package/dist/kb-server/tools/metrics.js.map +1 -0
  215. package/dist/kb-server/tools/notes.d.ts +165 -0
  216. package/dist/kb-server/tools/notes.d.ts.map +1 -0
  217. package/dist/kb-server/tools/notes.js +175 -0
  218. package/dist/kb-server/tools/notes.js.map +1 -0
  219. package/dist/kb-server/tools/routes.d.ts +38 -0
  220. package/dist/kb-server/tools/routes.d.ts.map +1 -0
  221. package/dist/kb-server/tools/routes.js +38 -0
  222. package/dist/kb-server/tools/routes.js.map +1 -0
  223. package/dist/kb-server/tools/search.d.ts +60 -0
  224. package/dist/kb-server/tools/search.d.ts.map +1 -0
  225. package/dist/kb-server/tools/search.js +170 -0
  226. package/dist/kb-server/tools/search.js.map +1 -0
  227. package/dist/kb-server/tools/snippet.d.ts +44 -0
  228. package/dist/kb-server/tools/snippet.d.ts.map +1 -0
  229. package/dist/kb-server/tools/snippet.js +49 -0
  230. package/dist/kb-server/tools/snippet.js.map +1 -0
  231. package/dist/kb-server/tools/test-map.d.ts +38 -0
  232. package/dist/kb-server/tools/test-map.d.ts.map +1 -0
  233. package/dist/kb-server/tools/test-map.js +32 -0
  234. package/dist/kb-server/tools/test-map.js.map +1 -0
  235. package/dist/kb-server/tools/writeback.d.ts +49 -0
  236. package/dist/kb-server/tools/writeback.d.ts.map +1 -0
  237. package/dist/kb-server/tools/writeback.js +68 -0
  238. package/dist/kb-server/tools/writeback.js.map +1 -0
  239. package/package.json +92 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../src/indexer/poller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACvD;AAUD;;;;;;;;;;;GAWG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAEtE,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB;IAQnF,uEAAuE;IACvE,KAAK,IAAI,IAAI;IAKb,iCAAiC;IACjC,IAAI,IAAI,IAAI;YASE,IAAI;CAuFnB"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @module indexer/poller
3
+ *
4
+ * FilePoller periodically walks the directory tree, diffs file mtimes against
5
+ * a stored snapshot, and calls `IndexBuilder.update()` for any files that were
6
+ * created, modified, or deleted since the last poll.
7
+ */
8
+ import * as fs from 'node:fs';
9
+ import * as path from 'node:path';
10
+ import { IndexBuilder } from './index.js';
11
+ import { walkFiles } from './walker.js';
12
+ const COVERAGE_REPORT_RELATIVE_PATHS = [
13
+ 'coverage/lcov.info',
14
+ 'coverage/cobertura-coverage.xml',
15
+ 'coverage.xml',
16
+ ];
17
+ // ─── FilePoller ───────────────────────────────────────────────────────────────
18
+ /**
19
+ * Polls a directory tree on a configurable interval, compares mtimes against
20
+ * a snapshot, and triggers incremental index updates via `IndexBuilder.update()`.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const poller = new FilePoller('/path/to/kb.db', { rootDir: '/path/to/src' });
25
+ * poller.start();
26
+ * // ...later...
27
+ * poller.stop();
28
+ * ```
29
+ */
30
+ export class FilePoller {
31
+ dbPath;
32
+ walkerConfig;
33
+ intervalMs;
34
+ enabled;
35
+ history;
36
+ /** Maps absolute path → last seen mtime (ms since epoch). */
37
+ snapshot = new Map();
38
+ timer = null;
39
+ pollRunning = false;
40
+ constructor(dbPath, walkerConfig, options = {}) {
41
+ this.dbPath = dbPath;
42
+ this.walkerConfig = walkerConfig;
43
+ this.intervalMs = options.intervalMs ?? 5000;
44
+ this.enabled = options.enabled ?? true;
45
+ this.history = options.history ?? false;
46
+ }
47
+ /** Begin polling `walkerConfig.rootDir` at the configured interval. */
48
+ start() {
49
+ if (!this.enabled || this.timer !== null)
50
+ return;
51
+ this.timer = setInterval(() => this.poll(), this.intervalMs);
52
+ }
53
+ /** Stop the polling interval. */
54
+ stop() {
55
+ if (this.timer !== null) {
56
+ clearInterval(this.timer);
57
+ this.timer = null;
58
+ }
59
+ }
60
+ // ─── Private helpers ──────────────────────────────────────────────────────
61
+ async poll() {
62
+ if (this.pollRunning)
63
+ return;
64
+ this.pollRunning = true;
65
+ try {
66
+ let errorCount = 0;
67
+ const changed = [];
68
+ let entries;
69
+ try {
70
+ entries = await walkFiles(this.walkerConfig);
71
+ }
72
+ catch (err) {
73
+ process.stderr.write(JSON.stringify({ level: 'error', source: 'FilePoller', message: String(err) }) + '\n');
74
+ return;
75
+ }
76
+ const currentPaths = new Set();
77
+ for (const entry of entries) {
78
+ currentPaths.add(entry.path);
79
+ let mtime;
80
+ try {
81
+ mtime = fs.statSync(entry.path).mtimeMs;
82
+ }
83
+ catch {
84
+ continue; // file vanished between walk and stat
85
+ }
86
+ const prev = this.snapshot.get(entry.path);
87
+ if (prev === undefined || prev !== mtime) {
88
+ changed.push(entry.path);
89
+ this.snapshot.set(entry.path, mtime);
90
+ }
91
+ }
92
+ for (const relPath of COVERAGE_REPORT_RELATIVE_PATHS) {
93
+ const coveragePath = path.join(this.walkerConfig.rootDir, relPath);
94
+ let mtime;
95
+ try {
96
+ mtime = fs.statSync(coveragePath).mtimeMs;
97
+ }
98
+ catch {
99
+ continue;
100
+ }
101
+ currentPaths.add(coveragePath);
102
+ const prev = this.snapshot.get(coveragePath);
103
+ if (prev === undefined || prev !== mtime) {
104
+ changed.push(coveragePath);
105
+ this.snapshot.set(coveragePath, mtime);
106
+ }
107
+ }
108
+ // Detect deletions: paths in snapshot that are no longer on disk
109
+ for (const [p] of this.snapshot) {
110
+ if (!currentPaths.has(p)) {
111
+ changed.push(p);
112
+ this.snapshot.delete(p);
113
+ }
114
+ }
115
+ if (changed.length > 0) {
116
+ const builder = new IndexBuilder(this.dbPath, this.walkerConfig, undefined, {
117
+ history: this.history,
118
+ });
119
+ try {
120
+ await builder.update(changed);
121
+ }
122
+ catch (err) {
123
+ errorCount++;
124
+ process.stderr.write(JSON.stringify({ level: 'error', source: 'FilePoller', message: String(err) }) + '\n');
125
+ }
126
+ }
127
+ process.stderr.write(JSON.stringify({
128
+ level: 'info',
129
+ source: 'FilePoller',
130
+ message: 'poll cycle complete',
131
+ changed: changed.length,
132
+ errors: errorCount,
133
+ }) + '\n');
134
+ }
135
+ finally {
136
+ this.pollRunning = false;
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=poller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/indexer/poller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAexC,MAAM,8BAA8B,GAAG;IACrC,oBAAoB;IACpB,iCAAiC;IACjC,cAAc;CACf,CAAC;AAEF,iFAAiF;AAEjF;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,UAAU;IACJ,MAAM,CAAS;IACf,YAAY,CAAe;IAC3B,UAAU,CAAS;IACnB,OAAO,CAAU;IACjB,OAAO,CAA8C;IAEtE,6DAA6D;IACrD,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC1C,KAAK,GAA0C,IAAI,CAAC;IACpD,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,MAAc,EAAE,YAA0B,EAAE,UAAyB,EAAE;QACjF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAC1C,CAAC;IAED,uEAAuE;IACvE,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO;QACjD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED,iCAAiC;IACjC,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,IAAI,OAA2B,CAAC;YAChC,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CACtF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;YAEvC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,KAAa,CAAC;gBAClB,IAAI,CAAC;oBACH,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;gBAC1C,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,CAAC,sCAAsC;gBAClD,CAAC;gBAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,8BAA8B,EAAE,CAAC;gBACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACnE,IAAI,KAAa,CAAC;gBAClB,IAAI,CAAC;oBACH,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBAED,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,iEAAiE;YACjE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE;oBAC1E,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;gBACH,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAChC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,UAAU,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CACtF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,MAAM,EAAE,UAAU;aACnB,CAAC,GAAG,IAAI,CACV,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @module indexer/resolver
3
+ *
4
+ * Converts raw import strings extracted from source files into resolved file
5
+ * paths (or marks them as external dependencies when resolution fails).
6
+ *
7
+ * Resolution strategies are language-specific. When a manifest file
8
+ * (package.json, go.mod, Cargo.toml) is present in the root directory its
9
+ * declared dependencies are used as a fast-path to classify an import as
10
+ * external without attempting disk access.
11
+ */
12
+ import type { RawImport } from './extractors/types.js';
13
+ export interface ResolvedImport {
14
+ /** Original raw import string. */
15
+ rawSource: string;
16
+ /** Absolute resolved file path (present when the import maps to a project file). */
17
+ resolvedPath?: string;
18
+ /** True when the import is an external (third-party / stdlib) dependency. */
19
+ isExternal: boolean;
20
+ /** Name of the external package/module (same as rawSource for most languages). */
21
+ externalName?: string;
22
+ }
23
+ export declare class ImportResolver {
24
+ /** Cache of parsed manifest dependency sets, keyed by rootDir. */
25
+ private readonly manifestCache;
26
+ /**
27
+ * Resolve a single raw import extracted from `fromFile`.
28
+ *
29
+ * @param rawImport The import object produced by a SymbolExtractor.
30
+ * @param fromFile Absolute path of the file that contains the import.
31
+ * @param rootDir Absolute path to the project root directory.
32
+ * @param language Language identifier (e.g. `'typescript'`, `'go'`).
33
+ */
34
+ resolve(rawImport: RawImport, fromFile: string, rootDir: string, language: string): ResolvedImport;
35
+ private resolveJs;
36
+ private resolveGo;
37
+ private resolvePython;
38
+ private resolveRust;
39
+ private resolveJava;
40
+ private resolveCSharp;
41
+ private resolveC;
42
+ private parsePackageJson;
43
+ private parseGoMod;
44
+ /** Returns the set of crate names declared in Cargo.toml [dependencies]. */
45
+ private parseCargoToml;
46
+ private resolveRelative;
47
+ private tryPythonModule;
48
+ private fileExists;
49
+ private dirExists;
50
+ private markExternal;
51
+ }
52
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/indexer/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,qBAAa,cAAc;IACzB,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE;;;;;;;OAOG;IACH,OAAO,CACL,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,cAAc;IAkCjB,OAAO,CAAC,SAAS;IA+BjB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,UAAU;IAuBlB,4EAA4E;IAC5E,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;CAGrB"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * @module indexer/resolver
3
+ *
4
+ * Converts raw import strings extracted from source files into resolved file
5
+ * paths (or marks them as external dependencies when resolution fails).
6
+ *
7
+ * Resolution strategies are language-specific. When a manifest file
8
+ * (package.json, go.mod, Cargo.toml) is present in the root directory its
9
+ * declared dependencies are used as a fast-path to classify an import as
10
+ * external without attempting disk access.
11
+ */
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ // ─── ImportResolver ───────────────────────────────────────────────────────────
15
+ export class ImportResolver {
16
+ /** Cache of parsed manifest dependency sets, keyed by rootDir. */
17
+ manifestCache = new Map();
18
+ /**
19
+ * Resolve a single raw import extracted from `fromFile`.
20
+ *
21
+ * @param rawImport The import object produced by a SymbolExtractor.
22
+ * @param fromFile Absolute path of the file that contains the import.
23
+ * @param rootDir Absolute path to the project root directory.
24
+ * @param language Language identifier (e.g. `'typescript'`, `'go'`).
25
+ */
26
+ resolve(rawImport, fromFile, rootDir, language) {
27
+ const source = rawImport.source;
28
+ switch (language) {
29
+ case 'typescript':
30
+ case 'javascript':
31
+ return this.resolveJs(source, fromFile, rootDir);
32
+ case 'go':
33
+ return this.resolveGo(source, fromFile, rootDir);
34
+ case 'python':
35
+ return this.resolvePython(source, fromFile, rootDir);
36
+ case 'rust':
37
+ return this.resolveRust(source, fromFile, rootDir);
38
+ case 'java':
39
+ return this.resolveJava(source, fromFile, rootDir);
40
+ case 'csharp':
41
+ return this.resolveCSharp(source, fromFile, rootDir);
42
+ case 'c':
43
+ case 'cpp':
44
+ return this.resolveC(source, fromFile, rootDir);
45
+ default:
46
+ return this.markExternal(source);
47
+ }
48
+ }
49
+ // ─── Language-specific strategies ────────────────────────────────────────
50
+ resolveJs(source, fromFile, rootDir) {
51
+ if (source.startsWith('.')) {
52
+ // Relative import
53
+ const resolved = this.resolveRelative(source, fromFile, [
54
+ '',
55
+ '.ts',
56
+ '.tsx',
57
+ '.js',
58
+ '.jsx',
59
+ '/index.ts',
60
+ '/index.js',
61
+ ]);
62
+ if (resolved)
63
+ return { rawSource: source, resolvedPath: resolved, isExternal: false };
64
+ return this.markExternal(source);
65
+ }
66
+ // Absolute / bare specifier — check package.json
67
+ const pkgDeps = this.parsePackageJson(rootDir);
68
+ const pkgName = source.split('/')[0] ?? source;
69
+ if (pkgDeps.has(pkgName) || pkgDeps.size === 0) {
70
+ return this.markExternal(source);
71
+ }
72
+ // Could be a path alias or workspace package — fall back to external
73
+ return this.markExternal(source);
74
+ }
75
+ resolveGo(source, _fromFile, rootDir) {
76
+ const moduleName = this.parseGoMod(rootDir);
77
+ if (moduleName && source.startsWith(moduleName)) {
78
+ // Internal package: module/sub/pkg → rootDir/sub/pkg
79
+ const rel = source.slice(moduleName.length).replace(/^\//, '');
80
+ const candidate = path.join(rootDir, rel);
81
+ if (this.dirExists(candidate)) {
82
+ return { rawSource: source, resolvedPath: candidate, isExternal: false };
83
+ }
84
+ }
85
+ return this.markExternal(source);
86
+ }
87
+ resolvePython(source, fromFile, rootDir) {
88
+ if (source.startsWith('.')) {
89
+ // Relative import (e.g. `.utils`, `..models`)
90
+ const dots = source.match(/^\.+/)?.[0].length ?? 1;
91
+ const modPath = source.slice(dots).replace(/\./g, '/');
92
+ let base = path.dirname(fromFile);
93
+ for (let i = 1; i < dots; i++)
94
+ base = path.dirname(base);
95
+ const candidate = path.join(base, modPath.length ? modPath : '');
96
+ const resolved = this.tryPythonModule(candidate);
97
+ if (resolved)
98
+ return { rawSource: source, resolvedPath: resolved, isExternal: false };
99
+ return this.markExternal(source);
100
+ }
101
+ // Absolute — try to find in rootDir
102
+ const candidate = path.join(rootDir, source.replace(/\./g, '/'));
103
+ const resolved = this.tryPythonModule(candidate);
104
+ if (resolved)
105
+ return { rawSource: source, resolvedPath: resolved, isExternal: false };
106
+ return this.markExternal(source);
107
+ }
108
+ resolveRust(source, _fromFile, rootDir) {
109
+ // `use crate::…` and `use self::…` are always internal but we cannot
110
+ // resolve to a file path without walking the crate graph.
111
+ if (source.startsWith('crate::') || source.startsWith('self::') || source.startsWith('super::')) {
112
+ return { rawSource: source, isExternal: false };
113
+ }
114
+ // Check Cargo.toml to distinguish workspace crates from third-party deps.
115
+ const cargoDeps = this.parseCargoToml(rootDir);
116
+ const crateName = source.split('::')[0] ?? source;
117
+ if (cargoDeps.has(crateName)) {
118
+ return { rawSource: source, isExternal: true };
119
+ }
120
+ // If the crate name isn't in Cargo.toml [dependencies], assume it's
121
+ // a workspace-internal crate or stdlib crate — mark as external since
122
+ // we can't resolve the file path without a full crate graph.
123
+ return this.markExternal(source);
124
+ }
125
+ resolveJava(source, _fromFile, rootDir) {
126
+ // Java imports are fully-qualified class names.
127
+ // Try to find matching .java file under rootDir/src.
128
+ const rel = source.replace(/\./g, '/') + '.java';
129
+ for (const srcRoot of ['src/main/java', 'src', '']) {
130
+ const candidate = path.join(rootDir, srcRoot, rel);
131
+ if (this.fileExists(candidate)) {
132
+ return { rawSource: source, resolvedPath: candidate, isExternal: false };
133
+ }
134
+ }
135
+ return this.markExternal(source);
136
+ }
137
+ resolveCSharp(source, _fromFile, _rootDir) {
138
+ // C# `using` directives are namespace identifiers, not file paths.
139
+ // We cannot reliably map them to files without a project model.
140
+ return this.markExternal(source);
141
+ }
142
+ resolveC(source, fromFile, rootDir) {
143
+ // Quoted includes are relative; angle-bracket includes are system/external.
144
+ if (!source.startsWith('<')) {
145
+ const resolved = this.resolveRelative('./' + source, fromFile, ['']) ??
146
+ this.resolveRelative('./' + source, rootDir + '/fake', ['']);
147
+ if (resolved)
148
+ return { rawSource: source, resolvedPath: resolved, isExternal: false };
149
+ }
150
+ return this.markExternal(source);
151
+ }
152
+ // ─── Manifest parsers ─────────────────────────────────────────────────────
153
+ parsePackageJson(rootDir) {
154
+ const cacheKey = `npm:${rootDir}`;
155
+ if (this.manifestCache.has(cacheKey))
156
+ return this.manifestCache.get(cacheKey);
157
+ const deps = new Set();
158
+ const pkgPath = path.join(rootDir, 'package.json');
159
+ try {
160
+ const raw = fs.readFileSync(pkgPath, 'utf8');
161
+ const pkg = JSON.parse(raw);
162
+ for (const section of ['dependencies', 'devDependencies', 'peerDependencies']) {
163
+ const obj = pkg[section];
164
+ if (obj && typeof obj === 'object') {
165
+ for (const name of Object.keys(obj)) {
166
+ deps.add(name);
167
+ }
168
+ }
169
+ }
170
+ }
171
+ catch {
172
+ // No package.json or unreadable — treat all bare specifiers as external
173
+ }
174
+ this.manifestCache.set(cacheKey, deps);
175
+ return deps;
176
+ }
177
+ parseGoMod(rootDir) {
178
+ const cacheKey = `go:${rootDir}`;
179
+ if (this.manifestCache.has(cacheKey)) {
180
+ const cached = this.manifestCache.get(cacheKey);
181
+ return cached.size > 0 ? [...cached][0] : null;
182
+ }
183
+ let moduleName = null;
184
+ const modPath = path.join(rootDir, 'go.mod');
185
+ try {
186
+ const raw = fs.readFileSync(modPath, 'utf8');
187
+ const match = raw.match(/^module\s+(\S+)/m);
188
+ if (match)
189
+ moduleName = match[1] ?? null;
190
+ }
191
+ catch {
192
+ // No go.mod
193
+ }
194
+ const set = new Set();
195
+ if (moduleName)
196
+ set.add(moduleName);
197
+ this.manifestCache.set(cacheKey, set);
198
+ return moduleName;
199
+ }
200
+ /** Returns the set of crate names declared in Cargo.toml [dependencies]. */
201
+ parseCargoToml(rootDir) {
202
+ const cacheKey = `cargo:${rootDir}`;
203
+ if (this.manifestCache.has(cacheKey))
204
+ return this.manifestCache.get(cacheKey);
205
+ const deps = new Set();
206
+ const cargoPath = path.join(rootDir, 'Cargo.toml');
207
+ try {
208
+ const raw = fs.readFileSync(cargoPath, 'utf8');
209
+ // Minimal TOML parsing: grab names from [dependencies] section lines
210
+ let inDeps = false;
211
+ for (const line of raw.split('\n')) {
212
+ if (/^\[dependencies\]/.test(line)) {
213
+ inDeps = true;
214
+ continue;
215
+ }
216
+ if (/^\[/.test(line)) {
217
+ inDeps = false;
218
+ continue;
219
+ }
220
+ if (inDeps) {
221
+ const m = line.match(/^([A-Za-z0-9_-]+)\s*=/);
222
+ if (m)
223
+ deps.add(m[1]);
224
+ }
225
+ }
226
+ }
227
+ catch {
228
+ // No Cargo.toml
229
+ }
230
+ this.manifestCache.set(cacheKey, deps);
231
+ return deps;
232
+ }
233
+ // ─── Low-level helpers ────────────────────────────────────────────────────
234
+ resolveRelative(source, fromFile, extensions) {
235
+ const base = path.resolve(path.dirname(fromFile), source);
236
+ for (const ext of extensions) {
237
+ const candidate = base + ext;
238
+ if (this.fileExists(candidate))
239
+ return candidate;
240
+ }
241
+ return null;
242
+ }
243
+ tryPythonModule(base) {
244
+ for (const suffix of ['.py', '/__init__.py']) {
245
+ const candidate = base + suffix;
246
+ if (this.fileExists(candidate))
247
+ return candidate;
248
+ }
249
+ return null;
250
+ }
251
+ fileExists(p) {
252
+ try {
253
+ return fs.statSync(p).isFile();
254
+ }
255
+ catch {
256
+ return false;
257
+ }
258
+ }
259
+ dirExists(p) {
260
+ try {
261
+ return fs.statSync(p).isDirectory();
262
+ }
263
+ catch {
264
+ return false;
265
+ }
266
+ }
267
+ markExternal(source) {
268
+ return { rawSource: source, isExternal: true, externalName: source };
269
+ }
270
+ }
271
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/indexer/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Database } from './db.js';
2
+ export type TestMappingConfidence = 'import' | 'coverage' | 'heuristic';
3
+ export declare const TEST_MAPPING_CONFIDENCES: readonly TestMappingConfidence[];
4
+ export declare function isTestFilePath(filePath: string): boolean;
5
+ export declare function refreshTestMappings(db: Database.Database, branch: string): void;
6
+ //# sourceMappingURL=test-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-mapper.d.ts","sourceRoot":"","sources":["../../src/indexer/test-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAExE,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAIpE,CAAC;AAIF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiBxD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmC/E"}
@@ -0,0 +1,48 @@
1
+ export const TEST_MAPPING_CONFIDENCES = [
2
+ 'import',
3
+ 'coverage',
4
+ 'heuristic',
5
+ ];
6
+ const TEST_DIRECTORY_SEGMENTS = new Set(['tests', '__tests__', 'spec']);
7
+ export function isTestFilePath(filePath) {
8
+ const normalizedPath = filePath.replace(/\\/g, '/');
9
+ const normalizedLowerPath = normalizedPath.toLowerCase();
10
+ const fileName = normalizedPath.split('/').pop() ?? '';
11
+ const fileNameLower = fileName.toLowerCase();
12
+ const pathSegments = normalizedLowerPath.split('/');
13
+ if (pathSegments.some((segment) => TEST_DIRECTORY_SEGMENTS.has(segment))) {
14
+ return true;
15
+ }
16
+ if (fileNameLower.includes('.test.') || fileNameLower.includes('.spec.')) {
17
+ return true;
18
+ }
19
+ if (fileNameLower.startsWith('test_')) {
20
+ return true;
21
+ }
22
+ return fileNameLower.includes('_test.');
23
+ }
24
+ export function refreshTestMappings(db, branch) {
25
+ const tx = db.transaction(() => {
26
+ db.prepare(`DELETE FROM test_mappings
27
+ WHERE test_file_id IN (SELECT id FROM files WHERE branch = ?)
28
+ OR source_file_id IN (SELECT id FROM files WHERE branch = ?)`).run(branch, branch);
29
+ const rows = db
30
+ .prepare(`SELECT DISTINCT fi.file_id AS test_file_id, fi.resolved_id AS source_file_id, test_files.path AS test_file_path
31
+ FROM file_imports fi
32
+ JOIN files test_files ON test_files.id = fi.file_id
33
+ JOIN files source_files ON source_files.id = fi.resolved_id
34
+ WHERE test_files.branch = ?
35
+ AND source_files.branch = ?
36
+ AND fi.resolved_id IS NOT NULL`)
37
+ .all(branch, branch);
38
+ const insert = db.prepare(`INSERT OR REPLACE INTO test_mappings (test_file_id, source_file_id, confidence)
39
+ VALUES (?, ?, 'import')`);
40
+ for (const row of rows) {
41
+ if (!isTestFilePath(row.test_file_path))
42
+ continue;
43
+ insert.run(row.test_file_id, row.source_file_id);
44
+ }
45
+ });
46
+ tx();
47
+ }
48
+ //# sourceMappingURL=test-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-mapper.js","sourceRoot":"","sources":["../../src/indexer/test-mapper.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,QAAQ;IACR,UAAU;IACV,WAAW;CACZ,CAAC;AAEF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpD,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAqB,EAAE,MAAc;IACvE,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7B,EAAE,CAAC,OAAO,CACR;;uEAEiE,CAClE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;;;;;0CAMkC,CACnC;aACA,GAAG,CAAC,MAAM,EAAE,MAAM,CAInB,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;+BACyB,CAC1B,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;gBAAE,SAAS;YAClD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @module indexer/walker
3
+ *
4
+ * Walks a directory tree using fast-glob and maps each file to a detected
5
+ * programming language based on its extension.
6
+ */
7
+ /** Configuration for a `walkFiles` call. */
8
+ export interface WalkerConfig {
9
+ /** Absolute path to the directory to scan. */
10
+ rootDir: string;
11
+ /**
12
+ * Glob patterns (relative to `rootDir`) for files to include.
13
+ * Defaults to `['**\/*']` when empty or omitted.
14
+ */
15
+ includeGlobs?: string[];
16
+ /**
17
+ * Glob patterns (relative to `rootDir`) for paths to exclude.
18
+ * Merged with the built-in default exclusion list.
19
+ */
20
+ excludeGlobs?: string[];
21
+ /**
22
+ * Explicit file extensions to accept (with leading dot, e.g. `'.ts'`).
23
+ * When provided, files whose extension is not in this list are skipped.
24
+ * When omitted, all extensions that map to a known language are accepted.
25
+ */
26
+ extensions?: string[];
27
+ /**
28
+ * Git branch name to associate with indexed files.
29
+ * When omitted, indexing resolves the current branch from git.
30
+ */
31
+ branch?: string;
32
+ }
33
+ /** A single file discovered by `walkFiles`. */
34
+ export interface FileEntry {
35
+ /** Absolute path to the file. */
36
+ path: string;
37
+ /** Detected programming language (lower-case identifier). */
38
+ language: string;
39
+ }
40
+ export declare const EXT_TO_LANG: Record<string, string>;
41
+ /**
42
+ * Walks `config.rootDir` and returns every source file that can be mapped
43
+ * to a known programming language.
44
+ */
45
+ export declare function walkFiles(config: WalkerConfig): Promise<FileEntry[]>;
46
+ /**
47
+ * Detect the Lore language for a single file path using extension mapping.
48
+ * Returns `undefined` when the extension is unknown or filtered out.
49
+ */
50
+ export declare function detectLanguageForPath(filePath: string, config?: Pick<WalkerConfig, 'extensions'>): string | undefined;
51
+ //# sourceMappingURL=walker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/indexer/walker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyC9C,CAAC;AAcF;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkC1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,GAAG,SAAS,CAIrH"}